fix(gi): 模块级负浮点字面量按浮点初始化(不再送整型提取器) - 修 double = -100.0 报错
This commit is contained in:
1 parent
d06e665ebd
commit
6196bdfe56
1 file changed
+24
-4
@@ -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
|
||||
|
||||
Reference in new issue
Block a user