Flip the soft-default to a hard "missing package clause" error symmetrically in both stages (cmd/wcc/parse.c + lib/ww/syntax/parse.ww): the first real decl of a primary section with empty pathmod/resetmod and no seen clause is now rejected. Closes the documented soft-default divergence (the 63-wrapper carve-out). The gate flip can't be split from the migration it breaks, so this is one atomic commit: ~80 test/wcc wrappers gain `package main;` via a shared wwtestpkg.h helper, 6 data fixtures plus 17 asm-grep assertions update for the bare->main.<leaf> root-helper mangle shift, and rt/ declares `package rt;` with @symbol pinning the bare rt_ensure/rt_malloc linker names. Root mangling narrows: the executable entry `main` stays bare (existing carve-out), but root helper symbols become main.X. The #84 cluster is rewritten to assert main.run distinct from aa.run/test.run; its cgen fix and bare machinery are retained — still load-bearing for package-less module-reset deps. New table-driven test 782_strict_package.c (6 rows, both stages). Retiring //ww:module-reset is deferred to #24b: it is load-bearing (clears the .wwi pathmod so the body's package clause asserts), not a vestige; fusing its removal here would be a silent mismatch. All byte-id gates green; full make test reports "all 335 tests passed".
16 lines
599 B
Plaintext
16 lines
599 B
Plaintext
// #23 builtin carve-out — a user redecl of a pre-seeded builtin name is
|
|
// NOT a duplicate (cstage keeps no builtins in scope: lookup_builtin wins
|
|
// first at check.c:69, so the user version installs dead). wwstage seeds
|
|
// builtins into c.top, so installtop must DROP this redecl rather than
|
|
// erroring. Both stages accept; the builtin `nomem` (= !void) wins, so
|
|
// g()'s i32 arm returns 7. Pins the 771/774/926 shape.
|
|
package main;
|
|
type nomem = !void;
|
|
fn g() (i32 | nomem) = { return 7; };
|
|
export fn main() i32 = {
|
|
match (g()) {
|
|
case let v: i32 => return v;
|
|
case nomem => return 99;
|
|
};
|
|
};
|