diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp index 0fdef7487b981..bb4a39f68280c 100644 --- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp +++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp @@ -435,27 +435,27 @@ static SVal processArgument(SVal Value, const Expr *ArgumentExpr, /// runtime definition don't match in terms of argument and parameter count. static SVal castArgToParamTypeIfNeeded(const CallEvent &Call, unsigned ArgIdx, SVal ArgVal, SValBuilder &SVB) { - const FunctionDecl *RTDecl = - Call.getRuntimeDefinition().getDecl()->getAsFunction(); const auto *CallExprDecl = dyn_cast_or_null(Call.getDecl()); - - if (!RTDecl || !CallExprDecl) + if (!CallExprDecl) return ArgVal; + const FunctionDecl *Definition = CallExprDecl; + Definition->hasBody(Definition); + // The function decl of the Call (in the AST) will not have any parameter // declarations, if it was 'only' declared without a prototype. However, the // engine will find the appropriate runtime definition - basically a // redeclaration, which has a function body (and a function prototype). - if (CallExprDecl->hasPrototype() || !RTDecl->hasPrototype()) + if (CallExprDecl->hasPrototype() || !Definition->hasPrototype()) return ArgVal; // Only do this cast if the number arguments at the callsite matches with // the parameters at the runtime definition. - if (Call.getNumArgs() != RTDecl->getNumParams()) + if (Call.getNumArgs() != Definition->getNumParams()) return UnknownVal(); const Expr *ArgExpr = Call.getArgExpr(ArgIdx); - const ParmVarDecl *Param = RTDecl->getParamDecl(ArgIdx); + const ParmVarDecl *Param = Definition->getParamDecl(ArgIdx); return SVB.evalCast(ArgVal, Param->getType(), ArgExpr->getType()); }