aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2023-03-21 14:55:36 +0200
committerGitHub <noreply@github.com>2023-03-21 14:55:36 +0200
commitf7204c7f37ee69462b9ad41a76454831e0df09d0 (patch)
treef6a68e9131f8bf8eec7ce7161209c3a52e84390a /test
parent515e1c93e18d81435410f2cb45f3788c6be13fbf (diff)
parente70a0b2a6b329a76e9edc4d22c7b923841703a24 (diff)
downloadzig-f7204c7f37ee69462b9ad41a76454831e0df09d0.tar.gz
zig-f7204c7f37ee69462b9ad41a76454831e0df09d0.zip
Merge pull request #15028 from Vexu/compile-errors
Sema: improve error message of field access of wrapped type
Diffstat (limited to 'test')
-rw-r--r--test/behavior/src.zig11
-rw-r--r--test/behavior/union.zig40
-rw-r--r--test/cases/compile_errors/field_access_of_wrapped_type.zig20
3 files changed, 71 insertions, 0 deletions
diff --git a/test/behavior/src.zig b/test/behavior/src.zig
index 77e420afcf..e6b84e5d56 100644
--- a/test/behavior/src.zig
+++ b/test/behavior/src.zig
@@ -32,3 +32,14 @@ test "@src used as a comptime parameter" {
const T2 = S.Foo(@src());
try expect(T1 != T2);
}
+
+test "@src in tuple passed to anytype function" {
+ const S = struct {
+ fn Foo(a: anytype) u32 {
+ return a[0].line;
+ }
+ };
+ const l1 = S.Foo(.{@src()});
+ const l2 = S.Foo(.{@src()});
+ try expect(l1 != l2);
+}
diff --git a/test/behavior/union.zig b/test/behavior/union.zig
index 3b040fcba9..f247bf6fa2 100644
--- a/test/behavior/union.zig
+++ b/test/behavior/union.zig
@@ -1492,3 +1492,43 @@ test "union reassignment can use previous value" {
a = U{ .b = a.a };
try expect(a.b == 32);
}
+
+test "packed union with zero-bit field" {
+ if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
+
+ const S = packed struct {
+ nested: packed union {
+ zero: void,
+ sized: u32,
+ },
+ bar: u32,
+
+ fn doTest(self: @This()) !void {
+ try expect(self.bar == 42);
+ }
+ };
+ try S.doTest(.{ .nested = .{ .zero = {} }, .bar = 42 });
+}
+
+test "reinterpreting enum value inside packed union" {
+ if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
+
+ const U = packed union {
+ tag: enum { a, b },
+ val: u8,
+
+ fn doTest() !void {
+ var u: @This() = .{ .tag = .a };
+ u.val += 1;
+ try expect(u.tag == .b);
+ }
+ };
+ try U.doTest();
+ comptime try U.doTest();
+}
diff --git a/test/cases/compile_errors/field_access_of_wrapped_type.zig b/test/cases/compile_errors/field_access_of_wrapped_type.zig
new file mode 100644
index 0000000000..9d8a7ef17c
--- /dev/null
+++ b/test/cases/compile_errors/field_access_of_wrapped_type.zig
@@ -0,0 +1,20 @@
+const Foo = struct {
+ a: i32,
+};
+export fn f1() void {
+ var foo: ?Foo = undefined;
+ foo.a += 1;
+}
+export fn f2() void {
+ var foo: anyerror!Foo = undefined;
+ foo.a += 1;
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :6:8: error: optional type '?tmp.Foo' does not support field access
+// :6:8: note: consider using '.?', 'orelse', or 'if'
+// :10:8: error: error union type 'anyerror!tmp.Foo' does not support field access
+// :10:8: note: consider using 'try', 'catch', or 'if'