aboutsummaryrefslogtreecommitdiff
path: root/lib/Checker/GRCXXExprEngine.cpp
diff options
context:
space:
mode:
authorMarcin Swiderski <marcin.sfider@gmail.com>2010-11-17 21:27:36 +0000
committerMarcin Swiderski <marcin.sfider@gmail.com>2010-11-17 21:27:36 +0000
commit82c63bfa0c5130e0cf274c1974b6157ebefc04fe (patch)
treef07e70e627cf84c0df0f29608ca76d818ea1bc8b /lib/Checker/GRCXXExprEngine.cpp
parent7f6458b7e265d1870f3bd5be2b49bc4d368446b3 (diff)
In EvalArguments allow for evaluation of first argument always as a lvalue. Will be used for CXXOperatorCallExpr that represents method call.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119567 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Checker/GRCXXExprEngine.cpp')
-rw-r--r--lib/Checker/GRCXXExprEngine.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/lib/Checker/GRCXXExprEngine.cpp b/lib/Checker/GRCXXExprEngine.cpp
index 50f2cb51c0..4c996bb22e 100644
--- a/lib/Checker/GRCXXExprEngine.cpp
+++ b/lib/Checker/GRCXXExprEngine.cpp
@@ -30,7 +30,8 @@ public:
void GRExprEngine::EvalArguments(ConstExprIterator AI, ConstExprIterator AE,
const FunctionProtoType *FnType,
- ExplodedNode *Pred, ExplodedNodeSet &Dst) {
+ ExplodedNode *Pred, ExplodedNodeSet &Dst,
+ bool FstArgAsLValue) {
llvm::SmallVector<CallExprWLItem, 20> WorkList;
@@ -48,10 +49,15 @@ void GRExprEngine::EvalArguments(ConstExprIterator AI, ConstExprIterator AE,
// Evaluate the argument.
ExplodedNodeSet Tmp;
- const unsigned ParamIdx = Item.I - AI;
- const bool VisitAsLvalue = FnType && ParamIdx < FnType->getNumArgs()
- ? FnType->getArgType(ParamIdx)->isReferenceType()
- : false;
+ bool VisitAsLvalue = FstArgAsLValue;
+ if (FstArgAsLValue) {
+ FstArgAsLValue = false;
+ } else {
+ const unsigned ParamIdx = Item.I - AI;
+ VisitAsLvalue = FnType && ParamIdx < FnType->getNumArgs()
+ ? FnType->getArgType(ParamIdx)->isReferenceType()
+ : false;
+ }
if (VisitAsLvalue)
VisitLValue(*Item.I, Item.N, Tmp);