Commit Graph

1357 Commits

Author SHA1 Message Date
cf90c50c38 lib: split utf8 tests into rune/encode/decode/types per ref/hare/encoding/utf8
Pure move: utf8_test.ww dissolves along its banner seams into sibling
rune_test.ww (runesz/utf8sz), encode_test.ww (encoderune),
decode_test.ww (decoder next/prev/validate/remaining/slice/position
plus the encode->decode round-trip), and types_test.ww (strerror),
mirroring ref/hare/encoding/utf8/{rune,encode,decode,types}.ha
ownership (types.ha:12 owns strerror). Blocks are byte-identical;
only the banner lines are deleted. The streq helper moves with its
sole consumer, strerror_cases, into types_test.ww. The impl utf8.ww
is untouched (no banners).

Consumers: Makefile LIBRARY_TESTS replaces the utf8_test.ww entry
with the four new entries at the same position; the
test/byteid/libbyteid_test.ww roster row becomes four fx rows,
NENTEXPECT 52->55 (+3).
2026-08-08 17:21:08 +09:00
4f37a8b425 lib: split bytes tests into equal/index/contains/tokenize/trim per ref/hare/bytes
Pure move: bytes_test.ww dissolves along its banner seams into sibling
equal_test.ww, index_test.ww (u8 + []u8 arms of index/rindex),
contains_test.ww (contains/hasprefix/hassuffix), tokenize_test.ww
(tokenize/rtokenize/peektoken/remainingtokens + splitn/rsplitn/split +
cut/rcut), and trim_test.ww, mirroring ref/hare/bytes/{equal,index,
contains,tokenize,trim}.ha ownership (Hare keeps splitn and cut in
tokenize.ha; contains.ha owns hasprefix/hassuffix). Blocks are
byte-identical; only the banner lines are deleted. Helpers stay with
their sole consumers: expect_token/expect_done/expect_tok in
tokenize_test.ww, beq in trim_test.ww.

Consumers: Makefile LIBRARY_TESTS replaces the bytes_test.ww entry
with the five new entries at the same position; the
test/byteid/libbyteid_test.ww roster row becomes five fx rows,
NENTEXPECT 48->52 (+4).
2026-08-08 17:20:50 +09:00
8a1dc641e3 lib: split strings suffix/contains/index/compare tests per ref/hare/strings
Pure move: the hasprefix/hassuffix, contains, byteindex/rbyteindex/
index/rindex, and compare sections of strings_test.ww become sibling
suffix_test.ww, contains_test.ww, index_test.ww, compare_test.ww,
mirroring ref/hare/strings/{suffix,contains,index,compare}.ha
ownership. Blocks are byte-identical; only the section banner lines
are deleted (the file names now carry them).

The remaining families (dup, concat, trim, sub, utf8, iter, tokenize,
pad, replace, cut) stay in strings_test.ww: they all consume the
file-local streq helper, and a helper cannot be shared across split
test files — a single-file test root does not pull same-package
siblings (undefined: helper), while dir-mode composes all package
test files into one unit (duplicate fn helper). Splitting them would
force either helper duplication or renames, both out of scope for a
pure move.

Consumers: Makefile LIBRARY_TESTS gains the four new entries beside
the strings_test.ww row; test/byteid/libbyteid_test.ww roster gains
four fx rows, NENTEXPECT 44->48 (+4).
2026-08-08 17:20:40 +09:00
8539343de4 lib: split endian into network/big/little per ref/hare/endian
hton/ntoh -> network.ww (ref/hare/endian/network.ha:5-36); be* byte
get/put -> big.ww (ref/hare/endian/big.ha:5-48); le* -> little.ww
(ref/hare/endian/little.ha:5-48). ww does not port endian.ha's host
dispatch, so no host file appears.

Pure move: every fn is byte-identical; the three section banner
lines are deleted (file names now carry them). The module-doc header
rides with network.ww — its amd64-is-LE sentence is the WHY for
hton being a swap.

Consumers: Makefile WWFIXTURE_SRC entry replaced in place. The
byteid roster is untouched: lib/endian is enrolled as an
import-probe keyed on `package endian;`, which every new file
still declares.
2026-08-08 17:19:29 +09:00
4c0d2d33e3 lib: split path_test into buffer/stack/posix tests per ref/hare/path
Mirror ref/hare/path's impl layout in the test siblings:
abs/isroot/string/local rows -> buffer_test.ww (ref/hare/path/
buffer.ha:28-77); push/parent/pop-split rows -> stack_test.ww
(ref/hare/path/stack.ha:9-180); dirname/basename rows ->
posix_test.ww (ref/hare/path/posix.ha:17-71).

Pure move: every @test block is byte-identical; only the section
banner lines are deleted (file names now carry them) and each
section's ref-cite WHY comment rides with its @test. The suite
header's Hare-vector/parallel-array WHY paragraphs ride with
stack_test.ww (push is their subject); the stale `ww run
lib/path/path_test.ww` sentence is dropped, not relocated.

Consumers: Makefile LIBRARY_TESTS entry replaced in place. The
byteid roster is untouched: lib/path is enrolled there as an
import-probe, not a fixture.
2026-08-08 17:19:29 +09:00
cec382ef8a lib: split time_test into duration/instant/arithm tests per ref/hare/time
Mirror ref/hare/time's impl layout in the test siblings: constants ->
duration_test.ww (ref/hare/time/duration.ha:9-18 owns the constants);
now/sleep rows -> instant_test.ww (instant is the subject type,
ref/hare/time/instant.ha; now/sleep bodies live in
ref/hare/time/+linux/functions.ha, a platform split ww does not have);
add/diff/compare rows -> arithm_test.ww (ref/hare/time/arithm.ha).

Pure move: every @test block is byte-identical; only the section
banner lines are deleted (the file names now carry them). The stale
file header naming the retired `ww run lib/time/timetest.ww` entry
point is dropped, not relocated (rule 8: it described a WHAT that no
longer exists).

Consumers: Makefile LIBRARY_TESTS entry replaced in place;
test/byteid roster 44->46 (+2).
2026-08-08 17:19:14 +09:00
c3b81eb793 test: split log silent rows into silent_test.ww per ref/hare/log/silent.ha
Pure file-boundary move: the two silent-logger rows
(silentwritesnothing, silentignoresprintfln) leave lib/log/log_test.ww
for lib/log/silent_test.ww, mirroring ref/hare/log/silent.ha's
ownership (ref/hare/log has no test files of its own; the file name
follows the impl layout as directed). Only the two banner lines are
deleted; both moved blocks are byte-identical. silent_test.ww imports
log + memio only (neither row uses streq/fmt/io).

The specced funcs_test/global_test halves stay merged in log_test.ww:
the streq helper is consumed by six lprint* rows AND the
setloggerswap/printflnglobal global rows, and same-package test files
compile as one unit in dir mode (duplicate fn rejected), so that
boundary cannot be a pure move; reported upstream rather than
relocating the majority of rows.

Ordering: defaultwiredtoglobal must precede any log.setlogger caller.
All setlogger callers (setloggerswap, printflnglobal) remain after it
in log_test.ww; the silent rows never touch setlogger, and dir-mode
concat order (pkgsort: log_test.ww < silent_test.ww) keeps
defaultwiredtoglobal first overall.

Consumers: Makefile LIBRARY_TESTS gains lib/log/silent_test.ww beside
the log_test.ww entry; test/byteid/libbyteid_test.ww roster gains
fx("lib/log/silent_test.ww") after the log_test row, roster 44->45
(+1, NENTEXPECT bumped).

Validation: standalone ww test lib/log/log_test.ww (9 passed) and
lib/log/silent_test.ww (2 passed); dir mode ww test lib/log (11
passed, defaultwiredtoglobal first); test/byteid/libbyteid_test.ww
compile-only build exit 0, 45 roster appends == NENTEXPECT.
2026-08-08 17:17:42 +09:00
e5379848de lib: split io empty stream into empty.ww per ref/hare/io/empty.ha
Pure file-boundary move of lib/io/stream.ww's single 'empty stream'
banner section (_empty_read, _empty_write, _empty_vt, empty) into
lib/io/empty.ww, mirroring ref/hare/io/empty.ha. No code, name,
signature, or behavior change. Comment-only adjustments: the banner
line is deleted (the file name carries it); the moved block's
'Lives in stream.ww' self-reference now says empty.ww; stream.ww's
head drops its empty bullet (content duplicated by empty.ww's own
comments); io.ww's ownership map gains the empty.ww line; types.ww's
'three files' count becomes four. empty.ww needs no imports (package
io types only).

Makefile: lib/io/empty.ww added beside every lib/io/stream.ww
occurrence (WWFIXTURE_SRC line 75; w6c_ww/wwdump_ww bootstrap prereq
lists at lines 184/204). lib/io has no _test.ww, so no LIBRARY_TESTS
or byteid-roster change; byteid coverage rides the bootstrap gates.

Validation: out/bin/w6c lib/io/io.ww (standalone contract) exit 0;
importer tests green: bufio 26, memio 11, log 11, getopt 12 (calls
io.empty), fmt 49.
2026-08-08 17:17:42 +09:00
34101508be lib: split bufio into stream+scanner per ref/hare/bufio
Pure file-boundary move of lib/bufio/bufio.ww along its three banner
seams: buffered stream + vtable callbacks -> stream.ww (per
ref/hare/bufio/stream.ha), scanner + BUFSZ + overflow -> scanner.ww
(per ref/hare/bufio/scanner.ha). Head defs split by ownership:
flushdefault + rtabort (unread's assert) stay with stream, BUFSZ
(scanner.ha:11) + overflow with scanner. The module head comment
stays with stream.ww. No code, name, signature, or behavior change;
the three banner lines are deleted (file names carry them) and three
comment self-citations re-point (bufio.ww:87-89 -> stream.ww:73-75,
bufio.ww:46-50 -> stream.ww:46-50, bufio.ww:77 -> scanner.ww:15), plus
the lib/regex/regex.ww:1117 citation of lib/bufio/bufio.ww now names
scanner.ww. import bufio resolves by directory (cmd/ww locate_import
dir pass), so no consumer path lists change; bufio_test.ww is
untouched (its split is blocked by the shared putstr helper vs the
composed-mode duplicate-symbol reject; reported upstream).

Validation: out/bin/ww test -I lib/ww lib/bufio/bufio_test.ww (26
passed) and out/bin/ww test lib/bufio (ok, external) both green;
lib/regex/regex_test.ww (bufio importer) 33 passed.
2026-08-08 17:17:34 +09:00
184afa3243 syntax+w6c: multi-type match patterns in wwstage (align up to cstage)
`case T1 | T2 =>` (binding-less; cstage parse.c:635-650 chains extra
types through cs->list, bindings stay single-type by design). Three
wwstage layers, no AST change (node.list already exists):
- parser (expr.ww): pipe loop after the non-let arm's first
  parsetype;
- checker (check.ww): resolvewalk N_MCASE now walks n.list so each
  alt gets its type_ stamp (exhaustiveness/casecovers were already
  alt-aware, built ahead of the parser);
- cgen (cgenexpr.ww): the single-pattern want-computation moves
  VERBATIM into matcharmwant; a cs.list arm emits CMPQ/JE per alt
  funneling into one match_body label, mirroring cgen.c:11118-11141
  incl. label mint order and the tag<0 clamp. Nullable arms keep
  ignoring alts (both stages).

Graduates the held e2e row (pin 1732/1158/3464); byte-identical on
the repro and the single-pattern control.
2026-08-08 17:15:41 +09:00
bbdd8bede6 syntax: accept the empty for () condition (align up to cstage)
cstage parse.c:1027 accepts `for ()` — N_FOR with a nil cond, no
for-else arm, no test emitted (an unconditional loop; a deliberate
Go-flavored ww divergence from Hare, original to the toolchain
import). The wwstage parser had no RPAREN early-out and rejected it.
Selfhost checker and cgen already nil-guard n.cond, so the parser arm
is the whole gap. Graduates the held e2e row (pin 1731/1157/3462).

Adjacent asymmetries left filed, not fixed here (rule 11): the brace
form `for { }`, the empty middle clause of the 3-clause form, and
the REVERSE case (wwstage accepts 2-clause `for (cond; post)` which
cstage rejects).
2026-08-08 17:15:20 +09:00
d78137a051 w6c: fold dot chains through inferred-alloc struct pointers (#24 residue)
wwstage dotchainresolve gated its *T roots on an N_TPTR-over-N_TNAME
tnode; an inferred `let p = alloc(S{...})!` rides the checker-
SYNTHESIZED N_TPTR whose pointee is the struct BODY node (the #24
TNAME-normalize covers only the direct struct-lit binding), so the
root gate failed and chained p.field.pseudo reads fell to the
unfused deref arms — shape-only divergence vs cstage's type-keyed
fold (both stages runtime-correct; the historical field(SB) leak the
pin described was already fixed). Widen the local and global root
gates to accept the N_TSTRUCT pointee; correctness stays enforced by
the stamped-tinfo peel below (TY_PTR -> pointee TY_STRUCT).

Graduates alias_g73_heapfill out of DATABYTEID_DIVERGED (2 pins
remain, both the tagged-spill family); adds compile fixtures pinning
the newly-converged siblings (nested read+store, slice .cap,
inferred-global root; pin 1730/22/3460) and a runtime lang row that
mutates then re-points the heap base — a read bypassing the pointer
returns the wrong len.
2026-08-08 17:14:59 +09:00
7631f4327c test: port 794_xmod_ident_prefer to collide_test; retire the carrier
The last bug-pinned C carrier. Its header documents both #55 halves;
with the cgen side fixed the STRONGER assertion set it deferred is
expressible: barevalue builds the 794 two-file program FLAT
(file-keyed import — a dir-keyed aa/ compiles aa as its own sep unit
where main.v is invisible and the collision cannot express), runs
exit 7 on BOTH drivers, and asserts the flat __root.s cs==ww
byte-identical (rule 10). defshadow pins the def-vs-fn arm-order
corner (foreign scalar def under a curmod fn: bare read 42, not
141), modqualfnval the qualified fn-value positive twin.

Carrier fleet 16 -> 15: 5 units / 6 bootstrap / 3 platform /
738_module_decl. Zero bug-pins remain.
2026-08-08 17:13:23 +09:00
9382eedbbb w6c: classify fn-value idents by the stamped TY_FN, not the leaf table
wwstage cgen re-derived fn-ness by NAME: cgident's fn arm gated on
fnretlookup, whose cross-module leaf fallback matches a foreign
same-leaf fn — inside aa.getv the bare `v` (aa's i32 global, stamped
by the #55 prefer fix) took the fn-address arm for main's `fn v` and
emitted LEAQ aa.v(SB) with no deref; the ww_ww-built 794 program
exited 0 instead of 7. cstage reads the checker-stamped type
(cgen.c:4315). Convert the three value-position sites to the stamp
(same predicate-to-stamp conversion as the #14 F7-c7 `&fn` arm):
cgident (now TY_FN -> def -> let, cstage's order — the def-first
order also mis-read a foreign scalar def shadowed by a curmod fn),
the cgdot module-qualified value arm, and the `&ident` #180 arm.
Call-position fnretlookup consumers are unchanged.

The 794 two-file program is now cs==ww byte-identical and both
drivers run exit 7; the carrier retires in the follow-up.
2026-08-08 17:13:05 +09:00
07dfc0e6af wwpackage: drop the indexed-source pointer alias
The task #6 fallback landed; handles[k].result copies and &handles[k]
arguments compile directly, so the WHY-comment alias is dead.
2026-08-08 17:12:48 +09:00
d3822d7730 w6c: fall to the place resolver for indexed dot-chain aggregate sources
The dot-chain SOURCE-address walkers (cg_dotchain_addr /
dotchainaddr) deliberately have no index hop — their AX-clean spill
contract serves the chained dotbase arm — so an aggregate copy from
elem[k].field (N_DOT over N_INDEX) fell out of the walk. Every
aggarg_srcaddr consumer loud-stopped (arg push #271, aggregate
return #272, field assign, structlit fill, ident reassign) EXCEPT
the indexed element-store arm, which left the walker's result
UNCHECKED and copied through a stale SI — a silent both-stage
miscompile (out[j] = hs[k].result read garbage). Task #6.

Both stages, two twin edits each: the aggarg_srcaddr N_DOT arm falls
back to cgplaceaddr (the C4/#40 place resolver, emission-free-on-
failure so the fallback starts clean), and the indexed store site
checks the walker before the same fallback.

Still loud (filed follow-ups): auto-deref pointer-to-array indexed
bases (hs: *[4]T; hs[k].field — cgplaceaddr's index arm takes no
deref hop; the explicit (*hs)[k].field form works), and the bare
N_INDEX slice-element aggregate source.
2026-08-08 17:12:18 +09:00
dc33af6217 w6c: remap legacy-union error tags in wwstage ? propagation
The #173 remap loop in cgtryprop gated on the tparam's explicit `!`
flag only; a LEGACY union (no marks anywhere) classifies error
variants POSITIONALLY (index 0 is success, cstage cg_variant_is_error
cgen.c:905) — so wwstage emitted no remap and propagated the callee's
raw tag into a differently-ordered caller union, a silent wrong arm
(cstage exit 7, wwstage 9 on the banked r700 row). Add the
variantiserror twin and gate the loop on it; refresh the drifted
cstage cite.

Graduates the held e2e row into the corpus (pin 1727/1156/3454) and
adds legacy-mode rows to test/lang/tryprop_tag_remap_test.ww:
reversed order both directions, slot-0 remap, str payload integrity,
a two-hop chain whose pre-fix runtime pass was double-miss tag
cancellation (the lang byteid leg pins the emitted remap blocks),
and a same-order zero-emission control.
2026-08-08 17:11:50 +09:00
74f927be16 make: re-home lib/os + lib/os/stat + lib/dirs bare legs into LIBRARY_TESTS
The three modules pass bare (loud SKIPs on absent env); their arranged
legs stay owned by test/libenv. Closes the deliberate scope cut from
the os wave.
2026-08-08 16:29:55 +09:00
c3fc2bdb27 docs: carrier fleet at its terminal floor; suite roster 2026-08-08 15:51:19 +09:00
e511cdd5a2 test: port 989_ffivariadic_run to ww; retire the C carrier 2026-08-08 15:50:23 +09:00
ee793a8407 test: port 737_direnum to ww; retire the C carrier 2026-08-08 15:50:23 +09:00
b4a6bab112 test: libenv arranger observers; retire the 974/975 env carriers
test/libenv/libenv_test.ww owns the env-arranged legs of the lib/os
getenv and lib/dirs XDG suites (rows asserted ok, not SKIP, plus the
created-chain layout), the dirs too-long abort on both stages, and the
make-owned runner for the self-arranged stat suite. Wired beside the
sep observers under test-compiler.
2026-08-08 15:40:19 +09:00
d2e54b7efa lib: expectabort rows for the restored preconditions; retire 989_libprecond_abort.c
The three must-abort runs (u32n/u64n zero, decodedsize unaligned) move
into the owning lib suites as test.expectabort rows; the five
normal-return controls already live in the r989_libprecond_* fixtures.
wwstage parity rides the lib-wide cs==ww byte identity gate.
2026-08-08 15:39:59 +09:00
6f3ffb1abc lib/dirs: rows skip loudly when WW_TEST_TMPDIR is absent 2026-08-08 15:39:59 +09:00
09ddce324b lib/os: getenv rows skip loudly when the arranged env is absent 2026-08-08 15:39:59 +09:00
682c16cad0 lib/os: stat_test self-arranges its scratch tree; retire 976_stat_run.c
Each row builds regfile/symlink/subdir under temp.dir (Hare's os-test
idiom) and asserts exact cleanup, so the suite passes bare and the
carrier's env+tree arrangement job disappears. Every carrier assertion
maps to an in-test row.
2026-08-08 15:39:59 +09:00
3e56ae9fe1 lib/os: add symlink wrapper (ref/hare/os/os.ha:106) 2026-08-08 15:39:59 +09:00
23db361612 test: testenv.runcommandenv, the explicit-env runcommand variant 2026-08-08 15:39:59 +09:00
3908a1557e test: repoint retired-carrier citations at the tool ports 2026-08-08 15:39:49 +09:00
e1bb49fb54 test: port the c6 sep soak to ww; retire 989_c6soak_run 2026-08-08 15:39:49 +09:00
c8131d773e test: port the wwi wide-rune round-trip to ww; retire 110_uniesc_run
Adds the audit's optional strengthen: the re-serialized escape text is
pinned per producer branch and wr.wwi is byte-id across stages.
2026-08-08 15:39:49 +09:00
a183e4f708 test: port the @test drop/keep/link observer to ww; retire 911_attest_drop 2026-08-08 15:39:49 +09:00
b711e8c69d test: port the @symbol FFI observer to ww; retire 800_ffi
Strengthens the pre-symmetry-era cstage-only stdout scrape to both
frontends with gated exits and the rule-10 cs==ww byte-id; the libc
binding smoke likewise runs both stages.
2026-08-08 15:39:49 +09:00
ac6d3c21aa test: port the wwdump_ww gate observers to ww; retire 901_asserttyped_gap + 989_wwdumpgate_run
One commit for both carriers: the asserttyped manifest and the -c/-r
parse-error gate are the same wwstage-only wwdump_ww subprocess
surface. The 901_*.ww raw gap companions stay in test/wcc, fed via
testenv.repo().
2026-08-08 15:39:49 +09:00
dd9b796eca test: port the driver-CLI observers to ww; retire 949_driver_flagargs + 949_missingpkg
One commit for both carriers: flag-misuse parity and the
missing-package fatal are the same driver-CLI subprocess surface. The
-V oracle parses WW_VERSION out of cmd/wcc/ww.h at run time; the
missingpkg ww_ww twin stays owned by bootstrap carrier 993_ww_ww.c.
2026-08-08 15:39:49 +09:00
16413a4864 test: port the cstage-only reject observers to ww; birth test/tool
Ports 708_param_shadow_mod, 712_redecl and 961_opaque_guards into
test/tool/rejects_test.ww on testenv, one commit because the three
carriers share the single asymmetric-polarity claim (cstage rejects,
wwstage accepts) that a both-stage //ww:error fixture cannot carry.
The neg_selfimp leg drops: test/wcc/data/r948_selfimport/case.ww owns
the identical both-frontend claim.
2026-08-08 15:39:49 +09:00
934f19f884 test: own the 926/929/671 run legs as corpus fixtures
The three carriers retired this session moved their compile/byte-id/
asm-marker legs to test/asm/tagsret_test.ww, test/asm/memarg_test.ww,
and test/misc/packedwwi_test.ww, and audit-assigned their run-exit
legs to corpus fixtures that were never created. Create them, sources
byte-faithful to the carriers' row tables; every fixture also rides
the corpus byte-id sweep, which stayed green (no new DATABYTEID pin).

926_tagged_sret_run.c run rows (all exit 0):
  wide_lit_roundtrip          -> r926_sret_wide_lit_roundtrip
  wide_local_roundtrip        -> r926_sret_wide_local_roundtrip
  wide_assign_receive         -> r926_sret_wide_assign_receive
  wide_match_scrutinee        -> r926_sret_wide_match_scrutinee
  wide_forward_exact          -> r926_sret_wide_forward_exact
  wide_str_error_variant      -> r926_sret_wide_str_error_variant
  wide_multicall              -> r926_sret_wide_multicall
  wide_bare_return_void       -> r926_sret_wide_bare_return_void
  wide_s4_repro               -> r926_sret_wide_s4_repro
  errno_shaped_tail_read      -> r926_sret_errno_shaped_tail_read
  boundary_s3_register        -> r926_sret_boundary_s3_register
  boundary_str_nomem_register -> r926_sret_boundary_str_nomem_register
  wide_discard_stmt           -> r926_sret_wide_discard_stmt
(the seven buildfail rows stay with r926_sret_reject_*.)

929_tagged_memarg_run.c run rows (exit 0 unless noted):
  mem56_ident_allvariants  -> r929_memarg_mem56_ident_allvariants
  mem64_ident_lateword     -> r929_memarg_mem64_ident_lateword
  mem56_widen_concrete     -> r929_memarg_mem56_widen_concrete
  mem56_subset_remap       -> r929_memarg_mem56_subset_remap
  mem56_srcshapes          -> r929_memarg_mem56_srcshapes
  mem56_mixed_orders       -> r929_memarg_mem56_mixed_orders
  mem56_call_in_loop       -> r929_memarg_mem56_call_in_loop
  mem56_twomem             -> r929_memarg_mem56_twomem
  mem56_inst_shape         -> r929_memarg_mem56_inst_shape
  mem56_elem_source        -> r929_memarg_mem56_elem_source
  mem56_elem_deref_spine   -> r929_memarg_mem56_elem_deref_spine
  mem56_elem_nested_spine  -> r929_memarg_mem56_elem_nested_spine
  mem56_elem_mixed_regs    -> r929_memarg_mem56_elem_mixed_regs
  mem56_elem_callidx_twomem -> r929_memarg_mem56_elem_callidx_twomem
  mem56_elem_global_slice  -> r929_memarg_mem56_elem_global_slice
  boundary48_register      -> r929_memarg_boundary48_register
  global_uninit_memarg_src -> r929_memarg_global_uninit_memarg_src (91)
  memarg_idcast_peeled     -> r929_memarg_idcast_peeled
(the four buildfail rows stay with r929_memarg_reject_*.)

671_struct_packed.c value rows (exit = layout value):
  unpacked_size    -> r671_unpacked_size (16)
  packed_size      -> r671_packed_size (9)
  packed_off_b     -> r671_packed_off_b (1)
  unpacked_off_b   -> r671_unpacked_off_b (8)
  packed_align     -> r671_packed_align (8)
  packed5_size     -> r671_packed5_size (5)
  packed5_off_b    -> r671_packed5_off_b (1)
  p3_packed_size   -> r671_p3_packed_size (4)
  p3_packed_off_c  -> r671_p3_packed_off_c (3)
  p3_unpacked_size -> r671_p3_unpacked_size (6)
  field_roundtrip  -> r671_field_roundtrip (6)
  arr_stride_size  -> r671_arr_stride_size (15)
  arr_stride_run   -> r671_arr_stride_run (33)
  byval_arg        -> r671_byval_arg (107)
  frame_offset     -> r671_frame_offset (20)
Owner-cited, no fixture: wwi_roundtrip needs a real multi-file -I
tree (a single-file two-package form emits no .wwi), owned by
test/misc/packedwwi_test.ww wwiroundtrip (exit 91 on both drivers);
identity_reject is stage-asymmetric, owned there as identityreject.

Pins: corpuscount 1680 -> 1726, runexitcount 1109 -> 1155,
nativecount 3360 -> 3452, corpushash refreshed.
2026-08-08 15:14:25 +09:00
8e950d367f test: port the assert/abort run-stderr net to ww; retire 957_assert_builtin_run
The unowned remainder is the four run-stderr assertions — msg content
for fail_msg/abort_msg, MANDATORY EMPTINESS for fail_nomsg/abort_bare
(rt_abort(NULL,0) writes nothing) — which the fixture protocol cannot
see (run exit only). The rows build the r957_* fixture sources in
place via the cstage driver; byte-id extends the lowering to wwstage
(the carrier's own argument). Owned legs cited, not duplicated: all
eight exit rows by the r957_assert_*/r957_abort_* fixtures, the
checker rejects by r957_assert_reject_*, byte-id by the
test-data-byteid blanket.
2026-08-08 15:05:52 +09:00
07b03d6f9c test: port the qualstructlit AST proof to ww; retire 848_xmod_qualstructlit_run
Only the ast_proof leg was unowned: wwdump -a / wwdump_ww -a dump
byte-id plus the ordered dot-over-structlit-over-tname node shape for
a trailing op on a qualified struct literal (inexpressible as a
runtime scenario while the #77 literal-temporary cgen gap holds; the
multilevel row pins the source-order a.b.C tname flatten). The three
build/run scenarios are owned by the r84_qualstruct_* fixtures plus
the test-data-byteid blanket — their vestigial want_exit fields were
already dead in the carrier.
2026-08-08 15:05:52 +09:00
bacc89ed5f test: port the asserttyped stamp probes to ww; retire 954 + 956 slim carriers
954_tuprecv_run, 956_tuprecv_f64_run and 956_modqualdestr_run shared
one retained dimension: w6c_ww compiles the destructure shape cleanly
AND emits no asserttyped stderr diagnostic (#121 A-narrow / #6a-A
stamp nets) — a channel neither test/lang nor the fixture protocol
has. All 11 rows fold into one observer with the drew-C4 non-vacuity
self-check on the shared predicate. Owned legs cited, not duplicated:
value rows + byte-id ride test/lang/tuprecv_test.ww,
test/lang/tuprecv_f64_test.ww and the test-lang-byteid blanket; the
modqual values + byte-id ride the r956_modqual_* fixtures and
test-data-byteid — those four rows compile the fixture files in place
so probe and fixture cannot drift. Bundled: one file, one concern
(the wwstage stamp-absence dimension).
2026-08-08 15:05:52 +09:00
05a5830805 test: port the live cs/ww divergence pins to ww; retire 826 + 944 slim carriers
826_alias_tuple_coerce, 944_alias_accept_run and
944_variant_chain_b95_run all reduced to the same irreducible shape: a
LIVE per-stage asymmetry (probed at HEAD) no symmetric fixture or
@test can host. Ported under the DIVERGE discipline — both sides
asserted loud (826 neg_0: cstage "not assignable to declared pair"
vs wwstage over-accept; #96: cstage runs vs w6c_ww "unsupported
address-of shape"; #277: cstage runs vs ww_ww "deferred #277"), so
a fix on either side fails the row and demands graduation. Owned legs
cited, not duplicated: r826_alias_tuple_* byte rows ride
test-data-byteid, 826's neg_1 went symmetric at HEAD and moves to a
//ww:error fixture per the audit split, the 944 value/reject corpora
live in test/lang/{alias_accept,variant_chain_b95}_test.ww and the
alias_*/vchain_* fixtures. Bundled: one file, one concern (held
divergence pins).
2026-08-08 15:05:52 +09:00
a82cfaa6ab test: port the cstage-only rejects to ww; retire 760_def_widen_const + 783_amp_fn_assign_run
Both carriers were already slim: the r76_def_widen_* byte-id legs are
owned by the test-data-byteid blanket, 783's positive byte rows by the
r78_amp_fn_assign_* fixtures plus that same blanket, and its symmetric
non-tagged rejects by the corpus //ww:error fixtures. The unowned
remainder is three cstage-only loud-rejects (the 760 narrowing def-ref
and 783's two tagged-slot rows); the wwstage over-accepts (no def-init
assignability check; #214 void-variant leniency) are documented at the
site per the residual audit, never asserted as desired — the rows
graduate to //ww:error fixtures when the wwstage side tightens.
Bundled: one file, one concern (cstage-reject pins awaiting wwstage
graduation).
2026-08-08 15:05:52 +09:00
5dc8bea318 test: port the packed .wwi + identity legs to ww; retire 671_struct_packed
wwiroundtrip pins the @packed re-emit through a real -I tree on both
driver stages (importer-side layout exit 91), strengthened with the
`struct @packed {` needle in the retained sepwork pk2.wwi (a
single-file two-package form emits no .wwi, so the tree is
irreducible). identityreject pins the stage asymmetry as a DIVERGE
row: cstage rejects with "not assignable" (packed is type identity,
harec types.c:621), wwstage builds+runs through the documented
#224/#10 nominal-lossy leniency; a wwstage tighten fails the row and
demands graduation to a //ww:error fixture. The 15 layout/runtime
value rows are fixture-shaped and move to the declarative corpus per
the residual audit port split.
2026-08-08 15:05:52 +09:00
aab9ec5e5f test: birth test/misc + port the arrglob DATAW observer; retire 689_arrglob_nodup_run
test/misc hosts the residual mixed-shape observers (divergence pins,
stamp/stderr probes, .wwi trees) on testenv, wired into test-compiler
beside the sep/xmod/asm families; its rule declares both full
per-stage toolchains plus the wwdump twins for the coming files.
The 689 port keeps the both-driver run-exit-6 backstop and the
per-stage absolute DATAW row count (linker dedup and byte-id sweeps
are both blind to a symmetric double-emit).
2026-08-08 15:05:52 +09:00
bec4340c44 test: port the tagged-memarg marker windows to ww; retire 929_tagged_memarg_run
The 18 active rows keep compile + cs==ws byte-id and the tab-anchored
ADDQ $N,SP cleanup markers with both polarities (mem-class rows must
contain their slot's cleanup; the exactly-48B boundary row must not).
The per-row driver build+run legs (incl. the uninit-global zero-box
exit 91) move to the r929 run fixture corpus per the residual audit
port split; the four buildfail rows were already dead here, owned by
the r929_memarg_reject_* fixtures.
2026-08-08 15:05:34 +09:00
f2539bd4d9 test: port the tagged-sret marker windows to ww; retire 926_tagged_sret_run
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.
2026-08-08 15:05:34 +09:00
49464efdc5 test: port the amp-fn LEAQ observer to ww; retire 764_amp_fn_ident
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.
2026-08-08 15:05:34 +09:00
5f23fe9b67 test: port the assembler input gates to ww
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.
2026-08-08 14:50:43 +09:00
0c98500603 test: port the archive-driven linker observers to ww
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.
2026-08-08 14:50:43 +09:00
4f9ba86058 test: port the w6l link-layout observers to ww
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.
2026-08-08 14:50:43 +09:00