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