fix(lower): #insert-expansion visibility exemption + close 0106 [stdlib B attempt-2]

Folds the coupled 0106 fix into Phase B. attempt-1 tightened the bare-name
visibility adapters (isNameVisible/isCImportVisible) to the flat_import_graph
edge set via the unified isVisible(.user_bare_flat/.c_import_bare) predicate;
that surfaced issue 0106 — std.print / log.* expand `#insert build_format(fmt)`
(comptime call) and `#insert "out(result);"` (inserted stmt) in the CONSUMER's
current_source_file, so their library-internal bare names were policed against
the consumer's imports and errored (run_examples 471 -> 467).

Fix: a precise, named exemption. Lowering.in_insert_expansion is set across
lowerInsertExprValue (the comptime eval + the parsed-back statements); the two
visibility adapters fall open while it is set — mirroring the existing
UFCS-alias / mangled-local "compiler indirection" exemptions. NOT a blanket
skip: scoped to #insert-expanded code, ordinary bare references stay policed.
Library-internal call bodies (build_format's concat/substr) already resolve in
the defining module — lowerFunctionBodyInto pins their current_source_file.

The flat tightening stays: a bare reference to a namespaced-only import's
internal name now correctly errors ('<name>' is not visible). This is the
Agra-ratified user-visible semantics change.

- face #1 pinned: examples/0736-modules-namespaced-only-bare-not-visible.sx
  (+ a.sx) — exit 1 + stderr; fail-before (import_graph compiled it, exit 0) /
  pass-after (flat set errors, exit 1).
- face #2 restored: examples 0015 / 0700 / 0718 / 1030 pass again.
- run_examples 471 -> 472 (the new regression).
- issues/0106 marked RESOLVED; readme.md documents namespaced-only visibility.

Collectors + unified predicate from attempt-1 (resolver.zig) unchanged; nothing
routes resolution AUTHOR-SELECTION through them yet (that is Phase C).
This commit is contained in:
agra
2026-06-07 05:17:23 +03:00
parent 7158337c73
commit 6f2bf84293
8 changed files with 83 additions and 3 deletions

View File

@@ -0,0 +1,12 @@
// Bare-name visibility under a NAMESPACED-only import (regression, issue 0106).
// `a.sx` is imported only as `m :: #import` — its top-level `secret` is reachable
// ONLY as `m.secret`. A BARE `secret()` must error: bare-name visibility joins
// over the FLAT import edges (`flat_import_graph`), and a namespaced alias is not
// a flat edge. (Before the fix, `isNameVisible` walked `import_graph`, which also
// records namespaced edges, so the bare call silently resolved.)
m :: #import "0736-modules-namespaced-only-bare-not-visible/a.sx";
main :: () -> s32 {
x := secret();
0
}

View File

@@ -0,0 +1 @@
secret :: () -> s64 { 7 }

View File

@@ -0,0 +1,5 @@
error: 'secret' is not visible; #import the module that declares it
--> examples/0736-modules-namespaced-only-bare-not-visible.sx:10:10
|
10 | x := secret();
| ^^^^^^