The 13 active rows keep compile + cs==ws byte-id and the hidden-RDI
"(BP), DI" presence/absence polarity (present iff sret-class; the two
exactly-32B boundary rows must stay register). The per-row driver
build+run legs move to the r926 run fixture corpus per the residual
audit port split; the seven buildfail rows were already dead here,
owned by the r926_sret_reject_* fixtures.
The five symmetric rows compile their r764_amp_fn_ident_* fixture
sources in place (runtime owned by those fixtures; pre-fix junk-store
still exits 0, so the LEAQ window is the discriminator) and keep the
cs==ws byte-id leg. The cross-module row stays cstage-only pending
#184; its wwstage/byte-id legs graduate with that task.
asmgate_test.ww absorbs 530_w6a_parsenum and 989_datargate_run: the
strtoll-semantics identity rows plus the bare-minus reject against
both assemblers with cross-stage .o byte-identity, and the undefined
DATAR-slot loud reject (no .o written) with the defined-slot
byte-identical ok path. The w6a_ww skip gates drop: the Make target
declares both assemblers.
archive_test.ww absorbs 610_arch and 632_w6l_manyflags: archive
member selectivity through a load-bearing undefined @symbol extern
(link exit 0, run exit 7), and the -L capacity table {1,64,65,100,
128} against both w6l and w6l_ww with an ET_EXEC check per leg. ar is
/usr/bin/ar via runcommand; the junk -L flags are real argv entries
instead of a 16KB shell string.
link_test.ww absorbs 600_w6l and 620_data_link: ET_EXEC on the
trivial pipeline, writable-global read/write runs, the exact
two-PT_LOAD R+X/R+W split, the single-PT_LOAD no-DATAW invariant 992
depends on, and the BSS filesz trim (filesz 1 < memsz 32, loader
zero-fill). Strengthened: the ldd staticness proxy is replaced by a
direct no-PT_INTERP phdr scan.
elfobj_test.ww (test/object, on testenv) absorbs 500_w6a, 510_dataw,
and 520_datar: ELF64 header magic/class over the 4 inline programs,
DATAW section/symbol layout plus the 6-section no-DATAW legacy
invariant 991 depends on, and the DATAR .rela.data reloc through
link and run. Strengthened: the reloc symbol is resolved to
'greeting' (declared but never implemented in the C carrier).
The test/object observers parse assembler/linker artifacts; the
readers reinterpret readfile's byte str and route through endian's
canonical legetu* instead of re-deriving the bit math.
728 -> test/asm/matchdispatch_test.ww. The distinct-CMPQ-tag
collection window over TEXT b.next preserved on both stages.
Strengthened: per-row byte-id legs added -- the C header claimed a
cmp -s its code never ran; all three rows verify green.
719/724/744/746 -> test/asm/dataemit_test.ww. Exact DATAW payload
needles, the produce-window zero-init and MOVQ-load count floors,
and the strdef inline-pair want/anti windows preserved with their
per-row byte-id legs.
720/723/727/743 -> test/asm/callarg_test.ww. Ordered PUSHQ windows,
tag-synth + stack-overflow-cleanup needles and the variadic
eightbyte store-count floors preserved. Strengthened: 720's
4-variant row gains the byte-id leg the C skipped behind the
then-open #22 zero-init gate — #22 landed (724 pins the fix), and
the leg verifies green on both stages.
718/721/730 -> test/asm/sret_test.ww. Frame-size and max--K(BP)
stomp sentinels, line-adjacency sret triangle (hidden-RDI, return-
the-pointer, no-AX-capture, forwarding reload) and narrow-trailing-
field windows preserved, including 718's #15 byte-id gate on the
three-return row. 718's whole-suite ww_ww-executable gate dropped
with the other skip gates (the Make target declares the tools).
726/731/732/733/734/735/745/747 -> test/asm/modshadow_test.ww, one
@test per carrier, every want/anti window, occurrence floor and
byte-id leg preserved. New ASM_WW_TESTS block runs the test/asm
observers under test-compiler beside the residual carriers.
test/xmod/typecheck_test.ww replaces 989_callarg_typecheck.c and
989_tagged_subset_reject.c. Preserved: both -T __wwtests reservation
faces (both stages, diagnostic required), the shape-mismatch collision
(both stages), the cstage-only same-shape #37 pin, and both tagged
leaf-bridge xmod rows. Not ported, owned elsewhere per the audit: the
carriers' twelve ordinary call-arg rows (r989_callarg_* fixtures) and
the three w6c-vs-w6c_ww byte-id rows (test-data-byteid over
r989_tagsubset_{flatten_subset,slice_subset,nested_wrap}).
test/xmod/label_test.ww replaces 706_fnlabel_mangle.c and
750_mklabel_modscoped.c with every assertion preserved (fnlabelmangle
fixture run-112 both stages; three mklabel rows with run exits and
module-qualified label needles). Strengthened: fnlabel adds the
cs==ww sepwork .s byte-id the carrier never asserted.
test/xmod/m1_test.ww replaces 989_m1mangle_run.c and
989_m1usehint_run.c with every assertion preserved (5 tree rows +
2 usehint rows, both stages, plus the leaf_collision byte-id leg;
concat order strengthened from shell glob to byte-sorted listdir).
test/xmod/collide_test.ww replaces 989_fnptrcollide_run.c and
989_barefn_collide_run.c with every assertion preserved (build-reject
both stages; run-exit 9 + exactly-one TEXT main.run/aa.run + cs==ww).
Makefile grows the XMOD_WW_TESTS block mirroring SEP_WW_TESTS, wired
into test-compiler.
944_alias_cgen_b5_run.c -> alias_g73_heapfill (//ww:compile), joining
its migrated alias_* siblings. The carrier's stated fixture blocker
('//ww:compile links') is stale: the COMPILE cell runs the bare
frontend, no link. The live #24 field(SB) deref-read leak enters
DATABYTEID_DIVERGED, upgrading the carrier's silent byte-id waiver
with a graduation tripwire.
839_xmod_nominal_typeeqast.c -> r839_xmod_nominal_match (run-exit 42),
r839_xmod_a6_concrete (run), r839_xmod_incompat_concrete (error
'not assignable'), r839_xmod_distinct_alias (error 'ambiguous
without nominal layout').
r839_xmod_nominal_match enters DATABYTEID_DIVERGED: the carrier waived
byte-id for the pre-existing cross-module tagged-return spill
divergence; the DIVERGED row makes it loud-on-fix instead. The
typeeqast-layer discriminator itself stays with the lib byteid gate
(test/byteid/libbyteid_test.ww), as the carrier documented.
732_def_const_fold.c -> r732_def_xmod_fold (run-exit 42; stronger than
the carrier's DATA-row grep — links AND reads the folded cross-module
value), r732_def_xmod_cycle (error 'def value: reference chain too
deep', upgrading the needle-less exit!=0 check).
The five same-module exec rows and both same-module fail-loud rows were
already owned by the r732_def_* fixtures; their cs-vs-ww byte identity
rides test-data-byteid, which now also covers the xmod fold row. The
timeout-124 hang distinction devolves to the wwfixture harness timeout.
696_modtype_leaf_collision.c -> r696_modtype_leaf_pos (run-exit 26),
r696_modtype_leaf_neg (staged error; w6c 'no field', w6c_ww
asserttyped: dot — the old no-wwstage-checkfile comment is stale)
697_samemod_prefer.c -> r697_samemod_prefer (compile)
699_use_promote_alias.c -> r699_usepromote_{type,fn,def,var}
(run-exit 42 each)
Single-file multi-package form folds the modcollision/samemodprefer/
usepromote data trees into the fixtures; the trees retire with their
carriers. The dir-tree .wwi transport of colliding type decls is owned
by test/byteid/wwi_test.ww. Coverage upgrades: 697 and the 699 rows
gain the wwstage leg the carriers gated or skipped, and all positive
rows enter the blanket test-data-byteid net.
m3sep_test.ww drives the raw w6c/w6a/w6l toolchains (+_ww twins) over
hand-composed //ww:module units splicing produced .wwi bytes: the
bodies==.wwi keystone on both stages per package (mid/root/smid) with
determinism, rule-10 and the value-global DATA guard; the end-to-end
i32 chain (exit 59) with final-exe byte-id; and the #49 str-label /
#53 export-leaf link legs (exits 160/140) with their .s needle
proofs. Each @test re-produces its .wwi cold instead of sharing the
carrier's single scratch dir (same claims, sharper isolation).
septest_test.ww keeps all five rows (pass/fail run-exits, the
userman + badsig @test rejects, the collide_run user-fn-run coexist)
plus the full-sepwork .s/.wwi byte-id sweep and the -T synth
TEXT-main / CALL-test.run presence needles, both driver stages. The
pass/fail run-exit rows overlap package_test ownership but stay:
retiring them would drop audit-listed assertions from this gate. The
attest_* data fixtures remain in test/wcc/data (also consumed by the
911_attest_* carriers).
sepscratch_test.ww pins the #59 build_one_sep scratch ownership on
both driver stages: build -o keeps <stem>.sepwork, `run` leaves no
/tmp/ww_run_<pid> root, and a foreign pre-existing .sepwork is
refused with exit exactly 1, sentinel intact. The C fork/execl pid
capture becomes `sh -c 'echo $$ ...; exec <drv> run ...'` -- exec
keeps the shell's pid and passes the full driver path as argv[0].
seplink_test.ww carries the .a substrate legs (root-as-.o layout, .a
byte-id + 3x determinism, the #31 masked-dup PASS-3 reject with its
non-vacuity flip), the loud dependency-cycle reject with byte-equal
cs/ww stderr, and the w6l/w6l_ww bare-main duplicate-symbol reject
(achievable substring parity per the filed message divergence).
sepimport_test.ww re-hosts the #98 colo srcd-shadow `ww test` gate,
the #99 imported-dep bare-main mangle count, the #23/#30 modfn
coexist byte-id (incl. the cross-layout vbu order pin), and the
#58/#50 scopelookuptype mod-preference rows over the checked-in and
synthesized module trees. slttypepref's ww_ww-absent skip gate is
dropped: the Make target declares both drivers (mangle_test
precedent).
Birth test/sep/ (single-file ww observers on test/testenv, run by the
new SEP_WW_TARGETS pattern rule under test-compiler) with
sepbuild_test.ww: the build_one_sep real-chain gate incl. the
bodies==.wwi keystone recompile, the #69 root-without--I contract, the
#70 aggregate-def .wwi prototypes, and the #95 spread-marker
round-trip. Every carrier assertion has a successor row; the C
cleanup-accounting ledgers collapse into testenv.clean.
Evaluate the call pre-grow into a per-site scratch, receiving by the
N_LET matrix (sret / float / odd-tail / GP), then grow, slot, sized
ladder. Both stages, byte-identical. The two reject pins graduate to
16B GP accept rows; three new fixtures cover 24B GP, 3B/4B tails,
16B float, and 40B sret.
Four ww tests carry the last eight native byteid carriers' assertions:
asmwindow (753 convwrap beta/main/alpha order + window polarity, 754
slice stride + negative scale scan, 755 amp-dot-idx four rows, 758
first-CALL-line extraction + tab-framed disp literals, direct
w6c/w6c_ww never ww build), freenoop (930 byte-id strengthened to
per-stream compare + negative 'free' grep), structabi (946 param/ret
MOVSD windows with polarity tables and SEND/RECV agreement), mangle
(989_m1mangle needles + concat byte-id, glob order strengthened to
byte-lexicographic). Dead want/stage_mask row fields documented, not
invented into runtime legs; the w6c_ww-absent skip gates drop because
the Make target declares the tools.
BYTEID_WRAPPER_SOURCES, its bins, and test-native-byteid are deleted —
the native byte/artifact partition is EMPTY (11 -> 0 this session);
docs counts move to 123 carriers.
25 renames (git mv, content untouched). _test.ww is what the package
coordinator's test detection and the sep loader's canonical exclusion
key on; the old *test.ww spellings survived only through the
line-leading-@test compatibility scan. Consumers updated in place:
LIBRARY_TESTS, the libbyteid roster, the 901/974/975/976 carriers that
copy or invoke these files, and the check.c/check.ww + path/ftos
comments that cite them. Closes the open-driver-work migration bullet.
test/byteid/wwi_test.ww carries every assertion of both carriers: the
M2 producer gate (ascii/strings/getopt driver-combined positives with
byte-id + wwdump -a re-parse, the synth decl-kind/type-node sweep with
the #47 @symbol round-trip, the #48 types export-def gate, and the
negative private-nominal leak with both-stage identical reject
diagnostics), plus the #11 wwileaf decl-less-leaf rows (package-line
leaf, cross-stage .wwi byte-id, importer resolution + .s byte-id).
Byteid carriers 10 -> 8; docs counts move; the byteid ww target gains
the wwdump prereq its re-parse legs invoke.
test/testenv (package testenv) is the shared plumbing for ww-native
test drivers — subprocess launch with captured output, file IO, string
search, byte-sorted directory listing, scratch ownership — lifted from
the proven package_test.ww idiom; a utility, not a framework.
test/byteid/libbyteid_test.ww carries every assertion of the retired C
carrier: the 44-entry roster (fixtures + sentinel-guarded import probes
+ the zero-dep root-only build), both-stage sep builds with the
resolved-unit proof, per-package .s concat compare with the empty-concat
guard, the ID/DIVERGE/WWREJECT pin discipline, and the lib/ corpus
completeness scan (negative-verified against a planted un-enrolled
module). Concat order strengthened from shell-glob to explicit
byte-lexicographic. The roster fills by cursor-driven field writes
because append() rejects struct-call-result sources (#34).
Byteid carriers 11 -> 10; docs counts move; test-byteid runs the ww
test via the wwtest/ pattern with WW_TEST_REPO.
Ten of the thirteen were already fully twinned — their runtime rows
migrated in earlier waves (r56_def_*, r79_*, r78_*, r926_*,
r989_m1union_*) and the carriers survived only for a cstage-vs-wwstage
byte-compare the blanket test-data-byteid comparator owns once the
source is a corpus fixture. The other three needed their remaining
inline sources added first: r756_* (4, alias-chain unwrap),
r844_bid_src (size(u64) untyped-int compare), r989_structframe_* (3,
struct-local frame layout). Every new fixture was verified both-stage:
compile exit 0 twice, .s byte-identical, runtime exit as pinned.
The five ww_ww-driver-leg carriers among them (785/786/789/790/
m1union) follow the 815/940/951 precedent: content identity owned by
their corpus twins, driver-leg identity owned by 989_lib_byteid's
sweep. Byte/artifact partition 24 -> 11; carriers 147 -> 134; corpus
pin 1495/2990; the stale 915 sweep figure in the docs corrected to
the true 1,157 non-error count.
fnptrcalleetfn's N_DOT arm required an N_IDENT base, so a.b.cb(...)
fell to the name registry with an empty module hint and emitted
CALL cb(SB) (undefined symbol; cstage calls the stamped ptr indirect).
dotbasestructinfo resolves the base chain through the struct registry
— each link a struct- or *struct-typed field — and the single-dot
path routes through the same resolver unchanged. Closes the last open
shape of the #59.8 name-keyed callee family. Fixture fnptrfield_chain;
corpus pin 1487/2974.
installparams normalizes a decl's `T...` param lhs to []T in place
(cstage instead sets the resolved tp->type and never mutates AST), so
typeeqast compared a decl-synthesized fn type's []i64 against a fn
TYPE expr's surface i64 and confidently rejected
`let f: fn(args: i64...) void = sum;` — cstage accepts and runs. The
normalization wrapper now carries an op marker and typeeqast peels
exactly it, so both sides compare at the declared element type without
admitting genuinely different element depths. Fixture fnptrlet_variadic;
corpus pin 1486/2972.
The last frontend-gap pin: wwstage had no Hare struct embedding
(struct { hash.hash, ... }), rejecting lib/crypto/sha256 at parse.
- parse.ww: the three member forms (named / anonymous struct / bare
dotted-ident embed), consume-then-branch since this parser has no
peek; embeds carry f.str == "" and the type in f.lhs.
- check.ww N_TSTRUCT flatten: promote the inner struct's flattened
fields at base+src.offset (check.c:961-990); the embed is one
nested-struct unit in the slot ladder; the resolved inner AST is
planted on the TFIELD rhs for cgen.
- check.ww walkers: astoffset / exprtype N_DOT / #251 struct-lit
field lookups descend embeds through shared helpers; the collision
and non-struct-embed rejects live in validatestructfields (the
once-per-decl diagnostic site).
- cgenutil.ww registerstruct: regfieldrun walks the AST against the
flattened tfield cursor, descending embeds via the planted inner
AST so promoted fieldinfo entries keep the inner field's own name
and type node.
- wwi printers unchanged (both stages already emit nameless fields).
sha256_test compiles byte-identically end to end and its 6 tests
pass; 989_lib_byteid is now 44 id / 0 divergent / 0 wwreject.
Fixtures r5913_* (promoted rw, offset shift, anonymous embed,
two-level embed + promoted fn-ptr callee, three rejects); corpus pin
1485/2970.