Commit 490cafe2c5
Changed files (3)
doc/langref.html.in
@@ -8675,7 +8675,7 @@ test "safety check" {
{#code_end#}
{#header_open|Reaching Unreachable Code#}
<p>At compile-time:</p>
- {#code_begin|test_err|unable to evaluate constant expression#}
+ {#code_begin|test_err|reached unreachable code#}
comptime {
assert(false);
}
src/stage1/ir.cpp
@@ -21592,6 +21592,11 @@ static IrInstGen *ir_analyze_instruction_cond_br(IrAnalyze *ira, IrInstSrcCondBr
static IrInstGen *ir_analyze_instruction_unreachable(IrAnalyze *ira,
IrInstSrcUnreachable *unreachable_instruction)
{
+ if (ir_should_inline(ira->old_irb.exec, unreachable_instruction->base.base.scope)) {
+ ir_add_error(ira, &unreachable_instruction->base.base, buf_sprintf("reached unreachable code"));
+ return ir_unreach_error(ira);
+ }
+
IrInstGen *result = ir_build_unreachable_gen(ira, &unreachable_instruction->base.base);
return ir_finish_anal(ira, result);
}
test/compile_errors.zig
@@ -2,6 +2,21 @@ const tests = @import("tests.zig");
const std = @import("std");
pub fn addCases(cases: *tests.CompileErrorContext) void {
+ cases.add("unreachable executed at comptime",
+ \\fn foo(comptime x: i32) i32 {
+ \\ comptime {
+ \\ if (x >= 0) return -x;
+ \\ unreachable;
+ \\ }
+ \\}
+ \\export fn entry() void {
+ \\ _ = foo(-42);
+ \\}
+ , &[_][]const u8{
+ "tmp.zig:4:9: error: reached unreachable code",
+ "tmp.zig:8:12: note: called from here",
+ });
+
cases.add("indexing a undefined slice at comptime",
\\comptime {
\\ var slice: []u8 = undefined;
@@ -6208,7 +6223,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void {
\\ if (!ok) unreachable;
\\}
, &[_][]const u8{
- "tmp.zig:10:14: error: unable to evaluate constant expression",
+ "tmp.zig:10:14: error: reached unreachable code",
"tmp.zig:6:20: note: referenced here",
});