diff --git a/lib/core/Handles/HandlesExprCall.py b/lib/core/Handles/HandlesExprCall.py index 052c010..0da4df0 100644 --- a/lib/core/Handles/HandlesExprCall.py +++ b/lib/core/Handles/HandlesExprCall.py @@ -1036,10 +1036,11 @@ class ExprCallHandle(BaseHandle): mangled_name = Gen._mangle_func_name(FuncAttr, ModulePath if ModulePath and ModulePath != 't' else None) if Gen._has_function(mangled_name): CallArgs = [] - for arg in Node.args: - ArgVal = self.HandleExprLlvm(arg) - if ArgVal: - CallArgs.append(ArgVal) + for ArgIdx, arg in enumerate(Node.args, start=1): + # 禁止静默丢弃求值为空的实参(会导致后续整体前移一格, + # 报出与真因无关的类型不匹配,见 _RequireArgValue 说明) + CallArgs.append(self._RequireArgValue( + self.HandleExprLlvm(arg), FuncAttr, ArgIdx, arg, Node)) return Gen.builder.call(Gen._get_function(mangled_name), CallArgs, name=f"call_{FuncAttr}") if MethodResult is None or IsZeroResult: imported = getattr(self.Trans, '_ImportedModules', set()) @@ -1083,10 +1084,10 @@ class ExprCallHandle(BaseHandle): fallback_func = Gen._find_function(FuncAttr) if fallback_func is not None: CallArgs = [] - for arg in Node.args: - ArgVal = self.HandleExprLlvm(arg) - if ArgVal: - CallArgs.append(ArgVal) + for ArgIdx, arg in enumerate(Node.args, start=1): + # 同 1039:禁止静默丢弃(会导致后续前移一格) + CallArgs.append(self._RequireArgValue( + self.HandleExprLlvm(arg), FuncAttr, ArgIdx, arg, Node)) self._append_eh_msg_out_arg(CallArgs, fallback_func, Gen) result = Gen.builder.call(fallback_func, CallArgs, name=f"call_{FuncAttr}") return self._check_eh_return(result, FuncAttr, Gen, called_func=fallback_func) @@ -1107,10 +1108,10 @@ class ExprCallHandle(BaseHandle): decl_name = stub_mangled if stub_mangled in getattr(self.Trans.ImportHandler, '_stub_func_cache', {}) else FuncAttr func_decl = self.GetOrCreateStubFuncDecl(decl_name, stub_func_type, Gen, alias=FuncAttr) CallArgs = [] - for arg in Node.args: - ArgVal = self.HandleExprLlvm(arg) - if ArgVal: - CallArgs.append(ArgVal) + for ArgIdx, arg in enumerate(Node.args, start=1): + # 同 1039:禁止静默丢弃(会导致后续前移一格) + CallArgs.append(self._RequireArgValue( + self.HandleExprLlvm(arg), FuncAttr, ArgIdx, arg, Node)) self._append_eh_msg_out_arg(CallArgs, func_decl, Gen) result = Gen.builder.call(func_decl, CallArgs, name=f"call_{FuncAttr}") return self._check_eh_return(result, FuncAttr, Gen, called_func=func_decl) @@ -3356,10 +3357,13 @@ class ExprCallHandle(BaseHandle): _ptypes: list[ir.Type] = func.function_type.args if func is not None else [] for _ai, arg in enumerate(Node.args): _pt: ir.Type | None = _ptypes[_ai] if _ai < len(_ptypes) else None - ArgVal = self.HandleExprLlvm( - arg, ConstWidthHint=DefineUseWidthFromLLVMType(_pt)) - if ArgVal: - CallArgs.append(ArgVal) + # 不再 `if ArgVal: append`(实参求值为空会被静默丢弃 ⇒ 后续整体 + # 前移一格 ⇒ 由 _adjust_args 报出与真因无关的类型不匹配,见 + # _RequireArgValue 的说明)。 + CallArgs.append(self._RequireArgValue( + self.HandleExprLlvm( + arg, ConstWidthHint=DefineUseWidthFromLLVMType(_pt)), + mangled_name, _ai + 1, arg, Node)) self._fill_default_args(CallArgs, func, MethodName) func_ft = getattr(func, 'function_type', None) is_variadic = getattr(func_ft, 'var_arg', False) if func_ft else False @@ -3415,10 +3419,11 @@ class ExprCallHandle(BaseHandle): _ptypes: list[ir.Type] = _mf.function_type.args for _ai, arg in enumerate(Node.args): _pt: ir.Type | None = _ptypes[_ai] if _ai < len(_ptypes) else None - ArgVal = self.HandleExprLlvm( - arg, ConstWidthHint=DefineUseWidthFromLLVMType(_pt)) - if ArgVal: - CallArgs.append(ArgVal) + # 同 3357:禁止静默丢弃求值为空的实参(会导致后续前移一格) + CallArgs.append(self._RequireArgValue( + self.HandleExprLlvm( + arg, ConstWidthHint=DefineUseWidthFromLLVMType(_pt)), + MethodName, _ai + 1, arg, Node)) func = _mf self._fill_default_args(CallArgs, func, MethodName) func_ft = getattr(func, 'function_type', None) @@ -3484,10 +3489,11 @@ class ExprCallHandle(BaseHandle): _ptypes: list[ir.Type] = func.function_type.args if func is not None else [] for _ai, arg in enumerate(Node.args): _pt: ir.Type | None = _ptypes[_ai] if _ai < len(_ptypes) else None - ArgVal = self.HandleExprLlvm( - arg, ConstWidthHint=DefineUseWidthFromLLVMType(_pt)) - if ArgVal: - CallArgs.append(ArgVal) + # 同 3357:禁止静默丢弃求值为空的实参(会导致后续前移一格) + CallArgs.append(self._RequireArgValue( + self.HandleExprLlvm( + arg, ConstWidthHint=DefineUseWidthFromLLVMType(_pt)), + mangled_name, _ai + 1, arg, Node)) self._fill_default_args(CallArgs, func, mangled_name) self._append_eh_msg_out_arg(CallArgs, func, Gen) CallArgs = Gen._apply_auto_addr(mangled_name, CallArgs) @@ -3497,10 +3503,10 @@ class ExprCallHandle(BaseHandle): return result return ir.Constant(ir.IntType(32), 0) CallArgs = [] - for arg in Node.args: - ArgVal = self.HandleExprLlvm(arg) - if ArgVal: - CallArgs.append(ArgVal) + for _ai, arg in enumerate(Node.args): + # 同 3357:禁止静默丢弃求值为空的实参(会导致后续整体前移一格) + CallArgs.append(self._RequireArgValue( + self.HandleExprLlvm(arg), self._ExprText(Node.func), _ai + 1, arg, Node)) ClassName = None if isinstance(Node.func.value, ast.Name): ClassName = Gen.var_struct_class.get(Node.func.value.id)