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);
348 t->yychar = CONSTANT;
357 yyerror ("parse error");
365 static SPEW_INLINE void
367 struct unparsed_text *input;
375 f = obstack_alloc (&feed_obstack, sizeof (struct feed));
377 /* The token list starts just after the struct unparsed_text in memory. */
378 input->pos = (struct token *) (input + 1);
382 fprintf (stderr, "\tfeeding %s:%d [%d tokens]\n",
383 input->filename, input->lineno, input->limit - input->pos);
387 f->filename = input_filename;
391 f->first_token = first_token;
392 f->token_obstack = token_obstack;
395 input_filename = input->filename;
396 lineno = input->lineno;
398 yylval.ttype = NULL_TREE;
400 gcc_obstack_init (&token_obstack);
404 static SPEW_INLINE void
407 struct feed *f = feed;
409 input_filename = f->filename;
413 first_token = f->first_token;
414 obstack_free (&token_obstack, 0);
415 token_obstack = f->token_obstack;
418 obstack_free (&feed_obstack, f);
422 fprintf (stderr, "\treturning to %s:%d\n", input_filename, lineno);
426 /* GC callback to mark memory pointed to by the pending inline queue. */
428 mark_pending_inlines (pi)
431 struct unparsed_text *up = * (struct unparsed_text **)pi;
435 struct token *t = (struct token *) (up + 1);
436 struct token *l = up->limit;
440 /* Some of the possible values for yychar use yylval.code
441 instead of yylval.ttype. We only have to worry about
442 yychars that could have been returned by read_token. */
445 case '+': case '-': case '*': case '/':
446 case '%': case '&': case '|': case '^':
447 case '>': case '<': case LSHIFT: case RSHIFT:
448 case ASSIGN: case MIN_MAX: case EQCOMPARE: case ARITHCOMPARE:
453 ggc_mark_tree (t->yylval.ttype);
460 /* Token queue management. */
462 /* Return the number of tokens available on the fifo. */
463 static SPEW_INLINE int
466 return (obstack_object_size (&token_obstack) / sizeof (struct token))
470 /* Fetch the token N down the line from the head of the fifo. */
472 static SPEW_INLINE struct token*
476 #ifdef ENABLE_CHECKING
477 /* could just have this do slurp_ implicitly, but this way is easier
479 my_friendly_assert (n >= 0 && n < num_tokens (), 298);
481 return ((struct token*)obstack_base (&token_obstack)) + n + first_token;
484 static const struct token Teosi = { END_OF_SAVED_INPUT, 0 UNION_INIT_ZERO };
485 static const struct token Tpad = { EMPTY, 0 UNION_INIT_ZERO };
487 /* Copy the next token into T and return its value. */
488 static SPEW_INLINE int
493 return read_token (t);
495 if (feed->input->pos < feed->input->limit)
497 memcpy (t, feed->input->pos, sizeof (struct token));
498 return (feed->input->pos++)->yychar;
501 memcpy (t, &Teosi, sizeof (struct token));
502 return END_OF_SAVED_INPUT;
505 /* Shift the next token onto the fifo. */
506 static SPEW_INLINE int
509 size_t point = obstack_object_size (&token_obstack);
510 obstack_blank (&token_obstack, sizeof (struct token));
511 return add_token ((struct token *) (obstack_base (&token_obstack) + point));
514 /* Consume the next token out of the fifo. */
516 static SPEW_INLINE void
519 if (num_tokens () == 1)
521 obstack_free (&token_obstack, obstack_base (&token_obstack));
528 /* Push a token at the head of the queue; it will be the next token read. */
529 static SPEW_INLINE void
533 if (first_token == 0) /* We hope this doesn't happen often. */
535 size_t active = obstack_object_size (&token_obstack);
536 obstack_blank (&token_obstack, sizeof (struct token));
538 memmove (obstack_base (&token_obstack) + sizeof (struct token),
539 obstack_base (&token_obstack), active);
543 memcpy (nth_token (0), t, sizeof (struct token));
547 /* Pull in enough tokens that the queue is N long beyond the current
555 int num = num_tokens ();
558 /* First, prune any empty tokens at the end. */
560 while (i > 0 && nth_token (i - 1)->yychar == EMPTY)
564 obstack_blank (&token_obstack, -((num - i) * sizeof (struct token)));
568 /* Now, if we already have enough tokens, return. */
572 /* Never read past these characters: they might separate
573 the current input stream from one we save away later. */
574 for (i = 0; i < num; i++)
576 yychar = nth_token (i)->yychar;
577 if (yychar == '{' || yychar == ':' || yychar == ';')
581 while (num_tokens () <= n)
583 yychar = shift_token ();
584 if (yychar == '{' || yychar == ':' || yychar == ';')
590 while (num_tokens () <= n)
591 obstack_grow (&token_obstack, &Tpad, sizeof (struct token));
594 int looking_for_typename;
595 int looking_for_template;
597 static int after_friend;
598 static int after_new;
599 static int do_snarf_defarg;
604 static SPEW_INLINE int
605 identifier_type (decl)
610 if (TREE_CODE (decl) == TEMPLATE_DECL)
612 if (TREE_CODE (DECL_TEMPLATE_RESULT (decl)) == TYPE_DECL)
614 else if (looking_for_template)
617 if (looking_for_template && really_overloaded_fn (decl))
619 /* See through a baselink. */
620 if (TREE_CODE (decl) == TREE_LIST)
621 decl = TREE_VALUE (decl);
623 for (t = decl; t != NULL_TREE; t = OVL_CHAIN (t))
624 if (DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (t)))
627 if (TREE_CODE (decl) == NAMESPACE_DECL)
629 if (TREE_CODE (decl) != TYPE_DECL)
631 if (DECL_ARTIFICIAL (decl) && TREE_TYPE (decl) == current_class_type)
634 /* A constructor declarator for a template type will get here as an
635 implicit typename, a TYPENAME_TYPE with a type. */
637 if (t && TREE_CODE (t) == TYPENAME_TYPE)
639 decl = TREE_TYPE (decl);
640 if (TREE_CODE (decl) == TYPENAME_TYPE)
641 decl = TREE_TYPE (decl);
648 /* token[0] == AGGR (struct/union/enum)
649 Thus, token[1] is either a TYPENAME or a TYPENAME_DEFN.
650 If token[2] == '{' or ':' then it's TYPENAME_DEFN.
651 It's also a definition if it's a forward declaration (as in 'struct Foo;')
652 which we can tell if token[2] == ';' *and* token[-1] != FRIEND or NEW. */
654 static SPEW_INLINE void
660 yc1 = nth_token (1)->yychar;
661 if (yc1 != TYPENAME && yc1 != IDENTIFIER && yc1 != PTYPENAME)
663 yc2 = nth_token (2)->yychar;
666 /* It's a forward declaration iff we were not preceded by
667 'friend' or `new'. */
668 if (after_friend || after_new)
671 else if (yc2 != '{' && yc2 != ':')
677 nth_token (1)->yychar = TYPENAME_DEFN;
680 nth_token (1)->yychar = PTYPENAME_DEFN;
683 nth_token (1)->yychar = IDENTIFIER_DEFN;
686 my_friendly_abort (102);
693 /* Only types expected, not even namespaces. */
694 looking_for_typename = 2;
696 if ((yychar = yylex ()) < 0) yychar = 0;
697 looking_for_typename = 0;
698 if (yychar == IDENTIFIER)
700 lastiddecl = lookup_name (yylval.ttype, -2);
702 yychar = identifier_type (lastiddecl);
710 int old_looking_for_typename = 0;
711 int just_saw_new = 0;
712 int just_saw_friend = 0;
714 timevar_push (TV_LEX);
721 fprintf (stderr, "\t\t## %d @%d ", yylex_ctr, lineno);
728 yylval.ttype = snarf_defarg ();
730 got_object = NULL_TREE;
731 timevar_pop (TV_LEX);
735 /* if we've got tokens, send them */
736 else if (num_tokens ())
737 yychr = nth_token (0)->yychar;
739 yychr = shift_token ();
741 /* many tokens just need to be returned. At first glance, all we
742 have to do is send them back up, but some of them are needed to
743 figure out local context. */
747 /* This is a lexical no-op. */
750 debug_yychar (yychr);
757 if (nth_token (1)->yychar == ')')
769 peek = nth_token (1)->yychar;
770 yychr = frob_id (yychr, peek, &nth_token (0)->yylval.ttype);
773 case IDENTIFIER_DEFN:
778 /* If we see a SCOPE next, restore the old value.
779 Otherwise, we got what we want. */
780 looking_for_typename = old_looking_for_typename;
781 looking_for_template = 0;
785 if (nth_token (0)->yylval.ttype == ridpointers[RID_EXTERN])
788 if (nth_token (1)->yychar == STRING)
790 yychr = EXTERN_LANG_STRING;
791 nth_token (1)->yylval.ttype = get_identifier
792 (TREE_STRING_POINTER (nth_token (1)->yylval.ttype));
796 /* do_aggr needs to know if the previous token was `friend'. */
797 else if (nth_token (0)->yylval.ttype == ridpointers[RID_FRIEND])
803 /* do_aggr needs to know if the previous token was `new'. */
811 /* If this provides a type for us, then revert lexical
812 state to standard state. */
813 looking_for_typename = 0;
821 /* Set this again, in case we are rescanning. */
822 looking_for_typename = 2;
829 after_friend = just_saw_friend;
830 after_new = just_saw_new;
832 /* class member lookup only applies to the first token after the object
833 expression, except for explicit destructor calls. */
835 got_object = NULL_TREE;
838 yylval = nth_token (0)->yylval;
839 lineno = nth_token (0)->lineno;
843 debug_yychar (yychr);
847 timevar_pop (TV_LEX);
851 /* Unget character CH from the input stream.
852 If RESCAN is non-zero, then we want to `see' this
853 character as the next input token. */
856 yyungetc (ch, rescan)
860 /* Unget a character from the input stream. */
861 if (yychar == YYEMPTY || rescan == 0)
865 /* If we're putting back a brace, undo the change in indent_level
866 from the first time we saw it. */
873 fake.yylval.ttype = 0;
874 fake.lineno = lineno;
884 /* Lexer hackery to determine what *IDP really is. */
887 frob_id (yyc, peek, idp)
893 int old_looking_for_typename = 0;
897 /* Don't interfere with the setting from an 'aggr' prefix. */
898 old_looking_for_typename = looking_for_typename;
899 looking_for_typename = 1;
901 else if (peek == '<')
902 looking_for_template = 1;
903 trrr = lookup_name (*idp, -2);
906 yyc = identifier_type (trrr);
913 /* If this got special lookup, remember it. In these
914 cases, we know it can't be a declarator-id. */
915 if (got_scope || got_object)
923 my_friendly_abort (20000907);
927 lastiddecl = NULL_TREE;
928 got_scope = NULL_TREE;
929 looking_for_typename = old_looking_for_typename;
930 looking_for_template = 0;
934 /* ID is an operator name. Duplicate the hackery in yylex to determine what
937 tree frob_opname (id)
941 frob_id (0, nth_token (0)->yychar, &id);
942 got_object = NULL_TREE;
946 /* Set up the state required to correctly handle the definition of the
947 inline function whose preparsed state has been saved in PI. */
950 begin_parsing_inclass_inline (pi)
951 struct unparsed_text *pi;
955 /* Record that we are processing the chain of inlines starting at
956 PI in a special GC root. */
957 processing_these_inlines = pi;
961 /* If this is an inline function in a local class, we must make sure
962 that we save all pertinent information about the function
963 surrounding the local class. */
964 context = decl_function_context (pi->decl);
966 push_function_context_to (context);
969 interface_unknown = pi->interface == 1;
970 interface_only = pi->interface == 0;
971 DECL_PENDING_INLINE_P (pi->decl) = 0;
972 DECL_PENDING_INLINE_INFO (pi->decl) = 0;
974 /* Pass back a handle to the rest of the inline functions, so that they
975 can be processed later. */
976 yychar = PRE_PARSED_FUNCTION_DECL;
979 start_function (NULL_TREE, pi->decl, NULL_TREE,
980 (SF_DEFAULT | SF_PRE_PARSED | SF_INCLASS_INLINE));
983 /* Called from the top level: if there are any pending inlines to
984 do, set up to process them now. This function sets up the first function
985 to be parsed; after it has been, the rule for fndef in parse.y will
986 call process_next_inline to start working on the next one. */
989 do_pending_inlines ()
991 /* Oops, we're still dealing with the last batch. */
992 if (yychar == PRE_PARSED_FUNCTION_DECL)
997 /* Clear the chain, so that any inlines nested inside the batch
998 we're to process now don't refer to this batch. See e.g.
999 g++.other/lookup6.C. */
1000 struct unparsed_text *first = pending_inlines;
1001 pending_inlines = pending_inlines_tail = 0;
1003 begin_parsing_inclass_inline (first);
1007 /* Called from the fndecl rule in the parser when the function just parsed
1008 was declared using a PRE_PARSED_FUNCTION_DECL (i.e. came from
1009 do_pending_inlines). */
1012 process_next_inline (i)
1013 struct unparsed_text *i;
1015 tree decl = i->decl;
1016 tree context = decl_function_context (decl);
1019 pop_function_context_from (context);
1020 if (yychar == YYEMPTY)
1022 if (yychar != END_OF_SAVED_INPUT)
1023 error ("parse error at end of saved function text");
1028 begin_parsing_inclass_inline (i);
1031 processing_these_inlines = 0;
1032 extract_interface_info ();
1037 /* Subroutine of snarf_method, deals with actual absorption of the block. */
1039 static SPEW_INLINE void
1040 snarf_block (starting_file, starting_line)
1041 const char *starting_file;
1045 int look_for_semicolon = 0;
1046 int look_for_lbrac = 0;
1047 int look_for_catch = 0;
1053 /* We incremented indent_level in yylex; undo that. */
1055 else if (yychar == '=')
1056 look_for_semicolon = 1;
1057 else if (yychar == ':' || yychar == RETURN_KEYWORD || yychar == TRY)
1065 yyerror ("parse error in method specification");
1067 /* The current token is the first one to be recorded. */
1068 tmp.yychar = yychar;
1069 tmp.yylval = yylval;
1070 tmp.lineno = lineno;
1071 obstack_grow (&inline_text_obstack, &tmp, sizeof (struct token));
1075 point = obstack_object_size (&inline_text_obstack);
1076 obstack_blank (&inline_text_obstack, sizeof (struct token));
1077 yyc = add_token ((struct token *)
1078 (obstack_base (&inline_text_obstack) + point));
1085 else if (yyc == '}')
1088 if (blev == 0 && !look_for_semicolon)
1090 if (!look_for_catch)
1093 if (add_token (&tmp) != CATCH)
1100 obstack_grow (&inline_text_obstack, &tmp, sizeof (struct token));
1103 else if (yyc == ';')
1107 error ("function body for constructor missing");
1108 /* fake a { } to avoid further errors */
1109 tmp.yylval.ttype = 0;
1111 obstack_grow (&inline_text_obstack, &tmp, sizeof (struct token));
1113 obstack_grow (&inline_text_obstack, &tmp, sizeof (struct token));
1116 else if (look_for_semicolon && blev == 0)
1121 error_with_file_and_line (starting_file, starting_line,
1122 "end of file read inside definition");
1128 /* This function stores away the text for an inline function that should
1129 be processed later (by do_pending_inlines). */
1134 int starting_lineno = lineno;
1135 const char *starting_filename = input_filename;
1138 struct unparsed_text *meth;
1140 /* Leave room for the header, then absorb the block. */
1141 obstack_blank (&inline_text_obstack, sizeof (struct unparsed_text));
1142 snarf_block (starting_filename, starting_lineno);
1144 len = obstack_object_size (&inline_text_obstack);
1145 meth = (struct unparsed_text *) obstack_finish (&inline_text_obstack);
1147 /* Happens when we get two declarations of the same function in the
1149 if (decl == void_type_node
1150 || (current_class_type && TYPE_REDEFINED (current_class_type)))
1152 obstack_free (&inline_text_obstack, (char *)meth);
1157 meth->filename = starting_filename;
1158 meth->lineno = starting_lineno;
1159 meth->limit = (struct token *) ((char *)meth + len);
1160 meth->interface = (interface_unknown ? 1 : (interface_only ? 0 : 2));
1165 fprintf (stderr, "\tsaved method of %d tokens from %s:%d\n",
1166 meth->limit - (struct token *) (meth + 1),
1167 starting_filename, starting_lineno);
1170 DECL_PENDING_INLINE_INFO (decl) = meth;
1171 DECL_PENDING_INLINE_P (decl) = 1;
1173 if (pending_inlines_tail)
1174 pending_inlines_tail->next = meth;
1176 pending_inlines = meth;
1177 pending_inlines_tail = meth;
1180 /* Consume a no-commas expression - a default argument - and save it
1181 on the inline_text_obstack. */
1186 int starting_lineno = lineno;
1187 const char *starting_filename = input_filename;
1192 struct unparsed_text *buf;
1195 obstack_blank (&inline_text_obstack, sizeof (struct unparsed_text));
1199 point = obstack_object_size (&inline_text_obstack);
1200 obstack_blank (&inline_text_obstack, sizeof (struct token));
1201 yyc = add_token ((struct token *)
1202 (obstack_base (&inline_text_obstack) + point));
1204 if (plev <= 0 && (yyc == ')' || yyc == ','))
1206 else if (yyc == '(' || yyc == '[')
1208 else if (yyc == ']' || yyc == ')')
1212 error_with_file_and_line (starting_filename, starting_lineno,
1213 "end of file read inside default argument");
1218 /* Unget the last token. */
1219 push_token ((struct token *) (obstack_base (&inline_text_obstack) + point));
1220 /* This is the documented way to shrink a growing obstack block. */
1221 obstack_blank (&inline_text_obstack, - (int) sizeof (struct token));
1224 len = obstack_object_size (&inline_text_obstack);
1225 buf = (struct unparsed_text *) obstack_finish (&inline_text_obstack);
1228 buf->filename = starting_filename;
1229 buf->lineno = starting_lineno;
1230 buf->limit = (struct token *) ((char *)buf + len);
1235 fprintf (stderr, "\tsaved defarg of %d tokens from %s:%d\n",
1236 buf->limit - (struct token *) (buf + 1),
1237 starting_filename, starting_lineno);
1240 arg = make_node (DEFAULT_ARG);
1241 DEFARG_POINTER (arg) = (char *)buf;
1246 /* Decide whether the default argument we are about to see should be
1247 gobbled up as text for later parsing. */
1250 maybe_snarf_defarg ()
1252 if (current_class_type && TYPE_BEING_DEFINED (current_class_type))
1253 do_snarf_defarg = 1;
1256 /* Called from grokfndecl to note a function decl with unparsed default
1257 arguments for later processing. Also called from grokdeclarator
1258 for function types with unparsed defargs; the call from grokfndecl
1259 will always come second, so we can overwrite the entry from the type. */
1262 add_defarg_fn (decl)
1265 if (TREE_CODE (decl) == FUNCTION_DECL)
1266 TREE_VALUE (defarg_fns) = decl;
1269 defarg_fns = tree_cons (NULL_TREE, decl, defarg_fns);
1270 TREE_TYPE (defarg_fns) = current_class_type;
1274 /* Helper for do_pending_defargs. Starts the parsing of a default arg. */
1280 tree d = TREE_PURPOSE (p);
1282 feed_input ((struct unparsed_text *)DEFARG_POINTER (d));
1283 yychar = DEFARG_MARKER;
1287 /* Helper for do_pending_defargs. Ends the parsing of a default arg. */
1292 if (yychar == YYEMPTY)
1294 if (yychar != END_OF_SAVED_INPUT)
1295 error ("parse error at end of saved function text");
1300 /* Main function for deferred parsing of default arguments. Called from
1304 do_pending_defargs ()
1311 tree current = defarg_fns;
1313 tree defarg_fn = TREE_VALUE (defarg_fns);
1314 if (defarg_parm == NULL_TREE)
1316 push_nested_class (TREE_TYPE (defarg_fns), 1);
1318 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1319 maybe_begin_member_template_processing (defarg_fn);
1321 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1322 defarg_parm = TYPE_ARG_TYPES (TREE_TYPE (defarg_fn));
1324 defarg_parm = TYPE_ARG_TYPES (defarg_fn);
1327 defarg_parm = TREE_CHAIN (defarg_parm);
1329 for (; defarg_parm; defarg_parm = TREE_CHAIN (defarg_parm))
1330 if (!TREE_PURPOSE (defarg_parm)
1331 || TREE_CODE (TREE_PURPOSE (defarg_parm)) != DEFAULT_ARG)
1333 else if (TREE_PURPOSE (current) == error_mark_node)
1334 DEFARG_POINTER (TREE_PURPOSE (defarg_parm)) = NULL;
1337 feed_defarg (defarg_parm);
1339 /* Return to the parser, which will process this defarg
1340 and call us again. */
1344 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1346 maybe_end_member_template_processing ();
1347 check_default_args (defarg_fn);
1351 pop_nested_class ();
1353 defarg_fns = TREE_CHAIN (defarg_fns);
1356 /* This function's default args depend on unprocessed default args
1357 of defarg_fns. We will need to reprocess this function, and
1358 check for circular dependancies. */
1361 for (a = defarg_depfns, b = TREE_PURPOSE (current); a && b;
1362 a = TREE_CHAIN (a), b = TREE_CHAIN (b))
1363 if (TREE_VALUE (a) != TREE_VALUE (b))
1368 TREE_CHAIN (current) = NULL_TREE;
1369 defarg_fns = chainon (defarg_fns, current);
1370 TREE_PURPOSE (current) = defarg_depfns;
1374 cp_warning_at ("circular dependency in default args of `%#D'", defarg_fn);
1375 /* No need to say what else is dependent, as they will be
1376 picked up in another pass. */
1378 /* Immediately repeat, but marked so that we break the loop. */
1379 defarg_fns = current;
1380 TREE_PURPOSE (current) = error_mark_node;
1382 defarg_depfns = NULL_TREE;
1384 else if (TREE_PURPOSE (current) == error_mark_node)
1385 defarg_fnsdone = tree_cons (NULL_TREE, defarg_fn, defarg_fnsdone);
1389 /* After parsing all the default arguments, we must clear any that remain,
1390 which will be part of a circular dependency. */
1392 done_pending_defargs ()
1394 for (; defarg_fnsdone; defarg_fnsdone = TREE_CHAIN (defarg_fnsdone))
1396 tree fn = TREE_VALUE (defarg_fnsdone);
1399 if (TREE_CODE (fn) == FUNCTION_DECL)
1400 parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
1402 parms = TYPE_ARG_TYPES (fn);
1403 for (; parms; parms = TREE_CHAIN (parms))
1404 if (TREE_PURPOSE (parms)
1405 && TREE_CODE (TREE_PURPOSE (parms)) == DEFAULT_ARG)
1407 my_friendly_assert (!DEFARG_POINTER (TREE_PURPOSE (parms)), 20010107);
1408 TREE_PURPOSE (parms) = NULL_TREE;
1413 /* In processing the current default arg, we called FN, but that call
1414 required a default argument of FN, and that had not yet been processed.
1418 unprocessed_defarg_fn (fn)
1421 defarg_depfns = tree_cons (NULL_TREE, fn, defarg_depfns);
1424 /* Called from the parser to update an element of TYPE_ARG_TYPES for some
1425 FUNCTION_TYPE with the newly parsed version of its default argument, which
1426 was previously digested as text. */
1429 replace_defarg (arg, init)
1432 if (init == error_mark_node)
1433 TREE_PURPOSE (arg) = error_mark_node;
1436 if (! processing_template_decl
1437 && ! can_convert_arg (TREE_VALUE (arg), TREE_TYPE (init), init))
1438 cp_pedwarn ("invalid type `%T' for default argument to `%T'",
1439 TREE_TYPE (init), TREE_VALUE (arg));
1441 TREE_PURPOSE (arg) = init;
1446 /* debug_yychar takes a yychar (token number) value and prints its name. */
1453 fprintf (stderr, "->%d < %c >\n", lineno, yy);
1454 else if (yy == IDENTIFIER || yy == TYPENAME)
1457 if (TREE_CODE (yylval.ttype) == IDENTIFIER_NODE)
1458 id = IDENTIFIER_POINTER (yylval.ttype);
1459 else if (TREE_CODE_CLASS (TREE_CODE (yylval.ttype)) == 'd')
1460 id = IDENTIFIER_POINTER (DECL_NAME (yylval.ttype));
1463 fprintf (stderr, "->%d <%s `%s'>\n", lineno, debug_yytranslate (yy), id);
1466 fprintf (stderr, "->%d <%s>\n", lineno, debug_yytranslate (yy));
1471 #define NAME(type) cpp_type2name (type)
1477 const char *string = _(msgid);
1479 if (last_token == CPP_EOF)
1480 error ("%s at end of input", string);
1481 else if (last_token == CPP_CHAR || last_token == CPP_WCHAR)
1483 unsigned int val = TREE_INT_CST_LOW (yylval.ttype);
1484 const char *ell = (last_token == CPP_CHAR) ? "" : "L";
1485 if (val <= UCHAR_MAX && ISGRAPH (val))
1486 error ("%s before %s'%c'", string, ell, val);
1488 error ("%s before %s'\\x%x'", string, ell, val);
1490 else if (last_token == CPP_STRING
1491 || last_token == CPP_WSTRING)
1492 error ("%s before string constant", string);
1493 else if (last_token == CPP_NUMBER
1494 || last_token == CPP_INT
1495 || last_token == CPP_FLOAT)
1496 error ("%s before numeric constant", string);
1497 else if (last_token == CPP_NAME)
1499 if (TREE_CODE (last_token_id) == IDENTIFIER_NODE)
1500 error ("%s before `%s'", string, IDENTIFIER_POINTER (last_token_id));
1501 else if (ISGRAPH (yychar))
1502 error ("%s before `%c'", string, yychar);
1504 error ("%s before `\%o'", string, yychar);
1507 error ("%s before `%s' token", string, NAME (last_token));