1 /* Separate lexical analyzer for GNU C++.
2 Copyright (C) 1987, 1989, 1992, 1993, 1994 Free Software Foundation, Inc.
3 Hacked by Michael Tiemann (tiemann@cygnus.com)
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
22 /* This file is the lexical analyzer for GNU C++. */
24 /* Cause the `yydebug' variable to be defined. */
27 #include <sys/types.h>
40 #ifdef MULTIBYTE_CHARS
46 extern int errno; /* needed for VAX. */
48 extern jmp_buf toplevel;
50 #define obstack_chunk_alloc xmalloc
51 #define obstack_chunk_free free
53 extern struct obstack *expression_obstack, permanent_obstack;
54 extern struct obstack *current_obstack, *saveable_obstack;
56 extern double atof ();
58 extern char *get_directive_line (); /* In c-common.c */
60 /* Given a file name X, return the nondirectory portion.
61 Keep in mind that X can be computed more than once. */
62 #ifndef FILE_NAME_NONDIRECTORY
63 #define FILE_NAME_NONDIRECTORY(X) \
64 (rindex (X, '/') != 0 ? rindex (X, '/') + 1 : X)
67 extern char *index ();
68 extern char *rindex ();
70 void extract_interface_info ();
73 /* This obstack is needed to hold text. It is not safe to use
74 TOKEN_BUFFER because `check_newline' calls `yylex'. */
75 struct obstack inline_text_obstack;
76 static char *inline_text_firstobj;
78 /* This obstack is used to hold information about methods to be
79 synthesized. It should go away when synthesized methods are handled
80 properly (i.e. only when needed). */
81 struct obstack synth_obstack;
82 static char *synth_firstobj;
86 /* Pending language change.
87 Positive is push count, negative is pop count. */
88 int pending_lang_change = 0;
90 /* Wrap the current header file in extern "C". */
91 static int c_header_level = 0;
93 extern int first_token;
94 extern struct obstack token_obstack;
96 /* ??? Don't really know where this goes yet. */
100 extern void put_back (/* int */);
101 extern int input_redirected ();
102 extern void feed_input (/* char *, int, struct obstack * */);
105 /* Holds translations from TREE_CODEs to operator name strings,
106 i.e., opname_tab[PLUS_EXPR] == "+". */
110 extern int yychar; /* the lookahead symbol */
111 extern YYSTYPE yylval; /* the semantic value of the */
112 /* lookahead symbol */
115 YYLTYPE yylloc; /* location data for the lookahead */
120 /* the declaration found for the last IDENTIFIER token read in.
121 yylex must look this up to detect typedefs, which get token type TYPENAME,
122 so it is left around in case the identifier is not a typedef but is
123 used in a context which makes it a reference to a variable. */
126 /* The elements of `ridpointers' are identifier nodes
127 for the reserved type names and storage classes.
128 It is indexed by a RID_... value. */
129 tree ridpointers[(int) RID_MAX];
131 /* We may keep statistics about how long which files took to compile. */
132 static int header_time, body_time;
133 static tree get_time_identifier ();
134 static tree filename_times;
135 static tree this_filename_time;
137 /* For implementing #pragma unit. */
138 tree current_unit_name;
139 tree current_unit_language;
141 /* Array for holding counts of the numbers of tokens seen. */
142 extern int *token_count;
144 /* Textual definition used for default functions. */
145 static void default_copy_constructor_body ();
146 static void default_assign_ref_body ();
148 /* Return something to represent absolute declarators containing a *.
149 TARGET is the absolute declarator that the * contains.
150 TYPE_QUALS is a list of modifiers such as const or volatile
151 to apply to the pointer type, represented as identifiers.
153 We return an INDIRECT_REF whose "contents" are TARGET
154 and whose type is the modifier list. */
157 make_pointer_declarator (type_quals, target)
158 tree type_quals, target;
160 if (target && TREE_CODE (target) == IDENTIFIER_NODE
161 && ANON_AGGRNAME_P (target))
162 error ("type name expected before `*'");
163 target = build_parse_node (INDIRECT_REF, target);
164 TREE_TYPE (target) = type_quals;
168 /* Return something to represent absolute declarators containing a &.
169 TARGET is the absolute declarator that the & contains.
170 TYPE_QUALS is a list of modifiers such as const or volatile
171 to apply to the reference type, represented as identifiers.
173 We return an ADDR_EXPR whose "contents" are TARGET
174 and whose type is the modifier list. */
177 make_reference_declarator (type_quals, target)
178 tree type_quals, target;
182 if (TREE_CODE (target) == ADDR_EXPR)
184 error ("cannot declare references to references");
187 if (TREE_CODE (target) == INDIRECT_REF)
189 error ("cannot declare pointers to references");
192 if (TREE_CODE (target) == IDENTIFIER_NODE && ANON_AGGRNAME_P (target))
193 error ("type name expected before `&'");
195 target = build_parse_node (ADDR_EXPR, target);
196 TREE_TYPE (target) = type_quals;
200 /* Build names and nodes for overloaded operators. */
202 tree ansi_opname[LAST_CPLUS_TREE_CODE];
203 tree ansi_assopname[LAST_CPLUS_TREE_CODE];
206 operator_name_string (name)
209 char *opname = IDENTIFIER_POINTER (name) + 2;
213 /* Works for builtin and user defined types. */
214 if (IDENTIFIER_GLOBAL_VALUE (name)
215 && TREE_CODE (IDENTIFIER_GLOBAL_VALUE (name)) == TYPE_DECL)
216 return IDENTIFIER_POINTER (name);
218 if (opname[0] == 'a' && opname[2] != '\0' && opname[2] != '_')
222 opname_table = ansi_assopname;
227 opname_table = ansi_opname;
230 for (i = 0; i < (int) LAST_CPLUS_TREE_CODE; i++)
232 if (opname[0] == IDENTIFIER_POINTER (opname_table[i])[2+assign]
233 && opname[1] == IDENTIFIER_POINTER (opname_table[i])[3+assign])
237 if (i == LAST_CPLUS_TREE_CODE)
238 return "<invalid operator>";
241 return assignop_tab[i];
243 return opname_tab[i];
246 int interface_only; /* whether or not current file is only for
247 interface definitions. */
248 int interface_unknown; /* whether or not we know this class
249 to behave according to #pragma interface. */
251 /* lexical analyzer */
253 /* File used for outputting assembler code. */
254 extern FILE *asm_out_file;
256 #ifndef WCHAR_TYPE_SIZE
258 #define WCHAR_TYPE_SIZE INT_TYPE_SIZE
260 #define WCHAR_TYPE_SIZE BITS_PER_WORD
264 /* Number of bytes in a wide character. */
265 #define WCHAR_BYTES (WCHAR_TYPE_SIZE / BITS_PER_UNIT)
267 static int maxtoken; /* Current nominal length of token buffer. */
268 char *token_buffer; /* Pointer to token buffer.
269 Actual allocated length is maxtoken + 2. */
273 int check_newline ();
275 /* Nonzero tells yylex to ignore \ in string constants. */
276 static int ignore_escape_flag = 0;
278 static int skip_white_space ();
281 get_time_identifier (name)
284 tree time_identifier;
285 int len = strlen (name);
286 char *buf = (char *) alloca (len + 6);
287 strcpy (buf, "file ");
288 bcopy (name, buf+5, len);
290 time_identifier = get_identifier (buf);
291 if (IDENTIFIER_LOCAL_VALUE (time_identifier) == NULL_TREE)
293 push_obstacks_nochange ();
294 end_temporary_allocation ();
295 IDENTIFIER_LOCAL_VALUE (time_identifier) = build_int_2 (0, 0);
296 IDENTIFIER_CLASS_VALUE (time_identifier) = build_int_2 (0, 1);
297 IDENTIFIER_GLOBAL_VALUE (time_identifier) = filename_times;
298 filename_times = time_identifier;
301 return time_identifier;
310 int old_quiet_flag = quiet_flag;
313 this_time = get_run_time ();
314 quiet_flag = old_quiet_flag;
318 /* Table indexed by tree code giving a string containing a character
319 classifying the tree code. Possibilities are
320 t, d, s, c, r, <, 1 and 2. See cp/tree.def for details. */
322 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
324 char *cplus_tree_code_type[] = {
330 /* Table indexed by tree code giving number of expression
331 operands beyond the fixed part of the node structure.
332 Not used for types or decls. */
334 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
336 int cplus_tree_code_length[] = {
342 /* Names of tree components.
343 Used for printing out the tree and error messages. */
344 #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
346 char *cplus_tree_code_name[] = {
352 /* toplev.c needs to call these. */
357 /* the beginning of the file is a new line; check for # */
358 /* With luck, we discover the real source file's name from that
359 and put it in input_filename. */
360 put_back (check_newline ());
364 if (flag_gnu_xref) GNU_xref_begin (input_filename);
370 extern int errorcount, sorrycount;
371 if (flag_gnu_xref) GNU_xref_end (errorcount+sorrycount);
381 init_filename_times ()
383 this_filename_time = get_time_identifier ("<top level>");
384 if (flag_detailed_statistics)
387 body_time = my_get_run_time ();
388 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (this_filename_time)) = body_time;
392 /* Change by Bryan Boreham, Kewill, Thu Jul 27 09:46:05 1989.
393 Stuck this hack in to get the files open correctly; this is called
394 in place of init_lex if we are an unexec'd binary. */
396 reinit_lang_specific ()
398 init_filename_times ();
399 reinit_search_statistics ();
405 extern char *(*decl_printable_name) ();
409 /* Initialize the lookahead machinery. */
412 /* Make identifier nodes long enough for the language-specific slots. */
413 set_identifier_size (sizeof (struct lang_identifier));
414 decl_printable_name = lang_printable_name;
416 init_cplus_expand ();
419 = (char **) realloc (tree_code_type,
420 sizeof (char *) * LAST_CPLUS_TREE_CODE);
422 = (int *) realloc (tree_code_length,
423 sizeof (int) * LAST_CPLUS_TREE_CODE);
425 = (char **) realloc (tree_code_name,
426 sizeof (char *) * LAST_CPLUS_TREE_CODE);
427 bcopy ((char *)cplus_tree_code_type,
428 (char *)(tree_code_type + (int) LAST_AND_UNUSED_TREE_CODE),
429 (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (char *));
430 bcopy ((char *)cplus_tree_code_length,
431 (char *)(tree_code_length + (int) LAST_AND_UNUSED_TREE_CODE),
432 (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (int));
433 bcopy ((char *)cplus_tree_code_name,
434 (char *)(tree_code_name + (int) LAST_AND_UNUSED_TREE_CODE),
435 (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (char *));
437 opname_tab = (char **)oballoc ((int)LAST_CPLUS_TREE_CODE * sizeof (char *));
438 bzero ((char *)opname_tab, (int)LAST_CPLUS_TREE_CODE * sizeof (char *));
439 assignop_tab = (char **)oballoc ((int)LAST_CPLUS_TREE_CODE * sizeof (char *));
440 bzero ((char *)assignop_tab, (int)LAST_CPLUS_TREE_CODE * sizeof (char *));
442 ansi_opname[0] = get_identifier ("<invalid operator>");
443 for (i = 0; i < (int) LAST_CPLUS_TREE_CODE; i++)
445 ansi_opname[i] = ansi_opname[0];
446 ansi_assopname[i] = ansi_opname[0];
449 ansi_opname[(int) MULT_EXPR] = get_identifier ("__ml");
450 IDENTIFIER_OPNAME_P (ansi_opname[(int) MULT_EXPR]) = 1;
451 ansi_opname[(int) INDIRECT_REF] = ansi_opname[(int) MULT_EXPR];
452 ansi_assopname[(int) MULT_EXPR] = get_identifier ("__aml");
453 IDENTIFIER_OPNAME_P (ansi_assopname[(int) MULT_EXPR]) = 1;
454 ansi_assopname[(int) INDIRECT_REF] = ansi_assopname[(int) MULT_EXPR];
455 ansi_opname[(int) TRUNC_MOD_EXPR] = get_identifier ("__md");
456 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUNC_MOD_EXPR]) = 1;
457 ansi_assopname[(int) TRUNC_MOD_EXPR] = get_identifier ("__amd");
458 IDENTIFIER_OPNAME_P (ansi_assopname[(int) TRUNC_MOD_EXPR]) = 1;
459 ansi_opname[(int) CEIL_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR];
460 ansi_opname[(int) FLOOR_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR];
461 ansi_opname[(int) ROUND_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR];
462 ansi_opname[(int) MINUS_EXPR] = get_identifier ("__mi");
463 IDENTIFIER_OPNAME_P (ansi_opname[(int) MINUS_EXPR]) = 1;
464 ansi_opname[(int) NEGATE_EXPR] = ansi_opname[(int) MINUS_EXPR];
465 ansi_assopname[(int) MINUS_EXPR] = get_identifier ("__ami");
466 IDENTIFIER_OPNAME_P (ansi_assopname[(int) MINUS_EXPR]) = 1;
467 ansi_assopname[(int) NEGATE_EXPR] = ansi_assopname[(int) MINUS_EXPR];
468 ansi_opname[(int) RSHIFT_EXPR] = get_identifier ("__rs");
469 IDENTIFIER_OPNAME_P (ansi_opname[(int) RSHIFT_EXPR]) = 1;
470 ansi_assopname[(int) RSHIFT_EXPR] = get_identifier ("__ars");
471 IDENTIFIER_OPNAME_P (ansi_assopname[(int) RSHIFT_EXPR]) = 1;
472 ansi_opname[(int) NE_EXPR] = get_identifier ("__ne");
473 IDENTIFIER_OPNAME_P (ansi_opname[(int) NE_EXPR]) = 1;
474 ansi_opname[(int) GT_EXPR] = get_identifier ("__gt");
475 IDENTIFIER_OPNAME_P (ansi_opname[(int) GT_EXPR]) = 1;
476 ansi_opname[(int) GE_EXPR] = get_identifier ("__ge");
477 IDENTIFIER_OPNAME_P (ansi_opname[(int) GE_EXPR]) = 1;
478 ansi_opname[(int) BIT_IOR_EXPR] = get_identifier ("__or");
479 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_IOR_EXPR]) = 1;
480 ansi_assopname[(int) BIT_IOR_EXPR] = get_identifier ("__aor");
481 IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_IOR_EXPR]) = 1;
482 ansi_opname[(int) TRUTH_ANDIF_EXPR] = get_identifier ("__aa");
483 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_ANDIF_EXPR]) = 1;
484 ansi_opname[(int) TRUTH_NOT_EXPR] = get_identifier ("__nt");
485 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_NOT_EXPR]) = 1;
486 ansi_opname[(int) PREINCREMENT_EXPR] = get_identifier ("__pp");
487 IDENTIFIER_OPNAME_P (ansi_opname[(int) PREINCREMENT_EXPR]) = 1;
488 ansi_opname[(int) POSTINCREMENT_EXPR] = ansi_opname[(int) PREINCREMENT_EXPR];
489 ansi_opname[(int) MODIFY_EXPR] = get_identifier ("__as");
490 IDENTIFIER_OPNAME_P (ansi_opname[(int) MODIFY_EXPR]) = 1;
491 ansi_assopname[(int) NOP_EXPR] = ansi_opname[(int) MODIFY_EXPR];
492 ansi_opname[(int) COMPOUND_EXPR] = get_identifier ("__cm");
493 IDENTIFIER_OPNAME_P (ansi_opname[(int) COMPOUND_EXPR]) = 1;
494 ansi_opname[(int) EXACT_DIV_EXPR] = get_identifier ("__dv");
495 IDENTIFIER_OPNAME_P (ansi_opname[(int) EXACT_DIV_EXPR]) = 1;
496 ansi_assopname[(int) EXACT_DIV_EXPR] = get_identifier ("__adv");
497 IDENTIFIER_OPNAME_P (ansi_assopname[(int) EXACT_DIV_EXPR]) = 1;
498 ansi_opname[(int) TRUNC_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
499 ansi_opname[(int) CEIL_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
500 ansi_opname[(int) FLOOR_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
501 ansi_opname[(int) ROUND_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
502 ansi_opname[(int) PLUS_EXPR] = get_identifier ("__pl");
503 ansi_assopname[(int) TRUNC_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
504 ansi_assopname[(int) CEIL_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
505 ansi_assopname[(int) FLOOR_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
506 ansi_assopname[(int) ROUND_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
507 IDENTIFIER_OPNAME_P (ansi_opname[(int) PLUS_EXPR]) = 1;
508 ansi_assopname[(int) PLUS_EXPR] = get_identifier ("__apl");
509 IDENTIFIER_OPNAME_P (ansi_assopname[(int) PLUS_EXPR]) = 1;
510 ansi_opname[(int) CONVERT_EXPR] = ansi_opname[(int) PLUS_EXPR];
511 ansi_assopname[(int) CONVERT_EXPR] = ansi_assopname[(int) PLUS_EXPR];
512 ansi_opname[(int) LSHIFT_EXPR] = get_identifier ("__ls");
513 IDENTIFIER_OPNAME_P (ansi_opname[(int) LSHIFT_EXPR]) = 1;
514 ansi_assopname[(int) LSHIFT_EXPR] = get_identifier ("__als");
515 IDENTIFIER_OPNAME_P (ansi_assopname[(int) LSHIFT_EXPR]) = 1;
516 ansi_opname[(int) EQ_EXPR] = get_identifier ("__eq");
517 IDENTIFIER_OPNAME_P (ansi_opname[(int) EQ_EXPR]) = 1;
518 ansi_opname[(int) LT_EXPR] = get_identifier ("__lt");
519 IDENTIFIER_OPNAME_P (ansi_opname[(int) LT_EXPR]) = 1;
520 ansi_opname[(int) LE_EXPR] = get_identifier ("__le");
521 IDENTIFIER_OPNAME_P (ansi_opname[(int) LE_EXPR]) = 1;
522 ansi_opname[(int) BIT_AND_EXPR] = get_identifier ("__ad");
523 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_AND_EXPR]) = 1;
524 ansi_assopname[(int) BIT_AND_EXPR] = get_identifier ("__aad");
525 IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_AND_EXPR]) = 1;
526 ansi_opname[(int) ADDR_EXPR] = ansi_opname[(int) BIT_AND_EXPR];
527 ansi_assopname[(int) ADDR_EXPR] = ansi_assopname[(int) BIT_AND_EXPR];
528 ansi_opname[(int) BIT_XOR_EXPR] = get_identifier ("__er");
529 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_XOR_EXPR]) = 1;
530 ansi_assopname[(int) BIT_XOR_EXPR] = get_identifier ("__aer");
531 IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_XOR_EXPR]) = 1;
532 ansi_opname[(int) TRUTH_ORIF_EXPR] = get_identifier ("__oo");
533 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_ORIF_EXPR]) = 1;
534 ansi_opname[(int) BIT_NOT_EXPR] = get_identifier ("__co");
535 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_NOT_EXPR]) = 1;
536 ansi_opname[(int) PREDECREMENT_EXPR] = get_identifier ("__mm");
537 IDENTIFIER_OPNAME_P (ansi_opname[(int) PREDECREMENT_EXPR]) = 1;
538 ansi_opname[(int) POSTDECREMENT_EXPR] = ansi_opname[(int) PREDECREMENT_EXPR];
539 ansi_opname[(int) COMPONENT_REF] = get_identifier ("__rf");
540 IDENTIFIER_OPNAME_P (ansi_opname[(int) COMPONENT_REF]) = 1;
541 ansi_opname[(int) MEMBER_REF] = get_identifier ("__rm");
542 IDENTIFIER_OPNAME_P (ansi_opname[(int) MEMBER_REF]) = 1;
543 ansi_opname[(int) CALL_EXPR] = get_identifier ("__cl");
544 IDENTIFIER_OPNAME_P (ansi_opname[(int) CALL_EXPR]) = 1;
545 ansi_opname[(int) ARRAY_REF] = get_identifier ("__vc");
546 IDENTIFIER_OPNAME_P (ansi_opname[(int) ARRAY_REF]) = 1;
547 ansi_opname[(int) NEW_EXPR] = get_identifier ("__nw");
548 IDENTIFIER_OPNAME_P (ansi_opname[(int) NEW_EXPR]) = 1;
549 ansi_opname[(int) DELETE_EXPR] = get_identifier ("__dl");
550 IDENTIFIER_OPNAME_P (ansi_opname[(int) DELETE_EXPR]) = 1;
551 ansi_opname[(int) VEC_NEW_EXPR] = get_identifier ("__vn");
552 IDENTIFIER_OPNAME_P (ansi_opname[(int) VEC_NEW_EXPR]) = 1;
553 ansi_opname[(int) VEC_DELETE_EXPR] = get_identifier ("__vd");
554 IDENTIFIER_OPNAME_P (ansi_opname[(int) VEC_DELETE_EXPR]) = 1;
555 ansi_opname[(int) TYPE_EXPR] = get_identifier ("__op");
556 IDENTIFIER_OPNAME_P (ansi_opname[(int) TYPE_EXPR]) = 1;
558 /* This is not true: these operators are not defined in ANSI,
559 but we need them anyway. */
560 ansi_opname[(int) MIN_EXPR] = get_identifier ("__mn");
561 IDENTIFIER_OPNAME_P (ansi_opname[(int) MIN_EXPR]) = 1;
562 ansi_opname[(int) MAX_EXPR] = get_identifier ("__mx");
563 IDENTIFIER_OPNAME_P (ansi_opname[(int) MAX_EXPR]) = 1;
564 ansi_opname[(int) COND_EXPR] = get_identifier ("__cn");
565 IDENTIFIER_OPNAME_P (ansi_opname[(int) COND_EXPR]) = 1;
566 ansi_opname[(int) METHOD_CALL_EXPR] = get_identifier ("__wr");
567 IDENTIFIER_OPNAME_P (ansi_opname[(int) METHOD_CALL_EXPR]) = 1;
571 gcc_obstack_init (&inline_text_obstack);
572 inline_text_firstobj = (char *) obstack_alloc (&inline_text_obstack, 0);
573 gcc_obstack_init (&synth_obstack);
574 synth_firstobj = (char *) obstack_alloc (&synth_obstack, 0);
576 /* Start it at 0, because check_newline is called at the very beginning
577 and will increment it to 1. */
579 input_filename = "<internal>";
580 current_function_decl = NULL;
583 token_buffer = (char *) xmalloc (maxtoken + 2);
585 ridpointers[(int) RID_INT] = get_identifier ("int");
586 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_INT],
587 build_tree_list (NULL_TREE, ridpointers[(int) RID_INT]));
588 ridpointers[(int) RID_BOOL] = get_identifier ("bool");
589 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_BOOL],
590 build_tree_list (NULL_TREE, ridpointers[(int) RID_BOOL]));
591 ridpointers[(int) RID_CHAR] = get_identifier ("char");
592 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_CHAR],
593 build_tree_list (NULL_TREE, ridpointers[(int) RID_CHAR]));
594 ridpointers[(int) RID_VOID] = get_identifier ("void");
595 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VOID],
596 build_tree_list (NULL_TREE, ridpointers[(int) RID_VOID]));
597 ridpointers[(int) RID_FLOAT] = get_identifier ("float");
598 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_FLOAT],
599 build_tree_list (NULL_TREE, ridpointers[(int) RID_FLOAT]));
600 ridpointers[(int) RID_DOUBLE] = get_identifier ("double");
601 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_DOUBLE],
602 build_tree_list (NULL_TREE, ridpointers[(int) RID_DOUBLE]));
603 ridpointers[(int) RID_SHORT] = get_identifier ("short");
604 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_SHORT],
605 build_tree_list (NULL_TREE, ridpointers[(int) RID_SHORT]));
606 ridpointers[(int) RID_LONG] = get_identifier ("long");
607 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_LONG],
608 build_tree_list (NULL_TREE, ridpointers[(int) RID_LONG]));
609 ridpointers[(int) RID_UNSIGNED] = get_identifier ("unsigned");
610 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_UNSIGNED],
611 build_tree_list (NULL_TREE, ridpointers[(int) RID_UNSIGNED]));
612 ridpointers[(int) RID_SIGNED] = get_identifier ("signed");
613 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_SIGNED],
614 build_tree_list (NULL_TREE, ridpointers[(int) RID_SIGNED]));
615 ridpointers[(int) RID_INLINE] = get_identifier ("inline");
616 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_INLINE],
617 build_tree_list (NULL_TREE, ridpointers[(int) RID_INLINE]));
618 ridpointers[(int) RID_CONST] = get_identifier ("const");
619 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_CONST],
620 build_tree_list (NULL_TREE, ridpointers[(int) RID_CONST]));
621 ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile");
622 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VOLATILE],
623 build_tree_list (NULL_TREE, ridpointers[(int) RID_VOLATILE]));
624 ridpointers[(int) RID_AUTO] = get_identifier ("auto");
625 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_AUTO],
626 build_tree_list (NULL_TREE, ridpointers[(int) RID_AUTO]));
627 ridpointers[(int) RID_STATIC] = get_identifier ("static");
628 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_STATIC],
629 build_tree_list (NULL_TREE, ridpointers[(int) RID_STATIC]));
630 ridpointers[(int) RID_EXTERN] = get_identifier ("extern");
631 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_EXTERN],
632 build_tree_list (NULL_TREE, ridpointers[(int) RID_EXTERN]));
633 ridpointers[(int) RID_TYPEDEF] = get_identifier ("typedef");
634 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_TYPEDEF],
635 build_tree_list (NULL_TREE, ridpointers[(int) RID_TYPEDEF]));
636 ridpointers[(int) RID_REGISTER] = get_identifier ("register");
637 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_REGISTER],
638 build_tree_list (NULL_TREE, ridpointers[(int) RID_REGISTER]));
640 /* C++ extensions. These are probably not correctly named. */
641 ridpointers[(int) RID_WCHAR] = get_identifier ("__wchar_t");
642 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_WCHAR],
643 build_tree_list (NULL_TREE, ridpointers[(int) RID_WCHAR]));
644 class_type_node = build_int_2 (class_type, 0);
645 TREE_TYPE (class_type_node) = class_type_node;
646 ridpointers[(int) RID_CLASS] = class_type_node;
648 record_type_node = build_int_2 (record_type, 0);
649 TREE_TYPE (record_type_node) = record_type_node;
650 ridpointers[(int) RID_RECORD] = record_type_node;
652 union_type_node = build_int_2 (union_type, 0);
653 TREE_TYPE (union_type_node) = union_type_node;
654 ridpointers[(int) RID_UNION] = union_type_node;
656 enum_type_node = build_int_2 (enum_type, 0);
657 TREE_TYPE (enum_type_node) = enum_type_node;
658 ridpointers[(int) RID_ENUM] = enum_type_node;
660 ridpointers[(int) RID_VIRTUAL] = get_identifier ("virtual");
661 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VIRTUAL],
662 build_tree_list (NULL_TREE, ridpointers[(int) RID_VIRTUAL]));
663 ridpointers[(int) RID_FRIEND] = get_identifier ("friend");
664 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_FRIEND],
665 build_tree_list (NULL_TREE, ridpointers[(int) RID_FRIEND]));
667 ridpointers[(int) RID_PUBLIC] = get_identifier ("public");
668 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PUBLIC],
669 build_tree_list (NULL_TREE, ridpointers[(int) RID_PUBLIC]));
670 ridpointers[(int) RID_PRIVATE] = get_identifier ("private");
671 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PRIVATE],
672 build_tree_list (NULL_TREE, ridpointers[(int) RID_PRIVATE]));
673 ridpointers[(int) RID_PROTECTED] = get_identifier ("protected");
674 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PROTECTED],
675 build_tree_list (NULL_TREE, ridpointers[(int) RID_PROTECTED]));
676 ridpointers[(int) RID_TEMPLATE] = get_identifier ("template");
677 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_TEMPLATE],
678 build_tree_list (NULL_TREE, ridpointers[(int) RID_TEMPLATE]));
679 /* This is for ANSI C++. */
680 ridpointers[(int) RID_MUTABLE] = get_identifier ("mutable");
681 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_MUTABLE],
682 build_tree_list (NULL_TREE, ridpointers[(int) RID_MUTABLE]));
684 /* Exception handling extensions. */
685 exception_type_node = build_int_2 (exception_type, 0);
686 TREE_TYPE (exception_type_node) = exception_type_node;
687 ridpointers[(int) RID_EXCEPTION] = exception_type_node;
689 /* Signature handling extensions. */
690 signature_type_node = build_int_2 (signature_type, 0);
691 TREE_TYPE (signature_type_node) = signature_type_node;
692 ridpointers[(int) RID_SIGNATURE] = signature_type_node;
694 opname_tab[(int) COMPONENT_REF] = "->";
695 opname_tab[(int) MEMBER_REF] = "->*";
696 opname_tab[(int) METHOD_CALL_EXPR] = "->()";
697 opname_tab[(int) INDIRECT_REF] = "(unary *)";
698 opname_tab[(int) ARRAY_REF] = "[]";
699 opname_tab[(int) MODIFY_EXPR] = "=";
700 opname_tab[(int) NEW_EXPR] = "new";
701 opname_tab[(int) DELETE_EXPR] = "delete";
702 opname_tab[(int) VEC_NEW_EXPR] = "new []";
703 opname_tab[(int) VEC_DELETE_EXPR] = "delete []";
704 opname_tab[(int) COND_EXPR] = "... ? ... : ...";
705 opname_tab[(int) CALL_EXPR] = "()";
706 opname_tab[(int) PLUS_EXPR] = "+";
707 opname_tab[(int) MINUS_EXPR] = "-";
708 opname_tab[(int) MULT_EXPR] = "*";
709 opname_tab[(int) TRUNC_DIV_EXPR] = "/";
710 opname_tab[(int) CEIL_DIV_EXPR] = "(ceiling /)";
711 opname_tab[(int) FLOOR_DIV_EXPR] = "(floor /)";
712 opname_tab[(int) ROUND_DIV_EXPR] = "(round /)";
713 opname_tab[(int) TRUNC_MOD_EXPR] = "%";
714 opname_tab[(int) CEIL_MOD_EXPR] = "(ceiling %)";
715 opname_tab[(int) FLOOR_MOD_EXPR] = "(floor %)";
716 opname_tab[(int) ROUND_MOD_EXPR] = "(round %)";
717 opname_tab[(int) NEGATE_EXPR] = "-";
718 opname_tab[(int) MIN_EXPR] = "<?";
719 opname_tab[(int) MAX_EXPR] = ">?";
720 opname_tab[(int) ABS_EXPR] = "abs";
721 opname_tab[(int) FFS_EXPR] = "ffs";
722 opname_tab[(int) LSHIFT_EXPR] = "<<";
723 opname_tab[(int) RSHIFT_EXPR] = ">>";
724 opname_tab[(int) BIT_IOR_EXPR] = "|";
725 opname_tab[(int) BIT_XOR_EXPR] = "^";
726 opname_tab[(int) BIT_AND_EXPR] = "&";
727 opname_tab[(int) BIT_ANDTC_EXPR] = "&~";
728 opname_tab[(int) BIT_NOT_EXPR] = "~";
729 opname_tab[(int) TRUTH_ANDIF_EXPR] = "&&";
730 opname_tab[(int) TRUTH_ORIF_EXPR] = "||";
731 opname_tab[(int) TRUTH_AND_EXPR] = "strict &&";
732 opname_tab[(int) TRUTH_OR_EXPR] = "strict ||";
733 opname_tab[(int) TRUTH_NOT_EXPR] = "!";
734 opname_tab[(int) LT_EXPR] = "<";
735 opname_tab[(int) LE_EXPR] = "<=";
736 opname_tab[(int) GT_EXPR] = ">";
737 opname_tab[(int) GE_EXPR] = ">=";
738 opname_tab[(int) EQ_EXPR] = "==";
739 opname_tab[(int) NE_EXPR] = "!=";
740 opname_tab[(int) IN_EXPR] = "in";
741 opname_tab[(int) RANGE_EXPR] = "..";
742 opname_tab[(int) CONVERT_EXPR] = "(unary +)";
743 opname_tab[(int) ADDR_EXPR] = "(unary &)";
744 opname_tab[(int) PREDECREMENT_EXPR] = "--";
745 opname_tab[(int) PREINCREMENT_EXPR] = "++";
746 opname_tab[(int) POSTDECREMENT_EXPR] = "--";
747 opname_tab[(int) POSTINCREMENT_EXPR] = "++";
748 opname_tab[(int) COMPOUND_EXPR] = ",";
750 assignop_tab[(int) NOP_EXPR] = "=";
751 assignop_tab[(int) PLUS_EXPR] = "+=";
752 assignop_tab[(int) CONVERT_EXPR] = "+=";
753 assignop_tab[(int) MINUS_EXPR] = "-=";
754 assignop_tab[(int) NEGATE_EXPR] = "-=";
755 assignop_tab[(int) MULT_EXPR] = "*=";
756 assignop_tab[(int) INDIRECT_REF] = "*=";
757 assignop_tab[(int) TRUNC_DIV_EXPR] = "/=";
758 assignop_tab[(int) EXACT_DIV_EXPR] = "(exact /=)";
759 assignop_tab[(int) CEIL_DIV_EXPR] = "(ceiling /=)";
760 assignop_tab[(int) FLOOR_DIV_EXPR] = "(floor /=)";
761 assignop_tab[(int) ROUND_DIV_EXPR] = "(round /=)";
762 assignop_tab[(int) TRUNC_MOD_EXPR] = "%=";
763 assignop_tab[(int) CEIL_MOD_EXPR] = "(ceiling %=)";
764 assignop_tab[(int) FLOOR_MOD_EXPR] = "(floor %=)";
765 assignop_tab[(int) ROUND_MOD_EXPR] = "(round %=)";
766 assignop_tab[(int) MIN_EXPR] = "<?=";
767 assignop_tab[(int) MAX_EXPR] = ">?=";
768 assignop_tab[(int) LSHIFT_EXPR] = "<<=";
769 assignop_tab[(int) RSHIFT_EXPR] = ">>=";
770 assignop_tab[(int) BIT_IOR_EXPR] = "|=";
771 assignop_tab[(int) BIT_XOR_EXPR] = "^=";
772 assignop_tab[(int) BIT_AND_EXPR] = "&=";
773 assignop_tab[(int) ADDR_EXPR] = "&=";
775 init_filename_times ();
777 /* Some options inhibit certain reserved words.
778 Clear those words out of the hash table so they won't be recognized. */
779 #define UNSET_RESERVED_WORD(STRING) \
780 do { struct resword *s = is_reserved_word (STRING, sizeof (STRING) - 1); \
781 if (s) s->name = ""; } while (0)
784 /* let's parse things, and if they use it, then give them an error. */
785 if (!flag_handle_exceptions)
787 UNSET_RESERVED_WORD ("throw");
788 UNSET_RESERVED_WORD ("try");
789 UNSET_RESERVED_WORD ("catch");
793 if (! (flag_gc || flag_dossier))
795 UNSET_RESERVED_WORD ("classof");
796 UNSET_RESERVED_WORD ("headof");
798 if (! flag_handle_signatures)
800 /* Easiest way to not recognize signature
801 handling extensions... */
802 UNSET_RESERVED_WORD ("signature");
803 UNSET_RESERVED_WORD ("sigof");
806 UNSET_RESERVED_WORD ("asm");
807 if (flag_no_asm || flag_traditional)
808 UNSET_RESERVED_WORD ("typeof");
810 token_count = init_parse ();
811 interface_unknown = 1;
815 reinit_parse_for_function ()
817 current_base_init_list = NULL_TREE;
818 current_member_init_list = NULL_TREE;
825 yyprint (file, yychar, yylval)
837 case IDENTIFIER_DEFN:
840 case TYPENAME_ELLIPSIS:
842 case PRE_PARSED_CLASS_DECL:
844 my_friendly_assert (TREE_CODE (t) == IDENTIFIER_NODE, 224);
845 if (IDENTIFIER_POINTER (t))
846 fprintf (file, " `%s'", IDENTIFIER_POINTER (t));
849 if (yylval.ttype == class_type_node)
850 fprintf (file, " `class'");
851 else if (yylval.ttype == record_type_node)
852 fprintf (file, " `struct'");
853 else if (yylval.ttype == union_type_node)
854 fprintf (file, " `union'");
855 else if (yylval.ttype == enum_type_node)
856 fprintf (file, " `enum'");
857 else if (yylval.ttype == signature_type_node)
858 fprintf (file, " `signature'");
860 my_friendly_abort (80);
865 static int *reduce_count;
868 #define REDUCE_LENGTH (sizeof (yyr2) / sizeof (yyr2[0]))
869 #define TOKEN_LENGTH (256 + sizeof (yytname) / sizeof (yytname[0]))
874 #ifdef GATHER_STATISTICS
875 reduce_count = (int *)malloc (sizeof (int) * (REDUCE_LENGTH + 1));
876 bzero (reduce_count, sizeof (int) * (REDUCE_LENGTH + 1));
878 token_count = (int *)malloc (sizeof (int) * (TOKEN_LENGTH + 1));
879 bzero (token_count, sizeof (int) * (TOKEN_LENGTH + 1));
885 #ifdef GATHER_STATISTICS
890 reduce_count[yyn] += 1;
897 return reduce_count[*q] - reduce_count[*p];
904 return token_count[*q] - token_count[*p];
909 print_parse_statistics ()
911 #ifdef GATHER_STATISTICS
914 int maxlen = REDUCE_LENGTH;
917 if (reduce_count[-1] == 0)
920 if (TOKEN_LENGTH > REDUCE_LENGTH)
921 maxlen = TOKEN_LENGTH;
922 sorted = (unsigned *) alloca (sizeof (int) * maxlen);
924 for (i = 0; i < TOKEN_LENGTH; i++)
926 qsort (sorted, TOKEN_LENGTH, sizeof (int), token_cmp);
927 for (i = 0; i < TOKEN_LENGTH; i++)
929 int index = sorted[i];
930 if (token_count[index] == 0)
932 if (token_count[index] < token_count[-1])
934 fprintf (stderr, "token %d, `%s', count = %d\n",
935 index, yytname[YYTRANSLATE (index)], token_count[index]);
937 fprintf (stderr, "\n");
938 for (i = 0; i < REDUCE_LENGTH; i++)
940 qsort (sorted, REDUCE_LENGTH, sizeof (int), reduce_cmp);
941 for (i = 0; i < REDUCE_LENGTH; i++)
943 int index = sorted[i];
944 if (reduce_count[index] == 0)
946 if (reduce_count[index] < reduce_count[-1])
948 fprintf (stderr, "rule %d, line %d, count = %d\n",
949 index, yyrline[index], reduce_count[index]);
951 fprintf (stderr, "\n");
956 /* Sets the value of the 'yydebug' variable to VALUE.
957 This is a function so we don't have to have YYDEBUG defined
958 in order to build the compiler. */
967 warning ("YYDEBUG not defined.");
972 /* Functions and data structures for #pragma interface.
974 `#pragma implementation' means that the main file being compiled
975 is considered to implement (provide) the classes that appear in
976 its main body. I.e., if this is file "foo.cc", and class `bar'
977 is defined in "foo.cc", then we say that "foo.cc implements bar".
979 All main input files "implement" themselves automagically.
981 `#pragma interface' means that unless this file (of the form "foo.h"
982 is not presently being included by file "foo.cc", the
983 CLASSTYPE_INTERFACE_ONLY bit gets set. The effect is that none
984 of the vtables nor any of the inline functions defined in foo.h
987 There are cases when we want to link files such as "defs.h" and
988 "main.cc". In this case, we give "defs.h" a `#pragma interface',
989 and "main.cc" has `#pragma implementation "defs.h"'. */
994 struct impl_files *next;
997 static struct impl_files *impl_file_chain;
999 /* Helper function to load global variables with interface
1002 extract_interface_info ()
1006 if (flag_alt_external_templates)
1008 struct tinst_level *til = tinst_for_decl ();
1011 fileinfo = get_time_identifier (til->file);
1014 fileinfo = get_time_identifier (input_filename);
1015 fileinfo = IDENTIFIER_CLASS_VALUE (fileinfo);
1016 interface_only = TREE_INT_CST_LOW (fileinfo);
1017 if (!processing_template_defn || flag_external_templates)
1018 interface_unknown = TREE_INT_CST_HIGH (fileinfo);
1021 /* Return nonzero if S is not considered part of an
1022 INTERFACE/IMPLEMENTATION pair. Otherwise, return 0. */
1024 interface_strcmp (s)
1027 /* Set the interface/implementation bits for this scope. */
1028 struct impl_files *ifiles;
1031 for (ifiles = impl_file_chain; ifiles; ifiles = ifiles->next)
1033 char *t1 = ifiles->filename;
1036 if (*s1 != *t1 || *s1 == 0)
1039 while (*s1 == *t1 && *s1 != 0)
1046 /* Don't get faked out by xxx.yyy.cc vs xxx.zzz.cc. */
1047 if (index (s1, '.') || index (t1, '.'))
1050 if (*s1 == '\0' || s1[-1] != '.' || t1[-1] != '.')
1062 set_typedecl_interface_info (prev, vars)
1065 tree id = get_time_identifier (DECL_SOURCE_FILE (vars));
1066 tree fileinfo = IDENTIFIER_CLASS_VALUE (id);
1067 tree type = TREE_TYPE (vars);
1069 CLASSTYPE_INTERFACE_ONLY (type) = TREE_INT_CST_LOW (fileinfo)
1070 = interface_strcmp (FILE_NAME_NONDIRECTORY (DECL_SOURCE_FILE (vars)));
1074 set_vardecl_interface_info (prev, vars)
1077 tree type = DECL_CONTEXT (vars);
1079 if (CLASSTYPE_INTERFACE_KNOWN (type))
1081 if (CLASSTYPE_INTERFACE_ONLY (type))
1082 set_typedecl_interface_info (prev, TYPE_NAME (type));
1084 CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 1;
1085 DECL_EXTERNAL (vars) = CLASSTYPE_INTERFACE_ONLY (type);
1086 TREE_PUBLIC (vars) = 1;
1090 /* Called from the top level: if there are any pending inlines to
1091 do, set up to process them now. This function sets up the first function
1092 to be parsed; after it has been, the rule for fndef in parse.y will
1093 call process_next_inline to start working on the next one. */
1095 do_pending_inlines ()
1097 struct pending_inline *t;
1099 /* Oops, we're still dealing with the last batch. */
1100 if (yychar == PRE_PARSED_FUNCTION_DECL)
1103 /* Reverse the pending inline functions, since
1104 they were cons'd instead of appended. */
1106 struct pending_inline *prev = 0, *tail, *bottom = 0;
1107 t = pending_inlines;
1108 pending_inlines = 0;
1118 /* This kludge should go away when synthesized methods are handled
1119 properly, i.e. only when needed. */
1120 for (t = prev; t; t = t->next)
1125 DECL_PENDING_INLINE_INFO (f) = 0;
1126 switch (- t->lineno)
1129 build_dtor (f); break;
1131 build_default_constructor (f); break;
1133 build_copy_constructor (f); break;
1135 build_assign_ref (f); break;
1140 tail->next = t->next;
1150 obstack_free (&synth_obstack, bottom);
1157 /* Now start processing the first inline function. */
1158 my_friendly_assert ((t->parm_vec == NULL_TREE) == (t->bindings == NULL_TREE),
1161 push_template_decls (t->parm_vec, t->bindings, 0);
1164 feed_input (t->buf, t->len, t->can_free ? &inline_text_obstack : 0);
1167 if (input_filename != t->filename)
1169 input_filename = t->filename;
1170 /* Get interface/implementation back in sync. */
1171 extract_interface_info ();
1174 input_filename = t->filename;
1175 interface_unknown = t->interface == 1;
1176 interface_only = t->interface == 0;
1178 yychar = PRE_PARSED_FUNCTION_DECL;
1180 /* Pass back a handle on the rest of the inline functions, so that they
1181 can be processed later. */
1182 yylval.ttype = build_tree_list ((tree) t, t->fndecl);
1184 if (flag_default_inline && t->fndecl
1185 /* If we're working from a template, don't change
1186 the `inline' state. */
1187 && t->parm_vec == NULL_TREE)
1188 DECL_INLINE (t->fndecl) = 1;
1190 DECL_PENDING_INLINE_INFO (t->fndecl) = 0;
1193 extern struct pending_input *to_be_restored;
1194 static int nextchar = -1;
1196 /* Called from the fndecl rule in the parser when the function just parsed
1197 was declared using a PRE_PARSED_FUNCTION_DECL (i.e. came from
1198 do_pending_inlines). */
1200 process_next_inline (t)
1203 struct pending_inline *i = (struct pending_inline *) TREE_PURPOSE (t);
1204 my_friendly_assert ((i->parm_vec == NULL_TREE) == (i->bindings == NULL_TREE),
1207 pop_template_decls (i->parm_vec, i->bindings, 0);
1209 if (yychar == YYEMPTY)
1211 if (yychar != END_OF_SAVED_INPUT)
1213 error ("parse error at end of saved function text");
1214 /* restore_pending_input will abort unless yychar is either
1215 * END_OF_SAVED_INPUT or YYEMPTY; since we already know we're
1216 * hosed, feed back YYEMPTY.
1217 * We also need to discard nextchar, since that may have gotten
1223 if (to_be_restored == 0)
1224 my_friendly_abort (123);
1225 restore_pending_input (to_be_restored);
1227 if (i && i->fndecl != NULL_TREE)
1229 my_friendly_assert ((i->parm_vec == NULL_TREE) == (i->bindings == NULL_TREE),
1232 push_template_decls (i->parm_vec, i->bindings, 0);
1233 feed_input (i->buf, i->len, i->can_free ? &inline_text_obstack : 0);
1235 input_filename = i->filename;
1236 yychar = PRE_PARSED_FUNCTION_DECL;
1237 yylval.ttype = build_tree_list ((tree) i, i->fndecl);
1239 if (flag_default_inline
1240 /* If we're working from a template, don't change
1241 the `inline' state. */
1242 && i->parm_vec == NULL_TREE)
1243 DECL_INLINE (i->fndecl) = 1;
1245 DECL_PENDING_INLINE_INFO (i->fndecl) = 0;
1249 interface_unknown = i->interface == 1;
1250 interface_only = i->interface == 0;
1253 extract_interface_info ();
1256 /* Since inline methods can refer to text which has not yet been seen,
1257 we store the text of the method in a structure which is placed in the
1258 DECL_PENDING_INLINE_INFO field of the FUNCTION_DECL.
1259 After parsing the body of the class definition, the FUNCTION_DECL's are
1260 scanned to see which ones have this field set. Those are then digested
1263 This function's FUNCTION_DECL will have a bit set in its common so
1264 that we know to watch out for it. */
1267 consume_string (this_obstack, matching_char)
1268 register struct obstack *this_obstack;
1272 int starting_lineno = lineno;
1278 int save_lineno = lineno;
1279 lineno = starting_lineno;
1280 if (matching_char == '"')
1281 error ("end of file encountered inside string constant");
1283 error ("end of file encountered inside character constant");
1284 lineno = save_lineno;
1289 obstack_1grow (this_obstack, c);
1291 obstack_1grow (this_obstack, c);
1293 /* Make sure we continue the loop */
1300 pedwarn ("ANSI C++ forbids newline in string constant");
1303 obstack_1grow (this_obstack, c);
1305 while (c != matching_char);
1308 static int nextyychar = YYEMPTY;
1309 static YYSTYPE nextyylval;
1311 struct pending_input {
1312 int nextchar, yychar, nextyychar, eof;
1313 YYSTYPE yylval, nextyylval;
1314 struct obstack token_obstack;
1318 struct pending_input *
1319 save_pending_input ()
1321 struct pending_input *p;
1322 p = (struct pending_input *) xmalloc (sizeof (struct pending_input));
1323 p->nextchar = nextchar;
1325 p->nextyychar = nextyychar;
1327 p->nextyylval = nextyylval;
1328 p->eof = end_of_file;
1329 yychar = nextyychar = YYEMPTY;
1331 p->first_token = first_token;
1332 p->token_obstack = token_obstack;
1335 gcc_obstack_init (&token_obstack);
1341 restore_pending_input (p)
1342 struct pending_input *p;
1344 my_friendly_assert (nextchar == -1, 229);
1345 nextchar = p->nextchar;
1346 my_friendly_assert (yychar == YYEMPTY || yychar == END_OF_SAVED_INPUT, 230);
1348 my_friendly_assert (nextyychar == YYEMPTY, 231);
1349 nextyychar = p->nextyychar;
1351 nextyylval = p->nextyylval;
1352 first_token = p->first_token;
1353 obstack_free (&token_obstack, (char *) 0);
1354 token_obstack = p->token_obstack;
1355 end_of_file = p->eof;
1359 /* Return next non-whitespace input character, which may come
1360 from `finput', or from `nextchar'. */
1372 return skip_white_space (c);
1375 /* Unget character CH from the input stream.
1376 If RESCAN is non-zero, then we want to `see' this
1377 character as the next input token. */
1379 yyungetc (ch, rescan)
1383 /* Unget a character from the input stream. */
1384 if (yychar == YYEMPTY || rescan == 0)
1387 put_back (nextchar);
1392 my_friendly_assert (nextyychar == YYEMPTY, 232);
1393 nextyychar = yychar;
1394 nextyylval = yylval;
1399 /* This function stores away the text for an inline function that should
1400 be processed later. It decides how much later, and may need to move
1401 the info between obstacks; therefore, the caller should not refer to
1402 the T parameter after calling this function.
1404 This function also stores the list of template-parameter bindings that
1405 will be needed for expanding the template, if any. */
1408 store_pending_inline (decl, t)
1410 struct pending_inline *t;
1412 extern int processing_template_defn;
1413 int delay_to_eof = 0;
1414 struct pending_inline **inlines;
1417 /* Default: compile right away, and no extra bindings are needed. */
1418 t->parm_vec = t->bindings = 0;
1419 if (processing_template_defn)
1421 tree type = current_class_type;
1422 /* Assumption: In this (possibly) nested class sequence, only
1423 one name will have template parms. */
1424 while (type && TREE_CODE_CLASS (TREE_CODE (type)) == 't')
1426 tree decl = TYPE_NAME (type);
1427 tree tmpl = IDENTIFIER_TEMPLATE (DECL_NAME (decl));
1430 t->parm_vec = DECL_TEMPLATE_INFO (TREE_PURPOSE (tmpl))->parm_vec;
1431 t->bindings = TREE_VALUE (tmpl);
1433 type = DECL_CONTEXT (decl);
1435 if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE
1436 || TREE_CODE (TREE_TYPE (decl)) == FUNCTION_TYPE)
1438 if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
1439 my_friendly_assert (TYPE_MAX_VALUE (TREE_TYPE (decl)) == current_class_type,
1442 /* Inline functions can be compiled immediately. Other functions
1443 will be output separately, so if we're in interface-only mode,
1444 punt them now, or output them now if we're doing implementations
1445 and we know no overrides will exist. Otherwise, we delay until
1446 end-of-file, to see if the definition is really required. */
1447 if (DECL_INLINE (decl))
1448 /* delay_to_eof == 0 */;
1449 else if (current_class_type && !interface_unknown)
1454 print_node_brief (stderr, "\ndiscarding text for ", decl, 0);
1457 obstack_free (&inline_text_obstack, t->buf);
1458 DECL_PENDING_INLINE_INFO (decl) = 0;
1462 /* Don't delay the processing of virtual functions. */
1463 else if (DECL_VINDEX (decl) == NULL_TREE)
1467 my_friendly_abort (58);
1472 extern struct pending_inline *pending_template_expansions;
1476 char *free_to = t->buf;
1477 t->buf = (char *) obstack_copy (&permanent_obstack, t->buf,
1479 t = (struct pending_inline *) obstack_copy (&permanent_obstack,
1480 (char *)t, sizeof (*t));
1481 obstack_free (&inline_text_obstack, free_to);
1483 inlines = &pending_template_expansions;
1488 inlines = &pending_inlines;
1489 DECL_PENDING_INLINE_INFO (decl) = t;
1492 /* Because we use obstacks, we must process these in precise order. */
1497 void reinit_parse_for_block ();
1500 reinit_parse_for_method (yychar, decl)
1505 int starting_lineno = lineno;
1506 char *starting_filename = input_filename;
1508 reinit_parse_for_block (yychar, &inline_text_obstack, 0);
1510 len = obstack_object_size (&inline_text_obstack);
1511 current_base_init_list = NULL_TREE;
1512 current_member_init_list = NULL_TREE;
1513 if (decl == void_type_node
1514 || (current_class_type && TYPE_REDEFINED (current_class_type)))
1516 /* Happens when we get two declarations of the same
1517 function in the same scope. */
1518 char *buf = obstack_finish (&inline_text_obstack);
1519 obstack_free (&inline_text_obstack, buf);
1524 struct pending_inline *t;
1525 char *buf = obstack_finish (&inline_text_obstack);
1527 t = (struct pending_inline *) obstack_alloc (&inline_text_obstack,
1528 sizeof (struct pending_inline));
1529 t->lineno = starting_lineno;
1530 t->filename = starting_filename;
1537 if (interface_unknown && processing_template_defn && flag_external_templates && ! DECL_IN_SYSTEM_HEADER (decl))
1538 warn_if_unknown_interface ();
1539 t->interface = (interface_unknown ? 1 : (interface_only ? 0 : 2));
1540 store_pending_inline (decl, t);
1544 /* Consume a block -- actually, a method or template definition beginning
1545 with `:' or `{' -- and save it away on the specified obstack.
1547 Argument IS_TEMPLATE indicates which set of error messages should be
1548 output if something goes wrong. This should really be cleaned up somehow,
1549 without loss of clarity. */
1551 reinit_parse_for_block (yychar, obstackp, is_template)
1553 struct obstack *obstackp;
1558 int starting_lineno = lineno;
1559 char *starting_filename = input_filename;
1561 int look_for_semicolon = 0;
1562 int look_for_lbrac = 0;
1565 obstack_1grow (obstackp, '{');
1566 else if (yychar == '=')
1567 look_for_semicolon = 1;
1568 else if (yychar != ':' && (yychar != RETURN || is_template))
1570 yyerror (is_template
1571 ? "parse error in template specification"
1572 : "parse error in method specification");
1573 obstack_1grow (obstackp, '{');
1577 obstack_1grow (obstackp, yychar);
1582 if (nextchar != EOF)
1592 int this_lineno = lineno;
1594 c = skip_white_space (c);
1596 /* Don't lose our cool if there are lots of comments. */
1597 if (lineno == this_lineno + 1)
1598 obstack_1grow (obstackp, '\n');
1599 else if (lineno == this_lineno)
1601 else if (lineno - this_lineno < 10)
1604 for (i = lineno - this_lineno; i > 0; i--)
1605 obstack_1grow (obstackp, '\n');
1610 sprintf (buf, "\n# %d \"", lineno);
1612 obstack_grow (obstackp, buf, len);
1614 len = strlen (input_filename);
1615 obstack_grow (obstackp, input_filename, len);
1616 obstack_1grow (obstackp, '\"');
1617 obstack_1grow (obstackp, '\n');
1620 while (c > ' ') /* ASCII dependent... */
1622 obstack_1grow (obstackp, c);
1631 if (blev == 0 && !look_for_semicolon)
1636 /* Don't act on the next character...e.g, doing an escaped
1641 error_with_file_and_line (starting_filename,
1643 "end of file read inside definition");
1646 obstack_1grow (obstackp, c);
1649 consume_string (obstackp, c);
1651 consume_string (obstackp, c);
1657 ? "template body missing"
1658 : "function body for constructor missing");
1659 obstack_1grow (obstackp, '{');
1660 obstack_1grow (obstackp, '}');
1664 else if (look_for_semicolon && blev == 0)
1672 error_with_file_and_line (starting_filename,
1674 "end of file read inside definition");
1679 obstack_1grow (obstackp, c);
1684 obstack_1grow (obstackp, '\0');
1687 /* Build a default function named NAME for type TYPE.
1688 KIND says what to build.
1690 When KIND == 0, build default destructor.
1691 When KIND == 1, build virtual destructor.
1692 When KIND == 2, build default constructor.
1693 When KIND == 3, build default X(const X&) constructor.
1694 When KIND == 4, build default X(X&) constructor.
1695 When KIND == 5, build default operator = (const X&).
1696 When KIND == 6, build default operator = (X&). */
1699 cons_up_default_function (type, name, kind)
1703 extern tree void_list_node;
1704 char *func_buf = NULL;
1706 tree declspecs = NULL_TREE;
1711 name = constructor_name (name);
1716 declspecs = build_decl_list (NULL_TREE, ridpointers [(int) RID_VIRTUAL]);
1717 /* Fall through... */
1719 name = build_parse_node (BIT_NOT_EXPR, name);
1720 /* Fall through... */
1722 /* Default constructor. */
1723 args = void_list_node;
1727 type = build_type_variant (type, 1, 0);
1728 /* Fall through... */
1730 /* According to ARM $12.8, the default copy ctor will be declared, but
1731 not defined, unless it's needed. */
1732 argtype = build_reference_type (type);
1733 args = tree_cons (NULL_TREE,
1734 build_tree_list (hash_tree_chain (argtype, NULL_TREE),
1735 get_identifier ("_ctor_arg")),
1740 type = build_type_variant (type, 1, 0);
1741 /* Fall through... */
1744 declspecs = build_decl_list (NULL_TREE, name);
1746 name = ansi_opname [(int) MODIFY_EXPR];
1748 argtype = build_reference_type (type);
1749 args = tree_cons (NULL_TREE,
1750 build_tree_list (hash_tree_chain (argtype, NULL_TREE),
1751 get_identifier ("_ctor_arg")),
1756 my_friendly_abort (59);
1759 declspecs = decl_tree_cons (NULL_TREE, ridpointers [(int) RID_INLINE],
1762 TREE_PARMLIST (args) = 1;
1765 tree declarator = build_parse_node (CALL_EXPR, name, args, NULL_TREE);
1767 declarator = build_parse_node (ADDR_EXPR, declarator);
1769 fn = grokfield (declarator, declspecs, NULL_TREE, NULL_TREE, NULL_TREE);
1772 if (fn == void_type_node)
1775 /* This kludge should go away when synthesized methods are handled
1776 properly, i.e. only when needed. */
1778 struct pending_inline *t;
1779 t = (struct pending_inline *)
1780 obstack_alloc (&synth_obstack, sizeof (struct pending_inline));
1783 store_pending_inline (fn, t);
1786 #ifdef DEBUG_DEFAULT_FUNCTIONS
1787 { char *fn_type = NULL;
1791 case 0: fn_type = "default destructor"; break;
1792 case 1: fn_type = "virtual destructor"; break;
1793 case 2: fn_type = "default constructor"; break;
1794 case 3: fn_type = "default X(const X&)"; break;
1795 case 4: fn_type = "default X(X&)"; break;
1799 if (TREE_CODE (name) == BIT_NOT_EXPR)
1800 t = TREE_OPERAND (name, 0);
1801 fprintf (stderr, "[[[[ %s for %s:\n%s]]]]\n", fn_type,
1802 IDENTIFIER_POINTER (t), func_buf);
1805 #endif /* DEBUG_DEFAULT_FUNCTIONS */
1807 /* Show that this function was generated by the compiler. */
1808 SET_DECL_ARTIFICIAL (fn);
1814 /* Used by default_copy_constructor_body. For the anonymous union
1815 in TYPE, return the member that is at least as large as the rest
1816 of the members, so we can copy it. */
1818 largest_union_member (type)
1821 tree f, type_size = TYPE_SIZE (type);
1823 for (f = TYPE_FIELDS (type); f; f = TREE_CHAIN (f))
1824 if (simple_cst_equal (DECL_SIZE (f), type_size))
1827 /* We should always find one. */
1828 my_friendly_abort (323);
1832 /* Construct the body of a default assignment operator.
1833 Mostly copied directly from default_copy_constructor_body. */
1835 default_assign_ref_body (bufp, lenp, type, fields)
1840 static struct obstack body;
1841 static int inited = FALSE;
1842 int n_bases = CLASSTYPE_N_BASECLASSES (type);
1848 obstack_init (&body);
1851 body.next_free = body.object_base;
1853 obstack_1grow (&body, '{');
1855 /* Small buffer for sprintf(). */
1858 tbuf = (char *) alloca (tgot);
1860 /* If we don't need a real op=, just do a bitwise copy. */
1861 if (! TYPE_HAS_COMPLEX_ASSIGN_REF (type))
1863 tbuf = "{__builtin_memcpy(this,&_ctor_arg,sizeof(_ctor_arg));return *this;}";
1864 *lenp = strlen (tbuf);
1865 *bufp = obstack_alloc (&inline_text_obstack, *lenp + 1);
1866 strcpy (*bufp, tbuf);
1870 if (TREE_CODE (type) == UNION_TYPE)
1878 for (f = TREE_CHAIN (fields); f; f = TREE_CHAIN (f))
1879 if (tree_int_cst_lt (TYPE_SIZE (TREE_TYPE (main)),
1880 TYPE_SIZE (TREE_TYPE (f))))
1883 s = IDENTIFIER_POINTER (DECL_NAME (main));
1885 tneed = (2 * strlen (s)) + 28;
1889 tbuf = (char *) alloca (tgot);
1892 sprintf (tbuf, "{%s=_ctor_arg.%s;return *this;}", s, s);
1897 *lenp = strlen (tbuf);
1898 *bufp = obstack_alloc (&inline_text_obstack, *lenp + 1);
1899 strcpy (*bufp, tbuf);
1903 /* Construct base classes...
1904 FIXME: Does not deal with multiple inheritance and virtual bases
1905 correctly. See g++.old-deja/g++.jason/opeq5.C for a testcase.
1906 We need to do wacky things if everything between us and the virtual
1907 base (by all paths) has a "complex" op=. */
1911 tree bases = TYPE_BINFO_BASETYPES (type);
1914 for (i = 0; i < n_bases; i++)
1916 tree binfo = TREE_VEC_ELT (bases, i);
1920 btype = BINFO_TYPE (binfo);
1921 name = TYPE_NESTED_NAME (btype);
1922 s = IDENTIFIER_POINTER (name);
1924 tneed = (2 * strlen (s)) + 42;
1928 tbuf = (char *) alloca (tgot);
1931 sprintf (tbuf, "%s::operator=((%s%s ::%s&)_ctor_arg);", s,
1932 TYPE_READONLY (type) ? "const " : "",
1933 CLASSTYPE_DECLARED_CLASS (btype) ? "class" : "struct",
1935 obstack_grow (&body, tbuf, strlen (tbuf));
1939 /* Construct fields. */
1945 for (f = fields; f; f = TREE_CHAIN (f))
1947 if (TREE_CODE (f) == FIELD_DECL && ! DECL_VIRTUAL_P (f))
1951 tree t = TREE_TYPE (f);
1955 else if (t != NULL_TREE
1956 && TREE_CODE (t) == UNION_TYPE
1957 && ((TREE_CODE (TYPE_NAME (t)) == IDENTIFIER_NODE
1958 && ANON_AGGRNAME_P (TYPE_NAME (t)))
1959 || (TREE_CODE (TYPE_NAME (t)) == TYPE_DECL
1960 && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))))
1961 && TYPE_FIELDS (t) != NULL_TREE)
1962 x = largest_union_member (t);
1966 s = IDENTIFIER_POINTER (DECL_NAME (x));
1967 tneed = (2 * strlen (s)) + 13;
1971 tbuf = (char *) alloca (tgot);
1974 sprintf (tbuf, "%s=_ctor_arg.%s;", s, s);
1975 obstack_grow (&body, tbuf, strlen (tbuf));
1980 obstack_grow (&body, "return *this;}", 15);
1982 *lenp = obstack_object_size (&body) - 1;
1983 *bufp = obstack_alloc (&inline_text_obstack, *lenp);
1985 strcpy (*bufp, body.object_base);
1988 /* Construct the body of a default copy constructor. */
1990 default_copy_constructor_body (bufp, lenp, type, fields)
1995 static struct obstack prologue;
1996 static int inited = FALSE;
1997 int n_bases = CLASSTYPE_N_BASECLASSES (type);
2002 /* Create a buffer to call base class constructors and construct members
2007 obstack_init (&prologue);
2010 prologue.next_free = prologue.object_base;
2012 /* If we don't need a real copy ctor, just do a bitwise copy. */
2013 if (! TYPE_HAS_COMPLEX_INIT_REF (type))
2015 tbuf = "{__builtin_memcpy(this,&_ctor_arg,sizeof(_ctor_arg));}";
2016 *lenp = strlen (tbuf);
2017 *bufp = obstack_alloc (&inline_text_obstack, *lenp + 1);
2018 strcpy (*bufp, tbuf);
2022 /* Small buffer for sprintf(). */
2025 tbuf = (char *) alloca (tgot);
2027 if (TREE_CODE (type) == UNION_TYPE)
2035 for (f = TREE_CHAIN (fields); f; f = TREE_CHAIN (f))
2036 if (tree_int_cst_lt (TYPE_SIZE (TREE_TYPE (main)),
2037 TYPE_SIZE (TREE_TYPE (f))))
2040 s = IDENTIFIER_POINTER (DECL_NAME (main));
2041 tneed = (2 * strlen (s)) + 16;
2045 tbuf = (char *) alloca (tgot);
2048 sprintf (tbuf, ":%s(_ctor_arg.%s){}", s, s);
2053 *lenp = strlen (tbuf);
2054 *bufp = obstack_alloc (&inline_text_obstack, *lenp + 1);
2055 strcpy (*bufp, tbuf);
2059 /* Construct base classes... */
2063 /* Note that CLASSTYPE_VBASECLASSES isn't set yet... */
2064 tree v = get_vbase_types (type);
2065 tree bases = TYPE_BINFO_BASETYPES (type);
2070 tree binfo, btype, name;
2078 else if (i < n_bases)
2080 binfo = TREE_VEC_ELT (bases, i++);
2081 if (TREE_VIA_VIRTUAL (binfo))
2087 btype = BINFO_TYPE (binfo);
2088 name = TYPE_NESTED_NAME (btype);
2089 s = IDENTIFIER_POINTER (name);
2091 tneed = (2 * strlen (s)) + 39;
2095 tbuf = (char *) alloca (tgot);
2098 sprintf (tbuf, "%c%s((%s%s ::%s&)_ctor_arg)", sep, s,
2099 TYPE_READONLY (type) ? "const " : "",
2100 CLASSTYPE_DECLARED_CLASS (btype) ? "class" : "struct",
2103 obstack_grow (&prologue, tbuf, strlen (tbuf));
2107 /* Construct fields. */
2113 for (f = fields; f; f = TREE_CHAIN (f))
2115 if (TREE_CODE (f) == FIELD_DECL && ! DECL_VIRTUAL_P (f))
2119 tree t = TREE_TYPE (f);
2123 else if (t != NULL_TREE
2124 && TREE_CODE (t) == UNION_TYPE
2125 && ((TREE_CODE (TYPE_NAME (t)) == IDENTIFIER_NODE
2126 && ANON_AGGRNAME_P (TYPE_NAME (t)))
2127 || (TREE_CODE (TYPE_NAME (t)) == TYPE_DECL
2128 && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))))
2129 && TYPE_FIELDS (t) != NULL_TREE)
2130 x = largest_union_member (t);
2134 s = IDENTIFIER_POINTER (DECL_NAME (x));
2135 tneed = (2 * strlen (s)) + 30;
2139 tbuf = (char *) alloca (tgot);
2142 sprintf (tbuf, "%c%s(_ctor_arg.%s)", sep, s, s);
2144 obstack_grow (&prologue, tbuf, strlen (tbuf));
2149 /* Concatenate constructor body to prologue. */
2151 *lenp = obstack_object_size (&prologue) + 2;
2152 *bufp = obstack_alloc (&inline_text_obstack, *lenp + 1);
2154 obstack_1grow (&prologue, '\0');
2156 strcpy (*bufp, prologue.object_base);
2157 strcat (*bufp, "{}");
2161 /* Heuristic to tell whether the user is missing a semicolon
2162 after a struct or enum declaration. Emit an error message
2163 if we know the user has blown it. */
2165 check_for_missing_semicolon (type)
2173 && yychar != IDENTIFIER
2174 && yychar != TYPENAME)
2177 if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (type)))
2178 error ("semicolon missing after %s declaration",
2179 TREE_CODE (type) == ENUMERAL_TYPE ? "enum" : "struct");
2181 cp_error ("semicolon missing after declaration of `%T'", type);
2182 shadow_tag (build_tree_list (0, type));
2184 /* Could probably also hack cases where class { ... } f (); appears. */
2189 note_got_semicolon (type)
2192 if (TREE_CODE_CLASS (TREE_CODE (type)) != 't')
2193 my_friendly_abort (60);
2194 if (IS_AGGR_TYPE (type))
2195 CLASSTYPE_GOT_SEMICOLON (type) = 1;
2199 note_list_got_semicolon (declspecs)
2204 for (link = declspecs; link; link = TREE_CHAIN (link))
2206 tree type = TREE_VALUE (link);
2207 if (TREE_CODE_CLASS (TREE_CODE (type)) == 't')
2208 note_got_semicolon (type);
2213 /* If C is not whitespace, return C.
2214 Otherwise skip whitespace and return first nonwhite char read. */
2217 skip_white_space (c)
2225 c = check_newline ();
2236 while (c == ' ' || c == '\t');
2244 error ("stray '\\' in program");
2256 /* Make the token buffer longer, preserving the data in it.
2257 P should point to just beyond the last valid character in the old buffer.
2258 The value we return is a pointer to the new buffer
2259 at a place corresponding to P. */
2262 extend_token_buffer (p)
2265 int offset = p - token_buffer;
2267 maxtoken = maxtoken * 2 + 10;
2268 token_buffer = (char *) xrealloc (token_buffer, maxtoken + 2);
2270 return token_buffer + offset;
2274 get_last_nonwhite_on_line ()
2278 /* Is this the last nonwhite stuff on the line? */
2280 c = nextchar, nextchar = -1;
2284 while (c == ' ' || c == '\t')
2289 /* At the beginning of a line, increment the line number
2290 and process any #-directive on this line.
2291 If the line is a #-directive, read the entire line and return a newline.
2292 Otherwise, return the line's first non-whitespace character. */
2300 /* Read first nonwhite char on the line. Do this before incrementing the
2301 line number, in case we're at the end of saved text. */
2305 while (c == ' ' || c == '\t');
2311 /* If not #, return it so caller will use it. */
2315 /* Read first nonwhite char after the `#'. */
2319 while (c == ' ' || c == '\t');
2321 /* If a letter follows, then if the word here is `line', skip
2322 it and ignore it; otherwise, ignore the line, with an error
2323 if the word isn't `pragma'. */
2325 if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
2335 /* Read first nonwhite char after the `#pragma'. */
2339 while (c == ' ' || c == '\t');
2347 && ((c = getch ()) == ' ' || c == '\t' || c == '\n'))
2349 extern tree pending_vtables;
2351 /* More follows: it must be a string constant (class name). */
2352 token = real_yylex ();
2353 if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
2355 error ("invalid #pragma vtable");
2358 if (write_virtuals != 2)
2360 warning ("use `+e2' option to enable #pragma vtable");
2363 pending_vtables = perm_tree_cons (NULL_TREE, get_identifier (TREE_STRING_POINTER (yylval.ttype)), pending_vtables);
2365 nextchar = getch ();
2368 warning ("trailing characters ignored");
2374 && ((c = getch ()) == ' ' || c == '\t' || c == '\n'))
2376 /* More follows: it must be a string constant (unit name). */
2377 token = real_yylex ();
2378 if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
2380 error ("invalid #pragma unit");
2383 current_unit_name = get_identifier (TREE_STRING_POINTER (yylval.ttype));
2384 current_unit_language = current_lang_name;
2386 nextchar = getch ();
2389 warning ("trailing characters ignored");
2393 tree fileinfo = IDENTIFIER_CLASS_VALUE (get_time_identifier (input_filename));
2404 && ((c = getch ()) == ' ' || c == '\t' || c == '\n'))
2406 int warned_already = 0;
2407 char *main_filename = input_filename;
2409 main_filename = FILE_NAME_NONDIRECTORY (main_filename);
2410 while (c == ' ' || c == '\t')
2415 token = real_yylex ();
2417 || TREE_CODE (yylval.ttype) != STRING_CST)
2419 error ("invalid `#pragma interface'");
2422 main_filename = TREE_STRING_POINTER (yylval.ttype);
2427 while (c == ' ' || c == '\t')
2432 if (!warned_already && extra_warnings
2433 && c != ' ' && c != '\t' && c != '\n')
2435 warning ("garbage after `#pragma interface' ignored");
2443 if (impl_file_chain == 0)
2445 /* If this is zero at this point, then we are
2446 auto-implementing. */
2447 if (main_input_filename == 0)
2448 main_input_filename = input_filename;
2450 #ifdef AUTO_IMPLEMENT
2451 filename = FILE_NAME_NONDIRECTORY (main_input_filename);
2452 fi = get_time_identifier (filename);
2453 fi = IDENTIFIER_CLASS_VALUE (fi);
2454 TREE_INT_CST_LOW (fi) = 0;
2455 TREE_INT_CST_HIGH (fi) = 1;
2457 impl_file_chain = (struct impl_files *)permalloc (sizeof (struct impl_files));
2458 impl_file_chain->filename = filename;
2459 impl_file_chain->next = 0;
2463 interface_only = interface_strcmp (main_filename);
2464 interface_unknown = 0;
2465 TREE_INT_CST_LOW (fileinfo) = interface_only;
2466 TREE_INT_CST_HIGH (fileinfo) = interface_unknown;
2481 && ((c = getch ()) == ' ' || c == '\t' || c == '\n'))
2483 int warned_already = 0;
2484 char *main_filename = main_input_filename ? main_input_filename : input_filename;
2486 main_filename = FILE_NAME_NONDIRECTORY (main_filename);
2487 while (c == ' ' || c == '\t')
2492 token = real_yylex ();
2494 || TREE_CODE (yylval.ttype) != STRING_CST)
2496 error ("invalid `#pragma implementation'");
2499 main_filename = TREE_STRING_POINTER (yylval.ttype);
2504 while (c == ' ' || c == '\t')
2509 if (!warned_already && extra_warnings
2510 && c != ' ' && c != '\t' && c != '\n')
2512 warning ("garbage after `#pragma implementation' ignored");
2518 if (write_virtuals == 3)
2520 struct impl_files *ifiles = impl_file_chain;
2523 if (! strcmp (ifiles->filename, main_filename))
2525 ifiles = ifiles->next;
2529 ifiles = (struct impl_files*) permalloc (sizeof (struct impl_files));
2530 ifiles->filename = main_filename;
2531 ifiles->next = impl_file_chain;
2532 impl_file_chain = ifiles;
2535 else if ((main_input_filename != 0
2536 && ! strcmp (main_input_filename, input_filename))
2537 || ! strcmp (input_filename, main_filename))
2540 if (impl_file_chain == 0)
2542 impl_file_chain = (struct impl_files*) permalloc (sizeof (struct impl_files));
2543 impl_file_chain->filename = main_filename;
2544 impl_file_chain->next = 0;
2548 error ("`#pragma implementation' can only appear at top-level");
2551 /* We make this non-zero so that we infer decl linkage
2552 in the impl file only for variables first declared
2553 in the interface file. */
2554 interface_unknown = 1;
2556 /* We make this zero so that templates in the impl
2557 file will be emitted properly. */
2558 interface_unknown = 0;
2560 TREE_INT_CST_LOW (fileinfo) = interface_only;
2561 TREE_INT_CST_HIGH (fileinfo) = interface_unknown;
2574 && ((c = getch ()) == ' ' || c == '\t' || c == '\n'))
2576 #ifdef DWARF_DEBUGGING_INFO
2577 if ((debug_info_level == DINFO_LEVEL_VERBOSE)
2578 && (write_symbols == DWARF_DEBUG))
2579 dwarfout_define (lineno, get_directive_line (finput));
2580 #endif /* DWARF_DEBUGGING_INFO */
2590 && ((c = getch ()) == ' ' || c == '\t' || c == '\n'))
2592 #ifdef DWARF_DEBUGGING_INFO
2593 if ((debug_info_level == DINFO_LEVEL_VERBOSE)
2594 && (write_symbols == DWARF_DEBUG))
2595 dwarfout_undef (lineno, get_directive_line (finput));
2596 #endif /* DWARF_DEBUGGING_INFO */
2605 && ((c = getch ()) == ' ' || c == '\t'))
2614 && ((c = getch ()) == ' ' || c == '\t'))
2616 #ifdef ASM_OUTPUT_IDENT
2617 extern FILE *asm_out_file;
2619 /* #ident. The pedantic warning is now in cccp.c. */
2621 /* Here we have just seen `#ident '.
2622 A string constant should follow. */
2624 while (c == ' ' || c == '\t')
2627 /* If no argument, ignore the line. */
2632 token = real_yylex ();
2634 || TREE_CODE (yylval.ttype) != STRING_CST)
2636 error ("invalid #ident");
2640 if (! flag_no_ident)
2642 #ifdef ASM_OUTPUT_IDENT
2643 ASM_OUTPUT_IDENT (asm_out_file,
2644 TREE_STRING_POINTER (yylval.ttype));
2648 /* Skip the rest of this line. */
2661 && ((c = getch ()) == ' ' || c == '\t'))
2663 /* Used to test incremental compilation. */
2664 sorry ("#pragma newworld");
2668 error ("undefined or invalid # directive");
2673 /* Here we have either `#line' or `# <nonletter>'.
2674 In either case, it should be a line number; a digit should follow. */
2676 while (c == ' ' || c == '\t')
2679 /* If the # is the only nonwhite char on the line,
2680 just ignore it. Check the new newline. */
2684 /* Something follows the #; read a token. */
2687 token = real_yylex ();
2689 if (token == CONSTANT
2690 && TREE_CODE (yylval.ttype) == INTEGER_CST)
2692 int old_lineno = lineno;
2693 enum { act_none, act_push, act_pop } action = act_none;
2694 int entering_system_header = 0;
2695 int entering_c_header = 0;
2697 /* subtract one, because it is the following line that
2698 gets the specified number */
2700 int l = TREE_INT_CST_LOW (yylval.ttype) - 1;
2701 c = get_last_nonwhite_on_line ();
2704 /* No more: store the line number and check following line. */
2710 /* More follows: it must be a string constant (filename). */
2712 /* Read the string constant, but don't treat \ as special. */
2713 ignore_escape_flag = 1;
2714 token = real_yylex ();
2715 ignore_escape_flag = 0;
2717 if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
2719 error ("invalid #line");
2723 /* Changing files again. This means currently collected time
2724 is charged against header time, and body time starts back
2726 if (flag_detailed_statistics)
2728 int this_time = my_get_run_time ();
2729 tree time_identifier = get_time_identifier (TREE_STRING_POINTER (yylval.ttype));
2730 header_time += this_time - body_time;
2731 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (this_filename_time))
2732 += this_time - body_time;
2733 this_filename_time = time_identifier;
2734 body_time = this_time;
2738 cadillac_note_source ();
2741 = (char *) permalloc (TREE_STRING_LENGTH (yylval.ttype) + 1);
2742 strcpy (input_filename, TREE_STRING_POINTER (yylval.ttype));
2744 GNU_xref_file (input_filename);
2746 if (main_input_filename == 0)
2748 struct impl_files *ifiles = impl_file_chain;
2752 while (ifiles->next)
2753 ifiles = ifiles->next;
2754 ifiles->filename = FILE_NAME_NONDIRECTORY (input_filename);
2757 main_input_filename = input_filename;
2758 if (write_virtuals == 3)
2759 walk_vtables (set_typedecl_interface_info, set_vardecl_interface_info);
2762 extract_interface_info ();
2764 c = get_last_nonwhite_on_line ();
2769 token = real_yylex ();
2771 /* `1' after file name means entering new file.
2772 `2' after file name means just left a file. */
2774 if (token == CONSTANT
2775 && TREE_CODE (yylval.ttype) == INTEGER_CST)
2777 if (TREE_INT_CST_LOW (yylval.ttype) == 1)
2779 else if (TREE_INT_CST_LOW (yylval.ttype) == 2)
2784 c = get_last_nonwhite_on_line ();
2788 token = real_yylex ();
2793 /* `3' after file name means this is a system header file. */
2795 if (token == CONSTANT
2796 && TREE_CODE (yylval.ttype) == INTEGER_CST
2797 && TREE_INT_CST_LOW (yylval.ttype) == 3)
2799 entering_system_header = 1;
2801 c = get_last_nonwhite_on_line ();
2805 token = real_yylex ();
2809 /* `4' after file name means this is a C header file. */
2811 if (token == CONSTANT
2812 && TREE_CODE (yylval.ttype) == INTEGER_CST
2813 && TREE_INT_CST_LOW (yylval.ttype) == 4)
2815 entering_c_header = 1;
2817 c = get_last_nonwhite_on_line ();
2821 token = real_yylex ();
2825 /* Do the actions implied by the preceeding numbers. */
2827 if (action == act_push)
2829 /* Pushing to a new file. */
2830 struct file_stack *p;
2832 p = (struct file_stack *) xmalloc (sizeof (struct file_stack));
2833 input_file_stack->line = old_lineno;
2834 p->next = input_file_stack;
2835 p->name = input_filename;
2836 input_file_stack = p;
2837 input_file_stack_tick++;
2838 #ifdef DWARF_DEBUGGING_INFO
2839 if (debug_info_level == DINFO_LEVEL_VERBOSE
2840 && write_symbols == DWARF_DEBUG)
2841 dwarfout_start_new_source_file (input_filename);
2842 #endif /* DWARF_DEBUGGING_INFO */
2844 cadillac_push_source ();
2845 in_system_header = entering_system_header;
2848 else if (entering_c_header)
2851 ++pending_lang_change;
2854 else if (action == act_pop)
2856 /* Popping out of a file. */
2857 if (input_file_stack->next)
2859 struct file_stack *p;
2861 if (c_header_level && --c_header_level == 0)
2863 if (entering_c_header)
2864 warning ("badly nested C headers from preprocessor");
2865 --pending_lang_change;
2868 cadillac_pop_source ();
2869 in_system_header = entering_system_header;
2871 p = input_file_stack;
2872 input_file_stack = p->next;
2874 input_file_stack_tick++;
2875 #ifdef DWARF_DEBUGGING_INFO
2876 if (debug_info_level == DINFO_LEVEL_VERBOSE
2877 && write_symbols == DWARF_DEBUG)
2878 dwarfout_resume_previous_source_file (input_file_stack->line);
2879 #endif /* DWARF_DEBUGGING_INFO */
2882 error ("#-lines for entering and leaving files don't match");
2886 in_system_header = entering_system_header;
2888 cadillac_switch_source (-1);
2892 /* If NEXTCHAR is not end of line, we don't care what it is. */
2893 if (nextchar == '\n')
2897 error ("invalid #-line");
2899 /* skip the rest of this line. */
2903 while ((c = getch ()) != EOF && c != '\n');
2908 do_pending_lang_change ()
2910 for (; pending_lang_change > 0; --pending_lang_change)
2911 push_lang_context (lang_name_c);
2912 for (; pending_lang_change < 0; ++pending_lang_change)
2913 pop_lang_context ();
2917 #define isalnum(char) (char >= 'a' ? char <= 'z' : char >= '0' ? char <= '9' || (char >= 'A' && char <= 'Z') : 0)
2918 #define isdigit(char) (char >= '0' && char <= '9')
2923 #define ENDFILE -1 /* token that represents end-of-file */
2925 /* Read an escape sequence, returning its equivalent as a character,
2926 or store 1 in *ignore_ptr if it is backslash-newline. */
2929 readescape (ignore_ptr)
2932 register int c = getch ();
2934 register unsigned count;
2941 if (warn_traditional)
2942 warning ("the meaning of `\\x' varies with -traditional");
2944 if (flag_traditional)
2959 if (c >= 'a' && c <= 'f')
2960 code += c - 'a' + 10;
2961 if (c >= 'A' && c <= 'F')
2962 code += c - 'A' + 10;
2963 if (c >= '0' && c <= '9')
2965 if (code != 0 || count != 0)
2974 error ("\\x used with no following hex digits");
2975 else if (count == 0)
2976 /* Digits are all 0's. Ok. */
2978 else if ((count - 1) * 4 >= TYPE_PRECISION (integer_type_node)
2980 && ((1 << (TYPE_PRECISION (integer_type_node) - (count - 1) * 4))
2982 pedwarn ("hex escape out of range");
2985 case '0': case '1': case '2': case '3': case '4':
2986 case '5': case '6': case '7':
2989 while ((c <= '7') && (c >= '0') && (count++ < 3))
2991 code = (code * 8) + (c - '0');
2997 case '\\': case '\'': case '"':
3006 return TARGET_NEWLINE;
3021 if (warn_traditional)
3022 warning ("the meaning of `\\a' varies with -traditional");
3024 if (flag_traditional)
3034 pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c);
3040 /* `\(', etc, are used at beginning of line to avoid confusing Emacs. */
3044 /* `\%' is used to prevent SCCS from getting confused. */
3047 pedwarn ("unknown escape sequence `\\%c'", c);
3050 if (c >= 040 && c < 0177)
3051 pedwarn ("unknown escape sequence `\\%c'", c);
3053 pedwarn ("unknown escape sequence: `\\' followed by char code 0x%x", c);
3057 /* Value is 1 (or 2) if we should try to make the next identifier look like
3058 a typename (when it may be a local variable or a class variable).
3059 Value is 0 if we treat this name in a default fashion. */
3060 int looking_for_typename = 0;
3063 /* NO LONGER USED: Value is -1 if we must not see a type name. */
3065 dont_see_typename ()
3067 looking_for_typename = -1;
3068 if (yychar == TYPENAME || yychar == PTYPENAME)
3070 yychar = IDENTIFIER;
3077 extern __inline int identifier_type ();
3081 identifier_type (decl)
3084 if (TREE_CODE (decl) == TEMPLATE_DECL
3085 && DECL_TEMPLATE_IS_CLASS (decl))
3087 if (TREE_CODE (decl) != TYPE_DECL)
3095 looking_for_typename = 0;
3096 if (yychar == IDENTIFIER)
3098 lastiddecl = lookup_name (yylval.ttype, -2);
3099 if (lastiddecl == 0)
3102 lastiddecl = IDENTIFIER_LABEL_VALUE (yylval.ttype);
3105 yychar = identifier_type (lastiddecl);
3110 do_identifier (token)
3111 register tree token;
3113 register tree id = lastiddecl;
3115 if (yychar == YYEMPTY)
3117 /* Scope class declarations before global
3119 if (id == IDENTIFIER_GLOBAL_VALUE (token)
3120 && current_class_type != 0
3121 && TYPE_SIZE (current_class_type) == 0
3122 && TREE_CODE (current_class_type) != UNINSTANTIATED_P_TYPE)
3124 /* Could be from one of the base classes. */
3125 tree field = lookup_field (current_class_type, token, 1, 0);
3128 else if (field == error_mark_node)
3129 /* We have already generated the error message.
3130 But we still want to return this value. */
3131 id = lookup_field (current_class_type, token, 0, 0);
3132 else if (TREE_CODE (field) == VAR_DECL
3133 || TREE_CODE (field) == CONST_DECL)
3135 else if (TREE_CODE (field) != FIELD_DECL)
3136 my_friendly_abort (61);
3139 cp_error ("invalid use of member `%D' from base class `%T'", field,
3140 DECL_FIELD_CONTEXT (field));
3141 id = error_mark_node;
3146 /* Remember that this name has been used in the class definition, as per
3148 if (id && current_class_type
3149 && TYPE_BEING_DEFINED (current_class_type)
3150 && ! IDENTIFIER_CLASS_VALUE (token))
3151 pushdecl_class_level (id);
3153 if (!id || id == error_mark_node)
3155 if (id == error_mark_node && current_class_type != NULL_TREE)
3157 id = lookup_nested_field (token, 1);
3158 /* In lookup_nested_field(), we marked this so we can gracefully
3159 leave this whole mess. */
3160 if (id && id != error_mark_node && TREE_TYPE (id) == error_mark_node)
3163 if (yychar == '(' || yychar == LEFT_RIGHT)
3165 id = implicitly_declare (token);
3167 else if (current_function_decl == 0)
3169 cp_error ("`%D' was not declared in this scope", token);
3170 id = error_mark_node;
3174 if (IDENTIFIER_GLOBAL_VALUE (token) != error_mark_node
3175 || IDENTIFIER_ERROR_LOCUS (token) != current_function_decl)
3177 static int undeclared_variable_notice;
3179 cp_error ("`%D' undeclared (first use this function)", token);
3181 if (! undeclared_variable_notice)
3183 error ("(Each undeclared identifier is reported only once");
3184 error ("for each function it appears in.)");
3185 undeclared_variable_notice = 1;
3188 id = error_mark_node;
3189 /* Prevent repeated error messages. */
3190 IDENTIFIER_GLOBAL_VALUE (token) = error_mark_node;
3191 SET_IDENTIFIER_ERROR_LOCUS (token, current_function_decl);
3194 /* TREE_USED is set in `hack_identifier'. */
3195 if (TREE_CODE (id) == CONST_DECL)
3197 if (IDENTIFIER_CLASS_VALUE (token) == id)
3200 enum access_type access
3201 = compute_access (TYPE_BINFO (current_class_type), id);
3202 if (access == access_private)
3203 cp_error ("enum `%D' is private", id);
3204 /* protected is OK, since it's an enum of `this'. */
3206 id = DECL_INITIAL (id);
3209 id = hack_identifier (id, token, yychar);
3214 identifier_typedecl_value (node)
3218 type = IDENTIFIER_TYPE_VALUE (node);
3219 if (type == NULL_TREE)
3224 if (t && TREE_CODE (t) == TYPE_DECL && TREE_TYPE (t) == type) \
3227 do (IDENTIFIER_LOCAL_VALUE (node));
3228 do (IDENTIFIER_CLASS_VALUE (node));
3229 do (IDENTIFIER_GLOBAL_VALUE (node));
3231 /* Will this one ever happen? */
3232 if (TYPE_NAME (type))
3233 return TYPE_NAME (type);
3235 /* We used to do an internal error of 62 here, but instead we will
3236 handle the return of a null appropriately in the callers. */
3245 char long_long_flag;
3248 struct try_type type_sequence[] =
3250 { &integer_type_node, 0, 0, 0},
3251 { &unsigned_type_node, 1, 0, 0},
3252 { &long_integer_type_node, 0, 1, 0},
3253 { &long_unsigned_type_node, 1, 1, 0},
3254 { &long_long_integer_type_node, 0, 1, 1},
3255 { &long_long_unsigned_type_node, 1, 1, 1}
3264 int dollar_seen = 0;
3268 c = nextchar, nextchar = -1;
3272 /* Effectively do c = skip_white_space (c)
3273 but do it faster in the usual cases. */
3286 /* Call skip_white_space so we can warn if appropriate. */
3291 c = skip_white_space (c);
3293 goto found_nonwhite;
3297 token_buffer[0] = c;
3298 token_buffer[1] = 0;
3300 /* yylloc.first_line = lineno; */
3305 token_buffer[0] = '\0';
3307 if (input_redirected ())
3308 value = END_OF_SAVED_INPUT;
3309 else if (do_pending_expansions ())
3310 /* this will set yychar for us */
3317 if (dollars_in_ident)
3326 /* Capital L may start a wide-string or wide-character constant. */
3328 register int c = getch ();
3337 goto string_constant;
3342 case 'A': case 'B': case 'C': case 'D': case 'E':
3343 case 'F': case 'G': case 'H': case 'I': case 'J':
3344 case 'K': case 'M': case 'N': case 'O':
3345 case 'P': case 'Q': case 'R': case 'S': case 'T':
3346 case 'U': case 'V': case 'W': case 'X': case 'Y':
3348 case 'a': case 'b': case 'c': case 'd': case 'e':
3349 case 'f': case 'g': case 'h': case 'i': case 'j':
3350 case 'k': case 'l': case 'm': case 'n': case 'o':
3351 case 'p': case 'q': case 'r': case 's': case 't':
3352 case 'u': case 'v': case 'w': case 'x': case 'y':
3362 /* We know that `token_buffer' can hold at least on char,
3363 so we install C immediately.
3364 We may have to read the value in `putback_char', so call
3369 /* Make this run fast. We know that we are reading straight
3370 from FINPUT in this case (since identifiers cannot straddle
3372 while (isalnum (c) || (c == '_') || c == '$')
3374 if (c == '$' && ! dollars_in_ident)
3376 if (p >= token_buffer + maxtoken)
3377 p = extend_token_buffer (p);
3385 /* We know that `token_buffer' can hold at least on char,
3386 so we install C immediately. */
3390 while (isalnum (c) || (c == '_') || c == '$')
3392 if (c == '$' && ! dollars_in_ident)
3394 if (p >= token_buffer + maxtoken)
3395 p = extend_token_buffer (p);
3408 /* Try to recognize a keyword. Uses minimum-perfect hash function */
3411 register struct resword *ptr;
3413 if (ptr = is_reserved_word (token_buffer, p - token_buffer))
3417 tree old_ttype = ridpointers[(int) ptr->rid];
3419 /* If this provides a type for us, then revert lexical
3420 state to standard state. */
3421 if (TREE_CODE (old_ttype) == IDENTIFIER_NODE
3422 && IDENTIFIER_GLOBAL_VALUE (old_ttype) != 0
3423 && TREE_CODE (IDENTIFIER_GLOBAL_VALUE (old_ttype)) == TYPE_DECL)
3424 looking_for_typename = 0;
3425 else if (ptr->token == AGGR || ptr->token == ENUM)
3426 looking_for_typename = 1;
3428 /* Check if this is a language-type declaration.
3429 Just glimpse the next non-white character. */
3430 nextchar = skip_white_space (nextchar);
3431 if (nextchar == '"')
3433 /* We are looking at a string. Complain
3434 if the token before the string is no `extern'.
3436 Could cheat some memory by placing this string
3437 on the temporary_, instead of the saveable_
3440 if (ptr->rid != RID_EXTERN)
3441 error ("invalid modifier `%s' for language string",
3444 value = EXTERN_LANG_STRING;
3445 yylval.ttype = get_identifier (TREE_STRING_POINTER (yylval.ttype));
3448 if (ptr->token == VISSPEC)
3453 yylval.itype = access_public;
3456 yylval.itype = access_private;
3459 yylval.itype = access_protected;
3462 my_friendly_abort (63);
3466 yylval.ttype = old_ttype;
3468 value = (int) ptr->token;
3472 /* If we did not find a keyword, look for an identifier
3475 if (strcmp ("catch", token_buffer) == 0
3476 || strcmp ("throw", token_buffer) == 0
3477 || strcmp ("try", token_buffer) == 0)
3479 static int did_warn = 0;
3480 if (! did_warn && ! flag_handle_exceptions)
3482 pedwarn ("`catch', `throw', and `try' are all C++ reserved words");
3487 if (value == IDENTIFIER || value == TYPESPEC)
3488 GNU_xref_ref (current_function_decl, token_buffer);
3490 if (value == IDENTIFIER)
3492 register tree tmp = get_identifier (token_buffer);
3494 #if !defined(VMS) && defined(JOINER)
3495 /* Make sure that user does not collide with our internal
3499 && (THIS_NAME_P (tmp)
3500 || VPTR_NAME_P (tmp)
3501 || DESTRUCTOR_NAME_P (tmp)
3502 || VTABLE_NAME_P (tmp)
3503 || TEMP_NAME_P (tmp)
3504 || ANON_AGGRNAME_P (tmp)
3505 || ANON_PARMNAME_P (tmp)))
3506 warning ("identifier name `%s' conflicts with GNU C++ internal naming strategy",
3512 /* A user-invisible read-only initialized variable
3513 should be replaced by its value. We only handle strings
3514 since that's the only case used in C (and C++). */
3515 /* Note we go right after the local value for the identifier
3516 (e.g., __FUNCTION__ or __PRETTY_FUNCTION__). We used to
3517 call lookup_name, but that could result in an error about
3519 tmp = IDENTIFIER_LOCAL_VALUE (yylval.ttype);
3520 if (tmp != NULL_TREE
3521 && TREE_CODE (tmp) == VAR_DECL
3522 && DECL_IGNORED_P (tmp)
3523 && TREE_READONLY (tmp)
3524 && DECL_INITIAL (tmp) != NULL_TREE
3525 && TREE_CODE (DECL_INITIAL (tmp)) == STRING_CST)
3527 yylval.ttype = DECL_INITIAL (tmp);
3531 if (value == NEW && ! global_bindings_p ())
3541 register int c1 = getch ();
3542 token_buffer[0] = c;
3543 token_buffer[1] = c1;
3547 token_buffer[2] = 0;
3555 token_buffer[2] = c1;
3556 token_buffer[3] = 0;
3560 error ("parse error at `..'");
3565 goto resume_numerical_scan;
3569 token_buffer[1] = 0;
3573 /* Optimize for most frequent case. */
3575 register int c1 = getch ();
3576 if (! isalnum (c1) && c1 != '.')
3578 /* Terminate string. */
3579 token_buffer[0] = c;
3580 token_buffer[1] = 0;
3582 yylval.ttype = integer_zero_node;
3584 yylval.ttype = integer_one_node;
3591 /* fall through... */
3592 case '2': case '3': case '4':
3593 case '5': case '6': case '7': case '8': case '9':
3594 resume_numerical_scan:
3599 int largest_digit = 0;
3601 /* for multi-precision arithmetic,
3602 we actually store only HOST_BITS_PER_CHAR bits in each part.
3603 The number of parts is chosen so as to be sufficient to hold
3604 the enough bits to fit into the two HOST_WIDE_INTs that contain
3605 the integer value (this is always at least as many bits as are
3606 in a target `long long' value, but may be wider). */
3607 #define TOTAL_PARTS ((HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR) * 2 + 2)
3608 int parts[TOTAL_PARTS];
3611 enum anon1 { NOT_FLOAT, AFTER_POINT, TOO_MANY_POINTS} floatflag
3617 for (count = 0; count < TOTAL_PARTS; count++)
3622 *p++ = (c = getch ());
3623 if ((c == 'x') || (c == 'X'))
3626 *p++ = (c = getch ());
3628 /* Leading 0 forces octal unless the 0 is the only digit. */
3629 else if (c >= '0' && c <= '9')
3638 /* Read all the digits-and-decimal-points. */
3641 || (isalnum (c) && (c != 'l') && (c != 'L')
3642 && (c != 'u') && (c != 'U')
3643 && (floatflag == NOT_FLOAT || ((c != 'f') && (c != 'F')))))
3648 error ("floating constant may not be in radix 16");
3649 if (floatflag == AFTER_POINT)
3651 error ("malformed floating constant");
3652 floatflag = TOO_MANY_POINTS;
3655 floatflag = AFTER_POINT;
3658 *p++ = c = getch ();
3659 /* Accept '.' as the start of a floating-point number
3660 only when it is followed by a digit.
3661 Otherwise, unread the following non-digit
3662 and use the '.' as a structural token. */
3663 if (p == token_buffer + 2 && !isdigit (c))
3675 error ("parse error at `..'");
3678 token_buffer[1] = '\0';
3685 /* It is not a decimal point.
3686 It should be a digit (perhaps a hex digit). */
3692 else if (base <= 10)
3694 if (c == 'e' || c == 'E')
3697 floatflag = AFTER_POINT;
3698 break; /* start of exponent */
3700 error ("nondigits in number and not hexadecimal");
3711 if (c >= largest_digit)
3715 for (count = 0; count < TOTAL_PARTS; count++)
3717 parts[count] *= base;
3721 += (parts[count-1] >> HOST_BITS_PER_CHAR);
3723 &= (1 << HOST_BITS_PER_CHAR) - 1;
3729 /* If the extra highest-order part ever gets anything in it,
3730 the number is certainly too big. */
3731 if (parts[TOTAL_PARTS - 1] != 0)
3734 if (p >= token_buffer + maxtoken - 3)
3735 p = extend_token_buffer (p);
3736 *p++ = (c = getch ());
3741 error ("numeric constant with no digits");
3743 if (largest_digit >= base)
3744 error ("numeric constant contains digits beyond the radix");
3746 /* Remove terminating char from the token buffer and delimit the string */
3749 if (floatflag != NOT_FLOAT)
3751 tree type = double_type_node;
3754 int garbage_chars = 0;
3755 REAL_VALUE_TYPE value;
3758 /* Read explicit exponent if any, and put it in tokenbuf. */
3760 if ((c == 'e') || (c == 'E'))
3762 if (p >= token_buffer + maxtoken - 3)
3763 p = extend_token_buffer (p);
3766 if ((c == '+') || (c == '-'))
3772 error ("floating constant exponent has no digits");
3775 if (p >= token_buffer + maxtoken - 3)
3776 p = extend_token_buffer (p);
3785 /* Convert string to a double, checking for overflow. */
3786 if (setjmp (handler))
3788 error ("floating constant out of range");
3793 set_float_handler (handler);
3794 /* The second argument, machine_mode, of REAL_VALUE_ATOF
3795 tells the desired precision of the binary result of
3796 decimal-to-binary conversion. */
3798 /* Read the suffixes to choose a data type. */
3802 type = float_type_node;
3803 value = REAL_VALUE_ATOF (token_buffer, TYPE_MODE (type));
3808 type = long_double_type_node;
3809 value = REAL_VALUE_ATOF (token_buffer, TYPE_MODE (type));
3814 value = REAL_VALUE_ATOF (token_buffer, TYPE_MODE (type));
3816 set_float_handler (NULL_PTR);
3819 && (REAL_VALUE_ISINF (value)
3821 || (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
3823 /* ERANGE is also reported for underflow, so test the
3824 value to distinguish overflow from that. */
3825 && (REAL_VALUES_LESS (dconst1, value)
3826 || REAL_VALUES_LESS (value, dconstm1)))
3830 pedwarn ("floating point number exceeds range of `%s'",
3831 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
3833 /* Note: garbage_chars is -1 if first char is *not* garbage. */
3836 if (c == 'f' || c == 'F')
3839 error ("two `f's in floating constant");
3842 if (c == 'l' || c == 'L')
3845 error ("two `l's in floating constant");
3848 if (p >= token_buffer + maxtoken - 3)
3849 p = extend_token_buffer (p);
3855 if (garbage_chars > 0)
3856 error ("garbage at end of number");
3858 /* Create a node with determined type and value. */
3859 yylval.ttype = build_real (type, value);
3867 HOST_WIDE_INT high, low;
3868 int spec_unsigned = 0;
3870 int spec_long_long = 0;
3875 if (c == 'u' || c == 'U')
3878 error ("two `u's in integer constant");
3881 else if (c == 'l' || c == 'L')
3886 error ("three `l's in integer constant");
3888 pedwarn ("ANSI C++ forbids long long integer constants");
3897 error ("garbage at end of number");
3900 if (p >= token_buffer + maxtoken - 3)
3901 p = extend_token_buffer (p);
3908 if (p >= token_buffer + maxtoken - 3)
3909 p = extend_token_buffer (p);
3916 /* If the constant is not long long and it won't fit in an
3917 unsigned long, or if the constant is long long and won't fit
3918 in an unsigned long long, then warn that the constant is out
3921 /* ??? This assumes that long long and long integer types are
3922 a multiple of 8 bits. This better than the original code
3923 though which assumed that long was exactly 32 bits and long
3924 long was exactly 64 bits. */
3927 bytes = TYPE_PRECISION (long_long_integer_type_node) / 8;
3929 bytes = TYPE_PRECISION (long_integer_type_node) / 8;
3932 for (i = bytes; i < TOTAL_PARTS; i++)
3936 pedwarn ("integer constant out of range");
3938 /* This is simplified by the fact that our constant
3939 is always positive. */
3942 for (i = 0; i < HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR; i++)
3944 high |= ((HOST_WIDE_INT) parts[i + (HOST_BITS_PER_WIDE_INT
3945 / HOST_BITS_PER_CHAR)]
3946 << (i * HOST_BITS_PER_CHAR));
3947 low |= (HOST_WIDE_INT) parts[i] << (i * HOST_BITS_PER_CHAR);
3951 yylval.ttype = build_int_2 (low, high);
3952 TREE_TYPE (yylval.ttype) = long_long_unsigned_type_node;
3955 /* Find the first allowable type that the value fits in. */
3957 for (i = 0; i < sizeof (type_sequence) / sizeof (type_sequence[0]);
3959 if (!(spec_long && !type_sequence[i].long_flag)
3960 && !(spec_long_long && !type_sequence[i].long_long_flag)
3961 && !(spec_unsigned && !type_sequence[i].unsigned_flag)
3962 /* A hex or octal constant traditionally is unsigned. */
3963 && !(base != 10 && flag_traditional
3964 && !type_sequence[i].unsigned_flag)
3965 /* A decimal constant can't be unsigned int
3966 unless explicitly specified. */
3967 && !(base == 10 && !spec_unsigned
3968 && *type_sequence[i].node_var == unsigned_type_node))
3969 if (int_fits_type_p (yylval.ttype, *type_sequence[i].node_var))
3971 type = *type_sequence[i].node_var;
3974 if (flag_traditional && type == long_unsigned_type_node
3976 type = long_integer_type_node;
3980 type = long_long_integer_type_node;
3981 warning ("integer constant out of range");
3984 /* Warn about some cases where the type of a given constant
3985 changes from traditional C to ANSI C. */
3986 if (warn_traditional)
3988 tree other_type = 0;
3990 /* This computation is the same as the previous one
3991 except that flag_traditional is used backwards. */
3992 for (i = 0; i < sizeof (type_sequence) / sizeof (type_sequence[0]);
3994 if (!(spec_long && !type_sequence[i].long_flag)
3995 && !(spec_long_long && !type_sequence[i].long_long_flag)
3996 && !(spec_unsigned && !type_sequence[i].unsigned_flag)
3997 /* A hex or octal constant traditionally is unsigned. */
3998 && !(base != 10 && !flag_traditional
3999 && !type_sequence[i].unsigned_flag)
4000 /* A decimal constant can't be unsigned int
4001 unless explicitly specified. */
4002 && !(base == 10 && !spec_unsigned
4003 && *type_sequence[i].node_var == unsigned_type_node))
4004 if (int_fits_type_p (yylval.ttype, *type_sequence[i].node_var))
4006 other_type = *type_sequence[i].node_var;
4009 if (!flag_traditional && type == long_unsigned_type_node
4011 type = long_integer_type_node;
4013 if (other_type != 0 && other_type != type)
4015 if (flag_traditional)
4016 warning ("type of integer constant would be different without -traditional");
4018 warning ("type of integer constant would be different with -traditional");
4023 if (!spec_long && !spec_unsigned
4024 && !(flag_traditional && base != 10)
4025 && int_fits_type_p (yylval.ttype, integer_type_node))
4028 if (warn_traditional && base != 10)
4029 warning ("small nondecimal constant becomes signed in ANSI C++");
4031 type = integer_type_node;
4033 else if (!spec_long && (base != 10 || spec_unsigned)
4034 && int_fits_type_p (yylval.ttype, unsigned_type_node))
4036 /* Nondecimal constants try unsigned even in traditional C. */
4037 type = unsigned_type_node;
4040 else if (!spec_unsigned && !spec_long_long
4041 && int_fits_type_p (yylval.ttype, long_integer_type_node))
4042 type = long_integer_type_node;
4044 else if (! spec_long_long
4045 && int_fits_type_p (yylval.ttype,
4046 long_unsigned_type_node))
4049 if (warn_traditional && !spec_unsigned)
4050 warning ("large integer constant becomes unsigned in ANSI C++");
4052 if (flag_traditional && !spec_unsigned)
4053 type = long_integer_type_node;
4055 type = long_unsigned_type_node;
4058 else if (! spec_unsigned
4059 /* Verify value does not overflow into sign bit. */
4060 && TREE_INT_CST_HIGH (yylval.ttype) >= 0
4061 && int_fits_type_p (yylval.ttype,
4062 long_long_integer_type_node))
4063 type = long_long_integer_type_node;
4065 else if (int_fits_type_p (yylval.ttype,
4066 long_long_unsigned_type_node))
4069 if (warn_traditional && !spec_unsigned)
4070 warning ("large nondecimal constant is unsigned in ANSI C++");
4073 if (flag_traditional && !spec_unsigned)
4074 type = long_long_integer_type_node;
4076 type = long_long_unsigned_type_node;
4081 type = long_long_integer_type_node;
4082 warning ("integer constant out of range");
4084 if (base == 10 && ! spec_unsigned && TREE_UNSIGNED (type))
4085 warning ("decimal integer constant is so large that it is unsigned");
4089 TREE_TYPE (yylval.ttype) = type;
4093 value = CONSTANT; break;
4099 register int result = 0;
4100 register int num_chars = 0;
4101 unsigned width = TYPE_PRECISION (char_type_node);
4106 width = WCHAR_TYPE_SIZE;
4107 #ifdef MULTIBYTE_CHARS
4108 max_chars = MB_CUR_MAX;
4114 max_chars = TYPE_PRECISION (integer_type_node) / width;
4122 if (c == '\'' || c == EOF)
4128 c = readescape (&ignore);
4131 if (width < HOST_BITS_PER_INT
4132 && (unsigned) c >= (1 << width))
4133 pedwarn ("escape sequence out of range for character");
4134 #ifdef MAP_CHARACTER
4136 c = MAP_CHARACTER (c);
4142 pedwarn ("ANSI C++ forbids newline in character constant");
4145 #ifdef MAP_CHARACTER
4147 c = MAP_CHARACTER (c);
4151 if (num_chars > maxtoken - 4)
4152 extend_token_buffer (token_buffer);
4154 token_buffer[num_chars] = c;
4156 /* Merge character into result; ignore excess chars. */
4157 if (num_chars < max_chars + 1)
4159 if (width < HOST_BITS_PER_INT)
4160 result = (result << width) | (c & ((1 << width) - 1));
4166 token_buffer[num_chars + 1] = '\'';
4167 token_buffer[num_chars + 2] = 0;
4170 error ("malformatted character constant");
4171 else if (num_chars == 0)
4172 error ("empty character constant");
4173 else if (num_chars > max_chars)
4175 num_chars = max_chars;
4176 error ("character constant too long");
4178 else if (num_chars != 1 && ! flag_traditional)
4179 warning ("multi-character character constant");
4181 /* If char type is signed, sign-extend the constant. */
4184 int num_bits = num_chars * width;
4186 /* We already got an error; avoid invalid shift. */
4187 yylval.ttype = build_int_2 (0, 0);
4188 else if (TREE_UNSIGNED (char_type_node)
4189 || ((result >> (num_bits - 1)) & 1) == 0)
4191 = build_int_2 (result & ((unsigned HOST_WIDE_INT) ~0
4192 >> (HOST_BITS_PER_INT - num_bits)),
4196 = build_int_2 (result | ~((unsigned HOST_WIDE_INT) ~0
4197 >> (HOST_BITS_PER_INT - num_bits)),
4200 TREE_TYPE (yylval.ttype) = char_type_node;
4202 TREE_TYPE (yylval.ttype) = integer_type_node;
4206 #ifdef MULTIBYTE_CHARS
4207 /* Set the initial shift state and convert the next sequence. */
4209 /* In all locales L'\0' is zero and mbtowc will return zero,
4212 || (num_chars == 1 && token_buffer[1] != '\0'))
4215 (void) mbtowc (NULL, NULL, 0);
4216 if (mbtowc (& wc, token_buffer + 1, num_chars) == num_chars)
4219 warning ("Ignoring invalid multibyte character");
4222 yylval.ttype = build_int_2 (result, 0);
4223 TREE_TYPE (yylval.ttype) = wchar_type_node;
4236 p = token_buffer + 1;
4238 while (c != '"' && c >= 0)
4240 /* ignore_escape_flag is set for reading the filename in #line. */
4241 if (!ignore_escape_flag && c == '\\')
4244 c = readescape (&ignore);
4248 && TYPE_PRECISION (char_type_node) < HOST_BITS_PER_INT
4249 && c >= ((unsigned) 1 << TYPE_PRECISION (char_type_node)))
4250 pedwarn ("escape sequence out of range for character");
4255 pedwarn ("ANSI C++ forbids newline in string constant");
4259 if (p == token_buffer + maxtoken)
4260 p = extend_token_buffer (p);
4266 error("Unterminated string");
4272 /* We have read the entire constant.
4273 Construct a STRING_CST for the result. */
4277 /* If this is a L"..." wide-string, convert the multibyte string
4278 to a wide character string. */
4279 char *widep = (char *) alloca ((p - token_buffer) * WCHAR_BYTES);
4282 #ifdef MULTIBYTE_CHARS
4283 len = mbstowcs ((wchar_t *) widep, token_buffer + 1, p - token_buffer);
4284 if (len < 0 || len >= (p - token_buffer))
4286 warning ("Ignoring invalid multibyte string");
4289 bzero (widep + (len * WCHAR_BYTES), WCHAR_BYTES);
4292 union { long l; char c[sizeof (long)]; } u;
4296 /* Determine whether host is little or big endian. */
4298 big_endian = u.c[sizeof (long) - 1];
4299 wp = widep + (big_endian ? WCHAR_BYTES - 1 : 0);
4301 bzero (widep, (p - token_buffer) * WCHAR_BYTES);
4302 for (cp = token_buffer + 1; cp < p; cp++)
4303 *wp = *cp, wp += WCHAR_BYTES;
4304 len = p - token_buffer - 1;
4307 yylval.ttype = build_string ((len + 1) * WCHAR_BYTES, widep);
4308 TREE_TYPE (yylval.ttype) = wchar_array_type_node;
4312 yylval.ttype = build_string (p - token_buffer, token_buffer + 1);
4313 TREE_TYPE (yylval.ttype) = char_array_type_node;
4319 value = STRING; break;
4342 yylval.code = PLUS_EXPR; break;
4344 yylval.code = MINUS_EXPR; break;
4346 yylval.code = BIT_AND_EXPR; break;
4348 yylval.code = BIT_IOR_EXPR; break;
4350 yylval.code = MULT_EXPR; break;
4352 yylval.code = TRUNC_DIV_EXPR; break;
4354 yylval.code = TRUNC_MOD_EXPR; break;
4356 yylval.code = BIT_XOR_EXPR; break;
4358 yylval.code = LSHIFT_EXPR; break;
4360 yylval.code = RSHIFT_EXPR; break;
4362 yylval.code = LT_EXPR; break;
4364 yylval.code = GT_EXPR; break;
4367 token_buffer[1] = c1 = getch ();
4368 token_buffer[2] = 0;
4375 value = ARITHCOMPARE; yylval.code = LE_EXPR; goto done;
4377 value = ARITHCOMPARE; yylval.code = GE_EXPR; goto done;
4379 value = EQCOMPARE; yylval.code = NE_EXPR; goto done;
4381 value = EQCOMPARE; yylval.code = EQ_EXPR; goto done;
4383 value = ASSIGN; goto done;
4389 value = PLUSPLUS; goto done;
4391 value = MINUSMINUS; goto done;
4393 value = ANDAND; goto done;
4395 value = OROR; goto done;
4403 else if ((c == '-') && (c1 == '>'))
4405 nextchar = skip_white_space (getch ());
4406 if (nextchar == '*')
4409 value = POINTSAT_STAR;
4415 else if (c1 == '?' && (c == '<' || c == '>'))
4417 token_buffer[3] = 0;
4420 yylval.code = (c == '<' ? MIN_EXPR : MAX_EXPR);
4423 /* <?= or >?= expression. */
4424 token_buffer[2] = c1;
4433 pedwarn ("use of `operator %s' is not standard C++",
4439 token_buffer[1] = 0;
4449 token_buffer[1] = ':';
4450 token_buffer[2] = '\0';
4462 /* Don't make yyparse think this is eof. */
4467 /* try, weakly, to handle casts to pointers to functions. */
4468 nextchar = skip_white_space (getch ());
4469 if (nextchar == '*')
4471 int next_c = skip_white_space (getch ());
4475 yylval.ttype = build1 (INDIRECT_REF, 0, 0);
4476 value = PAREN_STAR_PAREN;
4484 else if (nextchar == ')')
4487 yylval.ttype = NULL_TREE;
4498 /* yylloc.last_line = lineno; */
4499 #ifdef GATHER_STATISTICS
4500 token_count[value] += 1;
4508 d_kind, t_kind, s_kind, r_kind, e_kind, c_kind,
4509 id_kind, op_id_kind, perm_list_kind, temp_list_kind,
4510 vec_kind, x_kind, lang_decl, lang_type, all_kinds
4512 extern int tree_node_counts[];
4513 extern int tree_node_sizes[];
4514 extern char *tree_node_kind_names[];
4516 /* Place to save freed lang_decls which were allocated on the
4517 permanent_obstack. @@ Not currently used. */
4518 tree free_lang_decl_chain;
4521 build_lang_decl (code, name, type)
4522 enum tree_code code;
4526 register tree t = build_decl (code, name, type);
4527 struct obstack *obstack = current_obstack;
4528 register int i = sizeof (struct lang_decl) / sizeof (int);
4531 if (! TREE_PERMANENT (t))
4532 obstack = saveable_obstack;
4534 /* Could be that saveable is permanent and current is not. */
4535 obstack = &permanent_obstack;
4537 if (free_lang_decl_chain && obstack == &permanent_obstack)
4539 pi = (int *)free_lang_decl_chain;
4540 free_lang_decl_chain = TREE_CHAIN (free_lang_decl_chain);
4543 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl));
4548 DECL_LANG_SPECIFIC (t) = (struct lang_decl *) pi;
4549 LANG_DECL_PERMANENT ((struct lang_decl *) pi)
4550 = obstack == &permanent_obstack;
4551 my_friendly_assert (LANG_DECL_PERMANENT ((struct lang_decl *) pi)
4552 == TREE_PERMANENT (t), 234);
4553 DECL_MAIN_VARIANT (t) = t;
4554 if (current_lang_name == lang_name_cplusplus)
4556 DECL_LANGUAGE (t) = lang_cplusplus;
4558 #ifndef NO_AUTO_OVERLOAD
4559 if (code == FUNCTION_DECL && name != 0
4560 && ! (IDENTIFIER_LENGTH (name) == 4
4561 && IDENTIFIER_POINTER (name)[0] == 'm'
4562 && strcmp (IDENTIFIER_POINTER (name), "main") == 0)
4563 && ! (IDENTIFIER_LENGTH (name) > 10
4564 && IDENTIFIER_POINTER (name)[0] == '_'
4565 && IDENTIFIER_POINTER (name)[1] == '_'
4566 && strncmp (IDENTIFIER_POINTER (name)+2, "builtin_", 8) == 0))
4567 TREE_OVERLOADED (name) = 1;
4571 else if (current_lang_name == lang_name_c)
4572 DECL_LANGUAGE (t) = lang_c;
4573 else my_friendly_abort (64);
4575 #if 0 /* not yet, should get fixed properly later */
4576 if (code == TYPE_DECL)
4579 id = get_identifier (build_overload_name (type, 1, 1));
4580 DECL_ASSEMBLER_NAME (t) = id;
4584 #ifdef GATHER_STATISTICS
4585 tree_node_counts[(int)lang_decl] += 1;
4586 tree_node_sizes[(int)lang_decl] += sizeof(struct lang_decl);
4593 build_lang_field_decl (code, name, type)
4594 enum tree_code code;
4598 extern struct obstack *current_obstack, *saveable_obstack;
4599 register tree t = build_decl (code, name, type);
4600 struct obstack *obstack = current_obstack;
4601 register int i = sizeof (struct lang_decl_flags) / sizeof (int);
4603 #if 0 /* not yet, should get fixed properly later */
4605 if (code == TYPE_DECL)
4608 id = get_identifier (build_overload_name (type, 1, 1));
4609 DECL_ASSEMBLER_NAME (t) = id;
4613 if (! TREE_PERMANENT (t))
4614 obstack = saveable_obstack;
4616 my_friendly_assert (obstack == &permanent_obstack, 235);
4618 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl_flags));
4622 DECL_LANG_SPECIFIC (t) = (struct lang_decl *) pi;
4627 copy_lang_decl (node)
4633 if (TREE_CODE (node) == FIELD_DECL)
4634 size = sizeof (struct lang_decl_flags);
4636 size = sizeof (struct lang_decl);
4637 pi = (int *)obstack_alloc (&permanent_obstack, size);
4638 bcopy ((char *)DECL_LANG_SPECIFIC (node), (char *)pi, size);
4639 DECL_LANG_SPECIFIC (node) = (struct lang_decl *)pi;
4643 make_lang_type (code)
4644 enum tree_code code;
4646 extern struct obstack *current_obstack, *saveable_obstack;
4647 register tree t = make_node (code);
4648 struct obstack *obstack = current_obstack;
4649 register int i = sizeof (struct lang_type) / sizeof (int);
4652 /* Set up some flags that give proper default behavior. */
4653 IS_AGGR_TYPE (t) = 1;
4655 if (! TREE_PERMANENT (t))
4656 obstack = saveable_obstack;
4658 my_friendly_assert (obstack == &permanent_obstack, 236);
4660 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_type));
4664 TYPE_LANG_SPECIFIC (t) = (struct lang_type *) pi;
4665 CLASSTYPE_AS_LIST (t) = build_tree_list (NULL_TREE, t);
4666 SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown);
4667 CLASSTYPE_INTERFACE_ONLY (t) = interface_only;
4668 CLASSTYPE_VBASE_SIZE (t) = integer_zero_node;
4669 TYPE_BINFO (t) = make_binfo (integer_zero_node, t, NULL_TREE, NULL_TREE,
4671 CLASSTYPE_BINFO_AS_LIST (t) = build_tree_list (NULL_TREE, TYPE_BINFO (t));
4673 /* Make sure this is laid out, for ease of use later.
4674 In the presence of parse errors, the normal was of assuring
4675 this might not ever get executed, so we lay it out *immediately*. */
4676 build_pointer_type (t);
4678 #ifdef GATHER_STATISTICS
4679 tree_node_counts[(int)lang_type] += 1;
4680 tree_node_sizes[(int)lang_type] += sizeof(struct lang_type);
4687 copy_decl_lang_specific (decl)
4690 extern struct obstack *current_obstack, *saveable_obstack;
4691 register int *old = (int *)DECL_LANG_SPECIFIC (decl);
4692 struct obstack *obstack = current_obstack;
4693 register int i = sizeof (struct lang_decl) / sizeof (int);
4696 if (! TREE_PERMANENT (decl))
4697 obstack = saveable_obstack;
4699 my_friendly_assert (obstack == &permanent_obstack, 237);
4701 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl));
4705 DECL_LANG_SPECIFIC (decl) = (struct lang_decl *) pi;
4707 #ifdef GATHER_STATISTICS
4708 tree_node_counts[(int)lang_decl] += 1;
4709 tree_node_sizes[(int)lang_decl] += sizeof(struct lang_decl);
4714 dump_time_statistics ()
4716 register tree prev = 0, decl, next;
4717 int this_time = my_get_run_time ();
4718 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (this_filename_time))
4719 += this_time - body_time;
4721 fprintf (stderr, "\n******\n");
4722 print_time ("header files (total)", header_time);
4723 print_time ("main file (total)", this_time - body_time);
4724 fprintf (stderr, "ratio = %g : 1\n",
4725 (double)header_time / (double)(this_time - body_time));
4726 fprintf (stderr, "\n******\n");
4728 for (decl = filename_times; decl; decl = next)
4730 next = IDENTIFIER_GLOBAL_VALUE (decl);
4731 IDENTIFIER_GLOBAL_VALUE (decl) = prev;
4735 for (decl = prev; decl; decl = IDENTIFIER_GLOBAL_VALUE (decl))
4736 print_time (IDENTIFIER_POINTER (decl),
4737 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (decl)));
4741 compiler_error (s, v, v2)
4743 HOST_WIDE_INT v, v2; /* @@also used as pointer */
4746 sprintf (buf, s, v, v2);
4747 error_with_file_and_line (input_filename, lineno, "%s (compiler error)", buf);
4751 compiler_error_with_decl (decl, s)
4758 report_error_function (0);
4760 if (TREE_CODE (decl) == PARM_DECL)
4761 fprintf (stderr, "%s:%d: ",
4762 DECL_SOURCE_FILE (DECL_CONTEXT (decl)),
4763 DECL_SOURCE_LINE (DECL_CONTEXT (decl)));
4765 fprintf (stderr, "%s:%d: ",
4766 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
4768 name = lang_printable_name (decl);
4770 fprintf (stderr, s, name);
4772 fprintf (stderr, s, "((anonymous))");
4773 fprintf (stderr, " (compiler error)\n");
4780 extern int end_of_file;
4783 strcpy (buf, string);
4785 /* We can't print string and character constants well
4786 because the token_buffer contains the result of processing escapes. */
4788 strcat (buf, input_redirected ()
4789 ? " at end of saved text"
4790 : " at end of input");
4791 else if (token_buffer[0] == 0)
4792 strcat (buf, " at null character");
4793 else if (token_buffer[0] == '"')
4794 strcat (buf, " before string constant");
4795 else if (token_buffer[0] == '\'')
4796 strcat (buf, " before character constant");
4797 else if (token_buffer[0] < 040 || (unsigned char) token_buffer[0] >= 0177)
4798 sprintf (buf + strlen (buf), " before character 0%o",
4799 (unsigned char) token_buffer[0]);
4801 strcat (buf, " before `%s'");
4803 error (buf, token_buffer);