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:
parent
0f84c36ef4
commit
f6af9a1527
@ -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
|
||||
|
@ -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++)
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
15
gcc/testsuite/g++.dg/ext/packed7.C
Normal file
15
gcc/testsuite/g++.dg/ext/packed7.C
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user