From 48ccf427afa59fbcae969f3edd224b44eef153c9 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 21 Jun 2019 14:06:01 -0400 Subject: [PATCH] fix nested orelse and nested catch --- src/ir.cpp | 4 ++-- test/stage1/behavior/error.zig | 22 ++++++++++++++++++++++ test/stage1/behavior/optional.zig | 22 ++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/ir.cpp b/src/ir.cpp index 664d23040..7b6f2dffe 100644 --- a/src/ir.cpp +++ b/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; diff --git a/test/stage1/behavior/error.zig b/test/stage1/behavior/error.zig index babefba6f..82ddc72b7 100644 --- a/test/stage1/behavior/error.zig +++ b/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(); +} diff --git a/test/stage1/behavior/optional.zig b/test/stage1/behavior/optional.zig index b33e25038..ee3cb4aef 100644 --- a/test/stage1/behavior/optional.zig +++ b/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(); +}