OSDN Git Service

PR c++/20673
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 Apr 2005 17:35:54 +0000 (17:35 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 Apr 2005 17:35:54 +0000 (17:35 +0000)
* decl.c (grokdeclarator): Correct attribute handling.

PR c++/20673
* g++.dg/ext/attrib21.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@97640 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/decl.c
gcc/testsuite/g++.dg/ext/attrib21.C [new file with mode: 0644]

index eef2cb1..9618b4d 100644 (file)
@@ -7059,9 +7059,7 @@ grokdeclarator (const cp_declarator *declarator,
 
   /* Determine the type of the entity declared by recurring on the
      declarator.  */
-  for (;
-       declarator && declarator->kind != cdk_id;
-       declarator = declarator->declarator)
+  for (; declarator; declarator = declarator->declarator)
     {
       const cp_declarator *inner_declarator;
       tree attrs;
@@ -7069,8 +7067,6 @@ grokdeclarator (const cp_declarator *declarator,
       if (type == error_mark_node)
        return error_mark_node;
 
-      inner_declarator = declarator->declarator;
-
       attrs = declarator->attributes;
       if (attrs)
        {
@@ -7088,6 +7084,11 @@ grokdeclarator (const cp_declarator *declarator,
                                            attr_flags);
        }
 
+      if (declarator->kind == cdk_id)
+       break;
+
+      inner_declarator = declarator->declarator;
+
       switch (declarator->kind)
        {
        case cdk_array:
diff --git a/gcc/testsuite/g++.dg/ext/attrib21.C b/gcc/testsuite/g++.dg/ext/attrib21.C
new file mode 100644 (file)
index 0000000..c7ce8da
--- /dev/null
@@ -0,0 +1,17 @@
+// PR c++/20673
+
+typedef void *voidp;
+
+struct S
+{
+  char a;
+  voidp __attribute__ ((aligned (16))) b;
+};
+
+struct T
+{
+  char a;
+  void *__attribute__ ((aligned (16))) b;
+};
+
+int f[sizeof (struct S) != sizeof (struct T) ? -1 : 1];