Commit 7b8fc18c66

gabeuehlein <gabeuehlein@gmail.com>
2024-10-14 14:02:14
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
1 parent 9fd61f7
Changed files (2)
src
test
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);
test/cases/compile_errors/return_undefined_from_noreturn.zig
@@ -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