r211599 - Fix "warning: fallthrough annotation does not directly precede switch label" in lambdas.

Alexander Kornienko alexfh at google.com
Tue Jun 24 08:28:21 PDT 2014


Author: alexfh
Date: Tue Jun 24 10:28:21 2014
New Revision: 211599

URL: http://llvm.org/viewvc/llvm-project?rev=211599&view=rev
Log:
Fix "warning: fallthrough annotation does not directly precede switch label" in lambdas.

Summary: This patch fixes http://llvm.org/PR17864 - "warning: fallthrough annotation does not directly precede switch label" in lambdas.

Reviewers: rsmith

Reviewed By: rsmith

Subscribers: rnk, cfe-commits

Differential Revision: http://reviews.llvm.org/D4258

Modified:
    cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp
    cfe/trunk/test/SemaCXX/switch-implicit-fallthrough.cpp

Modified: cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp?rev=211599&r1=211598&r2=211599&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp (original)
+++ cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp Tue Jun 24 10:28:21 2014
@@ -1025,6 +1025,9 @@ namespace {
     // methods separately.
     bool TraverseDecl(Decl *D) { return true; }
 
+    // We analyze lambda bodies separately. Skip them here.
+    bool TraverseLambdaBody(LambdaExpr *LE) { return true; }
+
   private:
 
     static const AttributedStmt *asFallThroughAttr(const Stmt *S) {

Modified: cfe/trunk/test/SemaCXX/switch-implicit-fallthrough.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/switch-implicit-fallthrough.cpp?rev=211599&r1=211598&r2=211599&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/switch-implicit-fallthrough.cpp (original)
+++ cfe/trunk/test/SemaCXX/switch-implicit-fallthrough.cpp Tue Jun 24 10:28:21 2014
@@ -229,25 +229,6 @@ int fallthrough_covered_enums(Enum e) {
   return n;
 }
 
-int fallthrough_targets(int n) {
-  [[clang::fallthrough]]; // expected-error{{fallthrough annotation is outside switch statement}}
-
-  [[clang::fallthrough]]  // expected-error{{fallthrough attribute is only allowed on empty statements}}
-  switch (n) {
-    case 121:
-      n += 400;
-      [[clang::fallthrough]]; // no warning here, correct target
-    case 123:
-      [[clang::fallthrough]]  // expected-error{{fallthrough attribute is only allowed on empty statements}}
-      n += 800;
-      break;
-    [[clang::fallthrough]]    // expected-error{{fallthrough attribute is only allowed on empty statements}} expected-note{{did you forget ';'?}}
-    case 125:
-      n += 1600;
-  }
-  return n;
-}
-
 // Fallthrough annotations in local classes used to generate "fallthrough
 // annotation does not directly precede switch label" warning.
 void fallthrough_in_local_class() {
@@ -259,12 +240,34 @@ void fallthrough_in_local_class() {
           [[clang::fallthrough]]; // no diagnostics
         case 1:
           x++;
+        default: // \
+            expected-warning{{unannotated fall-through between switch labels}} \
+            expected-note{{insert 'break;' to avoid fall-through}}
           break;
       }
     }
   };
 }
 
+// Fallthrough annotations in lambdas used to generate "fallthrough
+// annotation does not directly precede switch label" warning.
+void fallthrough_in_lambda() {
+  (void)[] {
+    int x = 0;
+    switch (x) {
+    case 0:
+      x++;
+      [[clang::fallthrough]]; // no diagnostics
+    case 1:
+      x++;
+    default: // \
+        expected-warning{{unannotated fall-through between switch labels}} \
+        expected-note{{insert 'break;' to avoid fall-through}}
+      break;
+    }
+  };
+}
+
 namespace PR18983 {
   void fatal() __attribute__((noreturn));
   int num();
@@ -278,3 +281,22 @@ namespace PR18983 {
     }
   }
 }
+
+int fallthrough_targets(int n) {
+  [[clang::fallthrough]]; // expected-error{{fallthrough annotation is outside switch statement}}
+
+  [[clang::fallthrough]]  // expected-error{{fallthrough attribute is only allowed on empty statements}}
+  switch (n) {
+    case 121:
+      n += 400;
+      [[clang::fallthrough]]; // no warning here, correct target
+    case 123:
+      [[clang::fallthrough]]  // expected-error{{fallthrough attribute is only allowed on empty statements}}
+      n += 800;
+      break;
+    [[clang::fallthrough]]    // expected-error{{fallthrough attribute is only allowed on empty statements}} expected-note{{did you forget ';'?}}
+    case 125:
+      n += 1600;
+  }
+  return n;
+}





More information about the cfe-commits mailing list