@@ -494,8 +494,10 @@ class ConsumedStmtVisitor : public ConstStmtVisitor<ConsumedStmtVisitor> {
494494 void checkCallability (const PropagationInfo &PInfo,
495495 const FunctionDecl *FunDecl,
496496 SourceLocation BlameLoc);
497- bool handleCall (const CallExpr *Call, const Expr *ObjArg,
498- const FunctionDecl *FunD);
497+
498+ using ArgRange = llvm::iterator_range<CallExpr::const_arg_iterator>;
499+ bool handleCall (const Expr *Call, const Expr *ObjArg,
500+ ArgRange args, const FunctionDecl *FunD);
499501
500502 void VisitBinaryOperator (const BinaryOperator *BinOp);
501503 void VisitCallExpr (const CallExpr *Call);
@@ -608,22 +610,21 @@ void ConsumedStmtVisitor::checkCallability(const PropagationInfo &PInfo,
608610// Factors out common behavior for function, method, and operator calls.
609611// Check parameters and set parameter state if necessary.
610612// Returns true if the state of ObjArg is set, or false otherwise.
611- bool ConsumedStmtVisitor::handleCall (const CallExpr *Call, const Expr *ObjArg,
613+ bool ConsumedStmtVisitor::handleCall (const Expr *Call,
614+ const Expr *ObjArg,
615+ ArgRange Args,
612616 const FunctionDecl *FunD) {
613- unsigned Offset = 0 ;
614- if (isa<CXXOperatorCallExpr>(Call) && isa<CXXMethodDecl>(FunD))
615- Offset = 1 ; // first argument is 'this'
616-
617617 // check explicit parameters
618- for (unsigned Index = Offset; Index < Call->getNumArgs (); ++Index) {
618+ unsigned Index = 0 ;
619+ for (const Expr *Arg : Args) {
619620 // Skip variable argument lists.
620- if (Index - Offset >= FunD->getNumParams ())
621+ if (Index >= FunD->getNumParams ())
621622 break ;
622623
623- const ParmVarDecl *Param = FunD->getParamDecl (Index - Offset );
624+ const ParmVarDecl *Param = FunD->getParamDecl (Index++ );
624625 QualType ParamType = Param->getType ();
625626
626- InfoEntry Entry = findInfo (Call-> getArg (Index) );
627+ InfoEntry Entry = findInfo (Arg );
627628
628629 if (Entry == PropagationMap.end () || Entry->second .isTest ())
629630 continue ;
@@ -636,7 +637,7 @@ bool ConsumedStmtVisitor::handleCall(const CallExpr *Call, const Expr *ObjArg,
636637
637638 if (ParamState != ExpectedState)
638639 Analyzer.WarningsHandler .warnParamTypestateMismatch (
639- Call-> getArg (Index) ->getExprLoc (),
640+ Arg ->getExprLoc (),
640641 stateToString (ExpectedState), stateToString (ParamState));
641642 }
642643
@@ -749,7 +750,7 @@ void ConsumedStmtVisitor::VisitCallExpr(const CallExpr *Call) {
749750 return ;
750751 }
751752
752- handleCall (Call, nullptr , FunDecl);
753+ handleCall (Call, nullptr , Call-> arguments (), FunDecl);
753754 propagateReturnType (Call, FunDecl);
754755}
755756
@@ -805,26 +806,28 @@ void ConsumedStmtVisitor::VisitCXXMemberCallExpr(
805806 if (!MD)
806807 return ;
807808
808- handleCall (Call, Call->getImplicitObjectArgument (), MD);
809+ handleCall (Call, Call->getImplicitObjectArgument (), Call-> arguments (), MD);
809810 propagateReturnType (Call, MD);
810811}
811812
812813void ConsumedStmtVisitor::VisitCXXOperatorCallExpr (
813814 const CXXOperatorCallExpr *Call) {
814815 const auto *FunDecl = dyn_cast_or_null<FunctionDecl>(Call->getDirectCallee ());
815816 if (!FunDecl) return ;
817+ ArgRange Args = Call->arguments ();
816818
817819 if (Call->getOperator () == OO_Equal) {
818- ConsumedState CS = getInfo (Call->getArg (1 ));
819- if (!handleCall (Call, Call->getArg (0 ), FunDecl))
820- setInfo (Call->getArg (0 ), CS);
820+ ConsumedState CS = getInfo (llvm::index (Args, 1 ));
821+ if (!handleCall (Call, llvm::index (Args, 0 ), llvm::drop_begin (Args, 1 ),
822+ FunDecl))
823+ setInfo (llvm::index (Args, 0 ), CS);
821824 return ;
822825 }
823826
824- if (const auto *MCall = dyn_cast<CXXMemberCallExpr>(Call ))
825- handleCall (MCall, MCall-> getImplicitObjectArgument ( ), FunDecl);
827+ if (isa<CXXMethodDecl>(FunDecl ))
828+ handleCall (Call, llvm::index (Args, 0 ), llvm::drop_begin (Args, 1 ), FunDecl);
826829 else
827- handleCall (Call, Call-> getArg ( 0 ) , FunDecl);
830+ handleCall (Call, nullptr , Args , FunDecl);
828831
829832 propagateReturnType (Call, FunDecl);
830833}
0 commit comments