fix(lower): pin nested-leaf source to the SELECTED const's author — close F1 R1 [stdlib E2 attempt-5]
A same-name expression const read from another module folded its nested
leaves (`M` inside `K :: M + 1`) from the CALLER's source, not the source
that authored the selected const. A unique imported `K` became ambiguous
when the reading module also flat-imported a different same-name `M`.
`selectModuleConst` now returns the author SOURCE alongside the const info
(`SelectedConst`), and the fold/lower of a selected const's RHS pins
`current_source_file` to that author for the duration (`pinConstAuthorSource`)
— so `K :: M + 1` defined in `a.sx` always folds `M` against `a.sx`,
coherently whether `K` is read as a runtime value or used as an array
dimension. Each recursion level pins to its own selected author's source.
Single-author programs pin to the source they were already in → byte-
identical (499 prior examples unchanged). Genuine ambiguity at the read
site (0760) is still caught before any pin.
Regression: examples/0762-modules-same-name-const-leaf-author-pin
(`a.sx M::1; K::M+1`, `b.sx M::10`, main flat-imports both, reads K as
value AND `[K]u8` dimension → val=2 len=2). Fail-before on 8518b66
(`'M' is ambiguous` / "array dimension must be a compile-time integer
constant"), pass-after.
This commit is contained in:
25
examples/0762-modules-same-name-const-leaf-author-pin.sx
Normal file
25
examples/0762-modules-same-name-const-leaf-author-pin.sx
Normal file
@@ -0,0 +1,25 @@
|
||||
// issue 0105 / F1 — a UNIQUE expression const's nested leaf folds against the
|
||||
// const's AUTHOR source, not the reading module's. `a.sx` declares `M :: 1` and
|
||||
// `K :: M + 1` (= 2); `b.sx` declares a DIFFERENT same-name `M :: 10` (no `K`).
|
||||
// `main` flat-imports both, so the reader sees two `M`s — but it reads only `K`,
|
||||
// which is unique to `a.sx`. Folding `K`'s RHS must pin `M` to A's source (→ 1),
|
||||
// giving `K = 2`, coherently whether `K` is read as a runtime VALUE (`print K`)
|
||||
// or used as an array DIMENSION (`[K]u8`).
|
||||
//
|
||||
// Pre-fix (8518b66) the nested leaf re-selected `M` from the CALLER's source:
|
||||
// `main` flat-imports two `M`s → `'M' is ambiguous` (value read) / "array
|
||||
// dimension must be a compile-time integer constant" (dimension). Now the fold
|
||||
// pins each level to its selected author's source → val=2 len=2.
|
||||
#import "modules/std.sx";
|
||||
#import "0762-modules-same-name-const-leaf-author-pin/a.sx";
|
||||
#import "0762-modules-same-name-const-leaf-author-pin/b.sx";
|
||||
|
||||
read_dim :: () -> s64 {
|
||||
arr : [K]u8 = ---;
|
||||
return arr.len;
|
||||
}
|
||||
|
||||
main :: () -> s32 {
|
||||
print("val={} len={}\n", K, read_dim());
|
||||
0
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
// Module A authors `M :: 1` and the EXPRESSION const `K :: M + 1` (= 2). `K` is
|
||||
// unique across the program; only A defines it. Its RHS leaf `M` must always
|
||||
// fold against A's `M` (= 1), no matter which module reads `K`.
|
||||
M :: 1;
|
||||
K :: M + 1;
|
||||
@@ -0,0 +1,5 @@
|
||||
// Module B authors only a DIFFERENT same-name `M :: 10` — a shadow of A's `M`,
|
||||
// with NO `K`. When `main` flat-imports both A and B, the reading module sees
|
||||
// two `M`s; folding A's `K :: M + 1` must NOT use this `M` (which would make `M`
|
||||
// ambiguous from the reader's view) — it must pin to A's `M`.
|
||||
M :: 10;
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
val=2 len=2
|
||||
Reference in New Issue
Block a user