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
This commit is contained in:
Mitchell Hashimoto
2022-03-14 16:21:11 -07:00
parent 5ea94e7715
commit a859f94644
3 changed files with 47 additions and 3 deletions

View File

@@ -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;
}