Files
ww/test/wcc/data/attest_userrun.ww
Hojun-Cho 7b9488706b parse: enforce strict-package — reject package-less files (#24a)
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".
2026-06-29 03:55:26 +09:00

19 lines
961 B
Plaintext

// #80/#84 -T coexist — a user `fn run` COEXISTS with lib/test's bound
// runner `run` (the synth main's callee). Once `ww test -c` bundles
// lib/test, the synth `use test;` keys lib/test's `run` under module
// "test" (#80: prepended before binding) and the user's `package main;`
// `run` mangles to a DISTINCT `main.run` (#84/#24a) — no duplicate. Both
// stages accept under -T and the synth runner runs the @test to exit 0;
// the user `run` must NOT hijack the entry. Pre-#80 this loud-rejected
// "duplicate fn run". The gate (910/997 coexist_run) static-label-counts
// the -T asm — exactly 1 `TEXT main.run` (user) + 1 `TEXT test.run` (lib
// runner) — pinning #84 distinctness here in the REAL @test/-T path (a
// dead-dup regression yields 0x main.run / 2x test.run). General
// callability of the user run is gated separately by 989_barefn_collide.
package main;
fn run() i32 = { return 9; };
@test fn t_one() void = {
assert(1 == 1);
};