authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-01-18 09:55:18+01:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-01-18 09:55:18+01:00
log5f2bac010df0a2cf1e36622d6742baf13f4ffe75
treedbff10ac490a6842e059e81be5ce6967ddf861ba
parentb5ac079f88e9098ea9c95356518820a5c3fb42a8

Allow @tagName on enum literals

Closes #4214

2 files changed, 15 insertions(+), 2 deletions(-)

src/ir.cpp+10-2
...@@ -21389,9 +21389,9 @@ static IrInstruction *ir_analyze_union_tag(IrAnalyze *ira, IrInstruction *source...@@ -21389,9 +21389,9 @@ static IrInstruction *ir_analyze_union_tag(IrAnalyze *ira, IrInstruction *source
21389 if (type_is_invalid(value->value->type))21389 if (type_is_invalid(value->value->type))
21390 return ira->codegen->invalid_instruction;21390 return ira->codegen->invalid_instruction;
2139121391
21392 if (value->value->type->id == ZigTypeIdEnum) {21392 if (value->value->type->id == ZigTypeIdEnum ||
21393 value->value->type->id == ZigTypeIdEnumLiteral)
21393 return value;21394 return value;
21394 }
2139521395
21396 if (value->value->type->id != ZigTypeIdUnion) {21396 if (value->value->type->id != ZigTypeIdUnion) {
21397 ir_add_error(ira, value,21397 ir_add_error(ira, value,
...@@ -22352,6 +22352,14 @@ static IrInstruction *ir_analyze_instruction_enum_tag_name(IrAnalyze *ira, IrIns...@@ -22352,6 +22352,14 @@ static IrInstruction *ir_analyze_instruction_enum_tag_name(IrAnalyze *ira, IrIns
22352 if (type_is_invalid(target->value->type))22352 if (type_is_invalid(target->value->type))
22353 return ira->codegen->invalid_instruction;22353 return ira->codegen->invalid_instruction;
2235422354
22355 if (target->value->type->id == ZigTypeIdEnumLiteral) {
22356 IrInstruction *result = ir_const(ira, &instruction->base, nullptr);
22357 Buf *field_name = target->value->data.x_enum_literal;
22358 ZigValue *array_val = create_const_str_lit(ira->codegen, field_name)->data.x_ptr.data.ref.pointee;
22359 init_const_slice(ira->codegen, result->value, array_val, 0, buf_len(field_name), true);
22360 return result;
22361 }
22362
22355 assert(target->value->type->id == ZigTypeIdEnum);22363 assert(target->value->type->id == ZigTypeIdEnum);
2235622364
22357 if (instr_is_comptime(target)) {22365 if (instr_is_comptime(target)) {
test/stage1/behavior/enum.zig+5
...@@ -1094,3 +1094,8 @@ test "enum with one member default to u0 tag type" {...@@ -1094,3 +1094,8 @@ test "enum with one member default to u0 tag type" {
1094 };1094 };
1095 comptime expect(@TagType(E0) == u0);1095 comptime expect(@TagType(E0) == u0);
1096}1096}
1097
1098test "tagName on enum literals" {
1099 expect(mem.eql(u8, @tagName(.FooBar), "FooBar"));
1100 comptime expect(mem.eql(u8, @tagName(.FooBar), "FooBar"));
1101}