@@ -267,10 +267,14 @@ extern char *yyansi_ctext;
267267
268268%start grammar
269269
270- %expect 1 /* the famous "dangling `else'" ambiguity */
270+ %expect 2 /* the famous "dangling `else'" ambiguity */
271271 /* results in one shift/reduce conflict */
272272 /* that we don't want to be reported */
273273
274+ /* a second shift/reduce conflict arises due to enum underlying */
275+ /* type specifications and bitfield specifications, which are both */
276+ /* introduced by a ':' and follow a type */
277+
274278%{
275279/* ***********************************************************************/
276280/* ** rules **************************************************************/
@@ -1790,23 +1794,15 @@ bit_field_size:
17901794enum_name :
17911795 enum_key
17921796 gcc_type_attribute_opt
1793- {
1794- // an anon enum
1795- }
1796- ' {' enumerator_list_opt ' }'
1797- gcc_type_attribute_opt
1797+ enum_underlying_type_opt
17981798 {
1799- parser_stack ($1 ).operands().swap(parser_stack($5 ).operands());
1800- $$ =merge($1 , merge($2 , $7 )); // throw in the gcc attributes
1801- }
1802- | enum_key
1803- gcc_type_attribute_opt
1804- identifier_or_typedef_name
1799+ // an anon enum
1800+ if (parser_stack($3 ).is_not_nil())
18051801 {
1806- // an enum with tag
1807- parser_stack ($1 ).set(ID_tag, parser_stack($3 ));
1802+ parser_stack ($1 ).set(ID_enum_underlying_type, parser_stack($3 ));
18081803 }
1809- ' {' enumerator_list_opt ' }'
1804+ }
1805+ ' {' enumerator_list_opt ' }'
18101806 gcc_type_attribute_opt
18111807 {
18121808 parser_stack ($1 ).operands().swap(parser_stack($6 ).operands());
@@ -1815,14 +1811,54 @@ enum_name:
18151811 | enum_key
18161812 gcc_type_attribute_opt
18171813 identifier_or_typedef_name
1818- gcc_type_attribute_opt
1814+ enum_underlying_type_opt
18191815 {
1820- parser_stack ($ 1 ).id(ID_c_enum_tag); // tag only
1816+ // an enum with tag
18211817 parser_stack ($1 ).set(ID_tag, parser_stack($3 ));
1822- $$ =merge($1 , merge($2 , $4 )); // throw in the gcc attributes
1818+
1819+ if (parser_stack($4 ).is_not_nil())
1820+ {
1821+ parser_stack ($1 ).set(ID_enum_underlying_type, parser_stack($4 ));
1822+ }
1823+ }
1824+ braced_enumerator_list_opt
1825+ gcc_type_attribute_opt
1826+ {
1827+ if (parser_stack($6 ).is_not_nil())
1828+ {
1829+ parser_stack ($1 ).operands().swap(parser_stack($6 ).operands());
1830+ }
1831+ else
1832+ {
1833+ parser_stack ($1 ).id(ID_c_enum_tag);
1834+ }
1835+
1836+ $$ =merge($1 , merge($2 , $7 )); // throw in the gcc attributes
18231837 }
18241838 ;
1825-
1839+
1840+ enum_underlying_type_opt :
1841+ /* empty */
1842+ {
1843+ init ($$);
1844+ parser_stack ($$).make_nil();
1845+ }
1846+ | ' :' basic_type_name
1847+ {
1848+ $$ =$2 ;
1849+ }
1850+
1851+ braced_enumerator_list_opt :
1852+ /* empty */
1853+ {
1854+ init ($$);
1855+ parser_stack ($$).make_nil();
1856+ }
1857+ | ' {' enumerator_list_opt ' }'
1858+ {
1859+ $$ =$2 ;
1860+ }
1861+
18261862enum_key : TOK_ENUM
18271863 {
18281864 $$ =$1 ;
0 commit comments