Author: george.karpenkov Date: Mon Oct 2 14:01:46 2017 New Revision: 314722
URL: http://llvm.org/viewvc/llvm-project?rev=314722&view=rev Log: [Analyzer] Avoid copy and modifying passed reference in BodyFarm::create_call_once Differential Revision: https://reviews.llvm.org/D38475 Modified: cfe/trunk/lib/Analysis/BodyFarm.cpp Modified: cfe/trunk/lib/Analysis/BodyFarm.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BodyFarm.cpp?rev=314722&r1=314721&r2=314722&view=diff ============================================================================== --- cfe/trunk/lib/Analysis/BodyFarm.cpp (original) +++ cfe/trunk/lib/Analysis/BodyFarm.cpp Mon Oct 2 14:01:46 2017 @@ -257,10 +257,9 @@ NamedDecl *ASTMaker::findMemberField(con typedef Stmt *(*FunctionFarmer)(ASTContext &C, const FunctionDecl *D); -static CallExpr * -create_call_once_funcptr_call(ASTContext &C, ASTMaker M, - const ParmVarDecl *Callback, - SmallVectorImpl<Expr *> &CallArgs) { +static CallExpr *create_call_once_funcptr_call(ASTContext &C, ASTMaker M, + const ParmVarDecl *Callback, + ArrayRef<Expr *> CallArgs) { return new (C) CallExpr( /*ASTContext=*/C, @@ -271,10 +270,10 @@ create_call_once_funcptr_call(ASTContext /*SourceLocation=*/SourceLocation()); } -static CallExpr * -create_call_once_lambda_call(ASTContext &C, ASTMaker M, - const ParmVarDecl *Callback, QualType CallbackType, - SmallVectorImpl<Expr *> &CallArgs) { +static CallExpr *create_call_once_lambda_call(ASTContext &C, ASTMaker M, + const ParmVarDecl *Callback, + QualType CallbackType, + ArrayRef<Expr *> CallArgs) { CXXRecordDecl *CallbackDecl = CallbackType->getAsCXXRecordDecl(); @@ -293,12 +292,6 @@ create_call_once_lambda_call(ASTContext /* T = */ callOperatorDecl->getType(), /* VK = */ VK_LValue); - CallArgs.insert( - CallArgs.begin(), - M.makeDeclRefExpr(Callback, - /* RefersToEnclosingVariableOrCapture= */ true, - /* GetNonReferenceType= */ true)); - return new (C) CXXOperatorCallExpr(/*AstContext=*/C, OO_Call, callOperatorDeclRef, /*args=*/CallArgs, @@ -335,15 +328,24 @@ static Stmt *create_call_once(ASTContext const ParmVarDecl *Callback = D->getParamDecl(1); QualType CallbackType = Callback->getType().getNonReferenceType(); + bool isLambdaCall = CallbackType->getAsCXXRecordDecl() && + CallbackType->getAsCXXRecordDecl()->isLambda(); + SmallVector<Expr *, 5> CallArgs; + if (isLambdaCall) + // Lambda requires callback itself inserted as a first parameter. + CallArgs.push_back( + M.makeDeclRefExpr(Callback, + /* RefersToEnclosingVariableOrCapture= */ true, + /* GetNonReferenceType= */ true)); + // All arguments past first two ones are passed to the callback. for (unsigned int i = 2; i < D->getNumParams(); i++) CallArgs.push_back(M.makeLvalueToRvalue(D->getParamDecl(i))); CallExpr *CallbackCall; - if (CallbackType->getAsCXXRecordDecl() && - CallbackType->getAsCXXRecordDecl()->isLambda()) { + if (isLambdaCall) { CallbackCall = create_call_once_lambda_call(C, M, Callback, CallbackType, CallArgs); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits