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:
19
examples/1179-diagnostics-comptime-type-construction-bail.sx
Normal file
19
examples/1179-diagnostics-comptime-type-construction-bail.sx
Normal 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;
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
1
|
||||||
@@ -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 = .[] }));
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user