We were wrongly rejecting code in the attached test because the check
in grokdeclarator is wrong: we only want to check whether the user is
trying to apply _Atomic to an array type, i.e. this:

typedef int T[10];
_Atomic T a;

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2017-12-10  Marek Polacek  <pola...@redhat.com>

        PR c/82679
        * c-decl.c (grokdeclarator): Check declspecs insted of atomicp.

        * gcc.dg/c11-atomic-5.c: New test.

--- gcc/c/c-decl.c
+++ gcc/c/c-decl.c
@@ -5813,7 +5813,7 @@ grokdeclarator (const struct c_declarator *declarator,
      of typedefs or typeof) must be detected here.  If the qualifier
      is introduced later, any appearance of applying it to an array is
      actually applying it to an element of that array.  */
-  if (atomicp && TREE_CODE (type) == ARRAY_TYPE)
+  if (declspecs->atomic_p && TREE_CODE (type) == ARRAY_TYPE)
     error_at (loc, "%<_Atomic%>-qualified array type");
 
   /* Warn about storage classes that are invalid for certain
--- gcc/testsuite/gcc.dg/c11-atomic-5.c
+++ gcc/testsuite/gcc.dg/c11-atomic-5.c
@@ -0,0 +1,10 @@
+/* PR c/82679 */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu11" } */
+
+typedef _Atomic int A[10];
+A a;
+
+typedef _Atomic int I;
+typedef I T[10];
+T t;

        Marek

Reply via email to