diff options
-rw-r--r-- | clang/lib/Analysis/ReachableCode.cpp | 2 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-unreachable.cpp | 8 |
2 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/Analysis/ReachableCode.cpp b/clang/lib/Analysis/ReachableCode.cpp index 0a9e82b..4220000 100644 --- a/clang/lib/Analysis/ReachableCode.cpp +++ b/clang/lib/Analysis/ReachableCode.cpp @@ -51,7 +51,7 @@ static bool isTrivialDoWhile(const CFGBlock *B, const Stmt *S) { // condition. if (const Stmt *Term = B->getTerminator()) { if (const DoStmt *DS = dyn_cast<DoStmt>(Term)) { - const Expr *Cond = DS->getCond(); + const Expr *Cond = DS->getCond()->IgnoreParenCasts(); return Cond == S && isTrivialExpression(Cond); } } diff --git a/clang/test/SemaCXX/warn-unreachable.cpp b/clang/test/SemaCXX/warn-unreachable.cpp index 7f74732..eab8d8e6 100644 --- a/clang/test/SemaCXX/warn-unreachable.cpp +++ b/clang/test/SemaCXX/warn-unreachable.cpp @@ -218,6 +218,14 @@ int test_treat_non_const_bool_local_as_non_config_value() { return 0; } +void test_do_while(int x) { + // Handle trivial expressions with + // implicit casts to bool. + do { + break; + } while (0); // no-warning +} + class Frobozz { public: Frobozz(int x); |