TermiNexus
ab906f2cde
fix(HandlesExprCall): 构造的 self 按 callee 形参类型解析(同名类消歧),并合并"sha1 全名键"分支
类别:a(编译器缺陷)
现象(用户重跑后仍复现):includes/ast/parser.vp:1774
`kw: rawptr[AST] = KwNode(ps.pool, None, val)` 报
FailFastError: 指针隐式转换已禁止(非基本类型(结构体/类/联合)):调用
8312ce86a2fd82c0.Keyword.__new__ 第 0 个实参 %"fef783da4d24330d.Keyword"*
不能隐式转为形参 %"8312ce86a2fd82c0.Keyword"*
根因:`Gen.structs` 的键恒为**短名**(StructGen._generate_structs 以 ClassName 作键,
IR 名才带 sha1 前缀),别名注册只是**浅拷贝**(HandlesImports
`Gen.structs[asname] = Gen.structs[name]`)。Keyword 同时存在于 ast.tokens
(fef783da4d24330d) 与 ast.astaux(8312ce86a2fd82c0):裸名 'Keyword' 先被 .tokens 占用,
别名 'KwNode' 键又只是浅拷贝 ⇒ 构造的 self 按名字取到 tokens 的实例,而 callee
(_find_function('KwNode.__new__'))命中的是 astaux 的。llvmlite 的类型相等按 **IR 名字**
判定(实测同名不同对象 == 为真,见提交说明)⇒ 两份不同名实例必被
_ClassifyPtrImplicitConvert 拒绝。
上一版修复(ba7e117e)不成立:它按"callee 限定类名 + 与 ClassName 同短名"改判,而
ClassName 是别名 'KwNode'、限定类名是 '...Keyword',同短名判据恒假 ⇒ 从未生效。本版删除。
修复:
1) 新增 _CalleeSelfType():self 的 struct 直接取 callee(__new__ → __before_init__ →
__init__)第 0 个形参的 pointee —— 正是 _adjust_args 的比较对象,无歧义;形参上的
实例未具化时按 IR 名换同名已具化实例(_FindStructByIrName;IR 里类型身份就是名字)。
2) _get_struct_type 统一解析序:callee 形参 → sha1 全名键 → 名字键。
3) 合并"sha1 全名键命中"分支:原实现只解析 StructType、**不产出 alloca / 构造调用**,
控制流随后落到函数末尾 `return i32 0` ⇒ 该路径上的跨模块构造会**静默不构造**
(同为类别 a,一并修掉)。
2026-09-30 17:00:50 +08:00
..
2026-08-21 12:36:00 +08:00
2026-09-30 15:14:31 +08:00
2026-08-17 09:36:38 +08:00
2026-09-30 16:16:38 +08:00
2026-09-30 09:53:41 +08:00
2026-09-27 00:19:44 +08:00
2026-09-30 14:45:55 +08:00
2026-09-26 19:27:22 +08:00
2026-09-30 15:44:13 +08:00
2026-08-17 09:36:38 +08:00
2026-09-30 09:53:41 +08:00
2026-09-29 13:00:11 +08:00
2026-09-30 14:42:56 +08:00
2026-09-30 16:16:38 +08:00
2026-09-30 17:00:50 +08:00
2026-09-11 22:47:21 +08:00
2026-09-30 09:53:41 +08:00
2026-09-27 15:16:08 +08:00
2026-09-26 19:27:22 +08:00
2026-09-28 13:57:04 +08:00
2026-09-30 09:53:41 +08:00
2026-08-17 09:36:38 +08:00
2026-09-30 15:44:10 +08:00
2026-09-30 14:42:56 +08:00
2026-08-17 09:36:38 +08:00
2026-09-28 15:10:39 +08:00
2026-09-26 19:27:22 +08:00
2026-08-17 09:36:38 +08:00
2026-09-29 17:35:56 +08:00
2026-08-03 02:00:49 +08:00
2026-09-26 19:27:22 +08:00