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:
agra
2026-06-08 07:02:59 +03:00
parent 8518b66cec
commit 4666fb1941
7 changed files with 111 additions and 22 deletions

View 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
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -0,0 +1 @@
val=2 len=2