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:
1 parent
3a4323e288
commit
ddb1e6cc2a
1 file changed
+9
@@ -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
|
||||
|
||||
Reference in new issue
Block a user