aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1998-10-18 04:11:07 +0000
committerJason Merrill <jason@gcc.gnu.org>1998-10-18 00:11:07 -0400
commit1eab9b561459199edc53a6d1c2b883eedf887282 (patch)
tree51c9bef71114fa408a387d819ef34cd6b507b770 /gcc
parent52fbc84763ecd3141cdb690d5d61a8750b625c62 (diff)
downloadgcc-1eab9b561459199edc53a6d1c2b883eedf887282.zip
gcc-1eab9b561459199edc53a6d1c2b883eedf887282.tar.gz
gcc-1eab9b561459199edc53a6d1c2b883eedf887282.tar.bz2
decl.c (grokdeclarator): Embedded attrs bind to the right, not the left.
* decl.c (grokdeclarator): Embedded attrs bind to the right, not the left. From-SVN: r23160
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/decl.c36
2 files changed, 36 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 591a84a..37e7300 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
1998-10-18 Jason Merrill <jason@yorick.cygnus.com>
+ * decl.c (grokdeclarator): Embedded attrs bind to the right,
+ not the left.
+
* parse.y (fn.def2): Fix 'attrs' format.
1998-10-18 Alastair J. Houghton <ajh8@doc.ic.ac.uk>
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 20fa7b2..dc6b9e9 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -8534,6 +8534,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
tree raises = NULL_TREE;
int template_count = 0;
tree in_namespace = NULL_TREE;
+ tree inner_attrs;
+ int ignore_attrs;
RIDBIT_RESET_ALL (specbits);
if (decl_context == FUNCDEF)
@@ -9389,6 +9391,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
Descend through it, creating more complex types, until we reach
the declared identifier (or NULL_TREE, in an absolute declarator). */
+ inner_attrs = NULL_TREE;
+ ignore_attrs = 0;
+
while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE
&& TREE_CODE (declarator) != TEMPLATE_ID_EXPR)
{
@@ -9435,15 +9440,29 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
quals = NULL_TREE;
}
}
+
+ /* See the comment for the TREE_LIST case, below. */
+ if (ignore_attrs)
+ ignore_attrs = 0;
+ else if (inner_attrs)
+ {
+ decl_attributes (type, inner_attrs, NULL_TREE);
+ inner_attrs = NULL_TREE;
+ }
+
switch (TREE_CODE (declarator))
{
case TREE_LIST:
{
/* We encode a declarator with embedded attributes using
- a TREE_LIST. */
- tree attrs = TREE_PURPOSE (declarator);
+ a TREE_LIST. The attributes apply to the declarator
+ directly inside them, so we have to skip an iteration
+ before applying them to the type. If the declarator just
+ inside is the declarator-id, we apply the attrs to the
+ decl itself. */
+ inner_attrs = TREE_PURPOSE (declarator);
+ ignore_attrs = 1;
declarator = TREE_VALUE (declarator);
- decl_attributes (type, attrs, NULL_TREE);
}
break;
@@ -10087,6 +10106,17 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
}
}
+ /* See the comment for the TREE_LIST case, above. */
+ if (inner_attrs)
+ {
+ if (! ignore_attrs)
+ decl_attributes (type, inner_attrs, NULL_TREE);
+ else if (attrlist)
+ TREE_VALUE (attrlist) = chainon (inner_attrs, TREE_VALUE (attrlist));
+ else
+ attrlist = build_decl_list (NULL_TREE, inner_attrs);
+ }
+
if (explicitp == 1)
{
error ("only constructors can be declared `explicit'");