diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-02-26 11:21:30 -0500 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2020-02-26 11:21:30 -0500 |
| commit | 6291e8e4926c2e7dbd5cfa651f862c7dbd2e5bda (patch) | |
| tree | c30178b457a4afcca39e355da12502f2c6216a7f /src/ir.cpp | |
| parent | c4a2734aa08a9e810680d7be2c976fe3ae67cc5b (diff) | |
| parent | 62de32a18c1eecedc29055e4199fa364f9e9b7c6 (diff) | |
| download | zig-6291e8e4926c2e7dbd5cfa651f862c7dbd2e5bda.tar.gz zig-6291e8e4926c2e7dbd5cfa651f862c7dbd2e5bda.zip | |
Merge branch 'Vexu-tagname'
closes #4559
closes #3991
Diffstat (limited to 'src/ir.cpp')
| -rw-r--r-- | src/ir.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index 8a7976995c..4d24ec7dfb 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -23190,12 +23190,15 @@ static IrInstGen *ir_analyze_instruction_enum_tag_name(IrAnalyze *ira, IrInstSrc if (instr_is_comptime(target)) { if ((err = type_resolve(ira->codegen, target->value->type, ResolveStatusZeroBitsKnown))) return ira->codegen->invalid_inst_gen; - if (target->value->type->data.enumeration.non_exhaustive) { - ir_add_error(ira, &instruction->base.base, - buf_sprintf("TODO @tagName on non-exhaustive enum https://github.com/ziglang/zig/issues/3991")); + TypeEnumField *field = find_enum_field_by_tag(target->value->type, &target->value->data.x_bigint); + if (field == nullptr) { + Buf *int_buf = buf_alloc(); + bigint_append_buf(int_buf, &target->value->data.x_bigint, 10); + + ir_add_error(ira, &target->base, + buf_sprintf("no tag by value %s", buf_ptr(int_buf))); return ira->codegen->invalid_inst_gen; } - TypeEnumField *field = find_enum_field_by_tag(target->value->type, &target->value->data.x_bigint); ZigValue *array_val = create_const_str_lit(ira->codegen, field->name)->data.x_ptr.data.ref.pointee; IrInstGen *result = ir_const(ira, &instruction->base.base, nullptr); init_const_slice(ira->codegen, result->value, array_val, 0, buf_len(field->name), true); |
