authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-01-18 19:58:05+01:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-01-18 20:16:15+01:00
logb0f753e21d6fcaafd0b35dc02fdfe23b14e310d6
tree0a4a4983b88edf9bf4bf36ae6fde7ead4e3870f6
parentc53d94e5127a8dcfefd906c5be0e6b81eaf3d22c

Fix edge case in tagName handling of unions

Closes #4226

2 files changed, 18 insertions(+), 0 deletions(-)

src/ir.cpp+9
...@@ -22354,6 +22354,15 @@ static IrInstruction *ir_analyze_instruction_enum_tag_name(IrAnalyze *ira, IrIns...@@ -22354,6 +22354,15 @@ static IrInstruction *ir_analyze_instruction_enum_tag_name(IrAnalyze *ira, IrIns
2235422354
22355 assert(target->value->type->id == ZigTypeIdEnum);22355 assert(target->value->type->id == ZigTypeIdEnum);
2235622356
22357 if (target->value->type->data.enumeration.src_field_count == 1 &&
22358 !target->value->type->data.enumeration.non_exhaustive) {
22359 TypeEnumField *only_field = &target->value->type->data.enumeration.fields[0];
22360 ZigValue *array_val = create_const_str_lit(ira->codegen, only_field->name)->data.x_ptr.data.ref.pointee;
22361 IrInstruction *result = ir_const(ira, &instruction->base, nullptr);
22362 init_const_slice(ira->codegen, result->value, array_val, 0, buf_len(only_field->name), true);
22363 return result;
22364 }
22365
22357 if (instr_is_comptime(target)) {22366 if (instr_is_comptime(target)) {
22358 if ((err = type_resolve(ira->codegen, target->value->type, ResolveStatusZeroBitsKnown)))22367 if ((err = type_resolve(ira->codegen, target->value->type, ResolveStatusZeroBitsKnown)))
22359 return ira->codegen->invalid_instruction;22368 return ira->codegen->invalid_instruction;
test/stage1/behavior/union.zig+9
...@@ -629,3 +629,12 @@ test "union initializer generates padding only if needed" {...@@ -629,3 +629,12 @@ test "union initializer generates padding only if needed" {
629 var v = U{ .A = 532 };629 var v = U{ .A = 532 };
630 expect(v.A == 532);630 expect(v.A == 532);
631}631}
632
633test "runtime tag name with single field" {
634 const U = union(enum) {
635 A: i32,
636 };
637
638 var v = U{ .A = 42 };
639 expect(std.mem.eql(u8, @tagName(v), "A"));
640}