fix: diagnose unknown generic #builtin instead of silently returning 0 (issue 0144)

A bodiless #builtin with a $T: Type param routes through monomorphization.
When resolveBuiltin returned null for an unrecognized name, the builtin-body
branch fell through to ensureTerminator's constInt(0) -- a silent-fallback
default the CLAUDE.md REJECTED PATTERNS forbid. Emit a loud
'error: unknown #builtin <name>' diagnostic instead.

Regression: examples/1189-diagnostics-unknown-builtin.sx
This commit is contained in:
agra
2026-06-21 09:10:38 +03:00
parent 6ed29621ad
commit ad45ae07ef
6 changed files with 41 additions and 0 deletions

View File

@@ -0,0 +1,16 @@
// A bodiless `#builtin` carrying a `$T: Type` parameter, whose name the
// compiler does not recognize, must fail LOUDLY with an "unknown #builtin"
// diagnostic — not silently evaluate to 0 (the CLAUDE.md silent-fallback
// pattern). The generic monomorphization path (monomorphizeFunction's
// builtin-body branch) now diagnoses an unresolved builtin name instead of
// falling through to `ensureTerminator`'s `constInt(0)`.
//
// Regression (issue 0144).
#import "modules/std.sx";
// `mystery` is not a recognized builtin.
mystery :: ($T: Type, x: T) -> T #builtin;
main :: () {
print("mystery(42) = {}\n", mystery(i64, 42));
}

View File

@@ -0,0 +1 @@
1

View File

@@ -0,0 +1,5 @@
error: unknown #builtin 'mystery'
--> examples/1189-diagnostics-unknown-builtin.sx:12:1
|
12 | mystery :: ($T: Type, x: T) -> T #builtin;
| ^^^^^^^

View File

@@ -0,0 +1 @@