summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2012-08-28 20:52:21 +0000
committerJordan Rose <jordan_rose@apple.com>2012-08-28 20:52:21 +0000
commit8d48938bf38988fd4271cb3064b3f2ab80dd401e (patch)
tree49b08a5c542bf7edb720178238ab8b9875436b15
parent2be6e30d960c26532828760bfb07eea5023074a2 (diff)
downloadbcm5719-llvm-8d48938bf38988fd4271cb3064b3f2ab80dd401e.tar.gz
bcm5719-llvm-8d48938bf38988fd4271cb3064b3f2ab80dd401e.zip
[analyzer] Teach CallEventManager that CXXTemporaryObjectExpr is also a ctor.
Specifically, CallEventManager::getCaller was looking at the call site for an inlined call and trying to see what kind of call it was, but it only checked for CXXConstructExprClass. (It's not using an isa<> here to avoid doing three more checks on the the statement class.) This caused an unreachable when we actually did inline the constructor of a temporary object. PR13717 llvm-svn: 162792
-rw-r--r--clang/lib/StaticAnalyzer/Core/CallEvent.cpp3
-rw-r--r--clang/test/Analysis/inline.cpp17
2 files changed, 19 insertions, 1 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
index 1f86945fb34..32a66c3b270 100644
--- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
@@ -841,7 +841,8 @@ CallEventManager::getCaller(const StackFrameContext *CalleeCtx,
return getSimpleCall(CE, State, CallerCtx);
switch (CallSite->getStmtClass()) {
- case Stmt::CXXConstructExprClass: {
+ case Stmt::CXXConstructExprClass:
+ case Stmt::CXXTemporaryObjectExprClass: {
SValBuilder &SVB = State->getStateManager().getSValBuilder();
const CXXMethodDecl *Ctor = cast<CXXMethodDecl>(CalleeCtx->getDecl());
Loc ThisPtr = SVB.getCXXThis(Ctor, CalleeCtx);
diff --git a/clang/test/Analysis/inline.cpp b/clang/test/Analysis/inline.cpp
index 573b1647a33..26b1035c062 100644
--- a/clang/test/Analysis/inline.cpp
+++ b/clang/test/Analysis/inline.cpp
@@ -267,3 +267,20 @@ namespace OperatorNew {
clang_analyzer_eval(obj->value == 42); // expected-warning{{UNKNOWN}}
}
}
+
+namespace TemporaryConstructor {
+ class BoolWrapper {
+ public:
+ BoolWrapper() {
+ clang_analyzer_checkInlined(true); // expected-warning{{TRUE}}
+ value = true;
+ }
+ bool value;
+ };
+
+ void test() {
+ // PR13717 - Don't crash when a CXXTemporaryObjectExpr is inlined.
+ if (BoolWrapper().value)
+ return;
+ }
+}
OpenPOWER on IntegriCloud