diff options
| -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 +} |

