fix(类型): get_type_size_bytes 补浮点位宽,修复浮点泛型实参的 __sizeof__ 尺寸解析

现象: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。
This commit is contained in:
TermiNexus committed 2026-10-03 16:50:42 +08:00
1 parent 3a4323e288
commit ddb1e6cc2a
1 file changed
+9
+9
View File
@@ -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