fix nested orelse and nested catch
This commit is contained in:
parent
4299cd4446
commit
48ccf427af
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user