diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-02-19 01:08:41 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-02-19 01:08:41 +0000 |
commit | e34245b30b1d0af7089a9249f110e74d24ebfdcc (patch) | |
tree | 13f209fe09a8586430a8b4c277332e6bc0b540a6 | |
parent | 1227f3afca6e4d919aaf47c7f24a039730658e4a (diff) | |
download | bcm5719-llvm-e34245b30b1d0af7089a9249f110e74d24ebfdcc.tar.gz bcm5719-llvm-e34245b30b1d0af7089a9249f110e74d24ebfdcc.zip |
[analyzer] Fix crash when analyzing C++ code.
llvm-svn: 126007
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/Environment.cpp | 4 | ||||
-rw-r--r-- | clang/test/Analysis/cxx-crashes.cpp | 4 |
2 files changed, 5 insertions, 3 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/Environment.cpp b/clang/lib/StaticAnalyzer/Core/Environment.cpp index a0a93c68a3b..33f1945ce75 100644 --- a/clang/lib/StaticAnalyzer/Core/Environment.cpp +++ b/clang/lib/StaticAnalyzer/Core/Environment.cpp @@ -56,6 +56,7 @@ SVal Environment::getSVal(const Stmt *E, SValBuilder& svalBuilder) const { return svalBuilder.makeIntVal(cast<IntegerLiteral>(E)); } case Stmt::ImplicitCastExprClass: + case Stmt::CXXFunctionalCastExprClass: case Stmt::CStyleCastExprClass: { // We blast through no-op casts to get the descendant // subexpression that has a value. @@ -75,9 +76,6 @@ SVal Environment::getSVal(const Stmt *E, SValBuilder& svalBuilder) 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: break; diff --git a/clang/test/Analysis/cxx-crashes.cpp b/clang/test/Analysis/cxx-crashes.cpp index db2298df891..c15eea862e7 100644 --- a/clang/test/Analysis/cxx-crashes.cpp +++ b/clang/test/Analysis/cxx-crashes.cpp @@ -6,6 +6,10 @@ int f1(char *dst) { return !(q >= p); } +long f2(char *c) { + return long(c) & 1; +} + namespace { struct A { }; |