gimplify.c (should_warn_for_implicit_fallthrough): Check for FALLTHROUGH_LABEL_P...
authorMarek Polacek <polacek@redhat.com>
Fri, 7 Oct 2016 12:44:54 +0000 (12:44 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Fri, 7 Oct 2016 12:44:54 +0000 (12:44 +0000)
* gimplify.c (should_warn_for_implicit_fallthrough): Check for
FALLTHROUGH_LABEL_P here...
(warn_implicit_fallthrough_r): ...not here.

* c-c++-common/Wimplicit-fallthrough-22.c: New test.

From-SVN: r240864

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/Wimplicit-fallthrough-22.c [new file with mode: 0644]

index e4f5198a029b0bf7f613db2335a94cc28eb99b84..efc6ae51cccb71ac3e33be64f84346402afb7202 100644 (file)
@@ -1,3 +1,9 @@
+2016-10-07  Marek Polacek  <polacek@redhat.com>
+
+       * gimplify.c (should_warn_for_implicit_fallthrough): Check for
+       FALLTHROUGH_LABEL_P here...
+       (warn_implicit_fallthrough_r): ...not here.
+
 2016-10-07  Bernd Schmidt  <bschmidt@redhat.com>
 
        PR tree-optimization/77880
index a60d9471c68a9e0cb8b5bfa5890a6cb97622efbe..2266333442aaac60f0d75a5fe45cc5f93a6da2e8 100644 (file)
@@ -1819,6 +1819,10 @@ should_warn_for_implicit_fallthrough (gimple_stmt_iterator *gsi_p, tree label)
 {
   gimple_stmt_iterator gsi = *gsi_p;
 
+  /* Don't warn if the label is marked with a "falls through" comment.  */
+  if (FALLTHROUGH_LABEL_P (label))
+    return false;
+
   /* Don't warn for a non-case label followed by a statement:
        case 0:
         foo ();
@@ -1905,7 +1909,6 @@ warn_implicit_fallthrough_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
        if (gimple_code (next) == GIMPLE_LABEL
            && gimple_has_location (next)
            && (label = gimple_label_label (as_a <glabel *> (next)))
-           && !FALLTHROUGH_LABEL_P (label)
            && prev != NULL)
          {
            struct label_entry *l;
index f8769a7421c44bffe21b22070beec450bcd39965..89e9df8d05ce9d023cc0cedc62b604d58f473f90 100644 (file)
@@ -1,3 +1,7 @@
+2016-10-07  Marek Polacek  <polacek@redhat.com>
+
+       * c-c++-common/Wimplicit-fallthrough-22.c: New test.
+
 2016-10-07  Bernd Schmidt  <bschmidt@redhat.com>
 
        PR c++/69733
diff --git a/gcc/testsuite/c-c++-common/Wimplicit-fallthrough-22.c b/gcc/testsuite/c-c++-common/Wimplicit-fallthrough-22.c
new file mode 100644 (file)
index 0000000..f7d86fa
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-Wimplicit-fallthrough" } */
+
+void bar (int);
+
+void
+foo (int i)
+{
+  switch (i)
+    {
+    case 1:
+      bar (1);
+      /* FALLTHROUGH */
+    case 2:
+      bar (2); /* { dg-warning "statement may fall through" } */
+    case 3:
+      bar (3); /* { dg-warning "statement may fall through" } */
+    case 4:
+      bar (4);
+    default:
+      break;
+    }
+}