aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2020-01-18 19:58:05 +0100
committerLemonBoy <thatlemon@gmail.com>2020-01-18 20:16:15 +0100
commitb0f753e21d6fcaafd0b35dc02fdfe23b14e310d6 (patch)
tree0a4a4983b88edf9bf4bf36ae6fde7ead4e3870f6 /src/ir.cpp
parentc53d94e5127a8dcfefd906c5be0e6b81eaf3d22c (diff)
downloadzig-b0f753e21d6fcaafd0b35dc02fdfe23b14e310d6.tar.gz
zig-b0f753e21d6fcaafd0b35dc02fdfe23b14e310d6.zip
Fix edge case in tagName handling of unions
Closes #4226
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index ae02ac9cae..ff4b552a9b 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -22354,6 +22354,15 @@ static IrInstruction *ir_analyze_instruction_enum_tag_name(IrAnalyze *ira, IrIns
assert(target->value->type->id == ZigTypeIdEnum);
+ if (target->value->type->data.enumeration.src_field_count == 1 &&
+ !target->value->type->data.enumeration.non_exhaustive) {
+ TypeEnumField *only_field = &target->value->type->data.enumeration.fields[0];
+ ZigValue *array_val = create_const_str_lit(ira->codegen, only_field->name)->data.x_ptr.data.ref.pointee;
+ IrInstruction *result = ir_const(ira, &instruction->base, nullptr);
+ init_const_slice(ira->codegen, result->value, array_val, 0, buf_len(only_field->name), true);
+ return result;
+ }
+
if (instr_is_comptime(target)) {
if ((err = type_resolve(ira->codegen, target->value->type, ResolveStatusZeroBitsKnown)))
return ira->codegen->invalid_instruction;