aboutsummaryrefslogtreecommitdiff
path: root/test/cases/compile_errors
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2024-01-09 13:54:27 -0800
committerGitHub <noreply@github.com>2024-01-09 13:54:27 -0800
commitacca16c8cee4529bcb11c150c2c99b7de32ce21f (patch)
tree78900c056830d99f6dfaa849faf23df8d4e53032 /test/cases/compile_errors
parentdbdee2d53cf22be8bcc9031c1c15a58ce530b131 (diff)
parent67d7d7b5a79cd709749f7435e1c3e4ef2e9150be (diff)
downloadzig-acca16c8cee4529bcb11c150c2c99b7de32ce21f.tar.gz
zig-acca16c8cee4529bcb11c150c2c99b7de32ce21f.zip
Merge pull request #18173 from dweiller/switch-err-union
Special-case switching on error union capture
Diffstat (limited to 'test/cases/compile_errors')
-rw-r--r--test/cases/compile_errors/switch_expression-duplicate_error_prong.zig33
-rw-r--r--test/cases/compile_errors/switch_expression-duplicate_error_prong_when_else_present.zig35
-rw-r--r--test/cases/compile_errors/switch_expression-missing_error_prong.zig33
-rw-r--r--test/cases/compile_errors/switch_expression-multiple_else_prongs.zig20
-rw-r--r--test/cases/compile_errors/switch_expression-unreachable_else_prong_error.zig32
-rw-r--r--test/cases/compile_errors/switch_on_error_union_discard.zig12
-rw-r--r--test/cases/compile_errors/switch_on_error_with_1_field_with_no_prongs.zig20
7 files changed, 185 insertions, 0 deletions
diff --git a/test/cases/compile_errors/switch_expression-duplicate_error_prong.zig b/test/cases/compile_errors/switch_expression-duplicate_error_prong.zig
new file mode 100644
index 0000000000..bcebd25a58
--- /dev/null
+++ b/test/cases/compile_errors/switch_expression-duplicate_error_prong.zig
@@ -0,0 +1,33 @@
+fn f(n: Error!i32) i32 {
+ if (n) |x|
+ _ = x
+ else |e| switch (e) {
+ error.Foo => 1,
+ error.Bar => 2,
+ error.Baz => 3,
+ error.Foo => 2,
+ }
+}
+fn g(n: Error!i32) i32 {
+ n catch |e| switch (e) {
+ error.Foo => 1,
+ error.Bar => 2,
+ error.Baz => 3,
+ error.Foo => 2,
+ };
+}
+
+const Error = error{ Foo, Bar, Baz };
+
+export fn entry() usize {
+ return @sizeOf(@TypeOf(&f)) + @sizeOf(@TypeOf(&g));
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :8:9: error: duplicate switch value
+// :5:9: note: previous value here
+// :16:9: error: duplicate switch value
+// :13:9: note: previous value here
diff --git a/test/cases/compile_errors/switch_expression-duplicate_error_prong_when_else_present.zig b/test/cases/compile_errors/switch_expression-duplicate_error_prong_when_else_present.zig
new file mode 100644
index 0000000000..ca156183e0
--- /dev/null
+++ b/test/cases/compile_errors/switch_expression-duplicate_error_prong_when_else_present.zig
@@ -0,0 +1,35 @@
+fn f(n: Error!i32) i32 {
+ if (n) |x|
+ _ = x
+ else |e| switch (e) {
+ error.Foo => 1,
+ error.Bar => 2,
+ error.Baz => 3,
+ error.Foo => 2,
+ else => 10,
+ }
+}
+fn g(n: Error!i32) i32 {
+ n catch |e| switch (e) {
+ error.Foo => 1,
+ error.Bar => 2,
+ error.Baz => 3,
+ error.Foo => 2,
+ else => 10,
+ };
+}
+
+const Error = error{ Foo, Bar, Baz };
+
+export fn entry() usize {
+ return @sizeOf(@TypeOf(&f)) + @sizeOf(@TypeOf(&g));
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :8:9: error: duplicate switch value
+// :5:9: note: previous value here
+// :17:9: error: duplicate switch value
+// :14:9: note: previous value here
diff --git a/test/cases/compile_errors/switch_expression-missing_error_prong.zig b/test/cases/compile_errors/switch_expression-missing_error_prong.zig
new file mode 100644
index 0000000000..ee28057c43
--- /dev/null
+++ b/test/cases/compile_errors/switch_expression-missing_error_prong.zig
@@ -0,0 +1,33 @@
+const Error = error {
+ One,
+ Two,
+ Three,
+ Four,
+};
+fn f(n: Error!i32) i32 {
+ if (n) |x| x else |e| switch (e) {
+ error.One => 1,
+ error.Two => 2,
+ error.Three => 3,
+ }
+}
+fn h(n: Error!i32) i32 {
+ n catch |e| switch (e) {
+ error.One => 1,
+ error.Two => 2,
+ error.Three => 3,
+ };
+}
+
+export fn entry() usize {
+ return @sizeOf(@TypeOf(&f)) + @sizeOf(@TypeOf(&h));
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :8:27: error: switch must handle all possibilities
+// :8:27: note: unhandled error value: 'error.Four'
+// :15:17: error: switch must handle all possibilities
+// :15:17: note: unhandled error value: 'error.Four'
diff --git a/test/cases/compile_errors/switch_expression-multiple_else_prongs.zig b/test/cases/compile_errors/switch_expression-multiple_else_prongs.zig
index f4cdb3b125..a6bb48db17 100644
--- a/test/cases/compile_errors/switch_expression-multiple_else_prongs.zig
+++ b/test/cases/compile_errors/switch_expression-multiple_else_prongs.zig
@@ -5,8 +5,24 @@ fn f(x: u32) void {
else => true,
};
}
+fn g(x: error{Foo, Bar, Baz}!u32) void {
+ const value: bool = if (x) |_| true else |e| switch (e) {
+ error.Foo => false,
+ else => true,
+ else => true,
+ };
+}
+fn h(x: error{Foo, Bar, Baz}!u32) void {
+ const value: u32 = x catch |e| switch (e) {
+ error.Foo => 1,
+ else => 2,
+ else => 3,
+ };
+}
export fn entry() void {
f(1234);
+ g(1234);
+ h(1234);
}
// error
@@ -15,3 +31,7 @@ export fn entry() void {
//
// :5:9: error: multiple else prongs in switch expression
// :4:9: note: previous else prong here
+// :12:9: error: multiple else prongs in switch expression
+// :11:9: note: previous else prong here
+// :19:9: error: multiple else prongs in switch expression
+// :18:9: note: previous else prong here
diff --git a/test/cases/compile_errors/switch_expression-unreachable_else_prong_error.zig b/test/cases/compile_errors/switch_expression-unreachable_else_prong_error.zig
new file mode 100644
index 0000000000..520723d927
--- /dev/null
+++ b/test/cases/compile_errors/switch_expression-unreachable_else_prong_error.zig
@@ -0,0 +1,32 @@
+fn foo(x: u2) void {
+ const y: Error!u2 = x;
+ if (y) |_| {} else |e| switch (e) {
+ error.Foo => {},
+ error.Bar => {},
+ error.Baz => {},
+ else => {},
+ }
+}
+
+fn bar(x: u2) void {
+ const y: Error!u2 = x;
+ y catch |e| switch (e) {
+ error.Foo => {},
+ error.Bar => {},
+ error.Baz => {},
+ else => {},
+ };
+}
+
+const Error = error{ Foo, Bar, Baz };
+
+export fn entry() usize {
+ return @sizeOf(@TypeOf(&foo)) + @sizeOf(@TypeOf(&bar));
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :7:14: error: unreachable else prong; all cases already handled
+// :17:14: error: unreachable else prong; all cases already handled
diff --git a/test/cases/compile_errors/switch_on_error_union_discard.zig b/test/cases/compile_errors/switch_on_error_union_discard.zig
new file mode 100644
index 0000000000..34a607cfef
--- /dev/null
+++ b/test/cases/compile_errors/switch_on_error_union_discard.zig
@@ -0,0 +1,12 @@
+export fn entry() void {
+ const x: error{}!u32 = 0;
+ if (x) |v| v else |_| switch (_) {
+ }
+}
+
+
+// error
+// backend=stage2
+// target=native
+//
+// :3:24: error: discard of error capture; omit it instead
diff --git a/test/cases/compile_errors/switch_on_error_with_1_field_with_no_prongs.zig b/test/cases/compile_errors/switch_on_error_with_1_field_with_no_prongs.zig
new file mode 100644
index 0000000000..504df0374f
--- /dev/null
+++ b/test/cases/compile_errors/switch_on_error_with_1_field_with_no_prongs.zig
@@ -0,0 +1,20 @@
+const Error = error{M};
+
+export fn entry() void {
+ const f: Error!void = void{};
+ if (f) {} else |e| switch (e) {}
+}
+
+export fn entry2() void {
+ const f: Error!void = void{};
+ f catch |e| switch (e) {};
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :5:24: error: switch must handle all possibilities
+// :5:24: note: unhandled error value: 'error.M'
+// :10:17: error: switch must handle all possibilities
+// :10:17: note: unhandled error value: 'error.M'