TermiNexus
60100fa6af
fix(type): 联合类型 A|t.CPtr 判据由白名单改为解析成功即保留,stub 侧同步
定义侧 TypeGenResolve.resolve_annotation_type 的 BinOp(A | t.CPtr) 分支:裸名
pointee 的保留判据由“硬编码名字白名单 + 必须是已注册 struct”改为“以解析是否
成功为准”——命中统一口径 resolve_typedef_or_map(CTypedef 动态表 → builtins
→ stdint/w32.win32base 库源 → map_t_type)且结果非指针即保留该已解析类型。
于是 sizet | t.CPtr ⇒ i64*(原静默退化为 i8*)。
修复前的故障:TPV2 Phase1 的 includes/ast/tokens.vp _kw_index_put 按 i8* 处理
哈希槽,slot[0] 只做 1 字节读写,指针被截断成低字节 0xd0,随后被当 KwEntry*
解引用 → ASan 读地址 0xd0 崩溃(TPC 侧同 sha 为 alloca i64*/load i64/store i64)。
stub/declare 侧 VpiReader._resolve_vpi_ret_annot_str 同步同一判据:新增
first_td 标记,对裸名(无 '.')、非白名单、非指针的解析结果复用同一个
GenApi.resolve_typedef_or_map 判定,命中即保留 pointee。声明侧与定义侧现在
同型(sizet/uint64/INT/u32 等别名两侧都得到 i64*/i32*),同型即收敛,
不再需要把 declare 侧坍缩为 i8* 去迁就定义侧。
既有路径行为不变:泛型参数名、内建标量白名单(int/char/str/bytes/bool/float/
double)、解析失败与裸枚举名的 i8* 兜底;指针别名(BYTEPTR/HANDLE/VOIDPTR)
因解析结果为 Ptr(...) 不置位 first_td,仍坍缩 i8*,与定义侧 td_res_is_ptr
守卫对称。
2026-09-15 13:52:21 +08:00
..
2026-09-15 13:52:21 +08:00
2026-09-12 23:14:52 +08:00