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