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.
26 lines
1.1 KiB
Plaintext
26 lines
1.1 KiB
Plaintext
// 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
|
|
}
|