Improve checks on C2x fallthrough attribute.
authorJoseph Myers <joseph@codesourcery.com>
Fri, 15 Nov 2019 01:33:37 +0000 (01:33 +0000)
committerJoseph Myers <jsm28@gcc.gnu.org>
Fri, 15 Nov 2019 01:33:37 +0000 (01:33 +0000)
When adding C2x attribute support, some [[fallthrough]] support
appeared as a side-effect because of code for that attribute going
through separate paths from the normal attribute handling.

However, going through those paths without the normal attribute
handlers meant that certain checks, such as for the invalid usage
[[fallthrough()]], did not operate.  This patch improves checks by
adding this attribute to the standard attribute table, so that the
parser knows it expects no arguments, along with adding an explicit
check for "[[fallthrough]];" attribute-declarations at top level.  As
with other attributes, there are still cases where warnings should be
pedwarns because C2x constraints are violated, but this patch improves
the attribute handling.

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

gcc/c:
* c-decl.c (std_attribute_table): Add fallthrough.
* c-parser.c (c_parser_declaration_or_fndef): Diagnose fallthrough
attribute at top level.

gcc/c-family:
* c-attribs.c (handle_fallthrough_attribute): Remove static.
* c-common.h (handle_fallthrough_attribute): Declare.

gcc/testsuite:
* gcc.dg/c2x-attr-fallthrough-2.c,
gcc.dg/c2x-attr-fallthrough-3.c: New tests.

From-SVN: r278273

gcc/c-family/ChangeLog
gcc/c-family/c-attribs.c
gcc/c-family/c-common.h
gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/c/c-parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/c2x-attr-fallthrough-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c2x-attr-fallthrough-3.c [new file with mode: 0644]

index 571cf2bc1b7523293ca208cbb2b0d99eac51fdea..c7420f647d808ca48ea27a703a5017cd73607730 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-15  Joseph Myers  <joseph@codesourcery.com>
+
+       * c-attribs.c (handle_fallthrough_attribute): Remove static.
+       * c-common.h (handle_fallthrough_attribute): Declare.
+
 2019-11-15  Joseph Myers  <joseph@codesourcery.com>
 
        * c-attribs.c (handle_deprecated_attribute): Remove static.
index 18b829f47fe594e5d84dfd5a5e10e90c9af9441f..4a59cdff8361057a94884365cdf4052c866fbac0 100644 (file)
@@ -144,7 +144,6 @@ static tree handle_simd_attribute (tree *, tree, tree, int, bool *);
 static tree handle_omp_declare_target_attribute (tree *, tree, tree, int,
                                                 bool *);
 static tree handle_designated_init_attribute (tree *, tree, tree, int, bool *);
-static tree handle_fallthrough_attribute (tree *, tree, tree, int, bool *);
 static tree handle_patchable_function_entry_attribute (tree *, tree, tree,
                                                       int, bool *);
 static tree handle_copy_attribute (tree *, tree, tree, int, bool *);
@@ -4114,7 +4113,7 @@ handle_designated_init_attribute (tree *node, tree name, tree, int,
 /* Handle a "fallthrough" attribute; arguments as in struct
    attribute_spec.handler.  */
 
-static tree
+tree
 handle_fallthrough_attribute (tree *, tree name, tree, int,
                              bool *no_add_attrs)
 {
index ad40c15d92fdfa238a17b308fcc1b2690ff24ad6..f3478d39bebac901d634a6c2240d83e84c9b3359 100644 (file)
@@ -1359,6 +1359,7 @@ extern void warn_for_multistatement_macros (location_t, location_t,
 extern bool attribute_takes_identifier_p (const_tree);
 extern tree handle_deprecated_attribute (tree *, tree, tree, int, bool *);
 extern tree handle_unused_attribute (tree *, tree, tree, int, bool *);
+extern tree handle_fallthrough_attribute (tree *, tree, tree, int, bool *);
 extern int parse_tm_stmt_attr (tree, int);
 extern int tm_attr_to_mask (tree);
 extern tree tm_mask_to_attr (int);
index fdc915329c83c1e6adebaa3d572eaa35f905ea58..c2cab579838b9718192fe074b0473ce94e7db2a9 100644 (file)
@@ -1,3 +1,9 @@
+2019-11-15  Joseph Myers  <joseph@codesourcery.com>
+
+       * c-decl.c (std_attribute_table): Add fallthrough.
+       * c-parser.c (c_parser_declaration_or_fndef): Diagnose fallthrough
+       attribute at top level.
+
 2019-11-15  Joseph Myers  <joseph@codesourcery.com>
 
        * c-decl.c (std_attribute_table): New.
index a7f7c69678850d79ae7edd241d572fc291a543c2..98b71ea620bcbd5bda58505c019ff6cb47c9d91b 100644 (file)
@@ -4343,6 +4343,8 @@ const struct attribute_spec std_attribute_table[] =
        affects_type_identity, handler, exclude } */
   { "deprecated", 0, 1, false, false, false, false,
     handle_deprecated_attribute, NULL },
+  { "fallthrough", 0, 0, false, false, false, false,
+    handle_fallthrough_attribute, NULL },
   { NULL, 0, 0, false, false, false, false, NULL, NULL }
 };
 
index 721158a2c3e979113faf735dbdb39c7703a0f90a..5b290bf7567cdb8b9eaae619c6c57b1cbcfeda2b 100644 (file)
@@ -1927,9 +1927,15 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok,
        {
          if (fallthru_attr_p != NULL)
            *fallthru_attr_p = true;
-         tree fn = build_call_expr_internal_loc (here, IFN_FALLTHROUGH,
-                                                 void_type_node, 0);
-         add_stmt (fn);
+         if (nested)
+           {
+             tree fn = build_call_expr_internal_loc (here, IFN_FALLTHROUGH,
+                                                     void_type_node, 0);
+             add_stmt (fn);
+           }
+         else
+           pedwarn (here, OPT_Wattributes,
+                    "%<fallthrough%> attribute at top level");
        }
       else if (empty_ok && !(have_attrs
                             && specs->non_std_attrs_seen_p))
index 17494d02032f4fba61300e2d27a3f5d82acdfeaf..8c6f891480426d29be6a140d763d80da1cea40b7 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-15  Joseph Myers  <joseph@codesourcery.com>
+
+       * gcc.dg/c2x-attr-fallthrough-2.c,
+       gcc.dg/c2x-attr-fallthrough-3.c: New tests.
+
 2019-11-15  Joseph Myers  <joseph@codesourcery.com>
 
        * gcc.dg/c2x-attr-deprecated-1.c, gcc.dg/c2x-attr-deprecated-2.c,
diff --git a/gcc/testsuite/gcc.dg/c2x-attr-fallthrough-2.c b/gcc/testsuite/gcc.dg/c2x-attr-fallthrough-2.c
new file mode 100644 (file)
index 0000000..e396a60
--- /dev/null
@@ -0,0 +1,35 @@
+/* Test C2x attribute syntax.  Invalid use of fallthrough attribute.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2x -pedantic-errors -Wextra" } */
+
+[[fallthrough]]; /* { dg-error "'fallthrough' attribute at top level" } */
+
+int [[fallthrough]] x; /* { dg-warning "ignored" } */
+/* { dg-message "that appertains to a type-specifier" "appertains" { target *-*-* } .-1 } */
+
+int g () [[fallthrough]]; /* { dg-warning "ignored" } */
+/* { dg-message "that appertains to a type-specifier" "appertains" { target *-*-* } .-1 } */
+
+int
+f (int a)
+{
+  [[fallthrough]] int b = 2; /* { dg-warning "not followed by|ignored" } */
+  switch (a)
+    {
+    case 1:
+      b = 1; /* { dg-warning "may fall through" } */
+    case 2:
+      b = 2; /* { dg-warning "may fall through" } */
+      [[fallthrough()]]; /* { dg-error "does not take any arguments" } */
+    case 3:
+      b += 7;
+      break;
+    case 4:
+      b = 4; /* { dg-warning "may fall through" } */
+      [[fallthrough(1)]]; /* { dg-error "does not take any arguments|expected" } */
+    case 5:
+      b += 5;
+      break;
+    }
+  [[fallthrough]] return b; /* { dg-warning "ignored" } */
+}
diff --git a/gcc/testsuite/gcc.dg/c2x-attr-fallthrough-3.c b/gcc/testsuite/gcc.dg/c2x-attr-fallthrough-3.c
new file mode 100644 (file)
index 0000000..66fe820
--- /dev/null
@@ -0,0 +1,18 @@
+/* Test C2x attribute syntax.  Invalid use of fallthrough attribute
+   outside switch or in bad context inside switch.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c2x -pedantic-errors -Wextra" } */
+
+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;
+}