feat(lang): reserved-name check covers :: const/fn/type decls + scope call rewrite to raw provenance [F0.6]
A bare reserved-type-name `::` declaration was silently accepted, and the
attempt-2 lowerCall rewrite then made a bare `s2 :: (…) {…}` function callable —
bypassing the backtick rule for handwritten sx. The reserved-name binding check
covered `:=` / typed-local / param / captures but NOT the `::` declaration form.
- ast: `ConstDecl`/`FnDecl` carry `is_raw` + `name_span` threaded from the parser
(parseConstBinding / parseFnDecl, all call sites incl. struct/impl methods).
- semantic_diagnostics: reject a bare reserved spelling at EVERY declaration-name
site — const, function (incl. struct/impl methods), struct/enum/union/error-set,
protocol, foreign-class, ufcs alias, namespaced/library/c-import name. Backtick
(`is_raw`) and the compiler's `#builtin` definition (`string :: []u8 #builtin`)
are the only exemptions; a value whose node is itself a named decl defers to
that node's own check.
- c_import: synthesized foreign fn_decls are `is_raw = true`, so a C function
whose own name collides with a reserved spelling (`int s2(int);`) imports and
bare-calls unedited.
- lower: scope the `.type_expr`→`.identifier` call rewrite to a callee FnDecl of
RAW provenance (`is_raw`) — only a backtick / `#import c` foreign fn can carry a
reserved-name spelling, so a non-raw match never gets rewritten.
- examples: 0153 (positive — backtick `::` const + fn, bare + tick call), 1140
(negative — bare `::` const + fn rejected).
- docs: specs.md + readme.md state the backtick is required at every binding site
including `::` const / function / type declarations; issue 0089 banner updated.
This commit is contained in:
23
examples/0153-types-backtick-const-fn-decl.sx
Normal file
23
examples/0153-types-backtick-const-fn-decl.sx
Normal file
@@ -0,0 +1,23 @@
|
||||
// Backtick raw-identifier escape at the `::` declaration sites: a leading
|
||||
// backtick makes a CONSTANT name and a FUNCTION name raw, so a reserved type
|
||||
// spelling (`s2`, `u8`) can be declared and used. Complements examples/0151
|
||||
// (var / param / field / global). The backtick fn is callable both via the
|
||||
// backtick (`` `u8(5) ``) and bare (`u8(5)`) — the bare reserved-name callee
|
||||
// resolves to the raw fn because its declaration is raw (issue 0089). A *bare*
|
||||
// `s2 :: …` / `u8 :: …` declaration is still the reserved-name error (see
|
||||
// examples/1140).
|
||||
// Regression (issue 0089).
|
||||
#import "modules/std.sx";
|
||||
|
||||
// Constant whose name is a reserved type spelling.
|
||||
`s2 :: 2.5;
|
||||
|
||||
// Function whose name is a reserved type spelling.
|
||||
`u8 :: (n: s64) -> s64 { return n + 7; }
|
||||
|
||||
main :: () -> s32 {
|
||||
print("const = {}\n", `s2);
|
||||
print("fn tick = {}\n", `u8(5));
|
||||
print("fn bare = {}\n", u8(5));
|
||||
return 0;
|
||||
}
|
||||
19
examples/1140-diagnostics-reserved-name-const-fn-decl.sx
Normal file
19
examples/1140-diagnostics-reserved-name-const-fn-decl.sx
Normal file
@@ -0,0 +1,19 @@
|
||||
// A reserved/builtin type-name spelling is rejected as the NAME of a `::`
|
||||
// declaration too — both a constant (`s2 :: 5`) and a function
|
||||
// (`u8 :: (…) {…}`). A function name and a const name are binding sites just
|
||||
// like `s2 := …`; previously the `::` decl forms slipped past the
|
||||
// reserved-name check, so a bare reserved-name function compiled silently and
|
||||
// became callable — bypassing the backtick rule that handwritten sx must use.
|
||||
// The backtick escape (`` `s2 :: … ``, examples/0153) is the only way to spell
|
||||
// these names; `#import c` foreign decls remain exempt (examples/1220).
|
||||
//
|
||||
// Regression (issue 0089). Expected: one error per declaration, each caret on
|
||||
// the declared name; exit 1.
|
||||
#import "modules/std.sx";
|
||||
|
||||
s2 :: 5;
|
||||
u8 :: (n: s64) -> s64 { return n + 7; }
|
||||
|
||||
main :: () -> s32 {
|
||||
return 0;
|
||||
}
|
||||
1
examples/expected/0153-types-backtick-const-fn-decl.exit
Normal file
1
examples/expected/0153-types-backtick-const-fn-decl.exit
Normal file
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
const = 2.500000
|
||||
fn tick = 12
|
||||
fn bare = 12
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,11 @@
|
||||
error: 's2' is a reserved type name and cannot be used as an identifier
|
||||
--> examples/1140-diagnostics-reserved-name-const-fn-decl.sx:14:1
|
||||
|
|
||||
14 | s2 :: 5;
|
||||
| ^^
|
||||
|
||||
error: 'u8' is a reserved type name and cannot be used as an identifier
|
||||
--> examples/1140-diagnostics-reserved-name-const-fn-decl.sx:15:1
|
||||
|
|
||||
15 | u8 :: (n: s64) -> s64 { return n + 7; }
|
||||
| ^^
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
Reference in New Issue
Block a user