diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-08-31 18:47:34 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-08-31 18:47:34 +0000 |
commit | 128d04dfe8f0ea84f6df3caa56ad3507fd87bf2c (patch) | |
tree | a2c963a1bc21e9d05cb43166e5ee0675c4180e04 | |
parent | e2295f1c806ff123b223028cbb92aa73fd4b67ae (diff) | |
download | bcm5719-llvm-128d04dfe8f0ea84f6df3caa56ad3507fd87bf2c.tar.gz bcm5719-llvm-128d04dfe8f0ea84f6df3caa56ad3507fd87bf2c.zip |
Explicitly handle CXXOperatorCallExpr when building CFGs. We should treat it the same as CallExprs.
Fixes: <rdar://problem/8375510> [Boost] CFGBuilder crash in Boost.Graph
llvm-svn: 112618
-rw-r--r-- | clang/lib/Analysis/CFG.cpp | 3 | ||||
-rw-r--r-- | clang/test/Analysis/misc-ps-region-store.cpp | 11 |
2 files changed, 13 insertions, 1 deletions
diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index 78979a4feeb..562763b8b45 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -370,6 +370,7 @@ tryAgain: return VisitBreakStmt(cast<BreakStmt>(S)); case Stmt::CallExprClass: + case Stmt::CXXOperatorCallExprClass: return VisitCallExpr(cast<CallExpr>(S), asc); case Stmt::CaseStmtClass: @@ -393,7 +394,7 @@ tryAgain: case Stmt::CXXExprWithTemporariesClass: { // FIXME: Handle temporaries. For now, just visit the subexpression // so we don't artificially create extra blocks. - return Visit(cast<CXXExprWithTemporaries>(S)->getSubExpr()); + return Visit(cast<CXXExprWithTemporaries>(S)->getSubExpr(), asc); } case Stmt::CXXMemberCallExprClass: diff --git a/clang/test/Analysis/misc-ps-region-store.cpp b/clang/test/Analysis/misc-ps-region-store.cpp index baaa2f6cbd0..bfa5e5cbb9b 100644 --- a/clang/test/Analysis/misc-ps-region-store.cpp +++ b/clang/test/Analysis/misc-ps-region-store.cpp @@ -148,3 +148,14 @@ void pr7675_test() { *p = 0xDEADBEEF; // expected-warning{{null pointer}} } +// <rdar://problem/8375510> - CFGBuilder should handle temporaries. +struct R8375510 { + R8375510(); + ~R8375510(); + R8375510 operator++(int); +}; + +int r8375510(R8375510 x, R8375510 y) { + for (; ; x++) { } +} + |