diff --git a/src/ir.cpp b/src/ir.cpp index 99af2e7861..d50229925c 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -17695,6 +17695,8 @@ static IrInstruction *ir_analyze_instruction_phi(IrAnalyze *ira, IrInstructionPh peer_parent->resolved_type = ir_resolve_peer_types(ira, peer_parent->base.source_instruction->source_node, expected_type, instructions, peer_parent->peers.length); + if (type_is_invalid(peer_parent->resolved_type)) + return ira->codegen->invalid_instruction; // the logic below assumes there are no instructions in the new current basic block yet ir_assert(ira->new_irb.current_basic_block->instruction_list.length == 0, &phi_instruction->base); diff --git a/test/compile_errors.zig b/test/compile_errors.zig index d4c16a7d5f..2e344318f7 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -2,6 +2,18 @@ const tests = @import("tests.zig"); const builtin = @import("builtin"); pub fn addCases(cases: *tests.CompileErrorContext) void { + cases.add( + "missing result type for phi node", + \\fn foo() !void { + \\ return anyerror.Foo; + \\} + \\export fn entry() void { + \\ foo() catch 0; + \\} + , + "tmp.zig:5:17: error: integer value 0 cannot be coerced to type 'void'", + ); + cases.add( "atomicrmw with enum op not .Xchg", \\export fn entry() void {