diff options
author | Ted Kremenek <kremenek@apple.com> | 2014-03-08 02:22:32 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2014-03-08 02:22:32 +0000 |
commit | efea63450bae24c08e53d4f599a6d7e776a54605 (patch) | |
tree | 6a122445861908ec6a21bb7475ee0d9c51f90ce2 | |
parent | fcc1417fad167a945596e41cf5f3cdc8c96ee686 (diff) | |
download | bcm5719-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.cpp | 8 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-unreachable.cpp | 13 |
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 +} |