diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2017-01-15 22:16:39 -0500 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2017-01-15 22:16:39 -0500 |
| commit | 8106f9846aea806350d319535e0181104299ba5d (patch) | |
| tree | ef60cad5d8aa230cd7b5c34c6ef7c0db1d0bda88 /src/ir.cpp | |
| parent | 0c1800a9c9507dd1b06c70cb8950b13afe09f758 (diff) | |
| download | zig-8106f9846aea806350d319535e0181104299ba5d.tar.gz zig-8106f9846aea806350d319535e0181104299ba5d.zip | |
fix enum codegen and implement comptime switch var on enums
Diffstat (limited to 'src/ir.cpp')
| -rw-r--r-- | src/ir.cpp | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index 50eae17ebf..cd72d029d4 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -9565,7 +9565,20 @@ static TypeTableEntry *ir_analyze_instruction_switch_var(IrAnalyze *ira, IrInstr } if (instr_is_comptime(target_value_ptr)) { - zig_panic("TODO comptime switch var"); + ConstExprValue *target_val_ptr = ir_resolve_const(ira, target_value_ptr, UndefBad); + if (!target_value_ptr) + return ira->codegen->builtin_types.entry_invalid; + + ConstExprValue *pointee_val = const_ptr_pointee(target_val_ptr); + if (pointee_val->type->id == TypeTableEntryIdEnum) { + bool depends_on_compile_var = target_value_ptr->value.depends_on_compile_var; + ConstExprValue *out_val = ir_build_const_from(ira, &instruction->base, depends_on_compile_var); + out_val->data.x_ptr.base_ptr = pointee_val->data.x_enum.payload; + out_val->data.x_ptr.index = SIZE_MAX; + return get_pointer_to_type(ira->codegen, pointee_val->type, target_value_ptr->value.type->data.pointer.is_const); + } else { + zig_panic("TODO comptime switch var"); + } } ir_build_enum_field_ptr_from(&ira->new_irb, &instruction->base, target_value_ptr, field); |
