fix(global): external 声明升级用 initializer 判空(llvmlite.ir 无 is_declaration 属性)

上次修复用 getattr(g, 'is_declaration') 判断声明态,但该属性仅在
llvmlite.binding 层存在,ir.GlobalVariable 没有 -> 恒 False -> 升级不生效,
_g_gen 依旧无定义。改用 initializer is None 判断(external 声明必无
initializer;已定义全局必有),验证 common + null initializer 可设。
This commit is contained in:
TermiNexus committed 2026-08-20 07:53:33 +08:00
1 parent c904fac54d
commit 015d5c38ea
1 file changed
+3 -1
+3 -1
View File
@@ -1488,7 +1488,9 @@ class AssignHandle(BaseHandle):
# 应升级为 common 定义(多模块同名合并为零值,对齐 None 语义),
# 而非静默跳过。
existing_gv = Gen.module.globals.get(VarName) if VarName in Gen.module.globals else None
if isinstance(existing_gv, ir.GlobalVariable) and getattr(existing_gv, 'is_declaration', False):
# 注:llvmlite.ir.GlobalVariable 无 is_declaration 属性(binding 层才有),
# 声明/定义靠 initializer 区分:external 声明 initializer 恒为 None。
if isinstance(existing_gv, ir.GlobalVariable) and getattr(existing_gv, 'initializer', None) is None:
try:
existing_gv.linkage = 'common'
if Node.value is None or (isinstance(Node.value, ast.Constant) and Node.value.value is None):