Prevent analysis of functions only referenced at comptime

The idea here is that there are two ways we can reference a function at runtime:

* Through a direct call, i.e. where the function is comptime-known
* Through a function pointer

This means we can easily perform a form of rudimentary escape analysis
on functions. If we ever see a `decl_ref` or `ref` of a function, we
have a function pointer, which could "leak" into runtime code, so we
emit the function; but for a plain `decl_val`, there's no need to.

This change means that `comptime { _ = f; }` no longer forces a function
to be emitted, which was used for some things (mainly tests). These use
sites have been replaced with `_ = &f;`, which still triggers analysis
of the function body, since you're taking a pointer to the function.

Resolves: #6256
Resolves: #15353
This commit is contained in:
mlugg
2023-05-29 05:07:17 +01:00
parent b5fad3a40a
commit 4976b58ab1
33 changed files with 149 additions and 65 deletions

View File

@@ -532,8 +532,8 @@ pub fn MultiArrayList(comptime T: type) type {
comptime {
if (builtin.mode == .Debug) {
_ = dbHelper;
_ = Slice.dbHelper;
_ = &dbHelper;
_ = &Slice.dbHelper;
}
}
};