From ddb1e6cc2a2e494ed5578b0c22eb36d9a8bd2135 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 3 Oct 2026 16:50:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E7=B1=BB=E5=9E=8B):=20get=5Ftype=5Fsize=5F?= =?UTF-8?q?bytes=20=E8=A1=A5=E6=B5=AE=E7=82=B9=E4=BD=8D=E5=AE=BD=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B5=AE=E7=82=B9=E6=B3=9B=E5=9E=8B=E5=AE=9E?= =?UTF-8?q?=E5=8F=82=E7=9A=84=20=5F=5Fsizeof=5F=5F=20=E5=B0=BA=E5=AF=B8?= =?UTF-8?q?=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 现象:Test/VectorGenericTest/App/vectortest.vp:32 vector.Vector[CFloat64T] 特化时 vector.vp:12 T.__sizeof__() 报 "NameError: 未定义名称 T(当前泛型上下文: 类型形参 1 个 / 类型实参 1 个)" —— 新增诊断证明上下文是好的(T 能换成 CFloat64T),故问题在 __sizeof__ 快径没接住。 根因:get_type_size_bytes 只用 get_llvm_type_bits 取位宽,而该函数只认整数(Float/Double/Half/FP128 一律返回 0)⇒ 浮点 typedef(CFloat64T 经 map_t_type 已正确解析为 Double)被判"尺寸未知"返回 0 ⇒ CallGenDispatch._tc_h5_sizeof_len_isinst 的尺寸表也不含 CFloat64T(只有 CInt/CDouble/CFloat 等)⇒ 落回"回退 2"把接收者 Name(T) 当实例翻译 → NameError。同文件第 15 行 Vector[CInt] 走整数路径正常,故只有浮点特化暴露(不对称现象由此解释)。 修复:整数位宽为 0 时再取 get_llvm_float_bits(浮点位宽),两者皆 0 才返回 0。 --- App/lib/core/Gen/Type/TypeGenResolve.vp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/App/lib/core/Gen/Type/TypeGenResolve.vp b/App/lib/core/Gen/Type/TypeGenResolve.vp index 4a18bbf..2419d05 100644 --- a/App/lib/core/Gen/Type/TypeGenResolve.vp +++ b/App/lib/core/Gen/Type/TypeGenResolve.vp @@ -1343,6 +1343,15 @@ novirtual class TypeGenResolve(TypeGenBase.TypeGenBase): if ty_sz is None: return 0 bits_sz: int = self.Gen.TypeGenErr.get_llvm_type_bits(ty_sz) + if bits_sz <= 0: + # 浮点类型必须另取浮点位宽:get_llvm_type_bits 只认整数(Float/Double/ + # Half/FP128 一律返回 0),缺这一步会让**浮点** typedef 的尺寸解析恒失败 + # (返回 0)⇒ 调用方(如 __sizeof__ 快径 CallGenDispatch._tc_h5)落回 + # "把接收者 Name(T) 当实例翻译" → "NameError: 未定义名称 'T'"。 + # 现场:Test/VectorGenericTest/App/vectortest.vp:32 + # `vector.Vector[CFloat64T]`(T.__sizeof__(),vector.vp:12)——同文件 + # 第 15 行 Vector[CInt] 走整数路径正常,故只有浮点特化暴露。 + bits_sz = self.Gen.ExprGenBase.get_llvm_float_bits(ty_sz) if bits_sz <= 0: return 0 return bits_sz // 8