diff options
author | Matt Austern <austern@apple.com> | 2004-10-29 00:50:44 +0000 |
---|---|---|
committer | Matt Austern <austern@gcc.gnu.org> | 2004-10-29 00:50:44 +0000 |
commit | f6af9a152749a805593d48c347ac9e0f5cff1f5e (patch) | |
tree | 67705cf4a24be44b751b7fa552e04b2fcb416fa9 /gcc/cp | |
parent | 0f84c36ef44ee5b4571b542a3a46307ec7bbb3de (diff) | |
download | gcc-f6af9a152749a805593d48c347ac9e0f5cff1f5e.zip gcc-f6af9a152749a805593d48c347ac9e0f5cff1f5e.tar.gz gcc-f6af9a152749a805593d48c347ac9e0f5cff1f5e.tar.bz2 |
c++/14124
* decl.c (finish_enum): Handle packed attribute.
* parser.c (cp_parser_enum_specifier): Process trailing attributes.
* g++.dg/ext/packed7.C: New test.
From-SVN: r89801
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 11 | ||||
-rw-r--r-- | gcc/cp/parser.c | 13 |
3 files changed, 28 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2edaa40..5aa869c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +1004-10-28 Matt Austern <austern@apple.com> + + PR c++/14124 + * decl.c (finish_enum): Handle packed attribute. + * parser.c (cp_parser_enum_specifier): Process trailing attributes. + 2004-10-28 Mark Mitchell <mark@codesourcery.com> PR c++/17132 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index aeb3347..4d74a2a 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -9504,6 +9504,7 @@ finish_enum (tree enumtype) tree maxnode; tree t; bool unsignedp; + bool use_short_enum; int lowprec; int highprec; int precision; @@ -9586,8 +9587,14 @@ finish_enum (tree enumtype) We use "int" or an "unsigned int" as the underlying type, even if a smaller integral type would work, unless the user has - explicitly requested that we use the smallest possible type. */ - for (itk = (flag_short_enums ? itk_char : itk_int); + explicitly requested that we use the smallest possible type. The + user can request that for all enumerations with a command line + flag, or for just one enumeration with an attribute. */ + + use_short_enum = flag_short_enums + || lookup_attribute ("packed", TYPE_ATTRIBUTES (enumtype)); + + for (itk = (use_short_enum ? itk_char : itk_int); itk != itk_none; itk++) { diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index ccb1ac1..8fed7ba 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -9754,6 +9754,9 @@ cp_parser_elaborated_type_specifier (cp_parser* parser, enum-specifier: enum identifier [opt] { enumerator-list [opt] } + GNU Extensions: + enum identifier [opt] { enumerator-list [opt] } attributes + Returns an ENUM_TYPE representing the enumeration. */ static tree @@ -9791,6 +9794,16 @@ cp_parser_enum_specifier (cp_parser* parser) /* Consume the final '}'. */ cp_parser_require (parser, CPP_CLOSE_BRACE, "`}'"); + /* Look for trailing attributes to apply to this enumeration, and + apply them if appropriate. */ + if (cp_parser_allow_gnu_extensions_p (parser)) + { + tree trailing_attr = cp_parser_attributes_opt (parser); + cplus_decl_attributes (&type, + trailing_attr, + (int) ATTR_FLAG_TYPE_IN_PLACE); + } + /* Finish up the enumeration. */ finish_enum (type); |