]> granicus.if.org Git - clang/commitdiff
[Analysis] -Wunreachable-code shouldn't fire on the increment of a foreach loop
authorSam McCall <sam.mccall@gmail.com>
Fri, 15 Feb 2019 07:16:11 +0000 (07:16 +0000)
committerSam McCall <sam.mccall@gmail.com>
Fri, 15 Feb 2019 07:16:11 +0000 (07:16 +0000)
Summary:
The idea is that the code here isn't written, so doesn't indicate a bug.
Similar to code expanded from macros.

This means the warning no longer fires on this code:
  for (auto C : collection) {
    process(C);
    return;
  }
  handleEmptyCollection();
Unclear whether this is more often a bug or not in practice, I think it's a
reasonable idiom in some cases.
Either way, if we want to warn on "loop that doesn't loop", I think it should be
a separate warning, and catch `while(1) break;`

Reviewers: ilya-biryukov, ioeric

Subscribers: cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D58134

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

lib/Analysis/ReachableCode.cpp
test/SemaCXX/unreachable-code.cpp

index cc64efa7f07fbdf106fac5dab8f2709c4bb79479..6f1814deb00b687852dc6b102953043522e9e0de 100644 (file)
@@ -631,6 +631,10 @@ void DeadCodeScan::reportDeadCode(const CFGBlock *B,
     // a for/for-range loop.  This is the block that contains
     // the increment code.
     if (const Stmt *LoopTarget = B->getLoopTarget()) {
+      // The increment on a foreach statement is not written.
+      if (isa<CXXForRangeStmt>(LoopTarget))
+        return;
+
       SourceLocation Loc = LoopTarget->getBeginLoc();
       SourceRange R1(Loc, Loc), R2;
 
index fd006c099e7dc6b07a7e8efa0b3445b34bd85827..61805837dc29bbbf54d21773548adce424455191 100644 (file)
@@ -52,6 +52,11 @@ void test3() {
   }
 }
 
+void test4() {
+  for (char c : "abc") // no-warning
+    break;
+}
+
 // PR 6130 - Don't warn about bogus unreachable code with throw's and
 // temporary objects.
 class PR6130 {