aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorVexu <git@vexu.eu>2020-02-26 01:03:58 +0200
committerAndrew Kelley <andrew@ziglang.org>2020-02-26 11:19:39 -0500
commitd505ea6cafe8bf6549eb2c56396b0a94d8109859 (patch)
treee3aabeb7b0aaa1d1c334a020e653fd815a9d2821 /src/codegen.cpp
parentc4a2734aa08a9e810680d7be2c976fe3ae67cc5b (diff)
downloadzig-d505ea6cafe8bf6549eb2c56396b0a94d8109859.tar.gz
zig-d505ea6cafe8bf6549eb2c56396b0a94d8109859.zip
fix `@tagName` on extern and non-exhaustive enums
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index f9d2566da7..0bf8510843 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -5031,8 +5031,18 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) {
LLVMConstNull(usize->llvm_type),
};
+ HashMap<BigInt, Buf *, bigint_hash, bigint_eql> occupied_tag_values = {};
+ occupied_tag_values.init(field_count);
+
for (size_t field_i = 0; field_i < field_count; field_i += 1) {
- Buf *name = enum_type->data.enumeration.fields[field_i].name;
+ TypeEnumField *type_enum_field = &enum_type->data.enumeration.fields[field_i];
+
+ Buf *name = type_enum_field->name;
+ auto entry = occupied_tag_values.put_unique(type_enum_field->value, name);
+ if (entry != nullptr) {
+ continue;
+ }
+
LLVMValueRef str_init = LLVMConstString(buf_ptr(name), (unsigned)buf_len(name), true);
LLVMValueRef str_global = LLVMAddGlobal(g->module, LLVMTypeOf(str_init), "");
LLVMSetInitializer(str_global, str_init);
@@ -5086,11 +5096,6 @@ static LLVMValueRef ir_render_enum_tag_name(CodeGen *g, IrExecutableGen *executa
{
ZigType *enum_type = instruction->target->value->type;
assert(enum_type->id == ZigTypeIdEnum);
- if (enum_type->data.enumeration.non_exhaustive) {
- add_node_error(g, instruction->base.base.source_node,
- buf_sprintf("TODO @tagName on non-exhaustive enum https://github.com/ziglang/zig/issues/3991"));
- codegen_report_errors_and_exit(g);
- }
LLVMValueRef enum_name_function = get_enum_tag_name_function(g, enum_type);