This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[C PATCH] Warn for _Alignas in an array declarator (PR c/58267)


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  <polacek@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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]