fix(viperc/diag): 节点行号等于函数定义行时也用实参位置兜底(定位到具体表达式)

上一版只在 lineno==0 时用 CurArg 兜底;实测该报错的节点自带行号且恰好等于当前函数定义行
(节点其实是 FunctionDef 本身,构造器内联路径把它传了下来),于是兜底没触发,错误位置与
栈帧都在定义行、被去重合并,看起来只剩一帧。

现把“节点位置不可信”判据放宽为:lineno==0,**或** lineno 等于最内层栈帧的行号(即函数
定义行)→ 两条都优先用 CurArg,报错精确指向调用处的实参表达式(如 `&_on_submit`)。
This commit is contained in:
TermiNexus committed 2026-10-14 17:02:16 +08:00
1 parent 4f45b391ea
commit 40ea5d6513
1 file changed
+9 -3
+9 -3
View File
@@ -49,10 +49,16 @@ novirtual class TypeGenErr(TypeGenBase.TypeGenBase):
if node is not None: lineno = node.lineno
file_name: str = self.Gen.TypeGenResolve.get_current_file()
if file_name is None: file_name = "<unknown>"
# 合成节点无行号时的兜底顺序:
# 报错位置兜底顺序(“节点位置不可信”时):
# ① 正在翻译的实参位置(精确到 `&_on_submit` 这类表达式,见 TypeGenBase.set_cur_arg);
# ② 调用栈最内层有行号的帧(现已随语句推进更新,给出调用点语句)。
if lineno <= 0 and self.Gen.TypeGenBase.CurArgLine > 0:
# ② 调用栈最内层有行号的帧(给出被调函数的定义位置)。
# “节点位置不可信”的两种情形:lineno==0(合成节点);或节点行号恰好等于当前函数定义行
#(节点其实是 FunctionDef 本身,例如构造器内联路径把它传了下来)。
node_at_func_def: int = 0
if lineno > 0 and self.Gen.TypeGenBase.TraceCount > 0:
tfc: GenTypes.TraceFrame* = self.Gen.TypeGenBase._get_trace_frame(self.Gen.TypeGenBase.TraceCount - 1)
if tfc is not None and tfc.lineno > 0 and lineno == tfc.lineno: node_at_func_def = 1
if (lineno <= 0 or node_at_func_def != 0) and self.Gen.TypeGenBase.CurArgLine > 0:
if self.Gen.TypeGenBase.CurArgFile is not None:
file_name = self.Gen.TypeGenBase.CurArgFile
lineno = self.Gen.TypeGenBase.CurArgLine