This PR is about _Alignas in contexts like
char x[_Alignas (int) 20];
C grammar does not allow _Alignas to be in an array declarator, yet we
don't issue any warning or an error.  This patch implements a pedwarn
for this.  I'm however highly unsure whether we want pedwarn, error, or
normal warning for this - currently we just DTRT and ignore the
_Alignas altogether.

Regtested/bootstrapped on x86_64-linux, ok for trunk?

2013-10-16  Marek Polacek  <pola...@redhat.com>

        PR c/58267
c/
        * c-parser.c (c_parser_direct_declarator_inner): Record whether
        _Alignas has been seen.
        * c-decl.c (build_array_declarator): Add alignas_p parameter.  Warn
        if _Alignas occurs in an array declarator.
        * c-tree.h (build_array_declarator): Adjust declaration.
testsuite/
        * gcc.dg/c1x-align-5.c: New test.

--- gcc/c/c-tree.h.mp   2013-10-15 19:36:09.548670833 +0200
+++ gcc/c/c-tree.h      2013-10-15 19:36:25.003727398 +0200
@@ -480,8 +480,8 @@ extern void c_init_decl_processing (void
 extern void c_print_identifier (FILE *, tree, int);
 extern int quals_from_declspecs (const struct c_declspecs *);
 extern struct c_declarator *build_array_declarator (location_t, tree,
-                                                   struct c_declspecs *,
-                                                   bool, bool);
+                                                   struct c_declspecs *,
+                                                   bool, bool, bool);
 extern tree build_enumerator (location_t, location_t, struct c_enum_contents *,
                              tree, tree);
 extern tree check_for_loop_decls (location_t, bool);
--- gcc/c/c-parser.c.mp 2013-10-15 19:33:47.706150200 +0200
+++ gcc/c/c-parser.c    2013-10-15 19:35:57.557627164 +0200
@@ -3096,8 +3096,10 @@ c_parser_direct_declarator_inner (c_pars
       struct c_declspecs *quals_attrs = build_null_declspecs ();
       bool static_seen;
       bool star_seen;
+      bool alignas_seen;
       tree dimen;
       c_parser_consume_token (parser);
+      alignas_seen = c_parser_next_token_is_keyword (parser, RID_ALIGNAS);
       c_parser_declspecs (parser, quals_attrs, false, false, true, 
cla_prefer_id);
       static_seen = c_parser_next_token_is_keyword (parser, RID_STATIC);
       if (static_seen)
@@ -3169,7 +3171,8 @@ c_parser_direct_declarator_inner (c_pars
       if (dimen)
        mark_exp_read (dimen);
       declarator = build_array_declarator (brace_loc, dimen, quals_attrs,
-                                          static_seen, star_seen);
+                                          static_seen, star_seen,
+                                          alignas_seen);
       if (declarator == NULL)
        return NULL;
       inner = set_array_declarator_inner (declarator, inner);
--- gcc/c/c-decl.c.mp   2013-10-15 19:35:30.172525717 +0200
+++ gcc/c/c-decl.c      2013-10-16 11:05:06.046383071 +0200
@@ -3866,7 +3866,7 @@ quals_from_declspecs (const struct c_dec
 struct c_declarator *
 build_array_declarator (location_t loc,
                        tree expr, struct c_declspecs *quals, bool static_p,
-                       bool vla_unspec_p)
+                       bool vla_unspec_p, bool alignas_p)
 {
   struct c_declarator *declarator = XOBNEW (&parser_obstack,
                                            struct c_declarator);
@@ -3908,6 +3908,9 @@ build_array_declarator (location_t loc,
        }
       current_scope->had_vla_unspec = true;
     }
+  if (alignas_p)
+    pedwarn (loc, OPT_Wpedantic, "%<_Alignas%> meaningless in array "
+            "declarator");
   return declarator;
 }
 
--- gcc/testsuite/gcc.dg/c1x-align-5.c.mp       2013-10-16 11:11:16.432690963 
+0200
+++ gcc/testsuite/gcc.dg/c1x-align-5.c  2013-10-16 11:15:09.269514593 +0200
@@ -0,0 +1,17 @@
+/* Test C1X alignment support.  Test invalid code.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c1x -pedantic-errors" } */
+
+static int
+foo (int a[_Alignas (0) 10])   /* { dg-error "meaningless in array declarator" 
} */
+{
+  return a[0];
+}
+
+int
+main ()
+{
+  int a[_Alignas (int) 10];    /* { dg-error "meaningless in array declarator" 
} */
+  foo (a);
+  return 0;
+}

        Marek

Reply via email to