aboutsummaryrefslogtreecommitdiff
path: root/test/cases/compile_errors
diff options
context:
space:
mode:
authormlugg <mlugg@mlugg.co.uk>2023-05-29 05:07:17 +0100
committermlugg <mlugg@mlugg.co.uk>2023-05-29 23:06:08 +0100
commit4976b58ab16069f8d3267b69ed030f29685c1abe (patch)
tree400f632d11eec4f3c330bee15d59f8fd6219c20f /test/cases/compile_errors
parentb5fad3a40a86eb379903d6a803bdbe66dcaa5487 (diff)
downloadzig-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')
-rw-r--r--test/cases/compile_errors/closure_get_depends_on_failed_decl.zig2
-rw-r--r--test/cases/compile_errors/compileLog_of_tagged_enum_doesnt_crash_the_compiler.zig5
-rw-r--r--test/cases/compile_errors/compile_log.zig11
-rw-r--r--test/cases/compile_errors/dereference_slice.zig2
-rw-r--r--test/cases/compile_errors/extern_function_with_comptime_parameter.zig6
-rw-r--r--test/cases/compile_errors/invalid_address_space_coercion.zig2
-rw-r--r--test/cases/compile_errors/invalid_pointer_keeps_address_space_when_taking_address_of_dereference.zig2
-rw-r--r--test/cases/compile_errors/noalias_on_non_pointer_param.zig4
-rw-r--r--test/cases/compile_errors/pointer_with_different_address_spaces.zig2
-rw-r--r--test/cases/compile_errors/pointers_with_different_address_spaces.zig2
-rw-r--r--test/cases/compile_errors/slice_sentinel_mismatch-2.zig2
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