From 40ea5d65136beb37fbd3d081110d68a57b96ae2b Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 14 Oct 2026 17:02:16 +0800 Subject: [PATCH] =?UTF-8?q?fix(viperc/diag):=20=E8=8A=82=E7=82=B9=E8=A1=8C?= =?UTF-8?q?=E5=8F=B7=E7=AD=89=E4=BA=8E=E5=87=BD=E6=95=B0=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E8=A1=8C=E6=97=B6=E4=B9=9F=E7=94=A8=E5=AE=9E=E5=8F=82=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E5=85=9C=E5=BA=95=EF=BC=88=E5=AE=9A=E4=BD=8D=E5=88=B0?= =?UTF-8?q?=E5=85=B7=E4=BD=93=E8=A1=A8=E8=BE=BE=E5=BC=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上一版只在 lineno==0 时用 CurArg 兜底;实测该报错的节点自带行号且恰好等于当前函数定义行 (节点其实是 FunctionDef 本身,构造器内联路径把它传了下来),于是兜底没触发,错误位置与 栈帧都在定义行、被去重合并,看起来只剩一帧。 现把“节点位置不可信”判据放宽为:lineno==0,**或** lineno 等于最内层栈帧的行号(即函数 定义行)→ 两条都优先用 CurArg,报错精确指向调用处的实参表达式(如 `&_on_submit`)。 --- App/lib/core/Gen/Type/TypeGenErr.vp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/App/lib/core/Gen/Type/TypeGenErr.vp b/App/lib/core/Gen/Type/TypeGenErr.vp index 0e4e710..b7066ab 100644 --- a/App/lib/core/Gen/Type/TypeGenErr.vp +++ b/App/lib/core/Gen/Type/TypeGenErr.vp @@ -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 = "" - # 合成节点无行号时的兜底顺序: + # 报错位置兜底顺序(“节点位置不可信”时): # ① 正在翻译的实参位置(精确到 `&_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