diff options
| author | mlugg <mlugg@mlugg.co.uk> | 2023-05-29 05:07:17 +0100 |
|---|---|---|
| committer | mlugg <mlugg@mlugg.co.uk> | 2023-05-29 23:06:08 +0100 |
| commit | 4976b58ab16069f8d3267b69ed030f29685c1abe (patch) | |
| tree | 400f632d11eec4f3c330bee15d59f8fd6219c20f /test/cases/compile_errors | |
| parent | b5fad3a40a86eb379903d6a803bdbe66dcaa5487 (diff) | |
| download | zig-4976b58ab16069f8d3267b69ed030f29685c1abe.tar.gz zig-4976b58ab16069f8d3267b69ed030f29685c1abe.zip | |
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
Diffstat (limited to 'test/cases/compile_errors')
11 files changed, 21 insertions, 19 deletions
diff --git a/test/cases/compile_errors/closure_get_depends_on_failed_decl.zig b/test/cases/compile_errors/closure_get_depends_on_failed_decl.zig index ccdbf67713..be451d2fc8 100644 --- a/test/cases/compile_errors/closure_get_depends_on_failed_decl.zig +++ b/test/cases/compile_errors/closure_get_depends_on_failed_decl.zig @@ -3,7 +3,7 @@ pub inline fn instanceRequestAdapter() void {} pub inline fn requestAdapter( comptime callbackArg: fn () callconv(.Inline) void, ) void { - _ = (struct { + _ = &(struct { pub fn callback() callconv(.C) void { callbackArg(); } diff --git a/test/cases/compile_errors/compileLog_of_tagged_enum_doesnt_crash_the_compiler.zig b/test/cases/compile_errors/compileLog_of_tagged_enum_doesnt_crash_the_compiler.zig index 55676f9230..f7de8129b7 100644 --- a/test/cases/compile_errors/compileLog_of_tagged_enum_doesnt_crash_the_compiler.zig +++ b/test/cases/compile_errors/compileLog_of_tagged_enum_doesnt_crash_the_compiler.zig @@ -1,5 +1,5 @@ const Bar = union(enum(u32)) { - X: i32 = 1 + X: i32 = 1, }; fn testCompileLog(x: Bar) void { @@ -7,7 +7,8 @@ fn testCompileLog(x: Bar) void { } pub export fn entry() void { - comptime testCompileLog(Bar{.X = 123}); + comptime testCompileLog(Bar{ .X = 123 }); + _ = &testCompileLog; } // error diff --git a/test/cases/compile_errors/compile_log.zig b/test/cases/compile_errors/compile_log.zig index e1ea460dc3..444d091017 100644 --- a/test/cases/compile_errors/compile_log.zig +++ b/test/cases/compile_errors/compile_log.zig @@ -1,10 +1,11 @@ export fn foo() void { - comptime bar(12, "hi",); + comptime bar(12, "hi"); + _ = &bar; } fn bar(a: i32, b: []const u8) void { - @compileLog("begin",); + @compileLog("begin"); @compileLog("a", a, "b", b); - @compileLog("end",); + @compileLog("end"); } export fn baz() void { const S = struct { a: u32 }; @@ -15,8 +16,8 @@ export fn baz() void { // backend=llvm // target=native // -// :5:5: error: found compile log statement -// :11:5: note: also here +// :6:5: error: found compile log statement +// :12:5: note: also here // // Compile Log Output: // @as(*const [5:0]u8, "begin") diff --git a/test/cases/compile_errors/dereference_slice.zig b/test/cases/compile_errors/dereference_slice.zig index 7dba3b55d8..55d6078b22 100644 --- a/test/cases/compile_errors/dereference_slice.zig +++ b/test/cases/compile_errors/dereference_slice.zig @@ -2,7 +2,7 @@ fn entry(x: []i32) i32 { return x.*; } comptime { - _ = entry; + _ = &entry; } // error diff --git a/test/cases/compile_errors/extern_function_with_comptime_parameter.zig b/test/cases/compile_errors/extern_function_with_comptime_parameter.zig index 58f15f7fab..8ade9ca2aa 100644 --- a/test/cases/compile_errors/extern_function_with_comptime_parameter.zig +++ b/test/cases/compile_errors/extern_function_with_comptime_parameter.zig @@ -4,9 +4,9 @@ fn f() i32 { } pub extern fn entry1(b: u32, comptime a: [2]u8, c: i32) void; pub extern fn entry2(b: u32, noalias a: anytype, i43) void; -comptime { _ = f; } -comptime { _ = entry1; } -comptime { _ = entry2; } +comptime { _ = &f; } +comptime { _ = &entry1; } +comptime { _ = &entry2; } // error // backend=stage2 diff --git a/test/cases/compile_errors/invalid_address_space_coercion.zig b/test/cases/compile_errors/invalid_address_space_coercion.zig index 4633b12e0f..baf37cbe37 100644 --- a/test/cases/compile_errors/invalid_address_space_coercion.zig +++ b/test/cases/compile_errors/invalid_address_space_coercion.zig @@ -2,7 +2,7 @@ fn entry(a: *addrspace(.gs) i32) *i32 { return a; } pub fn main() void { - _ = entry; + _ = &entry; } // error diff --git a/test/cases/compile_errors/invalid_pointer_keeps_address_space_when_taking_address_of_dereference.zig b/test/cases/compile_errors/invalid_pointer_keeps_address_space_when_taking_address_of_dereference.zig index 4d7b3c627b..c59238d6a7 100644 --- a/test/cases/compile_errors/invalid_pointer_keeps_address_space_when_taking_address_of_dereference.zig +++ b/test/cases/compile_errors/invalid_pointer_keeps_address_space_when_taking_address_of_dereference.zig @@ -2,7 +2,7 @@ fn entry(a: *addrspace(.gs) i32) *i32 { return &a.*; } pub fn main() void { - _ = entry; + _ = &entry; } // error diff --git a/test/cases/compile_errors/noalias_on_non_pointer_param.zig b/test/cases/compile_errors/noalias_on_non_pointer_param.zig index 806808820f..65e6e141ce 100644 --- a/test/cases/compile_errors/noalias_on_non_pointer_param.zig +++ b/test/cases/compile_errors/noalias_on_non_pointer_param.zig @@ -2,10 +2,10 @@ fn f(noalias x: i32) void { _ = x; } export fn entry() void { f(1234); } fn generic(comptime T: type, noalias _: [*]T, noalias _: [*]const T, _: usize) void {} -comptime { _ = generic; } +comptime { _ = &generic; } fn slice(noalias _: []u8) void {} -comptime { _ = slice; } +comptime { _ = &slice; } // error // backend=stage2 diff --git a/test/cases/compile_errors/pointer_with_different_address_spaces.zig b/test/cases/compile_errors/pointer_with_different_address_spaces.zig index 2bbea3d3b6..7a434cfa8e 100644 --- a/test/cases/compile_errors/pointer_with_different_address_spaces.zig +++ b/test/cases/compile_errors/pointer_with_different_address_spaces.zig @@ -2,7 +2,7 @@ fn entry(a: *addrspace(.gs) i32) *addrspace(.fs) i32 { return a; } export fn entry2() void { - _ = entry; + _ = &entry; } // error diff --git a/test/cases/compile_errors/pointers_with_different_address_spaces.zig b/test/cases/compile_errors/pointers_with_different_address_spaces.zig index e952da2af5..44b1ef8722 100644 --- a/test/cases/compile_errors/pointers_with_different_address_spaces.zig +++ b/test/cases/compile_errors/pointers_with_different_address_spaces.zig @@ -2,7 +2,7 @@ fn entry(a: ?*addrspace(.gs) i32) *i32 { return a.?; } pub fn main() void { - _ = entry; + _ = &entry; } // error diff --git a/test/cases/compile_errors/slice_sentinel_mismatch-2.zig b/test/cases/compile_errors/slice_sentinel_mismatch-2.zig index 3cc5ac4c39..ea34805e32 100644 --- a/test/cases/compile_errors/slice_sentinel_mismatch-2.zig +++ b/test/cases/compile_errors/slice_sentinel_mismatch-2.zig @@ -2,7 +2,7 @@ fn foo() [:0]u8 { var x: []u8 = undefined; return x; } -comptime { _ = foo; } +comptime { _ = &foo; } // error // backend=stage2 |
