diff options
author | Jason Merrill <jason@redhat.com> | 2002-01-31 15:14:37 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2002-01-31 15:14:37 -0500 |
commit | 98884b267644fd8cc217c77d820e490fb7ce8625 (patch) | |
tree | d4bc7347ee9719ff88f712317354a13d6e635f2b /gcc/cp | |
parent | 8512bbd75204223137ec839744ac3a1b8f4a0a90 (diff) | |
download | gcc-98884b267644fd8cc217c77d820e490fb7ce8625.zip gcc-98884b267644fd8cc217c77d820e490fb7ce8625.tar.gz gcc-98884b267644fd8cc217c77d820e490fb7ce8625.tar.bz2 |
Allow attributes in parms and casts.
* parse.y (named_parm): Don't strip attrs.
(declmods): Remove 'attributes' production.
(nonempty_cv_qualifiers): Accept attributes.
(ATTRIBUTE): Give precedence.
* decl.c (groktypename): Handle attributes.
(grokparms): Likewise.
From-SVN: r49373
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/decl.c | 22 | ||||
-rw-r--r-- | gcc/cp/parse.y | 27 |
3 files changed, 38 insertions, 21 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 92f5a4a..f259c96 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2002-01-31 Jason Merrill <jason@redhat.com> + + Allow attributes in parms and casts. + * parse.y (named_parm): Don't strip attrs. + (declmods): Remove 'attributes' production. + (nonempty_cv_qualifiers): Accept attributes. + (ATTRIBUTE): Give precedence. + * decl.c (groktypename): Handle attributes. + (grokparms): Likewise. + 2002-01-29 Jakub Jelinek <jakub@redhat.com> * decl2.c (cxx_decode_option): Pass 0 as last argument to diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 0bb5dfd..e5d1a47 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7127,11 +7127,16 @@ tree groktypename (typename) tree typename; { + tree specs, attrs; + tree type; if (TREE_CODE (typename) != TREE_LIST) return typename; - return grokdeclarator (TREE_VALUE (typename), - TREE_PURPOSE (typename), - TYPENAME, 0, NULL); + split_specs_attrs (TREE_PURPOSE (typename), &specs, &attrs); + type = grokdeclarator (TREE_VALUE (typename), specs, + TYPENAME, 0, &attrs); + if (attrs) + cplus_decl_attributes (&type, attrs, 0); + return type; } /* Decode a declarator in an ordinary declaration or data definition. @@ -11997,8 +12002,9 @@ grokparms (first_parm) for (parm = first_parm; parm != NULL_TREE; parm = chain) { tree type = NULL_TREE; - register tree decl = TREE_VALUE (parm); + tree decl = TREE_VALUE (parm); tree init = TREE_PURPOSE (parm); + tree specs, attrs; chain = TREE_CHAIN (parm); /* @@ weak defense against parse errors. */ @@ -12016,11 +12022,15 @@ grokparms (first_parm) if (parm == void_list_node) break; - decl = grokdeclarator (TREE_VALUE (decl), TREE_PURPOSE (decl), - PARM, init != NULL_TREE, NULL); + split_specs_attrs (TREE_PURPOSE (decl), &specs, &attrs); + decl = grokdeclarator (TREE_VALUE (decl), specs, + PARM, init != NULL_TREE, &attrs); if (! decl || TREE_TYPE (decl) == error_mark_node) continue; + if (attrs) + cplus_decl_attributes (&decl, attrs, 0); + type = TREE_TYPE (decl); if (VOID_TYPE_P (type)) { diff --git a/gcc/cp/parse.y b/gcc/cp/parse.y index 83a1cd0..7941a89 100644 --- a/gcc/cp/parse.y +++ b/gcc/cp/parse.y @@ -301,7 +301,7 @@ cp_parse_init () %nonassoc IF %nonassoc ELSE -%left IDENTIFIER PFUNCNAME TYPENAME SELFNAME PTYPENAME SCSPEC TYPESPEC CV_QUALIFIER ENUM AGGR ELLIPSIS TYPEOF SIGOF OPERATOR NSNAME TYPENAME_KEYWORD +%left IDENTIFIER PFUNCNAME TYPENAME SELFNAME PTYPENAME SCSPEC TYPESPEC CV_QUALIFIER ENUM AGGR ELLIPSIS TYPEOF SIGOF OPERATOR NSNAME TYPENAME_KEYWORD ATTRIBUTE %left '{' ',' ';' @@ -1938,11 +1938,6 @@ declmods: } | declmods attributes { $$.t = hash_tree_cons ($2, NULL_TREE, $1.t); } - | attributes %prec EMPTY - { - $$.t = hash_tree_cons ($1, NULL_TREE, NULL_TREE); - $$.new_type_flag = 0; $$.lookups = NULL_TREE; - } ; /* Used instead of declspecs where storage classes are not allowed @@ -2819,6 +2814,12 @@ nonempty_cv_qualifiers: | nonempty_cv_qualifiers CV_QUALIFIER { $$.t = hash_tree_cons (NULL_TREE, $2, $1.t); $$.new_type_flag = $1.new_type_flag; } + | attributes %prec EMPTY + { $$.t = hash_tree_cons ($1, NULL_TREE, NULL_TREE); + $$.new_type_flag = 0; } + | nonempty_cv_qualifiers attributes %prec EMPTY + { $$.t = hash_tree_cons ($2, NULL_TREE, $1.t); + $$.new_type_flag = $1.new_type_flag; } ; /* These rules must follow the rules for function declarations @@ -3718,9 +3719,8 @@ named_parm: /* Here we expand typed_declspecs inline to avoid mis-parsing of TYPESPEC IDENTIFIER. */ typed_declspecs1 declarator - { tree specs = strip_attrs ($1.t); - $$.new_type_flag = $1.new_type_flag; - $$.t = build_tree_list (specs, $2); } + { $$.new_type_flag = $1.new_type_flag; + $$.t = build_tree_list ($1.t, $2); } | typed_typespecs declarator { $$.t = build_tree_list ($1.t, $2); $$.new_type_flag = $1.new_type_flag; } @@ -3729,16 +3729,13 @@ named_parm: $2); $$.new_type_flag = $1.new_type_flag; } | typed_declspecs1 absdcl - { tree specs = strip_attrs ($1.t); - $$.t = build_tree_list (specs, $2); + { $$.t = build_tree_list ($1.t, $2); $$.new_type_flag = $1.new_type_flag; } | typed_declspecs1 %prec EMPTY - { tree specs = strip_attrs ($1.t); - $$.t = build_tree_list (specs, NULL_TREE); + { $$.t = build_tree_list ($1.t, NULL_TREE); $$.new_type_flag = $1.new_type_flag; } | declmods notype_declarator - { tree specs = strip_attrs ($1.t); - $$.t = build_tree_list (specs, $2); + { $$.t = build_tree_list ($1.t, $2); $$.new_type_flag = 0; } ; |