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;
836 yylval = nth_token (0)->yylval;
837 lineno = nth_token (0)->lineno;
841 debug_yychar (yychr);
845 timevar_pop (TV_LEX);
849 /* Unget character CH from the input stream.
850 If RESCAN is non-zero, then we want to `see' this
851 character as the next input token. */
854 yyungetc (ch, rescan)
858 /* Unget a character from the input stream. */
859 if (yychar == YYEMPTY || rescan == 0)
863 /* If we're putting back a brace, undo the change in indent_level
864 from the first time we saw it. */
871 fake.yylval.ttype = 0;
872 fake.lineno = lineno;
882 /* Lexer hackery to determine what *IDP really is. */
885 frob_id (yyc, peek, idp)
891 int old_looking_for_typename = 0;
895 /* Don't interfere with the setting from an 'aggr' prefix. */
896 old_looking_for_typename = looking_for_typename;
897 looking_for_typename = 1;
899 else if (peek == '<')
900 looking_for_template = 1;
901 trrr = lookup_name (*idp, -2);
904 yyc = identifier_type (trrr);
911 /* If this got special lookup, remember it. In these
912 cases, we know it can't be a declarator-id. */
913 if (got_scope || got_object)
921 my_friendly_abort (20000907);
925 lastiddecl = NULL_TREE;
926 got_scope = NULL_TREE;
927 looking_for_typename = old_looking_for_typename;
928 looking_for_template = 0;
932 /* ID is an operator name. Duplicate the hackery in yylex to determine what
935 tree frob_opname (id)
939 frob_id (0, nth_token (0)->yychar, &id);
940 got_object = NULL_TREE;
944 /* Set up the state required to correctly handle the definition of the
945 inline function whose preparsed state has been saved in PI. */
948 begin_parsing_inclass_inline (pi)
949 struct unparsed_text *pi;
953 /* Record that we are processing the chain of inlines starting at
954 PI in a special GC root. */
955 processing_these_inlines = pi;
959 /* If this is an inline function in a local class, we must make sure
960 that we save all pertinent information about the function
961 surrounding the local class. */
962 context = decl_function_context (pi->decl);
964 push_function_context_to (context);
967 interface_unknown = pi->interface == 1;
968 interface_only = pi->interface == 0;
969 DECL_PENDING_INLINE_P (pi->decl) = 0;
970 DECL_PENDING_INLINE_INFO (pi->decl) = 0;
972 /* Pass back a handle to the rest of the inline functions, so that they
973 can be processed later. */
974 yychar = PRE_PARSED_FUNCTION_DECL;
977 start_function (NULL_TREE, pi->decl, NULL_TREE,
978 (SF_DEFAULT | SF_PRE_PARSED | SF_INCLASS_INLINE));
981 /* Called from the top level: if there are any pending inlines to
982 do, set up to process them now. This function sets up the first function
983 to be parsed; after it has been, the rule for fndef in parse.y will
984 call process_next_inline to start working on the next one. */
987 do_pending_inlines ()
989 /* Oops, we're still dealing with the last batch. */
990 if (yychar == PRE_PARSED_FUNCTION_DECL)
995 /* Clear the chain, so that any inlines nested inside the batch
996 we're to process now don't refer to this batch. See e.g.
997 g++.other/lookup6.C. */
998 struct unparsed_text *first = pending_inlines;
999 pending_inlines = pending_inlines_tail = 0;
1001 begin_parsing_inclass_inline (first);
1005 /* Called from the fndecl rule in the parser when the function just parsed
1006 was declared using a PRE_PARSED_FUNCTION_DECL (i.e. came from
1007 do_pending_inlines). */
1010 process_next_inline (i)
1011 struct unparsed_text *i;
1013 tree decl = i->decl;
1014 tree context = decl_function_context (decl);
1017 pop_function_context_from (context);
1018 if (yychar == YYEMPTY)
1020 if (yychar != END_OF_SAVED_INPUT)
1021 error ("parse error at end of saved function text");
1026 begin_parsing_inclass_inline (i);
1029 processing_these_inlines = 0;
1030 extract_interface_info ();
1035 /* Subroutine of snarf_method, deals with actual absorption of the block. */
1037 static SPEW_INLINE void
1038 snarf_block (starting_file, starting_line)
1039 const char *starting_file;
1043 int look_for_semicolon = 0;
1044 int look_for_lbrac = 0;
1045 int look_for_catch = 0;
1051 /* We incremented indent_level in yylex; undo that. */
1053 else if (yychar == '=')
1054 look_for_semicolon = 1;
1055 else if (yychar == ':' || yychar == RETURN_KEYWORD || yychar == TRY)
1063 yyerror ("parse error in method specification");
1065 /* The current token is the first one to be recorded. */
1066 tmp.yychar = yychar;
1067 tmp.yylval = yylval;
1068 tmp.lineno = lineno;
1069 obstack_grow (&inline_text_obstack, &tmp, sizeof (struct token));
1073 point = obstack_object_size (&inline_text_obstack);
1074 obstack_blank (&inline_text_obstack, sizeof (struct token));
1075 yyc = add_token ((struct token *)
1076 (obstack_base (&inline_text_obstack) + point));
1083 else if (yyc == '}')
1086 if (blev == 0 && !look_for_semicolon)
1088 if (!look_for_catch)
1091 if (add_token (&tmp) != CATCH)
1098 obstack_grow (&inline_text_obstack, &tmp, sizeof (struct token));
1101 else if (yyc == ';')
1105 error ("function body for constructor missing");
1106 /* fake a { } to avoid further errors */
1107 tmp.yylval.ttype = 0;
1109 obstack_grow (&inline_text_obstack, &tmp, sizeof (struct token));
1111 obstack_grow (&inline_text_obstack, &tmp, sizeof (struct token));
1114 else if (look_for_semicolon && blev == 0)
1119 error_with_file_and_line (starting_file, starting_line,
1120 "end of file read inside definition");
1126 /* This function stores away the text for an inline function that should
1127 be processed later (by do_pending_inlines). */
1132 int starting_lineno = lineno;
1133 const char *starting_filename = input_filename;
1136 struct unparsed_text *meth;
1138 /* Leave room for the header, then absorb the block. */
1139 obstack_blank (&inline_text_obstack, sizeof (struct unparsed_text));
1140 snarf_block (starting_filename, starting_lineno);
1142 len = obstack_object_size (&inline_text_obstack);
1143 meth = (struct unparsed_text *) obstack_finish (&inline_text_obstack);
1145 /* Happens when we get two declarations of the same function in the
1147 if (decl == void_type_node
1148 || (current_class_type && TYPE_REDEFINED (current_class_type)))
1150 obstack_free (&inline_text_obstack, (char *)meth);
1155 meth->filename = starting_filename;
1156 meth->lineno = starting_lineno;
1157 meth->limit = (struct token *) ((char *)meth + len);
1158 meth->interface = (interface_unknown ? 1 : (interface_only ? 0 : 2));
1163 fprintf (stderr, "\tsaved method of %d tokens from %s:%d\n",
1164 meth->limit - (struct token *) (meth + 1),
1165 starting_filename, starting_lineno);
1168 DECL_PENDING_INLINE_INFO (decl) = meth;
1169 DECL_PENDING_INLINE_P (decl) = 1;
1171 if (pending_inlines_tail)
1172 pending_inlines_tail->next = meth;
1174 pending_inlines = meth;
1175 pending_inlines_tail = meth;
1178 /* Consume a no-commas expression - a default argument - and save it
1179 on the inline_text_obstack. */
1184 int starting_lineno = lineno;
1185 const char *starting_filename = input_filename;
1190 struct unparsed_text *buf;
1193 obstack_blank (&inline_text_obstack, sizeof (struct unparsed_text));
1197 point = obstack_object_size (&inline_text_obstack);
1198 obstack_blank (&inline_text_obstack, sizeof (struct token));
1199 yyc = add_token ((struct token *)
1200 (obstack_base (&inline_text_obstack) + point));
1202 if (plev <= 0 && (yyc == ')' || yyc == ','))
1204 else if (yyc == '(' || yyc == '[')
1206 else if (yyc == ']' || yyc == ')')
1210 error_with_file_and_line (starting_filename, starting_lineno,
1211 "end of file read inside default argument");
1216 /* Unget the last token. */
1217 push_token ((struct token *) (obstack_base (&inline_text_obstack) + point));
1218 /* This is the documented way to shrink a growing obstack block. */
1219 obstack_blank (&inline_text_obstack, - (int) sizeof (struct token));
1222 len = obstack_object_size (&inline_text_obstack);
1223 buf = (struct unparsed_text *) obstack_finish (&inline_text_obstack);
1226 buf->filename = starting_filename;
1227 buf->lineno = starting_lineno;
1228 buf->limit = (struct token *) ((char *)buf + len);
1233 fprintf (stderr, "\tsaved defarg of %d tokens from %s:%d\n",
1234 buf->limit - (struct token *) (buf + 1),
1235 starting_filename, starting_lineno);
1238 arg = make_node (DEFAULT_ARG);
1239 DEFARG_POINTER (arg) = (char *)buf;
1244 /* Decide whether the default argument we are about to see should be
1245 gobbled up as text for later parsing. */
1248 maybe_snarf_defarg ()
1250 if (current_class_type && TYPE_BEING_DEFINED (current_class_type))
1251 do_snarf_defarg = 1;
1254 /* Called from grokfndecl to note a function decl with unparsed default
1255 arguments for later processing. Also called from grokdeclarator
1256 for function types with unparsed defargs; the call from grokfndecl
1257 will always come second, so we can overwrite the entry from the type. */
1260 add_defarg_fn (decl)
1263 if (TREE_CODE (decl) == FUNCTION_DECL)
1264 TREE_VALUE (defarg_fns) = decl;
1267 defarg_fns = tree_cons (NULL_TREE, decl, defarg_fns);
1268 TREE_TYPE (defarg_fns) = current_class_type;
1272 /* Helper for do_pending_defargs. Starts the parsing of a default arg. */
1278 tree d = TREE_PURPOSE (p);
1280 feed_input ((struct unparsed_text *)DEFARG_POINTER (d));
1281 yychar = DEFARG_MARKER;
1285 /* Helper for do_pending_defargs. Ends the parsing of a default arg. */
1290 if (yychar == YYEMPTY)
1292 if (yychar != END_OF_SAVED_INPUT)
1293 error ("parse error at end of saved function text");
1298 /* Main function for deferred parsing of default arguments. Called from
1302 do_pending_defargs ()
1309 tree current = defarg_fns;
1311 tree defarg_fn = TREE_VALUE (defarg_fns);
1312 if (defarg_parm == NULL_TREE)
1314 push_nested_class (TREE_TYPE (defarg_fns), 1);
1316 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1317 maybe_begin_member_template_processing (defarg_fn);
1319 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1320 defarg_parm = TYPE_ARG_TYPES (TREE_TYPE (defarg_fn));
1322 defarg_parm = TYPE_ARG_TYPES (defarg_fn);
1325 defarg_parm = TREE_CHAIN (defarg_parm);
1327 for (; defarg_parm; defarg_parm = TREE_CHAIN (defarg_parm))
1328 if (!TREE_PURPOSE (defarg_parm)
1329 || TREE_CODE (TREE_PURPOSE (defarg_parm)) != DEFAULT_ARG)
1331 else if (TREE_PURPOSE (current) == error_mark_node)
1332 DEFARG_POINTER (TREE_PURPOSE (defarg_parm)) = NULL;
1335 feed_defarg (defarg_parm);
1337 /* Return to the parser, which will process this defarg
1338 and call us again. */
1342 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1344 maybe_end_member_template_processing ();
1345 check_default_args (defarg_fn);
1349 pop_nested_class ();
1351 defarg_fns = TREE_CHAIN (defarg_fns);
1354 /* This function's default args depend on unprocessed default args
1355 of defarg_fns. We will need to reprocess this function, and
1356 check for circular dependancies. */
1359 for (a = defarg_depfns, b = TREE_PURPOSE (current); a && b;
1360 a = TREE_CHAIN (a), b = TREE_CHAIN (b))
1361 if (TREE_VALUE (a) != TREE_VALUE (b))
1366 TREE_CHAIN (current) = NULL_TREE;
1367 defarg_fns = chainon (defarg_fns, current);
1368 TREE_PURPOSE (current) = defarg_depfns;
1372 cp_warning_at ("circular dependency in default args of `%#D'", defarg_fn);
1373 /* No need to say what else is dependent, as they will be
1374 picked up in another pass. */
1376 /* Immediately repeat, but marked so that we break the loop. */
1377 defarg_fns = current;
1378 TREE_PURPOSE (current) = error_mark_node;
1380 defarg_depfns = NULL_TREE;
1382 else if (TREE_PURPOSE (current) == error_mark_node)
1383 defarg_fnsdone = tree_cons (NULL_TREE, defarg_fn, defarg_fnsdone);
1387 /* After parsing all the default arguments, we must clear any that remain,
1388 which will be part of a circular dependency. */
1390 done_pending_defargs ()
1392 for (; defarg_fnsdone; defarg_fnsdone = TREE_CHAIN (defarg_fnsdone))
1394 tree fn = TREE_VALUE (defarg_fnsdone);
1397 if (TREE_CODE (fn) == FUNCTION_DECL)
1398 parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
1400 parms = TYPE_ARG_TYPES (fn);
1401 for (; parms; parms = TREE_CHAIN (parms))
1402 if (TREE_PURPOSE (parms)
1403 && TREE_CODE (TREE_PURPOSE (parms)) == DEFAULT_ARG)
1405 my_friendly_assert (!DEFARG_POINTER (TREE_PURPOSE (parms)), 20010107);
1406 TREE_PURPOSE (parms) = NULL_TREE;
1411 /* In processing the current default arg, we called FN, but that call
1412 required a default argument of FN, and that had not yet been processed.
1416 unprocessed_defarg_fn (fn)
1419 defarg_depfns = tree_cons (NULL_TREE, fn, defarg_depfns);
1422 /* Called from the parser to update an element of TYPE_ARG_TYPES for some
1423 FUNCTION_TYPE with the newly parsed version of its default argument, which
1424 was previously digested as text. */
1427 replace_defarg (arg, init)
1430 if (init == error_mark_node)
1431 TREE_PURPOSE (arg) = error_mark_node;
1434 if (! processing_template_decl
1435 && ! can_convert_arg (TREE_VALUE (arg), TREE_TYPE (init), init))
1436 cp_pedwarn ("invalid type `%T' for default argument to `%T'",
1437 TREE_TYPE (init), TREE_VALUE (arg));
1439 TREE_PURPOSE (arg) = init;
1444 /* debug_yychar takes a yychar (token number) value and prints its name. */
1451 fprintf (stderr, "->%d < %c >\n", lineno, yy);
1452 else if (yy == IDENTIFIER || yy == TYPENAME)
1455 if (TREE_CODE (yylval.ttype) == IDENTIFIER_NODE)
1456 id = IDENTIFIER_POINTER (yylval.ttype);
1457 else if (TREE_CODE_CLASS (TREE_CODE (yylval.ttype)) == 'd')
1458 id = IDENTIFIER_POINTER (DECL_NAME (yylval.ttype));
1461 fprintf (stderr, "->%d <%s `%s'>\n", lineno, debug_yytranslate (yy), id);
1464 fprintf (stderr, "->%d <%s>\n", lineno, debug_yytranslate (yy));
1469 #define NAME(type) cpp_type2name (type)
1475 const char *string = _(msgid);
1477 if (last_token == CPP_EOF)
1478 error ("%s at end of input", string);
1479 else if (last_token == CPP_CHAR || last_token == CPP_WCHAR)
1481 unsigned int val = TREE_INT_CST_LOW (yylval.ttype);
1482 const char *ell = (last_token == CPP_CHAR) ? "" : "L";
1483 if (val <= UCHAR_MAX && ISGRAPH (val))
1484 error ("%s before %s'%c'", string, ell, val);
1486 error ("%s before %s'\\x%x'", string, ell, val);
1488 else if (last_token == CPP_STRING
1489 || last_token == CPP_WSTRING)
1490 error ("%s before string constant", string);
1491 else if (last_token == CPP_NUMBER)
1492 error ("%s before numeric constant", string);
1493 else if (last_token == CPP_NAME)
1495 if (TREE_CODE (last_token_id) == IDENTIFIER_NODE)
1496 error ("%s before `%s'", string, IDENTIFIER_POINTER (last_token_id));
1497 else if (ISGRAPH (yychar))
1498 error ("%s before `%c'", string, yychar);
1500 error ("%s before `\%o'", string, yychar);
1503 error ("%s before `%s' token", string, NAME (last_token));