[LLVMbugs] [Bug 18259] New: -Wimplicit-fallthrough gets confused by a non-case label in a switch

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Sun Dec 15 17:17:14 PST 2013


http://llvm.org/bugs/show_bug.cgi?id=18259

            Bug ID: 18259
           Summary: -Wimplicit-fallthrough gets confused by a non-case
                    label in a switch
           Product: clang
           Version: trunk
          Hardware: PC
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++11
          Assignee: unassignedclangbugs at nondot.org
          Reporter: nicolasweber at gmx.de
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified

This doesn't warn but probably should:

Nicos-MacBook-Pro:clang thakis$ cat test3.cc 
int main(int argc, char*argv[]) {
  switch (argc) {
    case 4:
      argc += 4;

mylabel:
    default:
      break;
  }
}
Nicos-MacBook-Pro:clang thakis$ ../../Release+Asserts/bin/clang -std=c++11
-Wimplicit-fallthrough test3.cc 



This seems to fix this and not break any other tests as far as I can tell, but
I'm not sure if it's the right fix:

Nicos-MacBook-Pro:clang thakis$ svn diff lib/Sema/AnalysisBasedWarnings.cpp 
Index: lib/Sema/AnalysisBasedWarnings.cpp
===================================================================
--- lib/Sema/AnalysisBasedWarnings.cpp    (revision 197300)
+++ lib/Sema/AnalysisBasedWarnings.cpp    (working copy)
@@ -786,8 +786,12 @@
           continue; // Previous case label has no statements, good.

         const LabelStmt *L = dyn_cast_or_null<LabelStmt>(P->getLabel());
-        if (L && L->getSubStmt() == B.getLabel() && P->begin() == P->end())
-          continue; // Case label is preceded with a normal label, good.
+        if (L && L->getSubStmt() == B.getLabel() && P->begin() == P->end()) {
+          // Case label is preceded by a normal label, keep looking.
+          std::copy(P->pred_begin(), P->pred_end(),
+                    std::back_inserter(BlockQueue));
+          continue;
+        }

         if (!ReachableBlocks.count(P)) {
           for (CFGBlock::const_reverse_iterator ElemIt = P->rbegin(),

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20131216/e03f81b2/attachment.html>


More information about the llvm-bugs mailing list