Annotation of GNUtools/cc/cp-parse.in, revision 1.1

1.1     ! root        1: /* YACC parser for C++ syntax and for Objective-C.
        !             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: /* This file defines the grammar of C++ and that of Objective C.
        !            22:    %if objc ... %endif objc  conditionals contain code for Objective C only.
        !            23:    %if cplus ... %endif cplus  conditionals contain code for C++ only.
        !            24:    Sed commands in Makefile.in are used to convert this file into
        !            25:    cp-parse.y and into obcp-parse.y.  */
        !            26: 
        !            27: 
        !            28: /* This grammar is based on the GNU CC grammar.  */
        !            29: 
        !            30: /* Note: Bison automatically applies a default action of "$$ = $1" for
        !            31:    all derivations; this is applied before the explicit action, if one
        !            32:    is given.  Keep this in mind when reading the actions.  */
        !            33: 
        !            34: /* Also note: this version contains experimental exception
        !            35:    handling features.  They could break, change, disappear,
        !            36:    or otherwise exhibit volatile behavior.  Don't depend on
        !            37:    me (Michael Tiemann) to protect you from any negative impact
        !            38:    this may have on your professional, personal, or spiritual life.
        !            39: 
        !            40:    NEWS FLASH:  This version now supports the exception handling
        !            41:    syntax of Stroustrup's 2nd edition, if -fansi-exceptions is given.
        !            42:    THIS IS WORK IN PROGRESS!!!  The type of the 'throw' and the
        !            43:    'catch' much match EXACTLY (no inheritance support or coercions).
        !            44:    Also, throw-specifications of functions don't work.
        !            45:    Destructors aren't called correctly.  Etc, etc.  --Per Bothner.
        !            46:   */
        !            47: 
        !            48: %{
        !            49: 
        !            50: %ifobjc
        !            51: #define OBJCPLUS
        !            52: %endifobjc
        !            53: 
        !            54: #if defined(GATHER_STATISTICS) || defined(SPEW_DEBUG)
        !            55: #undef YYDEBUG
        !            56: #define YYDEBUG 1
        !            57: #endif
        !            58: 
        !            59: #include "config.h"
        !            60: 
        !            61: #include <stdio.h>
        !            62: #include <errno.h>
        !            63: 
        !            64: #include "tree.h"
        !            65: #include "input.h"
        !            66: #include "flags.h"
        !            67: #include "cp-lex.h"
        !            68: #include "cp-tree.h"
        !            69: 
        !            70: /* Since parsers are distinct for each language, put the language string
        !            71:    definition here.  (fnf) */
        !            72: %ifobjc
        !            73: char *language_string = "GNU Objective-C++";
        !            74: %endifobjc
        !            75: %ifcplus
        !            76: char *language_string = "GNU C++";
        !            77: %endifcplus
        !            78: 
        !            79: extern tree void_list_node;
        !            80: extern struct obstack permanent_obstack;
        !            81: 
        !            82: #ifndef errno
        !            83: extern int errno;
        !            84: #endif
        !            85: 
        !            86: extern int end_of_file;
        !            87: 
        !            88: void yyerror ();
        !            89: 
        !            90: /* Like YYERROR but do call yyerror.  */
        !            91: #define YYERROR1 { yyerror ("syntax error"); YYERROR; }
        !            92: 
        !            93: static void position_after_white_space ();
        !            94: 
        !            95: /* Contains the statement keyword (if/while/do) to include in an
        !            96:    error message if the user supplies an empty conditional expression.  */
        !            97: static char *cond_stmt_keyword;
        !            98: 
        !            99: %ifobjc
        !           100: #include "objc-act.h"
        !           101: 
        !           102: /* the `decl' list operators optimization is not appropriate for Objective-C */
        !           103: #define build_decl_list        build_tree_list
        !           104: #define decl_tree_cons                 tree_cons
        !           105: %endifobjc
        !           106: 
        !           107: /* Nonzero if we have an `extern "C"' acting as an extern specifier.  */
        !           108: int have_extern_spec;
        !           109: int used_extern_spec;
        !           110: 
        !           111: void yyhook ();
        !           112: 
        !           113: /* Cons up an empty parameter list.  */
        !           114: #ifdef __GNUC__
        !           115: __inline
        !           116: #endif
        !           117: static tree
        !           118: empty_parms ()
        !           119: {
        !           120:   tree parms;
        !           121: 
        !           122:   if (strict_prototype)
        !           123:     parms = void_list_node;
        !           124:   else
        !           125:     parms = NULL_TREE;
        !           126:   return parms;
        !           127: }
        !           128: %}
        !           129: 
        !           130: %start program
        !           131: 
        !           132: %union {long itype; tree ttype; char *strtype; enum tree_code code; }
        !           133: 
        !           134: /* All identifiers that are not reserved words
        !           135:    and are not declared typedefs in the current block */
        !           136: %token IDENTIFIER
        !           137: 
        !           138: /* All identifiers that are declared typedefs in the current block.
        !           139:    In some contexts, they are treated just like IDENTIFIER,
        !           140:    but they can also serve as typespecs in declarations.  */
        !           141: %token TYPENAME
        !           142: 
        !           143: /* Qualified identifiers that end in a TYPENAME.  */
        !           144: %token SCOPED_TYPENAME
        !           145: 
        !           146: /* Reserved words that specify storage class.
        !           147:    yylval contains an IDENTIFIER_NODE which indicates which one.  */
        !           148: %token SCSPEC
        !           149: 
        !           150: /* Reserved words that specify type.
        !           151:    yylval contains an IDENTIFIER_NODE which indicates which one.  */
        !           152: %token TYPESPEC
        !           153: 
        !           154: /* Reserved words that qualify type: "const" or "volatile".
        !           155:    yylval contains an IDENTIFIER_NODE which indicates which one.  */
        !           156: %token TYPE_QUAL
        !           157: 
        !           158: /* Character or numeric constants.
        !           159:    yylval is the node for the constant.  */
        !           160: %token CONSTANT
        !           161: 
        !           162: /* String constants in raw form.
        !           163:    yylval is a STRING_CST node.  */
        !           164: %token STRING
        !           165: 
        !           166: /* "...", used for functions with variable arglists.  */
        !           167: %token ELLIPSIS
        !           168: 
        !           169: /* the reserved words */
        !           170: /* SCO include files test "ASM", so use something else. */
        !           171: %token SIZEOF ENUM /* STRUCT UNION */ IF ELSE WHILE DO FOR SWITCH CASE DEFAULT
        !           172: %token BREAK CONTINUE RETURN GOTO ASM_KEYWORD GCC_ASM_KEYWORD TYPEOF ALIGNOF
        !           173: %token HEADOF CLASSOF
        !           174: %token ATTRIBUTE EXTENSION LABEL
        !           175: 
        !           176: /* the reserved words... C++ extensions */
        !           177: %token <ttype> AGGR
        !           178: %token <itype> VISSPEC
        !           179: %token DELETE NEW OVERLOAD THIS OPERATOR
        !           180: %token LEFT_RIGHT TEMPLATE
        !           181: %token TYPEID DYNAMIC_CAST
        !           182: %token <itype> SCOPE
        !           183: 
        !           184: %ifobjc
        !           185: /* the Objective-C keywords */
        !           186: %token INTERFACE IMPLEMENTATION END SELECTOR DEFS ENCODE
        !           187: %token CLASSNAME PROTOCOL OBJECTNAME CLASS ALIAS
        !           188: %token PRIVATE PUBLIC PROTECTED
        !           189: 
        !           190: /* Objective-C string constants in raw form.
        !           191:    yylval is a OBJC_STRING_CST node.  */
        !           192: %token OBJC_STRING
        !           193: %endifobjc
        !           194: 
        !           195: /* Special token created by the lexer to separate TYPENAME
        !           196:    from an ABSDCL.  This allows us to parse `foo (*pf)()'.  */
        !           197: 
        !           198: %token START_DECLARATOR
        !           199: 
        !           200: /* Define the operator tokens and their precedences.
        !           201:    The value is an integer because, if used, it is the tree code
        !           202:    to use in the expression made from the operator.  */
        !           203: 
        !           204: %left EMPTY                    /* used to resolve s/r with epsilon */
        !           205: 
        !           206: /* Add precedence rules to solve dangling else s/r conflict */
        !           207: %nonassoc IF
        !           208: %nonassoc ELSE
        !           209: 
        !           210: %left IDENTIFIER TYPENAME TYPENAME_COLON SCSPEC TYPESPEC TYPE_QUAL ENUM AGGR
        !           211: 
        !           212: %left '{' ','
        !           213: 
        !           214: %right <code> ASSIGN '='
        !           215: %right <code> '?' ':' RANGE
        !           216: %left <code> OROR
        !           217: %left <code> ANDAND
        !           218: %left <code> '|'
        !           219: %left <code> '^'
        !           220: %left <code> '&'
        !           221: %left <code> MIN_MAX
        !           222: %left <code> EQCOMPARE
        !           223: %left <code> ARITHCOMPARE '<' '>'
        !           224: %left <code> LSHIFT RSHIFT
        !           225: %left <code> '+' '-'
        !           226: %left <code> '*' '/' '%'
        !           227: %right <code> UNARY PLUSPLUS MINUSMINUS
        !           228: %left HYPERUNARY
        !           229: %left <ttype> PAREN_STAR_PAREN LEFT_RIGHT
        !           230: %left <code> POINTSAT POINTSAT_STAR '.' DOT_STAR '(' '['
        !           231: 
        !           232: %right SCOPE                   /* C++ extension */
        !           233: %nonassoc NEW DELETE RAISE RAISES RERAISE TRY EXCEPT CATCH THROW
        !           234: %nonassoc ANSI_TRY ANSI_THROW
        !           235: 
        !           236: %type <code> unop
        !           237: 
        !           238: %type <ttype> identifier IDENTIFIER TYPENAME CONSTANT expr nonnull_exprlist
        !           239: %type <ttype> optional_identifier paren_expr_or_null
        !           240: %type <ttype> expr_no_commas cast_expr unary_expr primary string STRING
        !           241: %type <ttype> typed_declspecs reserved_declspecs
        !           242: %type <ttype> typed_typespecs reserved_typespecquals
        !           243: %type <ttype> declmods typespec typespecqual_reserved
        !           244: %type <ttype> SCSPEC TYPESPEC TYPE_QUAL nonempty_type_quals maybe_type_qual
        !           245: %type <itype> initdecls notype_initdecls initdcl       /* C++ modification */
        !           246: %type <ttype> init initlist maybeasm
        !           247: %type <ttype> asm_operands nonnull_asm_operands asm_operand asm_clobbers
        !           248: %type <ttype> maybe_attribute attribute_list attrib
        !           249: %type <ttype> abs_member_declarator after_type_member_declarator
        !           250: 
        !           251: %type <ttype> compstmt except_stmts ansi_except_stmts implicitly_scoped_stmt
        !           252: 
        !           253: %type <ttype> declarator notype_declarator after_type_declarator
        !           254: 
        !           255: %type <ttype> structsp opt.component_decl_list component_decl_list
        !           256: %type <ttype> component_decl components component_declarator
        !           257: %type <ttype> enumlist enumerator
        !           258: %type <ttype> typename absdcl absdcl1 type_quals abs_or_notype_decl
        !           259: %type <ttype> xexpr see_typename parmlist parms parm bad_parm
        !           260: %type <ttype> identifiers_or_typenames
        !           261: 
        !           262: /* C++ extensions */
        !           263: %type <ttype> typename_scope
        !           264: %token <ttype> TYPENAME_COLON TYPENAME_ELLIPSIS
        !           265: %token <ttype> PTYPENAME SCOPED_TYPENAME
        !           266: %token <ttype> PRE_PARSED_FUNCTION_DECL EXTERN_LANG_STRING ALL
        !           267: %token <ttype> PRE_PARSED_CLASS_DECL
        !           268: %type <ttype> fn.def1 /* Not really! */
        !           269: %type <ttype> fn.def2 return_id
        !           270: %type <ttype> named_class_head named_class_head_sans_basetype
        !           271: %type <ttype> unnamed_class_head
        !           272: %type <ttype> class_head base_class_list
        !           273: %type <itype> base_class_visibility_list
        !           274: %type <ttype> base_class maybe_base_class_list base_class.1
        !           275: %type <ttype> after_type_declarator_no_typename
        !           276: %type <ttype> maybe_raises raise_identifier raise_identifiers ansi_raise_identifier ansi_raise_identifiers
        !           277: %type <ttype> component_declarator0 id_scope scoped_typename scoped_base_class
        !           278: %type <ttype> forhead.1 identifier_or_opname operator_name
        !           279: %type <ttype> new delete object object_star aggr
        !           280: /* %type <ttype> primary_no_id */
        !           281: %type <ttype> nonmomentary_expr
        !           282: %type <itype> forhead.2 initdcl0 notype_initdcl0 member_init_list
        !           283: %type <itype> .scope try ansi_try
        !           284: %type <ttype> template_header template_parm_list template_parm
        !           285: %type <ttype> template_type template_arg_list template_arg
        !           286: %type <ttype> template_instantiation template_type_name tmpl.1 tmpl.2
        !           287: %type <ttype> template_instantiate_once template_instantiate_some
        !           288: %type <itype> fn_tmpl_end
        !           289: /* %type <itype> try_for_typename */
        !           290: %type <ttype> condition partially_scoped_stmt xcond paren_cond_or_null
        !           291: %type <strtype> .kindof_pushlevel
        !           292: 
        !           293: /* in order to recognize aggr tags as defining and thus shadowing. */
        !           294: %token TYPENAME_DEFN IDENTIFIER_DEFN PTYPENAME_DEFN
        !           295: %type <ttype> named_class_head_sans_basetype_defn 
        !           296: %type <ttype> identifier_defn IDENTIFIER_DEFN TYPENAME_DEFN PTYPENAME_DEFN
        !           297: 
        !           298: %type <strtype> .pushlevel
        !           299: 
        !           300: %ifobjc
        !           301: /* the Objective-C productions */
        !           302: %type <ttype> ivar_decl_list ivar_decls ivar_decl ivars ivar_declarator
        !           303: %type <ttype> methoddecl unaryselector keywordselector selector methodtype
        !           304: %type <ttype> keyworddecl receiver objcmessageexpr messageargs 
        !           305: %type <ttype> keywordexpr keywordarglist keywordarg reservedword
        !           306: %type <ttype> myparms myparm optparmlist objcselectorexpr 
        !           307: %type <ttype> selectorarg keywordnamelist keywordname objcencodeexpr 
        !           308: %type <ttype> objc_string protocolrefs identifier_list identifier_colon
        !           309: %type <ttype> objcprotocolexpr CLASSNAME OBJC_STRING OBJECTNAME
        !           310: %type <ttype> objc_openbracket.expr objc_closebracket
        !           311: %endifobjc
        !           312: 
        !           313: /* cp-spew.c depends on this being the last token.  Define
        !           314:    any new tokens before this one!  */
        !           315: %token END_OF_SAVED_INPUT
        !           316: 
        !           317: %{
        !           318: /* List of types and structure classes of the current declaration.  */
        !           319: static tree current_declspecs;
        !           320: 
        !           321: /* When defining an aggregate, this is the most recent one being defined.  */
        !           322: static tree current_aggr;
        !           323: 
        !           324: %ifobjc
        !           325: /* List of Objective-C specific information */
        !           326: 
        !           327: static tree objc_interface_context;
        !           328: tree objc_implementation_context;
        !           329: tree objc_method_context;
        !           330: tree objc_ivar_chain;
        !           331: static tree objc_ivar_context;
        !           332: static enum tree_code objc_inherit_code;
        !           333: int objc_receiver_context = 0;
        !           334: int objc_declarator_context = 0;
        !           335: int objc_msg_context = 0;
        !           336: static int objc_public_flag;
        !           337: 
        !           338: extern char *token_buffer;
        !           339: 
        !           340: tree current_objc_implementation_context (void)
        !           341: {
        !           342:   return objc_implementation_context;
        !           343: }
        !           344: %endifobjc
        !           345: 
        !           346: /* Tell yyparse how to print a token's value, if yydebug is set.  */
        !           347: 
        !           348: #define YYPRINT(FILE,YYCHAR,YYLVAL) yyprint(FILE,YYCHAR,YYLVAL)
        !           349: extern void yyprint ();
        !           350: extern tree combine_strings            PROTO((tree));
        !           351: extern tree truthvalue_conversion      PROTO((tree));
        !           352: %}
        !           353: 
        !           354: %%
        !           355: program: /* empty */
        !           356: %ifobjc
        !           357:                 { objc_finish (); }
        !           358: %endifobjc
        !           359:        | extdefs
        !           360:                {
        !           361:                  /* In case there were missing closebraces,
        !           362:                     get us back to the global binding level.  */
        !           363:                  while (! global_bindings_p ())
        !           364:                    poplevel (0, 0, 0);
        !           365:                  finish_file ();
        !           366: %ifobjc
        !           367:                   objc_finish ();
        !           368: %endifobjc
        !           369:                }
        !           370:        ;
        !           371: 
        !           372: /* the reason for the strange actions in this rule
        !           373:  is so that notype_initdecls when reached via datadef
        !           374:  can find a valid list of type and sc specs in $0. */
        !           375: 
        !           376: extdefs:
        !           377:          { $<ttype>$ = NULL_TREE; } extdef
        !           378:                {$<ttype>$ = NULL_TREE; }
        !           379:        | extdefs extdef
        !           380:                {$<ttype>$ = NULL_TREE; }
        !           381:        ;
        !           382: 
        !           383: .hush_warning:
        !           384:                { have_extern_spec = 1;
        !           385:                  used_extern_spec = 0;
        !           386:                  $<ttype>$ = NULL_TREE; }
        !           387:        ;
        !           388: .warning_ok:
        !           389:                { have_extern_spec = 0; }
        !           390:        ;
        !           391: 
        !           392: asm_keyword:
        !           393:        ASM_KEYWORD { if (pedantic)
        !           394:                      pedwarn ("ANSI C++ forbids use of `asm' keyword"); }
        !           395:        | GCC_ASM_KEYWORD
        !           396:        ;
        !           397: 
        !           398: extdef:
        !           399:          fndef
        !           400:                { if (pending_inlines) do_pending_inlines (); }
        !           401:        | datadef
        !           402:                { if (pending_inlines) do_pending_inlines (); }
        !           403: %ifobjc
        !           404:        | objcdef
        !           405: %endifobjc
        !           406:        | template_def
        !           407:                { if (pending_inlines) do_pending_inlines (); }
        !           408:        | overloaddef
        !           409:        | asm_keyword '(' string ')' ';'
        !           410:                { if (TREE_CHAIN ($3)) $3 = combine_strings ($3);
        !           411:                  assemble_asm ($3); }
        !           412:        | extern_lang_string '{' extdefs '}'
        !           413:                { pop_lang_context (); }
        !           414:        | extern_lang_string '{' '}'
        !           415:                { pop_lang_context (); }
        !           416:        | extern_lang_string .hush_warning fndef .warning_ok
        !           417:                { if (pending_inlines) do_pending_inlines ();
        !           418:                  pop_lang_context (); }
        !           419:        | extern_lang_string .hush_warning datadef .warning_ok
        !           420:                { if (pending_inlines) do_pending_inlines ();
        !           421:                  pop_lang_context (); }
        !           422:        ;
        !           423: 
        !           424: extern_lang_string:
        !           425:          EXTERN_LANG_STRING
        !           426:                { push_lang_context ($1); }
        !           427:        ;
        !           428: 
        !           429: template_header:
        !           430:          TEMPLATE '<'
        !           431:                { begin_template_parm_list (); }
        !           432:          template_parm_list '>'
        !           433:                { $$ = end_template_parm_list ($4); }
        !           434:        ;
        !           435: 
        !           436: template_parm_list:
        !           437:          template_parm
        !           438:                { $$ = process_template_parm (NULL_TREE, $1); }
        !           439:        | template_parm_list ',' template_parm
        !           440:                { $$ = process_template_parm ($1, $3); }
        !           441:        ;
        !           442: 
        !           443: template_parm:
        !           444:        /* The following rules introduce a new reduce/reduce
        !           445:           conflict: they are valid prefixes for a `structsp',
        !           446:           which means they could match a nameless parameter.
        !           447:           By putting them before the `parm' rule, we get
        !           448:           their match before considering them nameless parameter
        !           449:           declarations.  */
        !           450:          aggr identifier
        !           451:                {
        !           452:                  if ($1 != class_type_node)
        !           453:                    error ("template type parameter must use keyword `class'");
        !           454:                  $$ = build_tree_list ($2, NULL_TREE);
        !           455:                }
        !           456:        | aggr identifier_defn ':' base_class.1
        !           457:                {
        !           458:                  if ($1 != class_type_node)
        !           459:                    error ("template type parameter must use keyword `class'");
        !           460:                  warning ("restricted template type parameters not yet implemented");
        !           461:                  $$ = build_tree_list ($2, $4);
        !           462:                }
        !           463:        | aggr TYPENAME_COLON base_class.1
        !           464:                {
        !           465:                  if ($1 != class_type_node)
        !           466:                    error ("template type parameter must use keyword `class'");
        !           467:                  warning ("restricted template type parameters not yet implemented");
        !           468:                  $$ = build_tree_list ($2, $3);
        !           469:                }
        !           470:        | parm
        !           471:        ;
        !           472: 
        !           473: overloaddef:
        !           474:          OVERLOAD ov_identifiers ';'
        !           475:                { warning ("use of `overload' is an anachronism"); }
        !           476:        ;
        !           477: 
        !           478: ov_identifiers: IDENTIFIER
        !           479:                { declare_overloaded ($1); }
        !           480:        | ov_identifiers ',' IDENTIFIER
        !           481:                { declare_overloaded ($3); }
        !           482:        ;
        !           483:          
        !           484: template_def:
        !           485:        /* Class template declarations go here; they aren't normal class
        !           486:           declarations, because we can't process the bodies yet.  */
        !           487:          template_header named_class_head_sans_basetype '{'
        !           488:                { yychar = '{'; goto template1; }
        !           489:         ';'
        !           490:        | template_header named_class_head_sans_basetype_defn '{'
        !           491:                { yychar = '{'; goto template1; }
        !           492:         ';'
        !           493:        | template_header named_class_head_sans_basetype ':'
        !           494:                { yychar = ':'; goto template1; }
        !           495:         ';'
        !           496:        | template_header named_class_head_sans_basetype_defn ':'
        !           497:                {
        !           498:                  yychar = ':';
        !           499:                template1:
        !           500:                  if (current_aggr == exception_type_node)
        !           501:                    error ("template type must define an aggregate or union");
        !           502:                  /* Maybe pedantic warning for union?
        !           503:                     How about an enum? :-)  */
        !           504:                  end_template_decl ($1, $2, current_aggr);
        !           505:                  reinit_parse_for_template (yychar, $1, $2);
        !           506:                  yychar = YYEMPTY;
        !           507:                }
        !           508:          ';'
        !           509:        | template_header named_class_head_sans_basetype ';'
        !           510:                {
        !           511:                  end_template_decl ($1, $2, current_aggr);
        !           512:                  /* declare $2 as template name with $1 parm list */
        !           513:                }
        !           514:        | template_header named_class_head_sans_basetype_defn ';'
        !           515:                {
        !           516:                  end_template_decl ($1, $2, current_aggr);
        !           517:                  /* declare $2 as template name with $1 parm list */
        !           518:                }
        !           519:        | template_header /* notype_initdcl0 ';' */
        !           520:          notype_declarator maybe_raises maybeasm maybe_attribute
        !           521:          fn_tmpl_end
        !           522:                {
        !           523:                  tree d;
        !           524:                  int momentary;
        !           525:                  momentary = suspend_momentary ();
        !           526:                  d = start_decl ($<ttype>2, /*current_declspecs*/NULL_TREE, 0, $3);
        !           527:                  cplus_decl_attributes (d, $5);
        !           528:                  finish_decl (d, NULL_TREE, $4, 0);
        !           529:                  end_template_decl ($1, d, 0);
        !           530:                  if ($6 != ';')
        !           531:                    reinit_parse_for_template ((int) $6, $1, d);
        !           532:                  resume_momentary (momentary);
        !           533:                }
        !           534:        | template_header typed_declspecs /*initdcl0*/
        !           535:          declarator maybe_raises maybeasm maybe_attribute
        !           536:          fn_tmpl_end
        !           537:                {
        !           538:                  tree d;
        !           539:                  int momentary;
        !           540: 
        !           541:                  current_declspecs = $2;
        !           542:                  momentary = suspend_momentary ();
        !           543:                  d = start_decl ($<ttype>3, current_declspecs,
        !           544:                                  0, $<ttype>4);
        !           545:                  cplus_decl_attributes (d, $6);
        !           546:                  finish_decl (d, NULL_TREE, $5, 0);
        !           547:                  end_exception_decls ();
        !           548:                  end_template_decl ($1, d, 0);
        !           549:                  if ($7 != ';')
        !           550:                    {
        !           551:                      reinit_parse_for_template ((int) $7, $1, d);
        !           552:                      yychar = YYEMPTY;
        !           553:                    }
        !           554:                  note_list_got_semicolon ($<ttype>2);
        !           555:                  resume_momentary (momentary);
        !           556:                }
        !           557:        | template_header declmods declarator fn_tmpl_end
        !           558:                {
        !           559:                  tree d = start_decl ($<ttype>3, $<ttype>2, 0, NULL_TREE);
        !           560:                  finish_decl (d, NULL_TREE, NULL_TREE, 0);
        !           561:                  end_template_decl ($1, d, 0);
        !           562:                  if ($4 != ';')
        !           563:                    reinit_parse_for_template ((int) $4, $1, d);
        !           564:                }
        !           565:        /* Try to recover from syntax errors in templates.  */
        !           566:        | template_header error '}'     { end_template_decl ($1, 0, 0); }
        !           567:        | template_header error ';'     { end_template_decl ($1, 0, 0); }
        !           568:        ;
        !           569: 
        !           570: fn_tmpl_end: '{'               { $$ = '{'; }
        !           571:        | ':'                   { $$ = ':'; }
        !           572:        | ';'                   { $$ = ';'; }
        !           573:        | '='                   { $$ = '='; }
        !           574:        | RETURN                { $$ = RETURN; }
        !           575:        ;
        !           576: 
        !           577: datadef:
        !           578:          notype_initdecls ';'
        !           579:                { if (pedantic)
        !           580:                    pedwarn ("ANSI C++ forbids data definition with no type or storage class");
        !           581:                  else if (! flag_traditional && ! have_extern_spec)
        !           582:                    warning ("data definition has no type or storage class"); }
        !           583:        | declmods notype_initdecls ';'
        !           584:                {}
        !           585:        /* Normal case to make fast: "int i;".  */
        !           586:        | declmods declarator ';'
        !           587:                { tree d;
        !           588:                  d = start_decl ($<ttype>2, $<ttype>$, 0, NULL_TREE);
        !           589:                  finish_decl (d, NULL_TREE, NULL_TREE, 0);
        !           590:                }
        !           591:        | typed_declspecs initdecls ';'
        !           592:                {
        !           593:                  end_exception_decls ();
        !           594:                  note_list_got_semicolon ($<ttype>$);
        !           595:                }
        !           596:        /* Normal case: make this fast.  */
        !           597:        | typed_declspecs declarator ';'
        !           598:                { tree d;
        !           599:                  d = start_decl ($<ttype>2, $<ttype>$, 0, NULL_TREE);
        !           600:                  finish_decl (d, NULL_TREE, NULL_TREE, 0);
        !           601:                  end_exception_decls ();
        !           602:                  note_list_got_semicolon ($<ttype>$);
        !           603:                }
        !           604:         | declmods ';'
        !           605:          { pedwarn ("empty declaration"); }
        !           606:        | typed_declspecs ';'
        !           607:          {
        !           608:            tree t = $<ttype>$;
        !           609:            shadow_tag (t);
        !           610:            if (TREE_CODE (t) == TREE_LIST
        !           611:                && TREE_PURPOSE (t) == NULL_TREE)
        !           612:              {
        !           613:                t = TREE_VALUE (t);
        !           614:                if (TREE_CODE (t) == RECORD_TYPE
        !           615:                    && TYPE_SIZE (t)
        !           616:                    && CLASSTYPE_USE_TEMPLATE (t) == 0)
        !           617:                  CLASSTYPE_USE_TEMPLATE (t) = 2;
        !           618:                else if (TREE_CODE (t) == ENUMERAL_TYPE
        !           619:                         && !TYPE_SIZE (t))
        !           620:                  cp_error ("forward declaration of `%#T'", t);
        !           621:              }
        !           622:            note_list_got_semicolon ($<ttype>$);
        !           623:          }
        !           624:        | error ';'
        !           625:        | error '}'
        !           626:        | ';'
        !           627:        ;
        !           628: 
        !           629: fndef:
        !           630:          fn.def1 base_init compstmt_or_error
        !           631:                {
        !           632:                  finish_function (lineno, 1);
        !           633:                  /* finish_function performs these three statements:
        !           634: 
        !           635:                     expand_end_bindings (getdecls (), 1, 0);
        !           636:                     poplevel (1, 1, 0);
        !           637: 
        !           638:                     expand_end_bindings (0, 0, 0);
        !           639:                     poplevel (0, 0, 1);
        !           640:                     */
        !           641:                  if ($<ttype>$) process_next_inline ($<ttype>$);
        !           642:                }
        !           643:        | fn.def1 return_init base_init compstmt_or_error
        !           644:                {
        !           645:                  finish_function (lineno, 1);
        !           646:                  /* finish_function performs these three statements:
        !           647: 
        !           648:                     expand_end_bindings (getdecls (), 1, 0);
        !           649:                     poplevel (1, 1, 0);
        !           650: 
        !           651:                     expand_end_bindings (0, 0, 0);
        !           652:                     poplevel (0, 0, 1);
        !           653:                     */
        !           654:                  if ($<ttype>$) process_next_inline ($<ttype>$);
        !           655:                }
        !           656:        | fn.def1 nodecls compstmt_or_error
        !           657:                { finish_function (lineno, 0);
        !           658:                  if ($<ttype>$) process_next_inline ($<ttype>$); }
        !           659:        | fn.def1 return_init ';' nodecls compstmt_or_error
        !           660:                { finish_function (lineno, 0);
        !           661:                  if ($<ttype>$) process_next_inline ($<ttype>$); }
        !           662:        | fn.def1 return_init nodecls compstmt_or_error
        !           663:                { finish_function (lineno, 0);
        !           664:                  if ($<ttype>$) process_next_inline ($<ttype>$); }
        !           665:        | typed_declspecs declarator error
        !           666:                {}
        !           667:        | declmods notype_declarator error
        !           668:                {}
        !           669:        | notype_declarator error
        !           670:                {}
        !           671:        ;
        !           672: 
        !           673: fn.def1:
        !           674:          typed_declspecs declarator maybe_raises
        !           675:                { if (! start_function ($$, $2, $3, 0))
        !           676:                    YYERROR1;
        !           677:                  reinit_parse_for_function ();
        !           678:                  $$ = NULL_TREE; }
        !           679:        | declmods notype_declarator maybe_raises
        !           680:                { if (! start_function ($$, $2, $3, 0))
        !           681:                    YYERROR1;
        !           682:                  reinit_parse_for_function ();
        !           683:                  $$ = NULL_TREE; }
        !           684:        | notype_declarator maybe_raises
        !           685:                { if (! start_function (NULL_TREE, $$, $2, 0))
        !           686:                    YYERROR1;
        !           687:                  reinit_parse_for_function ();
        !           688:                  $$ = NULL_TREE; }
        !           689:        | TYPENAME '(' parmlist ')' type_quals maybe_raises
        !           690:                { if (! start_function (NULL_TREE, build_parse_node (CALL_EXPR, $$, $3, $5), $6, 0))
        !           691:                    YYERROR1;
        !           692:                  reinit_parse_for_function ();
        !           693:                  $$ = NULL_TREE; }
        !           694:        | scoped_typename '(' parmlist ')' type_quals maybe_raises
        !           695:                { if (! start_function (NULL_TREE, build_parse_node (CALL_EXPR, $$, $3, $5), $6, 0))
        !           696:                    YYERROR1;
        !           697:                  reinit_parse_for_function ();
        !           698:                  $$ = NULL_TREE; }
        !           699:        | TYPENAME LEFT_RIGHT type_quals maybe_raises
        !           700:                { if (! start_function (NULL_TREE, build_parse_node (CALL_EXPR, $$, empty_parms (), $3), $4, 0))
        !           701:                    YYERROR1;
        !           702:                  reinit_parse_for_function ();
        !           703:                  $$ = NULL_TREE; }
        !           704:        | scoped_typename LEFT_RIGHT type_quals maybe_raises
        !           705:                { if (! start_function (NULL_TREE, build_parse_node (CALL_EXPR, $$, empty_parms (), $3), $4, 0))
        !           706:                    YYERROR1;
        !           707:                  reinit_parse_for_function ();
        !           708:                  $$ = NULL_TREE; }
        !           709:        | PRE_PARSED_FUNCTION_DECL
        !           710:                { start_function (NULL_TREE, TREE_VALUE ($$), NULL_TREE, 1);
        !           711:                  reinit_parse_for_function (); }
        !           712:        ;
        !           713: 
        !           714: /* more C++ complexity */
        !           715: fn.def2:
        !           716:          typed_declspecs '(' parmlist ')' type_quals maybe_raises
        !           717:                {
        !           718:                  tree decl = build_parse_node (CALL_EXPR, TREE_VALUE ($$), $3, $5);
        !           719:                  $$ = start_method (TREE_CHAIN ($$), decl, $6);
        !           720:                  if (! $$)
        !           721:                    YYERROR1;
        !           722:                  if (yychar == YYEMPTY)
        !           723:                    yychar = YYLEX;
        !           724:                  reinit_parse_for_method (yychar, $$); }
        !           725:        | typed_declspecs LEFT_RIGHT type_quals maybe_raises
        !           726:                {
        !           727:                  tree decl = build_parse_node (CALL_EXPR, TREE_VALUE ($$), empty_parms (), $3);
        !           728:                  $$ = start_method (TREE_CHAIN ($$), decl, $4);
        !           729:                  if (! $$)
        !           730:                    YYERROR1;
        !           731:                  if (yychar == YYEMPTY)
        !           732:                    yychar = YYLEX;
        !           733:                  reinit_parse_for_method (yychar, $$); }
        !           734:        | typed_declspecs declarator maybe_raises
        !           735:                { $$ = start_method ($$, $2, $3);
        !           736:                  if (! $$)
        !           737:                    YYERROR1;
        !           738:                  if (yychar == YYEMPTY)
        !           739:                    yychar = YYLEX;
        !           740:                  reinit_parse_for_method (yychar, $$); }
        !           741:        | declmods '(' parmlist ')' type_quals maybe_raises
        !           742:                {
        !           743:                  tree decl = build_parse_node (CALL_EXPR, TREE_VALUE ($$), $3, $5);
        !           744:                  $$ = start_method (TREE_CHAIN ($$), decl, $6);
        !           745:                  if (! $$)
        !           746:                    YYERROR1;
        !           747:                  if (yychar == YYEMPTY)
        !           748:                    yychar = YYLEX;
        !           749:                  reinit_parse_for_method (yychar, $$); }
        !           750:        | declmods LEFT_RIGHT type_quals maybe_raises
        !           751:                {
        !           752:                  tree decl = build_parse_node (CALL_EXPR, TREE_VALUE ($$), empty_parms (), $3);
        !           753:                  $$ = start_method (TREE_CHAIN ($$), decl, $4);
        !           754:                  if (! $$)
        !           755:                    YYERROR1;
        !           756:                  if (yychar == YYEMPTY)
        !           757:                    yychar = YYLEX;
        !           758:                  reinit_parse_for_method (yychar, $$); }
        !           759:        | declmods declarator maybe_raises
        !           760:                { $$ = start_method ($$, $2, $3);
        !           761:                  if (! $$)
        !           762:                    YYERROR1;
        !           763:                  if (yychar == YYEMPTY)
        !           764:                    yychar = YYLEX;
        !           765:                  reinit_parse_for_method (yychar, $$); }
        !           766:        | notype_declarator maybe_raises
        !           767:                { $$ = start_method (NULL_TREE, $$, $2);
        !           768:                  if (! $$)
        !           769:                    YYERROR1;
        !           770:                  if (yychar == YYEMPTY)
        !           771:                    yychar = YYLEX;
        !           772:                  reinit_parse_for_method (yychar, $$); }
        !           773:        ;
        !           774: 
        !           775: return_id: RETURN IDENTIFIER
        !           776:                {
        !           777:                  if (! current_function_parms_stored)
        !           778:                    store_parm_decls ();
        !           779:                  $$ = $2;
        !           780:                }
        !           781:        ;
        !           782: 
        !           783: return_init: return_id
        !           784:                { store_return_init ($<ttype>$, NULL_TREE); }
        !           785:        | return_id '=' init
        !           786:                { store_return_init ($<ttype>$, $3); }
        !           787:        | return_id '(' nonnull_exprlist ')'
        !           788:                { store_return_init ($<ttype>$, $3); }
        !           789:        | return_id LEFT_RIGHT
        !           790:                { store_return_init ($<ttype>$, NULL_TREE); }
        !           791:        ;
        !           792: 
        !           793: base_init:
        !           794:          ':' .set_base_init member_init_list
        !           795:                {
        !           796:                  if ($3 == 0)
        !           797:                    error ("no base initializers given following ':'");
        !           798:                  setup_vtbl_ptr ();
        !           799:                  /* Always keep the BLOCK node associated with the outermost
        !           800:                     pair of curley braces of a function.  These are needed
        !           801:                     for correct operation of dwarfout.c.  */
        !           802:                  keep_next_level ();
        !           803:                }
        !           804:        ;
        !           805: 
        !           806: .set_base_init:
        !           807:        /* empty */
        !           808:                {
        !           809:                  if (! current_function_parms_stored)
        !           810:                    store_parm_decls ();
        !           811: 
        !           812:                  /* Flag that we are processing base and member initializers.  */
        !           813:                  current_vtable_decl = error_mark_node;
        !           814: 
        !           815:                  if (DECL_CONSTRUCTOR_P (current_function_decl))
        !           816:                    {
        !           817:                      /* Make a contour for the initializer list.  */
        !           818:                      pushlevel (0);
        !           819:                      clear_last_expr ();
        !           820:                      expand_start_bindings (0);
        !           821:                    }
        !           822:                  else if (current_class_type == NULL_TREE)
        !           823:                    error ("base initializers not allowed for non-member functions");
        !           824:                  else if (! DECL_CONSTRUCTOR_P (current_function_decl))
        !           825:                    error ("only constructors take base initializers");
        !           826:                }
        !           827:        ;
        !           828: 
        !           829: member_init_list:
        !           830:          /* empty */
        !           831:                { $$ = 0; }
        !           832:        | member_init
        !           833:                { $$ = 1; }
        !           834:        | member_init_list ',' member_init
        !           835:        | member_init_list error
        !           836:        ;
        !           837: 
        !           838: member_init: '(' nonnull_exprlist ')'
        !           839:                {
        !           840:                  if (current_class_name && !flag_traditional)
        !           841:                    pedwarn ("ANSI C++ forbids old style base class initialization",
        !           842:                             IDENTIFIER_POINTER (current_class_name));
        !           843:                  expand_member_init (C_C_D, NULL_TREE, $2);
        !           844:                }
        !           845:        | LEFT_RIGHT
        !           846:                {
        !           847:                  if (current_class_name && !flag_traditional)
        !           848:                    pedwarn ("ANSI C++ forbids old style base class initialization",
        !           849:                             IDENTIFIER_POINTER (current_class_name));
        !           850:                  expand_member_init (C_C_D, NULL_TREE, void_type_node);
        !           851:                }
        !           852:        | identifier '(' nonnull_exprlist ')'
        !           853:                {
        !           854:                  expand_member_init (C_C_D, $<ttype>$, $3);
        !           855:                }
        !           856:        | identifier LEFT_RIGHT
        !           857:                { expand_member_init (C_C_D, $<ttype>$, void_type_node); }
        !           858:        | template_type_name '(' nonnull_exprlist ')'
        !           859:                { expand_member_init (C_C_D, $<ttype>$, $3); }
        !           860:        | template_type_name LEFT_RIGHT
        !           861:                { expand_member_init (C_C_D, $<ttype>$, void_type_node); }
        !           862:        | scoped_typename '(' nonnull_exprlist ')'
        !           863:                { expand_member_init (C_C_D, $<ttype>$, $3); }
        !           864:        | scoped_typename LEFT_RIGHT
        !           865:                { expand_member_init (C_C_D, $<ttype>$, void_type_node); }
        !           866:        | id_scope identifier '(' nonnull_exprlist ')'
        !           867:                {
        !           868:                  do_member_init ($<ttype>$, $2, $4);
        !           869:                }
        !           870:        | id_scope identifier LEFT_RIGHT
        !           871:                {
        !           872:                  do_member_init ($<ttype>$, $2, void_type_node);
        !           873:                }
        !           874:        ;
        !           875: 
        !           876: identifier:
        !           877:          IDENTIFIER
        !           878:        | TYPENAME
        !           879:        | PTYPENAME
        !           880: %ifobjc
        !           881:        | OBJECTNAME
        !           882:        | CLASSNAME
        !           883: %endifobjc
        !           884:        ;
        !           885: 
        !           886: identifier_defn:
        !           887:          IDENTIFIER_DEFN
        !           888:        | TYPENAME_DEFN
        !           889:        | PTYPENAME_DEFN
        !           890:        ;
        !           891: 
        !           892: identifier_or_opname:
        !           893:          IDENTIFIER
        !           894:        | TYPENAME
        !           895:        | PTYPENAME
        !           896: %ifobjc
        !           897:        | OBJECTNAME
        !           898:        | CLASSNAME
        !           899: %endifobjc
        !           900: /*     | '~' TYPENAME
        !           901:                { $$ = build_parse_node (BIT_NOT_EXPR, $2); }*/
        !           902:        /* get rid of the next line, replace it with the above */
        !           903:        | '~' identifier { $$ = build_parse_node (BIT_NOT_EXPR,$2);}
        !           904:        | operator_name
        !           905:        ;
        !           906: 
        !           907: template_type:
        !           908:          template_type_name tmpl.1 template_instantiation
        !           909:                {
        !           910:                  extern tree template_type_seen_before_scope;
        !           911: 
        !           912:                  if ($3) 
        !           913:                    $$ = $3;
        !           914:                  else if ($$ != error_mark_node)
        !           915:                    $$ = IDENTIFIER_TYPE_VALUE ($$);
        !           916:                  /* This is a kludge: In order to detect nested types inside
        !           917:                   * template classes, we have to tell the lexer that it should
        !           918:                   * try to replace a following SCOPE token with the correct
        !           919:                   * SCOPED_TYPENAME for the nested type.  This SCOPED_TYPENAME
        !           920:                   * token will be handled in the rule "scoped_typename".
        !           921:                   * - [email protected] */
        !           922:                  if (yychar == SCOPE)
        !           923:                    {
        !           924:                      /* We set template_type_seen_before_scope to be
        !           925:                         an error_mark_node so we can avoid meaningless
        !           926:                         and unhelpful syntax errors later.  */
        !           927:                      if ($$ != error_mark_node)
        !           928:                        template_type_seen_before_scope = TYPE_IDENTIFIER ($$);
        !           929:                      else
        !           930:                        template_type_seen_before_scope = error_mark_node;
        !           931:                      yychar = YYLEX;
        !           932:                    }
        !           933:                }
        !           934:        ;
        !           935: 
        !           936: template_type_name:
        !           937:          PTYPENAME '<' template_arg_list '>'
        !           938:                { $$ = lookup_template_class ($$, $3, NULL_TREE); }
        !           939:        | TYPENAME  '<' template_arg_list '>'
        !           940:                { $$ = lookup_template_class ($$, $3, NULL_TREE); }
        !           941:        ;
        !           942: 
        !           943: tmpl.1:
        !           944:        /* Expansion of template may be required, unless we're followed by
        !           945:           a class definition.  */
        !           946:          '{'   { yyungetc ('{', 1); $$ = 0; }
        !           947:        | ':'   { yyungetc (':', 1); $$ = 0; }
        !           948:        | /* empty */ %prec EMPTY
        !           949:                 { $$ = instantiate_class_template ($<ttype>0, 1); }
        !           950:        ;
        !           951: 
        !           952: tmpl.2:
        !           953:        /* Always do expansion if it hasn't been done already. */
        !           954:                { $$ = instantiate_class_template ($<ttype>0, 1); }
        !           955:        ;
        !           956: 
        !           957: template_arg_list:
        !           958:          template_arg
        !           959:                { $$ = build_tree_list (NULL_TREE, $$); }
        !           960:        | template_arg_list ',' template_arg
        !           961:                { $$ = chainon ($$, build_tree_list (NULL_TREE, $3)); }
        !           962:        ;
        !           963: 
        !           964: template_arg:
        !           965:          typename
        !           966:                { $$ = groktypename ($$); }
        !           967:        | expr_no_commas  %prec UNARY
        !           968:        ;
        !           969: 
        !           970: template_instantiate_once:
        !           971:          PRE_PARSED_CLASS_DECL maybe_base_class_list
        !           972:                {
        !           973:                  tree t, decl, id, tmpl;
        !           974: 
        !           975:                  id = TREE_VALUE ($1);
        !           976:                  tmpl = TREE_PURPOSE (IDENTIFIER_TEMPLATE (id));
        !           977:                  t = xref_tag (DECL_TEMPLATE_INFO (tmpl)->aggr, id, $2);
        !           978:                  set_current_level_tags_transparency (1);
        !           979:                  my_friendly_assert (TREE_CODE (t) == RECORD_TYPE
        !           980:                                      || TREE_CODE (t) == UNION_TYPE, 257);
        !           981:                  $<ttype>$ = t;
        !           982: 
        !           983:                  /* Now, put a copy of the decl in global scope, to avoid
        !           984:                     recursive expansion.  */
        !           985:                  decl = IDENTIFIER_LOCAL_VALUE (id);
        !           986:                  if (!decl)
        !           987:                    decl = IDENTIFIER_CLASS_VALUE (id);
        !           988:                  /* Now, put a copy of the decl in global scope, to avoid
        !           989:                     recursive expansion.  */
        !           990:                   if (decl)
        !           991:                     {
        !           992:                      /* Need to copy it to clear the chain pointer,
        !           993:                         and need to get it into permanent storage.  */
        !           994:                       my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 258);
        !           995:                      push_obstacks (&permanent_obstack, &permanent_obstack);
        !           996:                       decl = copy_node (decl);
        !           997:                      if (DECL_LANG_SPECIFIC (decl))
        !           998:                        copy_lang_decl (decl);
        !           999:                      pop_obstacks ();
        !          1000:                      pushdecl_top_level (decl);
        !          1001:                    }
        !          1002:                }
        !          1003:          left_curly opt.component_decl_list '}'
        !          1004:                {
        !          1005:                  $$ = finish_struct ($<ttype>3, $5, 0);
        !          1006: 
        !          1007:                  pop_obstacks ();
        !          1008:                  end_template_instantiation ($1, $<ttype>3);
        !          1009: 
        !          1010:                   /* Now go after the methods & class data.  */
        !          1011:                   instantiate_member_templates ($1);
        !          1012: 
        !          1013:                  pop_tinst_level();
        !          1014: 
        !          1015:                  CLASSTYPE_GOT_SEMICOLON ($$) = 1;
        !          1016:                }
        !          1017:        ;
        !          1018: 
        !          1019: template_instantiation:
        !          1020:           /* empty */
        !          1021:                 { $$ = NULL_TREE; }
        !          1022:         | template_instantiate_once
        !          1023:                 { $$ = $1; }
        !          1024:         ;
        !          1025: 
        !          1026: template_instantiate_some:
        !          1027:           /* empty */
        !          1028:                 { $$ = NULL_TREE; /* never used from here... */}
        !          1029:         | template_instantiate_once template_instantiate_some
        !          1030:                 { $$ = $1; /*???*/ }
        !          1031:         ;
        !          1032: 
        !          1033: unop:     '-'
        !          1034:                { $$ = NEGATE_EXPR; }
        !          1035:        | '+'
        !          1036:                { $$ = CONVERT_EXPR; }
        !          1037:        | PLUSPLUS
        !          1038:                { $$ = PREINCREMENT_EXPR; }
        !          1039:        | MINUSMINUS
        !          1040:                { $$ = PREDECREMENT_EXPR; }
        !          1041:        | '!'
        !          1042:                { $$ = TRUTH_NOT_EXPR; }
        !          1043:        ;
        !          1044: 
        !          1045: expr:    nonnull_exprlist
        !          1046:                { $$ = build_x_compound_expr ($$); }
        !          1047:        /* Ugly, but faster.  */
        !          1048:        | expr_no_commas
        !          1049:        ;
        !          1050: 
        !          1051: paren_expr_or_null:
        !          1052:        LEFT_RIGHT
        !          1053:                { error ("ANSI C++ forbids an empty condition for `%s'",
        !          1054:                         cond_stmt_keyword);
        !          1055:                  $$ = integer_zero_node; }
        !          1056:        | '(' expr ')'
        !          1057:                { $$ = $2; }
        !          1058:        ;
        !          1059: 
        !          1060: paren_cond_or_null:
        !          1061:        LEFT_RIGHT
        !          1062:                { error ("ANSI C++ forbids an empty condition for `%s'",
        !          1063:                         cond_stmt_keyword);
        !          1064:                  $$ = integer_zero_node; }
        !          1065:        | '(' condition ')'
        !          1066:                { $$ = $2; }
        !          1067:        ;
        !          1068: 
        !          1069: xcond:
        !          1070:        /* empty */
        !          1071:                { $$ = NULL_TREE; }
        !          1072:        | condition
        !          1073:        | error
        !          1074:                { $$ = NULL_TREE; }
        !          1075:        ;
        !          1076: 
        !          1077: condition:
        !          1078:        typed_typespecs declarator maybe_raises maybeasm maybe_attribute '='
        !          1079:                { {
        !          1080:                  tree d;
        !          1081:                  for (d = getdecls (); d; d = TREE_CHAIN (d))
        !          1082:                    if (TREE_CODE (d) == TYPE_DECL) {
        !          1083:                      tree s = TREE_TYPE (d);
        !          1084:                      if (TREE_CODE (s) == RECORD_TYPE)
        !          1085:                        cp_error ("definition of class `%T' in condition", s);
        !          1086:                      else if (TREE_CODE (s) == ENUMERAL_TYPE)
        !          1087:                        cp_error ("definition of enum `%T' in condition", s);
        !          1088:                    }
        !          1089:                  }
        !          1090:                  current_declspecs = $1;
        !          1091:                  $<itype>6 = suspend_momentary ();
        !          1092:                  $<ttype>$ = start_decl ($<ttype>2, current_declspecs, 1, $3);
        !          1093:                  cplus_decl_attributes ($<ttype>$, $5);
        !          1094:                }
        !          1095:        init
        !          1096:                { 
        !          1097:                  finish_decl ($<ttype>7, $8, $5, 0);
        !          1098:                  resume_momentary ($<itype>6);
        !          1099:                  $$ = $<ttype>7; 
        !          1100:                  if (TREE_CODE (TREE_TYPE ($$)) == ARRAY_TYPE)
        !          1101:                    cp_error ("definition of array `%#D' in condition", $$); 
        !          1102:                }
        !          1103:        | expr
        !          1104:        ;
        !          1105: 
        !          1106: /* Used for the blocks controlled by a condition, to add any DECLs in
        !          1107:    the condition to the controlled block.  */
        !          1108: .kindof_pushlevel: /* empty */
        !          1109:                { tree d = getdecls ();
        !          1110:                  emit_line_note (input_filename, lineno);
        !          1111:                  pushlevel (0);
        !          1112:                  clear_last_expr ();
        !          1113:                  push_momentary ();
        !          1114:                  expand_start_bindings (0);
        !          1115:                  if (d) pushdecl (d);
        !          1116:                }    
        !          1117:        ;
        !          1118: 
        !          1119: /* Like implicitly_scoped_stmt, but uses .kindof_pushlevel */
        !          1120: partially_scoped_stmt:
        !          1121:            '{' .kindof_pushlevel '}'
        !          1122:                { pop_implicit_try_blocks (NULL_TREE);
        !          1123:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
        !          1124:                  $$ = poplevel (kept_level_p (), 1, 0);
        !          1125:                  pop_momentary (); 
        !          1126:                  finish_stmt (); }
        !          1127:        | '{' .kindof_pushlevel maybe_label_decls stmts '}'
        !          1128:                { pop_implicit_try_blocks (NULL_TREE);
        !          1129:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
        !          1130:                  $$ = poplevel (kept_level_p (), 1, 0);
        !          1131:                  pop_momentary (); 
        !          1132:                  finish_stmt (); }
        !          1133:        | '{' .kindof_pushlevel maybe_label_decls error '}'
        !          1134:                { pop_implicit_try_blocks (NULL_TREE);
        !          1135:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
        !          1136:                  $$ = poplevel (kept_level_p (), 0, 0);
        !          1137:                  pop_momentary (); 
        !          1138:                  finish_stmt (); }
        !          1139:        | .kindof_pushlevel simple_stmt
        !          1140:                { pop_implicit_try_blocks (NULL_TREE);
        !          1141:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
        !          1142:                  $$ = poplevel (kept_level_p (), 1, 0);
        !          1143:                  pop_momentary (); }
        !          1144:        ;
        !          1145: 
        !          1146: already_scoped_stmt:
        !          1147:           '{' '}'
        !          1148:                { finish_stmt (); }
        !          1149:        | '{' maybe_label_decls stmts '}'
        !          1150:                { finish_stmt (); }
        !          1151:        | '{' maybe_label_decls error '}'
        !          1152:                { finish_stmt (); }
        !          1153:        | simple_stmt
        !          1154:        ;
        !          1155: 
        !          1156: nonnull_exprlist:
        !          1157:          expr_no_commas
        !          1158:                { $$ = build_tree_list (NULL_TREE, $$); }
        !          1159:        | nonnull_exprlist ',' expr_no_commas
        !          1160:                { chainon ($$, build_tree_list (NULL_TREE, $3)); }
        !          1161:        | nonnull_exprlist ',' error
        !          1162:                { chainon ($$, build_tree_list (NULL_TREE, error_mark_node)); }
        !          1163:        ;
        !          1164: 
        !          1165: unary_expr:
        !          1166:          primary %prec UNARY
        !          1167:                {
        !          1168:                  if (TREE_CODE ($$) == TYPE_EXPR)
        !          1169:                    $$ = build_component_type_expr (C_C_D, $$, NULL_TREE, 1);
        !          1170:                }
        !          1171:        /* __extension__ turns off -pedantic for following primary.  */
        !          1172:        | EXTENSION
        !          1173:                { $<itype>1 = pedantic;
        !          1174:                  pedantic = 0; }
        !          1175:          cast_expr       %prec UNARY
        !          1176:                { $$ = $3;
        !          1177:                  pedantic = $<itype>1; }
        !          1178:        | '*' cast_expr   %prec UNARY
        !          1179:                { $$ = build_x_indirect_ref ($2, "unary *"); }
        !          1180:        | '&' cast_expr   %prec UNARY
        !          1181:                { $$ = build_x_unary_op (ADDR_EXPR, $2); }
        !          1182:        | '~' cast_expr   %prec UNARY
        !          1183:                { $$ = build_x_unary_op (BIT_NOT_EXPR, $2); }
        !          1184:        | unop cast_expr  %prec UNARY
        !          1185:                { $$ = build_x_unary_op ((enum tree_code) $$, $2);
        !          1186:                  if ($1 == NEGATE_EXPR && TREE_CODE ($2) == INTEGER_CST)
        !          1187:                    TREE_NEGATED_INT ($$) = 1;
        !          1188:                  overflow_warning ($$);
        !          1189:                }
        !          1190:        /* Refer to the address of a label as a pointer.  */
        !          1191:        | ANDAND identifier
        !          1192:                { tree label = lookup_label ($2);
        !          1193:                  if (label == NULL_TREE)
        !          1194:                    $$ = null_pointer_node;
        !          1195:                  else
        !          1196:                    {
        !          1197:                      TREE_USED (label) = 1;
        !          1198:                      $$ = build1 (ADDR_EXPR, ptr_type_node, label);
        !          1199:                      TREE_CONSTANT ($$) = 1;
        !          1200:                    }
        !          1201:                }
        !          1202:        | SIZEOF unary_expr  %prec UNARY
        !          1203:                { if (TREE_CODE ($2) == COMPONENT_REF
        !          1204:                      && DECL_BIT_FIELD (TREE_OPERAND ($2, 1)))
        !          1205:                    error ("sizeof applied to a bit-field");
        !          1206:                  /* ANSI says arrays and functions are converted inside comma.
        !          1207:                     But we can't really convert them in build_compound_expr
        !          1208:                     because that would break commas in lvalues.
        !          1209:                     So do the conversion here if operand was a comma.  */
        !          1210:                  if (TREE_CODE ($2) == COMPOUND_EXPR
        !          1211:                      && (TREE_CODE (TREE_TYPE ($2)) == ARRAY_TYPE
        !          1212:                          || TREE_CODE (TREE_TYPE ($2)) == FUNCTION_TYPE))
        !          1213:                    $2 = default_conversion ($2);
        !          1214:                  else if (TREE_CODE ($2) == TREE_LIST)
        !          1215:                    {
        !          1216:                      tree t = TREE_VALUE ($2);
        !          1217:                      if (t != NULL_TREE
        !          1218:                          && TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
        !          1219:                        pedwarn ("ANSI C++ forbids using sizeof() on a function");
        !          1220:                    }
        !          1221:                  $$ = c_sizeof (TREE_TYPE ($2)); }
        !          1222:        | SIZEOF '(' typename ')'  %prec HYPERUNARY
        !          1223:                { $$ = c_sizeof (groktypename ($3)); }
        !          1224:        | ALIGNOF unary_expr  %prec UNARY
        !          1225:                { $$ = grok_alignof ($2); }
        !          1226:        | ALIGNOF '(' typename ')'  %prec HYPERUNARY
        !          1227:                { $$ = c_alignof (groktypename ($3)); }
        !          1228: 
        !          1229:        | .scope new typename %prec '='
        !          1230:                { $$ = build_new ($2, $3, NULL_TREE, $$ != NULL_TREE); }
        !          1231:        | .scope new '(' nonnull_exprlist ')' typename %prec '='
        !          1232:                { $$ = build_new ($4, $6, NULL_TREE, $$ != NULL_TREE); }
        !          1233:        | .scope new typespec '(' nonnull_exprlist ')'
        !          1234:                { $$ = build_new ($2, $3, $5, $$ != NULL_TREE); }
        !          1235:        | .scope new typespec '(' typespec ')'
        !          1236:                { cp_error ("`%T' is not a valid expression", $5);
        !          1237:                  $$ = error_mark_node; }
        !          1238:        | .scope new '(' nonnull_exprlist ')' typespec '(' nonnull_exprlist ')'
        !          1239:                { $$ = build_new ($4, $6, $8, $$ != NULL_TREE); }
        !          1240:        | .scope new typespec LEFT_RIGHT
        !          1241:                { $$ = build_new ($2, $3, NULL_TREE, $$ != NULL_TREE); }
        !          1242:        | .scope new '(' nonnull_exprlist ')' typespec LEFT_RIGHT
        !          1243:                { $$ = build_new ($4, $6, NULL_TREE, $$ != NULL_TREE); }
        !          1244:        | .scope new typename '=' init %prec '='
        !          1245:                { $$ = build_new ($2, $3, $5, $$ != NULL_TREE); }
        !          1246:        | .scope new '(' nonnull_exprlist ')' typename '=' init %prec '='
        !          1247:                { $$ = build_new ($4, $6, $8, $$ != NULL_TREE); }
        !          1248: 
        !          1249:        /* I am not going to add placement syntax to the below complex rules
        !          1250:           because Ken says the syntax is illegal. (mrs) */
        !          1251:        /* I'm not sure why this is disallowed.  But since it is, and it
        !          1252:           doesn't seem difficult to catch it, let's give a message, so
        !          1253:           the programmer can fix it.  --Ken Raeburn  */
        !          1254:        | .scope new '(' typed_typespecs absdcl ')' '[' nonmomentary_expr ']'
        !          1255:                {
        !          1256:                  tree absdcl, typename;
        !          1257: 
        !          1258:                illegal_new_array:
        !          1259:                  absdcl = build_parse_node (ARRAY_REF, $5, $8);
        !          1260:                  typename = build_decl_list ($4, absdcl);
        !          1261:                  pedwarn ("ANSI C++ forbids array dimensions with parenthesized type");
        !          1262:                  $$ = build_new ($2, typename, NULL_TREE, $$ != NULL_TREE);
        !          1263:                }
        !          1264:        | .scope new '(' nonempty_type_quals absdcl ')' '[' nonmomentary_expr ']'
        !          1265:                { goto illegal_new_array; }
        !          1266: 
        !          1267:        | .scope new '(' typed_typespecs absdcl ')'
        !          1268:                { $$ = build_new ($2, build_decl_list ($4, $5), NULL_TREE, $$ != NULL_TREE); }
        !          1269:        | .scope new '(' nonnull_exprlist ')' '(' typed_typespecs absdcl ')'
        !          1270:                { $$ = build_new ($4, build_decl_list ($7, $8), NULL_TREE, $$ != NULL_TREE); }
        !          1271:        | .scope new '(' nonempty_type_quals absdcl ')'
        !          1272:                { $$ = build_new ($2, build_decl_list ($4, $5), NULL_TREE, $$ != NULL_TREE); }
        !          1273:        | .scope new '(' nonnull_exprlist ')' '(' nonempty_type_quals absdcl ')'
        !          1274:                { $$ = build_new ($4, build_decl_list ($7, $8), NULL_TREE, $$ != NULL_TREE); }
        !          1275:        /* Unswallow a ':' which is probably meant for ?: expression.  */
        !          1276:        | .scope new TYPENAME_COLON
        !          1277:                { yyungetc (':', 1); $$ = build_new ($2, $3, NULL_TREE, $$ != NULL_TREE); }
        !          1278:        | .scope new '(' nonnull_exprlist ')' TYPENAME_COLON
        !          1279:                { yyungetc (':', 1); $$ = build_new ($4, $6, NULL_TREE, $$ != NULL_TREE); }
        !          1280: 
        !          1281:        | delete cast_expr  %prec UNARY
        !          1282:                { $$ = delete_sanity ($2, NULL_TREE, 0); }
        !          1283:        | delete '[' ']' cast_expr  %prec UNARY
        !          1284:                { $$ = delete_sanity ($4, NULL_TREE, 1);
        !          1285:                  if (yychar == YYEMPTY)
        !          1286:                    yychar = YYLEX; }
        !          1287: %ifcplus
        !          1288:        | delete '[' expr ']' cast_expr %prec UNARY
        !          1289:                { $$ = delete_sanity ($5, $3, 2);
        !          1290:                  if (yychar == YYEMPTY)
        !          1291:                    yychar = YYLEX; }
        !          1292: %endifcplus
        !          1293: %ifobjc
        !          1294:        | delete objc_openbracket.expr objc_closebracket cast_expr %prec UNARY
        !          1295:                { $$ = delete_sanity ($4, $2, 2);
        !          1296:                  if (yychar == YYEMPTY)
        !          1297:                    yychar = YYLEX; }
        !          1298: %endifobjc
        !          1299:        ;
        !          1300: 
        !          1301: cast_expr:
        !          1302:          unary_expr
        !          1303:        | '(' typename ')' expr_no_commas  %prec UNARY
        !          1304:                { tree type = groktypename ($2);
        !          1305:                  $$ = build_c_cast (type, $4); }
        !          1306:        | '(' typename ')' '{' initlist maybecomma '}'  %prec UNARY
        !          1307:                { tree type = groktypename ($2);
        !          1308:                  tree init = build_nt (CONSTRUCTOR, NULL_TREE, nreverse ($5));
        !          1309:                  if (pedantic)
        !          1310:                    pedwarn ("ANSI C++ forbids constructor-expressions");
        !          1311:                  /* Indicate that this was a GNU C constructor expression.  */
        !          1312:                  TREE_HAS_CONSTRUCTOR (init) = 1;
        !          1313:                  $$ = digest_init (type, init, (tree *) 0);
        !          1314:                  if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0)
        !          1315:                    {
        !          1316:                      int failure = complete_array_type (type, $$, 1);
        !          1317:                      if (failure)
        !          1318:                        my_friendly_abort (78);
        !          1319:                    }
        !          1320:                }
        !          1321:        | HEADOF '(' expr ')'
        !          1322:                { $$ = build_headof ($3); }
        !          1323:        | CLASSOF '(' expr ')'
        !          1324:                { $$ = build_classof ($3); }
        !          1325:        | CLASSOF '(' TYPENAME ')'
        !          1326:                { if (is_aggr_typedef ($3, 1))
        !          1327:                    {
        !          1328:                      tree type = IDENTIFIER_TYPE_VALUE ($3);
        !          1329:                      $$ = CLASSTYPE_DOSSIER (type);
        !          1330:                    }
        !          1331:                  else
        !          1332:                    $$ = error_mark_node;
        !          1333:                }
        !          1334:        ;
        !          1335: 
        !          1336: expr_no_commas:
        !          1337:          cast_expr
        !          1338:        | expr_no_commas '+' expr_no_commas
        !          1339:                { $$ = build_x_binary_op ($2, $$, $3); }
        !          1340:        | expr_no_commas '-' expr_no_commas
        !          1341:                { $$ = build_x_binary_op ($2, $$, $3); }
        !          1342:        | expr_no_commas '*' expr_no_commas
        !          1343:                { $$ = build_x_binary_op ($2, $$, $3); }
        !          1344:        | expr_no_commas '/' expr_no_commas
        !          1345:                { $$ = build_x_binary_op ($2, $$, $3); }
        !          1346:        | expr_no_commas '%' expr_no_commas
        !          1347:                { $$ = build_x_binary_op ($2, $$, $3); }
        !          1348:        | expr_no_commas LSHIFT expr_no_commas
        !          1349:                { $$ = build_x_binary_op ($2, $$, $3); }
        !          1350:        | expr_no_commas RSHIFT expr_no_commas
        !          1351:                { $$ = build_x_binary_op ($2, $$, $3); }
        !          1352:        | expr_no_commas ARITHCOMPARE expr_no_commas
        !          1353:                { $$ = build_x_binary_op ($2, $$, $3); }
        !          1354:        | expr_no_commas '<' expr_no_commas
        !          1355:                { $$ = build_x_binary_op (LT_EXPR, $$, $3); }
        !          1356:        | expr_no_commas '>' expr_no_commas
        !          1357:                { $$ = build_x_binary_op (GT_EXPR, $$, $3); }
        !          1358:        | expr_no_commas EQCOMPARE expr_no_commas
        !          1359:                { $$ = build_x_binary_op ($2, $$, $3); }
        !          1360:        | expr_no_commas MIN_MAX expr_no_commas
        !          1361:                { $$ = build_x_binary_op ($2, $$, $3); }
        !          1362:        | expr_no_commas '&' expr_no_commas
        !          1363:                { $$ = build_x_binary_op ($2, $$, $3); }
        !          1364:        | expr_no_commas '|' expr_no_commas
        !          1365:                { $$ = build_x_binary_op ($2, $$, $3); }
        !          1366:        | expr_no_commas '^' expr_no_commas
        !          1367:                { $$ = build_x_binary_op ($2, $$, $3); }
        !          1368:        | expr_no_commas ANDAND expr_no_commas
        !          1369:                { $$ = build_x_binary_op (TRUTH_ANDIF_EXPR, $$, $3); }
        !          1370:        | expr_no_commas OROR expr_no_commas
        !          1371:                { $$ = build_x_binary_op (TRUTH_ORIF_EXPR, $$, $3); }
        !          1372:        | expr_no_commas '?' xexpr ':' expr_no_commas
        !          1373:                { $$ = build_x_conditional_expr ($$, $3, $5); }
        !          1374:        | expr_no_commas '=' expr_no_commas
        !          1375:                { $$ = build_modify_expr ($$, NOP_EXPR, $3); }
        !          1376:        | expr_no_commas ASSIGN expr_no_commas
        !          1377:                { register tree rval;
        !          1378:                  if (rval = build_opfncall (MODIFY_EXPR, LOOKUP_NORMAL, $$, $3,
        !          1379:                                             make_node ($2)))
        !          1380:                    $$ = rval;
        !          1381:                  else
        !          1382:                    $$ = build_modify_expr ($$, $2, $3); }
        !          1383:        | primary DOT_STAR expr_no_commas %prec UNARY
        !          1384:                { $$ = build_m_component_ref ($$, $3); }
        !          1385:        /* Handle general members.  */
        !          1386:        | object_star expr_no_commas   %prec UNARY
        !          1387:                { $$ = build_x_binary_op (MEMBER_REF, $$, $2); }
        !          1388: /* These extensions are not defined.  The second arg to build_m_component_ref
        !          1389:    is old, build_m_component_ref now does an implicit
        !          1390:    build_indirect_ref (x, NULL_PTR) on the second argument.
        !          1391:        | object '&' expr_no_commas   %prec UNARY
        !          1392:                { $$ = build_m_component_ref ($$, build_x_unary_op (ADDR_EXPR, $3)); }
        !          1393:        | object unop expr_no_commas  %prec UNARY
        !          1394:                { $$ = build_m_component_ref ($$, build_x_unary_op ($2, $3)); }
        !          1395:        | object '(' typename ')' expr_no_commas  %prec UNARY
        !          1396:                { tree type = groktypename ($3);
        !          1397:                  $$ = build_m_component_ref ($$, build_c_cast (type, $5)); }
        !          1398:        | object primary_no_id  %prec UNARY
        !          1399:                { $$ = build_m_component_ref ($$, $2); }
        !          1400: */
        !          1401:        ;
        !          1402: 
        !          1403: primary:
        !          1404:        IDENTIFIER
        !          1405:                { $$ = do_identifier ($$); }
        !          1406:        | operator_name
        !          1407:                {
        !          1408:                  tree op = $$;
        !          1409:                  if (TREE_CODE (op) != IDENTIFIER_NODE)
        !          1410:                    $$ = op;
        !          1411:                  else
        !          1412:                    {
        !          1413:                      $$ = lookup_name (op, 0);
        !          1414:                      if ($$ == NULL_TREE)
        !          1415:                        {
        !          1416:                          if (op != ansi_opname[ERROR_MARK])
        !          1417:                            error ("operator %s not defined",
        !          1418:                                   operator_name_string (op));
        !          1419:                          $$ = error_mark_node;
        !          1420:                        }
        !          1421:                    }
        !          1422:                }
        !          1423:        | CONSTANT
        !          1424:        | string
        !          1425:                { $$ = combine_strings ($$); }
        !          1426:        | '(' expr ')'
        !          1427:                { $$ = $2; }
        !          1428:        | '(' error ')'
        !          1429:                { $$ = error_mark_node; }
        !          1430:        | '('
        !          1431:                { if (current_function_decl == 0)
        !          1432:                    {
        !          1433:                      error ("braced-group within expression allowed only inside a function");
        !          1434:                      YYERROR;
        !          1435:                    }
        !          1436:                  keep_next_level ();
        !          1437:                  $<ttype>$ = expand_start_stmt_expr (); }
        !          1438:          compstmt ')'
        !          1439:                { tree rtl_exp;
        !          1440:                  if (pedantic)
        !          1441:                    pedwarn ("ANSI C++ forbids braced-groups within expressions");
        !          1442:                  rtl_exp = expand_end_stmt_expr ($<ttype>2);
        !          1443:                  /* The statements have side effects, so the group does.  */
        !          1444:                  TREE_SIDE_EFFECTS (rtl_exp) = 1;
        !          1445:                  /* Make a BIND_EXPR for the BLOCK already made.  */
        !          1446:                  $$ = build (BIND_EXPR, TREE_TYPE (rtl_exp),
        !          1447:                              NULL_TREE, rtl_exp, $3);
        !          1448:                  /* Remove the block from the tree at this point.
        !          1449:                     It gets put back at the proper place
        !          1450:                     when the BIND_EXPR is expanded.  */
        !          1451:                  delete_block ($3);
        !          1452:                }
        !          1453:        | primary '(' nonnull_exprlist ')'
        !          1454:                 { /* [eichin:19911016.1902EST] */
        !          1455:                   $<ttype>$ = build_x_function_call ($1, $3, current_class_decl); 
        !          1456:                   /* here we instantiate_class_template as needed... */
        !          1457:                   do_pending_templates ();
        !          1458:                 } template_instantiate_some {
        !          1459:                   if (TREE_CODE ($<ttype>5) == CALL_EXPR
        !          1460:                       && TREE_TYPE ($<ttype>5) != void_type_node)
        !          1461:                    $$ = require_complete_type ($<ttype>5);
        !          1462:                   else
        !          1463:                     $$ = $<ttype>5;
        !          1464:                 }
        !          1465:        | primary LEFT_RIGHT
        !          1466:                 {
        !          1467:                  $$ = build_x_function_call ($$, NULL_TREE, current_class_decl);
        !          1468:                  if (TREE_CODE ($$) == CALL_EXPR
        !          1469:                      && TREE_TYPE ($$) != void_type_node)
        !          1470:                    $$ = require_complete_type ($$);
        !          1471:                 }
        !          1472:        | primary '[' expr ']'
        !          1473:                { do_array:
        !          1474:                    $$ = grok_array_decl ($$, $3); }
        !          1475:        | object identifier_or_opname  %prec UNARY
        !          1476:                { $$ = build_component_ref ($$, $2, NULL_TREE, 1); }
        !          1477:        | object id_scope identifier_or_opname %prec UNARY
        !          1478:                { $$ = build_object_ref ($$, $2, $3); }
        !          1479:        | primary PLUSPLUS
        !          1480:                { /* If we get an OFFSET_REF, turn it into what it really
        !          1481:                     means (e.g., a COMPONENT_REF).  This way if we've got,
        !          1482:                     say, a reference to a static member that's being operated
        !          1483:                     on, we don't end up trying to find a member operator for
        !          1484:                     the class it's in.  */
        !          1485:                  if (TREE_CODE ($$) == OFFSET_REF)
        !          1486:                    $$ = resolve_offset_ref ($$);
        !          1487:                  $$ = build_x_unary_op (POSTINCREMENT_EXPR, $$); }
        !          1488:        | primary MINUSMINUS
        !          1489:                { if (TREE_CODE ($$) == OFFSET_REF)
        !          1490:                    $$ = resolve_offset_ref ($$);
        !          1491:                  $$ = build_x_unary_op (POSTDECREMENT_EXPR, $$); }
        !          1492:        /* C++ extensions */
        !          1493:        | THIS
        !          1494:                { if (current_class_decl)
        !          1495:                    {
        !          1496: #ifdef WARNING_ABOUT_CCD
        !          1497:                      TREE_USED (current_class_decl) = 1;
        !          1498: #endif
        !          1499:                      $$ = current_class_decl;
        !          1500:                    }
        !          1501:                  else if (current_function_decl
        !          1502:                           && DECL_STATIC_FUNCTION_P (current_function_decl))
        !          1503:                    {
        !          1504:                      error ("`this' is unavailable for static member functions");
        !          1505:                      $$ = error_mark_node;
        !          1506:                    }
        !          1507:                  else
        !          1508:                    {
        !          1509:                      if (current_function_decl)
        !          1510:                        error ("invalid use of `this' in non-member function");
        !          1511:                      else
        !          1512:                        error ("invalid use of `this' at top level");
        !          1513:                      $$ = error_mark_node;
        !          1514:                    }
        !          1515:                }
        !          1516:        | TYPE_QUAL '(' nonnull_exprlist ')'
        !          1517:                {
        !          1518:                  tree type;
        !          1519:                  tree id = $$;
        !          1520: 
        !          1521:                  /* This is a C cast in C++'s `functional' notation.  */
        !          1522:                  if ($3 == error_mark_node)
        !          1523:                    {
        !          1524:                      $$ = error_mark_node;
        !          1525:                      break;
        !          1526:                    }
        !          1527: #if 0
        !          1528:                  if ($3 == NULL_TREE)
        !          1529:                    {
        !          1530:                      error ("cannot cast null list to type `%s'",
        !          1531:                             IDENTIFIER_POINTER (TYPE_NAME (id)));
        !          1532:                      $$ = error_mark_node;
        !          1533:                      break;
        !          1534:                    }
        !          1535: #endif
        !          1536: #if 0
        !          1537:                  /* type is not set! (mrs) */
        !          1538:                  if (type == error_mark_node)
        !          1539:                    $$ = error_mark_node;
        !          1540:                  else
        !          1541: #endif
        !          1542:                    {
        !          1543:                      if (id == ridpointers[(int) RID_CONST])
        !          1544:                        type = build_type_variant (integer_type_node, 1, 0);
        !          1545:                      else if (id == ridpointers[(int) RID_VOLATILE])
        !          1546:                        type = build_type_variant (integer_type_node, 0, 1);
        !          1547: #if 0
        !          1548:                      /* should not be able to get here (mrs) */
        !          1549:                      else if (id == ridpointers[(int) RID_FRIEND])
        !          1550:                        {
        !          1551:                          error ("cannot cast expression to `friend' type");
        !          1552:                          $$ = error_mark_node;
        !          1553:                          break;
        !          1554:                        }
        !          1555: #endif
        !          1556:                      else my_friendly_abort (79);
        !          1557:                      $$ = build_c_cast (type, build_compound_expr ($3));
        !          1558:                    }
        !          1559:                }
        !          1560:        | typespec '(' nonnull_exprlist ')'
        !          1561:                { $$ = build_functional_cast ($$, $3); }
        !          1562:        | typespec LEFT_RIGHT
        !          1563:                { $$ = build_functional_cast ($$, NULL_TREE); }
        !          1564:        /* Stroustrup RTTI */
        !          1565:        | DYNAMIC_CAST '<' typename '>' '(' expr ')'
        !          1566:                { tree type = groktypename ($3);
        !          1567:                  $$ = build_dynamic_cast (type, $6); }
        !          1568:        | TYPEID '(' expr ')'
        !          1569:                { $$ = build_typeid ($3); }
        !          1570:        | TYPEID '(' typename ')'
        !          1571:                { tree type = groktypename ($3);
        !          1572:                  $$ = get_typeid (type); }
        !          1573:        | SCOPE typespec '(' nonnull_exprlist ')'
        !          1574:                { $$ = build_functional_cast ($2, $4); }
        !          1575:        | SCOPE typespec LEFT_RIGHT
        !          1576:                { $$ = build_functional_cast ($2, NULL_TREE); }
        !          1577:        | SCOPE IDENTIFIER
        !          1578:                {
        !          1579:                do_scoped_id:
        !          1580:                  $$ = IDENTIFIER_GLOBAL_VALUE ($2);
        !          1581:                  if (yychar == YYEMPTY)
        !          1582:                    yychar = YYLEX;
        !          1583:                  if (! $$)
        !          1584:                    {
        !          1585:                      if (yychar == '(' || yychar == LEFT_RIGHT)
        !          1586:                        $$ = implicitly_declare ($2);
        !          1587:                      else
        !          1588:                        {
        !          1589:                          if (IDENTIFIER_GLOBAL_VALUE ($2) != error_mark_node)
        !          1590:                            error ("undeclared variable `%s' (first use here)",
        !          1591:                                   IDENTIFIER_POINTER ($2));
        !          1592:                          $$ = error_mark_node;
        !          1593:                          /* Prevent repeated error messages.  */
        !          1594:                          IDENTIFIER_GLOBAL_VALUE ($2) = error_mark_node;
        !          1595:                        }
        !          1596:                    }
        !          1597:                  else
        !          1598:                    {
        !          1599:                      if (TREE_CODE ($$) == ADDR_EXPR)
        !          1600:                        assemble_external (TREE_OPERAND ($$, 0));
        !          1601:                      else
        !          1602:                        assemble_external ($$);
        !          1603:                      TREE_USED ($$) = 1;
        !          1604:                    }
        !          1605:                  if (TREE_CODE ($$) == CONST_DECL)
        !          1606:                    {
        !          1607:                      /* XXX CHS - should we set TREE_USED of the constant? */
        !          1608:                      $$ = DECL_INITIAL ($$);
        !          1609:                      /* This is to prevent an enum whose value is 0
        !          1610:                         from being considered a null pointer constant.  */
        !          1611:                      $$ = build1 (NOP_EXPR, TREE_TYPE ($$), $$);
        !          1612:                      TREE_CONSTANT ($$) = 1;
        !          1613:                    }
        !          1614: 
        !          1615:                }
        !          1616:        /* p->int::~int() is valid -- 12.4 */
        !          1617:        | object '~' TYPESPEC LEFT_RIGHT
        !          1618:                { 
        !          1619:                  if (TREE_CODE (TREE_TYPE ($1)) 
        !          1620:                      != TREE_CODE (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE ($3))))
        !          1621:                    cp_error ("`%E' is not of type `%T'", $1, $3);
        !          1622:                  $$ = void_zero_node;
        !          1623:                }
        !          1624:        | object TYPESPEC SCOPE '~' TYPESPEC LEFT_RIGHT
        !          1625:                { 
        !          1626:                  if ($2 != $5)
        !          1627:                    cp_error ("destructor specifier `%T::~%T()' must have matching names", $2, $5);
        !          1628:                  if (TREE_CODE (TREE_TYPE ($1))
        !          1629:                      != TREE_CODE (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE ($2))))
        !          1630:                    cp_error ("`%E' is not of type `%T'", $1, $2);
        !          1631:                  $$ = void_zero_node; 
        !          1632:                }
        !          1633:        | SCOPE operator_name
        !          1634:                {
        !          1635:                  if (TREE_CODE ($2) == IDENTIFIER_NODE)
        !          1636:                    goto do_scoped_id;
        !          1637:                do_scoped_operator:
        !          1638:                  $$ = $2;
        !          1639:                }
        !          1640:        | id_scope identifier_or_opname  %prec HYPERUNARY
        !          1641:                { $$ = build_offset_ref ($$, $2); }
        !          1642:        | id_scope identifier_or_opname '(' nonnull_exprlist ')'
        !          1643:                { $$ = build_member_call ($$, $2, $4); }
        !          1644:        | id_scope identifier_or_opname LEFT_RIGHT
        !          1645:                { $$ = build_member_call ($$, $2, NULL_TREE); }
        !          1646:        | object identifier_or_opname '(' nonnull_exprlist ')'
        !          1647:                {
        !          1648: #if 0
        !          1649:                  /* This is a future direction of this code, but because
        !          1650:                     build_x_function_call cannot always undo what is done
        !          1651:                     in build_component_ref entirely yet, we cannot do this. */
        !          1652:                  $$ = build_x_function_call (build_component_ref ($$, $2, NULL_TREE, 1), $4, $$);
        !          1653:                  if (TREE_CODE ($$) == CALL_EXPR
        !          1654:                      && TREE_TYPE ($$) != void_type_node)
        !          1655:                    $$ = require_complete_type ($$);
        !          1656: #else
        !          1657:                  $$ = build_method_call ($$, $2, $4, NULL_TREE,
        !          1658:                                          (LOOKUP_NORMAL|LOOKUP_AGGR));
        !          1659: #endif
        !          1660:                }
        !          1661:        | object identifier_or_opname LEFT_RIGHT
        !          1662:                {
        !          1663: #if 0
        !          1664:                  /* This is a future direction of this code, but because
        !          1665:                     build_x_function_call cannot always undo what is done
        !          1666:                     in build_component_ref entirely yet, we cannot do this. */
        !          1667:                  $$ = build_x_function_call (build_component_ref ($$, $2, NULL_TREE, 1), NULL_TREE, $$);
        !          1668:                  if (TREE_CODE ($$) == CALL_EXPR
        !          1669:                      && TREE_TYPE ($$) != void_type_node)
        !          1670:                    $$ = require_complete_type ($$);
        !          1671: #else
        !          1672:                  $$ = build_method_call ($$, $2, NULL_TREE, NULL_TREE,
        !          1673:                                          (LOOKUP_NORMAL|LOOKUP_AGGR));
        !          1674: #endif
        !          1675:                }
        !          1676:        | object id_scope identifier_or_opname '(' nonnull_exprlist ')'
        !          1677:                { $$ = build_scoped_method_call ($$, $2, $3, $5); }
        !          1678:        | object id_scope identifier_or_opname LEFT_RIGHT
        !          1679:                { $$ = build_scoped_method_call ($$, $2, $3, NULL_TREE); }
        !          1680: 
        !          1681: %ifobjc
        !          1682:        /* Objective-C expressions */
        !          1683:        | objcmessageexpr
        !          1684:                { $$ = build_message_expr ($1); }
        !          1685:        | objcselectorexpr
        !          1686:                { $$ = build_selector_expr ($1); }
        !          1687:        | objcprotocolexpr
        !          1688:                { $$ = build_protocol_expr ($1); }
        !          1689:        | objcencodeexpr
        !          1690:                { $$ = build_encode_expr ($1); }
        !          1691:        | objc_string
        !          1692:                { $$ = build_objc_string_object ($1); }
        !          1693: %endifobjc
        !          1694:        ;
        !          1695: 
        !          1696: /* Not needed for now.
        !          1697: 
        !          1698: primary_no_id:
        !          1699:          '(' expr ')'
        !          1700:                { $$ = $2; }
        !          1701:        | '(' error ')'
        !          1702:                { $$ = error_mark_node; }
        !          1703:        | '('
        !          1704:                { if (current_function_decl == 0)
        !          1705:                    {
        !          1706:                      error ("braced-group within expression allowed only inside a function");
        !          1707:                      YYERROR;
        !          1708:                    }
        !          1709:                  $<ttype>$ = expand_start_stmt_expr (); }
        !          1710:          compstmt ')'
        !          1711:                { if (pedantic)
        !          1712:                    pedwarn ("ANSI C++ forbids braced-groups within expressions");
        !          1713:                  $$ = expand_end_stmt_expr ($<ttype>2); }
        !          1714:        | primary_no_id '(' nonnull_exprlist ')'
        !          1715:                { $$ = build_x_function_call ($$, $3, current_class_decl); }
        !          1716:        | primary_no_id LEFT_RIGHT
        !          1717:                { $$ = build_x_function_call ($$, NULL_TREE, current_class_decl); }
        !          1718:        | primary_no_id '[' expr ']'
        !          1719:                { goto do_array; }
        !          1720:        | primary_no_id PLUSPLUS
        !          1721:                { $$ = build_x_unary_op (POSTINCREMENT_EXPR, $$); }
        !          1722:        | primary_no_id MINUSMINUS
        !          1723:                { $$ = build_x_unary_op (POSTDECREMENT_EXPR, $$); }
        !          1724:        | SCOPE IDENTIFIER
        !          1725:                { goto do_scoped_id; }
        !          1726:        | SCOPE operator_name
        !          1727:                { if (TREE_CODE ($2) == IDENTIFIER_NODE)
        !          1728:                    goto do_scoped_id;
        !          1729:                  goto do_scoped_operator;
        !          1730:                }
        !          1731:        ;
        !          1732: */
        !          1733: 
        !          1734: new:     NEW
        !          1735:                { $$ = NULL_TREE; }
        !          1736:        | NEW '{' nonnull_exprlist '}'
        !          1737:                {
        !          1738:                  $$ = $3;
        !          1739:                  pedwarn ("old style placement syntax, use () instead");
        !          1740:                }
        !          1741:        ;
        !          1742: 
        !          1743: .scope:
        !          1744:        /* empty  */
        !          1745:                { $$ = 0; }
        !          1746:        | SCOPE
        !          1747:                { $$ = 1; }
        !          1748:        ;
        !          1749: 
        !          1750: delete:          DELETE
        !          1751:                { $$ = NULL_TREE; }
        !          1752:        | SCOPE delete
        !          1753:                { if ($2)
        !          1754:                    error ("extra `::' before `delete' ignored");
        !          1755:                  $$ = error_mark_node;
        !          1756:                }
        !          1757:        ;
        !          1758: 
        !          1759: /* Produces a STRING_CST with perhaps more STRING_CSTs chained onto it.  */
        !          1760: string:
        !          1761:          STRING
        !          1762:        | string STRING
        !          1763:                { $$ = chainon ($$, $2); }
        !          1764:        ;
        !          1765: 
        !          1766: %ifobjc
        !          1767: /* Produces an OBJC_STRING_CST with perhaps more OBJC_STRING_CSTs chained
        !          1768:    onto it.  */
        !          1769: objc_string:
        !          1770:          OBJC_STRING
        !          1771:        | objc_string OBJC_STRING
        !          1772:                { $$ = chainon ($1, $2); }
        !          1773:        ;
        !          1774: %endifobjc
        !          1775: 
        !          1776: nodecls:
        !          1777:          /* empty */
        !          1778:                {
        !          1779:                  if (! current_function_parms_stored)
        !          1780:                    store_parm_decls ();
        !          1781:                  setup_vtbl_ptr ();
        !          1782:                  /* Always keep the BLOCK node associated with the outermost
        !          1783:                     pair of curley braces of a function.  These are needed
        !          1784:                     for correct operation of dwarfout.c.  */
        !          1785:                  keep_next_level ();
        !          1786:                }
        !          1787:        ;
        !          1788: 
        !          1789: object:          primary '.'
        !          1790:        | primary POINTSAT
        !          1791:                {
        !          1792:                  $$ = build_x_arrow ($$);
        !          1793:                }
        !          1794:        ;
        !          1795: 
        !          1796: object_star: primary POINTSAT_STAR
        !          1797:        ;
        !          1798: 
        !          1799: decl:
        !          1800:          typed_declspecs initdecls ';'
        !          1801:                {
        !          1802:                  resume_momentary ($2);
        !          1803:                  note_list_got_semicolon ($<ttype>$);
        !          1804:                }
        !          1805:        /* Normal case: make this fast.  */
        !          1806:        | typed_declspecs declarator ';'
        !          1807:                { tree d;
        !          1808:                  int yes = suspend_momentary ();
        !          1809:                  d = start_decl ($<ttype>2, $<ttype>$, 0, NULL_TREE);
        !          1810:                  finish_decl (d, NULL_TREE, NULL_TREE, 0);
        !          1811:                  resume_momentary (yes);
        !          1812:                  note_list_got_semicolon ($<ttype>$);
        !          1813:                }
        !          1814:        | declmods notype_initdecls ';'
        !          1815:                { resume_momentary ((int) $<itype>2); }
        !          1816:        /* Normal case: make this fast.  */
        !          1817:        | declmods declarator ';'
        !          1818:                { tree d;
        !          1819:                  int yes = suspend_momentary ();
        !          1820:                  d = start_decl ($<ttype>2, $<ttype>$, 0, NULL_TREE);
        !          1821:                  finish_decl (d, NULL_TREE, NULL_TREE, 0);
        !          1822:                  resume_momentary (yes);
        !          1823:                }
        !          1824:        | typed_declspecs ';'
        !          1825:                {
        !          1826:                  shadow_tag ($<ttype>$);
        !          1827:                  note_list_got_semicolon ($<ttype>$);
        !          1828:                }
        !          1829:        | declmods ';'
        !          1830:                { warning ("empty declaration"); }
        !          1831:        ;
        !          1832: 
        !          1833: /* Any kind of declarator (thus, all declarators allowed
        !          1834:    after an explicit typespec).  */
        !          1835: 
        !          1836: declarator:
        !          1837:          after_type_declarator
        !          1838:        | notype_declarator
        !          1839:        | START_DECLARATOR after_type_declarator
        !          1840:                { $$ = $2; }
        !          1841:        | START_DECLARATOR notype_declarator
        !          1842:                { $$ = $2; }
        !          1843:        ;
        !          1844: 
        !          1845: /* Declspecs which contain at least one type specifier or typedef name.
        !          1846:    (Just `const' or `volatile' is not enough.)
        !          1847:    A typedef'd name following these is taken as a name to be declared.  */
        !          1848: 
        !          1849: typed_declspecs:
        !          1850:          typespec      %prec HYPERUNARY
        !          1851:                { if ($$) $$ = list_hash_lookup_or_cons ($$); }
        !          1852:        | declmods typespec
        !          1853:                { $$ = hash_tree_chain ($2, $$); }
        !          1854:        | typespec reserved_declspecs   %prec HYPERUNARY
        !          1855:                { $$ = hash_tree_chain ($$, $2); }
        !          1856:        | declmods typespec reserved_declspecs
        !          1857:                { $$ = hash_tree_chain ($2, hash_chainon ($3, $$)); }
        !          1858:        ;
        !          1859: 
        !          1860: reserved_declspecs:  /* empty
        !          1861:                { $$ = NULL_TREE; } */
        !          1862:          typespecqual_reserved
        !          1863:                { $$ = build_decl_list (NULL_TREE, $$); }
        !          1864:        | SCSPEC
        !          1865:                { if (extra_warnings)
        !          1866:                    warning ("`%s' is not at beginning of declaration",
        !          1867:                             IDENTIFIER_POINTER ($$));
        !          1868:                  $$ = build_decl_list (NULL_TREE, $$); }
        !          1869:        | reserved_declspecs typespecqual_reserved
        !          1870:                { $$ = decl_tree_cons (NULL_TREE, $2, $$); }
        !          1871:        | reserved_declspecs SCSPEC
        !          1872:                { if (extra_warnings)
        !          1873:                    warning ("`%s' is not at beginning of declaration",
        !          1874:                             IDENTIFIER_POINTER ($2));
        !          1875:                  $$ = decl_tree_cons (NULL_TREE, $2, $$); }
        !          1876:        ;
        !          1877: 
        !          1878: /* List of just storage classes and type modifiers.
        !          1879:    A declaration can start with just this, but then it cannot be used
        !          1880:    to redeclare a typedef-name.  */
        !          1881: 
        !          1882: declmods:
        !          1883:          TYPE_QUAL
        !          1884:                { $$ = IDENTIFIER_AS_LIST ($$);
        !          1885:                  TREE_STATIC ($$) = 1; }
        !          1886:        | SCSPEC
        !          1887:                { $$ = IDENTIFIER_AS_LIST ($$); }
        !          1888:        | declmods TYPE_QUAL
        !          1889:                { $$ = hash_tree_chain ($2, $$);
        !          1890:                  TREE_STATIC ($$) = 1; }
        !          1891:        | declmods SCSPEC
        !          1892:                { if (extra_warnings && TREE_STATIC ($$))
        !          1893:                    warning ("`%s' is not at beginning of declaration",
        !          1894:                             IDENTIFIER_POINTER ($2));
        !          1895:                  $$ = hash_tree_chain ($2, $$);
        !          1896:                  TREE_STATIC ($$) = TREE_STATIC ($1); }
        !          1897:        ;
        !          1898: 
        !          1899: 
        !          1900: /* Used instead of declspecs where storage classes are not allowed
        !          1901:    (that is, for typenames and structure components).
        !          1902: 
        !          1903:    C++ can takes storage classes for structure components.
        !          1904:    Don't accept a typedef-name if anything but a modifier precedes it.  */
        !          1905: 
        !          1906: typed_typespecs:
        !          1907:          typespec  %prec EMPTY
        !          1908:                { $$ = get_decl_list ($$); }
        !          1909:        | nonempty_type_quals typespec
        !          1910:                { $$ = decl_tree_cons (NULL_TREE, $2, $$); }
        !          1911:        | typespec reserved_typespecquals
        !          1912:                { $$ = decl_tree_cons (NULL_TREE, $$, $2); }
        !          1913:        | nonempty_type_quals typespec reserved_typespecquals
        !          1914:                { $$ = decl_tree_cons (NULL_TREE, $2, hash_chainon ($3, $$)); }
        !          1915:        ;
        !          1916: 
        !          1917: reserved_typespecquals:
        !          1918:          typespecqual_reserved
        !          1919:                { $$ = get_decl_list ($$); }
        !          1920:        | reserved_typespecquals typespecqual_reserved
        !          1921:                { $$ = decl_tree_cons (NULL_TREE, $2, $$); }
        !          1922:        ;
        !          1923: 
        !          1924: /* A typespec (but not a type qualifier).
        !          1925:    Once we have seen one of these in a declaration,
        !          1926:    if a typedef name appears then it is being redeclared.  */
        !          1927: 
        !          1928: typespec: structsp
        !          1929:        | TYPESPEC  %prec EMPTY
        !          1930:        | TYPENAME  %prec EMPTY
        !          1931: %ifobjc
        !          1932:         | CLASSNAME protocolrefs
        !          1933:                { $$ = get_static_reference ($1, $2); }
        !          1934:        | OBJECTNAME protocolrefs
        !          1935:                { $$ = get_object_reference ($2); }
        !          1936: %endifobjc
        !          1937:        | scoped_typename
        !          1938:        | TYPEOF '(' expr ')'
        !          1939:                { $$ = TREE_TYPE ($3);
        !          1940:                  if (pedantic)
        !          1941:                    pedwarn ("ANSI C++ forbids `typeof'"); }
        !          1942:        | TYPEOF '(' typename ')'
        !          1943:                { $$ = groktypename ($3);
        !          1944:                  if (pedantic)
        !          1945:                    pedwarn ("ANSI C++ forbids `typeof'"); }
        !          1946:        | template_type
        !          1947:        ;
        !          1948: 
        !          1949: /* A typespec that is a reserved word, or a type qualifier.  */
        !          1950: 
        !          1951: typespecqual_reserved: TYPESPEC
        !          1952:        | TYPE_QUAL
        !          1953:        | structsp
        !          1954:        ;
        !          1955: 
        !          1956: initdecls:
        !          1957:          initdcl0
        !          1958:        | initdecls ',' initdcl
        !          1959:        ;
        !          1960: 
        !          1961: notype_initdecls:
        !          1962:          notype_initdcl0
        !          1963:        | notype_initdecls ',' initdcl
        !          1964:        ;
        !          1965: 
        !          1966: maybeasm:
        !          1967:          /* empty */
        !          1968:                { $$ = NULL_TREE; }
        !          1969:        | asm_keyword '(' string ')'
        !          1970:                { if (TREE_CHAIN ($3)) $3 = combine_strings ($3); $$ = $3; }
        !          1971:        ;
        !          1972: 
        !          1973: initdcl0:
        !          1974:          declarator maybe_raises maybeasm maybe_attribute '='
        !          1975:                { current_declspecs = $<ttype>0;
        !          1976:                  $<itype>5 = suspend_momentary ();
        !          1977:                  $<ttype>$ = start_decl ($<ttype>1, current_declspecs, 1, $2);
        !          1978:                  cplus_decl_attributes ($<ttype>$, $4); }
        !          1979:          init
        !          1980: /* Note how the declaration of the variable is in effect while its init is parsed! */
        !          1981:                { finish_decl ($<ttype>6, $7, $3, 0);
        !          1982:                  $$ = $<itype>5; }
        !          1983:        | declarator maybe_raises maybeasm maybe_attribute
        !          1984:                { tree d;
        !          1985:                  current_declspecs = $<ttype>0;
        !          1986:                  $$ = suspend_momentary ();
        !          1987:                  d = start_decl ($<ttype>1, current_declspecs, 0, $2);
        !          1988:                  cplus_decl_attributes (d, $4);
        !          1989:                  finish_decl (d, NULL_TREE, $3, 0); }
        !          1990:        ;
        !          1991: 
        !          1992: initdcl:
        !          1993:          declarator maybe_raises maybeasm maybe_attribute '='
        !          1994:                { $<ttype>$ = start_decl ($<ttype>1, current_declspecs, 1, $2);
        !          1995:                  cplus_decl_attributes ($<ttype>$, $4); }
        !          1996:          init
        !          1997: /* Note how the declaration of the variable is in effect while its init is parsed! */
        !          1998:                { finish_decl ($<ttype>6, $7, $3, 0); }
        !          1999:        | declarator maybe_raises maybeasm maybe_attribute
        !          2000:                { tree d = start_decl ($<ttype>1, current_declspecs, 0, $2);
        !          2001:                  cplus_decl_attributes ($<ttype>$, $4);
        !          2002:                  finish_decl (d, NULL_TREE, $3, 0); }
        !          2003:        ;
        !          2004: 
        !          2005: notype_initdcl0:
        !          2006:          notype_declarator maybe_raises maybeasm maybe_attribute '='
        !          2007:                { current_declspecs = $<ttype>0;
        !          2008:                  $<itype>5 = suspend_momentary ();
        !          2009:                  $<ttype>$ = start_decl ($<ttype>1, current_declspecs, 1, $2);
        !          2010:                  cplus_decl_attributes ($<ttype>$, $4); }
        !          2011:          init
        !          2012: /* Note how the declaration of the variable is in effect while its init is parsed! */
        !          2013:                { finish_decl ($<ttype>6, $7, $3, 0);
        !          2014:                  $$ = $<itype>5; }
        !          2015:        | notype_declarator maybe_raises maybeasm maybe_attribute
        !          2016:                { tree d;
        !          2017:                  current_declspecs = $<ttype>0;
        !          2018:                  $$ = suspend_momentary ();
        !          2019:                  d = start_decl ($<ttype>1, current_declspecs, 0, $2);
        !          2020:                  cplus_decl_attributes (d, $4);
        !          2021:                  finish_decl (d, NULL_TREE, $3, 0); }
        !          2022:        ;
        !          2023: 
        !          2024: /* the * rules are dummies to accept the Apollo extended syntax
        !          2025:    so that the header files compile. */
        !          2026: maybe_attribute:
        !          2027:     /* empty */
        !          2028:        { $$ = NULL_TREE; }
        !          2029:     | ATTRIBUTE '(' '(' attribute_list ')' ')'
        !          2030:         { $$ = $4; }
        !          2031:     ;
        !          2032: 
        !          2033: attribute_list
        !          2034:     : attrib
        !          2035:        { $$ = tree_cons (NULL_TREE, $1, NULL_TREE); }
        !          2036:     | attribute_list ',' attrib
        !          2037:        { $$ = tree_cons (NULL_TREE, $3, $1); }
        !          2038:     ;
        !          2039: 
        !          2040: attrib
        !          2041:     : IDENTIFIER
        !          2042:        { if (strcmp (IDENTIFIER_POINTER ($1), "packed")
        !          2043:              && strcmp (IDENTIFIER_POINTER ($1), "noreturn"))
        !          2044:            warning ("`%s' attribute directive ignored",
        !          2045:                     IDENTIFIER_POINTER ($1));
        !          2046:          $$ = $1; }
        !          2047:     | IDENTIFIER '(' CONSTANT ')'
        !          2048:        { /* if not "aligned(n)", then issue warning */
        !          2049:          if (strcmp (IDENTIFIER_POINTER ($1), "aligned") != 0
        !          2050:              || TREE_CODE ($3) != INTEGER_CST)
        !          2051:            {
        !          2052:              warning ("`%s' attribute directive ignored",
        !          2053:                       IDENTIFIER_POINTER ($1));
        !          2054:              $$ = $1;
        !          2055:            }
        !          2056:          else
        !          2057:            $$ = tree_cons ($1, $3, NULL_TREE); }
        !          2058:     | IDENTIFIER '(' IDENTIFIER ',' CONSTANT ',' CONSTANT ')'
        !          2059:        { /* if not "format(...)", then issue warning */
        !          2060:          if (strcmp (IDENTIFIER_POINTER ($1), "format") != 0
        !          2061:              || TREE_CODE ($5) != INTEGER_CST
        !          2062:              || TREE_CODE ($7) != INTEGER_CST)
        !          2063:            {
        !          2064:              warning ("`%s' attribute directive ignored",
        !          2065:                       IDENTIFIER_POINTER ($1));
        !          2066:              $$ = $1;
        !          2067:            }
        !          2068:          else
        !          2069:            $$ = tree_cons ($1, tree_cons ($3, tree_cons ($5, $7, NULL_TREE), NULL_TREE), NULL_TREE); }
        !          2070:     ;
        !          2071: 
        !          2072: /* A nonempty list of identifiers, including typenames.  */
        !          2073: identifiers_or_typenames:
        !          2074:        identifier
        !          2075:                { $$ = build_tree_list (NULL_TREE, $1); }
        !          2076:        | identifiers_or_typenames ',' identifier
        !          2077:                { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); }
        !          2078:        ;
        !          2079: 
        !          2080: init:
        !          2081:          expr_no_commas %prec '='
        !          2082:        | '{' '}'
        !          2083:                { $$ = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE);
        !          2084:                  TREE_HAS_CONSTRUCTOR ($$) = 1;
        !          2085:                  if (pedantic)
        !          2086:                    pedwarn ("ANSI C++ forbids empty initializer braces"); }
        !          2087:        | '{' initlist '}'
        !          2088:                { $$ = build_nt (CONSTRUCTOR, NULL_TREE, nreverse ($2));
        !          2089:                  TREE_HAS_CONSTRUCTOR ($$) = 1; }
        !          2090:        | '{' initlist ',' '}'
        !          2091:                { $$ = build_nt (CONSTRUCTOR, NULL_TREE, nreverse ($2));
        !          2092:                  TREE_HAS_CONSTRUCTOR ($$) = 1; }
        !          2093:        | error
        !          2094:                { $$ = NULL_TREE; }
        !          2095:        ;
        !          2096: 
        !          2097: /* This chain is built in reverse order,
        !          2098:    and put in forward order where initlist is used.  */
        !          2099: initlist:
        !          2100:          init
        !          2101:                { $$ = build_tree_list (NULL_TREE, $$); }
        !          2102:        | initlist ',' init
        !          2103:                { $$ = tree_cons (NULL_TREE, $3, $$); }
        !          2104: %ifcplus
        !          2105:        /* These are for labeled elements.  */
        !          2106:        | '[' expr_no_commas ']' init
        !          2107:                { $$ = build_tree_list ($2, $4); }
        !          2108: %endifcplus
        !          2109:        | initlist ',' CASE expr_no_commas ':' init
        !          2110:                { $$ = tree_cons ($4, $6, $$); }
        !          2111:        | identifier ':' init
        !          2112:                { $$ = build_tree_list ($$, $3); }
        !          2113:        | initlist ',' identifier ':' init
        !          2114:                { $$ = tree_cons ($3, $5, $$); }
        !          2115:        ;
        !          2116: 
        !          2117: structsp:
        !          2118:          ENUM identifier '{'
        !          2119:                { $<itype>3 = suspend_momentary ();
        !          2120:                  $$ = start_enum ($2); }
        !          2121:          enumlist maybecomma_warn '}'
        !          2122:                { $$ = finish_enum ($<ttype>4, $5);
        !          2123:                  resume_momentary ((int) $<itype>3);
        !          2124:                  check_for_missing_semicolon ($<ttype>4); }
        !          2125:        | ENUM identifier '{' '}'
        !          2126:                { $$ = finish_enum (start_enum ($2), NULL_TREE);
        !          2127:                  check_for_missing_semicolon ($$); }
        !          2128:        | ENUM '{'
        !          2129:                { $<itype>2 = suspend_momentary ();
        !          2130:                  $$ = start_enum (make_anon_name ()); }
        !          2131:          enumlist maybecomma_warn '}'
        !          2132:                { $$ = finish_enum ($<ttype>3, $4);
        !          2133:                  resume_momentary ((int) $<itype>1);
        !          2134:                  check_for_missing_semicolon ($<ttype>3); }
        !          2135:        | ENUM '{' '}'
        !          2136:                { $$ = finish_enum (start_enum (make_anon_name()), NULL_TREE);
        !          2137:                  check_for_missing_semicolon ($$); }
        !          2138:        | ENUM identifier
        !          2139:                { $$ = xref_tag (enum_type_node, $2, NULL_TREE); }
        !          2140: 
        !          2141:        /* C++ extensions, merged with C to avoid shift/reduce conflicts */
        !          2142:        | class_head left_curly opt.component_decl_list '}'
        !          2143:                {
        !          2144:                  int semi;
        !          2145:                  tree id;
        !          2146: 
        !          2147: #if 0
        !          2148:                  /* Need to rework class nesting in the
        !          2149:                     presence of nested classes, etc.  */
        !          2150:                  shadow_tag (CLASSTYPE_AS_LIST ($$)); */
        !          2151: #endif
        !          2152:                  if (yychar == YYEMPTY)
        !          2153:                    yychar = YYLEX;
        !          2154:                  semi = yychar == ';';
        !          2155:                  /* finish_struct nukes this anyway; if
        !          2156:                     finish_exception does too, then it can go. */
        !          2157:                  if (semi)
        !          2158:                    note_got_semicolon ($$);
        !          2159: 
        !          2160:                  if (TREE_CODE ($$) == ENUMERAL_TYPE)
        !          2161:                    /* $$ = $1 from default rule.  */;
        !          2162:                  else if (CLASSTYPE_DECLARED_EXCEPTION ($$))
        !          2163:                    {
        !          2164:                      if (! semi)
        !          2165:                        $$ = finish_exception ($$, $3);
        !          2166:                      else
        !          2167:                        warning ("empty exception declaration\n");
        !          2168:                    }
        !          2169:                  else
        !          2170:                    {
        !          2171:                      $$ = finish_struct ($$, $3, semi);
        !          2172:                      if (semi) note_got_semicolon ($$);
        !          2173:                    }
        !          2174: 
        !          2175:                  pop_obstacks ();
        !          2176: 
        !          2177:                  id = TYPE_IDENTIFIER ($$);
        !          2178:                  if (id && IDENTIFIER_TEMPLATE (id))
        !          2179:                    {
        !          2180:                      tree decl;
        !          2181: 
        !          2182:                      /* I don't know if the copying of this TYPE_DECL is
        !          2183:                       * really needed.  However, it's such a small per-
        !          2184:                       * formance penalty that the extra safety is a bargain.
        !          2185:                       * - [email protected]
        !          2186:                       */
        !          2187:                      push_obstacks (&permanent_obstack, &permanent_obstack);
        !          2188:                      decl = copy_node (lookup_name (id, 0));
        !          2189:                      if (DECL_LANG_SPECIFIC (decl))
        !          2190:                        copy_lang_decl (decl);
        !          2191:                      pop_obstacks ();
        !          2192:                      undo_template_name_overload (id, 0);
        !          2193:                      pushdecl_top_level (decl);
        !          2194:                    }
        !          2195:                  if (! semi)
        !          2196:                    check_for_missing_semicolon ($$); }
        !          2197:        | class_head  %prec EMPTY
        !          2198:                {
        !          2199: #if 0
        !          2200:   /* It's no longer clear what the following error is supposed to
        !          2201:      accomplish.  If it turns out to be needed, add a comment why.  */
        !          2202:                  if (TYPE_BINFO_BASETYPES ($$) && !TYPE_SIZE ($$))
        !          2203:                    {
        !          2204:                      error ("incomplete definition of type `%s'",
        !          2205:                             TYPE_NAME_STRING ($$));
        !          2206:                      $$ = error_mark_node;
        !          2207:                    }
        !          2208: #endif
        !          2209:                }
        !          2210:        ;
        !          2211: 
        !          2212: maybecomma:
        !          2213:          /* empty */
        !          2214:        | ','
        !          2215:        ;
        !          2216: 
        !          2217: maybecomma_warn:
        !          2218:          /* empty */
        !          2219:        | ','
        !          2220:                { if (pedantic) pedwarn ("comma at end of enumerator list"); }
        !          2221:        ;
        !          2222: 
        !          2223: aggr:    AGGR
        !          2224:        | aggr SCSPEC
        !          2225:                { error ("storage class specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER ($2)); }
        !          2226:        | aggr TYPESPEC
        !          2227:                { error ("type specifier `%s' not allowed after struct or class", IDENTIFIER_POINTER ($2)); }
        !          2228:        | aggr TYPE_QUAL
        !          2229:                { error ("type qualifier `%s' not allowed after struct or class", IDENTIFIER_POINTER ($2)); }
        !          2230:        | aggr AGGR
        !          2231:                { error ("no body nor ';' separates two class, struct or union declarations"); }
        !          2232:        ;
        !          2233: 
        !          2234: named_class_head_sans_basetype:
        !          2235:          aggr identifier
        !          2236:                { aggr1: current_aggr = $$; $$ = $2; }
        !          2237:        | aggr template_type_name  %prec EMPTY
        !          2238:                { current_aggr = $$; $$ = $2; }
        !          2239:        | aggr TYPENAME_COLON
        !          2240:                { yyungetc (':', 1); goto aggr1; }
        !          2241:        | aggr template_type_name '{'
        !          2242:                { yyungetc ('{', 1);
        !          2243:                aggr2:
        !          2244:                  current_aggr = $$;
        !          2245:                  $$ = $2;
        !          2246:                  overload_template_name ($$, 0); }
        !          2247:        | aggr template_type_name ':'
        !          2248:                { yyungetc (':', 1); goto aggr2; }
        !          2249:        ;
        !          2250: 
        !          2251: named_class_head_sans_basetype_defn:
        !          2252:          aggr identifier_defn
        !          2253:                { current_aggr = $$; $$ = $2; }
        !          2254:        ;
        !          2255: 
        !          2256: named_class_head:
        !          2257:          named_class_head_sans_basetype
        !          2258:                {
        !          2259:                  $<ttype>$ = xref_tag (current_aggr, $1, NULL_TREE);
        !          2260:                }
        !          2261:          maybe_base_class_list %prec EMPTY
        !          2262:                {
        !          2263:                  if ($3)
        !          2264:                    $$ = xref_tag (current_aggr, $1, $3);
        !          2265:                  else
        !          2266:                    $$ = $<ttype>2;
        !          2267:                }
        !          2268:        |
        !          2269:          named_class_head_sans_basetype_defn
        !          2270:                {
        !          2271:                  $<ttype>$ = xref_defn_tag (current_aggr, $1, NULL_TREE);
        !          2272:                }
        !          2273:          maybe_base_class_list %prec EMPTY
        !          2274:                {
        !          2275:                  if ($3)
        !          2276:                    $$ = xref_defn_tag (current_aggr, $1, $3);
        !          2277:                  else
        !          2278:                    $$ = $<ttype>2;
        !          2279:                }
        !          2280:        ;
        !          2281: 
        !          2282: unnamed_class_head: aggr '{'
        !          2283:                { $$ = xref_tag ($$, make_anon_name (), NULL_TREE);
        !          2284:                  yyungetc ('{', 1); }
        !          2285:        ;
        !          2286: 
        !          2287: class_head: unnamed_class_head | named_class_head ;
        !          2288: 
        !          2289: maybe_base_class_list:
        !          2290:          /* empty */
        !          2291:                { $$ = NULL_TREE; }
        !          2292:        | ':'  %prec EMPTY
        !          2293:                { yyungetc(':', 1); $$ = NULL_TREE; }
        !          2294:        | ':' base_class_list  %prec EMPTY
        !          2295:                { $$ = $2; }
        !          2296:        ;
        !          2297: 
        !          2298: base_class_list:
        !          2299:          base_class
        !          2300:        | base_class_list ',' base_class
        !          2301:                { $$ = chainon ($$, $3); }
        !          2302:        ;
        !          2303: 
        !          2304: base_class:
        !          2305:          base_class.1
        !          2306:                { if (! is_aggr_typedef ($$, 1))
        !          2307:                    $$ = NULL_TREE;
        !          2308:                  else $$ = build_tree_list ((tree)visibility_default, $$); }
        !          2309:        | scoped_base_class
        !          2310:                { if (! is_aggr_typedef ($$, 1))
        !          2311:                    $$ = NULL_TREE;
        !          2312:                  else $$ = build_tree_list ((tree)visibility_default, $$); }
        !          2313:        | base_class_visibility_list base_class.1
        !          2314:                { if (! is_aggr_typedef ($2, 1))
        !          2315:                    $$ = NULL_TREE;
        !          2316:                  else $$ = build_tree_list ((tree) $$, $2); }
        !          2317:        | base_class_visibility_list scoped_base_class
        !          2318:                { if (! is_aggr_typedef ($2, 1))
        !          2319:                    $$ = NULL_TREE;
        !          2320:                  else $$ = build_tree_list ((tree) $$, $2); }
        !          2321:        ;
        !          2322: 
        !          2323: scoped_base_class:
        !          2324:          base_class.1 SCOPED_TYPENAME
        !          2325:                {
        !          2326:                  /* Kludge!!! See rule "template_type" and the code
        !          2327:                   * dealing with "template_type_seen_before_scope" in
        !          2328:                   * yylex(). */
        !          2329:                  $$ = $2;
        !          2330:                }
        !          2331:        ;
        !          2332: base_class.1:
        !          2333:          template_type_name tmpl.2 template_instantiation
        !          2334:                {
        !          2335:                  extern tree template_type_seen_before_scope;
        !          2336:                  tree id = $3 ? TYPE_IDENTIFIER ($3) : $1;
        !          2337: 
        !          2338:                  /* Check the rule template_type to get this... */
        !          2339:                  if (yychar == YYEMPTY)
        !          2340:                    yychar = YYLEX;
        !          2341:                  if (yychar == SCOPE) {
        !          2342:                    template_type_seen_before_scope = id;
        !          2343:                    yychar = YYLEX;
        !          2344:                  }
        !          2345:                }
        !          2346:        | identifier
        !          2347:        ;
        !          2348: 
        !          2349: base_class_visibility_list:
        !          2350:          VISSPEC
        !          2351:        | SCSPEC
        !          2352:                { if ($<ttype>$ != ridpointers[(int)RID_VIRTUAL])
        !          2353:                    sorry ("non-virtual visibility");
        !          2354:                  $$ = visibility_default_virtual; }
        !          2355:        | base_class_visibility_list VISSPEC
        !          2356:                { int err = 0;
        !          2357:                  if ($2 == visibility_protected)
        !          2358:                    {
        !          2359:                      warning ("`protected' visibility not implemented");
        !          2360:                      $2 = visibility_public;
        !          2361:                      err++;
        !          2362:                    }
        !          2363:                  else if ($2 == visibility_public)
        !          2364:                    {
        !          2365:                      if ($1 == visibility_private)
        !          2366:                        {
        !          2367:                        mixed:
        !          2368:                          error ("base class cannot be public and private");
        !          2369:                        }
        !          2370:                      else if ($1 == visibility_default_virtual)
        !          2371:                        $$ = visibility_public_virtual;
        !          2372:                    }
        !          2373:                  else /* $2 == visibility_private */
        !          2374:                    {
        !          2375:                      if ($1 == visibility_public)
        !          2376:                        goto mixed;
        !          2377:                      else if ($1 == visibility_default_virtual)
        !          2378:                        $$ = visibility_private_virtual;
        !          2379:                    }
        !          2380:                }
        !          2381:        | base_class_visibility_list SCSPEC
        !          2382:                { if ($2 != ridpointers[(int)RID_VIRTUAL])
        !          2383:                    sorry ("non-virtual visibility");
        !          2384:                  if ($$ == visibility_public)
        !          2385:                    $$ = visibility_public_virtual;
        !          2386:                  else if ($$ == visibility_private)
        !          2387:                    $$ = visibility_private_virtual; }
        !          2388:        ;
        !          2389: 
        !          2390: left_curly: '{'
        !          2391:                { tree t;
        !          2392:                  push_obstacks_nochange ();
        !          2393:                  end_temporary_allocation ();
        !          2394: 
        !          2395:                  if (! IS_AGGR_TYPE ($<ttype>0))
        !          2396:                    {
        !          2397:                      $<ttype>0 = make_lang_type (RECORD_TYPE);
        !          2398:                      TYPE_NAME ($<ttype>0) = get_identifier ("erroneous type");
        !          2399:                    }
        !          2400:                  if (TYPE_SIZE ($<ttype>0))
        !          2401:                    duplicate_tag_error ($<ttype>0);
        !          2402:                   if (TYPE_SIZE ($<ttype>0) || TYPE_BEING_DEFINED ($<ttype>0))
        !          2403:                     {
        !          2404:                       t = make_lang_type (TREE_CODE ($<ttype>0));
        !          2405:                       pushtag (TYPE_IDENTIFIER ($<ttype>0), t);
        !          2406:                       $<ttype>0 = t;
        !          2407:                     }
        !          2408:                  pushclass ($<ttype>0, 0);
        !          2409:                  TYPE_BEING_DEFINED ($<ttype>0) = 1;
        !          2410:                  t = TYPE_IDENTIFIER ($<ttype>0);
        !          2411:                  if (t && IDENTIFIER_TEMPLATE (t))
        !          2412:                    overload_template_name (t, 1);
        !          2413:                }
        !          2414:        ;
        !          2415: 
        !          2416: opt.component_decl_list:
        !          2417:        /* empty */
        !          2418:                { $$ = NULL_TREE; }
        !          2419:        | component_decl_list
        !          2420:                { $$ = build_tree_list ((tree)visibility_default, $$); }
        !          2421:        | opt.component_decl_list VISSPEC ':' component_decl_list
        !          2422:                { $$ = chainon ($$, build_tree_list ((tree) $2, $4)); }
        !          2423:        | opt.component_decl_list VISSPEC ':'
        !          2424: %ifobjc
        !          2425:         | DEFS '(' CLASSNAME ')'
        !          2426:                 {
        !          2427:                   tree interface = lookup_interface ($3);
        !          2428:                   if (interface)
        !          2429:                     $$ = get_class_ivars (interface);
        !          2430:                   else
        !          2431:                     {
        !          2432:                       error ("Cannot find interface declaration for `%s'",
        !          2433:                              IDENTIFIER_POINTER ($3));
        !          2434:                       $$ = error_mark_node;
        !          2435:                     }
        !          2436:                 }
        !          2437:        ;
        !          2438: %endifobjc
        !          2439: 
        !          2440: /* Note: we no longer warn about the semicolon after a component_decl_list.
        !          2441:    ARM $9.2 says that the semicolon is optional, and therefore allowed.  */
        !          2442: component_decl_list:
        !          2443:          component_decl
        !          2444:                { if ($$ == void_type_node) $$ = NULL_TREE; }
        !          2445:        | component_decl_list component_decl
        !          2446:                { /* In pushdecl, we created a reverse list of names
        !          2447:                     in this binding level.  Make sure that the chain
        !          2448:                     of what we're trying to add isn't the item itself
        !          2449:                     (which can happen with what pushdecl's doing).  */
        !          2450:                  if ($2 != NULL_TREE && $2 != void_type_node)
        !          2451:                    {
        !          2452:                      if (TREE_CHAIN ($2) != $$)
        !          2453:                        $$ = chainon ($$, $2);
        !          2454:                      else
        !          2455:                        $$ = $2;
        !          2456:                    }
        !          2457:                }
        !          2458:        | component_decl_list ';'
        !          2459:        ;
        !          2460: 
        !          2461: component_decl:
        !          2462:          typed_declspecs components ';'
        !          2463:                { do_components:
        !          2464:                  $$ = grok_x_components ($$, $2);
        !          2465:                  end_exception_decls ();
        !          2466:                }
        !          2467:        | typed_declspecs '(' parmlist ')' ';'
        !          2468:                { $$ = groktypefield ($$, $3); }
        !          2469:        | typed_declspecs '(' parmlist ')' '}'
        !          2470:                { error ("missing ';' before right brace");
        !          2471:                  yyungetc ('}', 0);
        !          2472:                  $$ = groktypefield ($$, $3); }
        !          2473:        | typed_declspecs LEFT_RIGHT ';'
        !          2474:                { $$ = groktypefield ($$, empty_parms ()); }
        !          2475:        | typed_declspecs LEFT_RIGHT '}'
        !          2476:                { error ("missing ';' before right brace");
        !          2477:                  yyungetc ('}', 0);
        !          2478:                  $$ = groktypefield ($$, empty_parms ()); }
        !          2479:        | declmods components ';'
        !          2480:                { goto do_components; }
        !          2481:        /* Normal case: make this fast.  */
        !          2482:        | declmods declarator ';'
        !          2483:                { $$ = grokfield ($<ttype>2, $<ttype>$,
        !          2484:                                  NULL_TREE, NULL_TREE, NULL_TREE); }
        !          2485:        | declmods components '}'
        !          2486:                { error ("missing ';' before right brace");
        !          2487:                  yyungetc ('}', 0);
        !          2488:                  goto do_components; }
        !          2489:        | declmods '(' parmlist ')' ';'
        !          2490:                { $$ = groktypefield ($$, $3); }
        !          2491:        | declmods '(' parmlist ')' '}'
        !          2492:                { error ("missing ';' before right brace");
        !          2493:                  yyungetc ('}', 0);
        !          2494:                  $$ = groktypefield ($$, $3); }
        !          2495:        | declmods LEFT_RIGHT ';'
        !          2496:                { $$ = groktypefield ($$, empty_parms ()); }
        !          2497:        | declmods LEFT_RIGHT '}'
        !          2498:                { error ("missing ';' before right brace");
        !          2499:                  yyungetc ('}', 0);
        !          2500:                  $$ = groktypefield ($$, empty_parms ()); }
        !          2501:        | ':' expr_no_commas ';'
        !          2502:                { $$ = grokbitfield (NULL_TREE, NULL_TREE, $2); }
        !          2503:        | ':' expr_no_commas '}'
        !          2504:                { error ("missing ';' before right brace");
        !          2505:                  yyungetc ('}', 0);
        !          2506:                  $$ = grokbitfield (NULL_TREE, NULL_TREE, $2); }
        !          2507:        | error
        !          2508:                { $$ = NULL_TREE; }
        !          2509: 
        !          2510:        /* C++: handle constructors, destructors and inline functions */
        !          2511:        /* note that INLINE is like a TYPESPEC */
        !          2512:        | fn.def2 ':' /* base_init compstmt */
        !          2513:                { $$ = finish_method ($$); }
        !          2514:        | fn.def2 '{' /* nodecls compstmt */
        !          2515:                { $$ = finish_method ($$); }
        !          2516:        | notype_declarator maybe_raises ';'
        !          2517:                { $$ = grokfield ($$, NULL_TREE, $2, NULL_TREE, NULL_TREE); }
        !          2518:        | notype_declarator maybe_raises '}'
        !          2519:                { error ("missing ';' before right brace");
        !          2520:                  yyungetc ('}', 0);
        !          2521:                  $$ = grokfield ($$, NULL_TREE, $2, NULL_TREE, NULL_TREE); }
        !          2522:        ;
        !          2523: 
        !          2524: components:
        !          2525:          /* empty: possibly anonymous */
        !          2526:                { $$ = NULL_TREE; }
        !          2527:        | component_declarator0
        !          2528:        | components ',' component_declarator
        !          2529:                {
        !          2530:                  /* In this context, void_type_node encodes
        !          2531:                     friends.  They have been recorded elsewhere.  */
        !          2532:                  if ($$ == void_type_node)
        !          2533:                    $$ = $3;
        !          2534:                  else
        !          2535:                    $$ = chainon ($$, $3);
        !          2536:                }
        !          2537:        ;
        !          2538: 
        !          2539: component_declarator0:
        !          2540:          declarator maybe_raises maybeasm maybe_attribute
        !          2541:                { current_declspecs = $<ttype>0;
        !          2542:                  $$ = grokfield ($$, current_declspecs, $2, NULL_TREE, $3);
        !          2543:                  cplus_decl_attributes ($$, $4); }
        !          2544:        | declarator maybe_raises maybeasm maybe_attribute '=' init
        !          2545:                { current_declspecs = $<ttype>0;
        !          2546:                  $$ = grokfield ($$, current_declspecs, $2, $6, $3);
        !          2547:                  cplus_decl_attributes ($$, $4); }
        !          2548:        | IDENTIFIER ':' expr_no_commas maybe_attribute
        !          2549:                { current_declspecs = $<ttype>0;
        !          2550:                  $$ = grokbitfield ($$, current_declspecs, $3);
        !          2551:                  cplus_decl_attributes ($$, $4); }
        !          2552:        | TYPENAME ':' expr_no_commas maybe_attribute
        !          2553:                { current_declspecs = $<ttype>0;
        !          2554:                  $$ = grokbitfield ($$, current_declspecs, $3);
        !          2555:                  cplus_decl_attributes ($$, $4); }
        !          2556:        | ':' expr_no_commas maybe_attribute
        !          2557:                { current_declspecs = $<ttype>0;
        !          2558:                  $$ = grokbitfield (NULL_TREE, NULL_TREE, $2);
        !          2559:                  cplus_decl_attributes ($$, $3); }
        !          2560:        ;
        !          2561: 
        !          2562: component_declarator:
        !          2563:          declarator maybe_raises maybeasm maybe_attribute
        !          2564:                { $$ = grokfield ($$, current_declspecs, $2, NULL_TREE, $3);
        !          2565:                  cplus_decl_attributes ($$, $4); }
        !          2566:        | declarator maybe_raises maybeasm maybe_attribute '=' init
        !          2567:                { $$ = grokfield ($$, current_declspecs, $2, $6, $3);
        !          2568:                  cplus_decl_attributes ($$, $4); }
        !          2569:        | IDENTIFIER ':' expr_no_commas maybe_attribute
        !          2570:                { $$ = grokbitfield ($$, current_declspecs, $3);
        !          2571:                  cplus_decl_attributes ($$, $4); }
        !          2572:        | TYPENAME ':' expr_no_commas maybe_attribute
        !          2573:                { $$ = grokbitfield ($$, current_declspecs, $3);
        !          2574:                  cplus_decl_attributes ($$, $4); }
        !          2575:        | ':' expr_no_commas maybe_attribute
        !          2576:                { $$ = grokbitfield (NULL_TREE, NULL_TREE, $2);
        !          2577:                  cplus_decl_attributes ($$, $3); }
        !          2578:        ;
        !          2579: 
        !          2580: /* We chain the enumerators in reverse order.
        !          2581:    Because of the way enums are built, the order is
        !          2582:    insignificant.  Take advantage of this fact.  */
        !          2583: 
        !          2584: enumlist:
        !          2585:          enumerator
        !          2586:        | enumlist ',' enumerator
        !          2587:                { TREE_CHAIN ($3) = $$; $$ = $3; }
        !          2588:        ;
        !          2589: 
        !          2590: enumerator:
        !          2591:          identifier
        !          2592:                { $$ = build_enumerator ($$, NULL_TREE); }
        !          2593:        | identifier '=' expr_no_commas
        !          2594:                { $$ = build_enumerator ($$, $3); }
        !          2595:        ;
        !          2596: 
        !          2597: /* ANSI type-id (8.1) */
        !          2598: typename:
        !          2599:          typed_typespecs absdcl
        !          2600:                { $$ = build_decl_list ($$, $2); }
        !          2601:        | nonempty_type_quals absdcl
        !          2602:                { $$ = build_decl_list ($$, $2); }
        !          2603:        ;
        !          2604: 
        !          2605: /* ANSI abstract-declarator (8.1) */
        !          2606: absdcl:   /* an abstract declarator */
        !          2607:        /* empty */ %prec EMPTY
        !          2608:                { $$ = NULL_TREE; }
        !          2609:        | absdcl1  %prec EMPTY
        !          2610:        | START_DECLARATOR absdcl1  %prec EMPTY
        !          2611:                { $$ = $2; }
        !          2612:        ;
        !          2613: 
        !          2614: nonempty_type_quals:
        !          2615:          TYPE_QUAL
        !          2616:                { $$ = IDENTIFIER_AS_LIST ($$); }
        !          2617:        | nonempty_type_quals TYPE_QUAL
        !          2618:                { $$ = decl_tree_cons (NULL_TREE, $2, $$); }
        !          2619:        ;
        !          2620: 
        !          2621: type_quals:
        !          2622:          /* empty */
        !          2623:                { $$ = NULL_TREE; }
        !          2624:        | type_quals TYPE_QUAL
        !          2625:                { $$ = decl_tree_cons (NULL_TREE, $2, $$); }
        !          2626:        ;
        !          2627: 
        !          2628: /* These rules must follow the rules for function declarations
        !          2629:    and component declarations.  That way, longer rules are preferred.  */
        !          2630: 
        !          2631: /* An expression which will not live on the momentary obstack.  */
        !          2632: nonmomentary_expr:
        !          2633:        { $<itype>$ = suspend_momentary (); } expr
        !          2634:        { resume_momentary ((int) $<itype>1); $$ = $2; }
        !          2635: 
        !          2636: %ifobjc
        !          2637: /* This rule needs to be before after_type_declarator so that we resolve
        !          2638:    the reduce/reduce conflict in state 111 correctly.  We need to resolve it
        !          2639:    the same way that vanilla C++ resolves the reduce/reduce conflict in state
        !          2640:    105.  That is we must assume that we are processing a typespec rather than
        !          2641:    an after_type_declarator when we see a TYPENAME and aren't sure.  For the
        !          2642:    OBJECTNAME case this means we must read any protocolrefs, and then resume
        !          2643:    processing the typespec. */
        !          2644: protocolrefs:
        !          2645:           /* empty */
        !          2646:                {
        !          2647:                   $$ = NULL_TREE;
        !          2648:                 }
        !          2649:        | '<' identifier_list '>'
        !          2650:                {
        !          2651:                     $$ = $2;
        !          2652:                }
        !          2653:        ;
        !          2654: %endifobjc
        !          2655: 
        !          2656: /* A declarator that is allowed only after an explicit typespec.  */
        !          2657: /* may all be followed by prec '.' */
        !          2658: after_type_declarator:
        !          2659:          after_type_declarator '(' nonnull_exprlist ')' type_quals  %prec '.'
        !          2660:                { $$ = build_parse_node (CALL_EXPR, $$, $3, $5); }
        !          2661:        | after_type_declarator '(' parmlist ')' type_quals  %prec '.'
        !          2662:                { $$ = build_parse_node (CALL_EXPR, $$, $3, $5); }
        !          2663:        | after_type_declarator LEFT_RIGHT type_quals  %prec '.'
        !          2664:                { $$ = build_parse_node (CALL_EXPR, $$, empty_parms (), $3); }
        !          2665:        | after_type_declarator '(' error ')' type_quals  %prec '.'
        !          2666:                { $$ = build_parse_node (CALL_EXPR, $$, NULL_TREE, NULL_TREE); }
        !          2667:        | after_type_declarator '[' nonmomentary_expr ']'
        !          2668:                { $$ = build_parse_node (ARRAY_REF, $$, $3); }
        !          2669:        | after_type_declarator '[' ']'
        !          2670:                { $$ = build_parse_node (ARRAY_REF, $$, NULL_TREE); }
        !          2671:        | '(' after_type_declarator_no_typename ')'
        !          2672:                { $$ = $2; }
        !          2673:        | '(' '*' type_quals after_type_declarator ')'
        !          2674:                { $$ = make_pointer_declarator ($3, $4); }
        !          2675:        | PAREN_STAR_PAREN
        !          2676:                { see_typename (); }
        !          2677:        | after_type_member_declarator
        !          2678:        | '(' '&' type_quals after_type_declarator ')'
        !          2679:                { $$ = make_reference_declarator ($3, $4); }
        !          2680:        | '*' type_quals after_type_declarator  %prec UNARY
        !          2681:                { $$ = make_pointer_declarator ($2, $3); }
        !          2682:        | '&' type_quals after_type_declarator  %prec UNARY
        !          2683:                { $$ = make_reference_declarator ($2, $3); }
        !          2684:        | TYPENAME
        !          2685: %ifobjc
        !          2686:        | OBJECTNAME
        !          2687: %endifobjc
        !          2688:        ;
        !          2689: 
        !          2690: after_type_declarator_no_typename:
        !          2691:          after_type_declarator_no_typename '(' nonnull_exprlist ')' type_quals  %prec '.'
        !          2692:                { $$ = build_parse_node (CALL_EXPR, $$, $3, $5); }
        !          2693:        | after_type_declarator_no_typename '(' parmlist ')' type_quals  %prec '.'
        !          2694:                { $$ = build_parse_node (CALL_EXPR, $$, $3, $5); }
        !          2695:        | after_type_declarator_no_typename LEFT_RIGHT type_quals  %prec '.'
        !          2696:                { $$ = build_parse_node (CALL_EXPR, $$, empty_parms (), $3); }
        !          2697:        | after_type_declarator_no_typename '(' error ')' type_quals  %prec '.'
        !          2698:                { $$ = build_parse_node (CALL_EXPR, $$, NULL_TREE, NULL_TREE); }
        !          2699:        | after_type_declarator_no_typename '[' nonmomentary_expr ']'
        !          2700:                { $$ = build_parse_node (ARRAY_REF, $$, $3); }
        !          2701:        | after_type_declarator_no_typename '[' ']'
        !          2702:                { $$ = build_parse_node (ARRAY_REF, $$, NULL_TREE); }
        !          2703:        | '(' after_type_declarator_no_typename ')'
        !          2704:                { $$ = $2; }
        !          2705:        | PAREN_STAR_PAREN
        !          2706:                { see_typename (); }
        !          2707:        | after_type_member_declarator
        !          2708:        | '*' type_quals after_type_declarator  %prec UNARY
        !          2709:                { $$ = make_pointer_declarator ($2, $3); }
        !          2710:        | '&' type_quals after_type_declarator  %prec UNARY
        !          2711:                { $$ = make_reference_declarator ($2, $3); }
        !          2712:        ;
        !          2713: 
        !          2714: /* A declarator allowed whether or not there has been
        !          2715:    an explicit typespec.  These cannot redeclare a typedef-name.  */
        !          2716: 
        !          2717: notype_declarator:
        !          2718:          notype_declarator '(' nonnull_exprlist ')' type_quals  %prec '.'
        !          2719:                { $$ = build_parse_node (CALL_EXPR, $$, $3, $5); }
        !          2720:        | notype_declarator '(' parmlist ')' type_quals  %prec '.'
        !          2721:                { $$ = build_parse_node (CALL_EXPR, $$, $3, $5); }
        !          2722:        | notype_declarator LEFT_RIGHT type_quals  %prec '.'
        !          2723:                { $$ = build_parse_node (CALL_EXPR, $$, empty_parms (), $3); }
        !          2724:        | notype_declarator '(' error ')' type_quals  %prec '.'
        !          2725:                { $$ = build_parse_node (CALL_EXPR, $$, NULL_TREE, NULL_TREE); }
        !          2726:        | '(' notype_declarator ')'
        !          2727:                { $$ = $2; }
        !          2728:        | '*' type_quals notype_declarator  %prec UNARY
        !          2729:                { $$ = make_pointer_declarator ($2, $3); }
        !          2730:        | '&' type_quals notype_declarator  %prec UNARY
        !          2731:                { $$ = make_reference_declarator ($2, $3); }
        !          2732:        | notype_declarator '[' nonmomentary_expr ']'
        !          2733:                { $$ = build_parse_node (ARRAY_REF, $$, $3); }
        !          2734:        | notype_declarator '[' ']'
        !          2735:                { $$ = build_parse_node (ARRAY_REF, $$, NULL_TREE); }
        !          2736:        | IDENTIFIER
        !          2737:                { see_typename (); }
        !          2738: 
        !          2739:        /* C++ extensions.  */
        !          2740:        | operator_name
        !          2741:                { see_typename (); }
        !          2742: 
        !          2743:        | '~' TYPENAME
        !          2744:                {
        !          2745:                destructor_name:
        !          2746:                  see_typename ();
        !          2747:                  $$ = build_parse_node (BIT_NOT_EXPR, $2);
        !          2748:                }
        !          2749:        | '~' IDENTIFIER
        !          2750:                { goto destructor_name; }
        !          2751:         | '~' PTYPENAME
        !          2752:                 { goto destructor_name; }
        !          2753:        | id_scope see_typename notype_declarator  %prec '('
        !          2754:                { see_typename ();
        !          2755:                  if (TREE_CODE ($$) != SCOPE_REF)
        !          2756:                    $$ = build_push_scope ($$, $3);
        !          2757:                  else if (TREE_OPERAND ($$, 1) == NULL_TREE)
        !          2758:                    TREE_OPERAND ($$, 1) = $3;
        !          2759:                  else
        !          2760:                    $$ = build_parse_node (SCOPE_REF, $$, $3);
        !          2761:                }
        !          2762:        | id_scope see_typename TYPENAME  %prec '('
        !          2763:                { $$ = build_push_scope ($$, $3); }
        !          2764:        | id_scope see_typename TYPENAME '(' nonnull_exprlist ')' type_quals  %prec '.'
        !          2765:                { $$ = build_push_scope ($$, build_parse_node (CALL_EXPR, $3, $5, $7)); }
        !          2766:        | id_scope see_typename TYPENAME '(' parmlist ')' type_quals  %prec '.'
        !          2767:                { $$ = build_push_scope ($$, build_parse_node (CALL_EXPR, $3, $5, $7)); }
        !          2768:        | id_scope see_typename TYPENAME LEFT_RIGHT type_quals  %prec '.'
        !          2769:                { $$ = build_push_scope ($$, build_parse_node (CALL_EXPR, $3, empty_parms (), $5)); }
        !          2770:        | id_scope see_typename TYPENAME '(' error ')' type_quals  %prec '.'
        !          2771:                { $$ = build_push_scope ($$, build_parse_node (CALL_EXPR, $3, NULL_TREE, NULL_TREE)); }
        !          2772:        /* For constructor templates.  */
        !          2773:        | id_scope see_typename PTYPENAME  %prec '('
        !          2774:                { $$ = build_push_scope ($$, $3); }
        !          2775:        | id_scope see_typename PTYPENAME '(' nonnull_exprlist ')' type_quals  %prec '.'
        !          2776:                { $$ = build_push_scope ($$, build_parse_node (CALL_EXPR, $3, $5, $7)); }
        !          2777:        | id_scope see_typename PTYPENAME '(' parmlist ')' type_quals  %prec '.'
        !          2778:                { $$ = build_push_scope ($$, build_parse_node (CALL_EXPR, $3, $5, $7)); }
        !          2779:        | id_scope see_typename PTYPENAME LEFT_RIGHT type_quals  %prec '.'
        !          2780:                { $$ = build_push_scope ($$, build_parse_node (CALL_EXPR, $3, empty_parms (), $5)); }
        !          2781:        | id_scope see_typename PTYPENAME '(' error ')' type_quals  %prec '.'
        !          2782:                { $$ = build_push_scope ($$, build_parse_node (CALL_EXPR, $3, NULL_TREE, NULL_TREE)); }
        !          2783:        | SCOPE see_typename notype_declarator
        !          2784:                { $$ = build_parse_node (SCOPE_REF, NULL_TREE, $3); }
        !          2785:        ;
        !          2786: 
        !          2787: id_scope:      typename_scope
        !          2788:                { tree t;
        !          2789:                   do_id_scope:
        !          2790: 
        !          2791:                  t = resolve_scope_to_name (NULL_TREE, $$);
        !          2792:                  if (t == NULL_TREE)
        !          2793:                    {
        !          2794:                      cp_error ("`%T' is not a valid scope", $$);
        !          2795:                      $$ = error_mark_node; 
        !          2796:                    }
        !          2797:                  else
        !          2798:                    $$ = t;
        !          2799:                }
        !          2800:        | IDENTIFIER SCOPE
        !          2801:                { goto do_id_scope; }
        !          2802:        | template_type SCOPE /* try_for_typename %prec EMPTY */
        !          2803:                {
        !          2804:                   if ($$ == error_mark_node)
        !          2805:                     /* leave it alone */;
        !          2806:                   else
        !          2807:                    {
        !          2808:                      $$ = resolve_scope_to_name (NULL_TREE, TYPE_IDENTIFIER ($$));
        !          2809:                      if ($$ == NULL_TREE)
        !          2810:                        {
        !          2811:                          error ("undefined explicitly scoped type");
        !          2812:                          $$ = error_mark_node; 
        !          2813:                        }
        !          2814:                    }
        !          2815: /*                  if ($3) popclass (1); */
        !          2816:                }
        !          2817:        ;
        !          2818: 
        !          2819: typename_scope:
        !          2820:        TYPENAME SCOPE;
        !          2821: 
        !          2822: scoped_typename: SCOPED_TYPENAME
        !          2823:        | template_type SCOPED_TYPENAME
        !          2824:                {
        !          2825:                  /* Kludge!!! See rule "template_type" and the code
        !          2826:                   * dealing with "template_type_seen_before_scope" in
        !          2827:                   * yylex(). */
        !          2828:                  $$ = $2;
        !          2829:                }
        !          2830: /*     | template_type SCOPE try_for_typename TYPENAME
        !          2831:                {
        !          2832:                   if ($$ == error_mark_node)
        !          2833:                     ;
        !          2834:                  else
        !          2835:                    {
        !          2836:                       $$ = build_parse_node (SCOPE_REF,
        !          2837:                                              TYPE_IDENTIFIER ($$),
        !          2838:                                              $4);
        !          2839:                     }
        !          2840:                  if ($3) popclass (1);
        !          2841:                } */
        !          2842:        ;
        !          2843: 
        !          2844: absdcl1:  /* a nonempty abstract declarator */
        !          2845:          '(' absdcl1 ')'
        !          2846:                { see_typename ();
        !          2847:                  $$ = $2; }
        !          2848:          /* `(typedef)1' is `int'.  */
        !          2849:        | '*' type_quals absdcl1  %prec EMPTY
        !          2850:                { $$ = make_pointer_declarator ($2, $3); }
        !          2851:        | '*' type_quals  %prec EMPTY
        !          2852:                { $$ = make_pointer_declarator ($2, NULL_TREE); }
        !          2853:        | PAREN_STAR_PAREN
        !          2854:                { see_typename (); }
        !          2855:        | '(' abs_member_declarator ')'
        !          2856:                { $$ = $2; }
        !          2857:        | '&' type_quals absdcl1 %prec EMPTY
        !          2858:                { $$ = make_reference_declarator ($2, $3); }
        !          2859:        | '&' type_quals %prec EMPTY
        !          2860:                { $$ = make_reference_declarator ($2, NULL_TREE); }
        !          2861:        | absdcl1 '(' parmlist ')' type_quals  %prec '.'
        !          2862:                { $$ = build_parse_node (CALL_EXPR, $$, $3, $5); }
        !          2863:        | absdcl1 LEFT_RIGHT type_quals  %prec '.'
        !          2864:                { $$ = build_parse_node (CALL_EXPR, $$, empty_parms (), $3); }
        !          2865:        | absdcl1 '[' nonmomentary_expr ']'  %prec '.'
        !          2866:                { $$ = build_parse_node (ARRAY_REF, $$, $3); }
        !          2867:        | absdcl1 '[' ']'  %prec '.'
        !          2868:                { $$ = build_parse_node (ARRAY_REF, $$, NULL_TREE); }
        !          2869:        | '(' parmlist ')' type_quals  %prec '.'
        !          2870:                { $$ = build_parse_node (CALL_EXPR, NULL_TREE, $2, $4); }
        !          2871:        | LEFT_RIGHT type_quals  %prec '.'
        !          2872:                { $$ = build_parse_node (CALL_EXPR, NULL_TREE, empty_parms (), $2); }
        !          2873:        | '[' nonmomentary_expr ']'  %prec '.'
        !          2874:                { $$ = build_parse_node (ARRAY_REF, NULL_TREE, $2); }
        !          2875:        | '[' ']'  %prec '.'
        !          2876:                { $$ = build_parse_node (ARRAY_REF, NULL_TREE, NULL_TREE); }
        !          2877:        ;
        !          2878: 
        !          2879: abs_member_declarator:
        !          2880:          id_scope see_typename '*' type_quals
        !          2881:                { tree t;
        !          2882:                  t = $$;
        !          2883:                  while (TREE_OPERAND (t, 1))
        !          2884:                    t = TREE_OPERAND (t, 1);
        !          2885:                  TREE_OPERAND (t, 1) = build_parse_node (INDIRECT_REF, 0);
        !          2886:                }
        !          2887:        | id_scope see_typename '*' type_quals absdcl1
        !          2888:                { tree t;
        !          2889:                  t = $$;
        !          2890:                  while (TREE_OPERAND (t, 1))
        !          2891:                    t = TREE_OPERAND (t, 1);
        !          2892:                  TREE_OPERAND (t, 1) = build_parse_node (INDIRECT_REF, $5);
        !          2893:                }
        !          2894:        | id_scope see_typename '&' type_quals
        !          2895:                { tree t;
        !          2896:                  t = $$;
        !          2897:                  while (TREE_OPERAND (t, 1))
        !          2898:                    t = TREE_OPERAND (t, 1);
        !          2899:                  TREE_OPERAND (t, 1) = build_parse_node (ADDR_EXPR, 0);
        !          2900:                }
        !          2901:        | id_scope see_typename '&' type_quals absdcl1
        !          2902:                { tree t;
        !          2903:                  t = $$;
        !          2904:                  while (TREE_OPERAND (t, 1))
        !          2905:                    t = TREE_OPERAND (t, 1);
        !          2906:                  TREE_OPERAND (t, 1) = build_parse_node (ADDR_EXPR, $5);
        !          2907:                }
        !          2908:        ;
        !          2909: 
        !          2910: after_type_member_declarator:
        !          2911:          id_scope see_typename '*' type_quals after_type_declarator
        !          2912:                { tree t;
        !          2913:                  t = $$;
        !          2914:                  while (TREE_OPERAND (t, 1))
        !          2915:                    t = TREE_OPERAND (t, 1);
        !          2916:                  TREE_OPERAND (t, 1) = build_parse_node (INDIRECT_REF, $5);
        !          2917:                }
        !          2918:        | id_scope see_typename '&' type_quals after_type_declarator
        !          2919:                { tree t;
        !          2920:                  t = $$;
        !          2921:                  while (TREE_OPERAND (t, 1))
        !          2922:                    t = TREE_OPERAND (t, 1);
        !          2923:                  TREE_OPERAND (t, 1) = build_parse_node (ADDR_EXPR, $5);
        !          2924:                }
        !          2925:        ;
        !          2926: 
        !          2927: /* For C++, decls and stmts can be intermixed, so we don't need to
        !          2928:    have a special rule that won't start parsing the stmt section
        !          2929:    until we have a stmt that parses without errors.  */
        !          2930: 
        !          2931: stmts:
        !          2932:          stmt
        !          2933:        | errstmt
        !          2934:        | stmts stmt
        !          2935:        | stmts errstmt
        !          2936:        ;
        !          2937: 
        !          2938: errstmt:  error ';'
        !          2939:        ;
        !          2940: 
        !          2941: /* build the LET_STMT node before parsing its contents,
        !          2942:   so that any LET_STMTs within the context can have their display pointers
        !          2943:   set up to point at this one.  */
        !          2944: 
        !          2945: .pushlevel:  /* empty */
        !          2946:                { emit_line_note (input_filename, lineno);
        !          2947:                  pushlevel (0);
        !          2948:                  clear_last_expr ();
        !          2949:                  push_momentary ();
        !          2950:                  expand_start_bindings (0); 
        !          2951: %ifobjc
        !          2952:                  if (objc_method_context)
        !          2953:                    add_objc_decls();
        !          2954: %endifobjc
        !          2955:                  }
        !          2956:        ;
        !          2957: 
        !          2958: /* Read zero or more forward-declarations for labels
        !          2959:    that nested functions can jump to.  */
        !          2960: maybe_label_decls:
        !          2961:          /* empty */
        !          2962:        | label_decls
        !          2963:                { if (pedantic)
        !          2964:                    pedwarn ("ANSI C++ forbids label declarations"); }
        !          2965:        ;
        !          2966: 
        !          2967: label_decls:
        !          2968:          label_decl
        !          2969:        | label_decls label_decl
        !          2970:        ;
        !          2971: 
        !          2972: label_decl:
        !          2973:          LABEL identifiers_or_typenames ';'
        !          2974:                { tree link;
        !          2975:                  for (link = $2; link; link = TREE_CHAIN (link))
        !          2976:                    {
        !          2977:                      tree label = shadow_label (TREE_VALUE (link));
        !          2978:                      C_DECLARED_LABEL_FLAG (label) = 1;
        !          2979:                      declare_nonlocal_label (label);
        !          2980:                    }
        !          2981:                }
        !          2982:        ;
        !          2983: 
        !          2984: /* This is the body of a function definition.
        !          2985:    It causes syntax errors to ignore to the next openbrace.  */
        !          2986: compstmt_or_error:
        !          2987:          compstmt
        !          2988:                {}
        !          2989:        | error compstmt
        !          2990:        ;
        !          2991: 
        !          2992: compstmt: '{' .pushlevel '}'
        !          2993:                { pop_implicit_try_blocks (NULL_TREE);
        !          2994:                  expand_end_bindings (getdecls (), kept_level_p(), 1);
        !          2995:                  $$ = poplevel (kept_level_p (), 1, 0);
        !          2996:                  pop_momentary (); }
        !          2997:        | '{' .pushlevel maybe_label_decls stmts '}'
        !          2998:                { pop_implicit_try_blocks (NULL_TREE);
        !          2999:                  expand_end_bindings (getdecls (), kept_level_p(), 1);
        !          3000:                  $$ = poplevel (kept_level_p (), 1, 0);
        !          3001:                  pop_momentary (); }
        !          3002:        | '{' .pushlevel maybe_label_decls error '}'
        !          3003:                { pop_implicit_try_blocks (NULL_TREE);
        !          3004:                  expand_end_bindings (getdecls (), kept_level_p(), 1);
        !          3005:                  $$ = poplevel (kept_level_p (), 0, 0);
        !          3006:                  pop_momentary (); }
        !          3007:        ;
        !          3008: 
        !          3009: simple_if:
        !          3010:          IF
        !          3011:                { cond_stmt_keyword = "if"; }
        !          3012:          .pushlevel paren_cond_or_null
        !          3013:                { emit_line_note (input_filename, lineno);
        !          3014:                  expand_start_cond (truthvalue_conversion ($4), 0); }
        !          3015:          partially_scoped_stmt
        !          3016:        ;
        !          3017: 
        !          3018: implicitly_scoped_stmt:
        !          3019:          compstmt
        !          3020:                { finish_stmt (); }
        !          3021:        | .pushlevel simple_stmt
        !          3022:                { pop_implicit_try_blocks (NULL_TREE);
        !          3023:                  expand_end_bindings (getdecls (), getdecls() != NULL_TREE, 1);
        !          3024:                  $$ = poplevel (kept_level_p (), 1, 0);
        !          3025:                  pop_momentary (); }
        !          3026:        ;
        !          3027: 
        !          3028: stmt:
        !          3029:          compstmt
        !          3030:                { finish_stmt (); }
        !          3031:        | simple_stmt
        !          3032:        ;
        !          3033: 
        !          3034: simple_stmt:
        !          3035:          decl
        !          3036:                { finish_stmt (); }
        !          3037:        | expr ';'
        !          3038:                {
        !          3039:                  tree expr = $1;
        !          3040:                  emit_line_note (input_filename, lineno);
        !          3041:                  /* Do default conversion if safe and possibly important,
        !          3042:                     in case within ({...}).  */
        !          3043:                  if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE
        !          3044:                       && lvalue_p (expr))
        !          3045:                      || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)
        !          3046:                    expr = default_conversion (expr);
        !          3047:                  cplus_expand_expr_stmt (expr);
        !          3048:                  clear_momentary ();
        !          3049:                  finish_stmt (); }
        !          3050:        | simple_if ELSE
        !          3051:                { expand_start_else (); }
        !          3052:          partially_scoped_stmt
        !          3053:                { expand_end_cond ();
        !          3054:                  pop_implicit_try_blocks (NULL_TREE);
        !          3055:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
        !          3056:                  poplevel (kept_level_p (), 1, 0);
        !          3057:                  pop_momentary ();
        !          3058:                  finish_stmt (); }
        !          3059:        | simple_if %prec IF
        !          3060:                { expand_end_cond ();
        !          3061:                  pop_implicit_try_blocks (NULL_TREE);
        !          3062:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
        !          3063:                  poplevel (kept_level_p (), 1, 0);
        !          3064:                  pop_momentary ();
        !          3065:                  finish_stmt (); }
        !          3066:        | WHILE
        !          3067:                { emit_nop ();
        !          3068:                  emit_line_note (input_filename, lineno);
        !          3069:                  expand_start_loop (1);
        !          3070:                  cond_stmt_keyword = "while"; }
        !          3071:          .pushlevel paren_cond_or_null
        !          3072:                { expand_exit_loop_if_false (0, truthvalue_conversion ($4)); }
        !          3073:          already_scoped_stmt
        !          3074:                { pop_implicit_try_blocks (NULL_TREE);
        !          3075:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
        !          3076:                  poplevel (kept_level_p (), 1, 0);
        !          3077:                  pop_momentary ();
        !          3078:                  expand_end_loop ();
        !          3079:                  finish_stmt (); }
        !          3080:        | DO
        !          3081:                { emit_nop ();
        !          3082:                  emit_line_note (input_filename, lineno);
        !          3083:                  expand_start_loop_continue_elsewhere (1); }
        !          3084:          implicitly_scoped_stmt WHILE
        !          3085:                { expand_loop_continue_here ();
        !          3086:                  cond_stmt_keyword = "do"; }
        !          3087:          paren_expr_or_null ';'
        !          3088:                { emit_line_note (input_filename, lineno);
        !          3089:                  expand_exit_loop_if_false (0, truthvalue_conversion ($6));
        !          3090:                  expand_end_loop ();
        !          3091:                  clear_momentary ();
        !          3092:                  finish_stmt (); }
        !          3093:        | forhead.1
        !          3094:                { emit_nop ();
        !          3095:                  emit_line_note (input_filename, lineno);
        !          3096:                  if ($1) cplus_expand_expr_stmt ($1);
        !          3097:                  expand_start_loop_continue_elsewhere (1); }
        !          3098:          .pushlevel xcond ';'
        !          3099:                { emit_line_note (input_filename, lineno);
        !          3100:                  if ($4) expand_exit_loop_if_false (0, truthvalue_conversion ($4)); }
        !          3101:          xexpr ')'
        !          3102:                /* Don't let the tree nodes for $7 be discarded
        !          3103:                   by clear_momentary during the parsing of the next stmt.  */
        !          3104:                { push_momentary (); }
        !          3105:          already_scoped_stmt
        !          3106:                { emit_line_note (input_filename, lineno);
        !          3107:                  expand_loop_continue_here ();
        !          3108:                  if ($7) cplus_expand_expr_stmt ($7);
        !          3109:                  pop_momentary ();
        !          3110:                  pop_implicit_try_blocks (NULL_TREE);
        !          3111:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
        !          3112:                  poplevel (kept_level_p (), 1, 0);
        !          3113:                  pop_momentary ();
        !          3114:                  expand_end_loop ();
        !          3115:                  finish_stmt (); }
        !          3116:        | forhead.2
        !          3117:                { emit_nop ();
        !          3118:                  emit_line_note (input_filename, lineno);
        !          3119:                  expand_start_loop_continue_elsewhere (1); }
        !          3120:          .pushlevel xcond ';'
        !          3121:                { emit_line_note (input_filename, lineno);
        !          3122:                  if ($4) expand_exit_loop_if_false (0, truthvalue_conversion ($4)); }
        !          3123:          xexpr ')'
        !          3124:                /* Don't let the tree nodes for $7 be discarded
        !          3125:                   by clear_momentary during the parsing of the next stmt.  */
        !          3126:                { push_momentary ();
        !          3127:                  $<itype>8 = lineno; }
        !          3128:          already_scoped_stmt
        !          3129:                { emit_line_note (input_filename, (int) $<itype>8);
        !          3130:                  expand_loop_continue_here ();
        !          3131:                  if ($7) cplus_expand_expr_stmt ($7);
        !          3132:                  pop_momentary ();
        !          3133:                  pop_implicit_try_blocks (NULL_TREE);
        !          3134:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
        !          3135:                  poplevel (kept_level_p (), 1, 0);
        !          3136:                  pop_momentary ();
        !          3137:                  expand_end_loop ();
        !          3138:                  finish_stmt ();
        !          3139:                }
        !          3140:        | SWITCH .pushlevel '(' condition ')'
        !          3141:                { emit_line_note (input_filename, lineno);
        !          3142:                  c_expand_start_case ($4); 
        !          3143:                  /* Don't let the tree nodes for $4 be discarded by
        !          3144:                     clear_momentary during the parsing of the next stmt.  */
        !          3145:                  push_momentary (); }
        !          3146:          partially_scoped_stmt
        !          3147:                { expand_end_case ($4);
        !          3148:                  pop_momentary ();
        !          3149:                  pop_implicit_try_blocks (NULL_TREE);
        !          3150:                  expand_end_bindings (getdecls (), kept_level_p (), 1);
        !          3151:                  poplevel (kept_level_p (), 1, 0);
        !          3152:                  pop_momentary ();
        !          3153:                  finish_stmt (); }
        !          3154:        | CASE expr_no_commas ':'
        !          3155:                { register tree value = $2;
        !          3156:                  register tree label
        !          3157:                    = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
        !          3158: 
        !          3159:                  /* build_c_cast puts on a NOP_EXPR to make a non-lvalue.
        !          3160:                     Strip such NOP_EXPRs.  */
        !          3161:                  if (TREE_CODE (value) == NOP_EXPR
        !          3162:                      && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0)))
        !          3163:                    value = TREE_OPERAND (value, 0);
        !          3164: 
        !          3165:                  if (TREE_READONLY_DECL_P (value))
        !          3166:                    {
        !          3167:                      value = decl_constant_value (value);
        !          3168:                      /* build_c_cast puts on a NOP_EXPR to make a non-lvalue.
        !          3169:                         Strip such NOP_EXPRs.  */
        !          3170:                      if (TREE_CODE (value) == NOP_EXPR
        !          3171:                          && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0)))
        !          3172:                        value = TREE_OPERAND (value, 0);
        !          3173:                    }
        !          3174:                  value = fold (value);
        !          3175: 
        !          3176:                  if (TREE_CODE (value) != INTEGER_CST
        !          3177:                      && value != error_mark_node)
        !          3178:                    {
        !          3179:                      cp_error ("case label `%E' does not reduce to an integer constant", $2);
        !          3180:                      value = error_mark_node;
        !          3181:                    }
        !          3182:                  else
        !          3183:                    /* Promote char or short to int.  */
        !          3184:                    value = default_conversion (value);
        !          3185:                  if (value != error_mark_node)
        !          3186:                    {
        !          3187:                      tree duplicate;
        !          3188:                      int success = pushcase (value, convert_and_check,
        !          3189:                                              label, &duplicate);
        !          3190:                      if (success == 1)
        !          3191:                        cp_error ("case label `%E' not within a switch statement", $2);
        !          3192:                      else if (success == 2)
        !          3193:                        {
        !          3194:                          cp_error ("duplicate case value `%E'", $2);
        !          3195:                          cp_error_at ("`%E' previously used here", duplicate);
        !          3196:                        }
        !          3197:                      else if (success == 3)
        !          3198:                        warning ("case value out of range");
        !          3199:                      else if (success == 5)
        !          3200:                        cp_error ("case label `%E' within scope of cleanup or variable array", $2);
        !          3201:                    }
        !          3202:                  define_case_label (label);
        !          3203:                }
        !          3204:          stmt
        !          3205:        | CASE expr_no_commas RANGE expr_no_commas ':'
        !          3206:                { register tree value1 = $2;
        !          3207:                  register tree value2 = $4;
        !          3208:                  register tree label
        !          3209:                    = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
        !          3210: 
        !          3211:                  if (pedantic)
        !          3212:                    pedwarn ("ANSI C++ forbids range expressions in switch statement");
        !          3213: 
        !          3214:                  /* build_c_cast puts on a NOP_EXPR to make a non-lvalue.
        !          3215:                     Strip such NOP_EXPRs.  */
        !          3216:                  if (TREE_CODE (value1) == NOP_EXPR
        !          3217:                      && TREE_TYPE (value1) == TREE_TYPE (TREE_OPERAND (value1, 0)))
        !          3218:                    value1 = TREE_OPERAND (value1, 0);
        !          3219: 
        !          3220:                  if (TREE_READONLY_DECL_P (value1))
        !          3221:                    {
        !          3222:                      value1 = decl_constant_value (value1);
        !          3223:                      /* build_c_cast puts on a NOP_EXPR to make a non-lvalue.
        !          3224:                         Strip such NOP_EXPRs.  */
        !          3225:                      if (TREE_CODE (value1) == NOP_EXPR
        !          3226:                          && TREE_TYPE (value1) == TREE_TYPE (TREE_OPERAND (value1, 0)))
        !          3227:                        value1 = TREE_OPERAND (value1, 0);
        !          3228:                    }
        !          3229:                  value1 = fold (value1);
        !          3230: 
        !          3231:                  /* build_c_cast puts on a NOP_EXPR to make a non-lvalue.
        !          3232:                     Strip such NOP_EXPRs.  */
        !          3233:                  if (TREE_CODE (value2) == NOP_EXPR
        !          3234:                      && TREE_TYPE (value2) == TREE_TYPE (TREE_OPERAND (value2, 0)))
        !          3235:                    value2 = TREE_OPERAND (value2, 0);
        !          3236: 
        !          3237:                  if (TREE_READONLY_DECL_P (value2))
        !          3238:                    {
        !          3239:                      value2 = decl_constant_value (value2);
        !          3240:                      /* build_c_cast puts on a NOP_EXPR to make a non-lvalue.
        !          3241:                         Strip such NOP_EXPRs.  */
        !          3242:                      if (TREE_CODE (value2) == NOP_EXPR
        !          3243:                          && TREE_TYPE (value2) == TREE_TYPE (TREE_OPERAND (value2, 0)))
        !          3244:                        value2 = TREE_OPERAND (value2, 0);
        !          3245:                    }
        !          3246:                  value2 = fold (value2);
        !          3247: 
        !          3248: 
        !          3249:                  if (TREE_CODE (value1) != INTEGER_CST
        !          3250:                      && value1 != error_mark_node)
        !          3251:                    {
        !          3252:                      error ("case label does not reduce to an integer constant");
        !          3253:                      value1 = error_mark_node;
        !          3254:                    }
        !          3255:                  if (TREE_CODE (value2) != INTEGER_CST
        !          3256:                      && value2 != error_mark_node)
        !          3257:                    {
        !          3258:                      error ("case label does not reduce to an integer constant");
        !          3259:                      value2 = error_mark_node;
        !          3260:                    }
        !          3261:                  if (value1 != error_mark_node
        !          3262:                      && value2 != error_mark_node)
        !          3263:                    {
        !          3264:                      tree duplicate;
        !          3265:                      int success = pushcase_range (value1, value2,
        !          3266:                                                    convert_and_check, label,
        !          3267:                                                    &duplicate);
        !          3268:                      if (success == 1)
        !          3269:                        error ("case label not within a switch statement");
        !          3270:                      else if (success == 2)
        !          3271:                        {
        !          3272:                          error ("duplicate (or overlapping) case value");
        !          3273:                          error_with_decl (duplicate, "this is the first entry overlapping that value");
        !          3274:                        }
        !          3275:                      else if (success == 3)
        !          3276:                        warning ("case value out of range");
        !          3277:                      else if (success == 4)
        !          3278:                        warning ("empty range specified");
        !          3279:                      else if (success == 5)
        !          3280:                        error ("case label within scope of cleanup or variable array");
        !          3281:                    }
        !          3282:                  define_case_label (label);
        !          3283:                }
        !          3284:          stmt
        !          3285:        | DEFAULT ':'
        !          3286:                {
        !          3287:                  tree duplicate;
        !          3288:                  register tree label
        !          3289:                    = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
        !          3290:                  int success = pushcase (NULL_TREE, 0, label, &duplicate);
        !          3291:                  if (success == 1)
        !          3292:                    error ("default label not within a switch statement");
        !          3293:                  else if (success == 2)
        !          3294:                    {
        !          3295:                      error ("multiple default labels in one switch");
        !          3296:                      error_with_decl (duplicate, "this is the first default label");
        !          3297:                    }
        !          3298:                  define_case_label (NULL_TREE);
        !          3299:                }
        !          3300:          stmt
        !          3301:        | BREAK ';'
        !          3302:                { emit_line_note (input_filename, lineno);
        !          3303:                  if ( ! expand_exit_something ())
        !          3304:                    error ("break statement not within loop or switch"); }
        !          3305:        | CONTINUE ';'
        !          3306:                { emit_line_note (input_filename, lineno);
        !          3307:                  if (! expand_continue_loop (0))
        !          3308:                    error ("continue statement not within a loop"); }
        !          3309:        | RETURN ';'
        !          3310:                { emit_line_note (input_filename, lineno);
        !          3311:                  c_expand_return (NULL_TREE); }
        !          3312:        | RETURN expr ';'
        !          3313:                { emit_line_note (input_filename, lineno);
        !          3314:                  c_expand_return ($2);
        !          3315:                  finish_stmt ();
        !          3316:                }
        !          3317:        | asm_keyword maybe_type_qual '(' string ')' ';'
        !          3318:                { if (TREE_CHAIN ($4)) $4 = combine_strings ($4);
        !          3319:                  emit_line_note (input_filename, lineno);
        !          3320:                  expand_asm ($4);
        !          3321:                  finish_stmt ();
        !          3322:                }
        !          3323:        /* This is the case with just output operands.  */
        !          3324:        | asm_keyword maybe_type_qual '(' string ':' asm_operands ')' ';'
        !          3325:                { if (TREE_CHAIN ($4)) $4 = combine_strings ($4);
        !          3326:                  emit_line_note (input_filename, lineno);
        !          3327:                  c_expand_asm_operands ($4, $6, NULL_TREE, NULL_TREE,
        !          3328:                                         $2 == ridpointers[(int)RID_VOLATILE],
        !          3329:                                         input_filename, lineno);
        !          3330:                  finish_stmt ();
        !          3331:                }
        !          3332:        /* This is the case with input operands as well.  */
        !          3333:        | asm_keyword maybe_type_qual '(' string ':' asm_operands ':' asm_operands ')' ';'
        !          3334:                { if (TREE_CHAIN ($4)) $4 = combine_strings ($4);
        !          3335:                  emit_line_note (input_filename, lineno);
        !          3336:                  c_expand_asm_operands ($4, $6, $8, NULL_TREE,
        !          3337:                                         $2 == ridpointers[(int)RID_VOLATILE],
        !          3338:                                         input_filename, lineno);
        !          3339:                  finish_stmt ();
        !          3340:                }
        !          3341:        /* This is the case with clobbered registers as well.  */
        !          3342:        | asm_keyword maybe_type_qual '(' string ':' asm_operands ':'
        !          3343:          asm_operands ':' asm_clobbers ')' ';'
        !          3344:                { if (TREE_CHAIN ($4)) $4 = combine_strings ($4);
        !          3345:                  emit_line_note (input_filename, lineno);
        !          3346:                  c_expand_asm_operands ($4, $6, $8, $10,
        !          3347:                                         $2 == ridpointers[(int)RID_VOLATILE],
        !          3348:                                         input_filename, lineno);
        !          3349:                  finish_stmt ();
        !          3350:                }
        !          3351:        | GOTO '*' expr ';'
        !          3352:                { emit_line_note (input_filename, lineno);
        !          3353:                  expand_computed_goto ($3); }
        !          3354:        | GOTO identifier ';'
        !          3355:                { tree decl;
        !          3356:                  emit_line_note (input_filename, lineno);
        !          3357:                  decl = lookup_label ($2);
        !          3358:                  TREE_USED (decl) = 1;
        !          3359:                  expand_goto (decl); }
        !          3360:        | label_colon stmt
        !          3361:                { finish_stmt (); }
        !          3362:        | label_colon '}'
        !          3363:                { error ("label must be followed by statement");
        !          3364:                  yyungetc ('}', 0);
        !          3365:                  finish_stmt (); }
        !          3366:        | ';'
        !          3367:                { finish_stmt (); }
        !          3368: 
        !          3369:        /* Exception handling extensions.  */
        !          3370:        | ANSI_THROW ';' { cplus_expand_throw (NULL_TREE); }
        !          3371:        | ANSI_THROW expr ';' { cplus_expand_throw ($2); }
        !          3372:        | THROW raise_identifier '(' nonnull_exprlist ')' ';'
        !          3373:                { cplus_expand_raise ($2, $4, NULL_TREE, 0);
        !          3374:                  finish_stmt (); }
        !          3375:        | THROW raise_identifier LEFT_RIGHT ';'
        !          3376:                { cplus_expand_raise ($2, NULL_TREE, NULL_TREE, 0);
        !          3377:                  finish_stmt (); }
        !          3378:        | RAISE raise_identifier '(' nonnull_exprlist ')' ';'
        !          3379:                { cplus_expand_raise ($2, $4, NULL_TREE, 0);
        !          3380:                  finish_stmt (); }
        !          3381:        | RAISE raise_identifier LEFT_RIGHT ';'
        !          3382:                { cplus_expand_raise ($2, NULL_TREE, NULL_TREE, 0);
        !          3383:                  finish_stmt (); }
        !          3384:        | RAISE identifier ';'
        !          3385:                { cplus_expand_reraise ($2);
        !          3386:                  finish_stmt (); }
        !          3387:        | try EXCEPT identifier '{'
        !          3388:                {
        !          3389:                  tree decl = cplus_expand_end_try ($1);
        !          3390:                  $<ttype>2 = current_exception_type;
        !          3391:                  $<ttype>4 = current_exception_decl;
        !          3392:                  $<ttype>$ = current_exception_object;
        !          3393:                  cplus_expand_start_except ($3, decl);
        !          3394:                  pushlevel (0);
        !          3395:                  clear_last_expr ();
        !          3396:                  push_momentary ();
        !          3397:                  expand_start_bindings (0);
        !          3398:                }
        !          3399:          except_stmts '}'
        !          3400:                {
        !          3401:                  tree decls = getdecls ();
        !          3402:                  /* If there is a default exception to handle,
        !          3403:                     handle it here.  */
        !          3404:                  if ($6)
        !          3405:                    {
        !          3406:                      tree decl = build_decl (CPLUS_CATCH_DECL, NULL_TREE, 0);
        !          3407:                      tree block;
        !          3408: 
        !          3409:                      pushlevel (1);
        !          3410:                      expand_start_bindings (0);
        !          3411:                      expand_expr ($6, 0, 0, 0);
        !          3412:                      expand_end_bindings (0, 1, 0);
        !          3413:                      block = poplevel (1, 0, 0);
        !          3414: 
        !          3415:                      /* This is a catch block.  */
        !          3416:                      TREE_LANG_FLAG_2 (block) = 1;
        !          3417:                      BLOCK_VARS (block) = decl;
        !          3418:                    }
        !          3419: 
        !          3420:                  expand_end_bindings (decls, decls != 0, 1);
        !          3421:                  poplevel (decls != 0, 1, 0);
        !          3422:                  pop_momentary ();
        !          3423:                  current_exception_type = $<ttype>2;
        !          3424:                  current_exception_decl = $<ttype>4;
        !          3425:                  current_exception_object = $<ttype>5;
        !          3426:                  cplus_expand_end_except ($6);
        !          3427:                }
        !          3428:        | try error
        !          3429:                {
        !          3430:                  cplus_expand_end_try ($1);
        !          3431:                  /* These are the important actions of
        !          3432:                     `cplus_expand_end_except' which we must emulate.  */
        !          3433:                  if (expand_escape_except ())
        !          3434:                    expand_end_except ();
        !          3435:                  expand_end_bindings (0, 0, 1);
        !          3436:                  poplevel (0, 0, 0);
        !          3437:                }
        !          3438:        | ansi_try ansi_dummy ansi_dummy
        !          3439:                {
        !          3440:                  tree decl = cplus_expand_end_try ($1);
        !          3441:                  $<ttype>2 = current_exception_type;
        !          3442:                  $<ttype>3 = current_exception_decl;
        !          3443:                  $<ttype>$ = current_exception_object;
        !          3444:                  cplus_expand_start_except (NULL, decl);
        !          3445:                  pushlevel (0);
        !          3446:                  clear_last_expr ();
        !          3447:                  push_momentary ();
        !          3448:                  expand_start_bindings (0);
        !          3449:                }
        !          3450:          ansi_except_stmts
        !          3451:                {
        !          3452:                  tree decls = getdecls ();
        !          3453:                  /* If there is a default exception to handle,
        !          3454:                     handle it here.  */
        !          3455:                  if ($5)
        !          3456:                    {
        !          3457:                      tree decl = build_decl (CPLUS_CATCH_DECL, NULL_TREE, 0);
        !          3458:                      tree block;
        !          3459: 
        !          3460:                      pushlevel (1);
        !          3461:                      expand_start_bindings (0);
        !          3462:                      expand_expr ($5, 0, 0, 0);
        !          3463:                      expand_end_bindings (0, 1, 0);
        !          3464:                      block = poplevel (1, 0, 0);
        !          3465: 
        !          3466:                      /* This is a catch block.  */
        !          3467:                      TREE_LANG_FLAG_2 (block) = 1;
        !          3468:                      BLOCK_VARS (block) = decl;
        !          3469:                    }
        !          3470: 
        !          3471:                  expand_end_bindings (decls, decls != 0, 1);
        !          3472:                  poplevel (decls != 0, 1, 0);
        !          3473:                  pop_momentary ();
        !          3474:                  current_exception_type = $<ttype>2;
        !          3475:                  current_exception_decl = $<ttype>3;
        !          3476:                  current_exception_object = $<ttype>4;
        !          3477:                  cplus_expand_end_except ($5);
        !          3478:                }
        !          3479:        | try RERAISE raise_identifiers /* ';' checked for at bottom.  */
        !          3480:                { tree name = get_identifier ("(compiler error)");
        !          3481:                  tree orig_ex_type = current_exception_type;
        !          3482:                  tree orig_ex_decl = current_exception_decl;
        !          3483:                  tree orig_ex_obj = current_exception_object;
        !          3484:                  tree decl = cplus_expand_end_try ($1), decls;
        !          3485: 
        !          3486:                  /* Start hidden EXCEPT.  */
        !          3487:                  cplus_expand_start_except (name, decl);
        !          3488:                  pushlevel (0);
        !          3489:                  clear_last_expr ();
        !          3490:                  push_momentary ();
        !          3491:                  expand_start_bindings (0);
        !          3492: 
        !          3493:                  /* This sets up the reraise.  */
        !          3494:                  cplus_expand_reraise ($3);
        !          3495: 
        !          3496:                  decls = getdecls ();
        !          3497:                  expand_end_bindings (decls, decls != 0, 1);
        !          3498:                  poplevel (decls != 0, 1, 0);
        !          3499:                  pop_momentary ();
        !          3500:                  current_exception_type = orig_ex_type;
        !          3501:                  current_exception_decl = orig_ex_decl;
        !          3502:                  current_exception_object = orig_ex_obj;
        !          3503:                  /* This will reraise for us.  */
        !          3504:                  cplus_expand_end_except (error_mark_node);
        !          3505:                  if (yychar == YYEMPTY)
        !          3506:                    yychar = YYLEX;
        !          3507:                  if (yychar != ';')
        !          3508:                    error ("missing ';' after reraise statement");
        !          3509:                }
        !          3510:        | try  %prec EMPTY
        !          3511:                { yyerror ("`except' missing after `try' statement");
        !          3512:                  /* Terminate the binding contour started by special
        !          3513:                     code in `.pushlevel'.  Automagically pops off
        !          3514:                     the conditional we started for `try' stmt.  */
        !          3515:                  cplus_expand_end_try ($1);
        !          3516:                  expand_end_bindings (0, 0, 1);
        !          3517:                  poplevel (0, 0, 0);
        !          3518:                  pop_momentary ();
        !          3519:                  YYERROR; }
        !          3520:        ;
        !          3521: 
        !          3522: try:     try_head '}'
        !          3523:                /* An empty try block is degenerate, but it's better to
        !          3524:                   do extra work here than to do all the special-case work
        !          3525:                   everywhere else.  */
        !          3526:                {
        !          3527:                  $$ = 1;
        !          3528:                  pop_implicit_try_blocks (NULL_TREE);
        !          3529:                }
        !          3530:        | try_head stmts '}'
        !          3531:                {
        !          3532:                  $$ = 1;
        !          3533:                  pop_implicit_try_blocks (NULL_TREE);
        !          3534:                }
        !          3535:        | try_head error '}'
        !          3536:                {
        !          3537:                  $$ = 0;
        !          3538:                  pop_implicit_try_blocks (NULL_TREE);
        !          3539:                }
        !          3540:        ;
        !          3541: 
        !          3542: label_colon:
        !          3543:          IDENTIFIER ':'
        !          3544:                { tree label;
        !          3545:                do_label:
        !          3546:                  label = define_label (input_filename, lineno, $1);
        !          3547:                  if (label)
        !          3548:                    expand_label (label);
        !          3549:                }
        !          3550:        | PTYPENAME ':'
        !          3551:                { goto do_label; }
        !          3552:        | TYPENAME_COLON
        !          3553:                { tree label = define_label (input_filename, lineno, $1);
        !          3554:                  if (label)
        !          3555:                    expand_label (label);
        !          3556:                }
        !          3557:        ;
        !          3558: 
        !          3559: try_head: TRY '{' { cplus_expand_start_try (0); } .pushlevel
        !          3560: 
        !          3561: ansi_try:        ansi_try_head '}'
        !          3562:                /* An empty try block is degenerate, but it's better to
        !          3563:                   do extra work here than to do all the special-case work
        !          3564:                   everywhere else.  */
        !          3565:                {
        !          3566:                  $$ = 1;
        !          3567:                  pop_implicit_try_blocks (NULL_TREE);
        !          3568:                }
        !          3569:        | ansi_try_head stmts '}'
        !          3570:                {
        !          3571:                  $$ = 1;
        !          3572:                  pop_implicit_try_blocks (NULL_TREE);
        !          3573:                }
        !          3574:        | ansi_try_head error '}'
        !          3575:                {
        !          3576:                  $$ = 0;
        !          3577:                  pop_implicit_try_blocks (NULL_TREE);
        !          3578:                }
        !          3579:        ;
        !          3580: 
        !          3581: ansi_dummy: ; /* Temporary place-holder. */
        !          3582: ansi_try_head: ANSI_TRY '{' { cplus_expand_start_try (0); } .pushlevel
        !          3583: 
        !          3584: except_stmts:
        !          3585:          /* empty */
        !          3586:                { $$ = NULL_TREE; }
        !          3587:        | except_stmts raise_identifier
        !          3588:                {
        !          3589:                  tree type = lookup_exception_type (current_class_type, current_class_name, $2);
        !          3590:                  if (type == NULL_TREE)
        !          3591:                    {
        !          3592:                      error ("`%s' is not an exception type",
        !          3593:                             IDENTIFIER_POINTER (TREE_VALUE ($2)));
        !          3594:                      current_exception_type = NULL_TREE;
        !          3595:                      TREE_TYPE (current_exception_object) = error_mark_node;
        !          3596:                    }
        !          3597:                  else
        !          3598:                    {
        !          3599:                      current_exception_type = type;
        !          3600:                      /* In-place union.  */
        !          3601:                      TREE_TYPE (current_exception_object) = type;
        !          3602:                    }
        !          3603:                  $2 = cplus_expand_start_catch ($2);
        !          3604:                  pushlevel (1);
        !          3605:                  expand_start_bindings (0);
        !          3606:                }
        !          3607:          compstmt
        !          3608:                {
        !          3609:                  expand_end_bindings (0, 1, 0);
        !          3610:                  $4 = poplevel (1, 0, 0);
        !          3611: 
        !          3612:                  cplus_expand_end_catch (0);
        !          3613: 
        !          3614:                  /* Mark this as a catch block.  */
        !          3615:                  TREE_LANG_FLAG_2 ($4) = 1;
        !          3616:                  if ($2 != error_mark_node)
        !          3617:                    {
        !          3618:                      tree decl = build_decl (CPLUS_CATCH_DECL, DECL_NAME ($2), 0);
        !          3619:                      DECL_RTL (decl) = DECL_RTL ($2);
        !          3620:                      TREE_CHAIN (decl) = BLOCK_VARS ($4);
        !          3621:                      BLOCK_VARS ($4) = decl;
        !          3622:                    }
        !          3623:                }
        !          3624:        | except_stmts DEFAULT
        !          3625:                {
        !          3626:                  if ($1)
        !          3627:                    error ("duplicate default in exception handler");
        !          3628:                  current_exception_type = NULL_TREE;
        !          3629:                  /* Takes it right out of scope.  */
        !          3630:                  TREE_TYPE (current_exception_object) = error_mark_node;
        !          3631: 
        !          3632:                  if (! expand_catch_default ())
        !          3633:                    compiler_error ("default catch botch");
        !          3634: 
        !          3635:                  /* The default exception is handled as the
        !          3636:                     last in the chain of exceptions handled.  */
        !          3637:                  do_pending_stack_adjust ();
        !          3638:                  $1 = make_node (RTL_EXPR);
        !          3639:                  TREE_TYPE ($1) = void_type_node;
        !          3640:                  start_sequence_for_rtl_expr ($1);
        !          3641:                }
        !          3642:          compstmt
        !          3643:                {
        !          3644:                  extern struct rtx_def *get_insns ();
        !          3645:                  do_pending_stack_adjust ();
        !          3646:                  if (! expand_catch (NULL_TREE))
        !          3647:                    compiler_error ("except nesting botch");
        !          3648:                  if (! expand_end_catch ())
        !          3649:                    compiler_error ("except nesting botch");
        !          3650:                  RTL_EXPR_SEQUENCE ($1) = get_insns ();
        !          3651:                  if ($4)
        !          3652:                    {
        !          3653:                      /* Mark this block as the default catch block.  */
        !          3654:                      TREE_LANG_FLAG_1 ($4) = 1;
        !          3655:                      TREE_LANG_FLAG_2 ($4) = 1;
        !          3656:                    }
        !          3657:                  end_sequence ();
        !          3658:                }
        !          3659:        ;
        !          3660: 
        !          3661: optional_identifier:
        !          3662:          /* empty */
        !          3663:                { $$ = NULL_TREE; }
        !          3664:        | identifier ;
        !          3665: 
        !          3666: ansi_except_stmts:
        !          3667:          /* empty */
        !          3668:                { $$ = NULL_TREE; }
        !          3669:        | ansi_except_stmts CATCH '(' typename optional_identifier ')'
        !          3670:                {
        !          3671:                  tree type = groktypename ($4);
        !          3672:                  current_exception_type = type;
        !          3673:                  /* In-place union.  */
        !          3674:                  if ($5)
        !          3675:                    {
        !          3676:                      tree tmp;
        !          3677:                      tmp = pushdecl (build_decl (VAR_DECL, $5, type));
        !          3678:                      current_exception_object =
        !          3679:                          build1 (INDIRECT_REF, type, tmp);
        !          3680:                     }
        !          3681:                  $4 = ansi_expand_start_catch(type);
        !          3682:                  pushlevel (1);
        !          3683:                  expand_start_bindings (0);
        !          3684:                }
        !          3685:          compstmt
        !          3686:                {
        !          3687:                  expand_end_bindings (0, 1, 0);
        !          3688:                  $8 = poplevel (1, 0, 0);
        !          3689: 
        !          3690:                  cplus_expand_end_catch (0);
        !          3691: 
        !          3692:                  /* Mark this as a catch block.  */
        !          3693:                  TREE_LANG_FLAG_2 ($8) = 1;
        !          3694:                  if ($4 != error_mark_node)
        !          3695:                    {
        !          3696:                      tree decl = build_decl (CPLUS_CATCH_DECL, DECL_NAME ($4), 0);
        !          3697:                      DECL_RTL (decl) = DECL_RTL ($4);
        !          3698:                      TREE_CHAIN (decl) = BLOCK_VARS ($8);
        !          3699:                      BLOCK_VARS ($8) = decl;
        !          3700:                    }
        !          3701:                }
        !          3702:        ;
        !          3703: 
        !          3704: forhead.1:
        !          3705:          FOR '(' ';'
        !          3706:                { $$ = NULL_TREE; }
        !          3707:        | FOR '(' expr ';'
        !          3708:                { $$ = $3; }
        !          3709:        | FOR '(' '{' '}'
        !          3710:                { $$ = NULL_TREE; }
        !          3711:        ;
        !          3712: 
        !          3713: forhead.2:
        !          3714:          FOR '(' decl
        !          3715:                { $$ = 0; }
        !          3716:        | FOR '(' error ';'
        !          3717:                { $$ = 0; }
        !          3718:        | FOR '(' '{' .pushlevel stmts '}'
        !          3719:                { $$ = 1; }
        !          3720:        | FOR '(' '{' .pushlevel error '}'
        !          3721:                { $$ = -1; }
        !          3722:        ;
        !          3723: 
        !          3724: /* Either a type-qualifier or nothing.  First thing in an `asm' statement.  */
        !          3725: 
        !          3726: maybe_type_qual:
        !          3727:        /* empty */
        !          3728:                { emit_line_note (input_filename, lineno); 
        !          3729:                   $$ = NULL_TREE; }
        !          3730:        | TYPE_QUAL
        !          3731:                { emit_line_note (input_filename, lineno); }
        !          3732:        ;
        !          3733: 
        !          3734: xexpr:
        !          3735:        /* empty */
        !          3736:                { $$ = NULL_TREE; }
        !          3737:        | expr
        !          3738:        | error
        !          3739:                { $$ = NULL_TREE; }
        !          3740:        ;
        !          3741: 
        !          3742: /* These are the operands other than the first string and colon
        !          3743:    in  asm ("addextend %2,%1": "=dm" (x), "0" (y), "g" (*x))  */
        !          3744: asm_operands: /* empty */
        !          3745:                { $$ = NULL_TREE; }
        !          3746:        | nonnull_asm_operands
        !          3747:        ;
        !          3748: 
        !          3749: nonnull_asm_operands:
        !          3750:          asm_operand
        !          3751:        | nonnull_asm_operands ',' asm_operand
        !          3752:                { $$ = chainon ($$, $3); }
        !          3753:        ;
        !          3754: 
        !          3755: asm_operand:
        !          3756:          STRING '(' expr ')'
        !          3757:                { $$ = build_tree_list ($$, $3); }
        !          3758:        ;
        !          3759: 
        !          3760: asm_clobbers:
        !          3761:          STRING
        !          3762:                { $$ = tree_cons (NULL_TREE, $$, NULL_TREE); }
        !          3763:        | asm_clobbers ',' STRING
        !          3764:                { $$ = tree_cons (NULL_TREE, $3, $$); }
        !          3765:        ;
        !          3766: 
        !          3767: /* This is what appears inside the parens in a function declarator.
        !          3768:    Its value is represented in the format that grokdeclarator expects.
        !          3769: 
        !          3770:    In C++, declaring a function with no parameters
        !          3771:    means that that function takes *no* parameters.  */
        !          3772: parmlist:  /* empty */
        !          3773:                {
        !          3774:                  if (strict_prototype)
        !          3775:                    $$ = void_list_node;
        !          3776:                  else
        !          3777:                    $$ = NULL_TREE;
        !          3778:                }
        !          3779:        | parms
        !          3780:                {
        !          3781:                  $$ = chainon ($$, void_list_node);
        !          3782:                  TREE_PARMLIST ($$) = 1;
        !          3783:                }
        !          3784:        | parms ',' ELLIPSIS
        !          3785:                {
        !          3786:                  TREE_PARMLIST ($$) = 1;
        !          3787:                }
        !          3788:        /* C++ allows an ellipsis without a separating ',' */
        !          3789:        | parms ELLIPSIS
        !          3790:                {
        !          3791:                  TREE_PARMLIST ($$) = 1;
        !          3792:                }
        !          3793:        | ELLIPSIS
        !          3794:                {
        !          3795:                  /* ARM $8.2.5 has this as a boxed-off comment.  */
        !          3796:                  if (pedantic)
        !          3797:                    warning ("use of `...' without a first argument is non-portable");
        !          3798:                  $$ = NULL_TREE;
        !          3799:                }
        !          3800:        | TYPENAME_ELLIPSIS
        !          3801:                {
        !          3802:                  TREE_PARMLIST ($$) = 1;
        !          3803:                }
        !          3804:        | parms TYPENAME_ELLIPSIS
        !          3805:                {
        !          3806:                  TREE_PARMLIST ($$) = 1;
        !          3807:                }
        !          3808:        | parms ':'
        !          3809:                {
        !          3810:                  /* This helps us recover from really nasty
        !          3811:                     parse errors, for example, a missing right
        !          3812:                     parenthesis.  */
        !          3813:                  yyerror ("possibly missing ')'");
        !          3814:                  $$ = chainon ($$, void_list_node);
        !          3815:                  TREE_PARMLIST ($$) = 1;
        !          3816:                  yyungetc (':', 0);
        !          3817:                  yychar = ')';
        !          3818:                }
        !          3819:        ;
        !          3820: 
        !          3821: /* A nonempty list of parameter declarations or type names.  */
        !          3822: parms:
        !          3823:          parm
        !          3824:                { $$ = build_tree_list (NULL_TREE, $$); }
        !          3825:        | parm '=' init
        !          3826:                { $$ = build_tree_list ($3, $$); }
        !          3827:        | parms ',' parm
        !          3828:                { $$ = chainon ($$, build_tree_list (NULL_TREE, $3)); }
        !          3829:        | parms ',' parm '=' init
        !          3830:                { $$ = chainon ($$, build_tree_list ($5, $3)); }
        !          3831:        | parms ',' bad_parm
        !          3832:                { $$ = chainon ($$, build_tree_list (NULL_TREE, $3)); }
        !          3833:        | parms ',' bad_parm '=' init
        !          3834:                { $$ = chainon ($$, build_tree_list ($5, $3)); }
        !          3835:        ;
        !          3836: 
        !          3837: /* A single parameter declaration or parameter type name,
        !          3838:    as found in a parmlist.  The first four cases make up for 10%
        !          3839:    of the time spent parsing C++.  We cannot use them because
        !          3840:    of `int id[]' which won't get parsed properly.  */
        !          3841: parm:
        !          3842: /*
        !          3843:          typed_declspecs dont_see_typename '*' IDENTIFIER
        !          3844:                { $$ = build_tree_list ($$, build_parse_node (INDIRECT_REF, $4));
        !          3845:                  see_typename (); }
        !          3846:        | typed_declspecs dont_see_typename '&' IDENTIFIER
        !          3847:                { $$ = build_tree_list ($$, build_parse_node (ADDR_EXPR, $4));
        !          3848:                  see_typename (); }
        !          3849:        | TYPENAME IDENTIFIER
        !          3850:                { $$ = build_tree_list (list_hash_lookup_or_cons ($$), $2);  }
        !          3851:        | TYPESPEC IDENTIFIER
        !          3852:                { $$ = build_tree_list (list_hash_lookup_or_cons ($$), $2); }
        !          3853:        | */
        !          3854:          typed_declspecs dont_see_typename abs_or_notype_decl
        !          3855:                { $$ = build_tree_list ($$, $3);
        !          3856:                  see_typename (); }
        !          3857:        | declmods dont_see_typename abs_or_notype_decl
        !          3858:                { $$ = build_tree_list ($$, $3);
        !          3859:                  see_typename (); }
        !          3860:        ;
        !          3861: 
        !          3862: abs_or_notype_decl: absdcl
        !          3863:        | notype_declarator
        !          3864:        | START_DECLARATOR notype_declarator
        !          3865:                { $$ = $2; }
        !          3866:        ;
        !          3867: 
        !          3868: see_typename: type_quals
        !          3869:        { see_typename (); }
        !          3870:        ;
        !          3871: 
        !          3872: dont_see_typename: /* empty */
        !          3873:        { dont_see_typename (); }
        !          3874:        ;
        !          3875: 
        !          3876: /*
        !          3877: try_for_typename:
        !          3878:         {
        !          3879:          if ($<ttype>-1 == error_mark_node)
        !          3880:             $$ = 0;
        !          3881:           else
        !          3882:             {
        !          3883:               $$ = 1;
        !          3884:               pushclass ($<ttype>-1, 1);
        !          3885:             }
        !          3886:         }
        !          3887:        ;
        !          3888: */
        !          3889: 
        !          3890: bad_parm:
        !          3891:          abs_or_notype_decl
        !          3892:                {
        !          3893:                  warning ("type specifier omitted for parameter");
        !          3894:                  $$ = build_tree_list (TREE_PURPOSE (TREE_VALUE ($<ttype>-1)), $$);
        !          3895:                }
        !          3896:        ;
        !          3897: 
        !          3898: maybe_raises:
        !          3899:          /* empty */
        !          3900:                { $$ = NULL_TREE; }
        !          3901:        | RAISES raise_identifiers  %prec EMPTY
        !          3902:                { $$ = $2; }
        !          3903:        | ANSI_THROW '(' ansi_raise_identifiers  ')' %prec EMPTY
        !          3904:                { $$ = $3; }
        !          3905:        ;
        !          3906: 
        !          3907: raise_identifier:
        !          3908:          ALL
        !          3909:                { $$ = void_list_node; }
        !          3910:        | IDENTIFIER
        !          3911:                { $$ = build_decl_list (NULL_TREE, $$); }
        !          3912:        | TYPENAME
        !          3913:                { $$ = build_decl_list (NULL_TREE, $$); }
        !          3914:        | SCOPE IDENTIFIER
        !          3915:                { $$ = build_decl_list (void_type_node, $2); }
        !          3916:        | SCOPE TYPENAME
        !          3917:                { $$ = build_decl_list (void_type_node, $2); }
        !          3918: %ifobjc
        !          3919:        | OBJECTNAME
        !          3920:                { $$ = build_decl_list (NULL_TREE, $$); }
        !          3921: %endifobjc
        !          3922:        | id_scope IDENTIFIER
        !          3923:                { $$ = build_decl_list ($$, $2); }
        !          3924:        | scoped_typename
        !          3925:        ;
        !          3926: 
        !          3927: ansi_raise_identifier:
        !          3928:          typename
        !          3929:                { $$ = build_decl_list (NULL_TREE, $$); }
        !          3930:        ;
        !          3931: 
        !          3932: raise_identifiers:
        !          3933:          raise_identifier
        !          3934:        | raise_identifiers ',' raise_identifier
        !          3935:                {
        !          3936:                  TREE_CHAIN ($3) = $$;
        !          3937:                  $$ = $3;
        !          3938:                }
        !          3939:        ;
        !          3940: 
        !          3941: ansi_raise_identifiers:
        !          3942:          ansi_raise_identifier
        !          3943:        | ansi_raise_identifiers ',' ansi_raise_identifier
        !          3944:                {
        !          3945:                  TREE_CHAIN ($3) = $$;
        !          3946:                  $$ = $3;
        !          3947:                }
        !          3948:        ;
        !          3949: 
        !          3950: operator_name:
        !          3951:          OPERATOR '*'
        !          3952:                { $$ = ansi_opname[MULT_EXPR]; }
        !          3953:        | OPERATOR '/'
        !          3954:                { $$ = ansi_opname[TRUNC_DIV_EXPR]; }
        !          3955:        | OPERATOR '%'
        !          3956:                { $$ = ansi_opname[TRUNC_MOD_EXPR]; }
        !          3957:        | OPERATOR '+'
        !          3958:                { $$ = ansi_opname[PLUS_EXPR]; }
        !          3959:        | OPERATOR '-'
        !          3960:                { $$ = ansi_opname[MINUS_EXPR]; }
        !          3961:        | OPERATOR '&'
        !          3962:                { $$ = ansi_opname[BIT_AND_EXPR]; }
        !          3963:        | OPERATOR '|'
        !          3964:                { $$ = ansi_opname[BIT_IOR_EXPR]; }
        !          3965:        | OPERATOR '^'
        !          3966:                { $$ = ansi_opname[BIT_XOR_EXPR]; }
        !          3967:        | OPERATOR '~'
        !          3968:                { $$ = ansi_opname[BIT_NOT_EXPR]; }
        !          3969:        | OPERATOR ','
        !          3970:                { $$ = ansi_opname[COMPOUND_EXPR]; }
        !          3971:        | OPERATOR ARITHCOMPARE
        !          3972:                { $$ = ansi_opname[$2]; }
        !          3973:        | OPERATOR '<'
        !          3974:                { $$ = ansi_opname[LT_EXPR]; }
        !          3975:        | OPERATOR '>'
        !          3976:                { $$ = ansi_opname[GT_EXPR]; }
        !          3977:        | OPERATOR EQCOMPARE
        !          3978:                { $$ = ansi_opname[$2]; }
        !          3979:        | OPERATOR ASSIGN
        !          3980:                { $$ = ansi_assopname[$2]; }
        !          3981:        | OPERATOR '='
        !          3982:                {
        !          3983:                  $$ = ansi_opname [MODIFY_EXPR];
        !          3984:                  if (current_class_type)
        !          3985:                    {
        !          3986:                      TYPE_HAS_ASSIGNMENT (current_class_type) = 1;
        !          3987:                      TYPE_GETS_ASSIGNMENT (current_class_type) = 1;
        !          3988:                    }
        !          3989:                }
        !          3990:        | OPERATOR LSHIFT
        !          3991:                { $$ = ansi_opname[$2]; }
        !          3992:        | OPERATOR RSHIFT
        !          3993:                { $$ = ansi_opname[$2]; }
        !          3994:        | OPERATOR PLUSPLUS
        !          3995:                { $$ = ansi_opname[POSTINCREMENT_EXPR]; }
        !          3996:        | OPERATOR MINUSMINUS
        !          3997:                { $$ = ansi_opname[PREDECREMENT_EXPR]; }
        !          3998:        | OPERATOR ANDAND
        !          3999:                { $$ = ansi_opname[TRUTH_ANDIF_EXPR]; }
        !          4000:        | OPERATOR OROR
        !          4001:                { $$ = ansi_opname[TRUTH_ORIF_EXPR]; }
        !          4002:        | OPERATOR '!'
        !          4003:                { $$ = ansi_opname[TRUTH_NOT_EXPR]; }
        !          4004:        | OPERATOR '?' ':'
        !          4005:                { $$ = ansi_opname[COND_EXPR]; }
        !          4006:        | OPERATOR MIN_MAX
        !          4007:                { $$ = ansi_opname[$2]; }
        !          4008:        | OPERATOR POINTSAT  %prec EMPTY
        !          4009:                { $$ = ansi_opname[COMPONENT_REF];
        !          4010:                  if (current_class_type)
        !          4011:                    {
        !          4012:                      tree t = current_class_type;
        !          4013:                      while (t)
        !          4014:                        {
        !          4015:                          TYPE_OVERLOADS_ARROW (t) = 1;
        !          4016:                          t = TYPE_NEXT_VARIANT (t);
        !          4017:                        }
        !          4018:                    }
        !          4019:                }
        !          4020:        | OPERATOR POINTSAT_STAR  %prec EMPTY
        !          4021:                { $$ = ansi_opname[MEMBER_REF];
        !          4022:                  if (current_class_type)
        !          4023:                    {
        !          4024:                      tree t = current_class_type;
        !          4025:                      while (t)
        !          4026:                        {
        !          4027:                          TYPE_OVERLOADS_ARROW (t) = 1;
        !          4028:                          t = TYPE_NEXT_VARIANT (t);
        !          4029:                        }
        !          4030:                    }
        !          4031:                }
        !          4032:        | OPERATOR LEFT_RIGHT
        !          4033:                { $$ = ansi_opname[CALL_EXPR];
        !          4034:                  if (current_class_type)
        !          4035:                    {
        !          4036:                      tree t = current_class_type;
        !          4037:                      while (t)
        !          4038:                        {
        !          4039:                          TYPE_OVERLOADS_CALL_EXPR (t) = 1;
        !          4040:                          t = TYPE_NEXT_VARIANT (t);
        !          4041:                        }
        !          4042:                    }
        !          4043:                }
        !          4044:        | OPERATOR '[' ']'
        !          4045:                { $$ = ansi_opname[ARRAY_REF];
        !          4046:                  if (current_class_type)
        !          4047:                    {
        !          4048:                      tree t = current_class_type;
        !          4049:                      while (t)
        !          4050:                        {
        !          4051:                          TYPE_OVERLOADS_ARRAY_REF (t) = 1;
        !          4052:                          t = TYPE_NEXT_VARIANT (t);
        !          4053:                        }
        !          4054:                    }
        !          4055:                }
        !          4056:        | OPERATOR NEW
        !          4057:                {
        !          4058:                  $$ = ansi_opname[NEW_EXPR];
        !          4059:                  if (current_class_type)
        !          4060:                    {
        !          4061:                      tree t = current_class_type;
        !          4062:                      while (t)
        !          4063:                        {
        !          4064:                          TREE_GETS_NEW (t) = 1;
        !          4065:                          t = TYPE_NEXT_VARIANT (t);
        !          4066:                        }
        !          4067:                    }
        !          4068:                }
        !          4069: /*
        !          4070:        | OPERATOR NEW '[' ']'
        !          4071:                {
        !          4072:                  $$ = ansi_opname[VEC_NEW_EXPR];
        !          4073:                  if (current_class_type)
        !          4074:                    {
        !          4075:                      tree t = current_class_type;
        !          4076:                      while (t)
        !          4077:                        {
        !          4078:                          TREE_GETS_VEC_NEW (t) = 1;
        !          4079:                          t = TYPE_NEXT_VARIANT (t);
        !          4080:                        }
        !          4081:                    }
        !          4082:                }
        !          4083: */
        !          4084:        | OPERATOR DELETE
        !          4085:                {
        !          4086:                  $$ = ansi_opname[DELETE_EXPR];
        !          4087:                  if (current_class_type)
        !          4088:                    {
        !          4089:                      tree t = current_class_type;
        !          4090:                      while (t)
        !          4091:                        {
        !          4092:                          TREE_GETS_DELETE (t) = 1;
        !          4093:                          t = TYPE_NEXT_VARIANT (t);
        !          4094:                        }
        !          4095:                    }
        !          4096:                }
        !          4097: /*
        !          4098:        | OPERATOR DELETE '[' ']'
        !          4099:                {
        !          4100:                  $$ = ansi_opname[VEC_DELETE_EXPR];
        !          4101:                  if (current_class_type)
        !          4102:                    {
        !          4103:                      tree t = current_class_type;
        !          4104:                      while (t)
        !          4105:                        {
        !          4106:                          TREE_GETS_VEC_DELETE (t) = 1;
        !          4107:                          t = TYPE_NEXT_VARIANT (t);
        !          4108:                        }
        !          4109:                    }
        !          4110:                }
        !          4111: */
        !          4112: 
        !          4113:        /* These should do `groktypename' and set up TREE_HAS_X_CONVERSION
        !          4114:           here, rather than doing it in class.c .  */
        !          4115:        | OPERATOR typed_typespecs absdcl
        !          4116:                { $$ = build1 (TYPE_EXPR, $2, $3); }
        !          4117:        | OPERATOR error
        !          4118:                { $$ = ansi_opname[ERROR_MARK]; }
        !          4119:        ;
        !          4120: 
        !          4121: 
        !          4122: /*
        !          4123:  *     Objective-C productions.
        !          4124:  */
        !          4125:  
        !          4126: /* records the type and storage class specs to use for processing
        !          4127:    the declarators that follow */
        !          4128:    
        !          4129: %ifobjc
        !          4130: .setspecs: /* empty */
        !          4131:                { current_declspecs = $<ttype>0;
        !          4132:                  $<itype>$ = suspend_momentary (); }
        !          4133:        ;
        !          4134: 
        !          4135: objcdef:
        !          4136:          classdef
        !          4137:        | classdecl
        !          4138:        | protocoldecl
        !          4139:        | aliasdecl
        !          4140:        | protocoldef
        !          4141:        | methoddef
        !          4142:        | END
        !          4143:                {
        !          4144:                  if (objc_implementation_context)
        !          4145:                     {
        !          4146:                    finish_class(objc_implementation_context);    
        !          4147:                    objc_ivar_chain = NULL_TREE;
        !          4148:                    objc_implementation_context = NULL_TREE;
        !          4149:                    }
        !          4150:                  else
        !          4151:                    warning("`@end' must appear in an implementation context");
        !          4152:                }
        !          4153:        ;
        !          4154: 
        !          4155: /* A nonempty list of identifiers.  */
        !          4156: identifier_list:
        !          4157:          identifier
        !          4158:                { $$ = build_tree_list (NULL_TREE, $1); }
        !          4159:        | identifier_list ',' identifier
        !          4160:                { $$ = chainon ($1, build_tree_list (NULL_TREE, $3)); }
        !          4161:        ;
        !          4162: 
        !          4163: classdecl:
        !          4164:          CLASS identifier_list ';'
        !          4165:                {
        !          4166:                  objc_declare_class ($2);
        !          4167:                }
        !          4168: 
        !          4169: protocoldecl:
        !          4170:          PROTOCOL identifier_list ';'
        !          4171:                {
        !          4172:                  objc_declare_protocols ($2);
        !          4173:                }
        !          4174: 
        !          4175: aliasdecl:
        !          4176:          ALIAS identifier identifier ';'
        !          4177:                {
        !          4178:                  objc_declare_alias ($2, $3);
        !          4179:                }
        !          4180: 
        !          4181: /* This is necessary for living in this c++ parser */
        !          4182: identifier_colon:
        !          4183:          identifier ':'
        !          4184:                { $$ = $1 }
        !          4185:        | TYPENAME_COLON
        !          4186:        ;
        !          4187: 
        !          4188: classdef:
        !          4189:          INTERFACE identifier protocolrefs '{'
        !          4190:                {
        !          4191:                  objc_interface_context = objc_ivar_context
        !          4192:                    = start_class (CLASS_INTERFACE_TYPE, $2, NULL_TREE, $3);
        !          4193:                   objc_public_flag = 0;
        !          4194:                }
        !          4195:          ivar_decl_list '}'
        !          4196:                {
        !          4197:                   continue_class (objc_interface_context);
        !          4198:                }
        !          4199:          methodprotolist
        !          4200:          END
        !          4201:                {
        !          4202:                  finish_class (objc_interface_context);
        !          4203:                  objc_interface_context = NULL_TREE;
        !          4204:                }
        !          4205: 
        !          4206:        | INTERFACE identifier protocolrefs
        !          4207:                {
        !          4208:                  objc_interface_context
        !          4209:                    = start_class (CLASS_INTERFACE_TYPE, $2, NULL_TREE, $3);
        !          4210:                   continue_class (objc_interface_context);
        !          4211:                }
        !          4212:          methodprotolist
        !          4213:          END
        !          4214:                { 
        !          4215:                  finish_class(objc_interface_context);    
        !          4216:                  objc_interface_context = NULL_TREE; 
        !          4217:                }
        !          4218: 
        !          4219:        | INTERFACE identifier_colon identifier protocolrefs '{'
        !          4220:                {
        !          4221:                  objc_interface_context = objc_ivar_context
        !          4222:                    = start_class (CLASS_INTERFACE_TYPE, $2, $3, $4);
        !          4223:                   objc_public_flag = 0;
        !          4224:                }
        !          4225:          ivar_decl_list '}'
        !          4226:                {
        !          4227:                   continue_class (objc_interface_context);
        !          4228:                }
        !          4229:          methodprotolist
        !          4230:          END
        !          4231:                { 
        !          4232:                  finish_class(objc_interface_context);    
        !          4233:                  objc_interface_context = NULL_TREE; 
        !          4234:                }
        !          4235: 
        !          4236:        | INTERFACE identifier_colon identifier protocolrefs
        !          4237:                {
        !          4238:                  objc_interface_context
        !          4239:                    = start_class (CLASS_INTERFACE_TYPE, $2, $3, $4);
        !          4240:                   continue_class (objc_interface_context);
        !          4241:                }
        !          4242:          methodprotolist
        !          4243:          END
        !          4244:                {
        !          4245:                  finish_class (objc_interface_context);
        !          4246:                  objc_interface_context = NULL_TREE;
        !          4247:                }
        !          4248: 
        !          4249:        | IMPLEMENTATION identifier '{'
        !          4250:                {
        !          4251:                  objc_implementation_context = objc_ivar_context
        !          4252:                    = start_class (CLASS_IMPLEMENTATION_TYPE, $2, NULL_TREE, NULL_TREE);
        !          4253:                   objc_public_flag = 0;
        !          4254:                }
        !          4255:          ivar_decl_list '}'
        !          4256:                {
        !          4257:                   objc_ivar_chain
        !          4258:                    = continue_class (objc_implementation_context);
        !          4259:                }
        !          4260: 
        !          4261:        | IMPLEMENTATION identifier
        !          4262:                {
        !          4263:                  objc_implementation_context
        !          4264:                    = start_class (CLASS_IMPLEMENTATION_TYPE, $2, NULL_TREE, NULL_TREE);
        !          4265:                   objc_ivar_chain
        !          4266:                    = continue_class (objc_implementation_context);
        !          4267:                }
        !          4268: 
        !          4269:        | IMPLEMENTATION identifier_colon identifier '{'
        !          4270:                {
        !          4271:                  objc_implementation_context = objc_ivar_context
        !          4272:                    = start_class (CLASS_IMPLEMENTATION_TYPE, $2, $3, NULL_TREE);
        !          4273:                   objc_public_flag = 0;
        !          4274:                }
        !          4275:          ivar_decl_list '}'
        !          4276:                {
        !          4277:                   objc_ivar_chain
        !          4278:                    = continue_class (objc_implementation_context);
        !          4279:                }
        !          4280: 
        !          4281:        | IMPLEMENTATION identifier_colon identifier
        !          4282:                {
        !          4283:                  objc_implementation_context
        !          4284:                    = start_class (CLASS_IMPLEMENTATION_TYPE, $2, $3, NULL_TREE);
        !          4285:                   objc_ivar_chain
        !          4286:                    = continue_class (objc_implementation_context);
        !          4287:                }
        !          4288: 
        !          4289:        | INTERFACE identifier '(' identifier ')' protocolrefs
        !          4290:                {
        !          4291:                  objc_interface_context
        !          4292:                    = start_class (CATEGORY_INTERFACE_TYPE, $2, $4, $6);
        !          4293:                   continue_class (objc_interface_context);
        !          4294:                }
        !          4295:          methodprotolist
        !          4296:          END
        !          4297:                {
        !          4298:                  finish_class (objc_interface_context);
        !          4299:                  objc_interface_context = NULL_TREE;
        !          4300:                }
        !          4301: 
        !          4302:        | IMPLEMENTATION identifier '(' identifier ')'
        !          4303:                {
        !          4304:                  objc_implementation_context
        !          4305:                    = start_class (CATEGORY_IMPLEMENTATION_TYPE, $2, $4, NULL_TREE);
        !          4306:                   objc_ivar_chain
        !          4307:                    = continue_class (objc_implementation_context);
        !          4308:                }
        !          4309:        ;
        !          4310: 
        !          4311: protocoldef:
        !          4312:          PROTOCOL identifier protocolrefs
        !          4313:                {
        !          4314:                objc_interface_context = 
        !          4315:                        start_protocol(PROTOCOL_INTERFACE_TYPE, $2, $3);
        !          4316:                }
        !          4317:          methodprotolist
        !          4318:          END
        !          4319:                {
        !          4320:                finish_protocol(objc_interface_context);
        !          4321:                objc_interface_context = NULL_TREE;
        !          4322:                }
        !          4323:        ;
        !          4324: 
        !          4325: ivar_decl_list:   
        !          4326:           ivar_decl_list visibility_spec ivar_decls
        !          4327:         | ivar_decls
        !          4328:         ;
        !          4329: 
        !          4330: visibility_spec:
        !          4331:          PUBLIC     { objc_public_flag = 1; }
        !          4332:        | PRIVATE    { objc_public_flag = 2; }
        !          4333:        | PROTECTED  { objc_public_flag = 0; }
        !          4334:        ;
        !          4335: 
        !          4336: ivar_decls:
        !          4337:           /* empty */
        !          4338:                { 
        !          4339:                   $$ = NULL_TREE; 
        !          4340:                 }
        !          4341:        | ivar_decls ivar_decl ';'
        !          4342:        | ivar_decls ';'
        !          4343:                { 
        !          4344:                   if (pedantic) 
        !          4345:                    warning ("extra semicolon in struct or union specified"); 
        !          4346:                 }
        !          4347:        ;
        !          4348: 
        !          4349: ivar_decl:
        !          4350:        typed_typespecs .setspecs ivars
        !          4351:                { 
        !          4352:                   $$ = $3;
        !          4353:                  resume_momentary ($<itype>2);
        !          4354:                 }
        !          4355:        | nonempty_type_quals .setspecs ivars
        !          4356:                { 
        !          4357:                   $$ = $3;
        !          4358:                  resume_momentary ($<itype>2);
        !          4359:                 }
        !          4360:        | error
        !          4361:                { $$ = NULL_TREE; }
        !          4362:        ;
        !          4363: 
        !          4364: ivars:
        !          4365:          /* empty */
        !          4366:                { $$ = NULL_TREE; }
        !          4367:        | ivar_declarator
        !          4368:        | ivars ',' ivar_declarator
        !          4369:        ;
        !          4370: 
        !          4371: ivar_declarator:
        !          4372:          declarator
        !          4373:                { 
        !          4374:                 $$ = add_instance_variable(objc_ivar_context, objc_public_flag,
        !          4375:                            $1, current_declspecs, NULL_TREE); 
        !          4376:                 }
        !          4377:        | declarator ':' expr_no_commas
        !          4378:                { 
        !          4379:                 $$ = add_instance_variable(objc_ivar_context, objc_public_flag,
        !          4380:                            $1, current_declspecs, $3); 
        !          4381:                 }
        !          4382:        | ':' expr_no_commas
        !          4383:                { 
        !          4384:                 $$ = add_instance_variable(objc_ivar_context, objc_public_flag,
        !          4385:                            NULL_TREE, current_declspecs, $2); 
        !          4386:                 }
        !          4387:        ;
        !          4388: 
        !          4389: methoddef:
        !          4390:          '+' 
        !          4391:                {
        !          4392:                  if (objc_implementation_context)
        !          4393:                    objc_inherit_code = CLASS_METHOD_DECL;
        !          4394:                   else
        !          4395:                    fatal("Illegal method definition - must be in a class context.");
        !          4396:                }
        !          4397:          methoddecl 
        !          4398:                { 
        !          4399:                  add_class_method(objc_implementation_context,$3);
        !          4400:                  start_method_def ($3);
        !          4401:                  objc_method_context = $3;
        !          4402:                }
        !          4403:          optarglist
        !          4404:                {
        !          4405:                  continue_method_def();
        !          4406:                }
        !          4407:          compstmt_or_error
        !          4408:                { 
        !          4409:                  finish_method_def (); 
        !          4410:                  objc_method_context = NULL_TREE; 
        !          4411:                }
        !          4412: 
        !          4413:        | '-' 
        !          4414:                {
        !          4415:                  if (objc_implementation_context)
        !          4416:                    objc_inherit_code = INSTANCE_METHOD_DECL;
        !          4417:                   else
        !          4418:                    fatal("Illegal method definition - must be in a class context.");
        !          4419:                }
        !          4420:          methoddecl 
        !          4421:                { 
        !          4422:                  add_instance_method(objc_implementation_context,$3);
        !          4423:                  start_method_def ($3); 
        !          4424:                  objc_method_context = $3;
        !          4425:                }
        !          4426:          optarglist
        !          4427:                {
        !          4428:                  continue_method_def();
        !          4429:                }
        !          4430:          compstmt_or_error
        !          4431:                { 
        !          4432:                  finish_method_def (); 
        !          4433:                  objc_method_context = NULL_TREE; 
        !          4434:                }
        !          4435:        ;
        !          4436: 
        !          4437: /* the reason for the strange actions in this rule
        !          4438:  is so that notype_initdecls when reached via datadef
        !          4439:  can find a valid list of type and sc specs in $0. */
        !          4440: 
        !          4441: methodprotolist:
        !          4442:          /* empty  */
        !          4443:        | {$<ttype>$ = NULL_TREE; } methodprotolist2
        !          4444:        ;
        !          4445: 
        !          4446: methodprotolist2:               /* eliminates a shift/reduce conflict */
        !          4447:          methodproto 
        !          4448:        | datadef
        !          4449:        | methodprotolist2 methodproto
        !          4450:        | methodprotolist2 {$<ttype>$ = NULL_TREE; } datadef
        !          4451:        ;
        !          4452: 
        !          4453: semi_or_error:
        !          4454:          ';'
        !          4455:        | error
        !          4456:        ;
        !          4457: 
        !          4458: methodproto:
        !          4459:          '+' 
        !          4460:                {
        !          4461:                  objc_inherit_code = CLASS_METHOD_DECL;
        !          4462:                }
        !          4463:          methoddecl 
        !          4464:                { 
        !          4465:                  add_class_method(objc_interface_context,$3);
        !          4466:                }
        !          4467:          semi_or_error
        !          4468: 
        !          4469:        | '-' 
        !          4470:                {
        !          4471:                  objc_inherit_code = INSTANCE_METHOD_DECL;
        !          4472:                }
        !          4473:          methoddecl 
        !          4474:                {
        !          4475:                  add_instance_method(objc_interface_context,$3);
        !          4476:                }
        !          4477:          semi_or_error
        !          4478:        ;
        !          4479: 
        !          4480: methodtype:
        !          4481:        '(' 
        !          4482:           { 
        !          4483:             remember_protocol_qualifiers(); 
        !          4484:           } 
        !          4485:         typename 
        !          4486:           { 
        !          4487:             forget_protocol_qualifiers(); 
        !          4488:           } 
        !          4489:         ')'
        !          4490:                { $$ = $3; }
        !          4491:        ;
        !          4492: 
        !          4493: methoddecl:
        !          4494:          methodtype unaryselector 
        !          4495:                { 
        !          4496:                $$ = build_method_decl (objc_inherit_code, $1, $2, NULL_TREE); 
        !          4497:                }
        !          4498: 
        !          4499:        | unaryselector 
        !          4500:                { 
        !          4501:                $$ = build_method_decl (objc_inherit_code, NULL_TREE, $1, NULL_TREE); 
        !          4502:                }
        !          4503: 
        !          4504:        | methodtype keywordselector optparmlist
        !          4505:                { 
        !          4506:                $$ = build_method_decl (objc_inherit_code, $1, $2, $3); 
        !          4507:                }
        !          4508: 
        !          4509:        | keywordselector optparmlist
        !          4510:                { 
        !          4511:                $$ = build_method_decl (objc_inherit_code, NULL_TREE, $1, $2); 
        !          4512:                }
        !          4513:        ;
        !          4514: 
        !          4515: 
        !          4516: /* "optarglist" assumes that start_method_def() has already been called...
        !          4517:    if it is not, the "xdecls" will not be placed in the proper scope */
        !          4518: 
        !          4519: optarglist:
        !          4520:          /* empty */
        !          4521:        | ';' myxdecls
        !          4522:        ;
        !          4523: 
        !          4524: /* to get around the following situation: "int foo(int a) int b; {}" that
        !          4525:    is synthesized when parsing "- a:a b:b; id c; id d; { ... }" */
        !          4526: 
        !          4527: myxdecls:
        !          4528:          /* empty */
        !          4529:        | mydecls
        !          4530:        ;
        !          4531: 
        !          4532: mydecls:
        !          4533:        mydecl
        !          4534:        | errstmt
        !          4535:        | mydecls mydecl
        !          4536:        | mydecl errstmt
        !          4537:        ;
        !          4538: 
        !          4539: mydecl:
        !          4540:        typed_declspecs .setspecs myparms ';'
        !          4541:                { resume_momentary ($<itype>2); }
        !          4542:        | typed_declspecs ';'
        !          4543:                { shadow_tag ($1); }
        !          4544:        | declmods ';'
        !          4545:                { warning ("empty declaration"); }
        !          4546:        ;
        !          4547: 
        !          4548: /* this must be converted to live in the g++ world...snaroff */
        !          4549: 
        !          4550: myparms:       
        !          4551:        myparm
        !          4552:                { objcplus_push_parm_decl ($1); }
        !          4553:        | myparms ',' myparm
        !          4554:                { objcplus_push_parm_decl ($3); }
        !          4555:        ;
        !          4556: 
        !          4557: /* A single parameter declaration or parameter type name,
        !          4558:    as found in a parmlist. DOES NOT ALLOW AN INITIALIZER OR ASMSPEC */
        !          4559: 
        !          4560: myparm:
        !          4561:         dont_see_typename notype_declarator
        !          4562:                { $$ = build_tree_list (current_declspecs, $2)  ; }
        !          4563:        | notype_declarator
        !          4564:                { $$ = build_tree_list (current_declspecs, $1)  ; }
        !          4565:        | absdcl
        !          4566:                { $$ = build_tree_list (current_declspecs, $1)  ; }
        !          4567:        ;
        !          4568: 
        !          4569: optparmlist:
        !          4570:          /* empty */
        !          4571:                { 
        !          4572:                  $$ = NULL_TREE; 
        !          4573:                }
        !          4574:        | ',' ELLIPSIS
        !          4575:                {
        !          4576:                  /* oh what a kludge! */
        !          4577:                  $$ = (tree)1; 
        !          4578:                }
        !          4579:        | ',' 
        !          4580:                { 
        !          4581:                  pushlevel (0); 
        !          4582:                } 
        !          4583:          parmlist      
        !          4584:                { 
        !          4585:                  /* returns a tree list node generated by `get_parm_info()' */
        !          4586:                  $$ = $3; 
        !          4587:                  poplevel(0,0,0);
        !          4588:                }
        !          4589:        ;
        !          4590: 
        !          4591: unaryselector:
        !          4592:          selector
        !          4593:        ;
        !          4594: 
        !          4595: keywordselector:
        !          4596:          keyworddecl
        !          4597:        | keywordselector keyworddecl
        !          4598:                { 
        !          4599:                  $$ = chainon($1, $2);
        !          4600:                }
        !          4601:        ;
        !          4602: 
        !          4603: selector:
        !          4604:           IDENTIFIER
        !          4605:         | TYPENAME
        !          4606:        | OBJECTNAME
        !          4607:        | reservedword
        !          4608:        ;
        !          4609: 
        !          4610: reservedword:
        !          4611:          ENUM { $$ = get_identifier("enum"); }
        !          4612:        | AGGR 
        !          4613:           {
        !          4614:             if (yylval.ttype == class_type_node)
        !          4615:               $$ = get_identifier("class");
        !          4616:             else if (yylval.ttype == record_type_node)
        !          4617:               $$ = get_identifier("struct");
        !          4618:             else if (yylval.ttype == union_type_node)
        !          4619:               $$ = get_identifier("union");
        !          4620:            else if (yylval.ttype == enum_type_node)
        !          4621:               $$ = get_identifier("enum");
        !          4622:             else
        !          4623:               abort ();
        !          4624:           }
        !          4625:        | IF { $$ = get_identifier("if"); }
        !          4626:        | ELSE { $$ = get_identifier("else"); }
        !          4627:        | WHILE { $$ = get_identifier("while"); }
        !          4628:        | DO { $$ = get_identifier("do"); }
        !          4629:        | FOR { $$ = get_identifier("for"); }
        !          4630:        | SWITCH { $$ = get_identifier("switch"); }
        !          4631:        | CASE { $$ = get_identifier("case"); }
        !          4632:        | DEFAULT { $$ = get_identifier("default"); }
        !          4633:        | BREAK { $$ = get_identifier("break"); }
        !          4634:        | CONTINUE { $$ = get_identifier("continue"); }
        !          4635:        | RETURN  { $$ = get_identifier("return"); }
        !          4636:        | GOTO { $$ = get_identifier("goto"); }
        !          4637:        | ASM_KEYWORD { $$ = get_identifier("asm"); }
        !          4638:         | SIZEOF { $$ = get_identifier("sizeof"); } 
        !          4639:        | TYPEOF { $$ = get_identifier("typeof"); }
        !          4640:        | ALIGNOF { $$ = get_identifier("alignof"); }
        !          4641:        | NEW { $$ = get_identifier("new"); }
        !          4642:        | DELETE { $$ = get_identifier("delete"); }
        !          4643:        | OPERATOR { $$ = get_identifier("operator"); }
        !          4644:        | VISSPEC {
        !          4645:                    if ($1 == visibility_private)
        !          4646:                      $$ = get_identifier ("private");
        !          4647:                    else if ($1 == visibility_public)
        !          4648:                      $$ = get_identifier ("public");
        !          4649:                    else if ($1 == visibility_protected)
        !          4650:                      $$ = get_identifier ("protected");
        !          4651:                    else
        !          4652:                      abort ();
        !          4653:                  }
        !          4654:         | SCSPEC   { $$ = yylval.ttype; }
        !          4655:         | TYPESPEC { $$ = yylval.ttype; }
        !          4656:        | OVERLOAD { $$ = get_identifier("overload"); }
        !          4657:        ;
        !          4658: 
        !          4659: keyworddecl:
        !          4660:          selector ':' methodtype identifier
        !          4661:                { 
        !          4662:                  $$ = build_keyword_decl($1, $3, $4);
        !          4663:                }
        !          4664: 
        !          4665:        | selector ':' identifier
        !          4666:                { 
        !          4667:                  $$ = build_keyword_decl($1, NULL_TREE, $3);
        !          4668:                }
        !          4669: 
        !          4670:        | ':' methodtype identifier
        !          4671:                { 
        !          4672:                  $$ = build_keyword_decl(NULL_TREE, $2, $3);
        !          4673:                }
        !          4674: 
        !          4675:        | ':' identifier
        !          4676:                { 
        !          4677:                  $$ = build_keyword_decl(NULL_TREE, NULL_TREE, $2);
        !          4678:                }
        !          4679:        ;
        !          4680: 
        !          4681: messageargs:
        !          4682:          selector
        !          4683:         | keywordarglist
        !          4684:        ;
        !          4685: 
        !          4686: keywordarglist:
        !          4687:          keywordarg
        !          4688:        | keywordarglist keywordarg
        !          4689:                { 
        !          4690:                  $$ = chainon($1, $2);
        !          4691:                }
        !          4692:        ;
        !          4693: 
        !          4694: 
        !          4695: keywordexpr:   
        !          4696:          nonnull_exprlist
        !          4697:                { 
        !          4698:                  if (TREE_CHAIN($1) == NULL_TREE)
        !          4699:                    /* just return the expr., remove a level of indirection */
        !          4700:                    $$ = TREE_VALUE($1);
        !          4701:                   else
        !          4702:                    /* we have a comma expr., we will collapse later */
        !          4703:                    $$ = $1;
        !          4704:                }
        !          4705:        ;
        !          4706: 
        !          4707: keywordarg:
        !          4708:          selector ':' keywordexpr
        !          4709:                {
        !          4710:                  $$ = build_tree_list($1, $3);
        !          4711:                }
        !          4712:        | ':' keywordexpr
        !          4713:                {
        !          4714:                  $$ = build_tree_list(NULL_TREE,$2);
        !          4715:                }
        !          4716:        ;
        !          4717: 
        !          4718: receiver:
        !          4719:          nonnull_exprlist
        !          4720:                {
        !          4721:                  $$ = build_x_compound_expr ($1);
        !          4722:                }
        !          4723:        | CLASSNAME
        !          4724:                {
        !          4725:                  $$ = get_class_reference($1);
        !          4726:                }
        !          4727:        ;
        !          4728: 
        !          4729: objc_openbracket.expr:
        !          4730:          '[' 
        !          4731:                { objc_receiver_context = 1; objc_msg_context += 1; }
        !          4732:          receiver
        !          4733:                { objc_receiver_context = 0; $$ = $3; }
        !          4734:        ;       
        !          4735: 
        !          4736: objc_closebracket:
        !          4737:          ']'
        !          4738:                { objc_msg_context -= 1; }
        !          4739:        ;
        !          4740: 
        !          4741: objcmessageexpr:
        !          4742:          objc_openbracket.expr
        !          4743:            messageargs 
        !          4744:          objc_closebracket
        !          4745:                {
        !          4746:                  $$ = build_tree_list($1,$2);
        !          4747:                   TREE_TYPE ($$) = NULL_TREE;
        !          4748:                }
        !          4749:    /*
        !          4750:        | CLASSNAME SCOPE '[' 
        !          4751:                { objc_receiver_context = 1; }
        !          4752:          receiver
        !          4753:                { objc_receiver_context = 0; }
        !          4754:          messageargs ']'
        !          4755:                {
        !          4756:                  $$ = build_tree_list($5,$7);
        !          4757:                   TREE_TYPE ($$) = get_class_reference ($1);
        !          4758:                }
        !          4759:     */
        !          4760:        ;
        !          4761: 
        !          4762: selectorarg:
        !          4763:          selector
        !          4764:         | keywordnamelist
        !          4765:        ;
        !          4766: 
        !          4767: keywordnamelist:
        !          4768:          keywordname
        !          4769:        | keywordnamelist keywordname
        !          4770:                { 
        !          4771:                  $$ = chainon ($1, $2);
        !          4772:                }
        !          4773:        ;
        !          4774: 
        !          4775: keywordname:
        !          4776:          selector ':' 
        !          4777:                {
        !          4778:                  $$ = build_tree_list ($1, NULL_TREE);
        !          4779:                }
        !          4780:        | ':'
        !          4781:                {
        !          4782:                  $$ = build_tree_list (NULL_TREE,NULL_TREE);
        !          4783:                }
        !          4784:        | SCOPE
        !          4785:                {
        !          4786:                  $$ = chainon (build_tree_list (NULL_TREE,NULL_TREE),
        !          4787:                                build_tree_list (NULL_TREE,NULL_TREE));
        !          4788:                }
        !          4789:        ;
        !          4790: 
        !          4791: objcselectorexpr:
        !          4792:          SELECTOR '(' selectorarg ')'
        !          4793:                {
        !          4794:                  $$ = $3;
        !          4795:                }
        !          4796:        ;
        !          4797: 
        !          4798: objcprotocolexpr:
        !          4799:          PROTOCOL '(' identifier ')'
        !          4800:                {
        !          4801:                  $$ = $3;
        !          4802:                }
        !          4803:        ;
        !          4804: 
        !          4805: /* extension to support C-structures in the archiver */
        !          4806: 
        !          4807: objcencodeexpr:
        !          4808:          ENCODE '(' typename ')'
        !          4809:                {
        !          4810:                  $$ = groktypename($3);
        !          4811:                }
        !          4812:        ;
        !          4813: %endifobjc
        !          4814: %%
        !          4815: 
        !          4816: 
        !          4817: 

unix.superglobalmegacorp.com

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