Make more bad uses of fallthrough attribute into pedwarns.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 21 Nov 2019 20:29:40 +0000 (20:29 +0000)
committerJoseph Myers <jsm28@gcc.gnu.org>
Thu, 21 Nov 2019 20:29:40 +0000 (20:29 +0000)
Various bad uses of the [[fallthrough]] attribute are constraint
violations in C2x, so need pedwarns rather than warnings.

This patch duly turns the relevant warnings into pedwarns.  The
relevant code is not specific to C, and does not know which form the
attribute was given in ([[fallthrough]] or [[gnu::fallthrough]] or
__attribute__((fallthrough))), but as I understand it these usages are
also erroneous for C++ and it seems reasonable to give a pedwarn here
even when a form other than [[fallthrough]] is being used.

The precise meaning of the standard wording about "The next statement
that would be executed" seems a but unclear in some corner cases; the
tests added keep to cases where it is clear whether or not the next
statement executed is of the required form.

Bootstrapped with no regressions for x86_64-pc-linux-gnu.

gcc:
* gimplify.c (expand_FALLTHROUGH_r, expand_FALLTHROUGH): Use
pedwarn instead of warning_at for fallthrough not preceding a case
or default label.

gcc/c-family:
* c-attribs.c (handle_fallthrough_attribute): Use pedwarn instead
of warning.

gcc/testsuite:
* gcc.dg/c2x-attr-fallthrough-6.c: New test.  Split out from
c2x-attr-fallthrough-3.c.
* gcc.dg/c2x-attr-fallthrough-1.c: Add more tests.
* gcc.dg/c2x-attr-fallthrough-2.c: Update expected diagnostics.
* gcc.dg/c2x-attr-fallthrough-3.c: Split inside-switch part of
test out to c2x-attr-fallthrough-6.c.

From-SVN: r278599

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-attribs.c
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/c2x-attr-fallthrough-1.c
gcc/testsuite/gcc.dg/c2x-attr-fallthrough-2.c
gcc/testsuite/gcc.dg/c2x-attr-fallthrough-3.c
gcc/testsuite/gcc.dg/c2x-attr-fallthrough-6.c [new file with mode: 0644]

index ab7779297995c5dfb22488d303365b5b16c9192a..2ccdedb5611ee71e9169968d48e5b8eec145d882 100644 (file)
@@ -1,3 +1,9 @@
+2019-11-21  Joseph Myers  <joseph@codesourcery.com>
+
+       * gimplify.c (expand_FALLTHROUGH_r, expand_FALLTHROUGH): Use
+       pedwarn instead of warning_at for fallthrough not preceding a case
+       or default label.
+
 2019-11-22  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
 
        PR tree-optimization/92608
index e1b437bf92ed50a32d7c5f504d08539ebd92e79b..b1dc0bb121297162780c20279b7c397acc6d123b 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-21  Joseph Myers  <joseph@codesourcery.com>
+
+       * c-attribs.c (handle_fallthrough_attribute): Use pedwarn instead
+       of warning.
+
 2019-11-19  Joseph Myers  <joseph@codesourcery.com>
 
        * c-common.c (attribute_fallthrough_p): In C, use pedwarn not
index 4a59cdff8361057a94884365cdf4052c866fbac0..b727f6605fb21d9fc2062dae228300009c9b1450 100644 (file)
@@ -4117,7 +4117,7 @@ tree
 handle_fallthrough_attribute (tree *, tree name, tree, int,
                              bool *no_add_attrs)
 {
-  warning (OPT_Wattributes, "%qE attribute ignored", name);
+  pedwarn (input_location, OPT_Wattributes, "%qE attribute ignored", name);
   *no_add_attrs = true;
   return NULL_TREE;
 }
index 0bbd475b3dd1b37f3333b8268661d487c60d64fb..da6566903e07b57ddba12384542b6a2c720caa74 100644 (file)
@@ -2405,8 +2405,8 @@ expand_FALLTHROUGH_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
              gsi_next (&gsi2);
            }
          if (!found)
-           warning_at (loc, 0, "attribute %<fallthrough%> not preceding "
-                       "a case label or default label");
+           pedwarn (loc, 0, "attribute %<fallthrough%> not preceding "
+                    "a case label or default label");
        }
       break;
     default:
@@ -2428,8 +2428,8 @@ expand_FALLTHROUGH (gimple_seq *seq_p)
   if (wi.callback_result == integer_zero_node)
     /* We've found [[fallthrough]]; at the end of a switch, which the C++
        standard says is ill-formed; see [dcl.attr.fallthrough].  */
-    warning_at (loc, 0, "attribute %<fallthrough%> not preceding "
-               "a case label or default label");
+    pedwarn (loc, 0, "attribute %<fallthrough%> not preceding "
+            "a case label or default label");
 }
 
 \f
index 48bf697be0e9c044371ae8ad0e989e3568b3cf57..a3d3e73568ec63ec3c72765f1247027c2669017e 100644 (file)
@@ -1,3 +1,12 @@
+2019-11-21  Joseph Myers  <joseph@codesourcery.com>
+
+       * gcc.dg/c2x-attr-fallthrough-6.c: New test.  Split out from
+       c2x-attr-fallthrough-3.c.
+       * gcc.dg/c2x-attr-fallthrough-1.c: Add more tests.
+       * gcc.dg/c2x-attr-fallthrough-2.c: Update expected diagnostics.
+       * gcc.dg/c2x-attr-fallthrough-3.c: Split inside-switch part of
+       test out to c2x-attr-fallthrough-6.c.
+
 2019-11-22  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
 
        PR tree-optimization/92608
index c0d9031cb9759f663d11d8a0ce4acee927ad3b11..60fe11da82818dae28cc2a1ec29ad5d1c90c75af 100644 (file)
@@ -3,7 +3,7 @@
 /* { dg-options "-std=c2x -pedantic-errors -Wextra" } */
 
 int
-f (int a)
+f (int a, int c)
 {
   int b = 2;
   switch (a)
@@ -22,6 +22,21 @@ f (int a)
     case 5:
       b += 1;
       break;
+    case 6:
+      if (c == 2)
+       {
+         [[fallthrough]];
+       }
+      else
+       {
+         [[fallthrough]];
+       }
+    case 7:
+      b += 3;
+      [[fallthrough]];
+    default:
+      b += 8;
+      break;
     }
   return b;
 }
index 0e36adccc9eed068d03c67e3c998fc81f0cc502a..9d6995938cd6d5fefe72390f1a6f0b196843a1fd 100644 (file)
@@ -15,7 +15,8 @@ int z = sizeof (int [[fallthrough]]); /* { dg-error "ignored" } */
 int
 f (int a)
 {
-  [[fallthrough]] int b = 2; /* { dg-warning "not followed by|ignored" } */
+  [[fallthrough]] int b = 2; /* { dg-warning "not followed by" } */
+  /* { dg-error "ignored" "ignored" { target *-*-* } .-1 } */
   switch (a)
     {
     case 1:
index 66fe820c315273e97a46553e14cfd6f54530fcc5..714d0af947bd227f6cecd594989bfa48b51d4743 100644 (file)
@@ -1,5 +1,5 @@
 /* Test C2x attribute syntax.  Invalid use of fallthrough attribute
-   outside switch or in bad context inside switch.  */
+   outside switch.  */
 /* { dg-do compile } */
 /* { dg-options "-std=c2x -pedantic-errors -Wextra" } */
 
@@ -7,12 +7,5 @@ int
 f (int a)
 {
   [[fallthrough]]; /* { dg-error "invalid use of attribute 'fallthrough'" } */
-  switch (a)
-    {
-    case 1:
-      a++;
-      [[fallthrough]]; /* { dg-warning "attribute 'fallthrough' not preceding a case label or default label" } */
-      a++;
-    }
   return a;
 }
diff --git a/gcc/testsuite/gcc.dg/c2x-attr-fallthrough-6.c b/gcc/testsuite/gcc.dg/c2x-attr-fallthrough-6.c
new file mode 100644 (file)
index 0000000..aa7ff4c
--- /dev/null
@@ -0,0 +1,18 @@
+/* Test C2x attribute syntax.  Invalid use of fallthrough attribute in
+   bad context inside switch.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2x -pedantic-errors -Wextra" } */
+
+int
+f (int a)
+{
+  switch (a)
+    {
+    case 1:
+      a++;
+      [[fallthrough]]; /* { dg-error "attribute 'fallthrough' not preceding a case label or default label" } */
+      a++;
+      [[fallthrough]]; /* { dg-error "attribute 'fallthrough' not preceding a case label or default label" } */
+    }
+  return a;
+}