1 /* Type Analyzer for GNU C++.
2 Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001 Free Software Foundation, Inc.
4 Hacked... nay, bludgeoned... by Mark Eichin (eichin@cygnus.com)
6 This file is part of GNU CC.
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
23 /* This file is the type analyzer for GNU C++. To debug it, define SPEW_DEBUG
24 when compiling parse.c and spew.c. */
45 #define SPEW_INLINE inline
48 /* This takes a token stream that hasn't decided much about types and
49 tries to figure out as much as it can, with excessive lookahead and
52 /* fifo of tokens recognized and available to parser. */
55 /* The values for YYCHAR will fit in a short. */
61 /* Since inline methods can refer to text which has not yet been seen,
62 we store the text of the method in a structure which is placed in the
63 DECL_PENDING_INLINE_INFO field of the FUNCTION_DECL.
64 After parsing the body of the class definition, the FUNCTION_DECL's are
65 scanned to see which ones have this field set. Those are then digested
68 This function's FUNCTION_DECL will have a bit set in its common so
69 that we know to watch out for it. */
73 struct unparsed_text *next; /* process this one next */
74 tree decl; /* associated declaration */
75 const char *filename; /* name of file we were processing */
76 int lineno; /* line number we got the text from */
77 int interface; /* remembering interface_unknown and interface_only */
79 struct token *pos; /* current position, when rescanning */
80 struct token *limit; /* end of saved text */
83 /* Stack of state saved off when we return to an inline method or
84 default argument that has been stored for later parsing. */
87 struct unparsed_text *input;
93 struct obstack token_obstack;
97 static struct obstack feed_obstack;
98 static struct feed *feed;
100 static SPEW_INLINE void do_aggr PARAMS ((void));
101 static SPEW_INLINE int identifier_type PARAMS ((tree));
102 static void scan_tokens PARAMS ((int));
103 static void feed_defarg PARAMS ((tree));
104 static void finish_defarg PARAMS ((void));
105 static int read_token PARAMS ((struct token *));
107 static SPEW_INLINE int num_tokens PARAMS ((void));
108 static SPEW_INLINE struct token *nth_token PARAMS ((int));
109 static SPEW_INLINE int add_token PARAMS ((struct token *));
110 static SPEW_INLINE int shift_token PARAMS ((void));
111 static SPEW_INLINE void push_token PARAMS ((struct token *));
112 static SPEW_INLINE void consume_token PARAMS ((void));
113 static SPEW_INLINE int read_process_identifier PARAMS ((YYSTYPE *));
115 static SPEW_INLINE void feed_input PARAMS ((struct unparsed_text *));
116 static SPEW_INLINE void end_input PARAMS ((void));
117 static SPEW_INLINE void snarf_block PARAMS ((const char *, int));
118 static tree snarf_defarg PARAMS ((void));
119 static int frob_id PARAMS ((int, int, tree *));
121 /* The list of inline functions being held off until we reach the end of
122 the current class declaration. */
123 struct unparsed_text *pending_inlines;
124 struct unparsed_text *pending_inlines_tail;
126 /* The list of previously-deferred inline functions currently being parsed.
127 This exists solely to be a GC root. */
128 struct unparsed_text *processing_these_inlines;
130 static void begin_parsing_inclass_inline PARAMS ((struct unparsed_text *));
131 static void mark_pending_inlines PARAMS ((PTR));
135 static unsigned int yylex_ctr = 0;
137 static void debug_yychar PARAMS ((int));
140 extern char *debug_yytranslate PARAMS ((int));
142 static enum cpp_ttype last_token;
143 static tree last_token_id;
146 /* the declaration found for the last IDENTIFIER token read in.
147 yylex must look this up to detect typedefs, which get token type TYPENAME,
148 so it is left around in case the identifier is not a typedef but is
149 used in a context which makes it a reference to a variable. */
150 extern tree lastiddecl; /* let our brains leak out here too */
151 extern int yychar; /* the lookahead symbol */
152 extern YYSTYPE yylval; /* the semantic value of the */
153 /* lookahead symbol */
154 /* The token fifo lives in this obstack. */
155 struct obstack token_obstack;
158 /* Sometimes we need to save tokens for later parsing. If so, they are
159 stored on this obstack. */
160 struct obstack inline_text_obstack;
161 char *inline_text_firstobj;
163 /* When we see a default argument in a method declaration, we snarf it as
164 text using snarf_defarg. When we get up to namespace scope, we then go
165 through and parse all of them using do_pending_defargs. Since yacc
166 parsers are not reentrant, we retain defargs state in these two
167 variables so that subsequent calls to do_pending_defargs can resume
168 where the previous call left off. DEFARG_FNS is a tree_list where
169 the TREE_TYPE is the current_class_type, TREE_VALUE is the FUNCTION_DECL,
170 and TREE_PURPOSE is the list unprocessed dependent functions. */
172 static tree defarg_fns; /* list of functions with unprocessed defargs */
173 static tree defarg_parm; /* current default parameter */
174 static tree defarg_depfns; /* list of unprocessed fns met during current fn. */
175 static tree defarg_fnsdone; /* list of fns with circular defargs */
177 /* Initialize obstacks. Called once, from init_parse. */
182 gcc_obstack_init (&inline_text_obstack);
183 inline_text_firstobj = (char *) obstack_alloc (&inline_text_obstack, 0);
184 gcc_obstack_init (&token_obstack);
185 gcc_obstack_init (&feed_obstack);
186 ggc_add_tree_root (&defarg_fns, 1);
187 ggc_add_tree_root (&defarg_parm, 1);
188 ggc_add_tree_root (&defarg_depfns, 1);
189 ggc_add_tree_root (&defarg_fnsdone, 1);
191 ggc_add_root (&pending_inlines, 1, sizeof (struct unparsed_text *),
192 mark_pending_inlines);
193 ggc_add_root (&processing_these_inlines, 1, sizeof (struct unparsed_text *),
194 mark_pending_inlines);
198 clear_inline_text_obstack ()
200 obstack_free (&inline_text_obstack, inline_text_firstobj);
203 /* Subroutine of read_token. */
204 static SPEW_INLINE int
205 read_process_identifier (pyylval)
208 tree id = pyylval->ttype;
210 if (C_IS_RESERVED_WORD (id))
212 /* Possibly replace the IDENTIFIER_NODE with a magic cookie.
213 Can't put yylval.code numbers in ridpointers[]. Bleah. */
215 switch (C_RID_CODE (id))
217 case RID_BITAND: pyylval->code = BIT_AND_EXPR; return '&';
218 case RID_AND_EQ: pyylval->code = BIT_AND_EXPR; return ASSIGN;
219 case RID_BITOR: pyylval->code = BIT_IOR_EXPR; return '|';
220 case RID_OR_EQ: pyylval->code = BIT_IOR_EXPR; return ASSIGN;
221 case RID_XOR: pyylval->code = BIT_XOR_EXPR; return '^';
222 case RID_XOR_EQ: pyylval->code = BIT_XOR_EXPR; return ASSIGN;
223 case RID_NOT_EQ: pyylval->code = NE_EXPR; return EQCOMPARE;
226 if (C_RID_YYCODE (id) == TYPESPEC)
227 GNU_xref_ref (current_function_decl, IDENTIFIER_POINTER (id));
229 pyylval->ttype = ridpointers[C_RID_CODE (id)];
230 return C_RID_YYCODE (id);
234 GNU_xref_ref (current_function_decl, IDENTIFIER_POINTER (id));
236 /* Make sure that user does not collide with our internal naming
237 scheme. This is not necessary if '.' is used to remove them from
238 the user's namespace, but is if '$' or double underscores are. */
240 #if !defined(JOINER) || JOINER == '$'
243 || DESTRUCTOR_NAME_P (id)
244 || VTABLE_NAME_P (id)
246 || ANON_AGGRNAME_P (id)
247 || ANON_PARMNAME_P (id))
249 "identifier name `%s' conflicts with GNU C++ internal naming strategy",
250 IDENTIFIER_POINTER (id));
255 /* Read the next token from the input file. The token is written into
256 T, and its type number is returned. */
263 last_token = c_lex (&last_token_id);
264 t->yylval.ttype = last_token_id;
268 #define YYCHAR(yy) t->yychar = yy; break;
269 #define YYCODE(c) t->yylval.code = c;
271 case CPP_EQ: YYCHAR('=');
272 case CPP_NOT: YYCHAR('!');
273 case CPP_GREATER: YYCODE(GT_EXPR); YYCHAR('>');
274 case CPP_LESS: YYCODE(LT_EXPR); YYCHAR('<');
275 case CPP_PLUS: YYCODE(PLUS_EXPR); YYCHAR('+');
276 case CPP_MINUS: YYCODE(MINUS_EXPR); YYCHAR('-');
277 case CPP_MULT: YYCODE(MULT_EXPR); YYCHAR('*');
278 case CPP_DIV: YYCODE(TRUNC_DIV_EXPR); YYCHAR('/');
279 case CPP_MOD: YYCODE(TRUNC_MOD_EXPR); YYCHAR('%');
280 case CPP_AND: YYCODE(BIT_AND_EXPR); YYCHAR('&');
281 case CPP_OR: YYCODE(BIT_IOR_EXPR); YYCHAR('|');
282 case CPP_XOR: YYCODE(BIT_XOR_EXPR); YYCHAR('^');
283 case CPP_RSHIFT: YYCODE(RSHIFT_EXPR); YYCHAR(RSHIFT);
284 case CPP_LSHIFT: YYCODE(LSHIFT_EXPR); YYCHAR(LSHIFT);
286 case CPP_COMPL: YYCHAR('~');
287 case CPP_AND_AND: YYCHAR(ANDAND);
288 case CPP_OR_OR: YYCHAR(OROR);
289 case CPP_QUERY: YYCHAR('?');
290 case CPP_COLON: YYCHAR(':');
291 case CPP_COMMA: YYCHAR(',');
292 case CPP_OPEN_PAREN: YYCHAR('(');
293 case CPP_CLOSE_PAREN: YYCHAR(')');
294 case CPP_EQ_EQ: YYCODE(EQ_EXPR); YYCHAR(EQCOMPARE);
295 case CPP_NOT_EQ: YYCODE(NE_EXPR); YYCHAR(EQCOMPARE);
296 case CPP_GREATER_EQ:YYCODE(GE_EXPR); YYCHAR(ARITHCOMPARE);
297 case CPP_LESS_EQ: YYCODE(LE_EXPR); YYCHAR(ARITHCOMPARE);
299 case CPP_PLUS_EQ: YYCODE(PLUS_EXPR); YYCHAR(ASSIGN);
300 case CPP_MINUS_EQ: YYCODE(MINUS_EXPR); YYCHAR(ASSIGN);
301 case CPP_MULT_EQ: YYCODE(MULT_EXPR); YYCHAR(ASSIGN);
302 case CPP_DIV_EQ: YYCODE(TRUNC_DIV_EXPR); YYCHAR(ASSIGN);
303 case CPP_MOD_EQ: YYCODE(TRUNC_MOD_EXPR); YYCHAR(ASSIGN);
304 case CPP_AND_EQ: YYCODE(BIT_AND_EXPR); YYCHAR(ASSIGN);
305 case CPP_OR_EQ: YYCODE(BIT_IOR_EXPR); YYCHAR(ASSIGN);
306 case CPP_XOR_EQ: YYCODE(BIT_XOR_EXPR); YYCHAR(ASSIGN);
307 case CPP_RSHIFT_EQ: YYCODE(RSHIFT_EXPR); YYCHAR(ASSIGN);
308 case CPP_LSHIFT_EQ: YYCODE(LSHIFT_EXPR); YYCHAR(ASSIGN);
310 case CPP_OPEN_SQUARE: YYCHAR('[');
311 case CPP_CLOSE_SQUARE: YYCHAR(']');
312 case CPP_OPEN_BRACE: YYCHAR('{');
313 case CPP_CLOSE_BRACE: YYCHAR('}');
314 case CPP_SEMICOLON: YYCHAR(';');
315 case CPP_ELLIPSIS: YYCHAR(ELLIPSIS);
317 case CPP_PLUS_PLUS: YYCHAR(PLUSPLUS);
318 case CPP_MINUS_MINUS: YYCHAR(MINUSMINUS);
319 case CPP_DEREF: YYCHAR(POINTSAT);
320 case CPP_DOT: YYCHAR('.');
322 /* These tokens are C++ specific. */
323 case CPP_SCOPE: YYCHAR(SCOPE);
324 case CPP_DEREF_STAR: YYCHAR(POINTSAT_STAR);
325 case CPP_DOT_STAR: YYCHAR(DOT_STAR);
326 case CPP_MIN_EQ: YYCODE(MIN_EXPR); YYCHAR(ASSIGN);
327 case CPP_MAX_EQ: YYCODE(MAX_EXPR); YYCHAR(ASSIGN);
328 case CPP_MIN: YYCODE(MIN_EXPR); YYCHAR(MIN_MAX);
329 case CPP_MAX: YYCODE(MAX_EXPR); YYCHAR(MIN_MAX);
334 if (cpp_pop_buffer (parse_in) != 0)
340 t->yychar = read_process_identifier (&t->yylval);
346 t->yychar = CONSTANT;
355 yyerror ("parse error");
363 static SPEW_INLINE void
365 struct unparsed_text *input;
373 f = obstack_alloc (&feed_obstack, sizeof (struct feed));
375 /* The token list starts just after the struct unparsed_text in memory. */
376 input->pos = (struct token *) (input + 1);
380 fprintf (stderr, "\tfeeding %s:%d [%d tokens]\n",
381 input->filename, input->lineno, input->limit - input->pos);
385 f->filename = input_filename;
389 f->first_token = first_token;
390 f->token_obstack = token_obstack;
393 input_filename = input->filename;
394 lineno = input->lineno;
396 yylval.ttype = NULL_TREE;
398 gcc_obstack_init (&token_obstack);
402 static SPEW_INLINE void
405 struct feed *f = feed;
407 input_filename = f->filename;
411 first_token = f->first_token;
412 obstack_free (&token_obstack, 0);
413 token_obstack = f->token_obstack;
416 obstack_free (&feed_obstack, f);
420 fprintf (stderr, "\treturning to %s:%d\n", input_filename, lineno);
424 /* GC callback to mark memory pointed to by the pending inline queue. */
426 mark_pending_inlines (pi)
429 struct unparsed_text *up = * (struct unparsed_text **)pi;
433 struct token *t = (struct token *) (up + 1);
434 struct token *l = up->limit;
438 /* Some of the possible values for yychar use yylval.code
439 instead of yylval.ttype. We only have to worry about
440 yychars that could have been returned by read_token. */
443 case '+': case '-': case '*': case '/':
444 case '%': case '&': case '|': case '^':
445 case '>': case '<': case LSHIFT: case RSHIFT:
446 case ASSIGN: case MIN_MAX: case EQCOMPARE: case ARITHCOMPARE:
451 ggc_mark_tree (t->yylval.ttype);
458 /* Token queue management. */
460 /* Return the number of tokens available on the fifo. */
461 static SPEW_INLINE int
464 return (obstack_object_size (&token_obstack) / sizeof (struct token))
468 /* Fetch the token N down the line from the head of the fifo. */
470 static SPEW_INLINE struct token*
474 #ifdef ENABLE_CHECKING
475 /* could just have this do slurp_ implicitly, but this way is easier
477 my_friendly_assert (n >= 0 && n < num_tokens (), 298);
479 return ((struct token*)obstack_base (&token_obstack)) + n + first_token;
482 static const struct token Teosi = { END_OF_SAVED_INPUT, 0 UNION_INIT_ZERO };
483 static const struct token Tpad = { EMPTY, 0 UNION_INIT_ZERO };
485 /* Copy the next token into T and return its value. */
486 static SPEW_INLINE int
491 return read_token (t);
493 if (feed->input->pos < feed->input->limit)
495 memcpy (t, feed->input->pos, sizeof (struct token));
496 return (feed->input->pos++)->yychar;
499 memcpy (t, &Teosi, sizeof (struct token));
500 return END_OF_SAVED_INPUT;
503 /* Shift the next token onto the fifo. */
504 static SPEW_INLINE int
507 size_t point = obstack_object_size (&token_obstack);
508 obstack_blank (&token_obstack, sizeof (struct token));
509 return add_token ((struct token *) (obstack_base (&token_obstack) + point));
512 /* Consume the next token out of the fifo. */
514 static SPEW_INLINE void
517 if (num_tokens () == 1)
519 obstack_free (&token_obstack, obstack_base (&token_obstack));
526 /* Push a token at the head of the queue; it will be the next token read. */
527 static SPEW_INLINE void
531 if (first_token == 0) /* We hope this doesn't happen often. */
533 size_t active = obstack_object_size (&token_obstack);
534 obstack_blank (&token_obstack, sizeof (struct token));
536 memmove (obstack_base (&token_obstack) + sizeof (struct token),
537 obstack_base (&token_obstack), active);
541 memcpy (nth_token (0), t, sizeof (struct token));
545 /* Pull in enough tokens that the queue is N long beyond the current
553 int num = num_tokens ();
556 /* First, prune any empty tokens at the end. */
558 while (i > 0 && nth_token (i - 1)->yychar == EMPTY)
562 obstack_blank (&token_obstack, -((num - i) * sizeof (struct token)));
566 /* Now, if we already have enough tokens, return. */
570 /* Never read past these characters: they might separate
571 the current input stream from one we save away later. */
572 for (i = 0; i < num; i++)
574 yychar = nth_token (i)->yychar;
575 if (yychar == '{' || yychar == ':' || yychar == ';')
579 while (num_tokens () <= n)
581 yychar = shift_token ();
582 if (yychar == '{' || yychar == ':' || yychar == ';')
588 while (num_tokens () <= n)
589 obstack_grow (&token_obstack, &Tpad, sizeof (struct token));
592 int looking_for_typename;
593 int looking_for_template;
595 static int after_friend;
596 static int after_new;
597 static int do_snarf_defarg;
602 static SPEW_INLINE int
603 identifier_type (decl)
608 if (TREE_CODE (decl) == TEMPLATE_DECL)
610 if (TREE_CODE (DECL_TEMPLATE_RESULT (decl)) == TYPE_DECL)
612 else if (looking_for_template)
615 if (looking_for_template && really_overloaded_fn (decl))
617 /* See through a baselink. */
618 if (TREE_CODE (decl) == TREE_LIST)
619 decl = TREE_VALUE (decl);
621 for (t = decl; t != NULL_TREE; t = OVL_CHAIN (t))
622 if (DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (t)))
625 if (TREE_CODE (decl) == NAMESPACE_DECL)
627 if (TREE_CODE (decl) != TYPE_DECL)
629 if (DECL_ARTIFICIAL (decl) && TREE_TYPE (decl) == current_class_type)
632 /* A constructor declarator for a template type will get here as an
633 implicit typename, a TYPENAME_TYPE with a type. */
635 if (t && TREE_CODE (t) == TYPENAME_TYPE)
637 decl = TREE_TYPE (decl);
638 if (TREE_CODE (decl) == TYPENAME_TYPE)
639 decl = TREE_TYPE (decl);
646 /* token[0] == AGGR (struct/union/enum)
647 Thus, token[1] is either a TYPENAME or a TYPENAME_DEFN.
648 If token[2] == '{' or ':' then it's TYPENAME_DEFN.
649 It's also a definition if it's a forward declaration (as in 'struct Foo;')
650 which we can tell if token[2] == ';' *and* token[-1] != FRIEND or NEW. */
652 static SPEW_INLINE void
658 yc1 = nth_token (1)->yychar;
659 if (yc1 != TYPENAME && yc1 != IDENTIFIER && yc1 != PTYPENAME)
661 yc2 = nth_token (2)->yychar;
664 /* It's a forward declaration iff we were not preceded by
665 'friend' or `new'. */
666 if (after_friend || after_new)
669 else if (yc2 != '{' && yc2 != ':')
675 nth_token (1)->yychar = TYPENAME_DEFN;
678 nth_token (1)->yychar = PTYPENAME_DEFN;
681 nth_token (1)->yychar = IDENTIFIER_DEFN;
684 my_friendly_abort (102);
691 /* Only types expected, not even namespaces. */
692 looking_for_typename = 2;
694 if ((yychar = yylex ()) < 0) yychar = 0;
695 looking_for_typename = 0;
696 if (yychar == IDENTIFIER)
698 lastiddecl = lookup_name (yylval.ttype, -2);
700 yychar = identifier_type (lastiddecl);
708 int old_looking_for_typename = 0;
709 int just_saw_new = 0;
710 int just_saw_friend = 0;
712 timevar_push (TV_LEX);
719 fprintf (stderr, "\t\t## %d @%d ", yylex_ctr, lineno);
726 yylval.ttype = snarf_defarg ();
728 got_object = NULL_TREE;
729 timevar_pop (TV_LEX);
733 /* if we've got tokens, send them */
734 else if (num_tokens ())
735 yychr = nth_token (0)->yychar;
737 yychr = shift_token ();
739 /* many tokens just need to be returned. At first glance, all we
740 have to do is send them back up, but some of them are needed to
741 figure out local context. */
745 /* This is a lexical no-op. */
748 debug_yychar (yychr);
755 if (nth_token (1)->yychar == ')')
767 peek = nth_token (1)->yychar;
768 yychr = frob_id (yychr, peek, &nth_token (0)->yylval.ttype);
771 case IDENTIFIER_DEFN:
776 /* If we see a SCOPE next, restore the old value.
777 Otherwise, we got what we want. */
778 looking_for_typename = old_looking_for_typename;
779 looking_for_template = 0;
783 if (nth_token (0)->yylval.ttype == ridpointers[RID_EXTERN])
786 if (nth_token (1)->yychar == STRING)
788 yychr = EXTERN_LANG_STRING;
789 nth_token (1)->yylval.ttype = get_identifier
790 (TREE_STRING_POINTER (nth_token (1)->yylval.ttype));
794 /* do_aggr needs to know if the previous token was `friend'. */
795 else if (nth_token (0)->yylval.ttype == ridpointers[RID_FRIEND])
801 /* do_aggr needs to know if the previous token was `new'. */
809 /* If this provides a type for us, then revert lexical
810 state to standard state. */
811 looking_for_typename = 0;
819 /* Set this again, in case we are rescanning. */
820 looking_for_typename = 2;
827 after_friend = just_saw_friend;
828 after_new = just_saw_new;
830 /* class member lookup only applies to the first token after the object
831 expression, except for explicit destructor calls. */
833 got_object = NULL_TREE;
837 struct token *tok = nth_token (0);
839 yylval = tok->yylval;
841 lineno = tok->lineno;
846 debug_yychar (yychr);
850 timevar_pop (TV_LEX);
854 /* Unget character CH from the input stream.
855 If RESCAN is non-zero, then we want to `see' this
856 character as the next input token. */
859 yyungetc (ch, rescan)
863 /* Unget a character from the input stream. */
864 if (yychar == YYEMPTY || rescan == 0)
868 /* If we're putting back a brace, undo the change in indent_level
869 from the first time we saw it. */
876 fake.yylval.ttype = 0;
877 fake.lineno = lineno;
887 /* Lexer hackery to determine what *IDP really is. */
890 frob_id (yyc, peek, idp)
896 int old_looking_for_typename = 0;
900 /* Don't interfere with the setting from an 'aggr' prefix. */
901 old_looking_for_typename = looking_for_typename;
902 looking_for_typename = 1;
904 else if (peek == '<')
905 looking_for_template = 1;
906 trrr = lookup_name (*idp, -2);
909 yyc = identifier_type (trrr);
916 /* If this got special lookup, remember it. In these
917 cases, we know it can't be a declarator-id. */
918 if (got_scope || got_object)
926 my_friendly_abort (20000907);
930 lastiddecl = NULL_TREE;
931 got_scope = NULL_TREE;
932 looking_for_typename = old_looking_for_typename;
933 looking_for_template = 0;
937 /* ID is an operator name. Duplicate the hackery in yylex to determine what
940 tree frob_opname (id)
944 frob_id (0, nth_token (0)->yychar, &id);
945 got_object = NULL_TREE;
949 /* Set up the state required to correctly handle the definition of the
950 inline function whose preparsed state has been saved in PI. */
953 begin_parsing_inclass_inline (pi)
954 struct unparsed_text *pi;
958 /* Record that we are processing the chain of inlines starting at
959 PI in a special GC root. */
960 processing_these_inlines = pi;
964 /* If this is an inline function in a local class, we must make sure
965 that we save all pertinent information about the function
966 surrounding the local class. */
967 context = decl_function_context (pi->decl);
969 push_function_context_to (context);
972 interface_unknown = pi->interface == 1;
973 interface_only = pi->interface == 0;
974 DECL_PENDING_INLINE_P (pi->decl) = 0;
975 DECL_PENDING_INLINE_INFO (pi->decl) = 0;
977 /* Pass back a handle to the rest of the inline functions, so that they
978 can be processed later. */
979 yychar = PRE_PARSED_FUNCTION_DECL;
982 start_function (NULL_TREE, pi->decl, NULL_TREE,
983 (SF_DEFAULT | SF_PRE_PARSED | SF_INCLASS_INLINE));
986 /* Called from the top level: if there are any pending inlines to
987 do, set up to process them now. This function sets up the first function
988 to be parsed; after it has been, the rule for fndef in parse.y will
989 call process_next_inline to start working on the next one. */
992 do_pending_inlines ()
994 /* Oops, we're still dealing with the last batch. */
995 if (yychar == PRE_PARSED_FUNCTION_DECL)
1000 /* Clear the chain, so that any inlines nested inside the batch
1001 we're to process now don't refer to this batch. See e.g.
1002 g++.other/lookup6.C. */
1003 struct unparsed_text *first = pending_inlines;
1004 pending_inlines = pending_inlines_tail = 0;
1006 begin_parsing_inclass_inline (first);
1010 /* Called from the fndecl rule in the parser when the function just parsed
1011 was declared using a PRE_PARSED_FUNCTION_DECL (i.e. came from
1012 do_pending_inlines). */
1015 process_next_inline (i)
1016 struct unparsed_text *i;
1018 tree decl = i->decl;
1019 tree context = decl_function_context (decl);
1022 pop_function_context_from (context);
1023 if (yychar == YYEMPTY)
1025 if (yychar != END_OF_SAVED_INPUT)
1026 error ("parse error at end of saved function text");
1031 begin_parsing_inclass_inline (i);
1034 processing_these_inlines = 0;
1035 extract_interface_info ();
1040 /* Subroutine of snarf_method, deals with actual absorption of the block. */
1042 static SPEW_INLINE void
1043 snarf_block (starting_file, starting_line)
1044 const char *starting_file;
1048 int look_for_semicolon = 0;
1049 int look_for_lbrac = 0;
1050 int look_for_catch = 0;
1056 /* We incremented indent_level in yylex; undo that. */
1058 else if (yychar == '=')
1059 look_for_semicolon = 1;
1060 else if (yychar == ':' || yychar == RETURN_KEYWORD || yychar == TRY)
1068 yyerror ("parse error in method specification");
1070 /* The current token is the first one to be recorded. */
1071 tmp.yychar = yychar;
1072 tmp.yylval = yylval;
1073 tmp.lineno = lineno;
1074 obstack_grow (&inline_text_obstack, &tmp, sizeof (struct token));
1078 point = obstack_object_size (&inline_text_obstack);
1079 obstack_blank (&inline_text_obstack, sizeof (struct token));
1080 yyc = add_token ((struct token *)
1081 (obstack_base (&inline_text_obstack) + point));
1088 else if (yyc == '}')
1091 if (blev == 0 && !look_for_semicolon)
1093 if (!look_for_catch)
1096 if (add_token (&tmp) != CATCH)
1103 obstack_grow (&inline_text_obstack, &tmp, sizeof (struct token));
1106 else if (yyc == ';')
1110 error ("function body for constructor missing");
1111 /* fake a { } to avoid further errors */
1112 tmp.yylval.ttype = 0;
1114 obstack_grow (&inline_text_obstack, &tmp, sizeof (struct token));
1116 obstack_grow (&inline_text_obstack, &tmp, sizeof (struct token));
1119 else if (look_for_semicolon && blev == 0)
1124 error_with_file_and_line (starting_file, starting_line,
1125 "end of file read inside definition");
1131 /* This function stores away the text for an inline function that should
1132 be processed later (by do_pending_inlines). */
1137 int starting_lineno = lineno;
1138 const char *starting_filename = input_filename;
1141 struct unparsed_text *meth;
1143 /* Leave room for the header, then absorb the block. */
1144 obstack_blank (&inline_text_obstack, sizeof (struct unparsed_text));
1145 snarf_block (starting_filename, starting_lineno);
1147 len = obstack_object_size (&inline_text_obstack);
1148 meth = (struct unparsed_text *) obstack_finish (&inline_text_obstack);
1150 /* Happens when we get two declarations of the same function in the
1152 if (decl == void_type_node
1153 || (current_class_type && TYPE_REDEFINED (current_class_type)))
1155 obstack_free (&inline_text_obstack, (char *)meth);
1160 meth->filename = starting_filename;
1161 meth->lineno = starting_lineno;
1162 meth->limit = (struct token *) ((char *)meth + len);
1163 meth->interface = (interface_unknown ? 1 : (interface_only ? 0 : 2));
1168 fprintf (stderr, "\tsaved method of %d tokens from %s:%d\n",
1169 meth->limit - (struct token *) (meth + 1),
1170 starting_filename, starting_lineno);
1173 DECL_PENDING_INLINE_INFO (decl) = meth;
1174 DECL_PENDING_INLINE_P (decl) = 1;
1176 if (pending_inlines_tail)
1177 pending_inlines_tail->next = meth;
1179 pending_inlines = meth;
1180 pending_inlines_tail = meth;
1183 /* Consume a no-commas expression - a default argument - and save it
1184 on the inline_text_obstack. */
1189 int starting_lineno = lineno;
1190 const char *starting_filename = input_filename;
1195 struct unparsed_text *buf;
1198 obstack_blank (&inline_text_obstack, sizeof (struct unparsed_text));
1202 point = obstack_object_size (&inline_text_obstack);
1203 obstack_blank (&inline_text_obstack, sizeof (struct token));
1204 yyc = add_token ((struct token *)
1205 (obstack_base (&inline_text_obstack) + point));
1207 if (plev <= 0 && (yyc == ')' || yyc == ','))
1209 else if (yyc == '(' || yyc == '[')
1211 else if (yyc == ']' || yyc == ')')
1215 error_with_file_and_line (starting_filename, starting_lineno,
1216 "end of file read inside default argument");
1221 /* Unget the last token. */
1222 push_token ((struct token *) (obstack_base (&inline_text_obstack) + point));
1223 /* This is the documented way to shrink a growing obstack block. */
1224 obstack_blank (&inline_text_obstack, - (int) sizeof (struct token));
1227 len = obstack_object_size (&inline_text_obstack);
1228 buf = (struct unparsed_text *) obstack_finish (&inline_text_obstack);
1231 buf->filename = starting_filename;
1232 buf->lineno = starting_lineno;
1233 buf->limit = (struct token *) ((char *)buf + len);
1238 fprintf (stderr, "\tsaved defarg of %d tokens from %s:%d\n",
1239 buf->limit - (struct token *) (buf + 1),
1240 starting_filename, starting_lineno);
1243 arg = make_node (DEFAULT_ARG);
1244 DEFARG_POINTER (arg) = (char *)buf;
1249 /* Decide whether the default argument we are about to see should be
1250 gobbled up as text for later parsing. */
1253 maybe_snarf_defarg ()
1255 if (current_class_type && TYPE_BEING_DEFINED (current_class_type))
1256 do_snarf_defarg = 1;
1259 /* Called from grokfndecl to note a function decl with unparsed default
1260 arguments for later processing. Also called from grokdeclarator
1261 for function types with unparsed defargs; the call from grokfndecl
1262 will always come second, so we can overwrite the entry from the type. */
1265 add_defarg_fn (decl)
1268 if (TREE_CODE (decl) == FUNCTION_DECL)
1269 TREE_VALUE (defarg_fns) = decl;
1272 defarg_fns = tree_cons (NULL_TREE, decl, defarg_fns);
1273 TREE_TYPE (defarg_fns) = current_class_type;
1277 /* Helper for do_pending_defargs. Starts the parsing of a default arg. */
1283 tree d = TREE_PURPOSE (p);
1285 feed_input ((struct unparsed_text *)DEFARG_POINTER (d));
1286 yychar = DEFARG_MARKER;
1290 /* Helper for do_pending_defargs. Ends the parsing of a default arg. */
1295 if (yychar == YYEMPTY)
1297 if (yychar != END_OF_SAVED_INPUT)
1298 error ("parse error at end of saved function text");
1303 /* Main function for deferred parsing of default arguments. Called from
1307 do_pending_defargs ()
1314 tree current = defarg_fns;
1316 tree defarg_fn = TREE_VALUE (defarg_fns);
1317 if (defarg_parm == NULL_TREE)
1319 push_nested_class (TREE_TYPE (defarg_fns), 1);
1321 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1322 maybe_begin_member_template_processing (defarg_fn);
1324 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1325 defarg_parm = TYPE_ARG_TYPES (TREE_TYPE (defarg_fn));
1327 defarg_parm = TYPE_ARG_TYPES (defarg_fn);
1330 defarg_parm = TREE_CHAIN (defarg_parm);
1332 for (; defarg_parm; defarg_parm = TREE_CHAIN (defarg_parm))
1333 if (!TREE_PURPOSE (defarg_parm)
1334 || TREE_CODE (TREE_PURPOSE (defarg_parm)) != DEFAULT_ARG)
1336 else if (TREE_PURPOSE (current) == error_mark_node)
1337 DEFARG_POINTER (TREE_PURPOSE (defarg_parm)) = NULL;
1340 feed_defarg (defarg_parm);
1342 /* Return to the parser, which will process this defarg
1343 and call us again. */
1347 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1349 maybe_end_member_template_processing ();
1350 check_default_args (defarg_fn);
1354 pop_nested_class ();
1356 defarg_fns = TREE_CHAIN (defarg_fns);
1359 /* This function's default args depend on unprocessed default args
1360 of defarg_fns. We will need to reprocess this function, and
1361 check for circular dependancies. */
1364 for (a = defarg_depfns, b = TREE_PURPOSE (current); a && b;
1365 a = TREE_CHAIN (a), b = TREE_CHAIN (b))
1366 if (TREE_VALUE (a) != TREE_VALUE (b))
1371 TREE_CHAIN (current) = NULL_TREE;
1372 defarg_fns = chainon (defarg_fns, current);
1373 TREE_PURPOSE (current) = defarg_depfns;
1377 cp_warning_at ("circular dependency in default args of `%#D'", defarg_fn);
1378 /* No need to say what else is dependent, as they will be
1379 picked up in another pass. */
1381 /* Immediately repeat, but marked so that we break the loop. */
1382 defarg_fns = current;
1383 TREE_PURPOSE (current) = error_mark_node;
1385 defarg_depfns = NULL_TREE;
1387 else if (TREE_PURPOSE (current) == error_mark_node)
1388 defarg_fnsdone = tree_cons (NULL_TREE, defarg_fn, defarg_fnsdone);
1392 /* After parsing all the default arguments, we must clear any that remain,
1393 which will be part of a circular dependency. */
1395 done_pending_defargs ()
1397 for (; defarg_fnsdone; defarg_fnsdone = TREE_CHAIN (defarg_fnsdone))
1399 tree fn = TREE_VALUE (defarg_fnsdone);
1402 if (TREE_CODE (fn) == FUNCTION_DECL)
1403 parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
1405 parms = TYPE_ARG_TYPES (fn);
1406 for (; parms; parms = TREE_CHAIN (parms))
1407 if (TREE_PURPOSE (parms)
1408 && TREE_CODE (TREE_PURPOSE (parms)) == DEFAULT_ARG)
1410 my_friendly_assert (!DEFARG_POINTER (TREE_PURPOSE (parms)), 20010107);
1411 TREE_PURPOSE (parms) = NULL_TREE;
1416 /* In processing the current default arg, we called FN, but that call
1417 required a default argument of FN, and that had not yet been processed.
1421 unprocessed_defarg_fn (fn)
1424 defarg_depfns = tree_cons (NULL_TREE, fn, defarg_depfns);
1427 /* Called from the parser to update an element of TYPE_ARG_TYPES for some
1428 FUNCTION_TYPE with the newly parsed version of its default argument, which
1429 was previously digested as text. */
1432 replace_defarg (arg, init)
1435 if (init == error_mark_node)
1436 TREE_PURPOSE (arg) = error_mark_node;
1439 if (! processing_template_decl
1440 && ! can_convert_arg (TREE_VALUE (arg), TREE_TYPE (init), init))
1441 cp_pedwarn ("invalid type `%T' for default argument to `%T'",
1442 TREE_TYPE (init), TREE_VALUE (arg));
1444 TREE_PURPOSE (arg) = init;
1449 /* debug_yychar takes a yychar (token number) value and prints its name. */
1456 fprintf (stderr, "->%d < %c >\n", lineno, yy);
1457 else if (yy == IDENTIFIER || yy == TYPENAME)
1460 if (TREE_CODE (yylval.ttype) == IDENTIFIER_NODE)
1461 id = IDENTIFIER_POINTER (yylval.ttype);
1462 else if (TREE_CODE_CLASS (TREE_CODE (yylval.ttype)) == 'd')
1463 id = IDENTIFIER_POINTER (DECL_NAME (yylval.ttype));
1466 fprintf (stderr, "->%d <%s `%s'>\n", lineno, debug_yytranslate (yy), id);
1469 fprintf (stderr, "->%d <%s>\n", lineno, debug_yytranslate (yy));
1474 #define NAME(type) cpp_type2name (type)
1480 const char *string = _(msgid);
1482 if (last_token == CPP_EOF)
1483 error ("%s at end of input", string);
1484 else if (last_token == CPP_CHAR || last_token == CPP_WCHAR)
1486 unsigned int val = TREE_INT_CST_LOW (yylval.ttype);
1487 const char *ell = (last_token == CPP_CHAR) ? "" : "L";
1488 if (val <= UCHAR_MAX && ISGRAPH (val))
1489 error ("%s before %s'%c'", string, ell, val);
1491 error ("%s before %s'\\x%x'", string, ell, val);
1493 else if (last_token == CPP_STRING
1494 || last_token == CPP_WSTRING)
1495 error ("%s before string constant", string);
1496 else if (last_token == CPP_NUMBER)
1497 error ("%s before numeric constant", string);
1498 else if (last_token == CPP_NAME)
1500 if (TREE_CODE (last_token_id) == IDENTIFIER_NODE)
1501 error ("%s before `%s'", string, IDENTIFIER_POINTER (last_token_id));
1502 else if (ISGRAPH (yychar))
1503 error ("%s before `%c'", string, yychar);
1505 error ("%s before `\%o'", string, yychar);
1508 error ("%s before `%s' token", string, NAME (last_token));