wcc: accept NAMED-variant nominal match at tagged→tagged subset (#205)
The tagged→tagged subset arm walked src's leaves against dst's flat variant list, so `let r: (size | eof | wrapper) = e` with e: wrapper REJECTED at cstage's checker — wrapper's leaves (unsupported, underread, nomem) aren't direct variants of dst. Wwstage's permissive tail accepted silently but cgen then miscompiled the tag (#199b layout- extension family, deferred). Mirror the concrete→tagged fix from #199 (α) at type.c:316: when src is a NAMED-tagged wrapper and dst has a direct NAMED-tagged variant equal to src, accept by nominal identity BEFORE the subset loop. Wwstage's isassignable mirrors the structural insertion before the existing `*confident = false; return true;` tail (deferred-tightening per #202). SSoT with `is`/`as` non-recursive variant lookup (#198 family). Cgen's tag-remap for the wrapper-as-whole case still maps src variants to dst tag 0 — the wrapped-slot layout for `dst.tag = variant_idx, dst.payload = src` is #199b future-work. Probe verifies checker-accept + runtime exit-clean only; does NOT inspect the resulting variant tag. Probe 774_tagged_widen_named_variant.c covers 5 rows: bug-repro, nested-wrapper, pure-leaf subset (regression), concrete-unrelated rejection (gate), branched callee. Two sibling cgen/checker bugs surfaced (wwstage cgwidentaggedstorebp ssz<slot_sz pad gap; wwstage isassignable !void-alias collapse) and documented inline at the probe-row comment, kept in #202 family.
This commit is contained in:
7
Makefile
7
Makefile
@@ -324,6 +324,7 @@ TESTS = $(BIN)/test_smoke $(BIN)/test_lex $(BIN)/test_parse $(BIN)/test_check \
|
||||
$(BIN)/test_widen_transitive \
|
||||
$(BIN)/test_typeassert_nonident \
|
||||
$(BIN)/test_isas_spread_variant \
|
||||
$(BIN)/test_tagged_widen_named_variant \
|
||||
$(BIN)/test_use_promote_alias \
|
||||
$(BIN)/test_field_signed $(BIN)/test_frame_argcount \
|
||||
$(BIN)/test_selfhost $(BIN)/test_w6a_ww $(BIN)/test_w6l_ww \
|
||||
@@ -674,6 +675,12 @@ $(BIN)/test_isas_spread_variant: test/wcc/773_isas_spread_variant.c \
|
||||
$(LIB)/libwwrt.a | $(BIN)
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
|
||||
$(BIN)/test_tagged_widen_named_variant: test/wcc/774_tagged_widen_named_variant.c \
|
||||
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
||||
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
||||
$(LIB)/libwwrt.a | $(BIN)
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
|
||||
$(BIN)/test_arrlit_str_full: test/wcc/711_arrlit_str_full.c \
|
||||
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
||||
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
||||
|
||||
Reference in New Issue
Block a user