Commit 48ccf427af

Andrew Kelley <andrew@ziglang.org>
2019-06-21 20:06:01
fix nested orelse and nested catch
1 parent 4299cd4
Changed files (3)
src
test
stage1
src/ir.cpp
@@ -4065,7 +4065,7 @@ static IrInstruction *ir_gen_orelse(IrBuilder *irb, Scope *parent_scope, AstNode
             result_loc, is_comptime);
 
     ir_set_cursor_at_end_and_append_block(irb, null_block);
-    IrInstruction *null_result = ir_gen_node_extra(irb, op2_node, parent_scope, lval,
+    IrInstruction *null_result = ir_gen_node_extra(irb, op2_node, parent_scope, LValNone,
             &peer_parent->peers.at(0)->base);
     if (null_result == irb->codegen->invalid_instruction)
         return irb->codegen->invalid_instruction;
@@ -7496,7 +7496,7 @@ static IrInstruction *ir_gen_catch(IrBuilder *irb, Scope *parent_scope, AstNode
     } else {
         err_scope = parent_scope;
     }
-    IrInstruction *err_result = ir_gen_node_extra(irb, op2_node, err_scope, lval, &peer_parent->peers.at(0)->base);
+    IrInstruction *err_result = ir_gen_node_extra(irb, op2_node, err_scope, LValNone, &peer_parent->peers.at(0)->base);
     if (err_result == irb->codegen->invalid_instruction)
         return irb->codegen->invalid_instruction;
     IrBasicBlock *after_err_block = irb->current_basic_block;
test/stage1/behavior/error.zig
@@ -335,3 +335,25 @@ test "debug info for optional error set" {
     const SomeError = error{Hello};
     var a_local_variable: ?SomeError = null;
 }
+
+test "nested catch" {
+    const S = struct {
+        fn entry() void {
+            expectError(error.Bad, func());
+        }
+        fn fail() anyerror!Foo {
+            return error.Wrong;
+        }
+        fn func() anyerror!Foo {
+            const x = fail() catch
+                fail() catch
+                return error.Bad;
+            unreachable;
+        }
+        const Foo = struct {
+            field: i32,
+        };
+    };
+    S.entry();
+    comptime S.entry();
+}
test/stage1/behavior/optional.zig
@@ -78,3 +78,25 @@ test "unwrap function call with optional pointer return value" {
     S.entry();
     comptime S.entry();
 }
+
+test "nested orelse" {
+    const S = struct {
+        fn entry() void {
+            expect(func() == null);
+        }
+        fn maybe() ?Foo {
+            return null;
+        }
+        fn func() ?Foo {
+            const x = maybe() orelse
+                maybe() orelse
+                return null;
+            unreachable;
+        }
+        const Foo = struct {
+            field: i32,
+        };
+    };
+    S.entry();
+    comptime S.entry();
+}