fix(gi): 模块级负浮点字面量按浮点初始化(不再送整型提取器) - 修 double = -100.0 报错

This commit is contained in:
TermiNexus committed 2026-10-16 00:03:21 +08:00
1 parent d06e665ebd
commit 6196bdfe56
1 file changed
+24 -4
+24 -4
View File
@@ -610,8 +610,18 @@ novirtual class TranslatorGenMixin:
init_sym_node = uop_g.operand
init_kind = 5
else:
init_val = self.Gen.AssignGen.extract_cdefine_int_value(aa.value)
init_kind = 1
# 负浮点字面量 `-100.0` = UnaryOp(USub, Constant(float)):按**浮点初始化**
# 处理(init_kind=4,值稍后从源码重读,故负号会被保留);
# 否则会被送进整型常量提取器 ⇒ TypeError: CDefine value extraction failed。
is_neg_f: int = 0
if uop_g.op == ast.OpKind.USub and uop_g.operand is not None and uop_g.operand.kind() == ast.ASTKind.Constant:
opf_d: ast.Constant* = ast.Constant*(uop_g.operand)
if opf_d.const_kind == ast.CONST_FLOAT: is_neg_f = 1
if is_neg_f != 0:
init_kind = 4
else:
init_val = self.Gen.AssignGen.extract_cdefine_int_value(aa.value)
init_kind = 1
elif val_kind == ast.ASTKind.List:
init_list_node = ast.List*(aa.value)
init_kind = 2
@@ -648,8 +658,18 @@ novirtual class TranslatorGenMixin:
init_sym_node = uop_g2.operand
init_kind = 5
else:
init_val = self.Gen.AssignGen.extract_cdefine_int_value(asgn.value)
init_kind = 1
# 同 AnnAssign 分支:负浮点字面量按**浮点初始化**处理;无注解时还要把类型
# 推断为 double(否则默认 i32),否则 value 会被送进整型常量提取器 ⇒ fatal。
is_neg_f2: int = 0
if uop_g2.op == ast.OpKind.USub and uop_g2.operand is not None and uop_g2.operand.kind() == ast.ASTKind.Constant:
opf_d2: ast.Constant* = ast.Constant*(uop_g2.operand)
if opf_d2.const_kind == ast.CONST_FLOAT: is_neg_f2 = 1
if is_neg_f2 != 0:
init_kind = 4
var_ty = mlirlite.Double(pool)
else:
init_val = self.Gen.AssignGen.extract_cdefine_int_value(asgn.value)
init_kind = 1
elif val_kind2 == ast.ASTKind.List:
init_list_node = ast.List*(asgn.value)
init_kind = 2