Allow @tagName on enum literals

Closes #4214
master
LemonBoy 2020-01-18 09:55:18 +01:00
parent b5ac079f88
commit 5f2bac010d
2 changed files with 15 additions and 2 deletions

View File

@ -21389,9 +21389,9 @@ static IrInstruction *ir_analyze_union_tag(IrAnalyze *ira, IrInstruction *source
if (type_is_invalid(value->value->type)) if (type_is_invalid(value->value->type))
return ira->codegen->invalid_instruction; return ira->codegen->invalid_instruction;
if (value->value->type->id == ZigTypeIdEnum) { if (value->value->type->id == ZigTypeIdEnum ||
value->value->type->id == ZigTypeIdEnumLiteral)
return value; return value;
}
if (value->value->type->id != ZigTypeIdUnion) { if (value->value->type->id != ZigTypeIdUnion) {
ir_add_error(ira, value, ir_add_error(ira, value,
@ -22352,6 +22352,14 @@ static IrInstruction *ir_analyze_instruction_enum_tag_name(IrAnalyze *ira, IrIns
if (type_is_invalid(target->value->type)) if (type_is_invalid(target->value->type))
return ira->codegen->invalid_instruction; return ira->codegen->invalid_instruction;
if (target->value->type->id == ZigTypeIdEnumLiteral) {
IrInstruction *result = ir_const(ira, &instruction->base, nullptr);
Buf *field_name = target->value->data.x_enum_literal;
ZigValue *array_val = create_const_str_lit(ira->codegen, field_name)->data.x_ptr.data.ref.pointee;
init_const_slice(ira->codegen, result->value, array_val, 0, buf_len(field_name), true);
return result;
}
assert(target->value->type->id == ZigTypeIdEnum); assert(target->value->type->id == ZigTypeIdEnum);
if (instr_is_comptime(target)) { if (instr_is_comptime(target)) {

View File

@ -1094,3 +1094,8 @@ test "enum with one member default to u0 tag type" {
}; };
comptime expect(@TagType(E0) == u0); comptime expect(@TagType(E0) == u0);
} }
test "tagName on enum literals" {
expect(mem.eql(u8, @tagName(.FooBar), "FooBar"));
comptime expect(mem.eql(u8, @tagName(.FooBar), "FooBar"));
}