source: trunk/third/gcc/cp/parse.y @ 8834

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