diff options
author | Jason Merrill <jason@yorick.cygnus.com> | 1998-10-18 04:11:07 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 1998-10-18 00:11:07 -0400 |
commit | 1eab9b561459199edc53a6d1c2b883eedf887282 (patch) | |
tree | 51c9bef71114fa408a387d819ef34cd6b507b770 /gcc | |
parent | 52fbc84763ecd3141cdb690d5d61a8750b625c62 (diff) | |
download | gcc-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/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/decl.c | 36 |
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'"); |