summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-02-19 01:08:41 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-02-19 01:08:41 +0000
commite34245b30b1d0af7089a9249f110e74d24ebfdcc (patch)
tree13f209fe09a8586430a8b4c277332e6bc0b540a6
parent1227f3afca6e4d919aaf47c7f24a039730658e4a (diff)
downloadbcm5719-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.cpp4
-rw-r--r--clang/test/Analysis/cxx-crashes.cpp4
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 { };
OpenPOWER on IntegriCloud