summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2014-03-08 02:22:32 +0000
committerTed Kremenek <kremenek@apple.com>2014-03-08 02:22:32 +0000
commitefea63450bae24c08e53d4f599a6d7e776a54605 (patch)
tree6a122445861908ec6a21bb7475ee0d9c51f90ce2
parentfcc1417fad167a945596e41cf5f3cdc8c96ee686 (diff)
downloadbcm5719-llvm-efea63450bae24c08e53d4f599a6d7e776a54605.tar.gz
bcm5719-llvm-efea63450bae24c08e53d4f599a6d7e776a54605.zip
[-Wunreachabe-code] Don't warn about unreachable destructors for temporaries.
This can possibly be refined later, but right now the experience is so incomprehensible for a user to understand what is going on this isn't a useful warning. llvm-svn: 203336
-rw-r--r--clang/lib/Analysis/ReachableCode.cpp8
-rw-r--r--clang/test/SemaCXX/warn-unreachable.cpp13
2 files changed, 18 insertions, 3 deletions
diff --git a/clang/lib/Analysis/ReachableCode.cpp b/clang/lib/Analysis/ReachableCode.cpp
index 5d74156092c..9191958399b 100644
--- a/clang/lib/Analysis/ReachableCode.cpp
+++ b/clang/lib/Analysis/ReachableCode.cpp
@@ -397,9 +397,11 @@ const Stmt *DeadCodeScan::findDeadCode(const clang::CFGBlock *Block) {
}
if (CFGTerminator T = Block->getTerminator()) {
- const Stmt *S = T.getStmt();
- if (isValidDeadStmt(S))
- return S;
+ if (!T.isTemporaryDtorsBranch()) {
+ const Stmt *S = T.getStmt();
+ if (isValidDeadStmt(S))
+ return S;
+ }
}
return 0;
diff --git a/clang/test/SemaCXX/warn-unreachable.cpp b/clang/test/SemaCXX/warn-unreachable.cpp
index 8c191f6fadc..0b7af0b1f44 100644
--- a/clang/test/SemaCXX/warn-unreachable.cpp
+++ b/clang/test/SemaCXX/warn-unreachable.cpp
@@ -162,3 +162,16 @@ int test_global_as_conditionVariable() {
return 0; // no-warning
}
+// Handle unreachable temporary destructors.
+class A {
+public:
+ A();
+ ~A();
+};
+
+__attribute__((noreturn))
+void raze(const A& x);
+
+void test_with_unreachable_tmp_dtors(int x) {
+ raze(x ? A() : A()); // no-warning
+}
OpenPOWER on IntegriCloud