authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-12-17 17:57:26-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-12-17 17:57:26-05:00
loga07d7ee53d7695b7ca56ced0a4ba25de2532ccbc
tree8ca58ad22f49e71f3b6a5561ba2af5d4075404cb
parentc64f9991d561ff9a8e3c4575e8149404784497d3

IR: fix compile time switch eval for enums


2 files changed, 9 insertions(+), 3 deletions(-)

src/ir.cpp+7-1
...@@ -7635,7 +7635,7 @@ static TypeTableEntry *ir_analyze_instruction_switch_br(IrAnalyze *ira,...@@ -7635,7 +7635,7 @@ static TypeTableEntry *ir_analyze_instruction_switch_br(IrAnalyze *ira,
7635 size_t case_count = switch_br_instruction->case_count;7635 size_t case_count = switch_br_instruction->case_count;
7636 bool is_inline = ir_should_inline(&ira->new_irb) || switch_br_instruction->is_inline;7636 bool is_inline = ir_should_inline(&ira->new_irb) || switch_br_instruction->is_inline;
76377637
7638 if (is_inline || target_value->static_value.special != ConstValSpecialRuntime) {7638 if (is_inline || instr_is_comptime(target_value)) {
7639 ConstExprValue *target_val = ir_resolve_const(ira, target_value);7639 ConstExprValue *target_val = ir_resolve_const(ira, target_value);
7640 if (!target_val)7640 if (!target_val)
7641 return ir_unreach_error(ira);7641 return ir_unreach_error(ira);
...@@ -7646,6 +7646,12 @@ static TypeTableEntry *ir_analyze_instruction_switch_br(IrAnalyze *ira,...@@ -7646,6 +7646,12 @@ static TypeTableEntry *ir_analyze_instruction_switch_br(IrAnalyze *ira,
7646 if (case_value->type_entry->id == TypeTableEntryIdInvalid)7646 if (case_value->type_entry->id == TypeTableEntryIdInvalid)
7647 return ir_unreach_error(ira);7647 return ir_unreach_error(ira);
76487648
7649 if (case_value->type_entry->id == TypeTableEntryIdEnum) {
7650 case_value = ir_analyze_enum_tag(ira, &switch_br_instruction->base, case_value);
7651 if (case_value->type_entry->id == TypeTableEntryIdInvalid)
7652 return ir_unreach_error(ira);
7653 }
7654
7649 IrInstruction *casted_case_value = ir_implicit_cast(ira, case_value, target_value->type_entry);7655 IrInstruction *casted_case_value = ir_implicit_cast(ira, case_value, target_value->type_entry);
7650 if (casted_case_value->type_entry->id == TypeTableEntryIdInvalid)7656 if (casted_case_value->type_entry->id == TypeTableEntryIdInvalid)
7651 return ir_unreach_error(ira);7657 return ir_unreach_error(ira);
std/linux.zig+2-2
...@@ -1,6 +1,6 @@...@@ -1,6 +1,6 @@
1const arch = switch (@compileVar("arch")) {1const arch = switch (@compileVar("arch")) {
2 x86_64 => @import("linux_x86_64.zig"),2 Arch.x86_64 => @import("linux_x86_64.zig"),
3 i386 => @import("linux_i386.zig"),3 Arch.i386 => @import("linux_i386.zig"),
4 else => @compileError("unsupported arch"),4 else => @compileError("unsupported arch"),
5};5};
6const errno = @import("errno.zig");6const errno = @import("errno.zig");