fix: body-local #run of an unbridged shape fails loudly instead of silent garbage (issue 0182)
The body-local #run fold in emitCall was effectively dead (gated on args.len==0, but the __ct comptime wrapper always carries the implicit *Context arg), so every body-local #run fell through to a RUNTIME call: bridgeable shapes lucked into the right value; an unbridgeable shape (e.g. [2][]i64) ran over --- storage -> garbage, exit 0, no diagnostic. Fold any is_comptime callee (gated !enclosing.is_comptime so nested metatype calls in a comptime wrapper's dead body aren't folded). On a tryEval bail, distinguish a BRIDGE bail (result can't regToValue- materialize -> error: comptime init of 'X' failed: <reason> + comptime_failed, build fails, symmetric with the global #run path) from an EXECUTION bail (VM can't run the body, e.g. NaN/extern -> runtime fallthrough, preserving types/0150), via comptime_vm.last_bail_was_bridge (reset at tryEval entry, set only at regToValue). The const name is threaded onto the wrapper (comptime_display_name) so the diagnostic reads the source name, not __ct_N. Regressions: diagnostics/1204 (negative), comptime/0645 (positive). Verified by 3 adversarial reviews, suite 801/0.
This commit is contained in:
@@ -478,6 +478,13 @@ pub fn lowerConstDecl(self: *Lowering, cd: *const ast.ConstDecl) void {
|
||||
return;
|
||||
}
|
||||
|
||||
// For a body-local `#run` const (`L :: #run f()`), record the const NAME so
|
||||
// the `__ct` wrapper carries it as a display name — a comptime-init failure
|
||||
// then reports `comptime init of 'L' failed` instead of `__ct_N` (issue 0182).
|
||||
const saved_ct_name = self.comptime_const_name;
|
||||
if (cd.value.data == .comptime_expr) self.comptime_const_name = cd.name;
|
||||
defer self.comptime_const_name = saved_ct_name;
|
||||
|
||||
const ref = self.lowerExpr(cd.value);
|
||||
// If there's an explicit type annotation, use it. Otherwise, infer from the expression.
|
||||
const ty = if (cd.type_annotation) |ta|
|
||||
|
||||
Reference in New Issue
Block a user