summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2010-11-25 03:18:57 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2010-11-25 03:18:57 +0000
commit33f13595c90c69e8e4938200f7777df5930b8880 (patch)
tree9bff791619a5aa48e8112e53b674f3eb59b60aa6
parent7514633c2665048fa7797152b69bea7d149ee821 (diff)
downloadbcm5719-llvm-33f13595c90c69e8e4938200f7777df5930b8880.tar.gz
bcm5719-llvm-33f13595c90c69e8e4938200f7777df5930b8880.zip
handle CXXFunctionalCastExpr in visitLValue and Environment.
llvm-svn: 120143
-rw-r--r--clang/lib/Checker/Environment.cpp4
-rw-r--r--clang/lib/Checker/GRExprEngine.cpp12
-rw-r--r--clang/test/Analysis/method-call.cpp11
3 files changed, 27 insertions, 0 deletions
diff --git a/clang/lib/Checker/Environment.cpp b/clang/lib/Checker/Environment.cpp
index b09cb9d6040..798f9ba9dac 100644
--- a/clang/lib/Checker/Environment.cpp
+++ b/clang/lib/Checker/Environment.cpp
@@ -78,6 +78,10 @@ SVal Environment::GetSVal(const Stmt *E, ValueManager& ValMgr) const {
case Stmt::CXXBindTemporaryExprClass:
E = cast<CXXBindTemporaryExpr>(E)->getSubExpr();
continue;
+
+ case Stmt::CXXFunctionalCastExprClass:
+ E = cast<CXXFunctionalCastExpr>(E)->getSubExpr();
+ continue;
// Handle all other Stmt* using a lookup.
default:
diff --git a/clang/lib/Checker/GRExprEngine.cpp b/clang/lib/Checker/GRExprEngine.cpp
index 2181b705f76..6db8dbab7d8 100644
--- a/clang/lib/Checker/GRExprEngine.cpp
+++ b/clang/lib/Checker/GRExprEngine.cpp
@@ -1158,6 +1158,18 @@ void GRExprEngine::VisitLValue(const Expr* Ex, ExplodedNode* Pred,
break;
}
+ case Stmt::CXXConstructExprClass: {
+ const CXXConstructExpr *expr = cast<CXXConstructExpr>(Ex);
+ VisitCXXConstructExpr(expr, 0, Pred, Dst, true);
+ break;
+ }
+
+ case Stmt::CXXFunctionalCastExprClass: {
+ const CXXFunctionalCastExpr *expr = cast<CXXFunctionalCastExpr>(Ex);
+ VisitLValue(expr->getSubExpr(), Pred, Dst);
+ break;
+ }
+
case Stmt::CXXTemporaryObjectExprClass: {
const CXXTemporaryObjectExpr *expr = cast<CXXTemporaryObjectExpr>(Ex);
VisitCXXTemporaryObjectExpr(expr, Pred, Dst, true);
diff --git a/clang/test/Analysis/method-call.cpp b/clang/test/Analysis/method-call.cpp
index 6cfbda895de..8c6b9da0f40 100644
--- a/clang/test/Analysis/method-call.cpp
+++ b/clang/test/Analysis/method-call.cpp
@@ -17,3 +17,14 @@ void f1() {
}
}
+void f2() {
+ const A &x = A(3);
+ if (x.getx() == 3) {
+ int *p = 0;
+ *p = 3; // expected-warning{{Dereference of null pointer}}
+ } else {
+ int *p = 0;
+ *p = 3; // no-warning
+ }
+}
+
OpenPOWER on IntegriCloud