xref: /dflybsd-src/contrib/gcc-4.7/gcc/cp/parser.h (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino /* Data structures and function exported by the C++ Parser.
2*e4b17023SJohn Marino    Copyright (C) 2010 Free Software Foundation, Inc.
3*e4b17023SJohn Marino 
4*e4b17023SJohn Marino    This file is part of GCC.
5*e4b17023SJohn Marino 
6*e4b17023SJohn Marino    GCC is free software; you can redistribute it and/or modify it
7*e4b17023SJohn Marino    under the terms of the GNU General Public License as published by
8*e4b17023SJohn Marino    the Free Software Foundation; either version 3, or (at your option)
9*e4b17023SJohn Marino    any later version.
10*e4b17023SJohn Marino 
11*e4b17023SJohn Marino    GCC is distributed in the hope that it will be useful, but
12*e4b17023SJohn Marino    WITHOUT ANY WARRANTY; without even the implied warranty of
13*e4b17023SJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*e4b17023SJohn Marino    General Public License for more details.
15*e4b17023SJohn Marino 
16*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
17*e4b17023SJohn Marino along with GCC; see the file COPYING3.  If not see
18*e4b17023SJohn Marino <http://www.gnu.org/licenses/>.  */
19*e4b17023SJohn Marino 
20*e4b17023SJohn Marino #ifndef GCC_CP_PARSER_H
21*e4b17023SJohn Marino #define GCC_CP_PARSER_H
22*e4b17023SJohn Marino 
23*e4b17023SJohn Marino #include "tree.h"
24*e4b17023SJohn Marino #include "c-family/c-pragma.h"
25*e4b17023SJohn Marino 
26*e4b17023SJohn Marino /* A token's value and its associated deferred access checks and
27*e4b17023SJohn Marino    qualifying scope.  */
28*e4b17023SJohn Marino 
29*e4b17023SJohn Marino struct GTY(()) tree_check {
30*e4b17023SJohn Marino   /* The value associated with the token.  */
31*e4b17023SJohn Marino   tree value;
32*e4b17023SJohn Marino   /* The checks that have been associated with value.  */
33*e4b17023SJohn Marino   VEC (deferred_access_check, gc)* checks;
34*e4b17023SJohn Marino   /* The token's qualifying scope (used when it is a
35*e4b17023SJohn Marino      CPP_NESTED_NAME_SPECIFIER).  */
36*e4b17023SJohn Marino   tree qualifying_scope;
37*e4b17023SJohn Marino };
38*e4b17023SJohn Marino 
39*e4b17023SJohn Marino /* A C++ token.  */
40*e4b17023SJohn Marino 
41*e4b17023SJohn Marino typedef struct GTY (()) cp_token {
42*e4b17023SJohn Marino   /* The kind of token.  */
43*e4b17023SJohn Marino   ENUM_BITFIELD (cpp_ttype) type : 8;
44*e4b17023SJohn Marino   /* If this token is a keyword, this value indicates which keyword.
45*e4b17023SJohn Marino      Otherwise, this value is RID_MAX.  */
46*e4b17023SJohn Marino   ENUM_BITFIELD (rid) keyword : 8;
47*e4b17023SJohn Marino   /* Token flags.  */
48*e4b17023SJohn Marino   unsigned char flags;
49*e4b17023SJohn Marino   /* Identifier for the pragma.  */
50*e4b17023SJohn Marino   ENUM_BITFIELD (pragma_kind) pragma_kind : 6;
51*e4b17023SJohn Marino   /* True if this token is from a context where it is implicitly extern "C" */
52*e4b17023SJohn Marino   BOOL_BITFIELD implicit_extern_c : 1;
53*e4b17023SJohn Marino   /* True for a CPP_NAME token that is not a keyword (i.e., for which
54*e4b17023SJohn Marino      KEYWORD is RID_MAX) iff this name was looked up and found to be
55*e4b17023SJohn Marino      ambiguous.  An error has already been reported.  */
56*e4b17023SJohn Marino   BOOL_BITFIELD ambiguous_p : 1;
57*e4b17023SJohn Marino   /* True for a token that has been purged.  If a token is purged,
58*e4b17023SJohn Marino      it is no longer a valid token and it should be considered
59*e4b17023SJohn Marino      deleted.  */
60*e4b17023SJohn Marino   BOOL_BITFIELD purged_p : 1;
61*e4b17023SJohn Marino   /* The location at which this token was found.  */
62*e4b17023SJohn Marino   location_t location;
63*e4b17023SJohn Marino   /* The value associated with this token, if any.  */
64*e4b17023SJohn Marino   union cp_token_value {
65*e4b17023SJohn Marino     /* Used for CPP_NESTED_NAME_SPECIFIER and CPP_TEMPLATE_ID.  */
66*e4b17023SJohn Marino     struct tree_check* GTY((tag ("1"))) tree_check_value;
67*e4b17023SJohn Marino     /* Use for all other tokens.  */
68*e4b17023SJohn Marino     tree GTY((tag ("0"))) value;
69*e4b17023SJohn Marino   } GTY((desc ("(%1.type == CPP_TEMPLATE_ID) || (%1.type == CPP_NESTED_NAME_SPECIFIER)"))) u;
70*e4b17023SJohn Marino } cp_token;
71*e4b17023SJohn Marino 
72*e4b17023SJohn Marino DEF_VEC_O (cp_token);
73*e4b17023SJohn Marino DEF_VEC_ALLOC_O (cp_token,gc);
74*e4b17023SJohn Marino DEF_VEC_ALLOC_O (cp_token,heap);
75*e4b17023SJohn Marino 
76*e4b17023SJohn Marino /* We use a stack of token pointer for saving token sets.  */
77*e4b17023SJohn Marino typedef struct cp_token *cp_token_position;
78*e4b17023SJohn Marino DEF_VEC_P (cp_token_position);
79*e4b17023SJohn Marino DEF_VEC_ALLOC_P (cp_token_position,heap);
80*e4b17023SJohn Marino 
81*e4b17023SJohn Marino /* The cp_lexer structure represents the C++ lexer.  It is responsible
82*e4b17023SJohn Marino    for managing the token stream from the preprocessor and supplying
83*e4b17023SJohn Marino    it to the parser.  Tokens are never added to the cp_lexer after
84*e4b17023SJohn Marino    it is created.  */
85*e4b17023SJohn Marino 
86*e4b17023SJohn Marino typedef struct GTY (()) cp_lexer {
87*e4b17023SJohn Marino   /* The memory allocated for the buffer.  NULL if this lexer does not
88*e4b17023SJohn Marino      own the token buffer.  */
89*e4b17023SJohn Marino   VEC(cp_token,gc) *buffer;
90*e4b17023SJohn Marino 
91*e4b17023SJohn Marino   /* A pointer just past the last available token.  The tokens
92*e4b17023SJohn Marino      in this lexer are [buffer, last_token).  */
93*e4b17023SJohn Marino   cp_token_position GTY ((skip)) last_token;
94*e4b17023SJohn Marino 
95*e4b17023SJohn Marino   /* The next available token.  If NEXT_TOKEN is &eof_token, then there are
96*e4b17023SJohn Marino      no more available tokens.  */
97*e4b17023SJohn Marino   cp_token_position GTY ((skip)) next_token;
98*e4b17023SJohn Marino 
99*e4b17023SJohn Marino   /* A stack indicating positions at which cp_lexer_save_tokens was
100*e4b17023SJohn Marino      called.  The top entry is the most recent position at which we
101*e4b17023SJohn Marino      began saving tokens.  If the stack is non-empty, we are saving
102*e4b17023SJohn Marino      tokens.  */
103*e4b17023SJohn Marino   VEC(cp_token_position,heap) *GTY ((skip)) saved_tokens;
104*e4b17023SJohn Marino 
105*e4b17023SJohn Marino   /* The next lexer in a linked list of lexers.  */
106*e4b17023SJohn Marino   struct cp_lexer *next;
107*e4b17023SJohn Marino 
108*e4b17023SJohn Marino   /* True if we should output debugging information.  */
109*e4b17023SJohn Marino   bool debugging_p;
110*e4b17023SJohn Marino 
111*e4b17023SJohn Marino   /* True if we're in the context of parsing a pragma, and should not
112*e4b17023SJohn Marino      increment past the end-of-line marker.  */
113*e4b17023SJohn Marino   bool in_pragma;
114*e4b17023SJohn Marino } cp_lexer;
115*e4b17023SJohn Marino 
116*e4b17023SJohn Marino DEF_VEC_O (cp_lexer);
117*e4b17023SJohn Marino DEF_VEC_ALLOC_O (cp_lexer,heap);
118*e4b17023SJohn Marino 
119*e4b17023SJohn Marino /* cp_token_cache is a range of tokens.  There is no need to represent
120*e4b17023SJohn Marino    allocate heap memory for it, since tokens are never removed from the
121*e4b17023SJohn Marino    lexer's array.  There is also no need for the GC to walk through
122*e4b17023SJohn Marino    a cp_token_cache, since everything in here is referenced through
123*e4b17023SJohn Marino    a lexer.  */
124*e4b17023SJohn Marino 
125*e4b17023SJohn Marino typedef struct GTY(()) cp_token_cache {
126*e4b17023SJohn Marino   /* The beginning of the token range.  */
127*e4b17023SJohn Marino   cp_token * GTY((skip)) first;
128*e4b17023SJohn Marino 
129*e4b17023SJohn Marino   /* Points immediately after the last token in the range.  */
130*e4b17023SJohn Marino   cp_token * GTY ((skip)) last;
131*e4b17023SJohn Marino } cp_token_cache;
132*e4b17023SJohn Marino 
133*e4b17023SJohn Marino typedef cp_token_cache *cp_token_cache_ptr;
134*e4b17023SJohn Marino DEF_VEC_P (cp_token_cache_ptr);
135*e4b17023SJohn Marino DEF_VEC_ALLOC_P (cp_token_cache_ptr,gc);
136*e4b17023SJohn Marino 
137*e4b17023SJohn Marino struct cp_token_ident_d
138*e4b17023SJohn Marino {
139*e4b17023SJohn Marino   unsigned int ident_len;
140*e4b17023SJohn Marino   const char *ident_str;
141*e4b17023SJohn Marino   unsigned int before_len;
142*e4b17023SJohn Marino   const char *before_str;
143*e4b17023SJohn Marino   unsigned int after_len;
144*e4b17023SJohn Marino   const char *after_str;
145*e4b17023SJohn Marino };
146*e4b17023SJohn Marino 
147*e4b17023SJohn Marino typedef struct cp_token_ident_d cp_token_ident;
148*e4b17023SJohn Marino 
149*e4b17023SJohn Marino /* An entry in a queue of function arguments that require post-processing.  */
150*e4b17023SJohn Marino 
151*e4b17023SJohn Marino typedef struct GTY(()) cp_default_arg_entry_d {
152*e4b17023SJohn Marino   /* The current_class_type when we parsed this arg.  */
153*e4b17023SJohn Marino   tree class_type;
154*e4b17023SJohn Marino 
155*e4b17023SJohn Marino   /* The function decl itself.  */
156*e4b17023SJohn Marino   tree decl;
157*e4b17023SJohn Marino } cp_default_arg_entry;
158*e4b17023SJohn Marino 
159*e4b17023SJohn Marino DEF_VEC_O(cp_default_arg_entry);
160*e4b17023SJohn Marino DEF_VEC_ALLOC_O(cp_default_arg_entry,gc);
161*e4b17023SJohn Marino 
162*e4b17023SJohn Marino /* An entry in a stack for member functions of local classes.  */
163*e4b17023SJohn Marino 
164*e4b17023SJohn Marino typedef struct GTY(()) cp_unparsed_functions_entry_d {
165*e4b17023SJohn Marino   /* Functions with default arguments that require post-processing.
166*e4b17023SJohn Marino      Functions appear in this list in declaration order.  */
167*e4b17023SJohn Marino   VEC(cp_default_arg_entry,gc) *funs_with_default_args;
168*e4b17023SJohn Marino 
169*e4b17023SJohn Marino   /* Functions with defintions that require post-processing.  Functions
170*e4b17023SJohn Marino      appear in this list in declaration order.  */
171*e4b17023SJohn Marino   VEC(tree,gc) *funs_with_definitions;
172*e4b17023SJohn Marino 
173*e4b17023SJohn Marino   /* Non-static data members with initializers that require post-processing.
174*e4b17023SJohn Marino      FIELD_DECLs appear in this list in declaration order.  */
175*e4b17023SJohn Marino   VEC(tree,gc) *nsdmis;
176*e4b17023SJohn Marino } cp_unparsed_functions_entry;
177*e4b17023SJohn Marino 
178*e4b17023SJohn Marino DEF_VEC_O(cp_unparsed_functions_entry);
179*e4b17023SJohn Marino DEF_VEC_ALLOC_O(cp_unparsed_functions_entry,gc);
180*e4b17023SJohn Marino 
181*e4b17023SJohn Marino /* The status of a tentative parse.  */
182*e4b17023SJohn Marino 
183*e4b17023SJohn Marino typedef enum cp_parser_status_kind
184*e4b17023SJohn Marino {
185*e4b17023SJohn Marino   /* No errors have occurred.  */
186*e4b17023SJohn Marino   CP_PARSER_STATUS_KIND_NO_ERROR,
187*e4b17023SJohn Marino   /* An error has occurred.  */
188*e4b17023SJohn Marino   CP_PARSER_STATUS_KIND_ERROR,
189*e4b17023SJohn Marino   /* We are committed to this tentative parse, whether or not an error
190*e4b17023SJohn Marino      has occurred.  */
191*e4b17023SJohn Marino   CP_PARSER_STATUS_KIND_COMMITTED
192*e4b17023SJohn Marino } cp_parser_status_kind;
193*e4b17023SJohn Marino 
194*e4b17023SJohn Marino 
195*e4b17023SJohn Marino /* Context that is saved and restored when parsing tentatively.  */
196*e4b17023SJohn Marino typedef struct GTY (()) cp_parser_context {
197*e4b17023SJohn Marino   /* If this is a tentative parsing context, the status of the
198*e4b17023SJohn Marino      tentative parse.  */
199*e4b17023SJohn Marino   enum cp_parser_status_kind status;
200*e4b17023SJohn Marino   /* If non-NULL, we have just seen a `x->' or `x.' expression.  Names
201*e4b17023SJohn Marino      that are looked up in this context must be looked up both in the
202*e4b17023SJohn Marino      scope given by OBJECT_TYPE (the type of `x' or `*x') and also in
203*e4b17023SJohn Marino      the context of the containing expression.  */
204*e4b17023SJohn Marino   tree object_type;
205*e4b17023SJohn Marino 
206*e4b17023SJohn Marino   /* The next parsing context in the stack.  */
207*e4b17023SJohn Marino   struct cp_parser_context *next;
208*e4b17023SJohn Marino } cp_parser_context;
209*e4b17023SJohn Marino 
210*e4b17023SJohn Marino 
211*e4b17023SJohn Marino /* The cp_parser structure represents the C++ parser.  */
212*e4b17023SJohn Marino 
213*e4b17023SJohn Marino typedef struct GTY(()) cp_parser {
214*e4b17023SJohn Marino   /* The lexer from which we are obtaining tokens.  */
215*e4b17023SJohn Marino   cp_lexer *lexer;
216*e4b17023SJohn Marino 
217*e4b17023SJohn Marino   /* The scope in which names should be looked up.  If NULL_TREE, then
218*e4b17023SJohn Marino      we look up names in the scope that is currently open in the
219*e4b17023SJohn Marino      source program.  If non-NULL, this is either a TYPE or
220*e4b17023SJohn Marino      NAMESPACE_DECL for the scope in which we should look.  It can
221*e4b17023SJohn Marino      also be ERROR_MARK, when we've parsed a bogus scope.
222*e4b17023SJohn Marino 
223*e4b17023SJohn Marino      This value is not cleared automatically after a name is looked
224*e4b17023SJohn Marino      up, so we must be careful to clear it before starting a new look
225*e4b17023SJohn Marino      up sequence.  (If it is not cleared, then `X::Y' followed by `Z'
226*e4b17023SJohn Marino      will look up `Z' in the scope of `X', rather than the current
227*e4b17023SJohn Marino      scope.)  Unfortunately, it is difficult to tell when name lookup
228*e4b17023SJohn Marino      is complete, because we sometimes peek at a token, look it up,
229*e4b17023SJohn Marino      and then decide not to consume it.   */
230*e4b17023SJohn Marino   tree scope;
231*e4b17023SJohn Marino 
232*e4b17023SJohn Marino   /* OBJECT_SCOPE and QUALIFYING_SCOPE give the scopes in which the
233*e4b17023SJohn Marino      last lookup took place.  OBJECT_SCOPE is used if an expression
234*e4b17023SJohn Marino      like "x->y" or "x.y" was used; it gives the type of "*x" or "x",
235*e4b17023SJohn Marino      respectively.  QUALIFYING_SCOPE is used for an expression of the
236*e4b17023SJohn Marino      form "X::Y"; it refers to X.  */
237*e4b17023SJohn Marino   tree object_scope;
238*e4b17023SJohn Marino   tree qualifying_scope;
239*e4b17023SJohn Marino 
240*e4b17023SJohn Marino   /* A stack of parsing contexts.  All but the bottom entry on the
241*e4b17023SJohn Marino      stack will be tentative contexts.
242*e4b17023SJohn Marino 
243*e4b17023SJohn Marino      We parse tentatively in order to determine which construct is in
244*e4b17023SJohn Marino      use in some situations.  For example, in order to determine
245*e4b17023SJohn Marino      whether a statement is an expression-statement or a
246*e4b17023SJohn Marino      declaration-statement we parse it tentatively as a
247*e4b17023SJohn Marino      declaration-statement.  If that fails, we then reparse the same
248*e4b17023SJohn Marino      token stream as an expression-statement.  */
249*e4b17023SJohn Marino   cp_parser_context *context;
250*e4b17023SJohn Marino 
251*e4b17023SJohn Marino   /* True if we are parsing GNU C++.  If this flag is not set, then
252*e4b17023SJohn Marino      GNU extensions are not recognized.  */
253*e4b17023SJohn Marino   bool allow_gnu_extensions_p;
254*e4b17023SJohn Marino 
255*e4b17023SJohn Marino   /* TRUE if the `>' token should be interpreted as the greater-than
256*e4b17023SJohn Marino      operator.  FALSE if it is the end of a template-id or
257*e4b17023SJohn Marino      template-parameter-list. In C++0x mode, this flag also applies to
258*e4b17023SJohn Marino      `>>' tokens, which are viewed as two consecutive `>' tokens when
259*e4b17023SJohn Marino      this flag is FALSE.  */
260*e4b17023SJohn Marino   bool greater_than_is_operator_p;
261*e4b17023SJohn Marino 
262*e4b17023SJohn Marino   /* TRUE if default arguments are allowed within a parameter list
263*e4b17023SJohn Marino      that starts at this point. FALSE if only a gnu extension makes
264*e4b17023SJohn Marino      them permissible.  */
265*e4b17023SJohn Marino   bool default_arg_ok_p;
266*e4b17023SJohn Marino 
267*e4b17023SJohn Marino   /* TRUE if we are parsing an integral constant-expression.  See
268*e4b17023SJohn Marino      [expr.const] for a precise definition.  */
269*e4b17023SJohn Marino   bool integral_constant_expression_p;
270*e4b17023SJohn Marino 
271*e4b17023SJohn Marino   /* TRUE if we are parsing an integral constant-expression -- but a
272*e4b17023SJohn Marino      non-constant expression should be permitted as well.  This flag
273*e4b17023SJohn Marino      is used when parsing an array bound so that GNU variable-length
274*e4b17023SJohn Marino      arrays are tolerated.  */
275*e4b17023SJohn Marino   bool allow_non_integral_constant_expression_p;
276*e4b17023SJohn Marino 
277*e4b17023SJohn Marino   /* TRUE if ALLOW_NON_CONSTANT_EXPRESSION_P is TRUE and something has
278*e4b17023SJohn Marino      been seen that makes the expression non-constant.  */
279*e4b17023SJohn Marino   bool non_integral_constant_expression_p;
280*e4b17023SJohn Marino 
281*e4b17023SJohn Marino   /* TRUE if local variable names and `this' are forbidden in the
282*e4b17023SJohn Marino      current context.  */
283*e4b17023SJohn Marino   bool local_variables_forbidden_p;
284*e4b17023SJohn Marino 
285*e4b17023SJohn Marino   /* TRUE if the declaration we are parsing is part of a
286*e4b17023SJohn Marino      linkage-specification of the form `extern string-literal
287*e4b17023SJohn Marino      declaration'.  */
288*e4b17023SJohn Marino   bool in_unbraced_linkage_specification_p;
289*e4b17023SJohn Marino 
290*e4b17023SJohn Marino   /* TRUE if we are presently parsing a declarator, after the
291*e4b17023SJohn Marino      direct-declarator.  */
292*e4b17023SJohn Marino   bool in_declarator_p;
293*e4b17023SJohn Marino 
294*e4b17023SJohn Marino   /* TRUE if we are presently parsing a template-argument-list.  */
295*e4b17023SJohn Marino   bool in_template_argument_list_p;
296*e4b17023SJohn Marino 
297*e4b17023SJohn Marino   /* Set to IN_ITERATION_STMT if parsing an iteration-statement,
298*e4b17023SJohn Marino      to IN_OMP_BLOCK if parsing OpenMP structured block and
299*e4b17023SJohn Marino      IN_OMP_FOR if parsing OpenMP loop.  If parsing a switch statement,
300*e4b17023SJohn Marino      this is bitwise ORed with IN_SWITCH_STMT, unless parsing an
301*e4b17023SJohn Marino      iteration-statement, OpenMP block or loop within that switch.  */
302*e4b17023SJohn Marino #define IN_SWITCH_STMT		1
303*e4b17023SJohn Marino #define IN_ITERATION_STMT	2
304*e4b17023SJohn Marino #define IN_OMP_BLOCK		4
305*e4b17023SJohn Marino #define IN_OMP_FOR		8
306*e4b17023SJohn Marino #define IN_IF_STMT             16
307*e4b17023SJohn Marino   unsigned char in_statement;
308*e4b17023SJohn Marino 
309*e4b17023SJohn Marino   /* TRUE if we are presently parsing the body of a switch statement.
310*e4b17023SJohn Marino      Note that this doesn't quite overlap with in_statement above.
311*e4b17023SJohn Marino      The difference relates to giving the right sets of error messages:
312*e4b17023SJohn Marino      "case not in switch" vs "break statement used with OpenMP...".  */
313*e4b17023SJohn Marino   bool in_switch_statement_p;
314*e4b17023SJohn Marino 
315*e4b17023SJohn Marino   /* TRUE if we are parsing a type-id in an expression context.  In
316*e4b17023SJohn Marino      such a situation, both "type (expr)" and "type (type)" are valid
317*e4b17023SJohn Marino      alternatives.  */
318*e4b17023SJohn Marino   bool in_type_id_in_expr_p;
319*e4b17023SJohn Marino 
320*e4b17023SJohn Marino   /* TRUE if we are currently in a header file where declarations are
321*e4b17023SJohn Marino      implicitly extern "C".  */
322*e4b17023SJohn Marino   bool implicit_extern_c;
323*e4b17023SJohn Marino 
324*e4b17023SJohn Marino   /* TRUE if strings in expressions should be translated to the execution
325*e4b17023SJohn Marino      character set.  */
326*e4b17023SJohn Marino   bool translate_strings_p;
327*e4b17023SJohn Marino 
328*e4b17023SJohn Marino   /* TRUE if we are presently parsing the body of a function, but not
329*e4b17023SJohn Marino      a local class.  */
330*e4b17023SJohn Marino   bool in_function_body;
331*e4b17023SJohn Marino 
332*e4b17023SJohn Marino   /* Nonzero if we're processing a __transaction_atomic or
333*e4b17023SJohn Marino      __transaction_relaxed statement.  */
334*e4b17023SJohn Marino   unsigned char in_transaction;
335*e4b17023SJohn Marino 
336*e4b17023SJohn Marino   /* TRUE if we can auto-correct a colon to a scope operator.  */
337*e4b17023SJohn Marino   bool colon_corrects_to_scope_p;
338*e4b17023SJohn Marino 
339*e4b17023SJohn Marino   /* If non-NULL, then we are parsing a construct where new type
340*e4b17023SJohn Marino      definitions are not permitted.  The string stored here will be
341*e4b17023SJohn Marino      issued as an error message if a type is defined.  */
342*e4b17023SJohn Marino   const char *type_definition_forbidden_message;
343*e4b17023SJohn Marino 
344*e4b17023SJohn Marino   /* A stack used for member functions of local classes.  The lists
345*e4b17023SJohn Marino      contained in an individual entry can only be processed once the
346*e4b17023SJohn Marino      outermost class being defined is complete.  */
347*e4b17023SJohn Marino   VEC(cp_unparsed_functions_entry,gc) *unparsed_queues;
348*e4b17023SJohn Marino 
349*e4b17023SJohn Marino   /* The number of classes whose definitions are currently in
350*e4b17023SJohn Marino      progress.  */
351*e4b17023SJohn Marino   unsigned num_classes_being_defined;
352*e4b17023SJohn Marino 
353*e4b17023SJohn Marino   /* The number of template parameter lists that apply directly to the
354*e4b17023SJohn Marino      current declaration.  */
355*e4b17023SJohn Marino   unsigned num_template_parameter_lists;
356*e4b17023SJohn Marino } cp_parser;
357*e4b17023SJohn Marino 
358*e4b17023SJohn Marino /* In parser.c  */
359*e4b17023SJohn Marino extern void cp_lexer_debug_tokens (VEC(cp_token,gc) *);
360*e4b17023SJohn Marino extern void cp_debug_parser (FILE *, cp_parser *);
361*e4b17023SJohn Marino 
362*e4b17023SJohn Marino #endif  /* GCC_CP_PARSER_H  */
363