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
This commit is contained in:
Matt Austern 2004-10-29 00:50:44 +00:00 committed by Matt Austern
parent 0f84c36ef4
commit f6af9a1527
5 changed files with 48 additions and 2 deletions

View File

@ -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

View File

@ -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++)
{

View File

@ -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);

View File

@ -1,3 +1,8 @@
1004-10-28 Matt Austern <austern@apple.com>
PR c++/14124
* g++.dg/ext/packed7.C: New test.
2004-10-28 Andrew Pinski <pinskia@physics.uc.edu>
* gcc.dg/visibility-[1-9a].c: Change to use scan-hidden instead of

View File

@ -0,0 +1,15 @@
// PR c++/14124
// A packed enum uses the minimal underlying type.
// Copyright (C) 2004 Free Software Foundation, Inc.
// Contributed by Matt Austern <austern@apple.com>
// { dg-do run }
enum XXX { xyzzy = 3 } __attribute__((packed));
int main()
{
int enumsize = sizeof(xyzzy);
return (enumsize == 1) ? 0 : 1;
}