stage1: Error out when trying to execute unreachable

Closes #6802
This commit is contained in:
LemonBoy 2020-10-25 23:17:32 +01:00 committed by Andrew Kelley
parent f4bb8be9fc
commit 490cafe2c5
3 changed files with 22 additions and 2 deletions

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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",
});