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:
42
test/behavior/bugs/11165.zig
Normal file
42
test/behavior/bugs/11165.zig
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user