diff options
| author | Ted Kremenek <kremenek@apple.com> | 2010-09-23 05:14:51 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2010-09-23 05:14:51 +0000 |
| commit | fd5856adcbe76c4ba45da309703793d0dbd84565 (patch) | |
| tree | 8ff4a0835d6f3db52426053075821f481709565c /clang/lib/Checker/GRExprEngine.cpp | |
| parent | 1fae17a8e5bfbb5219d4370505739b4a8dc19d11 (diff) | |
| download | bcm5719-llvm-fd5856adcbe76c4ba45da309703793d0dbd84565.tar.gz bcm5719-llvm-fd5856adcbe76c4ba45da309703793d0dbd84565.zip | |
Refactor GRExprEngine::VisitCall() to use EvalArguments(), just like VisitCXXMemberCallExpr(). Ideally we should unify these code paths as much as possible, since they only differ by a few details.
llvm-svn: 114628
Diffstat (limited to 'clang/lib/Checker/GRExprEngine.cpp')
| -rw-r--r-- | clang/lib/Checker/GRExprEngine.cpp | 37 |
1 files changed, 2 insertions, 35 deletions
diff --git a/clang/lib/Checker/GRExprEngine.cpp b/clang/lib/Checker/GRExprEngine.cpp index 35f043f5cd8..9c1eef23b5b 100644 --- a/clang/lib/Checker/GRExprEngine.cpp +++ b/clang/lib/Checker/GRExprEngine.cpp @@ -2078,41 +2078,9 @@ void GRExprEngine::VisitCall(const CallExpr* CE, ExplodedNode* Pred, if (const PointerType *FnTypePtr = FnType->getAs<PointerType>()) Proto = FnTypePtr->getPointeeType()->getAs<FunctionProtoType>(); - // Create a worklist to process the arguments. - llvm::SmallVector<CallExprWLItem, 20> WorkList; - WorkList.reserve(AE - AI); - WorkList.push_back(CallExprWLItem(AI, Pred)); - + // Evaluate the arguments. ExplodedNodeSet ArgsEvaluated; - - while (!WorkList.empty()) { - CallExprWLItem Item = WorkList.back(); - WorkList.pop_back(); - - if (Item.I == AE) { - ArgsEvaluated.insert(Item.N); - continue; - } - - // Evaluate the argument. - ExplodedNodeSet Tmp; - const unsigned ParamIdx = Item.I - AI; - - bool VisitAsLvalue = false; - if (Proto && ParamIdx < Proto->getNumArgs()) - VisitAsLvalue = Proto->getArgType(ParamIdx)->isReferenceType(); - - if (VisitAsLvalue) - VisitLValue(*Item.I, Item.N, Tmp); - else - Visit(*Item.I, Item.N, Tmp); - - // Enqueue evaluating the next argument on the worklist. - ++(Item.I); - - for (ExplodedNodeSet::iterator NI=Tmp.begin(), NE=Tmp.end(); NI!=NE; ++NI) - WorkList.push_back(CallExprWLItem(Item.I, *NI)); - } + EvalArguments(CE->arg_begin(), CE->arg_end(), Proto, Pred, ArgsEvaluated); // Now process the call itself. ExplodedNodeSet DstTmp; @@ -2131,7 +2099,6 @@ void GRExprEngine::VisitCall(const CallExpr* CE, ExplodedNode* Pred, // to see if the can evaluate the function call. ExplodedNodeSet DstTmp3; - for (ExplodedNodeSet::iterator DI = DstTmp.begin(), DE = DstTmp.end(); DI != DE; ++DI) { |

