summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2014-03-20 18:47:53 +0000
committerTed Kremenek <kremenek@apple.com>2014-03-20 18:47:53 +0000
commitd4576318b4d79761af02ab932c55b2963ef4aae3 (patch)
tree5ba86ea3e61fa70fdb3a981d84eccb82ff2393a4
parent3d84c96dd3b9a8a41bc39397e8dd544408234a32 (diff)
downloadbcm5719-llvm-d4576318b4d79761af02ab932c55b2963ef4aae3.tar.gz
bcm5719-llvm-d4576318b4d79761af02ab932c55b2963ef4aae3.zip
[-Wunreachable-code] Tweak isTrivialDoWhile() to handle implicit casts.
llvm-svn: 204376
-rw-r--r--clang/lib/Analysis/ReachableCode.cpp2
-rw-r--r--clang/test/SemaCXX/warn-unreachable.cpp8
2 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/Analysis/ReachableCode.cpp b/clang/lib/Analysis/ReachableCode.cpp
index 0a9e82bb0ad..4220000cd33 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 7f74732a630..eab8d8e6b97 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);
OpenPOWER on IntegriCloud