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:
@@ -222,6 +222,12 @@ pub const Lowering = struct {
|
||||
suppress_int_fit_check: bool = false, // inside an explicit `xx` cast operand: truncation is requested, skip the literal fits-check
|
||||
block_counter: u32 = 0,
|
||||
comptime_counter: u32 = 0,
|
||||
/// Transient: the user-facing const name of the body-local `#run` currently
|
||||
/// being lowered (`L :: #run f()`), so `lowerInlineComptime` can stamp the
|
||||
/// `__ct` wrapper's `comptime_display_name` for a friendly comptime-init
|
||||
/// failure diagnostic (issue 0182). Set/cleared around the const's value
|
||||
/// lowering; null for a bare inline `#run`.
|
||||
comptime_const_name: ?[]const u8 = null,
|
||||
main_file: ?[]const u8 = null, // path of the main file; imported functions are declared extern
|
||||
resolved_root: ?*const Node = null, // full AST root (for building comptime modules)
|
||||
comptime_param_nodes: ?std.StringHashMap(*const Node) = null, // active comptime substitutions
|
||||
|
||||
Reference in New Issue
Block a user