aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorMatt Austern <austern@apple.com>2004-10-29 00:50:44 +0000
committerMatt Austern <austern@gcc.gnu.org>2004-10-29 00:50:44 +0000
commitf6af9a152749a805593d48c347ac9e0f5cff1f5e (patch)
tree67705cf4a24be44b751b7fa552e04b2fcb416fa9 /gcc/cp
parent0f84c36ef44ee5b4571b542a3a46307ec7bbb3de (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/decl.c11
-rw-r--r--gcc/cp/parser.c13
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);