Commit 5b7ae86af4

Andrew Kelley <superjoe30@gmail.com>
2018-01-21 20:44:24
fix crash when switching on enum with 1 field and no switch prongs
closes #712
1 parent 517e8ea
Changed files (2)
src/ir.cpp
@@ -4992,7 +4992,11 @@ static IrInstruction *ir_gen_switch_expr(IrBuilder *irb, Scope *scope, AstNode *
 
     ir_set_cursor_at_end_and_append_block(irb, end_block);
     assert(incoming_blocks.length == incoming_values.length);
-    return ir_build_phi(irb, scope, node, incoming_blocks.length, incoming_blocks.items, incoming_values.items);
+    if (incoming_blocks.length == 0) {
+        return ir_build_const_void(irb, scope, node);
+    } else {
+        return ir_build_phi(irb, scope, node, incoming_blocks.length, incoming_blocks.items, incoming_values.items);
+    }
 }
 
 static IrInstruction *ir_gen_comptime(IrBuilder *irb, Scope *parent_scope, AstNode *node, LVal lval) {
test/compile_errors.zig
@@ -1,6 +1,15 @@
 const tests = @import("tests.zig");
 
 pub fn addCases(cases: &tests.CompileErrorContext) {
+    cases.add("switch on enum with 1 field with no prongs",
+        \\const Foo = enum { M };
+        \\
+        \\export fn entry() {
+        \\    var f = Foo.M;
+        \\    switch (f) {}
+        \\}
+    , ".tmp_source.zig:5:5: error: enumeration value 'Foo.M' not handled in switch");
+
     cases.add("shift by negative comptime integer",
         \\comptime {
         \\    var a = 1 >> -1;