mirror of
https://github.com/ziglang/zig.git
synced 2024-11-14 16:13:24 +00:00
Sema: fail if analyzing return in noreturn
-declared function before coercing undefined
Just switches logic around in coerceExtra to check for returning in a noreturn function before coercing undefined to anything
This commit is contained in:
parent
9fd61f7460
commit
7b8fc18c66
10
src/Sema.zig
10
src/Sema.zig
@ -30346,11 +30346,6 @@ fn coerceExtra(
|
||||
else => {},
|
||||
}
|
||||
|
||||
// undefined to anything. We do this after the big switch above so that
|
||||
// special logic has a chance to run first, such as `*[N]T` to `[]T` which
|
||||
// should initialize the length field of the slice.
|
||||
if (maybe_inst_val) |val| if (val.toIntern() == .undef) return pt.undefRef(dest_ty);
|
||||
|
||||
if (!opts.report_err) return error.NotCoercible;
|
||||
|
||||
if (opts.is_ret and dest_ty.zigTypeTag(zcu) == .noreturn) {
|
||||
@ -30368,6 +30363,11 @@ fn coerceExtra(
|
||||
return sema.failWithOwnedErrorMsg(block, msg);
|
||||
}
|
||||
|
||||
// undefined to anything. We do this after the big switch above so that
|
||||
// special logic has a chance to run first, such as `*[N]T` to `[]T` which
|
||||
// should initialize the length field of the slice.
|
||||
if (maybe_inst_val) |val| if (val.toIntern() == .undef) return pt.undefRef(dest_ty);
|
||||
|
||||
const msg = msg: {
|
||||
const msg = try sema.errMsg(inst_src, "expected type '{}', found '{}'", .{ dest_ty.fmt(pt), inst_ty.fmt(pt) });
|
||||
errdefer msg.destroy(sema.gpa);
|
||||
|
10
test/cases/compile_errors/return_undefined_from_noreturn.zig
Normal file
10
test/cases/compile_errors/return_undefined_from_noreturn.zig
Normal file
@ -0,0 +1,10 @@
|
||||
export fn entry() noreturn {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
// error
|
||||
// backend=stage2
|
||||
// target=native
|
||||
//
|
||||
// :2:12: error: function declared 'noreturn' returns
|
||||
// :1:19: note: 'noreturn' declared here
|
Loading…
Reference in New Issue
Block a user