]> granicus.if.org Git - clang/commitdiff
[-Wunreachable-code] Handle idiomatic do...while() with an uninteresting condition.
authorTed Kremenek <kremenek@apple.com>
Thu, 6 Mar 2014 01:09:45 +0000 (01:09 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 6 Mar 2014 01:09:45 +0000 (01:09 +0000)
Sometimes do..while() is used to create a scope that can be left early.
In such cases, the unreachable 'while()' test is not usually interesting
unless it actually does something that is observable.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203051 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ReachableCode.cpp
test/Sema/warn-unreachable.c
test/SemaCXX/unreachable-code.cpp

index 9f6792e2cc72209b77a1243af2c8a493506f83f7..8b192d2d61260813b8bc8874595b280045f058ef 100644 (file)
@@ -312,7 +312,8 @@ static bool isTrivialReturnOrDoWhile(const CFGBlock *B, const Stmt *S) {
         return true;
   }
 
-
+  if (B->pred_size() != 1)
+    return false;
 
   // Look to see if the block ends with a 'return', and see if 'S'
   // is a substatement.  The 'return' may not be the last element in
@@ -324,15 +325,11 @@ static bool isTrivialReturnOrDoWhile(const CFGBlock *B, const Stmt *S) {
       if (const ReturnStmt *RS = dyn_cast<ReturnStmt>(CS->getStmt())) {
         const Expr *RE = RS->getRetValue();
         if (RE && RE->IgnoreParenCasts() == Ex)
-          break;
+          return bodyEndsWithNoReturn(*B->pred_begin());
       }
-      return false;
+      break;
     }
   }
-
-  if (B->pred_size() == 1)
-    return bodyEndsWithNoReturn(*B->pred_begin());
-
   return false;
 }
 
index bf1e9137eb2d5a4fea70c4c829fa2ace687f9af1..fe47e4c6b70c27b2e80942b143d74190a9a7e250 100644 (file)
@@ -209,9 +209,10 @@ MyEnum trivial_dead_return_enum_2(int x) {
     case 1: return 1;
     case 2: return 2;
     case 3: return 3;
+    default: return 4;
   }
 
-  return 2; // no-warning
+  return 2; // expected-warning {{will never be executed}}
 }
 
 MyEnum nontrivial_dead_return_enum_2(int x) {
index 743290e1b9e55884e27b5e38c8fb196f123184bb..b6b8ab42093ece98d60dfa4ca5ca7d6ba1b30c31 100644 (file)
@@ -1,7 +1,7 @@
 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -Wunreachable-code -fblocks -verify %s
 
 int j;
-void bar() { }
+int bar();
 int test1() {
   for (int i = 0;
        i != 10;
@@ -11,7 +11,19 @@ int test1() {
       return 1;
   }
   return 0;
-  return 1;    // expected-warning {{will never be executed}}
+  return 1; // expected-warning {{will never be executed}}
+}
+
+int test1_B() {
+  for (int i = 0;
+       i != 10;
+       ++i) {  // expected-warning {{will never be executed}}
+    if (j == 23) // missing {}'s
+      bar();
+      return 1;
+  }
+  return 0;
+  return bar(); // expected-warning {{will never be executed}}
 }
 
 void test2(int i) {