Re-land the value-const analog of the E1-E4 type work, reconciled onto the
current source-keyed resolver and hardened. A same-name VALUE const declared in
multiple flat-imported modules is now resolved per declaring source, not the
global last-wins `module_const_map`.
- imports.zig: `isPerSourceDecl` retains every non-function `const_decl`
per-source (value consts + type aliases), so each same-name author reaches
registration as a distinct author of its own module. Functions and var_decls
keep first-wins.
- lower.zig:
* `selectModuleConst` over `module_consts_by_source` — own-wins; exactly one
flat-visible resolves; >=2 flat-visible bare -> loud ambiguous (consistent
with the 0755 type / 0724 fn / 0782 generic ambiguities). Rewires every
consumer: `comptimeIntNamed`, the runtime-id read, the global-init read,
and the float-name path (`lookupFloatName` / `nameIsFloatTyped`).
* `SourceConstCtx` + `foldSourceConstInt`/`Float` + `sourceConstIsFloatTyped`
fold a selected const's RHS with nested same-name leaves re-selected in
their own author source, so VALUE and array-DIMENSION results are coherent.
* `pinConstAuthorSource` pins each fold level to the SELECTED const's author
(F1), including multi-level cross-module chains.
* cycle guard keyed on (name, author-source), not name alone (F3), so
same-name nested consts across modules do not trip a false cycle.
* `emitModuleConst` takes the author source and pins while folding/lowering.
Registration-time struct/inline-type field dimensions route through the now
source-aware stateful reader; the type-alias dimension path resolves each
alias against its own author's consts.
- program_index.zig: expose `isFloatConstType` / `isCountableConstType` for the
source-aware folds.
examples: 0786 own-wins, 0787 ambiguous (exit 1), 0788 expr-chain value+dim
coherent, 0789 leaf-author-pin, 0790 cross-module cycle-guard (F3), 0791
multi-level cross-module chain, 0792 struct-field registration-time dim.
Single-author corpus byte-identical (524 prior markers green); 531 total.
15 lines
659 B
Plaintext
15 lines
659 B
Plaintext
// issue 0105 / F2 — same-name VALUE const, own-wins. Two flat-imported modules
|
|
// each declare a top-level `K` with a different value and a function that reads
|
|
// `K` bare. Each function's OWN reference must bind ITS OWN module's `K`
|
|
// (own-wins), exactly as same-name structs (0754) and functions (0722) do —
|
|
// NOT the global last-wins author: `a_k` returns 1 and `b_k` returns 2,
|
|
// resolved by the source-aware const author selector (`selectModuleConst`).
|
|
#import "modules/std.sx";
|
|
#import "0786-modules-same-name-const-own/a.sx";
|
|
#import "0786-modules-same-name-const-own/b.sx";
|
|
|
|
main :: () -> s32 {
|
|
print("a={} b={}\n", a_k(), b_k());
|
|
0
|
|
}
|