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".
This commit is contained in:
@@ -1,15 +1,16 @@
|
||||
// #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-less
|
||||
// `run` mangles to a DISTINCT bare `run` (#84) — no duplicate. Both
|
||||
// "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 run` (user, bare) + 1 `TEXT test.run` (lib
|
||||
// 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 run / 2x test.run). General callability of
|
||||
// the bare run is gated separately by 989_barefn_collide.
|
||||
// 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 = {
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
// 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 = {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// #23 — two top-level defs of the same name in one (flat) module.
|
||||
// cstage's install pass rejects "duplicate def D"; wwstage now mirrors.
|
||||
package main;
|
||||
def D: i32 = 1;
|
||||
def D: i32 = 2;
|
||||
export fn main() i32 = { return 0; };
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// #23 — two top-level fns of the same name in the same (flat) module.
|
||||
// cstage's install pass rejects "duplicate fn foo"; wwstage now mirrors.
|
||||
package main;
|
||||
fn foo() i32 = { return 1; };
|
||||
fn foo() i32 = { return 2; };
|
||||
export fn main() i32 = { return foo(); };
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// #23 — two top-level lets of the same name in one (flat) module.
|
||||
// cstage's install pass rejects "duplicate let g"; wwstage now mirrors.
|
||||
package main;
|
||||
let g: i32 = 1;
|
||||
let g: i32 = 2;
|
||||
export fn main() i32 = { return 0; };
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// #23 — two top-level types of the same name in one (flat) module.
|
||||
// cstage's install pass rejects "duplicate type t"; wwstage now mirrors.
|
||||
package main;
|
||||
type t = i32;
|
||||
type t = u32;
|
||||
export fn main() i32 = { return 0; };
|
||||
|
||||
Reference in New Issue
Block a user