]> granicus.if.org Git - clang/commitdiff
[-Wunreachable-code] Handle 'return' with no argument dominated by 'noreturn' function.
authorTed Kremenek <kremenek@apple.com>
Sat, 8 Mar 2014 02:22:23 +0000 (02:22 +0000)
committerTed Kremenek <kremenek@apple.com>
Sat, 8 Mar 2014 02:22:23 +0000 (02:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203333 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 47f8f2b90cd37e488dd77601db1a71e5cb3360ac..5d74156092c3204b760a126050add8df92f6bb46 100644 (file)
@@ -132,10 +132,8 @@ static bool isTrivialExpression(const Expr *Ex) {
 
 static bool isTrivialReturnOrDoWhile(const CFGBlock *B, const Stmt *S) {
   const Expr *Ex = dyn_cast<Expr>(S);
-  if (!Ex)
-    return false;
 
-  if (!isTrivialExpression(Ex))
+  if (Ex && !isTrivialExpression(Ex))
     return false;
 
   // Check if the block ends with a do...while() and see if 'S' is the
@@ -152,13 +150,20 @@ static bool isTrivialReturnOrDoWhile(const CFGBlock *B, const Stmt *S) {
   // 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
   // the block because of destructors.
-  assert(!B->empty());
   for (CFGBlock::const_reverse_iterator I = B->rbegin(), E = B->rend();
        I != E; ++I) {
     if (Optional<CFGStmt> CS = I->getAs<CFGStmt>()) {
       if (const ReturnStmt *RS = dyn_cast<ReturnStmt>(CS->getStmt())) {
-        const Expr *RE = RS->getRetValue();
-        if (RE && stripExprSugar(RE->IgnoreParenCasts()) == Ex)
+        bool LookAtBody = false;
+        if (RS == S)
+          LookAtBody = true;
+        else {
+          const Expr *RE = RS->getRetValue();
+          if (RE && stripExprSugar(RE->IgnoreParenCasts()) == Ex)
+            LookAtBody = true;
+        }
+
+        if (LookAtBody)
           return bodyEndsWithNoReturn(*B->pred_begin());
       }
       break;
index f32134bbdb1eea196d947e46624b705d5bdf5880..2334c3738136506dcaa6d806f9ac019e04efe26b 100644 (file)
@@ -199,6 +199,11 @@ int trivial_dead_return() {
   return ((0)); // no-warning
 }
 
+void trivial_dead_return_void() {
+  raze();
+  return; // no-warning
+}
+
 MyEnum trival_dead_return_enum() {
   raze();
   return Value1; // no-warning