aboutsummaryrefslogtreecommitdiff
path: root/test/behavior
diff options
context:
space:
mode:
authorMitchell Hashimoto <mitchell.hashimoto@gmail.com>2022-03-14 16:21:11 -0700
committerMitchell Hashimoto <mitchell.hashimoto@gmail.com>2022-03-14 17:41:12 -0700
commita859f94644cb362d84d3f9d72bc02b00a75fc32a (patch)
treee3f4d09b74fb4bca327b192d311bb5bbe950d161 /test/behavior
parent5ea94e7715607e986298908536cdd3d9dfdd0ce9 (diff)
downloadzig-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.zig42
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;
+}