fix: resolve qualified-import-member const as a compile-time constant (issue 0192)
A namespaced import's const (`m :: #import "lib.sx"; … m.CAP`) only ever resolved as a runtime value — the const folders in program_index.zig had no namespace-member arm, so a qualified const was rejected as an array dimension / Vector lane / generic value-param and could not seed another const, while the flat-import form worked everywhere. Add a `lookupQualifiedConst` (+ float / float-typed twins) ctx hook: resolve the alias via `namespaceAliasVerdictFrom` to its target module, then fold the member from that module's per-source const cache (`foldQualifiedConstInt` in lower/comptime.zig), pinned to the target source so nested const RHSs fold there. Wire it into evalConstIntExpr / evalConstFloatExpr / isFloatValuedExpr — both the expression-position field_access arm (`[m.CAP]T`) and the type-argument dotted-name arm (`Vector(m.LANES, …)`, generic value-params). Implemented on the source-aware ctxs (Lowering / SourceConstCtx); the namespace-blind ModuleConstCtx / StatelessInner return null, so a qualified-const dim reached only via the stateless type-alias path stays a clean unresolved-dim diagnostic, never a fabricated length. Resolves correctly for array dims, arithmetic, integral-float dims, Vector lanes, generic value-params, inline-for bounds, and struct fields. Regression: examples/modules/0842-modules-qualified-import-const-comptime.sx.
This commit is contained in:
@@ -518,6 +518,32 @@ non-unification: virtual-time timers and real kqueue timeouts are NOT merged —
|
||||
timer before ever blocking on kqueue (a program uses `sleep` OR fds); a true "fd-or-real-timeout" wants
|
||||
a kqueue `EVFILT_TIMER`, future work.
|
||||
|
||||
> **✅ issue 0192 FIXED (2026-06-26) — epoll work UNBLOCKED.** A qualified-import-member const
|
||||
> (`m.EV_SIZE`) now folds as a compile-time constant in every position the bare/flat form does
|
||||
> (array dim, arithmetic, Vector lane, generic value-param, inline-for) — so the clean
|
||||
> `[MAXEV * ep.EV_SIZE]u8` event buffer the bindings want will work. Fix: a `lookupQualifiedConst`
|
||||
> ctx hook resolving the namespace alias → target module's per-source const, wired into the int/float
|
||||
> const folders (`src/ir/program_index.zig` + `src/ir/lower/comptime.zig`). Regression:
|
||||
> `examples/modules/0842-modules-qualified-import-const-comptime.sx`. The hint stands for the rebuild:
|
||||
> **a struct-per-arch `EpollEvent` (arch-branched u32 fields, 12 B x86_64 / 16 B aarch64) beat raw
|
||||
> byte access** — idiomatic field reads, no issue-0155 scalar-pointer indexing, no unaligned u64.
|
||||
> Resume: rebuild `std/net/epoll.sx`, branch `std.event.Loop` on `inline if OS`, lock with a darwin run
|
||||
> + ir-only linux example.
|
||||
|
||||
> **⛔ (HISTORICAL) BLOCKED on issue 0192 (filed 2026-06-26).** Started the epoll work: chose the `std.event.Loop`
|
||||
> backend (pure sx + libc externs, zero compiler change — per "do this in sx as much as possible") as
|
||||
> the first deliverable, since event.sx already names epoll as its linux backend and it's runnable
|
||||
> (darwin via kqueue) + ir-only-verifiable (linux). De-risked four landmines by probe — arch-dependent
|
||||
> layout const via module-scope `inline if ARCH` (folds + validates in linux IR), slice-based byte access
|
||||
> (sidesteps issue 0155), no unaligned u64 (store the 32-bit fd in epoll `data`), and comptime-dead linux
|
||||
> externs don't break the darwin corpus (just an unreferenced `declare`). Then hit a compiler bug while
|
||||
> sizing the event buffer: a **qualified-import-member const is not a compile-time constant** —
|
||||
> `[m.CAP]u8` / `A :: m.CAP` fail (a *flat*-imported const works). Root cause located:
|
||||
> `evalConstIntExpr` (`src/ir/program_index.zig:325`) has no namespace-member-const arm. Per the STOP
|
||||
> rule the half-built `std/net/epoll.sx` (which used a struct-based layout to route around the bug) was
|
||||
> **removed**, not landed — the unblock session rebuilds it cleanly with the fix in hand. Repro +
|
||||
> investigation prompt: `issues/0192-qualified-import-const-not-comptime.{md,sx}`.
|
||||
|
||||
Design note carried forward: an event-loop `Io` needs a current-`Scheduler` handle. `sched.*` methods
|
||||
thread it via `self`/the `Task`; if B1.4c wants the capability-threaded `context.io` form it'll need
|
||||
an ambient current-scheduler accessor in sched.sx (still deferred — the `sched.*`-method form
|
||||
|
||||
Reference in New Issue
Block a user