Files
ww/test/wcc/data/paramshadowmod/neg_forrange_tuple.ww
Hojun-Cho ed94467a0c test: extend 708 with mlet/forrange/mcase shadow rows (#28)
708 pinned param + clet + self-import-skip after #19 landed; the
other 4 sites where check_module_shadow is wired (N_MLET, N_FORRANGE
single, N_FORRANGE tuple, N_MCASE) had no dedicated negative-compile
row. Worker-19's note that all 6 sites use identical call shape is
true today but unpinned by tests; a future asymmetric edit could
silently disable enforcement on one site.

Adds neg_mlet (let-tuple binder shadows), neg_forrange_single
(`for shadowmod of ...`), neg_forrange_tuple (`for (shadowmod, x)
of pairs`), neg_mcase (`case let shadowmod:`). Each errors at the
binder decl line with the canonical
"<kind> '<name>' shadows imported module '<name>'" message.

708's main now runs 8/8 (param, let, mlet, forrange_single,
forrange_tuple, mcase, pos_rename, pos_selfimp).
2026-05-16 10:47:50 +09:00

23 lines
574 B
Plaintext

// neg_forrange_tuple — `for (let (shadowmod, x) .. s)` tuple-
// destructure range loop where the first binder shadows the
// imported module. N_FORRANGE wires check_module_shadow per-name
// on the tuple branch (n->list), so the rule fires at the for
// header even though `x` is innocuous.
use shadowmod;
export fn main() i32 = {
let buf: [2]i64;
buf[0] = 1i64;
buf[1] = 2i64;
let s: [](i64, i64);
s.ptr = buf.ptr: *(i64, i64);
s.len = 1;
s.cap = 1;
let total: i64 = 0i64;
for (let (shadowmod, x) .. s) {
total += shadowmod + x;
};
return total: i32;
};