fix(CallGenBase): struct 字面量字段链表节点误注解 Function* → ParamNode*(Vipeye 922/927)
事实:includes/llvmlite/__types.vp 里 new_param_node -> rawptr[ParamNode]、paramnode_set_next(node: rawptr[ParamNode], nxt: rawptr[ParamNode])、Struct(fields: rawptr[ParamNode], ...),而本处 th_st/tt_st/en_st 被注解成 llvmlite.Function*(Function 与 ParamNode 是不相关类)⇒ 严格指针规则下这两处实参传递被判「struct↔struct 隐式转换已禁止」。 修法:把注解改成真实类型 llvmlite.ParamNode*(不需要、也不应该 t.CPtr 强转——变量本来就是 ParamNode,强转只是把类型错误重新掩盖)。
This commit is contained in:
1 parent
9c427aa548
commit
4807012bd8
1 file changed
+7
-3
@@ -898,8 +898,12 @@ novirtual class CallGenBase:
|
||||
|
||||
# struct 字面量 {T1, T2, ...}(tuple 打包返回类型)必须在 * 检查之前,否则内含 * 会被误判为 i8*(破坏 tuple 解包)
|
||||
if s < e and buf[s] == '{':
|
||||
th_st: llvmlite.Function* = None
|
||||
tt_st: llvmlite.Function* = None
|
||||
# 字段链表节点必须是 llvmlite.ParamNode(new_param_node 返回 rawptr[ParamNode],
|
||||
# paramnode_set_next / Struct 的形参也都是 rawptr[ParamNode])。原先误注解为
|
||||
# Function*(与 ParamNode 是不相关类),严格指针规则下这两处的实参传递会被判
|
||||
# 「struct↔struct 隐式转换已禁止」;改注解即根治,不需要也不应该加强转。
|
||||
th_st: llvmlite.ParamNode* = None
|
||||
tt_st: llvmlite.ParamNode* = None
|
||||
tc_st: int = 0
|
||||
ps_st: sizet = s + 1
|
||||
while ps_st < e and buf[ps_st] != '}':
|
||||
@@ -914,7 +918,7 @@ novirtual class CallGenBase:
|
||||
if ee_st > es_st:
|
||||
et_st: llvmlite.LLVMType* = self._ParseLLVMRetTyStr(pool, buf, es_st, ee_st)
|
||||
if et_st is None: return None
|
||||
en_st: llvmlite.Function* = llvmlite.new_param_node(pool, et_st)
|
||||
en_st: llvmlite.ParamNode* = llvmlite.new_param_node(pool, et_st)
|
||||
if en_st is None: return None
|
||||
if th_st is None:
|
||||
th_st = en_st
|
||||
|
||||
Reference in new issue
Block a user