authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-02-10 22:28:53-07:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-12 11:18:23+01:00
log335c680cde670776280c3a812adb64abd1311d97
tree8d1e70e1afeb0c0c45818d37e1e3dfa7639540b7
parent1a8987fe7c0e8ee43eb8f3dcccb932b7b2afcee2

LLVM backend: fix union with only 1 tag tripping llvm assertion


1 files changed, 3 insertions(+), 1 deletions(-)

src/codegen/llvm.zig+3-1
......@@ -835,6 +835,7 @@ pub const DeclGen = struct {
835835 var buffer: Type.Payload.Bits = undefined;
836836 const int_ty = t.intTagType(&buffer);
837837 const bit_count = int_ty.intInfo(target).bits;
838 assert(bit_count != 0);
838839 return dg.context.intType(bit_count);
839840 },
840841 .Float => switch (t.floatBits(target)) {
......@@ -1077,10 +1078,10 @@ pub const DeclGen = struct {
10771078
10781079 const union_obj = t.cast(Type.Payload.Union).?.data;
10791080 if (t.unionTagType()) |enum_tag_ty| {
1080 const enum_tag_llvm_ty = try dg.llvmType(enum_tag_ty);
10811081 const layout = union_obj.getLayout(target, true);
10821082
10831083 if (layout.payload_size == 0) {
1084 const enum_tag_llvm_ty = try dg.llvmType(enum_tag_ty);
10841085 gop.value_ptr.* = enum_tag_llvm_ty;
10851086 return enum_tag_llvm_ty;
10861087 }
......@@ -1111,6 +1112,7 @@ pub const DeclGen = struct {
11111112 llvm_union_ty.structSetBody(&llvm_fields, llvm_fields.len, .False);
11121113 return llvm_union_ty;
11131114 }
1115 const enum_tag_llvm_ty = try dg.llvmType(enum_tag_ty);
11141116
11151117 // Put the tag before or after the payload depending on which one's
11161118 // alignment is greater.