Annotation of gcc/cp/parse.y, revision 1.1.1.1

1.1       root        1: /* YACC parser for C++ syntax.
                      2:    Copyright (C) 1988, 1989, 1993 Free Software Foundation, Inc.
                      3:    Hacked by Michael Tiemann ([email protected])
                      4: 
                      5: This file is part of GNU CC.
                      6: 
                      7: GNU CC is free software; you can redistribute it and/or modify
                      8: it under the terms of the GNU General Public License as published by
                      9: the Free Software Foundation; either version 2, or (at your option)
                     10: any later version.
                     11: 
                     12: GNU CC is distributed in the hope that it will be useful,
                     13: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15: GNU General Public License for more details.
                     16: 
                     17: You should have received a copy of the GNU General Public License
                     18: along with GNU CC; see the file COPYING.  If not, write to
                     19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     20: 
                     21: 
                     22: /* This grammar is based on the GNU CC grammar.  */
                     23: 
                     24: /* Note: Bison automatically applies a default action of "$$ = $1" for
                     25:    all derivations; this is applied before the explicit action, if one
                     26:    is given.  Keep this in mind when reading the actions.  */
                     27: 
                     28: /* Also note: this version contains experimental exception
                     29:    handling features.  They could break, change, disappear,
                     30:    or otherwise exhibit volatile behavior.  Don't depend on
                     31:    me (Michael Tiemann) to protect you from any negative impact
                     32:    this may have on your professional, personal, or spiritual life.
                     33: 
                     34:    NEWS FLASH:  This version now supports the exception handling
                     35:    syntax of Stroustrup's 2nd edition, if -fansi-exceptions is given.
                     36:    THIS IS WORK IN PROGRESS!!!  The type of the 'throw' and the
                     37:    'catch' much match EXACTLY (no inheritance support or coercions).
                     38:    Also, throw-specifications of functions don't work.
                     39:    Destructors aren't called correctly.  Etc, etc.  --Per Bothner.
                     40:   */
                     41: 
                     42: %{
                     43: /* Cause the `yydebug' variable to be defined.  */
                     44: #define YYDEBUG 1
                     45: 
                     46: #include "config.h"
                     47: 
                     48: #include <stdio.h>
                     49: #include <errno.h>
                     50: 
                     51: #include "tree.h"
                     52: #include "input.h"
                     53: #include "flags.h"
                     54: #include "lex.h"
                     55: #include "cp-tree.h"
                     56: 
                     57: /* Since parsers are distinct for each language, put the language string
                     58:    definition here.  (fnf) */
                     59: char *language_string = "GNU C++";
                     60: 
                     61: extern tree void_list_node;
                     62: extern struct obstack permanent_obstack;
                     63: 
                     64: #ifndef errno
                     65: extern int errno;
                     66: #endif
                     67: 
                     68: extern int end_of_file;
                     69: extern int current_class_depth;
                     70: 
                     71: void yyerror ();
                     72: 
                     73: /* Like YYERROR but do call yyerror.  */
                     74: #define YYERROR1 { yyerror ("syntax error"); YYERROR; }
                     75: 
                     76: #define OP0(NODE) (TREE_OPERAND (NODE, 0))
                     77: #define OP1(NODE) (TREE_OPERAND (NODE, 1))
                     78: 
                     79: /* Contains the statement keyword (if/while/do) to include in an
                     80:    error message if the user supplies an empty conditional expression.  */
                     81: static char *cond_stmt_keyword;
                     82: 
                     83: /* Nonzero if we have an `extern "C"' acting as an extern specifier.  */
                     84: int have_extern_spec;
                     85: int used_extern_spec;
                     86: 
                     87: void yyhook ();
                     88: 
                     89: /* Cons up an empty parameter list.  */
                     90: #ifdef __GNUC__
                     91: __inline
                     92: #endif
                     93: static tree
                     94: empty_parms ()
                     95: {
                     96:   tree parms;
                     97: 
                     98:   if (strict_prototype)
                     99:     parms = void_list_node;
                    100:   else
                    101:     parms = NULL_TREE;
                    102:   return parms;
                    103: }
                    104: %}
                    105: 
                    106: %start program
                    107: 
                    108: %union {long itype; tree ttype; char *strtype; enum tree_code code; }
                    109: 
                    110: /* All identifiers that are not reserved words
                    111:    and are not declared typedefs in the current block */
                    112: %token IDENTIFIER
                    113: 
                    114: /* All identifiers that are declared typedefs in the current block.
                    115:    In some contexts, they are treated just like IDENTIFIER,
                    116:    but they can also serve as typespecs in declarations.  */
                    117: %token TYPENAME
                    118: 
                    119: /* Reserved words that specify storage class.
                    120:    yylval contains an IDENTIFIER_NODE which indicates which one.  */
                    121: %token SCSPEC
                    122: 
                    123: /* Reserved words that specify type.
                    124:    yylval contains an IDENTIFIER_NODE which indicates which one.  */
                    125: %token TYPESPEC
                    126: 
                    127: /* Reserved words that qualify type: "const" or "volatile".
                    128:    yylval contains an IDENTIFIER_NODE which indicates which one.  */
                    129: %token TYPE_QUAL
                    130: 
                    131: /* Character or numeric constants.
                    132:    yylval is the node for the constant.  */
                    133: %token CONSTANT
                    134: 
                    135: /* String constants in raw form.
                    136:    yylval is a STRING_CST node.  */
                    137: %token STRING
                    138: 
                    139: /* "...", used for functions with variable arglists.  */
                    140: %token ELLIPSIS
                    141: 
                    142: /* the reserved words */
                    143: /* SCO include files test "ASM", so use something else. */
                    144: %token SIZEOF ENUM /* STRUCT UNION */ IF ELSE WHILE DO FOR SWITCH CASE DEFAULT
                    145: %token BREAK CONTINUE RETURN GOTO ASM_KEYWORD GCC_ASM_KEYWORD TYPEOF ALIGNOF
                    146: %token HEADOF CLASSOF SIGOF
                    147: %token ATTRIBUTE EXTENSION LABEL
                    148: 
                    149: /* the reserved words... C++ extensions */
                    150: %token <ttype> AGGR
                    151: %token <itype> VISSPEC
                    152: %token DELETE NEW OVERLOAD THIS OPERATOR CXX_TRUE CXX_FALSE
                    153: %token LEFT_RIGHT TEMPLATE
                    154: %token TYPEID DYNAMIC_CAST STATIC_CAST REINTERPRET_CAST CONST_CAST
                    155: %token <itype> SCOPE
                    156: 
                    157: /* Define the operator tokens and their precedences.
                    158:    The value is an integer because, if used, it is the tree code
                    159:    to use in the expression made from the operator.  */
                    160: 
                    161: %left EMPTY                    /* used to resolve s/r with epsilon */
                    162: 
                    163: %left error
                    164: 
                    165: /* Add precedence rules to solve dangling else s/r conflict */
                    166: %nonassoc IF
                    167: %nonassoc ELSE
                    168: 
                    169: %left IDENTIFIER TYPENAME PTYPENAME SCSPEC TYPESPEC TYPE_QUAL ENUM AGGR ELLIPSIS TYPEOF SIGOF OPERATOR
                    170: 
                    171: %left '{' ',' ';'
                    172: 
                    173: %right <code> ASSIGN '='
                    174: %right <code> '?' ':'
                    175: %left <code> OROR
                    176: %left <code> ANDAND
                    177: %left <code> '|'
                    178: %left <code> '^'
                    179: %left <code> '&'
                    180: %left <code> MIN_MAX
                    181: %left <code> EQCOMPARE
                    182: %left <code> ARITHCOMPARE '<' '>'
                    183: %left <code> LSHIFT RSHIFT
                    184: %left <code> '+' '-'
                    185: %left <code> '*' '/' '%'
                    186: %left <code> POINTSAT_STAR DOT_STAR
                    187: %right <code> UNARY PLUSPLUS MINUSMINUS '~'
                    188: %left HYPERUNARY
                    189: %left <ttype> PAREN_STAR_PAREN LEFT_RIGHT
                    190: %left <code> POINTSAT '.' '(' '['
                    191: 
                    192: %right SCOPE                   /* C++ extension */
                    193: %nonassoc NEW DELETE TRY CATCH THROW
                    194: 
                    195: %type <code> unop
                    196: 
                    197: %type <ttype> identifier IDENTIFIER TYPENAME CONSTANT expr nonnull_exprlist
                    198: %type <ttype> paren_expr_or_null nontrivial_exprlist
                    199: %type <ttype> expr_no_commas cast_expr unary_expr primary string STRING
                    200: %type <ttype> typed_declspecs reserved_declspecs boolean.literal
                    201: %type <ttype> typed_typespecs reserved_typespecquals
                    202: %type <ttype> declmods typespec typespecqual_reserved
                    203: %type <ttype> SCSPEC TYPESPEC TYPE_QUAL nonempty_type_quals maybe_type_qual
                    204: %type <itype> initdecls notype_initdecls initdcl       /* C++ modification */
                    205: %type <ttype> init initlist maybeasm
                    206: %type <ttype> asm_operands nonnull_asm_operands asm_operand asm_clobbers
                    207: %type <ttype> maybe_attribute attributes attribute attribute_list attrib
                    208: %type <ttype> any_word
                    209: 
                    210: %type <ttype> compstmt implicitly_scoped_stmt
                    211: 
                    212: %type <ttype> declarator notype_declarator after_type_declarator
                    213: %type <ttype> direct_notype_declarator direct_after_type_declarator
                    214: 
                    215: %type <ttype> structsp opt.component_decl_list component_decl_list
                    216: %type <ttype> component_decl components component_declarator
                    217: %type <ttype> notype_components notype_component_declarator
                    218: %type <ttype> after_type_component_declarator after_type_component_declarator0
                    219: %type <ttype> notype_component_declarator0 component_decl_1
                    220: %type <ttype> enumlist enumerator
                    221: %type <ttype> type_id absdcl type_quals
                    222: %type <ttype> direct_abstract_declarator conversion_declarator
                    223: %type <ttype> new_type_id new_declarator direct_new_declarator
                    224: %type <ttype> xexpr parmlist parms parm bad_parm full_parm
                    225: %type <ttype> identifiers_or_typenames
                    226: %type <ttype> fcast_or_absdcl regcast_or_absdcl sub_cast_expr
                    227: %type <ttype> expr_or_declarator complex_notype_declarator
                    228: %type <ttype> notype_unqualified_id unqualified_id qualified_id
                    229: %type <ttype> overqualified_id notype_qualified_id
                    230: %type <ttype> complex_direct_notype_declarator functional_cast
                    231: %type <ttype> named_parm complex_parmlist typed_declspecs1 parms_comma
                    232: 
                    233: /* C++ extensions */
                    234: %token <ttype> TYPENAME_ELLIPSIS PTYPENAME
                    235: %token <ttype> PRE_PARSED_FUNCTION_DECL EXTERN_LANG_STRING ALL
                    236: %token <ttype> PRE_PARSED_CLASS_DECL
                    237: %type <ttype> fn.def1 /* Not really! */
                    238: %type <ttype> fn.def2 return_id
                    239: %type <ttype> named_class_head named_class_head_sans_basetype
                    240: %type <ttype> unnamed_class_head
                    241: %type <ttype> class_head base_class_list
                    242: %type <itype> base_class_access_list
                    243: %type <ttype> base_class maybe_base_class_list base_class.1
                    244: %type <ttype> maybe_raises ansi_raise_identifier ansi_raise_identifiers
                    245: %type <ttype> component_declarator0
                    246: %type <ttype> forhead.1 operator_name
                    247: %type <ttype> object aggr
                    248: %type <itype> new delete
                    249: /* %type <ttype> primary_no_id */
                    250: %type <ttype> nonmomentary_expr
                    251: %type <itype> forhead.2 initdcl0 notype_initdcl0 member_init_list
                    252: %type <ttype> template_header template_parm_list template_parm
                    253: %type <ttype> template_type_parm
                    254: %type <ttype> template_type template_arg_list template_arg
                    255: %type <ttype> template_instantiation template_type_name tmpl.2
                    256: %type <ttype> template_instantiate_once template_instantiate_some
                    257: %type <itype> fn_tmpl_end
                    258: /* %type <itype> try_for_typename */
                    259: %type <ttype> condition xcond paren_cond_or_null
                    260: %type <ttype> type_name nested_name_specifier nested_type ptr_to_mem
                    261: %type <ttype> qualified_type_name complete_type_name notype_identifier
                    262: %type <ttype> complex_type_name nested_name_specifier_1
                    263: %type <itype> nomods_initdecls nomods_initdcl0
                    264: %type <ttype> new_initializer new_placement specialization type_specifier_seq
                    265: 
                    266: /* in order to recognize aggr tags as defining and thus shadowing. */
                    267: %token TYPENAME_DEFN IDENTIFIER_DEFN PTYPENAME_DEFN
                    268: %type <ttype> named_class_head_sans_basetype_defn 
                    269: %type <ttype> identifier_defn IDENTIFIER_DEFN TYPENAME_DEFN PTYPENAME_DEFN
                    270: 
                    271: %type <strtype> .pushlevel
                    272: 
                    273: /* spew.c depends on this being the last token.  Define
                    274:    any new tokens before this one!  */
                    275: %token END_OF_SAVED_INPUT
                    276: 
                    277: %{
                    278: /* List of types and structure classes of the current declaration.  */
                    279: static tree current_declspecs;
                    280: 
                    281: /* When defining an aggregate, this is the most recent one being defined.  */
                    282: static tree current_aggr;
                    283: 
                    284: /* Tell yyparse how to print a token's value, if yydebug is set.  */
                    285: 
                    286: #define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL)
                    287: extern void yyprint ();
                    288: extern tree combine_strings            PROTO((tree));
                    289: %}
                    290: 
                    291: %%
                    292: program: /* empty */
                    293:        | extdefs
                    294:                {
                    295:                  /* In case there were missing closebraces,
                    296:                     get us back to the global binding level.  */
                    297:                  while (! global_bindings_p ())
                    298:                    poplevel (0, 0, 0);
                    299:                  finish_file ();
                    300:                }
                    301:        ;
                    302: 
                    303: /* the reason for the strange actions in this rule
                    304:  is so that notype_initdecls when reached via datadef
                    305:  can find a valid list of type and sc specs in $0. */
                    306: 
                    307: extdefs:
                    308:          { $<ttype>$ = NULL_TREE; } lang_extdef
                    309:                { $<ttype>$ = NULL_TREE; }
                    310:        | extdefs lang_extdef
                    311:                { $<ttype>$ = NULL_TREE; }
                    312:        ;
                    313: 
                    314: .hush_warning:
                    315:                { have_extern_spec = 1;
                    316:                  used_extern_spec = 0;
                    317:                  $<ttype>$ = NULL_TREE; }
                    318:        ;
                    319: .warning_ok:
                    320:                { have_extern_spec = 0; }
                    321:        ;
                    322: 
                    323: asm_keyword:
                    324:          ASM_KEYWORD
                    325:        | GCC_ASM_KEYWORD
                    326:        ;
                    327: 
                    328: lang_extdef:
                    329:          { if (pending_lang_change) do_pending_lang_change(); }
                    330:          extdef
                    331:          { if (! global_bindings_p () && ! pseudo_global_level_p())
                    332:              pop_everything (); }
                    333:        ;
                    334: 
                    335: extdef:
                    336:          fndef
                    337:                { if (pending_inlines) do_pending_inlines (); }
                    338:        | datadef
                    339:                { if (pending_inlines) do_pending_inlines (); }
                    340:        | template_def
                    341:                { if (pending_inlines) do_pending_inlines (); }
                    342:        | overloaddef
                    343:        | asm_keyword '(' string ')' ';'
                    344:                { if (TREE_CHAIN ($3)) $3 = combine_strings ($3);
                    345:                  assemble_asm ($3); }
                    346:        | extern_lang_string '{' extdefs '}'
                    347:                { pop_lang_context (); }
                    348:        | extern_lang_string '{' '}'
                    349:                { pop_lang_context (); }
                    350:        | extern_lang_string .hush_warning fndef .warning_ok
                    351:                { if (pending_inlines) do_pending_inlines ();
                    352:                  pop_lang_context (); }
                    353:        | extern_lang_string .hush_warning datadef .warning_ok
                    354:                { if (pending_inlines) do_pending_inlines ();
                    355:                  pop_lang_context (); }
                    356:        ;
                    357: 
                    358: extern_lang_string:
                    359:          EXTERN_LANG_STRING
                    360:                { push_lang_context ($1); }
                    361:        ;
                    362: 
                    363: template_header:
                    364:          TEMPLATE '<'
                    365:                { begin_template_parm_list (); }
                    366:          template_parm_list '>'
                    367:                { $$ = end_template_parm_list ($4); }
                    368:        ;
                    369: 
                    370: template_parm_list:
                    371:          template_parm
                    372:                { $$ = process_template_parm (NULL_TREE, $1); }
                    373:        | template_parm_list ',' template_parm
                    374:                { $$ = process_template_parm ($1, $3); }
                    375:        ;
                    376: 
                    377: template_type_parm:
                    378:          aggr
                    379:                { 
                    380:                  $$ = build_tree_list ($1, NULL_TREE);
                    381:                 ttpa:
                    382:                  if (TREE_PURPOSE ($$) == signature_type_node)
                    383:                    sorry ("signature as template type parameter");
                    384:                  else if (TREE_PURPOSE ($$) != class_type_node)
                    385:                    pedwarn ("template type parameters must use the keyword `class'");
                    386:                }
                    387:        | aggr identifier
                    388:                { $$ = build_tree_list ($1, $2); goto ttpa; }
                    389:        ;
                    390: 
                    391: template_parm:
                    392:        /* The following rules introduce a new reduce/reduce
                    393:           conflict on the ',' and '>' input tokens: they are valid
                    394:           prefixes for a `structsp', which means they could match a
                    395:           nameless parameter.  See 14.6, paragraph 3.
                    396:           By putting them before the `parm' rule, we get
                    397:           their match before considering them nameless parameter
                    398:           declarations.  */
                    399:          template_type_parm
                    400:                { $$ = build_tree_list (NULL_TREE, $$); }
                    401:        | template_type_parm '=' typespec
                    402:                { $$ = build_tree_list ($3, $$); }
                    403:        | full_parm
                    404:        ;
                    405: 
                    406: overloaddef:
                    407:          OVERLOAD ov_identifiers ';'
                    408:                { warning ("use of `overload' is an anachronism"); }
                    409:        ;
                    410: 
                    411: ov_identifiers: IDENTIFIER
                    412:                { declare_overloaded ($1); }
                    413:        | ov_identifiers ',' IDENTIFIER
                    414:                { declare_overloaded ($3); }
                    415:        ;
                    416:          
                    417: template_def:
                    418:        /* Class template declarations go here; they aren't normal class
                    419:           declarations, because we can't process the bodies yet.  */
                    420:          template_header named_class_head_sans_basetype '{'
                    421:                { yychar = '{'; goto template1; }
                    422:         ';'
                    423:        | template_header named_class_head_sans_basetype_defn '{'
                    424:                { yychar = '{'; goto template1; }
                    425:         ';'
                    426:        | template_header named_class_head_sans_basetype ':'
                    427:                { yychar = ':'; goto template1; }
                    428:         ';'
                    429:        | template_header named_class_head_sans_basetype_defn ':'
                    430:                {
                    431:                  yychar = ':';
                    432:                template1:
                    433:                  if (current_aggr == exception_type_node)
                    434:                    error ("template type must define an aggregate or union");
                    435:                  else if (current_aggr == signature_type_node)
                    436:                    sorry ("template type defining a signature");
                    437:                  /* Maybe pedantic warning for union?
                    438:                     How about an enum? :-)  */
                    439:                  end_template_decl ($1, $2, current_aggr, 1);
                    440:                  reinit_parse_for_template (yychar, $1, $2);
                    441:                  yychar = YYEMPTY;
                    442:                }
                    443:          ';'
                    444:        | template_header named_class_head_sans_basetype ';'
                    445:                {
                    446:                  end_template_decl ($1, $2, current_aggr, 0);
                    447:                  /* declare $2 as template name with $1 parm list */
                    448:                }
                    449:        | template_header named_class_head_sans_basetype_defn ';'
                    450:                {
                    451:                  end_template_decl ($1, $2, current_aggr, 0);
                    452:                  /* declare $2 as template name with $1 parm list */
                    453:                }
                    454:        | template_header /* notype_initdcl0 ';' */
                    455:          notype_declarator maybe_raises maybeasm maybe_attribute
                    456:          fn_tmpl_end
                    457:                {
                    458:                  tree d;
                    459:                  int momentary;
                    460:                  int def = ($6 != ';');
                    461:                  momentary = suspend_momentary ();
                    462:                  d = start_decl ($<ttype>2, /*current_declspecs*/NULL_TREE, 0,
                    463:                                  $3);
                    464:                  cplus_decl_attributes (d, $5);
                    465:                  finish_decl (d, NULL_TREE, $4, 0);
                    466:                  end_template_decl ($1, d, 0, def);
                    467:                  if (def)
                    468:                    reinit_parse_for_template ((int) $6, $1, d);
                    469:                  resume_momentary (momentary);
                    470:                }
                    471:        | template_header typed_declspecs /*initdcl0*/
                    472:          declarator maybe_raises maybeasm maybe_attribute
                    473:          fn_tmpl_end
                    474:                {
                    475:                  tree d;
                    476:                  int momentary;
                    477:                  int def = ($7 != ';');
                    478: 
                    479:                  current_declspecs = $2;
                    480:                  momentary = suspend_momentary ();
                    481:                  d = start_decl ($<ttype>3, current_declspecs,
                    482:                                  0, $<ttype>4);
                    483:                  cplus_decl_attributes (d, $6);
                    484:                  finish_decl (d, NULL_TREE, $5, 0);
                    485:                  end_template_decl ($1, d, 0, def);
                    486:                  if (def)
                    487:                    {
                    488:                      reinit_parse_for_template ((int) $7, $1, d);
                    489:                      yychar = YYEMPTY;
                    490:                    }
                    491:                  note_list_got_semicolon ($<ttype>2);
                    492:                  resume_momentary (momentary);
                    493:                }
                    494:        | template_header declmods notype_declarator fn_tmpl_end
                    495:                {
                    496:                  int def = ($4 != ';');
                    497:                  tree d = start_decl ($<ttype>3, $<ttype>2, 0, NULL_TREE);
                    498:                  finish_decl (d, NULL_TREE, NULL_TREE, 0);
                    499:                  end_template_decl ($1, d, 0, def);
                    500:                  if (def)
                    501:                    reinit_parse_for_template ((int) $4, $1, d);
                    502:                }
                    503:        /* Try to recover from syntax errors in templates.  */
                    504:        | template_header error '}'     { end_template_decl ($1, 0, 0, 0); }
                    505:        | template_header error ';'     { end_template_decl ($1, 0, 0, 0); }
                    506:        ;
                    507: 
                    508: fn_tmpl_end: '{'               { $$ = '{'; }
                    509:        | ':'                   { $$ = ':'; }
                    510:        | ';'                   { $$ = ';'; }
                    511:        | '='                   { $$ = '='; }
                    512:        | RETURN                { $$ = RETURN; }
                    513:        ;
                    514: 
                    515: datadef:
                    516:          nomods_initdecls ';'
                    517:                {}
                    518:        | declmods notype_initdecls ';'
                    519:                {}
                    520:        /* Normal case to make fast: "const i;".  */
                    521:        | declmods notype_declarator ';'
                    522:                { tree d;
                    523:                  d = start_decl ($<ttype>2, $<ttype>$, 0, NULL_TREE);
                    524:                  finish_decl (d, NULL_TREE, NULL_TREE, 0);
                    525:                }
                    526:        | typed_declspecs initdecls ';'
                    527:                {
                    528:                  note_list_got_semicolon ($<ttype>$);
                    529:                }
                    530:        /* Normal case: make this fast.  */
                    531:        | typed_declspecs declarator ';'
                    532:                { tree d;
                    533:                  d = start_decl ($<ttype>2, $<ttype>$, 0, NULL_TREE);
                    534:                  finish_decl (d, NULL_TREE, NULL_TREE, 0);
                    535:                  note_list_got_semicolon ($<ttype>$);
                    536:                }
                    537:         | declmods ';'
                    538:          { pedwarn ("empty declaration"); }
                    539:        | explicit_instantiation ';'
                    540:        | typed_declspecs ';'
                    541:          {
                    542:            tree t = $<ttype>$;
                    543:            shadow_tag (t);
                    544:            if (TREE_CODE (t) == TREE_LIST
                    545:                && TREE_PURPOSE (t) == NULL_TREE)
                    546:              {
                    547:                t = TREE_VALUE (t);
                    548:                if (IS_AGGR_TYPE (t)
                    549:                    && IDENTIFIER_TEMPLATE (TYPE_IDENTIFIER (t)))
                    550:                  {
                    551:                    if (CLASSTYPE_USE_TEMPLATE (t) == 0)
                    552:                      SET_CLASSTYPE_TEMPLATE_SPECIALIZATION (t);
                    553:                    else if (CLASSTYPE_TEMPLATE_INSTANTIATION (t))
                    554:                      error ("override declaration for already-expanded template");
                    555:                  }
                    556:              }
                    557:            note_list_got_semicolon ($<ttype>$);
                    558:          }
                    559:        | error ';'
                    560:        | error '}'
                    561:        | ';'
                    562:        ;
                    563: 
                    564: fndef:
                    565:          fn.def1 base_init compstmt_or_error
                    566:                {
                    567:                  finish_function (lineno, 1);
                    568:                  /* finish_function performs these three statements:
                    569: 
                    570:                     expand_end_bindings (getdecls (), 1, 0);
                    571:                     poplevel (1, 1, 0);
                    572: 
                    573:                     expand_end_bindings (0, 0, 0);
                    574:                     poplevel (0, 0, 1);
                    575:                     */
                    576:                  if ($<ttype>$) process_next_inline ($<ttype>$);
                    577:                }
                    578:        | fn.def1 return_init base_init compstmt_or_error
                    579:                {
                    580:                  finish_function (lineno, 1);
                    581:                  /* finish_function performs these three statements:
                    582: 
                    583:                     expand_end_bindings (getdecls (), 1, 0);
                    584:                     poplevel (1, 1, 0);
                    585: 
                    586:                     expand_end_bindings (0, 0, 0);
                    587:                     poplevel (0, 0, 1);
                    588:                     */
                    589:                  if ($<ttype>$) process_next_inline ($<ttype>$);
                    590:                }
                    591:        | fn.def1 nodecls compstmt_or_error
                    592:                { finish_function (lineno, 0);
                    593:                  if ($<ttype>$) process_next_inline ($<ttype>$); }
                    594:        | fn.def1 return_init ';' nodecls compstmt_or_error
                    595:                { finish_function (lineno, 0);
                    596:                  if ($<ttype>$) process_next_inline ($<ttype>$); }
                    597:        | fn.def1 return_init nodecls compstmt_or_error
                    598:                { finish_function (lineno, 0);
                    599:                  if ($<ttype>$) process_next_inline ($<ttype>$); }
                    600:        | typed_declspecs declarator error
                    601:                {}
                    602:        | declmods notype_declarator error
                    603:                {}
                    604:        | notype_declarator error
                    605:                {}
                    606:        ;
                    607: 
                    608: fn.def1:
                    609:          typed_declspecs declarator maybe_raises
                    610:                { if (! start_function ($$, $2, $3, 0))
                    611:                    YYERROR1;
                    612:                  reinit_parse_for_function ();
                    613:                  $$ = NULL_TREE; }
                    614:        | declmods notype_declarator maybe_raises
                    615:                { if (! start_function ($$, $2, $3, 0))
                    616:                    YYERROR1;
                    617:                  reinit_parse_for_function ();
                    618:                  $$ = NULL_TREE; }
                    619:        | notype_declarator maybe_raises
                    620:                { if (! start_function (NULL_TREE, $$, $2, 0))
                    621:                    YYERROR1;
                    622:                  reinit_parse_for_function ();
                    623:                  $$ = NULL_TREE; }
                    624:        | PRE_PARSED_FUNCTION_DECL
                    625:                { start_function (NULL_TREE, TREE_VALUE ($$), NULL_TREE, 1);
                    626:                  reinit_parse_for_function (); }
                    627:        ;
                    628: 
                    629: /* more C++ complexity.  See component_decl for a comment on the
                    630:    reduce/reduce conflict introduced by these rules.  */
                    631: fn.def2:
                    632:          typed_declspecs '(' parmlist ')' type_quals maybe_raises
                    633:                {
                    634:                  $$ = build_parse_node (CALL_EXPR, TREE_VALUE ($1), $3, $5);
                    635:                  $$ = start_method (TREE_CHAIN ($1), $$, $6);
                    636:                 rest_of_mdef:
                    637:                  if (! $$)
                    638:                    YYERROR1;
                    639:                  if (yychar == YYEMPTY)
                    640:                    yychar = YYLEX;
                    641:                  reinit_parse_for_method (yychar, $$); }
                    642:        | typed_declspecs LEFT_RIGHT type_quals maybe_raises
                    643:                {
                    644:                  $$ = build_parse_node (CALL_EXPR, TREE_VALUE ($1),
                    645:                                         empty_parms (), $3);
                    646:                  $$ = start_method (TREE_CHAIN ($1), $$, $4);
                    647:                  goto rest_of_mdef;
                    648:                }
                    649:        | typed_declspecs declarator maybe_raises
                    650:                { $$ = start_method ($$, $2, $3); goto rest_of_mdef; }
                    651:        | declmods notype_declarator maybe_raises
                    652:                { $$ = start_method ($$, $2, $3); goto rest_of_mdef; }
                    653:        | notype_declarator maybe_raises
                    654:                { $$ = start_method (NULL_TREE, $$, $2); goto rest_of_mdef; }
                    655:        ;
                    656: 
                    657: return_id: RETURN IDENTIFIER
                    658:                {
                    659:                  if (! current_function_parms_stored)
                    660:                    store_parm_decls ();
                    661:                  $$ = $2;
                    662:                }
                    663:        ;
                    664: 
                    665: return_init: return_id
                    666:                { store_return_init ($<ttype>$, NULL_TREE); }
                    667:        | return_id '=' init
                    668:                { store_return_init ($<ttype>$, $3); }
                    669:        | return_id '(' nonnull_exprlist ')'
                    670:                { store_return_init ($<ttype>$, $3); }
                    671:        | return_id LEFT_RIGHT
                    672:                { store_return_init ($<ttype>$, NULL_TREE); }
                    673:        ;
                    674: 
                    675: base_init:
                    676:          ':' .set_base_init member_init_list
                    677:                {
                    678:                  if ($3 == 0)
                    679:                    error ("no base initializers given following ':'");
                    680:                  setup_vtbl_ptr ();
                    681:                  /* Always keep the BLOCK node associated with the outermost
                    682:                     pair of curley braces of a function.  These are needed
                    683:                     for correct operation of dwarfout.c.  */
                    684:                  keep_next_level ();
                    685:                }
                    686:        ;
                    687: 
                    688: .set_base_init:
                    689:        /* empty */
                    690:                {
                    691:                  if (! current_function_parms_stored)
                    692:                    store_parm_decls ();
                    693: 
                    694:                  /* Flag that we are processing base and member initializers.  */
                    695:                  current_vtable_decl = error_mark_node;
                    696: 
                    697:                  if (DECL_CONSTRUCTOR_P (current_function_decl))
                    698:                    {
                    699:                      /* Make a contour for the initializer list.  */
                    700:                      pushlevel (0);
                    701:                      clear_last_expr ();
                    702:                      expand_start_bindings (0);
                    703:                    }
                    704:                  else if (current_class_type == NULL_TREE)
                    705:                    error ("base initializers not allowed for non-member functions");
                    706:                  else if (! DECL_CONSTRUCTOR_P (current_function_decl))
                    707:                    error ("only constructors take base initializers");
                    708:                }
                    709:        ;
                    710: 
                    711: member_init_list:
                    712:          /* empty */
                    713:                { $$ = 0; }
                    714:        | member_init
                    715:                { $$ = 1; }
                    716:        | member_init_list ',' member_init
                    717:        | member_init_list error
                    718:        ;
                    719: 
                    720: member_init: '(' nonnull_exprlist ')'
                    721:                {
                    722:                  if (current_class_name && !flag_traditional)
                    723:                    pedwarn ("anachronistic old style base class initializer");
                    724:                  expand_member_init (C_C_D, NULL_TREE, $2);
                    725:                }
                    726:        | LEFT_RIGHT
                    727:                {
                    728:                  if (current_class_name && !flag_traditional)
                    729:                    pedwarn ("anachronistic old style base class initializer");
                    730:                  expand_member_init (C_C_D, NULL_TREE, void_type_node);
                    731:                }
                    732:        | notype_identifier '(' nonnull_exprlist ')'
                    733:                { expand_member_init (C_C_D, $<ttype>$, $3); }
                    734:        | notype_identifier LEFT_RIGHT
                    735:                { expand_member_init (C_C_D, $<ttype>$, void_type_node); }
                    736:        | complete_type_name '(' nonnull_exprlist ')'
                    737:                { expand_member_init (C_C_D, $<ttype>$, $3); }
                    738:        | complete_type_name LEFT_RIGHT
                    739:                { expand_member_init (C_C_D, $<ttype>$, void_type_node); }
                    740:        /* GNU extension */
                    741:        | notype_qualified_id '(' nonnull_exprlist ')'
                    742:                {
                    743:                  do_member_init (OP0 ($1), OP1 ($1), $3);
                    744:                }
                    745:        | notype_qualified_id LEFT_RIGHT
                    746:                {
                    747:                  do_member_init (OP0 ($1), OP1 ($1), void_type_node);
                    748:                }
                    749:        ;
                    750: 
                    751: identifier:
                    752:          IDENTIFIER
                    753:        | TYPENAME
                    754:        | PTYPENAME
                    755:        ;
                    756: 
                    757: notype_identifier:
                    758:          IDENTIFIER
                    759:        | PTYPENAME %prec EMPTY
                    760:        ;
                    761: 
                    762: identifier_defn:
                    763:          IDENTIFIER_DEFN
                    764:        | TYPENAME_DEFN
                    765:        | PTYPENAME_DEFN
                    766:        ;
                    767: 
                    768: explicit_instantiation:
                    769:          TEMPLATE specialization template_instantiation
                    770:                { do_type_instantiation ($3 ? $3 : $2, NULL_TREE); }
                    771:        | TEMPLATE typed_declspecs declarator
                    772:                { do_function_instantiation ($2, $3, NULL_TREE); }
                    773:        | SCSPEC TEMPLATE specialization template_instantiation
                    774:                { do_type_instantiation ($4 ? $4 : $3, $1); }
                    775:        | SCSPEC TEMPLATE typed_declspecs declarator
                    776:                { do_function_instantiation ($3, $4, $1); }
                    777:        ;
                    778: 
                    779: template_type:
                    780:          template_type_name tmpl.2 template_instantiation
                    781:                { if ($3) $$ = $3; }
                    782:        ;
                    783: 
                    784: template_type_name:
                    785:          PTYPENAME '<' template_arg_list '>'
                    786:                { $$ = lookup_template_class ($$, $3, NULL_TREE); }
                    787:        | PTYPENAME '<' '>'
                    788:                { $$ = lookup_template_class ($$, NULL_TREE, NULL_TREE); }
                    789:        | TYPENAME  '<' template_arg_list '>'
                    790:                { $$ = lookup_template_class ($$, $3, NULL_TREE); }
                    791:        ;
                    792: 
                    793: tmpl.2: 
                    794:          /* empty */ %prec EMPTY
                    795:                { $$ = instantiate_class_template ($<ttype>0, 1); }
                    796:        ;
                    797: 
                    798: template_arg_list:
                    799:          template_arg
                    800:                { $$ = build_tree_list (NULL_TREE, $$); }
                    801:        | template_arg_list ',' template_arg
                    802:                { $$ = chainon ($$, build_tree_list (NULL_TREE, $3)); }
                    803:        ;
                    804: 
                    805: template_arg:
                    806:          type_id
                    807:                { $$ = groktypename ($$); }
                    808:        | expr_no_commas  %prec UNARY
                    809:        ;
                    810: 
                    811: template_instantiate_once:
                    812:          PRE_PARSED_CLASS_DECL maybe_base_class_list
                    813:                {
                    814:                  tree t, decl, tmpl;
                    815: 
                    816:                  tmpl = TREE_PURPOSE (IDENTIFIER_TEMPLATE ($1));
                    817:                  t = xref_tag (DECL_TEMPLATE_INFO (tmpl)->aggr, $1, $2, 0);
                    818:                  set_current_level_tags_transparency (1);
                    819:                  my_friendly_assert (TREE_CODE (t) == RECORD_TYPE
                    820:                                      || TREE_CODE (t) == UNION_TYPE, 257);
                    821:                  $<ttype>$ = t;
                    822: 
                    823:                  /* Now, put a copy of the decl in global scope, to avoid
                    824:                     recursive expansion.  */
                    825:                  decl = IDENTIFIER_LOCAL_VALUE ($1);
                    826:                  if (!decl)
                    827:                    decl = IDENTIFIER_CLASS_VALUE ($1);
                    828:                  /* Now, put a copy of the decl in global scope, to avoid
                    829:                     recursive expansion.  */
                    830:                   if (decl)
                    831:                     {
                    832:                      /* Need to copy it to clear the chain pointer,
                    833:                         and need to get it into permanent storage.  */
                    834:                       my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 258);
                    835:                      push_obstacks (&permanent_obstack, &permanent_obstack);
                    836:                       decl = copy_node (decl);
                    837:                      if (DECL_LANG_SPECIFIC (decl))
                    838:                        copy_lang_decl (decl);
                    839:                      pop_obstacks ();
                    840:                      pushdecl_top_level (decl);
                    841:                    }
                    842:                  /* Kludge; see instantiate_class_template.  */
                    843:                  TYPE_BEING_DEFINED (t) = 0;
                    844:                }
                    845:          left_curly opt.component_decl_list '}'
                    846:                {
                    847:                  tree t = finish_struct ($<ttype>3, $5, 0);
                    848: 
                    849:                  pop_obstacks ();
                    850:                  end_template_instantiation ($1);
                    851: 
                    852:                   /* Now go after the methods & class data.  */
                    853:                   instantiate_member_templates ($1);
                    854: 
                    855:                  pop_tinst_level();
                    856: 
                    857:                  CLASSTYPE_GOT_SEMICOLON (t) = 1;
                    858:                }
                    859:        ;
                    860: 
                    861: template_instantiation:
                    862:           /* empty */
                    863:                 { $$ = NULL_TREE; }
                    864:         | template_instantiate_once
                    865:                 { $$ = $1; }
                    866:         ;
                    867: 
                    868: template_instantiate_some:
                    869:           /* empty */
                    870:                 { $$ = NULL_TREE; /* never used from here... */}
                    871:         | template_instantiate_once template_instantiate_some
                    872:                 { $$ = $1; /*???*/ }
                    873:         ;
                    874: 
                    875: unop:     '-'
                    876:                { $$ = NEGATE_EXPR; }
                    877:        | '+'
                    878:                { $$ = CONVERT_EXPR; }
                    879:        | PLUSPLUS
                    880:                { $$ = PREINCREMENT_EXPR; }
                    881:        | MINUSMINUS
                    882:                { $$ = PREDECREMENT_EXPR; }
                    883:        | '!'
                    884:                { $$ = TRUTH_NOT_EXPR; }
                    885:        ;
                    886: 
                    887: expr:    nontrivial_exprlist
                    888:                { $$ = build_x_compound_expr ($$); }
                    889:        | expr_no_commas
                    890:        ;
                    891: 
                    892: paren_expr_or_null:
                    893:        LEFT_RIGHT
                    894:                { error ("ANSI C++ forbids an empty condition for `%s'",
                    895:                         cond_stmt_keyword);
                    896:                  $$ = integer_zero_node; }
                    897:        | '(' expr ')'
                    898:                { $$ = build1 (CLEANUP_POINT_EXPR, bool_type_node, 
                    899:                               bool_truthvalue_conversion ($2)); }
                    900:        ;
                    901: 
                    902: paren_cond_or_null:
                    903:        LEFT_RIGHT
                    904:                { error ("ANSI C++ forbids an empty condition for `%s'",
                    905:                         cond_stmt_keyword);
                    906:                  $$ = integer_zero_node; }
                    907:        | '(' condition ')'
                    908:                { $$ = build1 (CLEANUP_POINT_EXPR, bool_type_node, 
                    909:                               bool_truthvalue_conversion ($2)); }
                    910:        ;
                    911: 
                    912: xcond:
                    913:        /* empty */
                    914:                { $$ = NULL_TREE; }
                    915:        | condition
                    916:                { $$ = build1 (CLEANUP_POINT_EXPR, bool_type_node, 
                    917:                               bool_truthvalue_conversion ($$)); }
                    918:        | error
                    919:                { $$ = NULL_TREE; }
                    920:        ;
                    921: 
                    922: condition:
                    923:        type_specifier_seq declarator maybe_raises maybeasm maybe_attribute '='
                    924:                { {
                    925:                  tree d;
                    926:                  for (d = getdecls (); d; d = TREE_CHAIN (d))
                    927:                    if (TREE_CODE (d) == TYPE_DECL) {
                    928:                      tree s = TREE_TYPE (d);
                    929:                      if (TREE_CODE (s) == RECORD_TYPE)
                    930:                        cp_error ("definition of class `%T' in condition", s);
                    931:                      else if (TREE_CODE (s) == ENUMERAL_TYPE)
                    932:                        cp_error ("definition of enum `%T' in condition", s);
                    933:                    }
                    934:                  }
                    935:                  current_declspecs = $1;
                    936:                  $<itype>6 = suspend_momentary ();
                    937:                  $<ttype>$ = start_decl ($<ttype>2, current_declspecs, 1, $3);
                    938:                  cplus_decl_attributes ($<ttype>$, $5);
                    939:                }
                    940:        init
                    941:                { 
                    942:                  finish_decl ($<ttype>7, $8, $5, 0);
                    943:                  resume_momentary ($<itype>6);
                    944:                  $$ = $<ttype>7; 
                    945:                  if (TREE_CODE (TREE_TYPE ($$)) == ARRAY_TYPE)
                    946:                    cp_error ("definition of array `%#D' in condition", $$); 
                    947:                }
                    948:        | expr
                    949:        ;
                    950: 
                    951: already_scoped_stmt:
                    952:          '{' '}'
                    953:                { finish_stmt (); }
                    954:        | '{' maybe_label_decls stmts '}'
                    955:                { finish_stmt (); }
                    956:        | '{' maybe_label_decls error '}'
                    957:                { finish_stmt (); }
                    958:        | simple_stmt
                    959:        ;
                    960: 
                    961: 
                    962: nontrivial_exprlist:
                    963:          expr_no_commas ',' expr_no_commas
                    964:                { $$ = tree_cons (NULL_TREE, $$, 
                    965:                                  build_tree_list (NULL_TREE, $3)); }
                    966:        | expr_no_commas ',' error
                    967:                { $$ = tree_cons (NULL_TREE, $$, 
                    968:                                  build_tree_list (NULL_TREE, error_mark_node)); }
                    969:        | nontrivial_exprlist ',' expr_no_commas
                    970:                { chainon ($$, build_tree_list (NULL_TREE, $3)); }
                    971:        | nontrivial_exprlist ',' error
                    972:                { chainon ($$, build_tree_list (NULL_TREE, error_mark_node)); }
                    973:        ;
                    974: 
                    975: nonnull_exprlist:
                    976:          expr_no_commas
                    977:                { $$ = build_tree_list (NULL_TREE, $$); }
                    978:        | nontrivial_exprlist
                    979:        ;
                    980: 
                    981: unary_expr:
                    982:          primary %prec UNARY
                    983:                {
                    984: #if 0
                    985:                  if (TREE_CODE ($$) == TYPE_EXPR)
                    986:                    $$ = build_component_type_expr (C_C_D, $$, NULL_TREE, 1);
                    987: #endif
                    988:                }
                    989:        /* __extension__ turns off -pedantic for following primary.  */
                    990:        | EXTENSION
                    991:                { $<itype>1 = pedantic;
                    992:                  pedantic = 0; }
                    993:          cast_expr       %prec UNARY
                    994:                { $$ = $3;
                    995:                  pedantic = $<itype>1; }
                    996:        | '*' cast_expr   %prec UNARY
                    997:                { $$ = build_x_indirect_ref ($2, "unary *"); }
                    998:        | '&' cast_expr   %prec UNARY
                    999:                { $$ = build_x_unary_op (ADDR_EXPR, $2); }
                   1000:        | '~' cast_expr
                   1001:                { $$ = build_x_unary_op (BIT_NOT_EXPR, $2); }
                   1002:        | unop cast_expr  %prec UNARY
                   1003:                { $$ = build_x_unary_op ($1, $2);
                   1004:                  if ($1 == NEGATE_EXPR && TREE_CODE ($2) == INTEGER_CST)
                   1005:                    TREE_NEGATED_INT ($$) = 1;
                   1006:                  overflow_warning ($$);
                   1007:                }
                   1008:        /* Refer to the address of a label as a pointer.  */
                   1009:        | ANDAND identifier
                   1010:                { tree label = lookup_label ($2);
                   1011:                  if (label == NULL_TREE)
                   1012:                    $$ = null_pointer_node;
                   1013:                  else
                   1014:                    {
                   1015:                      TREE_USED (label) = 1;
                   1016:                      $$ = build1 (ADDR_EXPR, ptr_type_node, label);
                   1017:                      TREE_CONSTANT ($$) = 1;
                   1018:                    }
                   1019:                }
                   1020:        | SIZEOF unary_expr  %prec UNARY
                   1021:                { if (TREE_CODE ($2) == COMPONENT_REF
                   1022:                      && DECL_BIT_FIELD (TREE_OPERAND ($2, 1)))
                   1023:                    error ("sizeof applied to a bit-field");
                   1024:                  /* ANSI says arrays and functions are converted inside comma.
                   1025:                     But we can't really convert them in build_compound_expr
                   1026:                     because that would break commas in lvalues.
                   1027:                     So do the conversion here if operand was a comma.  */
                   1028:                  if (TREE_CODE ($2) == COMPOUND_EXPR
                   1029:                      && (TREE_CODE (TREE_TYPE ($2)) == ARRAY_TYPE
                   1030:                          || TREE_CODE (TREE_TYPE ($2)) == FUNCTION_TYPE))
                   1031:                    $2 = default_conversion ($2);
                   1032:                  else if (TREE_CODE ($2) == TREE_LIST)
                   1033:                    {
                   1034:                      tree t = TREE_VALUE ($2);
                   1035:                      if (t != NULL_TREE
                   1036:                          && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
                   1037:                        pedwarn ("ANSI C++ forbids using sizeof() on a function");
                   1038:                    }
                   1039:                  $$ = c_sizeof (TREE_TYPE ($2)); }
                   1040:        | SIZEOF '(' type_id ')'  %prec HYPERUNARY
                   1041:                { $$ = c_sizeof (groktypename ($3)); }
                   1042:        | ALIGNOF unary_expr  %prec UNARY
                   1043:                { $$ = grok_alignof ($2); }
                   1044:        | ALIGNOF '(' type_id ')'  %prec HYPERUNARY
                   1045:                { $$ = c_alignof (groktypename ($3)); }
                   1046: 
                   1047:        /* The %prec EMPTY's here are required by the = init initializer
                   1048:           syntax extension; see below.  */
                   1049:        | new new_type_id %prec EMPTY
                   1050:                { $$ = build_new (NULL_TREE, $2, NULL_TREE, $1); }
                   1051:        | new new_type_id new_initializer
                   1052:                { $$ = build_new (NULL_TREE, $2, $3, $1); }
                   1053:        | new new_placement new_type_id %prec EMPTY
                   1054:                { $$ = build_new ($2, $3, NULL_TREE, $1); }
                   1055:        | new new_placement new_type_id new_initializer
                   1056:                { $$ = build_new ($2, $3, $4, $1); }
                   1057:        | new '(' type_id ')' %prec EMPTY
                   1058:                { $$ = build_new (NULL_TREE, groktypename($3),
                   1059:                                  NULL_TREE, $1); }
                   1060:        | new '(' type_id ')' new_initializer
                   1061:                { $$ = build_new (NULL_TREE, groktypename($3), $5, $1); }
                   1062:        | new new_placement '(' type_id ')' %prec EMPTY
                   1063:                { $$ = build_new ($2, groktypename($4), NULL_TREE, $1); }
                   1064:        | new new_placement '(' type_id ')' new_initializer
                   1065:                { $$ = build_new ($2, groktypename($4), $6, $1); }
                   1066: 
                   1067:        | delete cast_expr  %prec UNARY
                   1068:                { $$ = delete_sanity ($2, NULL_TREE, 0, $1); }
                   1069:        | delete '[' ']' cast_expr  %prec UNARY
                   1070:                { $$ = delete_sanity ($4, NULL_TREE, 1, $1);
                   1071:                  if (yychar == YYEMPTY)
                   1072:                    yychar = YYLEX; }
                   1073:        | delete '[' expr ']' cast_expr %prec UNARY
                   1074:                { $$ = delete_sanity ($5, $3, 2, $1);
                   1075:                  if (yychar == YYEMPTY)
                   1076:                    yychar = YYLEX; }
                   1077:        ;
                   1078: 
                   1079: new_placement:
                   1080:          '(' nonnull_exprlist ')'
                   1081:                { $$ = $2; }
                   1082:        | '{' nonnull_exprlist '}'
                   1083:                {
                   1084:                  $$ = $2; 
                   1085:                  pedwarn ("old style placement syntax, use () instead");
                   1086:                }
                   1087:        ;
                   1088: 
                   1089: new_initializer:
                   1090:          '(' nonnull_exprlist ')'
                   1091:                { $$ = $2; }
                   1092:        | LEFT_RIGHT
                   1093:                { $$ = NULL_TREE; }
                   1094:        | '(' typespec ')'
                   1095:                {
                   1096:                  cp_error ("`%T' is not a valid expression", $2);
                   1097:                  $$ = error_mark_node;
                   1098:                }
                   1099:        /* GNU extension so people can use initializer lists.  Note that
                   1100:           this alters the meaning of `new int = 1', which was previously
                   1101:           syntactically valid but semantically invalid.  */
                   1102:        | '=' init
                   1103:                {
                   1104:                  if (flag_ansi)
                   1105:                    pedwarn ("ANSI C++ forbids initialization of new expression with `='");
                   1106:                  $$ = $2;
                   1107:                }
                   1108:        ;
                   1109: 
                   1110: /* This is necessary to postpone reduction of `int ((int)(int)(int))'.  */
                   1111: regcast_or_absdcl:
                   1112:          '(' type_id ')' %prec EMPTY
                   1113:                { $2 = tree_cons (NULL_TREE, $2, void_list_node);
                   1114:                  TREE_PARMLIST ($2) = 1;
                   1115:                  $$ = build_parse_node (CALL_EXPR, NULL_TREE, $2, 
                   1116:                                         NULL_TREE); }
                   1117:        | regcast_or_absdcl '(' type_id ')' %prec EMPTY
                   1118:                { $3 = tree_cons (NULL_TREE, $3, void_list_node);
                   1119:                  TREE_PARMLIST ($3) = 1;
                   1120:                  $$ = build_parse_node (CALL_EXPR, $$, $3, NULL_TREE); }
                   1121:        ;
                   1122: 
                   1123: cast_expr:
                   1124:          sub_cast_expr
                   1125:        | regcast_or_absdcl sub_cast_expr  %prec UNARY
                   1126:                { $$ = reparse_absdcl_as_casts ($$, $2); }
                   1127:        | regcast_or_absdcl '{' initlist maybecomma '}'  %prec UNARY
                   1128:                { 
                   1129:                  tree init = build_nt (CONSTRUCTOR, NULL_TREE,
                   1130:                                        nreverse ($3)); 
                   1131:                  if (flag_ansi)
                   1132:                    pedwarn ("ANSI C++ forbids constructor-expressions");
                   1133:                  /* Indicate that this was a GNU C constructor expression.  */
                   1134:                  TREE_HAS_CONSTRUCTOR (init) = 1;
                   1135: 
                   1136:                  $$ = reparse_absdcl_as_casts ($$, init);
                   1137:                }
                   1138:        ;
                   1139: 
                   1140: sub_cast_expr:
                   1141:          unary_expr
                   1142:        | HEADOF '(' expr ')'
                   1143:                { $$ = build_headof ($3); }
                   1144:        | CLASSOF '(' expr ')'
                   1145:                { $$ = build_classof ($3); }
                   1146:        | CLASSOF '(' TYPENAME ')'
                   1147:                { if (is_aggr_typedef ($3, 1))
                   1148:                    {
                   1149:                      tree type = IDENTIFIER_TYPE_VALUE ($3);
                   1150:                      if (! IS_SIGNATURE(type))
                   1151:                        $$ = CLASSTYPE_DOSSIER (type);
                   1152:                      else
                   1153:                        {
                   1154:                          sorry ("signature name as argument of `classof'");
                   1155:                          $$ = error_mark_node;
                   1156:                        }
                   1157:                    }
                   1158:                  else
                   1159:                    $$ = error_mark_node;
                   1160:                }
                   1161:        ;
                   1162: 
                   1163: expr_no_commas:
                   1164:          cast_expr
                   1165:        /* Handle general members.  */
                   1166:        | expr_no_commas POINTSAT_STAR expr_no_commas
                   1167:                { $$ = build_x_binary_op (MEMBER_REF, $$, $3); }
                   1168:        | expr_no_commas DOT_STAR expr_no_commas
                   1169:                { $$ = build_m_component_ref ($$, $3); }
                   1170:        | expr_no_commas '+' expr_no_commas
                   1171:                { $$ = build_x_binary_op ($2, $$, $3); }
                   1172:        | expr_no_commas '-' expr_no_commas
                   1173:                { $$ = build_x_binary_op ($2, $$, $3); }
                   1174:        | expr_no_commas '*' expr_no_commas
                   1175:                { $$ = build_x_binary_op ($2, $$, $3); }
                   1176:        | expr_no_commas '/' expr_no_commas
                   1177:                { $$ = build_x_binary_op ($2, $$, $3); }
                   1178:        | expr_no_commas '%' expr_no_commas
                   1179:                { $$ = build_x_binary_op ($2, $$, $3); }
                   1180:        | expr_no_commas LSHIFT expr_no_commas
                   1181:                { $$ = build_x_binary_op ($2, $$, $3); }
                   1182:        | expr_no_commas RSHIFT expr_no_commas
                   1183:                { $$ = build_x_binary_op ($2, $$, $3); }
                   1184:        | expr_no_commas ARITHCOMPARE expr_no_commas
                   1185:                { $$ = build_x_binary_op ($2, $$, $3); }
                   1186:        | expr_no_commas '<' expr_no_commas
                   1187:                { $$ = build_x_binary_op (LT_EXPR, $$, $3); }
                   1188:        | expr_no_commas '>' expr_no_commas
                   1189:                { $$ = build_x_binary_op (GT_EXPR, $$, $3); }
                   1190:        | expr_no_commas EQCOMPARE expr_no_commas
                   1191:                { $$ = build_x_binary_op ($2, $$, $3); }
                   1192:        | expr_no_commas MIN_MAX expr_no_commas
                   1193:                { $$ = build_x_binary_op ($2, $$, $3); }
                   1194:        | expr_no_commas '&' expr_no_commas
                   1195:                { $$ = build_x_binary_op ($2, $$, $3); }
                   1196:        | expr_no_commas '|' expr_no_commas
                   1197:                { $$ = build_x_binary_op ($2, $$, $3); }
                   1198:        | expr_no_commas '^' expr_no_commas
                   1199:                { $$ = build_x_binary_op ($2, $$, $3); }
                   1200:        | expr_no_commas ANDAND expr_no_commas
                   1201:                { $$ = build_x_binary_op (TRUTH_ANDIF_EXPR, $$, $3); }
                   1202:        | expr_no_commas OROR expr_no_commas
                   1203:                { $$ = build_x_binary_op (TRUTH_ORIF_EXPR, $$, $3); }
                   1204:        | expr_no_commas '?' xexpr ':' expr_no_commas
                   1205:                { $$ = build_x_conditional_expr ($$, $3, $5); }
                   1206:        | expr_no_commas '=' expr_no_commas
                   1207:                { $$ = build_modify_expr ($$, NOP_EXPR, $3); }
                   1208:        | expr_no_commas ASSIGN expr_no_commas
                   1209:                { register tree rval;
                   1210:                  if ((rval = build_opfncall (MODIFY_EXPR, LOOKUP_NORMAL, $$, $3,
                   1211:                                             make_node ($2))))
                   1212:                    $$ = rval;
                   1213:                  else
                   1214:                    $$ = build_modify_expr ($$, $2, $3); }
                   1215:        | THROW
                   1216:                { $$ = build_throw (NULL_TREE); }
                   1217:        | THROW expr_no_commas
                   1218:                { $$ = build_throw ($2); }
                   1219: /* These extensions are not defined.  The second arg to build_m_component_ref
                   1220:    is old, build_m_component_ref now does an implicit
                   1221:    build_indirect_ref (x, NULL_PTR) on the second argument.
                   1222:        | object '&' expr_no_commas   %prec UNARY
                   1223:                { $$ = build_m_component_ref ($$, build_x_unary_op (ADDR_EXPR, $3)); }
                   1224:        | object unop expr_no_commas  %prec UNARY
                   1225:                { $$ = build_m_component_ref ($$, build_x_unary_op ($2, $3)); }
                   1226:        | object '(' type_id ')' expr_no_commas  %prec UNARY
                   1227:                { tree type = groktypename ($3);
                   1228:                  $$ = build_m_component_ref ($$, build_c_cast (type, $5)); }
                   1229:        | object primary_no_id  %prec UNARY
                   1230:                { $$ = build_m_component_ref ($$, $2); }
                   1231: */
                   1232:        ;
                   1233: 
                   1234: notype_unqualified_id:
                   1235:          '~' see_typename identifier
                   1236:                { $$ = build_parse_node (BIT_NOT_EXPR, $3); }
                   1237:        | operator_name
                   1238:        | IDENTIFIER
                   1239:        | PTYPENAME %prec EMPTY
                   1240:        ;
                   1241: 
                   1242: unqualified_id:
                   1243:          notype_unqualified_id
                   1244:        | TYPENAME
                   1245:        ;
                   1246: 
                   1247: expr_or_declarator:
                   1248:          notype_unqualified_id
                   1249:        | notype_qualified_id
                   1250:        | '*' expr_or_declarator %prec UNARY
                   1251:                { $$ = build_parse_node (INDIRECT_REF, $2); }
                   1252:        | '&' expr_or_declarator %prec UNARY
                   1253:                { $$ = build_parse_node (ADDR_EXPR, $2); }
                   1254:        ;
                   1255: 
                   1256: direct_notype_declarator:
                   1257:          complex_direct_notype_declarator
                   1258:        | notype_unqualified_id
                   1259:        | notype_qualified_id
                   1260:                { push_nested_class (TREE_TYPE (OP0 ($$)), 3);
                   1261:                  TREE_COMPLEXITY ($$) = current_class_depth; }
                   1262:        ;
                   1263: 
                   1264: primary:
                   1265:          notype_unqualified_id
                   1266:                {
                   1267:                  if (TREE_CODE ($$) == BIT_NOT_EXPR)
                   1268:                    $$ = build_x_unary_op (BIT_NOT_EXPR, TREE_OPERAND ($$, 0));
                   1269:                  else if (IDENTIFIER_OPNAME_P ($$))
                   1270:                    {
                   1271:                      tree op = $$;
                   1272:                      $$ = lookup_name (op, 0);
                   1273:                      if ($$ == NULL_TREE)
                   1274:                        {
                   1275:                          if (op != ansi_opname[ERROR_MARK])
                   1276:                            error ("operator %s not defined",
                   1277:                                   operator_name_string (op));
                   1278:                          $$ = error_mark_node;
                   1279:                        }
                   1280:                    }
                   1281:                  else
                   1282:                    $$ = do_identifier ($$);
                   1283:                }               
                   1284:        | CONSTANT
                   1285:        | boolean.literal
                   1286:        | string
                   1287:                { $$ = combine_strings ($$); }
                   1288:        | '(' expr ')'
                   1289:                { $$ = $2; }
                   1290:        | '(' error ')'
                   1291:                { $$ = error_mark_node; }
                   1292:        | '('
                   1293:                { if (current_function_decl == 0)
                   1294:                    {
                   1295:                      error ("braced-group within expression allowed only inside a function");
                   1296:                      YYERROR;
                   1297:                    }
                   1298:                  keep_next_level ();
                   1299:                  $<ttype>$ = expand_start_stmt_expr (); }
                   1300:          compstmt ')'
                   1301:                { tree rtl_exp;
                   1302:                  if (flag_ansi)
                   1303:                    pedwarn ("ANSI C++ forbids braced-groups within expressions");
                   1304:                  rtl_exp = expand_end_stmt_expr ($<ttype>2);
                   1305:                  /* The statements have side effects, so the group does.  */
                   1306:                  TREE_SIDE_EFFECTS (rtl_exp) = 1;
                   1307: 
                   1308:                  if (TREE_CODE ($3) == BLOCK)
                   1309:                    {
                   1310:                      /* Make a BIND_EXPR for the BLOCK already made.  */
                   1311:                      $$ = build (BIND_EXPR, TREE_TYPE (rtl_exp),
                   1312:                                  NULL_TREE, rtl_exp, $3);
                   1313:                      /* Remove the block from the tree at this point.
                   1314:                         It gets put back at the proper place
                   1315:                         when the BIND_EXPR is expanded.  */
                   1316:                      delete_block ($3);
                   1317:                    }
                   1318:                  else
                   1319:                    $$ = $3;
                   1320:                }
                   1321:        | primary '(' nonnull_exprlist ')'
                   1322:                 { /* [eichin:19911016.1902EST] */
                   1323:                   $<ttype>$ = build_x_function_call ($1, $3, current_class_decl); 
                   1324:                   /* here we instantiate_class_template as needed... */
                   1325:                   do_pending_templates ();
                   1326:                 } template_instantiate_some {
                   1327:                   if (TREE_CODE ($<ttype>5) == CALL_EXPR
                   1328:                       && TREE_TYPE ($<ttype>5) != void_type_node)
                   1329:                    $$ = require_complete_type ($<ttype>5);
                   1330:                   else
                   1331:                     $$ = $<ttype>5;
                   1332:                 }
                   1333:        | primary LEFT_RIGHT
                   1334:                 {
                   1335:                  $$ = build_x_function_call ($$, NULL_TREE, current_class_decl);
                   1336:                  if (TREE_CODE ($$) == CALL_EXPR
                   1337:                      && TREE_TYPE ($$) != void_type_node)
                   1338:                    $$ = require_complete_type ($$);
                   1339:                 }
                   1340:        | primary '[' expr ']'
                   1341:                { $$ = grok_array_decl ($$, $3); }
                   1342:        | primary PLUSPLUS
                   1343:                { /* If we get an OFFSET_REF, turn it into what it really
                   1344:                     means (e.g., a COMPONENT_REF).  This way if we've got,
                   1345:                     say, a reference to a static member that's being operated
                   1346:                     on, we don't end up trying to find a member operator for
                   1347:                     the class it's in.  */
                   1348:                  if (TREE_CODE ($$) == OFFSET_REF)
                   1349:                    $$ = resolve_offset_ref ($$);
                   1350:                  $$ = build_x_unary_op (POSTINCREMENT_EXPR, $$); }
                   1351:        | primary MINUSMINUS
                   1352:                { if (TREE_CODE ($$) == OFFSET_REF)
                   1353:                    $$ = resolve_offset_ref ($$);
                   1354:                  $$ = build_x_unary_op (POSTDECREMENT_EXPR, $$); }
                   1355:        /* C++ extensions */
                   1356:        | THIS
                   1357:                { if (current_class_decl)
                   1358:                    {
                   1359: #ifdef WARNING_ABOUT_CCD
                   1360:                      TREE_USED (current_class_decl) = 1;
                   1361: #endif
                   1362:                      $$ = current_class_decl;
                   1363:                    }
                   1364:                  else if (current_function_decl
                   1365:                           && DECL_STATIC_FUNCTION_P (current_function_decl))
                   1366:                    {
                   1367:                      error ("`this' is unavailable for static member functions");
                   1368:                      $$ = error_mark_node;
                   1369:                    }
                   1370:                  else
                   1371:                    {
                   1372:                      if (current_function_decl)
                   1373:                        error ("invalid use of `this' in non-member function");
                   1374:                      else
                   1375:                        error ("invalid use of `this' at top level");
                   1376:                      $$ = error_mark_node;
                   1377:                    }
                   1378:                }
                   1379:        | TYPE_QUAL '(' nonnull_exprlist ')'
                   1380:                {
                   1381:                  tree type;
                   1382:                  tree id = $$;
                   1383: 
                   1384:                  /* This is a C cast in C++'s `functional' notation.  */
                   1385:                  if ($3 == error_mark_node)
                   1386:                    {
                   1387:                      $$ = error_mark_node;
                   1388:                      break;
                   1389:                    }
                   1390: #if 0
                   1391:                  if ($3 == NULL_TREE)
                   1392:                    {
                   1393:                      error ("cannot cast null list to type `%s'",
                   1394:                             IDENTIFIER_POINTER (TYPE_NAME (id)));
                   1395:                      $$ = error_mark_node;
                   1396:                      break;
                   1397:                    }
                   1398: #endif
                   1399: #if 0
                   1400:                  /* type is not set! (mrs) */
                   1401:                  if (type == error_mark_node)
                   1402:                    $$ = error_mark_node;
                   1403:                  else
                   1404: #endif
                   1405:                    {
                   1406:                      if (id == ridpointers[(int) RID_CONST])
                   1407:                        type = build_type_variant (integer_type_node, 1, 0);
                   1408:                      else if (id == ridpointers[(int) RID_VOLATILE])
                   1409:                        type = build_type_variant (integer_type_node, 0, 1);
                   1410: #if 0
                   1411:                      /* should not be able to get here (mrs) */
                   1412:                      else if (id == ridpointers[(int) RID_FRIEND])
                   1413:                        {
                   1414:                          error ("cannot cast expression to `friend' type");
                   1415:                          $$ = error_mark_node;
                   1416:                          break;
                   1417:                        }
                   1418: #endif
                   1419:                      else my_friendly_abort (79);
                   1420:                      $$ = build_c_cast (type, build_compound_expr ($3));
                   1421:                    }
                   1422:                }
                   1423:        | functional_cast
                   1424:        | DYNAMIC_CAST '<' type_id '>' '(' expr ')'
                   1425:                { tree type = groktypename ($3);
                   1426:                  $$ = build_dynamic_cast (type, $6); }
                   1427:        | STATIC_CAST '<' type_id '>' '(' expr ')'
                   1428:                { tree type = groktypename ($3);
                   1429:                  $$ = build_static_cast (type, $6); }
                   1430:        | REINTERPRET_CAST '<' type_id '>' '(' expr ')'
                   1431:                { tree type = groktypename ($3);
                   1432:                  $$ = build_reinterpret_cast (type, $6); }
                   1433:        | CONST_CAST '<' type_id '>' '(' expr ')'
                   1434:                { tree type = groktypename ($3);
                   1435:                  $$ = build_const_cast (type, $6); }
                   1436:        | TYPEID '(' expr ')'
                   1437:                { $$ = build_typeid ($3); }
                   1438:        | TYPEID '(' type_id ')'
                   1439:                { tree type = groktypename ($3);
                   1440:                  $$ = get_typeid (type); }
                   1441:        | global_scope IDENTIFIER
                   1442:                {
                   1443:                do_scoped_id:
                   1444:                  $$ = IDENTIFIER_GLOBAL_VALUE ($2);
                   1445:                  if (yychar == YYEMPTY)
                   1446:                    yychar = YYLEX;
                   1447:                  if (! $$)
                   1448:                    {
                   1449:                      if (yychar == '(' || yychar == LEFT_RIGHT)
                   1450:                        $$ = implicitly_declare ($2);
                   1451:                      else
                   1452:                        {
                   1453:                          if (IDENTIFIER_GLOBAL_VALUE ($2) != error_mark_node)
                   1454:                            error ("undeclared variable `%s' (first use here)",
                   1455:                                   IDENTIFIER_POINTER ($2));
                   1456:                          $$ = error_mark_node;
                   1457:                          /* Prevent repeated error messages.  */
                   1458:                          IDENTIFIER_GLOBAL_VALUE ($2) = error_mark_node;
                   1459:                        }
                   1460:                    }
                   1461:                  else
                   1462:                    {
                   1463:                      if (TREE_CODE ($$) == ADDR_EXPR)
                   1464:                        assemble_external (TREE_OPERAND ($$, 0));
                   1465:                      else
                   1466:                        assemble_external ($$);
                   1467:                      TREE_USED ($$) = 1;
                   1468:                    }
                   1469:                  if (TREE_CODE ($$) == CONST_DECL)
                   1470:                    {
                   1471:                      /* XXX CHS - should we set TREE_USED of the constant? */
                   1472:                      $$ = DECL_INITIAL ($$);
                   1473:                      /* This is to prevent an enum whose value is 0
                   1474:                         from being considered a null pointer constant.  */
                   1475:                      $$ = build1 (NOP_EXPR, TREE_TYPE ($$), $$);
                   1476:                      TREE_CONSTANT ($$) = 1;
                   1477:                    }
                   1478: 
                   1479:                }
                   1480:        | global_scope operator_name
                   1481:                {
                   1482:                  got_scope = NULL_TREE;
                   1483:                  if (TREE_CODE ($2) == IDENTIFIER_NODE)
                   1484:                    goto do_scoped_id;
                   1485:                  $$ = $2;
                   1486:                }
                   1487:        | overqualified_id %prec HYPERUNARY
                   1488:                { $$ = build_offset_ref (OP0 ($$), OP1 ($$)); }
                   1489:        | overqualified_id '(' nonnull_exprlist ')'
                   1490:                { $$ = build_member_call (OP0 ($$), OP1 ($$), $3); }
                   1491:        | overqualified_id LEFT_RIGHT
                   1492:                { $$ = build_member_call (OP0 ($$), OP1 ($$), NULL_TREE); }
                   1493:        | object unqualified_id  %prec UNARY
                   1494:                { $$ = build_component_ref ($$, $2, NULL_TREE, 1); }
                   1495:        | object qualified_id %prec UNARY
                   1496:                { $$ = build_object_ref ($$, OP0 ($2), OP1 ($2)); }
                   1497:        | object unqualified_id '(' nonnull_exprlist ')'
                   1498:                {
                   1499: #if 0
                   1500:                  /* This is a future direction of this code, but because
                   1501:                     build_x_function_call cannot always undo what is done
                   1502:                     in build_component_ref entirely yet, we cannot do this. */
                   1503:                  $$ = build_x_function_call (build_component_ref ($$, $2, NULL_TREE, 1), $4, $$);
                   1504:                  if (TREE_CODE ($$) == CALL_EXPR
                   1505:                      && TREE_TYPE ($$) != void_type_node)
                   1506:                    $$ = require_complete_type ($$);
                   1507: #else
                   1508:                  $$ = build_method_call ($$, $2, $4, NULL_TREE,
                   1509:                                          (LOOKUP_NORMAL|LOOKUP_AGGR));
                   1510: #endif
                   1511:                }
                   1512:        | object unqualified_id LEFT_RIGHT
                   1513:                {
                   1514: #if 0
                   1515:                  /* This is a future direction of this code, but because
                   1516:                     build_x_function_call cannot always undo what is done
                   1517:                     in build_component_ref entirely yet, we cannot do this. */
                   1518:                  $$ = build_x_function_call (build_component_ref ($$, $2, NULL_TREE, 1), NULL_TREE, $$);
                   1519:                  if (TREE_CODE ($$) == CALL_EXPR
                   1520:                      && TREE_TYPE ($$) != void_type_node)
                   1521:                    $$ = require_complete_type ($$);
                   1522: #else
                   1523:                  $$ = build_method_call ($$, $2, NULL_TREE, NULL_TREE,
                   1524:                                          (LOOKUP_NORMAL|LOOKUP_AGGR));
                   1525: #endif
                   1526:                }
                   1527:        | object qualified_id '(' nonnull_exprlist ')'
                   1528:                {
                   1529:                  if (IS_SIGNATURE (IDENTIFIER_TYPE_VALUE (OP0 ($2))))
                   1530:                    {
                   1531:                      warning ("signature name in scope resolution ignored");
                   1532:                      $$ = build_method_call ($$, OP1 ($2), $4, NULL_TREE,
                   1533:                                              (LOOKUP_NORMAL|LOOKUP_AGGR));
                   1534:                    }
                   1535:                  else
                   1536:                    $$ = build_scoped_method_call ($$, OP0 ($2), OP1 ($2), $4);
                   1537:                }
                   1538:        | object qualified_id LEFT_RIGHT
                   1539:                {
                   1540:                  if (IS_SIGNATURE (IDENTIFIER_TYPE_VALUE (OP0 ($2))))
                   1541:                    {
                   1542:                      warning ("signature name in scope resolution ignored");
                   1543:                      $$ = build_method_call ($$, OP1 ($2), NULL_TREE, NULL_TREE,
                   1544:                                              (LOOKUP_NORMAL|LOOKUP_AGGR));
                   1545:                    }
                   1546:                  else
                   1547:                    $$ = build_scoped_method_call ($$, OP0 ($2), OP1 ($2), NULL_TREE);
                   1548:                }
                   1549:        /* p->int::~int() is valid -- 12.4 */
                   1550:        | object '~' TYPESPEC LEFT_RIGHT
                   1551:                { 
                   1552:                  if (TREE_CODE (TREE_TYPE ($1)) 
                   1553:                      != TREE_CODE (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE ($3))))
                   1554:                    cp_error ("`%E' is not of type `%T'", $1, $3);
                   1555:                  $$ = convert (void_type_node, $1);
                   1556:                }
                   1557:        | object TYPESPEC SCOPE '~' TYPESPEC LEFT_RIGHT
                   1558:                { 
                   1559:                  if ($2 != $5)
                   1560:                    cp_error ("destructor specifier `%T::~%T()' must have matching names", $2, $5);
                   1561:                  if (TREE_CODE (TREE_TYPE ($1))
                   1562:                      != TREE_CODE (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE ($2))))
                   1563:                    cp_error ("`%E' is not of type `%T'", $1, $2);
                   1564:                  $$ = convert (void_type_node, $1);
                   1565:                }
                   1566:        ;
                   1567: 
                   1568: /* Not needed for now.
                   1569: 
                   1570: primary_no_id:
                   1571:          '(' expr ')'
                   1572:                { $$ = $2; }
                   1573:        | '(' error ')'
                   1574:                { $$ = error_mark_node; }
                   1575:        | '('
                   1576:                { if (current_function_decl == 0)
                   1577:                    {
                   1578:                      error ("braced-group within expression allowed only inside a function");
                   1579:                      YYERROR;
                   1580:                    }
                   1581:                  $<ttype>$ = expand_start_stmt_expr (); }
                   1582:          compstmt ')'
                   1583:                { if (flag_ansi)
                   1584:                    pedwarn ("ANSI C++ forbids braced-groups within expressions");
                   1585:                  $$ = expand_end_stmt_expr ($<ttype>2); }
                   1586:        | primary_no_id '(' nonnull_exprlist ')'
                   1587:                { $$ = build_x_function_call ($$, $3, current_class_decl); }
                   1588:        | primary_no_id LEFT_RIGHT
                   1589:                { $$ = build_x_function_call ($$, NULL_TREE, current_class_decl); }
                   1590:        | primary_no_id '[' expr ']'
                   1591:                { goto do_array; }
                   1592:        | primary_no_id PLUSPLUS
                   1593:                { $$ = build_x_unary_op (POSTINCREMENT_EXPR, $$); }
                   1594:        | primary_no_id MINUSMINUS
                   1595:                { $$ = build_x_unary_op (POSTDECREMENT_EXPR, $$); }
                   1596:        | SCOPE IDENTIFIER
                   1597:                { goto do_scoped_id; }
                   1598:        | SCOPE operator_name
                   1599:                { if (TREE_CODE ($2) == IDENTIFIER_NODE)
                   1600:                    goto do_scoped_id;
                   1601:                  goto do_scoped_operator;
                   1602:                }
                   1603:        ;
                   1604: */
                   1605: 
                   1606: new:     NEW
                   1607:                { $$ = 0; }
                   1608:        | global_scope NEW
                   1609:                { got_scope = NULL_TREE; $$ = 1; }
                   1610:        ;
                   1611: 
                   1612: delete:          DELETE
                   1613:                { $$ = 0; }
                   1614:        | global_scope delete
                   1615:                { got_scope = NULL_TREE; $$ = 1; }
                   1616:        ;
                   1617: 
                   1618: boolean.literal:
                   1619:          CXX_TRUE
                   1620:                { $$ = true_node; }
                   1621:        | CXX_FALSE
                   1622:                { $$ = false_node; }
                   1623:        ;
                   1624: 
                   1625: /* Produces a STRING_CST with perhaps more STRING_CSTs chained onto it.  */
                   1626: string:
                   1627:          STRING
                   1628:        | string STRING
                   1629:                { $$ = chainon ($$, $2); }
                   1630:        ;
                   1631: 
                   1632: nodecls:
                   1633:          /* empty */
                   1634:                {
                   1635:                  if (! current_function_parms_stored)
                   1636:                    store_parm_decls ();
                   1637:                  setup_vtbl_ptr ();
                   1638:                  /* Always keep the BLOCK node associated with the outermost
                   1639:                     pair of curley braces of a function.  These are needed
                   1640:                     for correct operation of dwarfout.c.  */
                   1641:                  keep_next_level ();
                   1642:                }
                   1643:        ;
                   1644: 
                   1645: object:          primary '.'
                   1646:        | primary POINTSAT
                   1647:                {
                   1648:                  $$ = build_x_arrow ($$);
                   1649:                }
                   1650:        ;
                   1651: 
                   1652: decl:
                   1653:        /* Normal case: make this fast.  */
                   1654:          typespec declarator ';'
                   1655:                { tree d = get_decl_list ($1);
                   1656:                  int yes = suspend_momentary ();
                   1657:                  d = start_decl ($2, d, 0, NULL_TREE);
                   1658:                  finish_decl (d, NULL_TREE, NULL_TREE, 0);
                   1659:                  resume_momentary (yes);
                   1660:                  if (IS_AGGR_TYPE_CODE (TREE_CODE ($1)))
                   1661:                    note_got_semicolon ($1);
                   1662:                }
                   1663:        | typed_declspecs declarator ';'
                   1664:                { tree d = $1;
                   1665:                  int yes = suspend_momentary ();
                   1666:                  d = start_decl ($2, d, 0, NULL_TREE);
                   1667:                  finish_decl (d, NULL_TREE, NULL_TREE, 0);
                   1668:                  resume_momentary (yes);
                   1669:                  note_list_got_semicolon ($1);
                   1670:                }
                   1671:        | typespec initdecls ';'
                   1672:                {
                   1673:                  resume_momentary ($2);
                   1674:                  if (IS_AGGR_TYPE_CODE (TREE_CODE ($1)))
                   1675:                    note_got_semicolon ($1);
                   1676:                }
                   1677:        | typed_declspecs initdecls ';'
                   1678:                {
                   1679:                  resume_momentary ($2);
                   1680:                  note_list_got_semicolon ($1);
                   1681:                }
                   1682:        | declmods notype_initdecls ';'
                   1683:                { resume_momentary ($2); }
                   1684:        | typed_declspecs ';'
                   1685:                {
                   1686:                  shadow_tag ($1);
                   1687:                  note_list_got_semicolon ($1);
                   1688:                }
                   1689:        | declmods ';'
                   1690:                { warning ("empty declaration"); }
                   1691:        ;
                   1692: 
                   1693: /* Any kind of declarator (thus, all declarators allowed
                   1694:    after an explicit typespec).  */
                   1695: 
                   1696: declarator:
                   1697:          after_type_declarator %prec EMPTY
                   1698:        | notype_declarator %prec EMPTY
                   1699:        ;
                   1700: 
                   1701: /* This is necessary to postpone reduction of `int()()()()'.  */
                   1702: fcast_or_absdcl:
                   1703:          LEFT_RIGHT %prec EMPTY
                   1704:                { $$ = build_parse_node (CALL_EXPR, NULL_TREE, empty_parms (),
                   1705:                                         NULL_TREE); }
                   1706:        | fcast_or_absdcl LEFT_RIGHT %prec EMPTY
                   1707:                { $$ = build_parse_node (CALL_EXPR, $$, empty_parms (), 
                   1708:                                         NULL_TREE); }
                   1709:        ;
                   1710: 
                   1711: /* ANSI type-id (8.1) */
                   1712: type_id:
                   1713:          typed_typespecs absdcl
                   1714:                { $$ = build_decl_list ($$, $2); }
                   1715:        | nonempty_type_quals absdcl
                   1716:                { $$ = build_decl_list ($$, $2); }
                   1717:        | typespec absdcl
                   1718:                { $$ = build_decl_list (get_decl_list ($$), $2); }
                   1719:        | typed_typespecs %prec EMPTY
                   1720:                { $$ = build_decl_list ($$, NULL_TREE); }
                   1721:        | nonempty_type_quals %prec EMPTY
                   1722:                { $$ = build_decl_list ($$, NULL_TREE); }
                   1723:        ;
                   1724: 
                   1725: /* Declspecs which contain at least one type specifier or typedef name.
                   1726:    (Just `const' or `volatile' is not enough.)
                   1727:    A typedef'd name following these is taken as a name to be declared.  */
                   1728: 
                   1729: typed_declspecs:
                   1730:          typed_typespecs %prec EMPTY
                   1731:        | typed_declspecs1
                   1732: 
                   1733: typed_declspecs1:
                   1734:          declmods typespec
                   1735:                { $$ = decl_tree_cons (NULL_TREE, $2, $$); }
                   1736:        | typespec reserved_declspecs   %prec HYPERUNARY
                   1737:                { $$ = decl_tree_cons (NULL_TREE, $$, $2); }
                   1738:        | declmods typespec reserved_declspecs
                   1739:                { $$ = decl_tree_cons (NULL_TREE, $2, chainon ($3, $$)); }
                   1740:        | declmods typespec reserved_typespecquals
                   1741:                { $$ = decl_tree_cons (NULL_TREE, $2, chainon ($3, $$)); }
                   1742:        | declmods typespec reserved_typespecquals reserved_declspecs
                   1743:                { $$ = decl_tree_cons (NULL_TREE, $2, 
                   1744:                                       chainon ($3, chainon ($4, $$))); }
                   1745:        ;
                   1746: 
                   1747: reserved_declspecs:
                   1748:          SCSPEC
                   1749:                { if (extra_warnings)
                   1750:                    warning ("`%s' is not at beginning of declaration",
                   1751:                             IDENTIFIER_POINTER ($$));
                   1752:                  $$ = build_decl_list (NULL_TREE, $$); }
                   1753:        | reserved_declspecs typespecqual_reserved
                   1754:                { $$ = decl_tree_cons (NULL_TREE, $2, $$); }
                   1755:        | reserved_declspecs SCSPEC
                   1756:                { if (extra_warnings)
                   1757:                    warning ("`%s' is not at beginning of declaration",
                   1758:                             IDENTIFIER_POINTER ($2));
                   1759:                  $$ = decl_tree_cons (NULL_TREE, $2, $$); }
                   1760:        ;
                   1761: 
                   1762: /* List of just storage classes and type modifiers.
                   1763:    A declaration can start with just this, but then it cannot be used
                   1764:    to redeclare a typedef-name.  */
                   1765: 
                   1766: declmods:
                   1767:          nonempty_type_quals %prec EMPTY
                   1768:                { TREE_STATIC ($$) = 1; }
                   1769:        | SCSPEC
                   1770:                { $$ = IDENTIFIER_AS_LIST ($$); }
                   1771:        | declmods TYPE_QUAL
                   1772:                { $$ = decl_tree_cons (NULL_TREE, $2, $$);
                   1773:                  TREE_STATIC ($$) = 1; }
                   1774:        | declmods SCSPEC
                   1775:                { if (extra_warnings && TREE_STATIC ($$))
                   1776:                    warning ("`%s' is not at beginning of declaration",
                   1777:                             IDENTIFIER_POINTER ($2));
                   1778:                  $$ = decl_tree_cons (NULL_TREE, $2, $$);
                   1779:                  TREE_STATIC ($$) = TREE_STATIC ($1); }
                   1780:        ;
                   1781: 
                   1782: 
                   1783: /* Used instead of declspecs where storage classes are not allowed
                   1784:    (that is, for typenames and structure components).
                   1785: 
                   1786:    C++ can takes storage classes for structure components.
                   1787:    Don't accept a typedef-name if anything but a modifier precedes it.  */
                   1788: 
                   1789: typed_typespecs:
                   1790:          typespec  %prec EMPTY
                   1791:                { $$ = get_decl_list ($$); }
                   1792:        | nonempty_type_quals typespec
                   1793:                { $$ = decl_tree_cons (NULL_TREE, $2, $$); }
                   1794:        | typespec reserved_typespecquals
                   1795:                { $$ = decl_tree_cons (NULL_TREE, $$, $2); }
                   1796:        | nonempty_type_quals typespec reserved_typespecquals
                   1797:                { $$ = decl_tree_cons (NULL_TREE, $2, chainon ($3, $$)); }
                   1798:        ;
                   1799: 
                   1800: reserved_typespecquals:
                   1801:          typespecqual_reserved
                   1802:                { $$ = build_decl_list (NULL_TREE, $$); }
                   1803:        | reserved_typespecquals typespecqual_reserved
                   1804:                { $$ = decl_tree_cons (NULL_TREE, $2, $$); }
                   1805:        ;
                   1806: 
                   1807: /* A typespec (but not a type qualifier).
                   1808:    Once we have seen one of these in a declaration,
                   1809:    if a typedef name appears then it is being redeclared.  */
                   1810: 
                   1811: typespec: structsp
                   1812:        | TYPESPEC  %prec EMPTY
                   1813:        | complete_type_name
                   1814:        | TYPEOF '(' expr ')'
                   1815:                { $$ = TREE_TYPE ($3);
                   1816:                  if (flag_ansi)
                   1817:                    pedwarn ("ANSI C++ forbids `typeof'"); }
                   1818:        | TYPEOF '(' type_id ')'
                   1819:                { $$ = groktypename ($3);
                   1820:                  if (flag_ansi)
                   1821:                    pedwarn ("ANSI C++ forbids `typeof'"); }
                   1822:        | SIGOF '(' expr ')'
                   1823:                { tree type = TREE_TYPE ($3);
                   1824: 
                   1825:                  if (IS_AGGR_TYPE (type))
                   1826:                    {
                   1827:                      sorry ("sigof type specifier");
                   1828:                      $$ = type;
                   1829:                    }
                   1830:                  else
                   1831:                    {
                   1832:                      error ("`sigof' applied to non-aggregate expression");
                   1833:                      $$ = error_mark_node;
                   1834:                    }
                   1835:                }
                   1836:        | SIGOF '(' type_id ')'
                   1837:                { tree type = groktypename ($3);
                   1838: 
                   1839:                  if (IS_AGGR_TYPE (type))
                   1840:                    {
                   1841:                      sorry ("sigof type specifier");
                   1842:                      $$ = type;
                   1843:                    }
                   1844:                  else
                   1845:                    {
                   1846:                      error("`sigof' applied to non-aggregate type");
                   1847:                      $$ = error_mark_node;
                   1848:                    }
                   1849:                }
                   1850:        ;
                   1851: 
                   1852: /* A typespec that is a reserved word, or a type qualifier.  */
                   1853: 
                   1854: typespecqual_reserved: TYPESPEC
                   1855:        | TYPE_QUAL
                   1856:        | structsp
                   1857:        ;
                   1858: 
                   1859: initdecls:
                   1860:          initdcl0
                   1861:        | initdecls ',' initdcl
                   1862:        ;
                   1863: 
                   1864: notype_initdecls:
                   1865:          notype_initdcl0
                   1866:        | notype_initdecls ',' initdcl
                   1867:        ;
                   1868: 
                   1869: nomods_initdecls:
                   1870:          nomods_initdcl0
                   1871:        | nomods_initdecls ',' initdcl
                   1872:        ;
                   1873: 
                   1874: maybeasm:
                   1875:          /* empty */
                   1876:                { $$ = NULL_TREE; }
                   1877:        | asm_keyword '(' string ')'
                   1878:                { if (TREE_CHAIN ($3)) $3 = combine_strings ($3); $$ = $3; }
                   1879:        ;
                   1880: 
                   1881: initdcl0:
                   1882:          declarator maybe_raises maybeasm maybe_attribute '='
                   1883:                { current_declspecs = $<ttype>0;
                   1884:                  if (TREE_CODE (current_declspecs) != TREE_LIST)
                   1885:                    current_declspecs = get_decl_list (current_declspecs);
                   1886:                  if (have_extern_spec && !used_extern_spec)
                   1887:                    {
                   1888:                      current_declspecs = decl_tree_cons
                   1889:                        (NULL_TREE, get_identifier ("extern"), 
                   1890:                         current_declspecs);
                   1891:                      used_extern_spec = 1;
                   1892:                    }
                   1893:                  $<itype>5 = suspend_momentary ();
                   1894:                  $<ttype>$ = start_decl ($<ttype>1, current_declspecs, 1, $2);
                   1895:                  cplus_decl_attributes ($<ttype>$, $4); }
                   1896:          init
                   1897: /* Note how the declaration of the variable is in effect while its init is parsed! */
                   1898:                { finish_decl ($<ttype>6, $7, $3, 0);
                   1899:                  $$ = $<itype>5; }
                   1900:        | declarator maybe_raises maybeasm maybe_attribute
                   1901:                { tree d;
                   1902:                  current_declspecs = $<ttype>0;
                   1903:                  if (TREE_CODE (current_declspecs) != TREE_LIST)
                   1904:                    current_declspecs = get_decl_list (current_declspecs);
                   1905:                  if (have_extern_spec && !used_extern_spec)
                   1906:                    {
                   1907:                      current_declspecs = decl_tree_cons
                   1908:                        (NULL_TREE, get_identifier ("extern"), 
                   1909:                         current_declspecs);
                   1910:                      used_extern_spec = 1;
                   1911:                    }
                   1912:                  $$ = suspend_momentary ();
                   1913:                  d = start_decl ($<ttype>1, current_declspecs, 0, $2);
                   1914:                  cplus_decl_attributes (d, $4);
                   1915:                  finish_decl (d, NULL_TREE, $3, 0); }
                   1916:        ;
                   1917: 
                   1918: initdcl:
                   1919:          declarator maybe_raises maybeasm maybe_attribute '='
                   1920:                { $<ttype>$ = start_decl ($<ttype>1, current_declspecs, 1, $2);
                   1921:                  cplus_decl_attributes ($<ttype>$, $4); }
                   1922:          init
                   1923: /* Note how the declaration of the variable is in effect while its init is parsed! */
                   1924:                { finish_decl ($<ttype>6, $7, $3, 0); }
                   1925:        | declarator maybe_raises maybeasm maybe_attribute
                   1926:                { $<ttype>$ = start_decl ($<ttype>1, current_declspecs, 0, $2);
                   1927:                  cplus_decl_attributes ($<ttype>$, $4);
                   1928:                  finish_decl ($<ttype>$, NULL_TREE, $3, 0); }
                   1929:        ;
                   1930: 
                   1931: notype_initdcl0:
                   1932:          notype_declarator maybe_raises maybeasm maybe_attribute '='
                   1933:                { current_declspecs = $<ttype>0;
                   1934:                  $<itype>5 = suspend_momentary ();
                   1935:                  $<ttype>$ = start_decl ($<ttype>1, current_declspecs, 1, $2);
                   1936:                  cplus_decl_attributes ($<ttype>$, $4); }
                   1937:          init
                   1938: /* Note how the declaration of the variable is in effect while its init is parsed! */
                   1939:                { finish_decl ($<ttype>6, $7, $3, 0);
                   1940:                  $$ = $<itype>5; }
                   1941:        | notype_declarator maybe_raises maybeasm maybe_attribute
                   1942:                { tree d;
                   1943:                  current_declspecs = $<ttype>0;
                   1944:                  $$ = suspend_momentary ();
                   1945:                  d = start_decl ($<ttype>1, current_declspecs, 0, $2);
                   1946:                  cplus_decl_attributes (d, $4);
                   1947:                  finish_decl (d, NULL_TREE, $3, 0); }
                   1948:        ;
                   1949: 
                   1950: nomods_initdcl0:
                   1951:          notype_declarator maybe_raises maybeasm maybe_attribute '='
                   1952:                { current_declspecs = NULL_TREE;
                   1953:                  $<itype>5 = suspend_momentary ();
                   1954:                  $<ttype>$ = start_decl ($1, current_declspecs, 1, $2);
                   1955:                  cplus_decl_attributes ($<ttype>$, $4); }
                   1956:          init
                   1957: /* Note how the declaration of the variable is in effect while its init is parsed! */
                   1958:                { finish_decl ($<ttype>6, $7, $3, 0);
                   1959:                  $$ = $<itype>5; }
                   1960:        | notype_declarator maybe_raises maybeasm maybe_attribute
                   1961:                { tree d;
                   1962:                  current_declspecs = NULL_TREE;
                   1963:                  $$ = suspend_momentary ();
                   1964:                  d = start_decl ($1, current_declspecs, 0, $2);
                   1965:                  cplus_decl_attributes (d, $4);
                   1966:                  finish_decl (d, NULL_TREE, $3, 0); }
                   1967:        ;
                   1968: 
                   1969: /* the * rules are dummies to accept the Apollo extended syntax
                   1970:    so that the header files compile. */
                   1971: maybe_attribute:
                   1972:       /* empty */
                   1973:                { $$ = NULL_TREE; }
                   1974:        | attributes
                   1975:                { $$ = $1; }
                   1976:        ;
                   1977:  
                   1978: attributes:
                   1979:       attribute
                   1980:                { $$ = $1; }
                   1981:        | attributes attribute
                   1982:                { $$ = chainon ($1, $2); }
                   1983:        ;
                   1984: 
                   1985: attribute:
                   1986:       ATTRIBUTE '(' '(' attribute_list ')' ')'
                   1987:                { $$ = $4; }
                   1988:        ;
                   1989: 
                   1990: attribute_list:
                   1991:       attrib
                   1992:                { $$ = build_tree_list (NULL_TREE, $1); }
                   1993:        | attribute_list ',' attrib
                   1994:                { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); }
                   1995:        ;
                   1996:  
                   1997: attrib:
                   1998:     /* empty */
                   1999:                { $$ = NULL_TREE; }
                   2000:        | any_word
                   2001:                { $$ = $1; }
                   2002:        | any_word '(' IDENTIFIER ')'
                   2003:                { $$ = tree_cons ($1, NULL_TREE, build_tree_list (NULL_TREE, $3)); }
                   2004:        | any_word '(' IDENTIFIER ',' nonnull_exprlist ')'
                   2005:                { $$ = tree_cons ($1, NULL_TREE, tree_cons (NULL_TREE, $3, $5)); }
                   2006:        | any_word '(' nonnull_exprlist ')'
                   2007:                { $$ = tree_cons ($1, NULL_TREE, $3); }
                   2008:        ;
                   2009: 
                   2010: /* This still leaves out most reserved keywords,
                   2011:    shouldn't we include them?  */
                   2012: 
                   2013: any_word:
                   2014:          identifier
                   2015:        | SCSPEC
                   2016:        | TYPESPEC
                   2017:        | TYPE_QUAL
                   2018:        ;
                   2019: 
                   2020: /* A nonempty list of identifiers, including typenames.  */
                   2021: identifiers_or_typenames:
                   2022:        identifier
                   2023:                { $$ = build_tree_list (NULL_TREE, $1); }
                   2024:        | identifiers_or_typenames ',' identifier
                   2025:                { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); }
                   2026:        ;
                   2027: 
                   2028: init:
                   2029:          expr_no_commas %prec '='
                   2030:        | '{' '}'
                   2031:                { $$ = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE);
                   2032:                  TREE_HAS_CONSTRUCTOR ($$) = 1; }
                   2033:        | '{' initlist '}'
                   2034:                { $$ = build_nt (CONSTRUCTOR, NULL_TREE, nreverse ($2));
                   2035:                  TREE_HAS_CONSTRUCTOR ($$) = 1; }
                   2036:        | '{' initlist ',' '}'
                   2037:                { $$ = build_nt (CONSTRUCTOR, NULL_TREE, nreverse ($2));
                   2038:                  TREE_HAS_CONSTRUCTOR ($$) = 1; }
                   2039:        | error
                   2040:                { $$ = NULL_TREE; }
                   2041:        ;
                   2042: 
                   2043: /* This chain is built in reverse order,
                   2044:    and put in forward order where initlist is used.  */
                   2045: initlist:
                   2046:          init
                   2047:                { $$ = build_tree_list (NULL_TREE, $$); }
                   2048:        | initlist ',' init
                   2049:                { $$ = tree_cons (NULL_TREE, $3, $$); }
                   2050:        /* These are for labeled elements.  */
                   2051:        | '[' expr_no_commas ']' init
                   2052:                { $$ = build_tree_list ($2, $4); }
                   2053:        | initlist ',' CASE expr_no_commas ':' init
                   2054:                { $$ = tree_cons ($4, $6, $$); }
                   2055:        | identifier ':' init
                   2056:                { $$ = build_tree_list ($$, $3); }
                   2057:        | initlist ',' identifier ':' init
                   2058:                { $$ = tree_cons ($3, $5, $$); }
                   2059:        ;
                   2060: 
                   2061: structsp:
                   2062:          ENUM identifier '{'
                   2063:                { $<itype>3 = suspend_momentary ();
                   2064:                  $$ = start_enum ($2); }
                   2065:          enumlist maybecomma_warn '}'
                   2066:                { $$ = finish_enum ($<ttype>4, $5);
                   2067:                  resume_momentary ((int) $<itype>3);
                   2068:                  check_for_missing_semicolon ($<ttype>4); }
                   2069:        | ENUM identifier '{' '}'
                   2070:                { $$ = finish_enum (start_enum ($2), NULL_TREE);
                   2071:                  check_for_missing_semicolon ($$); }
                   2072:        | ENUM '{'
                   2073:                { $<itype>2 = suspend_momentary ();
                   2074:                  $$ = start_enum (make_anon_name ()); }
                   2075:          enumlist maybecomma_warn '}'
                   2076:                { $$ = finish_enum ($<ttype>3, $4);
                   2077:                  resume_momentary ((int) $<itype>1);
                   2078:                  check_for_missing_semicolon ($<ttype>3); }
                   2079:        | ENUM '{' '}'
                   2080:                { $$ = finish_enum (start_enum (make_anon_name()), NULL_TREE);
                   2081:                  check_for_missing_semicolon ($$); }
                   2082:        | ENUM identifier
                   2083:                { $$ = xref_tag (enum_type_node, $2, NULL_TREE, 0); }
                   2084:        | ENUM complex_type_name
                   2085:                { $$ = xref_tag (enum_type_node, $2, NULL_TREE, 0); }
                   2086: 
                   2087:        /* C++ extensions, merged with C to avoid shift/reduce conflicts */
                   2088:        | class_head left_curly opt.component_decl_list '}'
                   2089:                {
                   2090:                  int semi;
                   2091:                  tree id;
                   2092: 
                   2093: #if 0
                   2094:                  /* Need to rework class nesting in the
                   2095:                     presence of nested classes, etc.  */
                   2096:                  shadow_tag (CLASSTYPE_AS_LIST ($$)); */
                   2097: #endif
                   2098:                  if (yychar == YYEMPTY)
                   2099:                    yychar = YYLEX;
                   2100:                  semi = yychar == ';';
                   2101:                  /* finish_struct nukes this anyway; if
                   2102:                     finish_exception does too, then it can go. */
                   2103:                  if (semi)
                   2104:                    note_got_semicolon ($$);
                   2105: 
                   2106:                  if (TREE_CODE ($$) == ENUMERAL_TYPE)
                   2107:                    /* $$ = $1 from default rule.  */;
                   2108:                  else if (CLASSTYPE_DECLARED_EXCEPTION ($$))
                   2109:                    {
                   2110:                    }
                   2111:                  else
                   2112:                    {
                   2113:                      $$ = finish_struct ($$, $3, semi);
                   2114:                      if (semi) note_got_semicolon ($$);
                   2115:                    }
                   2116: 
                   2117:                  pop_obstacks ();
                   2118: 
                   2119:                  id = TYPE_IDENTIFIER ($$);
                   2120:                  if (id && IDENTIFIER_TEMPLATE (id))
                   2121:                    {
                   2122:                      tree decl;
                   2123: 
                   2124:                      /* I don't know if the copying of this TYPE_DECL is
                   2125:                       * really needed.  However, it's such a small per-
                   2126:                       * formance penalty that the extra safety is a bargain.
                   2127:                       * - [email protected]
                   2128:                       */
                   2129:                      push_obstacks (&permanent_obstack, &permanent_obstack);
                   2130:                      decl = copy_node (lookup_name (id, 0));
                   2131:                      if (DECL_LANG_SPECIFIC (decl))
                   2132:                        copy_lang_decl (decl);
                   2133:                      pop_obstacks ();
                   2134:                      undo_template_name_overload (id, 0);
                   2135:                      pushdecl_top_level (decl);
                   2136:                    }
                   2137:                  if (! semi)
                   2138:                    check_for_missing_semicolon ($$); }
                   2139:        | class_head  %prec EMPTY
                   2140:                {
                   2141: #if 0
                   2142:   /* It's no longer clear what the following error is supposed to
                   2143:      accomplish.  If it turns out to be needed, add a comment why.  */
                   2144:                  if (TYPE_BINFO_BASETYPES ($$) && !TYPE_SIZE ($$))
                   2145:                    {
                   2146:                      error ("incomplete definition of type `%s'",
                   2147:                             TYPE_NAME_STRING ($$));
                   2148:                      $$ = error_mark_node;
                   2149:                    }
                   2150: #endif
                   2151:                }
                   2152:        ;
                   2153: 
                   2154: maybecomma:
                   2155:          /* empty */
                   2156:        | ','
                   2157:        ;
                   2158: 
                   2159: maybecomma_warn:
                   2160:          /* empty */
                   2161:        | ','
                   2162:                { if (pedantic) pedwarn ("comma at end of enumerator list"); }
                   2163:        ;
                   2164: 
                   2165: aggr:    AGGR
                   2166:        | aggr SCSPEC
                   2167:                { error ("storage class specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER ($2)); }
                   2168:        | aggr TYPESPEC
                   2169:                { error ("type specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER ($2)); }
                   2170:        | aggr TYPE_QUAL
                   2171:                { error ("type qualifier `%s' not allowed after struct or class", IDENTIFIER_POINTER ($2)); }
                   2172:        | aggr AGGR
                   2173:                { error ("no body nor ';' separates two class, struct or union declarations"); }
                   2174:        ;
                   2175: 
                   2176: specialization:
                   2177:          aggr template_type_name ';'
                   2178:                { 
                   2179:                  yyungetc (';', 1); current_aggr = $$; $$ = $2; 
                   2180:                  if ($<ttype>0 == ridpointers[(int) RID_TEMPLATE])
                   2181:                    instantiate_class_template ($$, 2);
                   2182:                }
                   2183:        ;
                   2184: 
                   2185: named_class_head_sans_basetype:
                   2186:          aggr identifier
                   2187:                { current_aggr = $$; $$ = $2; }
                   2188:        | aggr complex_type_name
                   2189:                { current_aggr = $$; $$ = $2; }
                   2190:        | aggr template_type %prec EMPTY
                   2191:                { current_aggr = $$; $$ = $2; }
                   2192:        | aggr template_type_name '{'
                   2193:                { yyungetc ('{', 1);
                   2194:                aggr2:
                   2195:                  current_aggr = $$;
                   2196:                  $$ = $2;
                   2197:                  overload_template_name ($$, 0); }
                   2198:        | aggr template_type_name ':'
                   2199:                { yyungetc (':', 1); goto aggr2; }
                   2200:        | specialization
                   2201:        ;
                   2202: 
                   2203: named_class_head_sans_basetype_defn:
                   2204:          aggr identifier_defn %prec EMPTY
                   2205:                { current_aggr = $$; $$ = $2; }
                   2206:        ;
                   2207: 
                   2208: do_xref: /* empty */ %prec EMPTY
                   2209:        { $<ttype>$ = xref_tag (current_aggr, $<ttype>0, NULL_TREE, 1); }
                   2210: 
                   2211: do_xref_defn: /* empty */ %prec EMPTY
                   2212:        { $<ttype>$ = xref_defn_tag (current_aggr, $<ttype>0, NULL_TREE); }
                   2213: 
                   2214: named_class_head:
                   2215:          named_class_head_sans_basetype do_xref
                   2216:          maybe_base_class_list %prec EMPTY
                   2217:                {
                   2218:                  if ($3)
                   2219:                    $$ = xref_tag (current_aggr, $1, $3, 1);
                   2220:                  else
                   2221:                    $$ = $<ttype>2;
                   2222:                }
                   2223:        |
                   2224:          named_class_head_sans_basetype_defn do_xref_defn
                   2225:          maybe_base_class_list %prec EMPTY
                   2226:                {
                   2227:                  if ($3)
                   2228:                    $$ = xref_defn_tag (current_aggr, $1, $3);
                   2229:                  else
                   2230:                    $$ = $<ttype>2;
                   2231:                }
                   2232:        ;
                   2233: 
                   2234: unnamed_class_head: aggr '{'
                   2235:                { $$ = xref_tag ($$, make_anon_name (), NULL_TREE, 0);
                   2236:                  yyungetc ('{', 1); }
                   2237:        ;
                   2238: 
                   2239: class_head: unnamed_class_head | named_class_head ;
                   2240: 
                   2241: maybe_base_class_list:
                   2242:          %prec EMPTY /* empty */
                   2243:                { $$ = NULL_TREE; }
                   2244:        | ':'  %prec EMPTY
                   2245:                { yyungetc(':', 1); $$ = NULL_TREE; }
                   2246:        | ':' base_class_list  %prec EMPTY
                   2247:                { $$ = $2; }
                   2248:        ;
                   2249: 
                   2250: base_class_list:
                   2251:          base_class
                   2252:        | base_class_list ',' base_class
                   2253:                { $$ = chainon ($$, $3); }
                   2254:        ;
                   2255: 
                   2256: base_class:
                   2257:          base_class.1
                   2258:                {
                   2259:                  tree type;
                   2260:                 do_base_class1:
                   2261:                  type = IDENTIFIER_TYPE_VALUE ($$);
                   2262:                  if (! is_aggr_typedef ($$, 1))
                   2263:                    $$ = NULL_TREE;
                   2264:                  else if (current_aggr == signature_type_node
                   2265:                           && (! type) && (! IS_SIGNATURE (type)))
                   2266:                    {
                   2267:                      error ("class name not allowed as base signature");
                   2268:                      $$ = NULL_TREE;
                   2269:                    }
                   2270:                  else if (current_aggr == signature_type_node)
                   2271:                    {
                   2272:                      sorry ("signature inheritance, base type `%s' ignored",
                   2273:                             IDENTIFIER_POINTER ($$));
                   2274:                      $$ = build_tree_list ((tree)access_public, $$);
                   2275:                    }
                   2276:                  else if (type && IS_SIGNATURE (type))
                   2277:                    {
                   2278:                      error ("signature name not allowed as base class");
                   2279:                      $$ = NULL_TREE;
                   2280:                    }
                   2281:                  else
                   2282:                    $$ = build_tree_list ((tree)access_default, $$);
                   2283:                }
                   2284:        | base_class_access_list base_class.1
                   2285:                {
                   2286:                  tree type;
                   2287:                 do_base_class2:
                   2288:                  type = IDENTIFIER_TYPE_VALUE ($2);
                   2289:                  if (current_aggr == signature_type_node)
                   2290:                    error ("access and source specifiers not allowed in signature");
                   2291:                  if (! is_aggr_typedef ($2, 1))
                   2292:                    $$ = NULL_TREE;
                   2293:                  else if (current_aggr == signature_type_node
                   2294:                           && (! type) && (! IS_SIGNATURE (type)))
                   2295:                    {
                   2296:                      error ("class name not allowed as base signature");
                   2297:                      $$ = NULL_TREE;
                   2298:                    }
                   2299:                  else if (current_aggr == signature_type_node)
                   2300:                    {
                   2301:                      sorry ("signature inheritance, base type `%s' ignored",
                   2302:                             IDENTIFIER_POINTER ($$));
                   2303:                      $$ = build_tree_list ((tree)access_public, $2);
                   2304:                    }
                   2305:                  else if (type && IS_SIGNATURE (type))
                   2306:                    {
                   2307:                      error ("signature name not allowed as base class");
                   2308:                      $$ = NULL_TREE;
                   2309:                    }
                   2310:                  else
                   2311:                    $$ = build_tree_list ((tree) $$, $2);
                   2312:                }
                   2313:        ;
                   2314: 
                   2315: base_class.1:
                   2316:          complete_type_name
                   2317:        | SIGOF '(' expr ')'
                   2318:                {
                   2319:                  if (current_aggr == signature_type_node)
                   2320:                    {
                   2321:                      if (IS_AGGR_TYPE (TREE_TYPE ($3)))
                   2322:                        {
                   2323:                          sorry ("`sigof' as base signature specifier");
                   2324:                          /* need to return some dummy signature identifier */
                   2325:                          $$ = $3;
                   2326:                        }
                   2327:                      else
                   2328:                        {
                   2329:                          error ("`sigof' applied to non-aggregate expression");
                   2330:                          $$ = error_mark_node;
                   2331:                        }
                   2332:                    }
                   2333:                  else
                   2334:                    {
                   2335:                      error ("`sigof' in struct or class declaration");
                   2336:                      $$ = error_mark_node;
                   2337:                    }
                   2338:                }
                   2339:        | SIGOF '(' type_id ')'
                   2340:                {
                   2341:                  if (current_aggr == signature_type_node)
                   2342:                    {
                   2343:                      if (IS_AGGR_TYPE (groktypename ($3)))
                   2344:                        {
                   2345:                          sorry ("`sigof' as base signature specifier");
                   2346:                          /* need to return some dummy signature identifier */
                   2347:                          $$ = $3;
                   2348:                        }
                   2349:                      else
                   2350:                        {
                   2351:                          error ("`sigof' applied to non-aggregate expression");
                   2352:                          $$ = error_mark_node;
                   2353:                        }
                   2354:                    }
                   2355:                  else
                   2356:                    {
                   2357:                      error ("`sigof' in struct or class declaration");
                   2358:                      $$ = error_mark_node;
                   2359:                    }
                   2360:                }
                   2361:        ;
                   2362: 
                   2363: base_class_access_list:
                   2364:          VISSPEC
                   2365:        | SCSPEC
                   2366:                { if ($<ttype>$ != ridpointers[(int)RID_VIRTUAL])
                   2367:                    sorry ("non-virtual access");
                   2368:                  $$ = access_default_virtual; }
                   2369:        | base_class_access_list VISSPEC
                   2370:                { int err = 0;
                   2371:                  if ($2 == access_protected)
                   2372:                    {
                   2373:                      warning ("`protected' access not implemented");
                   2374:                      $2 = access_public;
                   2375:                      err++;
                   2376:                    }
                   2377:                  else if ($2 == access_public)
                   2378:                    {
                   2379:                      if ($1 == access_private)
                   2380:                        {
                   2381:                        mixed:
                   2382:                          error ("base class cannot be public and private");
                   2383:                        }
                   2384:                      else if ($1 == access_default_virtual)
                   2385:                        $$ = access_public_virtual;
                   2386:                    }
                   2387:                  else /* $2 == access_private */
                   2388:                    {
                   2389:                      if ($1 == access_public)
                   2390:                        goto mixed;
                   2391:                      else if ($1 == access_default_virtual)
                   2392:                        $$ = access_private_virtual;
                   2393:                    }
                   2394:                }
                   2395:        | base_class_access_list SCSPEC
                   2396:                { if ($2 != ridpointers[(int)RID_VIRTUAL])
                   2397:                    sorry ("non-virtual access");
                   2398:                  if ($$ == access_public)
                   2399:                    $$ = access_public_virtual;
                   2400:                  else if ($$ == access_private)
                   2401:                    $$ = access_private_virtual; }
                   2402:        ;
                   2403: 
                   2404: left_curly: '{'
                   2405:                { tree t = $<ttype>0;
                   2406:                  push_obstacks_nochange ();
                   2407:                  end_temporary_allocation ();
                   2408: 
                   2409:                  if (! IS_AGGR_TYPE (t))
                   2410:                    {
                   2411:                      t = $<ttype>0 = make_lang_type (RECORD_TYPE);
                   2412:                      TYPE_NAME (t) = get_identifier ("erroneous type");
                   2413:                    }
                   2414:                  if (TYPE_SIZE (t))
                   2415:                    duplicate_tag_error (t);
                   2416:                   if (TYPE_SIZE (t) || TYPE_BEING_DEFINED (t))
                   2417:                     {
                   2418:                       t = make_lang_type (TREE_CODE (t));
                   2419:                       pushtag (TYPE_IDENTIFIER ($<ttype>0), t, 0);
                   2420:                       $<ttype>0 = t;
                   2421:                     }
                   2422:                  pushclass (t, 0);
                   2423:                  TYPE_BEING_DEFINED (t) = 1;
                   2424:                  /* Reset the interface data, at the earliest possible
                   2425:                     moment, as it might have been set via a class foo;
                   2426:                     before.  */
                   2427:                  /* Don't change signatures.  */
                   2428:                  if (! IS_SIGNATURE (t))
                   2429:                    {
                   2430:                      extern tree pending_vtables;
                   2431:                      int needs_writing;
                   2432:                      tree name = TYPE_IDENTIFIER (t);
                   2433: 
                   2434:                      CLASSTYPE_INTERFACE_ONLY (t) = interface_only;
                   2435:                      SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown);
                   2436: 
                   2437:                      /* Record how to set the access of this class's
                   2438:                         virtual functions.  If write_virtuals == 2 or 3, then
                   2439:                         inline virtuals are ``extern inline''.  */
                   2440:                      switch (write_virtuals)
                   2441:                        {
                   2442:                        case 0:
                   2443:                        case 1:
                   2444:                          needs_writing = 1;
                   2445:                          break;
                   2446:                        case 2:
                   2447:                          needs_writing = !! value_member (name, pending_vtables);
                   2448:                          break;
                   2449:                        case 3:
                   2450:                          needs_writing = ! CLASSTYPE_INTERFACE_ONLY (t)
                   2451:                            && CLASSTYPE_INTERFACE_KNOWN (t);
                   2452:                          break;
                   2453:                        default:
                   2454:                          needs_writing = 0;
                   2455:                        }
                   2456:                      CLASSTYPE_VTABLE_NEEDS_WRITING (t) = needs_writing;
                   2457:                    }
                   2458: #if 0
                   2459:                  t = TYPE_IDENTIFIER ($<ttype>0);
                   2460:                  if (t && IDENTIFIER_TEMPLATE (t))
                   2461:                    overload_template_name (t, 1);
                   2462: #endif
                   2463:                }
                   2464:        ;
                   2465: 
                   2466: opt.component_decl_list:
                   2467:        /* empty */
                   2468:                { $$ = NULL_TREE; }
                   2469:        | component_decl_list
                   2470:                {
                   2471:                  if (current_aggr == signature_type_node)
                   2472:                    $$ = build_tree_list ((tree) access_public, $$);
                   2473:                  else
                   2474:                    $$ = build_tree_list ((tree) access_default, $$);
                   2475:                }
                   2476:        | opt.component_decl_list VISSPEC ':' component_decl_list
                   2477:                {
                   2478:                  tree visspec = (tree) $2;
                   2479: 
                   2480:                  if (current_aggr == signature_type_node)
                   2481:                    {
                   2482:                      error ("access specifier not allowed in signature");
                   2483:                      visspec = (tree) access_public;
                   2484:                    }
                   2485:                  $$ = chainon ($$, build_tree_list (visspec, $4));
                   2486:                }
                   2487:        | opt.component_decl_list VISSPEC ':'
                   2488:                {
                   2489:                  if (current_aggr == signature_type_node)
                   2490:                    error ("access specifier not allowed in signature");
                   2491:                }
                   2492:        ;
                   2493: 
                   2494: /* Note: we no longer warn about the semicolon after a component_decl_list.
                   2495:    ARM $9.2 says that the semicolon is optional, and therefore allowed.  */
                   2496: component_decl_list:
                   2497:          component_decl
                   2498:                { if ($$ == void_type_node) $$ = NULL_TREE; 
                   2499:                }
                   2500:        | component_decl_list component_decl
                   2501:                { /* In pushdecl, we created a reverse list of names
                   2502:                     in this binding level.  Make sure that the chain
                   2503:                     of what we're trying to add isn't the item itself
                   2504:                     (which can happen with what pushdecl's doing).  */
                   2505:                  if ($2 != NULL_TREE && $2 != void_type_node)
                   2506:                    {
                   2507:                      if (TREE_CHAIN ($2) != $$)
                   2508:                        $$ = chainon ($$, $2);
                   2509:                      else
                   2510:                        $$ = $2;
                   2511:                    }
                   2512:                }
                   2513:        | component_decl_list ';'
                   2514:        ;
                   2515: 
                   2516: component_decl:
                   2517:          component_decl_1 ';'
                   2518:        | component_decl_1 '}'
                   2519:                { error ("missing ';' before right brace");
                   2520:                  yyungetc ('}', 0); }
                   2521:        /* C++: handle constructors, destructors and inline functions */
                   2522:        /* note that INLINE is like a TYPESPEC */
                   2523:        | fn.def2 ':' /* base_init compstmt */
                   2524:                { $$ = finish_method ($$); }
                   2525:        | fn.def2 '{' /* nodecls compstmt */
                   2526:                { $$ = finish_method ($$); }
                   2527:        ;
                   2528: 
                   2529: component_decl_1:
                   2530:        /* Do not add a "typed_declspecs declarator" rule here for
                   2531:           speed; we need to call grok_x_components for enums, so the
                   2532:           speedup would be insignificant.  */
                   2533:          typed_declspecs components
                   2534:                {
                   2535:                  $$ = grok_x_components ($$, $2);
                   2536:                }
                   2537:        | declmods notype_components
                   2538:                { 
                   2539:                  $$ = grok_x_components ($$, $2);
                   2540:                }
                   2541:        | notype_declarator maybe_raises maybeasm maybe_attribute
                   2542:                { $$ = grokfield ($$, NULL_TREE, $2, NULL_TREE, $3);
                   2543:                  cplus_decl_attributes ($$, $4); }
                   2544:        | ':' expr_no_commas
                   2545:                { $$ = grokbitfield (NULL_TREE, NULL_TREE, $2); }
                   2546:        | error
                   2547:                { $$ = NULL_TREE; }
                   2548: 
                   2549:        /* These rules introduce a reduce/reduce conflict; in
                   2550:                typedef int foo, bar;
                   2551:                class A {
                   2552:                  foo (bar);
                   2553:                };
                   2554:           should "A::foo" be declared as a function or "A::bar" as a data
                   2555:           member? In other words, is "bar" an after_type_declarator or a
                   2556:           parmlist? */
                   2557:        | typed_declspecs '(' parmlist ')' type_quals
                   2558:                { $$ = build_parse_node (CALL_EXPR, TREE_VALUE ($1),
                   2559:                                         $3, $5);
                   2560:                  $$ = grokfield ($$, TREE_CHAIN ($1), NULL_TREE, NULL_TREE,
                   2561:                                  NULL_TREE); }
                   2562:        | typed_declspecs LEFT_RIGHT type_quals
                   2563:                { $$ = build_parse_node (CALL_EXPR, TREE_VALUE ($1),
                   2564:                                         empty_parms (), $3);
                   2565:                  $$ = grokfield ($$, TREE_CHAIN ($1), NULL_TREE, NULL_TREE,
                   2566:                                  NULL_TREE); }
                   2567:        ;
                   2568: 
                   2569: /* The case of exactly one component is handled directly by component_decl. */
                   2570: components:
                   2571:          /* empty: possibly anonymous */
                   2572:                { $$ = NULL_TREE; }
                   2573:        | component_declarator0
                   2574:        | components ',' component_declarator
                   2575:                {
                   2576:                  /* In this context, void_type_node encodes
                   2577:                     friends.  They have been recorded elsewhere.  */
                   2578:                  if ($$ == void_type_node)
                   2579:                    $$ = $3;
                   2580:                  else
                   2581:                    $$ = chainon ($$, $3);
                   2582:                }
                   2583:        ;
                   2584: 
                   2585: notype_components:
                   2586:          /* empty: possibly anonymous */
                   2587:                { $$ = NULL_TREE; }
                   2588:        | notype_component_declarator0
                   2589:        | notype_components ',' notype_component_declarator
                   2590:                {
                   2591:                  /* In this context, void_type_node encodes
                   2592:                     friends.  They have been recorded elsewhere.  */
                   2593:                  if ($$ == void_type_node)
                   2594:                    $$ = $3;
                   2595:                  else
                   2596:                    $$ = chainon ($$, $3);
                   2597:                }
                   2598:        ;
                   2599: 
                   2600: component_declarator0:
                   2601:          after_type_component_declarator0
                   2602:        | notype_component_declarator0
                   2603:        ;
                   2604: 
                   2605: component_declarator:
                   2606:          after_type_component_declarator
                   2607:        | notype_component_declarator
                   2608:        ;
                   2609: 
                   2610: after_type_component_declarator0:
                   2611:          after_type_declarator maybe_raises maybeasm maybe_attribute
                   2612:                { current_declspecs = $<ttype>0;
                   2613:                  $$ = grokfield ($$, current_declspecs, $2, NULL_TREE, $3);
                   2614:                  cplus_decl_attributes ($$, $4); }
                   2615:        | after_type_declarator maybe_raises maybeasm maybe_attribute '=' init
                   2616:                { current_declspecs = $<ttype>0;
                   2617:                  $$ = grokfield ($$, current_declspecs, $2, $6, $3);
                   2618:                  cplus_decl_attributes ($$, $4); }
                   2619:        | TYPENAME ':' expr_no_commas maybe_attribute
                   2620:                { current_declspecs = $<ttype>0;
                   2621:                  $$ = grokbitfield ($$, current_declspecs, $3);
                   2622:                  cplus_decl_attributes ($$, $4); }
                   2623:        ;
                   2624: 
                   2625: notype_component_declarator0:
                   2626:          notype_declarator maybe_raises maybeasm maybe_attribute
                   2627:                { current_declspecs = $<ttype>0;
                   2628:                  $$ = grokfield ($$, current_declspecs, $2, NULL_TREE, $3);
                   2629:                  cplus_decl_attributes ($$, $4); }
                   2630:        | notype_declarator maybe_raises maybeasm maybe_attribute '=' init
                   2631:                { current_declspecs = $<ttype>0;
                   2632:                  $$ = grokfield ($$, current_declspecs, $2, $6, $3);
                   2633:                  cplus_decl_attributes ($$, $4); }
                   2634:        | IDENTIFIER ':' expr_no_commas maybe_attribute
                   2635:                { current_declspecs = $<ttype>0;
                   2636:                  $$ = grokbitfield ($$, current_declspecs, $3);
                   2637:                  cplus_decl_attributes ($$, $4); }
                   2638:        | ':' expr_no_commas maybe_attribute
                   2639:                { current_declspecs = $<ttype>0;
                   2640:                  $$ = grokbitfield (NULL_TREE, current_declspecs, $2);
                   2641:                  cplus_decl_attributes ($$, $3); }
                   2642:        ;
                   2643: 
                   2644: after_type_component_declarator:
                   2645:          after_type_declarator maybe_raises maybeasm maybe_attribute
                   2646:                { $$ = grokfield ($$, current_declspecs, $2, NULL_TREE, $3);
                   2647:                  cplus_decl_attributes ($$, $4); }
                   2648:        | after_type_declarator maybe_raises maybeasm maybe_attribute '=' init
                   2649:                { $$ = grokfield ($$, current_declspecs, $2, $6, $3);
                   2650:                  cplus_decl_attributes ($$, $4); }
                   2651:        | TYPENAME ':' expr_no_commas maybe_attribute
                   2652:                { $$ = grokbitfield ($$, current_declspecs, $3);
                   2653:                  cplus_decl_attributes ($$, $4); }
                   2654:        ;
                   2655: 
                   2656: notype_component_declarator:
                   2657:          notype_declarator maybe_raises maybeasm maybe_attribute
                   2658:                { $$ = grokfield ($$, current_declspecs, $2, NULL_TREE, $3);
                   2659:                  cplus_decl_attributes ($$, $4); }
                   2660:        | notype_declarator maybe_raises maybeasm maybe_attribute '=' init
                   2661:                { $$ = grokfield ($$, current_declspecs, $2, $6, $3);
                   2662:                  cplus_decl_attributes ($$, $4); }
                   2663:        | IDENTIFIER ':' expr_no_commas maybe_attribute
                   2664:                { $$ = grokbitfield ($$, current_declspecs, $3);
                   2665:                  cplus_decl_attributes ($$, $4); }
                   2666:        | ':' expr_no_commas maybe_attribute
                   2667:                { $$ = grokbitfield (NULL_TREE, current_declspecs, $2);
                   2668:                  cplus_decl_attributes ($$, $3); }
                   2669:        ;
                   2670: 
                   2671: /* We chain the enumerators in reverse order.
                   2672:    Because of the way enums are built, the order is
                   2673:    insignificant.  Take advantage of this fact.  */
                   2674: 
                   2675: enumlist:
                   2676:          enumerator
                   2677:        | enumlist ',' enumerator
                   2678:                { TREE_CHAIN ($3) = $$; $$ = $3; }
                   2679:        ;
                   2680: 
                   2681: enumerator:
                   2682:          identifier
                   2683:                { $$ = build_enumerator ($$, NULL_TREE); }
                   2684:        | identifier '=' expr_no_commas
                   2685:                { $$ = build_enumerator ($$, $3); }
                   2686:        ;
                   2687: 
                   2688: /* ANSI new-type-id (5.3.4) */
                   2689: new_type_id:
                   2690:          type_specifier_seq new_declarator
                   2691:                { $$ = build_decl_list ($$, $2); }
                   2692:        | type_specifier_seq %prec EMPTY
                   2693:                { $$ = build_decl_list ($$, NULL_TREE); }
                   2694:        /* GNU extension to allow arrays of arbitrary types with
                   2695:           non-constant dimension.  */
                   2696:        | '(' type_id ')' '[' expr ']'
                   2697:                {
                   2698:                  if (flag_ansi)
                   2699:                    pedwarn ("ANSI C++ forbids array dimensions with parenthesized type in new");
                   2700:                  $$ = build_parse_node (ARRAY_REF, TREE_VALUE ($2), $5);
                   2701:                  $$ = build_decl_list (TREE_PURPOSE ($2), $$);
                   2702:                }
                   2703:        ;
                   2704: 
                   2705: type_quals:
                   2706:          /* empty */ %prec EMPTY
                   2707:                { $$ = NULL_TREE; }
                   2708:        | type_quals TYPE_QUAL
                   2709:                { $$ = decl_tree_cons (NULL_TREE, $2, $$); }
                   2710:        ;
                   2711: 
                   2712: nonempty_type_quals:
                   2713:          TYPE_QUAL
                   2714:                { $$ = IDENTIFIER_AS_LIST ($$); }
                   2715:        | nonempty_type_quals TYPE_QUAL
                   2716:                { $$ = decl_tree_cons (NULL_TREE, $2, $$); }
                   2717:        ;
                   2718: 
                   2719: /* These rules must follow the rules for function declarations
                   2720:    and component declarations.  That way, longer rules are preferred.  */
                   2721: 
                   2722: /* An expression which will not live on the momentary obstack.  */
                   2723: nonmomentary_expr:
                   2724:        { $<itype>$ = suspend_momentary (); } expr
                   2725:        { resume_momentary ((int) $<itype>1); $$ = $2; }
                   2726:        ;
                   2727: 
                   2728: /* A declarator that is allowed only after an explicit typespec.  */
                   2729: /* may all be followed by prec '.' */
                   2730: after_type_declarator:
                   2731:          '*' nonempty_type_quals after_type_declarator  %prec UNARY
                   2732:                { $$ = make_pointer_declarator ($2, $3); }
                   2733:        | '&' nonempty_type_quals after_type_declarator  %prec UNARY
                   2734:                { $$ = make_reference_declarator ($2, $3); }
                   2735:        | '*' after_type_declarator  %prec UNARY
                   2736:                { $$ = make_pointer_declarator (NULL_TREE, $2); }
                   2737:        | '&' after_type_declarator  %prec UNARY
                   2738:                { $$ = make_reference_declarator (NULL_TREE, $2); }
                   2739:        | ptr_to_mem type_quals after_type_declarator
                   2740:                { tree arg = make_pointer_declarator ($2, $3);
                   2741:                  $$ = build_parse_node (SCOPE_REF, $1, arg);
                   2742:                }
                   2743:        | direct_after_type_declarator
                   2744:        ;
                   2745: 
                   2746: qualified_type_name:
                   2747:          type_name %prec EMPTY
                   2748:                {
                   2749:                  /* Remember that this name has been used in the class
                   2750:                     definition, as per [class.scope0] */
                   2751:                  if (current_class_type
                   2752:                      && TYPE_BEING_DEFINED (current_class_type)
                   2753:                      && ! IDENTIFIER_CLASS_VALUE ($$))
                   2754:                    {
                   2755:                      tree t = lookup_name ($$, -2);
                   2756:                      if (t)
                   2757:                        pushdecl_class_level (t);
                   2758:                    }
                   2759:                }
                   2760:        | nested_type
                   2761:        ;
                   2762: 
                   2763: nested_type:
                   2764:        nested_name_specifier type_name %prec EMPTY
                   2765:                { $$ = $2; }
                   2766:        ;
                   2767: 
                   2768: direct_after_type_declarator:
                   2769:          direct_after_type_declarator '(' nonnull_exprlist ')' type_quals %prec '.'
                   2770:                { $$ = build_parse_node (CALL_EXPR, $$, $3, $5); }
                   2771:        | direct_after_type_declarator '(' parmlist ')' type_quals %prec '.'
                   2772:                { $$ = build_parse_node (CALL_EXPR, $$, $3, $5); }
                   2773:        | direct_after_type_declarator LEFT_RIGHT type_quals %prec '.'
                   2774:                { $$ = build_parse_node (CALL_EXPR, $$, empty_parms (), $3); }
                   2775:        | direct_after_type_declarator '(' error ')' type_quals %prec '.'
                   2776:                { $$ = build_parse_node (CALL_EXPR, $$, NULL_TREE, NULL_TREE); }
                   2777:        | direct_after_type_declarator '[' nonmomentary_expr ']'
                   2778:                { $$ = build_parse_node (ARRAY_REF, $$, $3); }
                   2779:        | direct_after_type_declarator '[' ']'
                   2780:                { $$ = build_parse_node (ARRAY_REF, $$, NULL_TREE); }
                   2781:        | '(' after_type_declarator ')'
                   2782:                { $$ = $2; }
                   2783:        | nested_name_specifier type_name %prec EMPTY
                   2784:                { push_nested_class (TREE_TYPE ($$), 3);
                   2785:                  $$ = build_parse_node (SCOPE_REF, $$, $2);
                   2786:                  TREE_COMPLEXITY ($$) = current_class_depth; }
                   2787:        | type_name %prec EMPTY
                   2788:        ;
                   2789: 
                   2790: /* A declarator allowed whether or not there has been
                   2791:    an explicit typespec.  These cannot redeclare a typedef-name.  */
                   2792: 
                   2793: notype_declarator:
                   2794:          '*' nonempty_type_quals notype_declarator  %prec UNARY
                   2795:                { $$ = make_pointer_declarator ($2, $3); }
                   2796:        | '&' nonempty_type_quals notype_declarator  %prec UNARY
                   2797:                { $$ = make_reference_declarator ($2, $3); }
                   2798:        | '*' notype_declarator  %prec UNARY
                   2799:                { $$ = make_pointer_declarator (NULL_TREE, $2); }
                   2800:        | '&' notype_declarator  %prec UNARY
                   2801:                { $$ = make_reference_declarator (NULL_TREE, $2); }
                   2802:        | ptr_to_mem type_quals notype_declarator
                   2803:                { tree arg = make_pointer_declarator ($2, $3);
                   2804:                  $$ = build_parse_node (SCOPE_REF, $1, arg);
                   2805:                }
                   2806:        | direct_notype_declarator
                   2807:        ;
                   2808: 
                   2809: complex_notype_declarator:
                   2810:          '*' nonempty_type_quals notype_declarator  %prec UNARY
                   2811:                { $$ = make_pointer_declarator ($2, $3); }
                   2812:        | '&' nonempty_type_quals notype_declarator  %prec UNARY
                   2813:                { $$ = make_reference_declarator ($2, $3); }
                   2814:        | '*' complex_notype_declarator  %prec UNARY
                   2815:                { $$ = make_pointer_declarator (NULL_TREE, $2); }
                   2816:        | '&' complex_notype_declarator  %prec UNARY
                   2817:                { $$ = make_reference_declarator (NULL_TREE, $2); }
                   2818:        | ptr_to_mem type_quals notype_declarator
                   2819:                { tree arg = make_pointer_declarator ($2, $3);
                   2820:                  $$ = build_parse_node (SCOPE_REF, $1, arg);
                   2821:                }
                   2822:        | complex_direct_notype_declarator
                   2823:        ;
                   2824: 
                   2825: complex_direct_notype_declarator:
                   2826:          direct_notype_declarator '(' nonnull_exprlist ')' type_quals  %prec '.'
                   2827:                { $$ = build_parse_node (CALL_EXPR, $$, $3, $5); }
                   2828:        | direct_notype_declarator '(' parmlist ')' type_quals  %prec '.'
                   2829:                { $$ = build_parse_node (CALL_EXPR, $$, $3, $5); }
                   2830:        | direct_notype_declarator LEFT_RIGHT type_quals  %prec '.'
                   2831:                { $$ = build_parse_node (CALL_EXPR, $$, empty_parms (), $3); }
                   2832:        | direct_notype_declarator '(' error ')' type_quals  %prec '.'
                   2833:                { $$ = build_parse_node (CALL_EXPR, $$, NULL_TREE, NULL_TREE); }
                   2834:        | '(' expr_or_declarator ')'
                   2835:                { $$ = finish_decl_parsing ($2); }
                   2836:        | '(' complex_notype_declarator ')'
                   2837:                { $$ = $2; }
                   2838:        | direct_notype_declarator '[' nonmomentary_expr ']'
                   2839:                { $$ = build_parse_node (ARRAY_REF, $$, $3); }
                   2840:        | direct_notype_declarator '[' ']'
                   2841:                { $$ = build_parse_node (ARRAY_REF, $$, NULL_TREE); }
                   2842:        ;
                   2843: 
                   2844: qualified_id:
                   2845:        nested_name_specifier unqualified_id
                   2846:                { got_scope = NULL_TREE;
                   2847:                  $$ = build_parse_node (SCOPE_REF, $$, $2); }
                   2848:        ;
                   2849: 
                   2850: notype_qualified_id:
                   2851:        nested_name_specifier notype_unqualified_id
                   2852:                { got_scope = NULL_TREE;
                   2853:                  $$ = build_parse_node (SCOPE_REF, $$, $2); }
                   2854:        ;
                   2855: 
                   2856: overqualified_id:
                   2857:          notype_qualified_id
                   2858:        | global_scope notype_qualified_id
                   2859:                { $$ = $2; }
                   2860:        ;
                   2861: 
                   2862: functional_cast:
                   2863:          typespec '(' nonnull_exprlist ')'
                   2864:                { $$ = build_functional_cast ($$, $3); }
                   2865:        | typespec '(' expr_or_declarator ')'
                   2866:                { $$ = reparse_decl_as_expr ($$, $3); }
                   2867:        | typespec fcast_or_absdcl %prec EMPTY
                   2868:                { $$ = reparse_absdcl_as_expr ($$, $2); }
                   2869:        ;
                   2870: 
                   2871: type_name:
                   2872:          TYPENAME
                   2873:        | template_type %prec EMPTY
                   2874:        ;
                   2875: 
                   2876: nested_name_specifier:
                   2877:          nested_name_specifier_1
                   2878:        | nested_name_specifier nested_name_specifier_1
                   2879:                { $$ = $2; }
                   2880:        ;
                   2881: 
                   2882: /* Why the @#$%^& do type_name and notype_identifier need to be expanded
                   2883:    inline here?!?  (jason) */
                   2884: nested_name_specifier_1:
                   2885:          TYPENAME SCOPE
                   2886:                { got_scope = TREE_TYPE ($$); }
                   2887:        | template_type SCOPE
                   2888:                { got_scope = TREE_TYPE ($$); }
                   2889: /*     These break 'const i;'
                   2890:        | IDENTIFIER SCOPE
                   2891:                {
                   2892:                 failed_scope:
                   2893:                  cp_error ("`%D' is not an aggregate typedef", 
                   2894:                            lastiddecl ? lastiddecl : $$);
                   2895:                  $$ = error_mark_node;
                   2896:                }
                   2897:        | PTYPENAME SCOPE
                   2898:                { goto failed_scope; } */
                   2899:        ;
                   2900: 
                   2901: complete_type_name:
                   2902:          qualified_type_name
                   2903:        | global_scope qualified_type_name
                   2904:                { $$ = $2; }
                   2905:        ;
                   2906: 
                   2907: complex_type_name:
                   2908:          nested_type
                   2909:        | global_scope qualified_type_name
                   2910:                { $$ = $2; }
                   2911:        ;
                   2912: 
                   2913: ptr_to_mem:
                   2914:          nested_name_specifier '*'
                   2915:                { got_scope = NULL_TREE; }
                   2916:        | global_scope nested_name_specifier '*'
                   2917:                { $$ = $2; got_scope = NULL_TREE; }
                   2918:        ;
                   2919: 
                   2920: /* All uses of explicit global scope must go through this nonterminal so
                   2921:    that got_scope will be set before yylex is called to get the next token. */
                   2922: global_scope:
                   2923:          SCOPE
                   2924:                { got_scope = void_type_node; }
                   2925:        ;
                   2926: 
                   2927: /* ANSI new-declarator (5.3.4) */
                   2928: new_declarator:
                   2929:          '*' type_quals new_declarator
                   2930:                { $$ = make_pointer_declarator ($2, $3); }
                   2931:        | '*' type_quals  %prec EMPTY
                   2932:                { $$ = make_pointer_declarator ($2, NULL_TREE); }
                   2933:        | '&' type_quals new_declarator %prec EMPTY
                   2934:                { $$ = make_reference_declarator ($2, $3); }
                   2935:        | '&' type_quals %prec EMPTY
                   2936:                { $$ = make_reference_declarator ($2, NULL_TREE); }
                   2937:        | ptr_to_mem type_quals %prec EMPTY
                   2938:                { tree arg = make_pointer_declarator ($2, NULL_TREE);
                   2939:                  $$ = build_parse_node (SCOPE_REF, $1, arg);
                   2940:                }
                   2941:        | ptr_to_mem type_quals new_declarator
                   2942:                { tree arg = make_pointer_declarator ($2, $3);
                   2943:                  $$ = build_parse_node (SCOPE_REF, $1, arg);
                   2944:                }
                   2945:        | direct_new_declarator %prec EMPTY
                   2946:        ;
                   2947: 
                   2948: /* ANSI direct-new-declarator (5.3.4) */
                   2949: direct_new_declarator:
                   2950:          '[' expr ']'
                   2951:                { $$ = build_parse_node (ARRAY_REF, NULL_TREE, $2); }
                   2952:        | direct_new_declarator '[' nonmomentary_expr ']'
                   2953:                { $$ = build_parse_node (ARRAY_REF, $$, $3); }
                   2954:        ;
                   2955: 
                   2956: /* ANSI abstract-declarator (8.1) */
                   2957: absdcl:
                   2958:          '*' nonempty_type_quals absdcl
                   2959:                { $$ = make_pointer_declarator ($2, $3); }
                   2960:        | '*' absdcl
                   2961:                { $$ = make_pointer_declarator (NULL_TREE, $2); }
                   2962:        | '*' nonempty_type_quals  %prec EMPTY
                   2963:                { $$ = make_pointer_declarator ($2, NULL_TREE); }
                   2964:        | '*' %prec EMPTY
                   2965:                { $$ = make_pointer_declarator (NULL_TREE, NULL_TREE); }
                   2966:        | '&' nonempty_type_quals absdcl
                   2967:                { $$ = make_reference_declarator ($2, $3); }
                   2968:        | '&' absdcl
                   2969:                { $$ = make_reference_declarator (NULL_TREE, $2); }
                   2970:        | '&' nonempty_type_quals %prec EMPTY
                   2971:                { $$ = make_reference_declarator ($2, NULL_TREE); }
                   2972:        | '&' %prec EMPTY
                   2973:                { $$ = make_reference_declarator (NULL_TREE, NULL_TREE); }
                   2974:        | ptr_to_mem type_quals %prec EMPTY
                   2975:                { tree arg = make_pointer_declarator ($2, NULL_TREE);
                   2976:                  $$ = build_parse_node (SCOPE_REF, $1, arg);
                   2977:                }
                   2978:        | ptr_to_mem type_quals absdcl
                   2979:                { tree arg = make_pointer_declarator ($2, $3);
                   2980:                  $$ = build_parse_node (SCOPE_REF, $1, arg);
                   2981:                }
                   2982:        | direct_abstract_declarator %prec EMPTY
                   2983:        ;
                   2984: 
                   2985: /* ANSI direct-abstract-declarator (8.1) */
                   2986: direct_abstract_declarator:
                   2987:          '(' absdcl ')'
                   2988:                { $$ = $2; }
                   2989:          /* `(typedef)1' is `int'.  */
                   2990:        | PAREN_STAR_PAREN
                   2991:        | direct_abstract_declarator '(' parmlist ')' type_quals  %prec '.'
                   2992:                { $$ = build_parse_node (CALL_EXPR, $$, $3, $5); }
                   2993:        | direct_abstract_declarator LEFT_RIGHT type_quals  %prec '.'
                   2994:                { $$ = build_parse_node (CALL_EXPR, $$, empty_parms (), $3); }
                   2995:        | direct_abstract_declarator '[' nonmomentary_expr ']'  %prec '.'
                   2996:                { $$ = build_parse_node (ARRAY_REF, $$, $3); }
                   2997:        | direct_abstract_declarator '[' ']'  %prec '.'
                   2998:                { $$ = build_parse_node (ARRAY_REF, $$, NULL_TREE); }
                   2999:        | '(' complex_parmlist ')' type_quals  %prec '.'
                   3000:                { $$ = build_parse_node (CALL_EXPR, NULL_TREE, $2, $4); }
                   3001:        | regcast_or_absdcl type_quals %prec '.'
                   3002:                { TREE_OPERAND ($$, 2) = $2; }
                   3003:        | fcast_or_absdcl type_quals %prec '.'
                   3004:                { TREE_OPERAND ($$, 2) = $2; }
                   3005:        | '[' nonmomentary_expr ']'  %prec '.'
                   3006:                { $$ = build_parse_node (ARRAY_REF, NULL_TREE, $2); }
                   3007:        | '[' ']'  %prec '.'
                   3008:                { $$ = build_parse_node (ARRAY_REF, NULL_TREE, NULL_TREE); }
                   3009:        ;
                   3010: 
                   3011: /* For C++, decls and stmts can be intermixed, so we don't need to
                   3012:    have a special rule that won't start parsing the stmt section
                   3013:    until we have a stmt that parses without errors.  */
                   3014: 
                   3015: stmts:
                   3016:          stmt
                   3017:        | errstmt
                   3018:        | stmts stmt
                   3019:        | stmts errstmt
                   3020:        ;
                   3021: 
                   3022: errstmt:  error ';'
                   3023:        ;
                   3024: 
                   3025: /* build the LET_STMT node before parsing its contents,
                   3026:   so that any LET_STMTs within the context can have their display pointers
                   3027:   set up to point at this one.  */
                   3028: 
                   3029: .pushlevel:  /* empty */
                   3030:                { emit_line_note (input_filename, lineno);
                   3031:                  pushlevel (0);
                   3032:                  clear_last_expr ();
                   3033:                  push_momentary ();
                   3034:                  expand_start_bindings (0); }
                   3035:        ;
                   3036: 
                   3037: /* Read zero or more forward-declarations for labels
                   3038:    that nested functions can jump to.  */
                   3039: maybe_label_decls:
                   3040:          /* empty */
                   3041:        | label_decls
                   3042:                { if (flag_ansi)
                   3043:                    pedwarn ("ANSI C++ forbids label declarations"); }
                   3044:        ;
                   3045: 
                   3046: label_decls:
                   3047:          label_decl
                   3048:        | label_decls label_decl
                   3049:        ;
                   3050: 
                   3051: label_decl:
                   3052:          LABEL identifiers_or_typenames ';'
                   3053:                { tree link;
                   3054:                  for (link = $2; link; link = TREE_CHAIN (link))
                   3055:                    {
                   3056:                      tree label = shadow_label (TREE_VALUE (link));
                   3057:                      C_DECLARED_LABEL_FLAG (label) = 1;
                   3058:                      declare_nonlocal_label (label);
                   3059:                    }
                   3060:                }
                   3061:        ;
                   3062: 
                   3063: /* This is the body of a function definition.
                   3064:    It causes syntax errors to ignore to the next openbrace.  */
                   3065: compstmt_or_error:
                   3066:          compstmt
                   3067:                {}
                   3068:        | error compstmt
                   3069:        ;
                   3070: 
                   3071: compstmt: '{' .pushlevel '}'
                   3072:                { expand_end_bindings (getdecls (), kept_level_p(), 1);
                   3073:                  $$ = poplevel (kept_level_p (), 1, 0);
                   3074:                  pop_momentary (); }
                   3075:        | '{' .pushlevel maybe_label_decls stmts '}'
                   3076:                { expand_end_bindings (getdecls (), kept_level_p(), 1);
                   3077:                  $$ = poplevel (kept_level_p (), 1, 0);
                   3078:                  pop_momentary (); }
                   3079:        | '{' .pushlevel maybe_label_decls stmts error '}'
                   3080:                { expand_end_bindings (getdecls (), kept_level_p(), 1);
                   3081:                  $$ = poplevel (kept_level_p (), 0, 0);
                   3082:                  pop_momentary (); }
                   3083:        | '{' .pushlevel maybe_label_decls error '}'
                   3084:                { expand_end_bindings (getdecls (), kept_level_p(), 1);
                   3085:                  $$ = poplevel (kept_level_p (), 0, 0);
                   3086:                  pop_momentary (); }
                   3087:        ;
                   3088: 
                   3089: simple_if:
                   3090:          IF
                   3091:                { cond_stmt_keyword = "if"; }
                   3092:          .pushlevel paren_cond_or_null
                   3093:                { emit_line_note (input_filename, lineno);
                   3094:                  expand_start_cond ($4, 0); }
                   3095:          implicitly_scoped_stmt
                   3096:        ;
                   3097: 
                   3098: implicitly_scoped_stmt:
                   3099:          compstmt
                   3100:                { finish_stmt (); }
                   3101:        | .pushlevel simple_stmt
                   3102:                { expand_end_bindings (getdecls (), kept_level_p (), 1);
                   3103:                  $$ = poplevel (kept_level_p (), 1, 0);
                   3104:                  pop_momentary (); }
                   3105:        ;
                   3106: 
                   3107: stmt:
                   3108:          compstmt
                   3109:                { finish_stmt (); }
                   3110:        | simple_stmt
                   3111:        ;
                   3112: 
                   3113: simple_stmt:
                   3114:          decl
                   3115:                { finish_stmt (); }
                   3116:        | expr ';'
                   3117:                {
                   3118:                  tree expr = $1;
                   3119:                  emit_line_note (input_filename, lineno);
                   3120:                  /* Do default conversion if safe and possibly important,
                   3121:                     in case within ({...}).  */
                   3122:                  if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE
                   3123:                       && lvalue_p (expr))
                   3124:                      || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)
                   3125:                    expr = default_conversion (expr);
                   3126:                  cplus_expand_expr_stmt (expr);
                   3127:                  clear_momentary ();
                   3128:                  finish_stmt (); }
                   3129:        | simple_if ELSE
                   3130:                { expand_start_else (); }
                   3131:          implicitly_scoped_stmt
                   3132:                { expand_end_cond ();
                   3133:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
                   3134:                  poplevel (kept_level_p (), 1, 0);
                   3135:                  pop_momentary ();
                   3136:                  finish_stmt (); }
                   3137:        | simple_if %prec IF
                   3138:                { expand_end_cond ();
                   3139:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
                   3140:                  poplevel (kept_level_p (), 1, 0);
                   3141:                  pop_momentary ();
                   3142:                  finish_stmt (); }
                   3143:        | WHILE
                   3144:                { emit_nop ();
                   3145:                  emit_line_note (input_filename, lineno);
                   3146:                  expand_start_loop (1);
                   3147:                  cond_stmt_keyword = "while"; }
                   3148:          .pushlevel paren_cond_or_null
                   3149:                { expand_exit_loop_if_false (0, $4); }
                   3150:          already_scoped_stmt
                   3151:                { expand_end_bindings (getdecls (), kept_level_p (), 1);
                   3152:                  poplevel (kept_level_p (), 1, 0);
                   3153:                  pop_momentary ();
                   3154:                  expand_end_loop ();
                   3155:                  finish_stmt (); }
                   3156:        | DO
                   3157:                { emit_nop ();
                   3158:                  emit_line_note (input_filename, lineno);
                   3159:                  expand_start_loop_continue_elsewhere (1); }
                   3160:          implicitly_scoped_stmt WHILE
                   3161:                { expand_loop_continue_here ();
                   3162:                  cond_stmt_keyword = "do"; }
                   3163:          paren_expr_or_null ';'
                   3164:                { emit_line_note (input_filename, lineno);
                   3165:                  expand_exit_loop_if_false (0, $6);
                   3166:                  expand_end_loop ();
                   3167:                  clear_momentary ();
                   3168:                  finish_stmt (); }
                   3169:        | forhead.1
                   3170:                { emit_nop ();
                   3171:                  emit_line_note (input_filename, lineno);
                   3172:                  if ($1) cplus_expand_expr_stmt ($1);
                   3173:                  expand_start_loop_continue_elsewhere (1); }
                   3174:          .pushlevel xcond ';'
                   3175:                { emit_line_note (input_filename, lineno);
                   3176:                  if ($4) expand_exit_loop_if_false (0, $4); }
                   3177:          xexpr ')'
                   3178:                /* Don't let the tree nodes for $7 be discarded
                   3179:                   by clear_momentary during the parsing of the next stmt.  */
                   3180:                { push_momentary (); }
                   3181:          already_scoped_stmt
                   3182:                { emit_line_note (input_filename, lineno);
                   3183:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
                   3184:                  poplevel (kept_level_p (), 1, 0);
                   3185:                  pop_momentary ();
                   3186:                  expand_loop_continue_here ();
                   3187:                  if ($7) cplus_expand_expr_stmt ($7);
                   3188:                  pop_momentary ();
                   3189:                  expand_end_loop ();
                   3190:                  finish_stmt (); }
                   3191:        | forhead.2
                   3192:                { emit_nop ();
                   3193:                  emit_line_note (input_filename, lineno);
                   3194:                  expand_start_loop_continue_elsewhere (1); }
                   3195:          .pushlevel xcond ';'
                   3196:                { emit_line_note (input_filename, lineno);
                   3197:                  if ($4) expand_exit_loop_if_false (0, $4); }
                   3198:          xexpr ')'
                   3199:                /* Don't let the tree nodes for $7 be discarded
                   3200:                   by clear_momentary during the parsing of the next stmt.  */
                   3201:                { push_momentary ();
                   3202:                  $<itype>8 = lineno; }
                   3203:          already_scoped_stmt
                   3204:                { emit_line_note (input_filename, (int) $<itype>8);
                   3205:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
                   3206:                  poplevel (kept_level_p (), 1, 0);
                   3207:                  pop_momentary ();
                   3208:                  expand_loop_continue_here ();
                   3209:                  if ($7) cplus_expand_expr_stmt ($7);
                   3210:                  pop_momentary ();
                   3211:                  expand_end_loop ();
                   3212:                  finish_stmt ();
                   3213:                }
                   3214:        | SWITCH .pushlevel '(' condition ')'
                   3215:                { emit_line_note (input_filename, lineno);
                   3216:                  c_expand_start_case ($4);
                   3217:                  /* Don't let the tree nodes for $4 be discarded by
                   3218:                     clear_momentary during the parsing of the next stmt.  */
                   3219:                  push_momentary (); }
                   3220:          implicitly_scoped_stmt
                   3221:                { expand_end_case ($4);
                   3222:                  pop_momentary ();
                   3223:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
                   3224:                  poplevel (kept_level_p (), 1, 0);
                   3225:                  pop_momentary ();
                   3226:                  finish_stmt (); }
                   3227:        | CASE expr_no_commas ':'
                   3228:                { register tree value = check_cp_case_value ($2);
                   3229:                  register tree label
                   3230:                    = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
                   3231: 
                   3232:                  if (value != error_mark_node)
                   3233:                    {
                   3234:                      tree duplicate;
                   3235:                      int success = pushcase (value, convert_and_check,
                   3236:                                              label, &duplicate);
                   3237:                      if (success == 1)
                   3238:                        cp_error ("case label `%E' not within a switch statement", $2);
                   3239:                      else if (success == 2)
                   3240:                        {
                   3241:                          cp_error ("duplicate case value `%E'", $2);
                   3242:                          cp_error_at ("`%E' previously used here", duplicate);
                   3243:                        }
                   3244:                      else if (success == 3)
                   3245:                        warning ("case value out of range");
                   3246:                      else if (success == 5)
                   3247:                        cp_error ("case label `%E' within scope of cleanup or variable array", $2);
                   3248:                    }
                   3249:                  define_case_label (label);
                   3250:                }
                   3251:          stmt
                   3252:        | CASE expr_no_commas ELLIPSIS expr_no_commas ':'
                   3253:                { register tree value1 = check_cp_case_value ($2);
                   3254:                  register tree value2 = check_cp_case_value ($4);
                   3255:                  register tree label
                   3256:                    = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
                   3257: 
                   3258:                  if (flag_ansi)
                   3259:                    pedwarn ("ANSI C++ forbids range expressions in switch statement");
                   3260:                  if (value1 != error_mark_node
                   3261:                      && value2 != error_mark_node)
                   3262:                    {
                   3263:                      tree duplicate;
                   3264:                      int success = pushcase_range (value1, value2,
                   3265:                                                    convert_and_check, label,
                   3266:                                                    &duplicate);
                   3267:                      if (success == 1)
                   3268:                        error ("case label not within a switch statement");
                   3269:                      else if (success == 2)
                   3270:                        {
                   3271:                          error ("duplicate (or overlapping) case value");
                   3272:                          error_with_decl (duplicate, "this is the first entry overlapping that value");
                   3273:                        }
                   3274:                      else if (success == 3)
                   3275:                        warning ("case value out of range");
                   3276:                      else if (success == 4)
                   3277:                        warning ("empty range specified");
                   3278:                      else if (success == 5)
                   3279:                        error ("case label within scope of cleanup or variable array");
                   3280:                    }
                   3281:                  define_case_label (label);
                   3282:                }
                   3283:          stmt
                   3284:        | DEFAULT ':'
                   3285:                {
                   3286:                  tree duplicate;
                   3287:                  register tree label
                   3288:                    = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
                   3289:                  int success = pushcase (NULL_TREE, 0, label, &duplicate);
                   3290:                  if (success == 1)
                   3291:                    error ("default label not within a switch statement");
                   3292:                  else if (success == 2)
                   3293:                    {
                   3294:                      error ("multiple default labels in one switch");
                   3295:                      error_with_decl (duplicate, "this is the first default label");
                   3296:                    }
                   3297:                  define_case_label (NULL_TREE);
                   3298:                }
                   3299:          stmt
                   3300:        | BREAK ';'
                   3301:                { emit_line_note (input_filename, lineno);
                   3302:                  if ( ! expand_exit_something ())
                   3303:                    error ("break statement not within loop or switch"); }
                   3304:        | CONTINUE ';'
                   3305:                { emit_line_note (input_filename, lineno);
                   3306:                  if (! expand_continue_loop (0))
                   3307:                    error ("continue statement not within a loop"); }
                   3308:        | RETURN ';'
                   3309:                { emit_line_note (input_filename, lineno);
                   3310:                  c_expand_return (NULL_TREE); }
                   3311:        | RETURN expr ';'
                   3312:                { emit_line_note (input_filename, lineno);
                   3313:                  c_expand_return ($2);
                   3314:                  finish_stmt ();
                   3315:                }
                   3316:        | asm_keyword maybe_type_qual '(' string ')' ';'
                   3317:                { if (TREE_CHAIN ($4)) $4 = combine_strings ($4);
                   3318:                  emit_line_note (input_filename, lineno);
                   3319:                  expand_asm ($4);
                   3320:                  finish_stmt ();
                   3321:                }
                   3322:        /* This is the case with just output operands.  */
                   3323:        | asm_keyword maybe_type_qual '(' string ':' asm_operands ')' ';'
                   3324:                { if (TREE_CHAIN ($4)) $4 = combine_strings ($4);
                   3325:                  emit_line_note (input_filename, lineno);
                   3326:                  c_expand_asm_operands ($4, $6, NULL_TREE, NULL_TREE,
                   3327:                                         $2 == ridpointers[(int)RID_VOLATILE],
                   3328:                                         input_filename, lineno);
                   3329:                  finish_stmt ();
                   3330:                }
                   3331:        /* This is the case with input operands as well.  */
                   3332:        | asm_keyword maybe_type_qual '(' string ':' asm_operands ':' asm_operands ')' ';'
                   3333:                { if (TREE_CHAIN ($4)) $4 = combine_strings ($4);
                   3334:                  emit_line_note (input_filename, lineno);
                   3335:                  c_expand_asm_operands ($4, $6, $8, NULL_TREE,
                   3336:                                         $2 == ridpointers[(int)RID_VOLATILE],
                   3337:                                         input_filename, lineno);
                   3338:                  finish_stmt ();
                   3339:                }
                   3340:        /* This is the case with clobbered registers as well.  */
                   3341:        | asm_keyword maybe_type_qual '(' string ':' asm_operands ':'
                   3342:          asm_operands ':' asm_clobbers ')' ';'
                   3343:                { if (TREE_CHAIN ($4)) $4 = combine_strings ($4);
                   3344:                  emit_line_note (input_filename, lineno);
                   3345:                  c_expand_asm_operands ($4, $6, $8, $10,
                   3346:                                         $2 == ridpointers[(int)RID_VOLATILE],
                   3347:                                         input_filename, lineno);
                   3348:                  finish_stmt ();
                   3349:                }
                   3350:        | GOTO '*' expr ';'
                   3351:                { emit_line_note (input_filename, lineno);
                   3352:                  expand_computed_goto ($3); }
                   3353:        | GOTO identifier ';'
                   3354:                { tree decl;
                   3355:                  emit_line_note (input_filename, lineno);
                   3356:                  decl = lookup_label ($2);
                   3357:                  TREE_USED (decl) = 1;
                   3358:                  expand_goto (decl); }
                   3359:        | label_colon stmt
                   3360:                { finish_stmt (); }
                   3361:        | label_colon '}'
                   3362:                { error ("label must be followed by statement");
                   3363:                  yyungetc ('}', 0);
                   3364:                  finish_stmt (); }
                   3365:        | ';'
                   3366:                { finish_stmt (); }
                   3367:        | try_block
                   3368:        ;
                   3369: 
                   3370: try_block:
                   3371:          TRY '{' .pushlevel
                   3372:                { expand_start_try_stmts (); }
                   3373:          ansi_try_stmts
                   3374:                { expand_end_try_stmts ();
                   3375:                  expand_start_all_catch (); }
                   3376:          handler_seq
                   3377:                { expand_end_all_catch (); }
                   3378:        ;
                   3379: 
                   3380: ansi_try_stmts:
                   3381:          '}'
                   3382:                /* An empty try block is degenerate, but it's better to
                   3383:                   do extra work here than to do all the special-case work
                   3384:                   everywhere else.  */
                   3385:                { expand_end_bindings (0,1,1);
                   3386:                  poplevel (2,0,0);
                   3387:                }
                   3388:        | stmts '}'
                   3389:                { expand_end_bindings (0,1,1);
                   3390:                  poplevel (2,0,0);
                   3391:                }
                   3392:        | error '}'
                   3393:                { expand_end_bindings (0,1,1);
                   3394:                  poplevel (2,0,0);
                   3395:                }
                   3396:        ;
                   3397: 
                   3398: handler_seq:
                   3399:          /* empty */
                   3400:        | handler_seq CATCH
                   3401:                { emit_line_note (input_filename, lineno); }
                   3402:          handler_args compstmt
                   3403:                { expand_end_catch_block (); }
                   3404:        ;
                   3405: 
                   3406: type_specifier_seq:
                   3407:          typed_typespecs %prec EMPTY
                   3408:        | nonempty_type_quals %prec EMPTY
                   3409:        ;
                   3410: 
                   3411: handler_args:
                   3412:          '(' ELLIPSIS ')'
                   3413:                { expand_start_catch_block (NULL_TREE, NULL_TREE); }
                   3414:        /* This doesn't allow reference parameters, the below does.
                   3415:        | '(' type_specifier_seq absdcl ')'
                   3416:                { expand_start_catch_block ($2, $3); }
                   3417:        | '(' type_specifier_seq ')'
                   3418:                { expand_start_catch_block ($2, NULL_TREE); }
                   3419:        | '(' type_specifier_seq notype_declarator ')'
                   3420:                { expand_start_catch_block ($2, $3); }
                   3421:        | '(' typed_typespecs after_type_declarator ')'
                   3422:                { expand_start_catch_block ($2, $3); }
                   3423:        */
                   3424:        | '(' parm ')'
                   3425:                { expand_start_catch_block (TREE_PURPOSE ($2),
                   3426:                                            TREE_VALUE ($2)); }
                   3427:        ;
                   3428: 
                   3429: label_colon:
                   3430:          IDENTIFIER ':'
                   3431:                { tree label;
                   3432:                do_label:
                   3433:                  label = define_label (input_filename, lineno, $1);
                   3434:                  if (label)
                   3435:                    expand_label (label);
                   3436:                }
                   3437:        | PTYPENAME ':'
                   3438:                { goto do_label; }
                   3439:        | TYPENAME ':'
                   3440:                { goto do_label; }
                   3441:        ;
                   3442: 
                   3443: forhead.1:
                   3444:          FOR '(' ';'
                   3445:                { $$ = NULL_TREE; }
                   3446:        | FOR '(' expr ';'
                   3447:                { $$ = $3; }
                   3448:        | FOR '(' '{' '}'
                   3449:                { $$ = NULL_TREE; }
                   3450:        ;
                   3451: 
                   3452: forhead.2:
                   3453:          FOR '(' decl
                   3454:                { $$ = 0; }
                   3455:        | FOR '(' error ';'
                   3456:                { $$ = 0; }
                   3457:        | FOR '(' '{' .pushlevel stmts '}'
                   3458:                { $$ = 1; }
                   3459:        | FOR '(' '{' .pushlevel error '}'
                   3460:                { $$ = -1; }
                   3461:        ;
                   3462: 
                   3463: /* Either a type-qualifier or nothing.  First thing in an `asm' statement.  */
                   3464: 
                   3465: maybe_type_qual:
                   3466:        /* empty */
                   3467:                { emit_line_note (input_filename, lineno);
                   3468:                  $$ = NULL_TREE; }
                   3469:        | TYPE_QUAL
                   3470:                { emit_line_note (input_filename, lineno); }
                   3471:        ;
                   3472: 
                   3473: xexpr:
                   3474:        /* empty */
                   3475:                { $$ = NULL_TREE; }
                   3476:        | expr
                   3477:        | error
                   3478:                { $$ = NULL_TREE; }
                   3479:        ;
                   3480: 
                   3481: /* These are the operands other than the first string and colon
                   3482:    in  asm ("addextend %2,%1": "=dm" (x), "0" (y), "g" (*x))  */
                   3483: asm_operands: /* empty */
                   3484:                { $$ = NULL_TREE; }
                   3485:        | nonnull_asm_operands
                   3486:        ;
                   3487: 
                   3488: nonnull_asm_operands:
                   3489:          asm_operand
                   3490:        | nonnull_asm_operands ',' asm_operand
                   3491:                { $$ = chainon ($$, $3); }
                   3492:        ;
                   3493: 
                   3494: asm_operand:
                   3495:          STRING '(' expr ')'
                   3496:                { $$ = build_tree_list ($$, $3); }
                   3497:        ;
                   3498: 
                   3499: asm_clobbers:
                   3500:          STRING
                   3501:                { $$ = tree_cons (NULL_TREE, $$, NULL_TREE); }
                   3502:        | asm_clobbers ',' STRING
                   3503:                { $$ = tree_cons (NULL_TREE, $3, $$); }
                   3504:        ;
                   3505: 
                   3506: /* This is what appears inside the parens in a function declarator.
                   3507:    Its value is represented in the format that grokdeclarator expects.
                   3508: 
                   3509:    In C++, declaring a function with no parameters
                   3510:    means that that function takes *no* parameters.  */
                   3511: 
                   3512: parmlist:  /* empty */
                   3513:                {
                   3514:                  if (strict_prototype)
                   3515:                    $$ = void_list_node;
                   3516:                  else
                   3517:                    $$ = NULL_TREE;
                   3518:                }
                   3519:        | complex_parmlist
                   3520:        | type_id
                   3521:                { $$ = tree_cons (NULL_TREE, $$, void_list_node);
                   3522:                  TREE_PARMLIST ($$) = 1; }
                   3523:        ;
                   3524: 
                   3525: /* This nonterminal does not include the common sequence '(' type_id ')',
                   3526:    as it is ambiguous and must be disambiguated elsewhere.  */
                   3527: complex_parmlist:
                   3528:          parms
                   3529:                {
                   3530:                  $$ = chainon ($$, void_list_node);
                   3531:                  TREE_PARMLIST ($$) = 1;
                   3532:                }
                   3533:        | parms_comma ELLIPSIS
                   3534:                {
                   3535:                  TREE_PARMLIST ($$) = 1;
                   3536:                }
                   3537:        /* C++ allows an ellipsis without a separating ',' */
                   3538:        | parms ELLIPSIS
                   3539:                {
                   3540:                  TREE_PARMLIST ($$) = 1;
                   3541:                }
                   3542:        | type_id ELLIPSIS
                   3543:                {
                   3544:                  $$ = build_tree_list (NULL_TREE, $$); 
                   3545:                  TREE_PARMLIST ($$) = 1;
                   3546:                }
                   3547:        | ELLIPSIS
                   3548:                {
                   3549:                  /* ARM $8.2.5 has this as a boxed-off comment.  */
                   3550:                  if (pedantic)
                   3551:                    warning ("use of `...' without a first argument is non-portable");
                   3552:                  $$ = NULL_TREE;
                   3553:                }
                   3554:        | TYPENAME_ELLIPSIS
                   3555:                {
                   3556:                  TREE_PARMLIST ($$) = 1;
                   3557:                }
                   3558:        | parms TYPENAME_ELLIPSIS
                   3559:                {
                   3560:                  TREE_PARMLIST ($$) = 1;
                   3561:                }
                   3562:        | type_id TYPENAME_ELLIPSIS
                   3563:                {
                   3564:                  $$ = build_tree_list (NULL_TREE, $$);
                   3565:                  TREE_PARMLIST ($$) = 1;
                   3566:                }
                   3567:        | parms ':'
                   3568:                {
                   3569:                  /* This helps us recover from really nasty
                   3570:                     parse errors, for example, a missing right
                   3571:                     parenthesis.  */
                   3572:                  yyerror ("possibly missing ')'");
                   3573:                  $$ = chainon ($$, void_list_node);
                   3574:                  TREE_PARMLIST ($$) = 1;
                   3575:                  yyungetc (':', 0);
                   3576:                  yychar = ')';
                   3577:                }
                   3578:        | type_id ':'
                   3579:                {
                   3580:                  /* This helps us recover from really nasty
                   3581:                     parse errors, for example, a missing right
                   3582:                     parenthesis.  */
                   3583:                  yyerror ("possibly missing ')'");
                   3584:                  $$ = tree_cons (NULL_TREE, $$, void_list_node);
                   3585:                  TREE_PARMLIST ($$) = 1;
                   3586:                  yyungetc (':', 0);
                   3587:                  yychar = ')';
                   3588:                }
                   3589:        ;
                   3590: 
                   3591: /* A nonempty list of parameter declarations or type names.  */
                   3592: parms:
                   3593:          named_parm
                   3594:                { $$ = build_tree_list (NULL_TREE, $$); }
                   3595:        | parm '=' init
                   3596:                { $$ = build_tree_list ($3, $$); }
                   3597:        | parms_comma full_parm
                   3598:                { $$ = chainon ($$, $2); }
                   3599:        | parms_comma bad_parm
                   3600:                { $$ = chainon ($$, build_tree_list (NULL_TREE, $2)); }
                   3601:        | parms_comma bad_parm '=' init
                   3602:                { $$ = chainon ($$, build_tree_list ($4, $2)); }
                   3603:        ;
                   3604: 
                   3605: parms_comma:
                   3606:          parms ','
                   3607:        | type_id ','
                   3608:                { $$ = build_tree_list (NULL_TREE, $$); }
                   3609:        ;
                   3610: 
                   3611: /* A single parameter declaration or parameter type name,
                   3612:    as found in a parmlist.  The first four cases make up for 10%
                   3613:    of the time spent parsing C++.  We cannot use them because
                   3614:    of `int id[]' which won't get parsed properly.  */
                   3615: named_parm:
                   3616: /*
                   3617:          typed_declspecs dont_see_typename '*' IDENTIFIER
                   3618:                { $$ = build_tree_list ($$, build_parse_node (INDIRECT_REF, $4));
                   3619:                  see_typename (); }
                   3620:        | typed_declspecs dont_see_typename '&' IDENTIFIER
                   3621:                { $$ = build_tree_list ($$, build_parse_node (ADDR_EXPR, $4));
                   3622:                  see_typename (); }
                   3623:        | TYPENAME IDENTIFIER
                   3624:                { $$ = build_tree_list (get_decl_list ($$), $2);  }
                   3625:        | TYPESPEC IDENTIFIER
                   3626:                { $$ = build_tree_list (get_decl_list ($$), $2); }
                   3627:        | */
                   3628:        /* Here we expand typed_declspecs inline to avoid mis-parsing of
                   3629:           TYPESPEC IDENTIFIER.  */
                   3630:          typed_declspecs1 declarator
                   3631:                { $$ = build_tree_list ($$, $2); }
                   3632:        | typed_typespecs declarator
                   3633:                { $$ = build_tree_list ($$, $2); }
                   3634:        | typespec declarator
                   3635:                { $$ = build_tree_list (get_decl_list ($$), $2); }
                   3636:        | typed_declspecs1 absdcl
                   3637:                { $$ = build_tree_list ($$, $2); }
                   3638:        | typed_declspecs1 %prec EMPTY
                   3639:                { $$ = build_tree_list ($$, NULL_TREE); }
                   3640:        | declmods notype_declarator
                   3641:                { $$ = build_tree_list ($$, $2); }
                   3642:        ;
                   3643: 
                   3644: full_parm:
                   3645:          parm
                   3646:                { $$ = build_tree_list (NULL_TREE, $$); }
                   3647:        | parm '=' init
                   3648:                { $$ = build_tree_list ($3, $$); }
                   3649:        ;
                   3650: 
                   3651: parm:
                   3652:        named_parm
                   3653:        | type_id
                   3654:        ;
                   3655: 
                   3656: see_typename: %prec EMPTY
                   3657:        { see_typename (); }
                   3658:        ;
                   3659: 
                   3660: /* 
                   3661: dont_see_typename: %prec EMPTY
                   3662:        { dont_see_typename (); }
                   3663:        ; 
                   3664: 
                   3665: try_for_typename:
                   3666:         {
                   3667:          if ($<ttype>-1 == error_mark_node)
                   3668:             $$ = 0;
                   3669:           else
                   3670:             {
                   3671:               $$ = 1;
                   3672:               pushclass ($<ttype>-1, 1);
                   3673:             }
                   3674:         }
                   3675:        ;
                   3676: */
                   3677: 
                   3678: bad_parm:
                   3679:          /* empty */ %prec EMPTY
                   3680:                {
                   3681:                  warning ("type specifier omitted for parameter");
                   3682:                  $$ = build_tree_list (TREE_PURPOSE (TREE_VALUE ($<ttype>-1)), NULL_TREE);
                   3683:                }
                   3684:        | notype_declarator
                   3685:                {
                   3686:                  warning ("type specifier omitted for parameter");
                   3687:                  $$ = build_tree_list (TREE_PURPOSE (TREE_VALUE ($<ttype>-1)), $$);
                   3688:                }
                   3689:        ;
                   3690: 
                   3691: maybe_raises:
                   3692:          %prec EMPTY /* empty */
                   3693:                { $$ = NULL_TREE; }
                   3694:        | THROW '(' ansi_raise_identifiers  ')' %prec EMPTY
                   3695:                { $$ = $3; }
                   3696:        ;
                   3697: 
                   3698: ansi_raise_identifier:
                   3699:          type_id
                   3700:                { $$ = build_decl_list (NULL_TREE, $$); }
                   3701:        ;
                   3702: 
                   3703: ansi_raise_identifiers:
                   3704:          ansi_raise_identifier
                   3705:        | ansi_raise_identifiers ',' ansi_raise_identifier
                   3706:                {
                   3707:                  TREE_CHAIN ($3) = $$;
                   3708:                  $$ = $3;
                   3709:                }
                   3710:        ;
                   3711: 
                   3712: conversion_declarator:
                   3713:          /* empty */ %prec EMPTY
                   3714:                { $$ = NULL_TREE; }
                   3715:        | '*' type_quals conversion_declarator
                   3716:                { $$ = make_pointer_declarator ($2, $3); }
                   3717:        | '&' type_quals conversion_declarator
                   3718:                { $$ = make_reference_declarator ($2, $3); }
                   3719:        | ptr_to_mem type_quals conversion_declarator
                   3720:                { tree arg = make_pointer_declarator ($2, $3);
                   3721:                  $$ = build_parse_node (SCOPE_REF, $1, arg);
                   3722:                }
                   3723:        ;
                   3724: 
                   3725: operator: OPERATOR
                   3726:                { got_scope = NULL_TREE; }
                   3727:        ;
                   3728: 
                   3729: operator_name:
                   3730:          operator '*'
                   3731:                { $$ = ansi_opname[MULT_EXPR]; }
                   3732:        | operator '/'
                   3733:                { $$ = ansi_opname[TRUNC_DIV_EXPR]; }
                   3734:        | operator '%'
                   3735:                { $$ = ansi_opname[TRUNC_MOD_EXPR]; }
                   3736:        | operator '+'
                   3737:                { $$ = ansi_opname[PLUS_EXPR]; }
                   3738:        | operator '-'
                   3739:                { $$ = ansi_opname[MINUS_EXPR]; }
                   3740:        | operator '&'
                   3741:                { $$ = ansi_opname[BIT_AND_EXPR]; }
                   3742:        | operator '|'
                   3743:                { $$ = ansi_opname[BIT_IOR_EXPR]; }
                   3744:        | operator '^'
                   3745:                { $$ = ansi_opname[BIT_XOR_EXPR]; }
                   3746:        | operator '~'
                   3747:                { $$ = ansi_opname[BIT_NOT_EXPR]; }
                   3748:        | operator ','
                   3749:                { $$ = ansi_opname[COMPOUND_EXPR]; }
                   3750:        | operator ARITHCOMPARE
                   3751:                { $$ = ansi_opname[$2]; }
                   3752:        | operator '<'
                   3753:                { $$ = ansi_opname[LT_EXPR]; }
                   3754:        | operator '>'
                   3755:                { $$ = ansi_opname[GT_EXPR]; }
                   3756:        | operator EQCOMPARE
                   3757:                { $$ = ansi_opname[$2]; }
                   3758:        | operator ASSIGN
                   3759:                { $$ = ansi_assopname[$2]; }
                   3760:        | operator '='
                   3761:                { $$ = ansi_opname [MODIFY_EXPR]; }
                   3762:        | operator LSHIFT
                   3763:                { $$ = ansi_opname[$2]; }
                   3764:        | operator RSHIFT
                   3765:                { $$ = ansi_opname[$2]; }
                   3766:        | operator PLUSPLUS
                   3767:                { $$ = ansi_opname[POSTINCREMENT_EXPR]; }
                   3768:        | operator MINUSMINUS
                   3769:                { $$ = ansi_opname[PREDECREMENT_EXPR]; }
                   3770:        | operator ANDAND
                   3771:                { $$ = ansi_opname[TRUTH_ANDIF_EXPR]; }
                   3772:        | operator OROR
                   3773:                { $$ = ansi_opname[TRUTH_ORIF_EXPR]; }
                   3774:        | operator '!'
                   3775:                { $$ = ansi_opname[TRUTH_NOT_EXPR]; }
                   3776:        | operator '?' ':'
                   3777:                { $$ = ansi_opname[COND_EXPR]; }
                   3778:        | operator MIN_MAX
                   3779:                { $$ = ansi_opname[$2]; }
                   3780:        | operator POINTSAT  %prec EMPTY
                   3781:                { $$ = ansi_opname[COMPONENT_REF]; }
                   3782:        | operator POINTSAT_STAR  %prec EMPTY
                   3783:                { $$ = ansi_opname[MEMBER_REF]; }
                   3784:        | operator LEFT_RIGHT
                   3785:                { $$ = ansi_opname[CALL_EXPR]; }
                   3786:        | operator '[' ']'
                   3787:                { $$ = ansi_opname[ARRAY_REF]; }
                   3788:        | operator NEW %prec EMPTY
                   3789:                { $$ = ansi_opname[NEW_EXPR]; }
                   3790:        | operator DELETE %prec EMPTY
                   3791:                { $$ = ansi_opname[DELETE_EXPR]; }
                   3792:        | operator NEW '[' ']'
                   3793:                { $$ = ansi_opname[VEC_NEW_EXPR]; }
                   3794:        | operator DELETE '[' ']'
                   3795:                { $$ = ansi_opname[VEC_DELETE_EXPR]; }
                   3796:        /* Names here should be looked up in class scope ALSO.  */
                   3797:        | operator type_specifier_seq conversion_declarator
                   3798:                { $$ = grokoptypename ($2, $3); }
                   3799:        | operator error
                   3800:                { $$ = ansi_opname[ERROR_MARK]; }
                   3801:        ;
                   3802: 
                   3803: %%
                   3804: 
                   3805: #ifdef SPEW_DEBUG
                   3806: const char *
                   3807: debug_yytranslate (value)
                   3808:     int value;
                   3809: {
                   3810:   return yytname[YYTRANSLATE (value)];
                   3811: }
                   3812: 
                   3813: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.