diff options
| author | Mitchell Hashimoto <mitchell.hashimoto@gmail.com> | 2022-03-14 16:21:11 -0700 |
|---|---|---|
| committer | Mitchell Hashimoto <mitchell.hashimoto@gmail.com> | 2022-03-14 17:41:12 -0700 |
| commit | a859f94644cb362d84d3f9d72bc02b00a75fc32a (patch) | |
| tree | e3f4d09b74fb4bca327b192d311bb5bbe950d161 /test/behavior | |
| parent | 5ea94e7715607e986298908536cdd3d9dfdd0ce9 (diff) | |
| download | zig-a859f94644cb362d84d3f9d72bc02b00a75fc32a.tar.gz zig-a859f94644cb362d84d3f9d72bc02b00a75fc32a.zip | |
stage2: LLVM codegen of arrays should use type length, not value length
It is possible for the value length to be longer than the type because
we allow in-memory coercing of types such as `[5:0]u8` to `[5]u8`. In
such a case, the value length is 6 but the type length if 5.
The `.repeated` value type already got this right, so this is extending
similar logic out to `.aggregate` and `.bytes`. Both scenarios are
tested in behavior tests.
Fixes #11165
Diffstat (limited to 'test/behavior')
| -rw-r--r-- | test/behavior/bugs/11165.zig | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/test/behavior/bugs/11165.zig b/test/behavior/bugs/11165.zig new file mode 100644 index 0000000000..d253c17b67 --- /dev/null +++ b/test/behavior/bugs/11165.zig @@ -0,0 +1,42 @@ +const builtin = @import("builtin"); + +test "bytes" { + const S = struct { + a: u32, + c: [5]u8, + }; + + const U = union { + s: S, + }; + + const s_1 = S{ + .a = undefined, + .c = "12345".*, // this caused problems + }; + _ = s_1; + + const u_2 = U{ .s = s_1 }; + _ = u_2; +} + +test "aggregate" { + const S = struct { + a: u32, + c: [5]u8, + }; + + const U = union { + s: S, + }; + + const c = [5:0]u8{ 1, 2, 3, 4, 5 }; + const s_1 = S{ + .a = undefined, + .c = c, // this caused problems + }; + _ = s_1; + + const u_2 = U{ .s = s_1 }; + _ = u_2; +} |
