test(0140): pin comptime type-construction bail diagnostic (examples/1179)

Move the issue 0140 repro into the feature suite as a regression test.
Asserts the build-gating diagnostic 'comptime type construction failed:
comptime define(): enum has no variants' at the construction site, exit
1 — locking out the prior 'unresolved type reached LLVM emission' panic.
This commit is contained in:
agra
2026-06-17 04:36:09 +03:00
parent 37ec3da8cb
commit 4da6add334
5 changed files with 26 additions and 20 deletions

View File

@@ -0,0 +1,19 @@
// A comptime type construction (declare/define, reflection) that bails in the
// interpreter must surface a build-gating DIAGNOSTIC naming the reason — not
// poison the decl to `.unresolved` silently and let that crash at LLVM emission
// or hide behind a downstream cascade. Here `define` is handed an empty variant
// list; the interp bails "enum has no variants", and `evalComptimeType` renders
// that at the construction site (exit 1, no panic).
//
// Regression (issue 0140): before the fix this panicked with "unresolved type
// reached LLVM emission" (exit 134), because the interp's bail detail was
// dropped (`catch return null`) and `.unresolved` reached codegen unannounced.
#import "modules/std.sx";
#import "modules/std/meta.sx";
Empty :: define(declare("Empty"), .enum(.{ variants = .[] }));
main :: () -> i32 {
e : Empty = ---;
return 0;
}

View File

@@ -0,0 +1,5 @@
error: comptime type construction failed: comptime define(): enum has no variants
--> examples/1179-diagnostics-comptime-type-construction-bail.sx:14:10
|
14 | Empty :: define(declare("Empty"), .enum(.{ variants = .[] }));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@@ -1,20 +0,0 @@
// Repro for issue 0140 — a FAILING comptime type construction
// (`define` with an empty variant list) bails correctly in the interp
// ("comptime define(): enum has no variants"), but that bail is swallowed:
// `evalComptimeType` returns null, the decl is poisoned to `.unresolved`
// with NO diagnostic, and the `.unresolved` type reaches LLVM emission and
// PANICS ("unresolved type reached LLVM emission") instead of surfacing a
// clean error with the bail reason.
//
// Expected: a build-time diagnostic at the construction site naming the
// bail reason (e.g. "comptime type construction failed: enum has no
// variants"), exit 1, no panic.
#import "modules/std.sx";
#import "modules/std/meta.sx";
Empty :: define(declare("Empty"), .enum(.{ variants = .[] }));
main :: () -> i32 {
e : Empty = ---;
return 0;
}