aboutsummaryrefslogtreecommitdiff
path: root/test/compile_errors.zig
diff options
context:
space:
mode:
Diffstat (limited to 'test/compile_errors.zig')
-rw-r--r--test/compile_errors.zig149
1 files changed, 122 insertions, 27 deletions
diff --git a/test/compile_errors.zig b/test/compile_errors.zig
index 437e40900d..0d579ece95 100644
--- a/test/compile_errors.zig
+++ b/test/compile_errors.zig
@@ -3,6 +3,118 @@ const builtin = @import("builtin");
pub fn addCases(cases: *tests.CompileErrorContext) void {
cases.add(
+ "@frame() causes function to be async",
+ \\export fn entry() void {
+ \\ func();
+ \\}
+ \\fn func() void {
+ \\ _ = @frame();
+ \\}
+ ,
+ "tmp.zig:1:1: error: function with calling convention 'ccc' cannot be async",
+ "tmp.zig:5:9: note: @frame() causes function to be async",
+ );
+ cases.add(
+ "invalid suspend in exported function",
+ \\export fn entry() void {
+ \\ var frame = async func();
+ \\ var result = await frame;
+ \\}
+ \\fn func() void {
+ \\ suspend;
+ \\}
+ ,
+ "tmp.zig:1:1: error: function with calling convention 'ccc' cannot be async",
+ "tmp.zig:3:18: note: await is a suspend point",
+ );
+
+ cases.add(
+ "async function indirectly depends on its own frame",
+ \\export fn entry() void {
+ \\ _ = async amain();
+ \\}
+ \\async fn amain() void {
+ \\ other();
+ \\}
+ \\fn other() void {
+ \\ var x: [@sizeOf(@Frame(amain))]u8 = undefined;
+ \\}
+ ,
+ "tmp.zig:4:1: error: unable to determine async function frame of 'amain'",
+ "tmp.zig:5:10: note: analysis of function 'other' depends on the frame",
+ "tmp.zig:8:13: note: depends on the frame here",
+ );
+
+ cases.add(
+ "async function depends on its own frame",
+ \\export fn entry() void {
+ \\ _ = async amain();
+ \\}
+ \\async fn amain() void {
+ \\ var x: [@sizeOf(@Frame(amain))]u8 = undefined;
+ \\}
+ ,
+ "tmp.zig:4:1: error: cannot resolve '@Frame(amain)': function not fully analyzed yet",
+ "tmp.zig:5:13: note: depends on its own frame here",
+ );
+
+ cases.add(
+ "non async function pointer passed to @asyncCall",
+ \\export fn entry() void {
+ \\ var ptr = afunc;
+ \\ var bytes: [100]u8 = undefined;
+ \\ _ = @asyncCall(&bytes, {}, ptr);
+ \\}
+ \\fn afunc() void { }
+ ,
+ "tmp.zig:4:32: error: expected async function, found 'fn() void'",
+ );
+
+ cases.add(
+ "runtime-known async function called",
+ \\export fn entry() void {
+ \\ _ = async amain();
+ \\}
+ \\fn amain() void {
+ \\ var ptr = afunc;
+ \\ _ = ptr();
+ \\}
+ \\async fn afunc() void {}
+ ,
+ "tmp.zig:6:12: error: function is not comptime-known; @asyncCall required",
+ );
+
+ cases.add(
+ "runtime-known function called with async keyword",
+ \\export fn entry() void {
+ \\ var ptr = afunc;
+ \\ _ = async ptr();
+ \\}
+ \\
+ \\async fn afunc() void { }
+ ,
+ "tmp.zig:3:15: error: function is not comptime-known; @asyncCall required",
+ );
+
+ cases.add(
+ "function with ccc indirectly calling async function",
+ \\export fn entry() void {
+ \\ foo();
+ \\}
+ \\fn foo() void {
+ \\ bar();
+ \\}
+ \\fn bar() void {
+ \\ suspend;
+ \\}
+ ,
+ "tmp.zig:1:1: error: function with calling convention 'ccc' cannot be async",
+ "tmp.zig:2:8: note: async function call here",
+ "tmp.zig:5:8: note: async function call here",
+ "tmp.zig:8:5: note: suspends here",
+ );
+
+ cases.add(
"capture group on switch prong with incompatible payload types",
\\const Union = union(enum) {
\\ A: usize,
@@ -1319,24 +1431,14 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
);
cases.add(
- "@handle() called outside of function definition",
- \\var handle_undef: promise = undefined;
- \\var handle_dummy: promise = @handle();
+ "@frame() called outside of function definition",
+ \\var handle_undef: anyframe = undefined;
+ \\var handle_dummy: anyframe = @frame();
\\export fn entry() bool {
\\ return handle_undef == handle_dummy;
\\}
,
- "tmp.zig:2:29: error: @handle() called outside of function definition",
- );
-
- cases.add(
- "@handle() in non-async function",
- \\export fn entry() bool {
- \\ var handle_undef: promise = undefined;
- \\ return handle_undef == @handle();
- \\}
- ,
- "tmp.zig:3:28: error: @handle() in non-async function",
+ "tmp.zig:2:30: error: @frame() called outside of function definition",
);
cases.add(
@@ -1712,15 +1814,9 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
cases.add(
"suspend inside suspend block",
- \\const std = @import("std",);
- \\
\\export fn entry() void {
- \\ var buf: [500]u8 = undefined;
- \\ var a = &std.heap.FixedBufferAllocator.init(buf[0..]).allocator;
- \\ const p = (async<a> foo()) catch unreachable;
- \\ cancel p;
+ \\ _ = async foo();
\\}
- \\
\\async fn foo() void {
\\ suspend {
\\ suspend {
@@ -1728,8 +1824,8 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
\\ }
\\}
,
- "tmp.zig:12:9: error: cannot suspend inside suspend block",
- "tmp.zig:11:5: note: other suspend block here",
+ "tmp.zig:6:9: error: cannot suspend inside suspend block",
+ "tmp.zig:5:5: note: other suspend block here",
);
cases.add(
@@ -1770,15 +1866,14 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
cases.add(
"returning error from void async function",
- \\const std = @import("std",);
\\export fn entry() void {
- \\ const p = async<std.debug.global_allocator> amain() catch unreachable;
+ \\ _ = async amain();
\\}
\\async fn amain() void {
\\ return error.ShouldBeCompileError;
\\}
,
- "tmp.zig:6:17: error: expected type 'void', found 'error{ShouldBeCompileError}'",
+ "tmp.zig:5:17: error: expected type 'void', found 'error{ShouldBeCompileError}'",
);
cases.add(
@@ -3307,7 +3402,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
\\
\\export fn entry() usize { return @sizeOf(@typeOf(Foo)); }
,
- "tmp.zig:5:18: error: unable to evaluate constant expression",
+ "tmp.zig:5:25: error: unable to evaluate constant expression",
"tmp.zig:2:12: note: called from here",
"tmp.zig:2:8: note: called from here",
);