aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorVexu <git@vexu.eu>2020-02-26 01:19:22 +0200
committerAndrew Kelley <andrew@ziglang.org>2020-02-26 11:19:40 -0500
commit215797749d0e0d911feaaf45dc70836c3d12f18e (patch)
tree793188e8534af70da40ba6ccee4a4df5e7ddae74 /src/codegen.cpp
parentd505ea6cafe8bf6549eb2c56396b0a94d8109859 (diff)
downloadzig-215797749d0e0d911feaaf45dc70836c3d12f18e.tar.gz
zig-215797749d0e0d911feaaf45dc70836c3d12f18e.zip
fix `@intToEnum` on extern enums
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index 0bf8510843..4d992d25d0 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -3329,9 +3329,21 @@ static LLVMValueRef ir_render_int_to_enum(CodeGen *g, IrExecutableGen *executabl
LLVMBasicBlockRef ok_value_block = LLVMAppendBasicBlock(g->cur_fn_val, "OkValue");
size_t field_count = wanted_type->data.enumeration.src_field_count;
LLVMValueRef switch_instr = LLVMBuildSwitch(g->builder, tag_int_value, bad_value_block, field_count);
+
+ 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) {
+ TypeEnumField *type_enum_field = &wanted_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 this_tag_int_value = bigint_to_llvm_const(get_llvm_type(g, tag_int_type),
- &wanted_type->data.enumeration.fields[field_i].value);
+ &type_enum_field->value);
LLVMAddCase(switch_instr, this_tag_int_value, ok_value_block);
}
LLVMPositionBuilderAtEnd(g->builder, bad_value_block);