wcc: peel N_TNAME alias chain on cgdot receiver before lkind decision (#191)
`type vs = *vt; fn(s: vs) s.field` linked-failed in wwstage with `undefined reference to field' — cgdot read lc.tnode.kind without first walking N_TNAME aliases, so lkind stayed N_TNAME (not the underlying N_TPTR), structlookupchain missed (`vs` isn't a struct alias), and the lookup fell through to the SB-global fallback that emits `MOVQ <field>(SB), AX`. Mirror cstage type_chase_named (cmd/w6c/cgen.c:144-155) via an aliaslookup loop, stopping at struct aliases so the existing direct-struct N_TNAME arm stays byte-id with pre-fix #22 callers. LOOP (not single-peel) — Phase-N builds N_TNAME chains (project_tinfo_lossy_nominal), depth-2+ aliases require iteration. Inner peel on the pointee is unnecessary: the existing structlookupchain already walks N_TNAME chains via aliaslookup (cgenutil.ww:1266-1276); row 4 of probe 769 proves the inner-chain depth-3 path stays green without an explicit inner peel. Probe test/wcc/769_dot_aliased_ptr.c covers 4 rows (fn-param read, let-binding read, double-alias receiver, pointee-alias chain), per-row runtime + byte-id gates. Files inline two sibling bugs surfaced during impl (cgassign write-side silent-drop, chained-N_DOT spine link-fail) plus a cstage checker assignability gap on chain-depth-2 aliases — all out-of-scope per rule 11 split.
This commit is contained in:
7
Makefile
7
Makefile
@@ -319,6 +319,7 @@ TESTS = $(BIN)/test_smoke $(BIN)/test_lex $(BIN)/test_parse $(BIN)/test_check \
|
||||
$(BIN)/test_star_fn_deref_call \
|
||||
$(BIN)/test_match_variant_dispatch \
|
||||
$(BIN)/test_io_types_run \
|
||||
$(BIN)/test_dot_aliased_ptr \
|
||||
$(BIN)/test_use_promote_alias \
|
||||
$(BIN)/test_field_signed $(BIN)/test_frame_argcount \
|
||||
$(BIN)/test_selfhost $(BIN)/test_w6a_ww $(BIN)/test_w6l_ww \
|
||||
@@ -639,6 +640,12 @@ $(BIN)/test_io_types_run: test/wcc/768_io_types_run.c \
|
||||
$(LIB)/libwwrt.a | $(BIN)
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
|
||||
$(BIN)/test_dot_aliased_ptr: test/wcc/769_dot_aliased_ptr.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