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;
80 /* Pending language change.
81 Positive is push count, negative is pop count. */
82 int pending_lang_change = 0;
84 /* Wrap the current header file in extern "C". */
85 static int c_header_level = 0;
87 extern int first_token;
88 extern struct obstack token_obstack;
90 /* ??? Don't really know where this goes yet. */
94 extern void put_back (/* int */);
95 extern int input_redirected ();
96 extern void feed_input (/* char *, int, struct obstack * */);
99 /* Holds translations from TREE_CODEs to operator name strings,
100 i.e., opname_tab[PLUS_EXPR] == "+". */
104 extern int yychar; /* the lookahead symbol */
105 extern YYSTYPE yylval; /* the semantic value of the */
106 /* lookahead symbol */
109 YYLTYPE yylloc; /* location data for the lookahead */
114 /* the declaration found for the last IDENTIFIER token read in.
115 yylex must look this up to detect typedefs, which get token type TYPENAME,
116 so it is left around in case the identifier is not a typedef but is
117 used in a context which makes it a reference to a variable. */
120 /* The elements of `ridpointers' are identifier nodes
121 for the reserved type names and storage classes.
122 It is indexed by a RID_... value. */
123 tree ridpointers[(int) RID_MAX];
125 /* We may keep statistics about how long which files took to compile. */
126 static int header_time, body_time;
127 static tree get_time_identifier ();
128 static tree filename_times;
129 static tree this_filename_time;
131 /* For implementing #pragma unit. */
132 tree current_unit_name;
133 tree current_unit_language;
135 /* Array for holding counts of the numbers of tokens seen. */
136 extern int *token_count;
138 /* Textual definition used for default functions. */
139 static void default_copy_constructor_body ();
140 static void default_assign_ref_body ();
142 /* Return something to represent absolute declarators containing a *.
143 TARGET is the absolute declarator that the * contains.
144 TYPE_QUALS is a list of modifiers such as const or volatile
145 to apply to the pointer type, represented as identifiers.
147 We return an INDIRECT_REF whose "contents" are TARGET
148 and whose type is the modifier list. */
151 make_pointer_declarator (type_quals, target)
152 tree type_quals, target;
154 if (target && TREE_CODE (target) == IDENTIFIER_NODE
155 && ANON_AGGRNAME_P (target))
156 error ("type name expected before `*'");
157 target = build_parse_node (INDIRECT_REF, target);
158 TREE_TYPE (target) = type_quals;
162 /* Return something to represent absolute declarators containing a &.
163 TARGET is the absolute declarator that the & contains.
164 TYPE_QUALS is a list of modifiers such as const or volatile
165 to apply to the reference type, represented as identifiers.
167 We return an ADDR_EXPR whose "contents" are TARGET
168 and whose type is the modifier list. */
171 make_reference_declarator (type_quals, target)
172 tree type_quals, target;
176 if (TREE_CODE (target) == ADDR_EXPR)
178 error ("cannot declare references to references");
181 if (TREE_CODE (target) == INDIRECT_REF)
183 error ("cannot declare pointers to references");
186 if (TREE_CODE (target) == IDENTIFIER_NODE && ANON_AGGRNAME_P (target))
187 error ("type name expected before `&'");
189 target = build_parse_node (ADDR_EXPR, target);
190 TREE_TYPE (target) = type_quals;
194 /* Build names and nodes for overloaded operators. */
196 tree ansi_opname[LAST_CPLUS_TREE_CODE];
197 tree ansi_assopname[LAST_CPLUS_TREE_CODE];
200 operator_name_string (name)
203 char *opname = IDENTIFIER_POINTER (name) + 2;
207 /* Works for builtin and user defined types. */
208 if (IDENTIFIER_GLOBAL_VALUE (name)
209 && TREE_CODE (IDENTIFIER_GLOBAL_VALUE (name)) == TYPE_DECL)
210 return IDENTIFIER_POINTER (name);
212 if (opname[0] == 'a' && opname[2] != '\0' && opname[2] != '_')
216 opname_table = ansi_assopname;
221 opname_table = ansi_opname;
224 for (i = 0; i < (int) LAST_CPLUS_TREE_CODE; i++)
226 if (opname[0] == IDENTIFIER_POINTER (opname_table[i])[2+assign]
227 && opname[1] == IDENTIFIER_POINTER (opname_table[i])[3+assign])
231 if (i == LAST_CPLUS_TREE_CODE)
232 return "<invalid operator>";
235 return assignop_tab[i];
237 return opname_tab[i];
240 int interface_only; /* whether or not current file is only for
241 interface definitions. */
242 int interface_unknown; /* whether or not we know this class
243 to behave according to #pragma interface. */
245 /* lexical analyzer */
247 /* File used for outputting assembler code. */
248 extern FILE *asm_out_file;
250 #ifndef WCHAR_TYPE_SIZE
252 #define WCHAR_TYPE_SIZE INT_TYPE_SIZE
254 #define WCHAR_TYPE_SIZE BITS_PER_WORD
258 /* Number of bytes in a wide character. */
259 #define WCHAR_BYTES (WCHAR_TYPE_SIZE / BITS_PER_UNIT)
261 static int maxtoken; /* Current nominal length of token buffer. */
262 char *token_buffer; /* Pointer to token buffer.
263 Actual allocated length is maxtoken + 2. */
267 int check_newline ();
269 /* Nonzero tells yylex to ignore \ in string constants. */
270 static int ignore_escape_flag = 0;
272 static int skip_white_space ();
275 get_time_identifier (name)
278 tree time_identifier;
279 int len = strlen (name);
280 char *buf = (char *) alloca (len + 6);
281 strcpy (buf, "file ");
282 bcopy (name, buf+5, len);
284 time_identifier = get_identifier (buf);
285 if (IDENTIFIER_LOCAL_VALUE (time_identifier) == NULL_TREE)
287 push_obstacks_nochange ();
288 end_temporary_allocation ();
289 IDENTIFIER_LOCAL_VALUE (time_identifier) = build_int_2 (0, 0);
290 IDENTIFIER_CLASS_VALUE (time_identifier) = build_int_2 (0, 1);
291 IDENTIFIER_GLOBAL_VALUE (time_identifier) = filename_times;
292 filename_times = time_identifier;
295 return time_identifier;
304 int old_quiet_flag = quiet_flag;
307 this_time = get_run_time ();
308 quiet_flag = old_quiet_flag;
312 /* Table indexed by tree code giving a string containing a character
313 classifying the tree code. Possibilities are
314 t, d, s, c, r, <, 1 and 2. See cp/tree.def for details. */
316 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
318 char *cplus_tree_code_type[] = {
324 /* Table indexed by tree code giving number of expression
325 operands beyond the fixed part of the node structure.
326 Not used for types or decls. */
328 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
330 int cplus_tree_code_length[] = {
336 /* Names of tree components.
337 Used for printing out the tree and error messages. */
338 #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
340 char *cplus_tree_code_name[] = {
346 /* toplev.c needs to call these. */
351 /* the beginning of the file is a new line; check for # */
352 /* With luck, we discover the real source file's name from that
353 and put it in input_filename. */
354 put_back (check_newline ());
358 if (flag_gnu_xref) GNU_xref_begin (input_filename);
364 extern int errorcount, sorrycount;
365 if (flag_gnu_xref) GNU_xref_end (errorcount+sorrycount);
375 init_filename_times ()
377 this_filename_time = get_time_identifier ("<top level>");
378 if (flag_detailed_statistics)
381 body_time = my_get_run_time ();
382 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (this_filename_time)) = body_time;
386 /* Change by Bryan Boreham, Kewill, Thu Jul 27 09:46:05 1989.
387 Stuck this hack in to get the files open correctly; this is called
388 in place of init_lex if we are an unexec'd binary. */
390 reinit_lang_specific ()
392 init_filename_times ();
393 reinit_search_statistics ();
399 extern char *(*decl_printable_name) ();
403 /* Initialize the lookahead machinery. */
406 /* Make identifier nodes long enough for the language-specific slots. */
407 set_identifier_size (sizeof (struct lang_identifier));
408 decl_printable_name = lang_printable_name;
410 init_cplus_expand ();
413 = (char **) realloc (tree_code_type,
414 sizeof (char *) * LAST_CPLUS_TREE_CODE);
416 = (int *) realloc (tree_code_length,
417 sizeof (int) * LAST_CPLUS_TREE_CODE);
419 = (char **) realloc (tree_code_name,
420 sizeof (char *) * LAST_CPLUS_TREE_CODE);
421 bcopy ((char *)cplus_tree_code_type,
422 (char *)(tree_code_type + (int) LAST_AND_UNUSED_TREE_CODE),
423 (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (char *));
424 bcopy ((char *)cplus_tree_code_length,
425 (char *)(tree_code_length + (int) LAST_AND_UNUSED_TREE_CODE),
426 (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (int));
427 bcopy ((char *)cplus_tree_code_name,
428 (char *)(tree_code_name + (int) LAST_AND_UNUSED_TREE_CODE),
429 (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (char *));
431 opname_tab = (char **)oballoc ((int)LAST_CPLUS_TREE_CODE * sizeof (char *));
432 bzero ((char *)opname_tab, (int)LAST_CPLUS_TREE_CODE * sizeof (char *));
433 assignop_tab = (char **)oballoc ((int)LAST_CPLUS_TREE_CODE * sizeof (char *));
434 bzero ((char *)assignop_tab, (int)LAST_CPLUS_TREE_CODE * sizeof (char *));
436 ansi_opname[0] = get_identifier ("<invalid operator>");
437 for (i = 0; i < (int) LAST_CPLUS_TREE_CODE; i++)
439 ansi_opname[i] = ansi_opname[0];
440 ansi_assopname[i] = ansi_opname[0];
443 ansi_opname[(int) MULT_EXPR] = get_identifier ("__ml");
444 IDENTIFIER_OPNAME_P (ansi_opname[(int) MULT_EXPR]) = 1;
445 ansi_opname[(int) INDIRECT_REF] = ansi_opname[(int) MULT_EXPR];
446 ansi_assopname[(int) MULT_EXPR] = get_identifier ("__aml");
447 IDENTIFIER_OPNAME_P (ansi_assopname[(int) MULT_EXPR]) = 1;
448 ansi_assopname[(int) INDIRECT_REF] = ansi_assopname[(int) MULT_EXPR];
449 ansi_opname[(int) TRUNC_MOD_EXPR] = get_identifier ("__md");
450 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUNC_MOD_EXPR]) = 1;
451 ansi_assopname[(int) TRUNC_MOD_EXPR] = get_identifier ("__amd");
452 IDENTIFIER_OPNAME_P (ansi_assopname[(int) TRUNC_MOD_EXPR]) = 1;
453 ansi_opname[(int) CEIL_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR];
454 ansi_opname[(int) FLOOR_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR];
455 ansi_opname[(int) ROUND_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR];
456 ansi_opname[(int) MINUS_EXPR] = get_identifier ("__mi");
457 IDENTIFIER_OPNAME_P (ansi_opname[(int) MINUS_EXPR]) = 1;
458 ansi_opname[(int) NEGATE_EXPR] = ansi_opname[(int) MINUS_EXPR];
459 ansi_assopname[(int) MINUS_EXPR] = get_identifier ("__ami");
460 IDENTIFIER_OPNAME_P (ansi_assopname[(int) MINUS_EXPR]) = 1;
461 ansi_assopname[(int) NEGATE_EXPR] = ansi_assopname[(int) MINUS_EXPR];
462 ansi_opname[(int) RSHIFT_EXPR] = get_identifier ("__rs");
463 IDENTIFIER_OPNAME_P (ansi_opname[(int) RSHIFT_EXPR]) = 1;
464 ansi_assopname[(int) RSHIFT_EXPR] = get_identifier ("__ars");
465 IDENTIFIER_OPNAME_P (ansi_assopname[(int) RSHIFT_EXPR]) = 1;
466 ansi_opname[(int) NE_EXPR] = get_identifier ("__ne");
467 IDENTIFIER_OPNAME_P (ansi_opname[(int) NE_EXPR]) = 1;
468 ansi_opname[(int) GT_EXPR] = get_identifier ("__gt");
469 IDENTIFIER_OPNAME_P (ansi_opname[(int) GT_EXPR]) = 1;
470 ansi_opname[(int) GE_EXPR] = get_identifier ("__ge");
471 IDENTIFIER_OPNAME_P (ansi_opname[(int) GE_EXPR]) = 1;
472 ansi_opname[(int) BIT_IOR_EXPR] = get_identifier ("__or");
473 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_IOR_EXPR]) = 1;
474 ansi_assopname[(int) BIT_IOR_EXPR] = get_identifier ("__aor");
475 IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_IOR_EXPR]) = 1;
476 ansi_opname[(int) TRUTH_ANDIF_EXPR] = get_identifier ("__aa");
477 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_ANDIF_EXPR]) = 1;
478 ansi_opname[(int) TRUTH_NOT_EXPR] = get_identifier ("__nt");
479 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_NOT_EXPR]) = 1;
480 ansi_opname[(int) PREINCREMENT_EXPR] = get_identifier ("__pp");
481 IDENTIFIER_OPNAME_P (ansi_opname[(int) PREINCREMENT_EXPR]) = 1;
482 ansi_opname[(int) POSTINCREMENT_EXPR] = ansi_opname[(int) PREINCREMENT_EXPR];
483 ansi_opname[(int) MODIFY_EXPR] = get_identifier ("__as");
484 IDENTIFIER_OPNAME_P (ansi_opname[(int) MODIFY_EXPR]) = 1;
485 ansi_assopname[(int) NOP_EXPR] = ansi_opname[(int) MODIFY_EXPR];
486 ansi_opname[(int) COMPOUND_EXPR] = get_identifier ("__cm");
487 IDENTIFIER_OPNAME_P (ansi_opname[(int) COMPOUND_EXPR]) = 1;
488 ansi_opname[(int) EXACT_DIV_EXPR] = get_identifier ("__dv");
489 IDENTIFIER_OPNAME_P (ansi_opname[(int) EXACT_DIV_EXPR]) = 1;
490 ansi_assopname[(int) EXACT_DIV_EXPR] = get_identifier ("__adv");
491 IDENTIFIER_OPNAME_P (ansi_assopname[(int) EXACT_DIV_EXPR]) = 1;
492 ansi_opname[(int) TRUNC_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
493 ansi_opname[(int) CEIL_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
494 ansi_opname[(int) FLOOR_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
495 ansi_opname[(int) ROUND_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
496 ansi_opname[(int) PLUS_EXPR] = get_identifier ("__pl");
497 ansi_assopname[(int) TRUNC_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
498 ansi_assopname[(int) CEIL_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
499 ansi_assopname[(int) FLOOR_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
500 ansi_assopname[(int) ROUND_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
501 IDENTIFIER_OPNAME_P (ansi_opname[(int) PLUS_EXPR]) = 1;
502 ansi_assopname[(int) PLUS_EXPR] = get_identifier ("__apl");
503 IDENTIFIER_OPNAME_P (ansi_assopname[(int) PLUS_EXPR]) = 1;
504 ansi_opname[(int) CONVERT_EXPR] = ansi_opname[(int) PLUS_EXPR];
505 ansi_assopname[(int) CONVERT_EXPR] = ansi_assopname[(int) PLUS_EXPR];
506 ansi_opname[(int) LSHIFT_EXPR] = get_identifier ("__ls");
507 IDENTIFIER_OPNAME_P (ansi_opname[(int) LSHIFT_EXPR]) = 1;
508 ansi_assopname[(int) LSHIFT_EXPR] = get_identifier ("__als");
509 IDENTIFIER_OPNAME_P (ansi_assopname[(int) LSHIFT_EXPR]) = 1;
510 ansi_opname[(int) EQ_EXPR] = get_identifier ("__eq");
511 IDENTIFIER_OPNAME_P (ansi_opname[(int) EQ_EXPR]) = 1;
512 ansi_opname[(int) LT_EXPR] = get_identifier ("__lt");
513 IDENTIFIER_OPNAME_P (ansi_opname[(int) LT_EXPR]) = 1;
514 ansi_opname[(int) LE_EXPR] = get_identifier ("__le");
515 IDENTIFIER_OPNAME_P (ansi_opname[(int) LE_EXPR]) = 1;
516 ansi_opname[(int) BIT_AND_EXPR] = get_identifier ("__ad");
517 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_AND_EXPR]) = 1;
518 ansi_assopname[(int) BIT_AND_EXPR] = get_identifier ("__aad");
519 IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_AND_EXPR]) = 1;
520 ansi_opname[(int) ADDR_EXPR] = ansi_opname[(int) BIT_AND_EXPR];
521 ansi_assopname[(int) ADDR_EXPR] = ansi_assopname[(int) BIT_AND_EXPR];
522 ansi_opname[(int) BIT_XOR_EXPR] = get_identifier ("__er");
523 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_XOR_EXPR]) = 1;
524 ansi_assopname[(int) BIT_XOR_EXPR] = get_identifier ("__aer");
525 IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_XOR_EXPR]) = 1;
526 ansi_opname[(int) TRUTH_ORIF_EXPR] = get_identifier ("__oo");
527 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_ORIF_EXPR]) = 1;
528 ansi_opname[(int) BIT_NOT_EXPR] = get_identifier ("__co");
529 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_NOT_EXPR]) = 1;
530 ansi_opname[(int) PREDECREMENT_EXPR] = get_identifier ("__mm");
531 IDENTIFIER_OPNAME_P (ansi_opname[(int) PREDECREMENT_EXPR]) = 1;
532 ansi_opname[(int) POSTDECREMENT_EXPR] = ansi_opname[(int) PREDECREMENT_EXPR];
533 ansi_opname[(int) COMPONENT_REF] = get_identifier ("__rf");
534 IDENTIFIER_OPNAME_P (ansi_opname[(int) COMPONENT_REF]) = 1;
535 ansi_opname[(int) MEMBER_REF] = get_identifier ("__rm");
536 IDENTIFIER_OPNAME_P (ansi_opname[(int) MEMBER_REF]) = 1;
537 ansi_opname[(int) CALL_EXPR] = get_identifier ("__cl");
538 IDENTIFIER_OPNAME_P (ansi_opname[(int) CALL_EXPR]) = 1;
539 ansi_opname[(int) ARRAY_REF] = get_identifier ("__vc");
540 IDENTIFIER_OPNAME_P (ansi_opname[(int) ARRAY_REF]) = 1;
541 ansi_opname[(int) NEW_EXPR] = get_identifier ("__nw");
542 IDENTIFIER_OPNAME_P (ansi_opname[(int) NEW_EXPR]) = 1;
543 ansi_opname[(int) DELETE_EXPR] = get_identifier ("__dl");
544 IDENTIFIER_OPNAME_P (ansi_opname[(int) DELETE_EXPR]) = 1;
545 ansi_opname[(int) VEC_NEW_EXPR] = get_identifier ("__vn");
546 IDENTIFIER_OPNAME_P (ansi_opname[(int) VEC_NEW_EXPR]) = 1;
547 ansi_opname[(int) VEC_DELETE_EXPR] = get_identifier ("__vd");
548 IDENTIFIER_OPNAME_P (ansi_opname[(int) VEC_DELETE_EXPR]) = 1;
549 ansi_opname[(int) TYPE_EXPR] = get_identifier ("__op");
550 IDENTIFIER_OPNAME_P (ansi_opname[(int) TYPE_EXPR]) = 1;
552 /* This is not true: these operators are not defined in ANSI,
553 but we need them anyway. */
554 ansi_opname[(int) MIN_EXPR] = get_identifier ("__mn");
555 IDENTIFIER_OPNAME_P (ansi_opname[(int) MIN_EXPR]) = 1;
556 ansi_opname[(int) MAX_EXPR] = get_identifier ("__mx");
557 IDENTIFIER_OPNAME_P (ansi_opname[(int) MAX_EXPR]) = 1;
558 ansi_opname[(int) COND_EXPR] = get_identifier ("__cn");
559 IDENTIFIER_OPNAME_P (ansi_opname[(int) COND_EXPR]) = 1;
560 ansi_opname[(int) METHOD_CALL_EXPR] = get_identifier ("__wr");
561 IDENTIFIER_OPNAME_P (ansi_opname[(int) METHOD_CALL_EXPR]) = 1;
565 gcc_obstack_init (&inline_text_obstack);
566 inline_text_firstobj = (char *) obstack_alloc (&inline_text_obstack, 0);
568 /* Start it at 0, because check_newline is called at the very beginning
569 and will increment it to 1. */
571 input_filename = "<internal>";
572 current_function_decl = NULL;
575 token_buffer = (char *) xmalloc (maxtoken + 2);
577 ridpointers[(int) RID_INT] = get_identifier ("int");
578 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_INT],
579 build_tree_list (NULL_TREE, ridpointers[(int) RID_INT]));
580 ridpointers[(int) RID_CHAR] = get_identifier ("char");
581 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_CHAR],
582 build_tree_list (NULL_TREE, ridpointers[(int) RID_CHAR]));
583 ridpointers[(int) RID_VOID] = get_identifier ("void");
584 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VOID],
585 build_tree_list (NULL_TREE, ridpointers[(int) RID_VOID]));
586 ridpointers[(int) RID_FLOAT] = get_identifier ("float");
587 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_FLOAT],
588 build_tree_list (NULL_TREE, ridpointers[(int) RID_FLOAT]));
589 ridpointers[(int) RID_DOUBLE] = get_identifier ("double");
590 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_DOUBLE],
591 build_tree_list (NULL_TREE, ridpointers[(int) RID_DOUBLE]));
592 ridpointers[(int) RID_SHORT] = get_identifier ("short");
593 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_SHORT],
594 build_tree_list (NULL_TREE, ridpointers[(int) RID_SHORT]));
595 ridpointers[(int) RID_LONG] = get_identifier ("long");
596 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_LONG],
597 build_tree_list (NULL_TREE, ridpointers[(int) RID_LONG]));
598 ridpointers[(int) RID_UNSIGNED] = get_identifier ("unsigned");
599 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_UNSIGNED],
600 build_tree_list (NULL_TREE, ridpointers[(int) RID_UNSIGNED]));
601 ridpointers[(int) RID_SIGNED] = get_identifier ("signed");
602 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_SIGNED],
603 build_tree_list (NULL_TREE, ridpointers[(int) RID_SIGNED]));
604 ridpointers[(int) RID_INLINE] = get_identifier ("inline");
605 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_INLINE],
606 build_tree_list (NULL_TREE, ridpointers[(int) RID_INLINE]));
607 ridpointers[(int) RID_CONST] = get_identifier ("const");
608 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_CONST],
609 build_tree_list (NULL_TREE, ridpointers[(int) RID_CONST]));
610 ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile");
611 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VOLATILE],
612 build_tree_list (NULL_TREE, ridpointers[(int) RID_VOLATILE]));
613 ridpointers[(int) RID_AUTO] = get_identifier ("auto");
614 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_AUTO],
615 build_tree_list (NULL_TREE, ridpointers[(int) RID_AUTO]));
616 ridpointers[(int) RID_STATIC] = get_identifier ("static");
617 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_STATIC],
618 build_tree_list (NULL_TREE, ridpointers[(int) RID_STATIC]));
619 ridpointers[(int) RID_EXTERN] = get_identifier ("extern");
620 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_EXTERN],
621 build_tree_list (NULL_TREE, ridpointers[(int) RID_EXTERN]));
622 ridpointers[(int) RID_TYPEDEF] = get_identifier ("typedef");
623 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_TYPEDEF],
624 build_tree_list (NULL_TREE, ridpointers[(int) RID_TYPEDEF]));
625 ridpointers[(int) RID_REGISTER] = get_identifier ("register");
626 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_REGISTER],
627 build_tree_list (NULL_TREE, ridpointers[(int) RID_REGISTER]));
629 /* C++ extensions. These are probably not correctly named. */
630 ridpointers[(int) RID_WCHAR] = get_identifier ("__wchar_t");
631 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_WCHAR],
632 build_tree_list (NULL_TREE, ridpointers[(int) RID_WCHAR]));
633 class_type_node = build_int_2 (class_type, 0);
634 TREE_TYPE (class_type_node) = class_type_node;
635 ridpointers[(int) RID_CLASS] = class_type_node;
637 record_type_node = build_int_2 (record_type, 0);
638 TREE_TYPE (record_type_node) = record_type_node;
639 ridpointers[(int) RID_RECORD] = record_type_node;
641 union_type_node = build_int_2 (union_type, 0);
642 TREE_TYPE (union_type_node) = union_type_node;
643 ridpointers[(int) RID_UNION] = union_type_node;
645 enum_type_node = build_int_2 (enum_type, 0);
646 TREE_TYPE (enum_type_node) = enum_type_node;
647 ridpointers[(int) RID_ENUM] = enum_type_node;
649 ridpointers[(int) RID_VIRTUAL] = get_identifier ("virtual");
650 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VIRTUAL],
651 build_tree_list (NULL_TREE, ridpointers[(int) RID_VIRTUAL]));
652 ridpointers[(int) RID_FRIEND] = get_identifier ("friend");
653 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_FRIEND],
654 build_tree_list (NULL_TREE, ridpointers[(int) RID_FRIEND]));
656 ridpointers[(int) RID_PUBLIC] = get_identifier ("public");
657 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PUBLIC],
658 build_tree_list (NULL_TREE, ridpointers[(int) RID_PUBLIC]));
659 ridpointers[(int) RID_PRIVATE] = get_identifier ("private");
660 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PRIVATE],
661 build_tree_list (NULL_TREE, ridpointers[(int) RID_PRIVATE]));
662 ridpointers[(int) RID_PROTECTED] = get_identifier ("protected");
663 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PROTECTED],
664 build_tree_list (NULL_TREE, ridpointers[(int) RID_PROTECTED]));
665 ridpointers[(int) RID_TEMPLATE] = get_identifier ("template");
666 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_TEMPLATE],
667 build_tree_list (NULL_TREE, ridpointers[(int) RID_TEMPLATE]));
668 /* This is for ANSI C++. */
669 ridpointers[(int) RID_MUTABLE] = get_identifier ("mutable");
670 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_MUTABLE],
671 build_tree_list (NULL_TREE, ridpointers[(int) RID_MUTABLE]));
673 /* Exception handling extensions. */
674 exception_type_node = build_int_2 (exception_type, 0);
675 TREE_TYPE (exception_type_node) = exception_type_node;
676 ridpointers[(int) RID_EXCEPTION] = exception_type_node;
678 /* Signature handling extensions. */
679 signature_type_node = build_int_2 (signature_type, 0);
680 TREE_TYPE (signature_type_node) = signature_type_node;
681 ridpointers[(int) RID_SIGNATURE] = signature_type_node;
683 opname_tab[(int) COMPONENT_REF] = "->";
684 opname_tab[(int) MEMBER_REF] = "->*";
685 opname_tab[(int) METHOD_CALL_EXPR] = "->()";
686 opname_tab[(int) INDIRECT_REF] = "(unary *)";
687 opname_tab[(int) ARRAY_REF] = "[]";
688 opname_tab[(int) MODIFY_EXPR] = "=";
689 opname_tab[(int) NEW_EXPR] = "new";
690 opname_tab[(int) DELETE_EXPR] = "delete";
691 opname_tab[(int) VEC_NEW_EXPR] = "new []";
692 opname_tab[(int) VEC_DELETE_EXPR] = "delete []";
693 opname_tab[(int) COND_EXPR] = "... ? ... : ...";
694 opname_tab[(int) CALL_EXPR] = "()";
695 opname_tab[(int) PLUS_EXPR] = "+";
696 opname_tab[(int) MINUS_EXPR] = "-";
697 opname_tab[(int) MULT_EXPR] = "*";
698 opname_tab[(int) TRUNC_DIV_EXPR] = "/";
699 opname_tab[(int) CEIL_DIV_EXPR] = "(ceiling /)";
700 opname_tab[(int) FLOOR_DIV_EXPR] = "(floor /)";
701 opname_tab[(int) ROUND_DIV_EXPR] = "(round /)";
702 opname_tab[(int) TRUNC_MOD_EXPR] = "%";
703 opname_tab[(int) CEIL_MOD_EXPR] = "(ceiling %)";
704 opname_tab[(int) FLOOR_MOD_EXPR] = "(floor %)";
705 opname_tab[(int) ROUND_MOD_EXPR] = "(round %)";
706 opname_tab[(int) NEGATE_EXPR] = "-";
707 opname_tab[(int) MIN_EXPR] = "<?";
708 opname_tab[(int) MAX_EXPR] = ">?";
709 opname_tab[(int) ABS_EXPR] = "abs";
710 opname_tab[(int) FFS_EXPR] = "ffs";
711 opname_tab[(int) LSHIFT_EXPR] = "<<";
712 opname_tab[(int) RSHIFT_EXPR] = ">>";
713 opname_tab[(int) BIT_IOR_EXPR] = "|";
714 opname_tab[(int) BIT_XOR_EXPR] = "^";
715 opname_tab[(int) BIT_AND_EXPR] = "&";
716 opname_tab[(int) BIT_ANDTC_EXPR] = "&~";
717 opname_tab[(int) BIT_NOT_EXPR] = "~";
718 opname_tab[(int) TRUTH_ANDIF_EXPR] = "&&";
719 opname_tab[(int) TRUTH_ORIF_EXPR] = "||";
720 opname_tab[(int) TRUTH_AND_EXPR] = "strict &&";
721 opname_tab[(int) TRUTH_OR_EXPR] = "strict ||";
722 opname_tab[(int) TRUTH_NOT_EXPR] = "!";
723 opname_tab[(int) LT_EXPR] = "<";
724 opname_tab[(int) LE_EXPR] = "<=";
725 opname_tab[(int) GT_EXPR] = ">";
726 opname_tab[(int) GE_EXPR] = ">=";
727 opname_tab[(int) EQ_EXPR] = "==";
728 opname_tab[(int) NE_EXPR] = "!=";
729 opname_tab[(int) IN_EXPR] = "in";
730 opname_tab[(int) RANGE_EXPR] = "..";
731 opname_tab[(int) CONVERT_EXPR] = "(unary +)";
732 opname_tab[(int) ADDR_EXPR] = "(unary &)";
733 opname_tab[(int) PREDECREMENT_EXPR] = "--";
734 opname_tab[(int) PREINCREMENT_EXPR] = "++";
735 opname_tab[(int) POSTDECREMENT_EXPR] = "--";
736 opname_tab[(int) POSTINCREMENT_EXPR] = "++";
737 opname_tab[(int) COMPOUND_EXPR] = ",";
739 assignop_tab[(int) NOP_EXPR] = "=";
740 assignop_tab[(int) PLUS_EXPR] = "+=";
741 assignop_tab[(int) CONVERT_EXPR] = "+=";
742 assignop_tab[(int) MINUS_EXPR] = "-=";
743 assignop_tab[(int) NEGATE_EXPR] = "-=";
744 assignop_tab[(int) MULT_EXPR] = "*=";
745 assignop_tab[(int) INDIRECT_REF] = "*=";
746 assignop_tab[(int) TRUNC_DIV_EXPR] = "/=";
747 assignop_tab[(int) EXACT_DIV_EXPR] = "(exact /=)";
748 assignop_tab[(int) CEIL_DIV_EXPR] = "(ceiling /=)";
749 assignop_tab[(int) FLOOR_DIV_EXPR] = "(floor /=)";
750 assignop_tab[(int) ROUND_DIV_EXPR] = "(round /=)";
751 assignop_tab[(int) TRUNC_MOD_EXPR] = "%=";
752 assignop_tab[(int) CEIL_MOD_EXPR] = "(ceiling %=)";
753 assignop_tab[(int) FLOOR_MOD_EXPR] = "(floor %=)";
754 assignop_tab[(int) ROUND_MOD_EXPR] = "(round %=)";
755 assignop_tab[(int) MIN_EXPR] = "<?=";
756 assignop_tab[(int) MAX_EXPR] = ">?=";
757 assignop_tab[(int) LSHIFT_EXPR] = "<<=";
758 assignop_tab[(int) RSHIFT_EXPR] = ">>=";
759 assignop_tab[(int) BIT_IOR_EXPR] = "|=";
760 assignop_tab[(int) BIT_XOR_EXPR] = "^=";
761 assignop_tab[(int) BIT_AND_EXPR] = "&=";
762 assignop_tab[(int) ADDR_EXPR] = "&=";
764 init_filename_times ();
766 /* Some options inhibit certain reserved words.
767 Clear those words out of the hash table so they won't be recognized. */
768 #define UNSET_RESERVED_WORD(STRING) \
769 do { struct resword *s = is_reserved_word (STRING, sizeof (STRING) - 1); \
770 if (s) s->name = ""; } while (0)
773 /* let's parse things, and if they use it, then give them an error. */
774 if (!flag_handle_exceptions)
776 UNSET_RESERVED_WORD ("throw");
777 UNSET_RESERVED_WORD ("try");
778 UNSET_RESERVED_WORD ("catch");
782 if (! (flag_gc || flag_dossier))
784 UNSET_RESERVED_WORD ("classof");
785 UNSET_RESERVED_WORD ("headof");
787 if (! flag_handle_signatures)
789 /* Easiest way to not recognize signature
790 handling extensions... */
791 UNSET_RESERVED_WORD ("signature");
792 UNSET_RESERVED_WORD ("sigof");
795 UNSET_RESERVED_WORD ("asm");
796 if (flag_no_asm || flag_traditional)
797 UNSET_RESERVED_WORD ("typeof");
799 token_count = init_parse ();
800 interface_unknown = 1;
804 reinit_parse_for_function ()
806 current_base_init_list = NULL_TREE;
807 current_member_init_list = NULL_TREE;
814 yyprint (file, yychar, yylval)
826 case IDENTIFIER_DEFN:
829 case TYPENAME_ELLIPSIS:
831 case PRE_PARSED_CLASS_DECL:
833 my_friendly_assert (TREE_CODE (t) == IDENTIFIER_NODE, 224);
834 if (IDENTIFIER_POINTER (t))
835 fprintf (file, " `%s'", IDENTIFIER_POINTER (t));
838 if (yylval.ttype == class_type_node)
839 fprintf (file, " `class'");
840 else if (yylval.ttype == record_type_node)
841 fprintf (file, " `struct'");
842 else if (yylval.ttype == union_type_node)
843 fprintf (file, " `union'");
844 else if (yylval.ttype == enum_type_node)
845 fprintf (file, " `enum'");
846 else if (yylval.ttype == signature_type_node)
847 fprintf (file, " `signature'");
849 my_friendly_abort (80);
854 static int *reduce_count;
857 #define REDUCE_LENGTH (sizeof (yyr2) / sizeof (yyr2[0]))
858 #define TOKEN_LENGTH (256 + sizeof (yytname) / sizeof (yytname[0]))
863 #ifdef GATHER_STATISTICS
864 reduce_count = (int *)malloc (sizeof (int) * (REDUCE_LENGTH + 1));
865 bzero (reduce_count, sizeof (int) * (REDUCE_LENGTH + 1));
867 token_count = (int *)malloc (sizeof (int) * (TOKEN_LENGTH + 1));
868 bzero (token_count, sizeof (int) * (TOKEN_LENGTH + 1));
874 #ifdef GATHER_STATISTICS
879 reduce_count[yyn] += 1;
886 return reduce_count[*q] - reduce_count[*p];
893 return token_count[*q] - token_count[*p];
898 print_parse_statistics ()
900 #ifdef GATHER_STATISTICS
903 int maxlen = REDUCE_LENGTH;
906 if (reduce_count[-1] == 0)
909 if (TOKEN_LENGTH > REDUCE_LENGTH)
910 maxlen = TOKEN_LENGTH;
911 sorted = (unsigned *) alloca (sizeof (int) * maxlen);
913 for (i = 0; i < TOKEN_LENGTH; i++)
915 qsort (sorted, TOKEN_LENGTH, sizeof (int), token_cmp);
916 for (i = 0; i < TOKEN_LENGTH; i++)
918 int index = sorted[i];
919 if (token_count[index] == 0)
921 if (token_count[index] < token_count[-1])
923 fprintf (stderr, "token %d, `%s', count = %d\n",
924 index, yytname[YYTRANSLATE (index)], token_count[index]);
926 fprintf (stderr, "\n");
927 for (i = 0; i < REDUCE_LENGTH; i++)
929 qsort (sorted, REDUCE_LENGTH, sizeof (int), reduce_cmp);
930 for (i = 0; i < REDUCE_LENGTH; i++)
932 int index = sorted[i];
933 if (reduce_count[index] == 0)
935 if (reduce_count[index] < reduce_count[-1])
937 fprintf (stderr, "rule %d, line %d, count = %d\n",
938 index, yyrline[index], reduce_count[index]);
940 fprintf (stderr, "\n");
945 /* Sets the value of the 'yydebug' variable to VALUE.
946 This is a function so we don't have to have YYDEBUG defined
947 in order to build the compiler. */
956 warning ("YYDEBUG not defined.");
962 debug_yytranslate (value)
965 return yytname[YYTRANSLATE (value)];
970 /* Functions and data structures for #pragma interface.
972 `#pragma implementation' means that the main file being compiled
973 is considered to implement (provide) the classes that appear in
974 its main body. I.e., if this is file "foo.cc", and class `bar'
975 is defined in "foo.cc", then we say that "foo.cc implements bar".
977 All main input files "implement" themselves automagically.
979 `#pragma interface' means that unless this file (of the form "foo.h"
980 is not presently being included by file "foo.cc", the
981 CLASSTYPE_INTERFACE_ONLY bit gets set. The effect is that none
982 of the vtables nor any of the inline functions defined in foo.h
985 There are cases when we want to link files such as "defs.h" and
986 "main.cc". In this case, we give "defs.h" a `#pragma interface',
987 and "main.cc" has `#pragma implementation "defs.h"'. */
992 struct impl_files *next;
995 static struct impl_files *impl_file_chain;
997 /* Helper function to load global variables with interface
1000 extract_interface_info ()
1004 if (flag_alt_external_templates)
1006 struct tinst_level *til = tinst_for_decl ();
1009 fileinfo = get_time_identifier (til->file);
1012 fileinfo = get_time_identifier (input_filename);
1013 fileinfo = IDENTIFIER_CLASS_VALUE (fileinfo);
1014 interface_only = TREE_INT_CST_LOW (fileinfo);
1015 if (!processing_template_defn || flag_external_templates)
1016 interface_unknown = TREE_INT_CST_HIGH (fileinfo);
1019 /* Return nonzero if S is not considered part of an
1020 INTERFACE/IMPLEMENTATION pair. Otherwise, return 0. */
1022 interface_strcmp (s)
1025 /* Set the interface/implementation bits for this scope. */
1026 struct impl_files *ifiles;
1029 for (ifiles = impl_file_chain; ifiles; ifiles = ifiles->next)
1031 char *t1 = ifiles->filename;
1034 if (*s1 != *t1 || *s1 == 0)
1037 while (*s1 == *t1 && *s1 != 0)
1044 /* Don't get faked out by xxx.yyy.cc vs xxx.zzz.cc. */
1045 if (index (s1, '.') || index (t1, '.'))
1048 if (*s1 == '\0' || s1[-1] != '.' || t1[-1] != '.')
1060 set_typedecl_interface_info (prev, vars)
1063 tree id = get_time_identifier (DECL_SOURCE_FILE (vars));
1064 tree fileinfo = IDENTIFIER_CLASS_VALUE (id);
1065 tree type = TREE_TYPE (vars);
1067 CLASSTYPE_INTERFACE_ONLY (type) = TREE_INT_CST_LOW (fileinfo)
1068 = interface_strcmp (FILE_NAME_NONDIRECTORY (DECL_SOURCE_FILE (vars)));
1072 set_vardecl_interface_info (prev, vars)
1075 tree type = DECL_CONTEXT (vars);
1077 if (CLASSTYPE_INTERFACE_KNOWN (type))
1079 if (CLASSTYPE_INTERFACE_ONLY (type))
1080 set_typedecl_interface_info (prev, TYPE_NAME (type));
1082 CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 1;
1083 DECL_EXTERNAL (vars) = CLASSTYPE_INTERFACE_ONLY (type);
1084 TREE_PUBLIC (vars) = 1;
1088 /* Called from the top level: if there are any pending inlines to
1089 do, set up to process them now. This function sets up the first function
1090 to be parsed; after it has been, the rule for fndef in parse.y will
1091 call process_next_inline to start working on the next one. */
1093 do_pending_inlines ()
1095 struct pending_inline *prev = 0, *tail;
1096 struct pending_inline *t;
1098 /* Oops, we're still dealing with the last batch. */
1099 if (yychar == PRE_PARSED_FUNCTION_DECL)
1102 /* Reverse the pending inline functions, since
1103 they were cons'd instead of appended. */
1105 for (t = pending_inlines; t; t = tail)
1112 /* Reset to zero so that if the inline functions we are currently
1113 processing define inline functions of their own, that is handled
1114 correctly. ??? This hasn't been checked in a while. */
1115 pending_inlines = 0;
1117 /* Now start processing the first inline function. */
1119 my_friendly_assert ((t->parm_vec == NULL_TREE) == (t->bindings == NULL_TREE),
1122 push_template_decls (t->parm_vec, t->bindings, 0);
1125 feed_input (t->buf, t->len, t->can_free ? &inline_text_obstack : 0);
1128 if (input_filename != t->filename)
1130 input_filename = t->filename;
1131 /* Get interface/implementation back in sync. */
1132 extract_interface_info ();
1135 input_filename = t->filename;
1136 interface_unknown = t->interface == 1;
1137 interface_only = t->interface == 0;
1139 yychar = PRE_PARSED_FUNCTION_DECL;
1141 /* Pass back a handle on the rest of the inline functions, so that they
1142 can be processed later. */
1143 yylval.ttype = build_tree_list ((tree) t, t->fndecl);
1145 if (flag_default_inline && t->fndecl
1146 /* If we're working from a template, don't change
1147 the `inline' state. */
1148 && t->parm_vec == NULL_TREE)
1149 DECL_INLINE (t->fndecl) = 1;
1151 DECL_PENDING_INLINE_INFO (t->fndecl) = 0;
1154 extern struct pending_input *to_be_restored;
1155 static int nextchar = -1;
1157 /* Called from the fndecl rule in the parser when the function just parsed
1158 was declared using a PRE_PARSED_FUNCTION_DECL (i.e. came from
1159 do_pending_inlines). */
1161 process_next_inline (t)
1164 struct pending_inline *i = (struct pending_inline *) TREE_PURPOSE (t);
1165 my_friendly_assert ((i->parm_vec == NULL_TREE) == (i->bindings == NULL_TREE),
1168 pop_template_decls (i->parm_vec, i->bindings, 0);
1170 if (yychar == YYEMPTY)
1172 if (yychar != END_OF_SAVED_INPUT)
1174 error ("parse error at end of saved function text");
1175 /* restore_pending_input will abort unless yychar is either
1176 * END_OF_SAVED_INPUT or YYEMPTY; since we already know we're
1177 * hosed, feed back YYEMPTY.
1178 * We also need to discard nextchar, since that may have gotten
1184 if (to_be_restored == 0)
1185 my_friendly_abort (123);
1186 restore_pending_input (to_be_restored);
1188 if (i && i->fndecl != NULL_TREE)
1190 my_friendly_assert ((i->parm_vec == NULL_TREE) == (i->bindings == NULL_TREE),
1193 push_template_decls (i->parm_vec, i->bindings, 0);
1194 feed_input (i->buf, i->len, i->can_free ? &inline_text_obstack : 0);
1196 input_filename = i->filename;
1197 yychar = PRE_PARSED_FUNCTION_DECL;
1198 yylval.ttype = build_tree_list ((tree) i, i->fndecl);
1200 if (flag_default_inline
1201 /* If we're working from a template, don't change
1202 the `inline' state. */
1203 && i->parm_vec == NULL_TREE)
1204 DECL_INLINE (i->fndecl) = 1;
1206 DECL_PENDING_INLINE_INFO (i->fndecl) = 0;
1210 interface_unknown = i->interface == 1;
1211 interface_only = i->interface == 0;
1214 extract_interface_info ();
1217 /* Since inline methods can refer to text which has not yet been seen,
1218 we store the text of the method in a structure which is placed in the
1219 DECL_PENDING_INLINE_INFO field of the FUNCTION_DECL.
1220 After parsing the body of the class definition, the FUNCTION_DECL's are
1221 scanned to see which ones have this field set. Those are then digested
1224 This function's FUNCTION_DECL will have a bit set in its common so
1225 that we know to watch out for it. */
1228 consume_string (this_obstack, matching_char)
1229 register struct obstack *this_obstack;
1233 int starting_lineno = lineno;
1239 int save_lineno = lineno;
1240 lineno = starting_lineno;
1241 if (matching_char == '"')
1242 error ("end of file encountered inside string constant");
1244 error ("end of file encountered inside character constant");
1245 lineno = save_lineno;
1250 obstack_1grow (this_obstack, c);
1252 obstack_1grow (this_obstack, c);
1254 /* Make sure we continue the loop */
1261 pedwarn ("ANSI C++ forbids newline in string constant");
1264 obstack_1grow (this_obstack, c);
1266 while (c != matching_char);
1269 static int nextyychar = YYEMPTY;
1270 static YYSTYPE nextyylval;
1272 struct pending_input {
1273 int nextchar, yychar, nextyychar, eof;
1274 YYSTYPE yylval, nextyylval;
1275 struct obstack token_obstack;
1279 struct pending_input *
1280 save_pending_input ()
1282 struct pending_input *p;
1283 p = (struct pending_input *) xmalloc (sizeof (struct pending_input));
1284 p->nextchar = nextchar;
1286 p->nextyychar = nextyychar;
1288 p->nextyylval = nextyylval;
1289 p->eof = end_of_file;
1290 yychar = nextyychar = YYEMPTY;
1292 p->first_token = first_token;
1293 p->token_obstack = token_obstack;
1296 gcc_obstack_init (&token_obstack);
1302 restore_pending_input (p)
1303 struct pending_input *p;
1305 my_friendly_assert (nextchar == -1, 229);
1306 nextchar = p->nextchar;
1307 my_friendly_assert (yychar == YYEMPTY || yychar == END_OF_SAVED_INPUT, 230);
1309 my_friendly_assert (nextyychar == YYEMPTY, 231);
1310 nextyychar = p->nextyychar;
1312 nextyylval = p->nextyylval;
1313 first_token = p->first_token;
1314 obstack_free (&token_obstack, (char *) 0);
1315 token_obstack = p->token_obstack;
1316 end_of_file = p->eof;
1320 /* Return next non-whitespace input character, which may come
1321 from `finput', or from `nextchar'. */
1333 return skip_white_space (c);
1336 /* Unget character CH from the input stream.
1337 If RESCAN is non-zero, then we want to `see' this
1338 character as the next input token. */
1340 yyungetc (ch, rescan)
1344 /* Unget a character from the input stream. */
1345 if (yychar == YYEMPTY || rescan == 0)
1348 put_back (nextchar);
1353 my_friendly_assert (nextyychar == YYEMPTY, 232);
1354 nextyychar = yychar;
1355 nextyylval = yylval;
1360 /* This function stores away the text for an inline function that should
1361 be processed later. It decides how much later, and may need to move
1362 the info between obstacks; therefore, the caller should not refer to
1363 the T parameter after calling this function.
1365 This function also stores the list of template-parameter bindings that
1366 will be needed for expanding the template, if any. */
1369 store_pending_inline (decl, t)
1371 struct pending_inline *t;
1373 extern int processing_template_defn;
1374 int delay_to_eof = 0;
1375 struct pending_inline **inlines;
1378 /* Default: compile right away, and no extra bindings are needed. */
1379 t->parm_vec = t->bindings = 0;
1380 if (processing_template_defn)
1382 tree type = current_class_type;
1383 /* Assumption: In this (possibly) nested class sequence, only
1384 one name will have template parms. */
1385 while (type && TREE_CODE_CLASS (TREE_CODE (type)) == 't')
1387 tree decl = TYPE_NAME (type);
1388 tree tmpl = IDENTIFIER_TEMPLATE (DECL_NAME (decl));
1391 t->parm_vec = DECL_TEMPLATE_INFO (TREE_PURPOSE (tmpl))->parm_vec;
1392 t->bindings = TREE_VALUE (tmpl);
1394 type = DECL_CONTEXT (decl);
1396 if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE
1397 || TREE_CODE (TREE_TYPE (decl)) == FUNCTION_TYPE)
1399 if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
1400 my_friendly_assert (TYPE_MAX_VALUE (TREE_TYPE (decl)) == current_class_type,
1403 /* Inline functions can be compiled immediately. Other functions
1404 will be output separately, so if we're in interface-only mode,
1405 punt them now, or output them now if we're doing implementations
1406 and we know no overrides will exist. Otherwise, we delay until
1407 end-of-file, to see if the definition is really required. */
1408 if (DECL_INLINE (decl))
1409 /* delay_to_eof == 0 */;
1410 else if (current_class_type && !interface_unknown)
1415 print_node_brief (stderr, "\ndiscarding text for ", decl, 0);
1418 obstack_free (&inline_text_obstack, t->buf);
1419 DECL_PENDING_INLINE_INFO (decl) = 0;
1423 /* Don't delay the processing of virtual functions. */
1424 else if (DECL_VINDEX (decl) == NULL_TREE)
1428 my_friendly_abort (58);
1433 extern struct pending_inline *pending_template_expansions;
1437 char *free_to = t->buf;
1438 t->buf = (char *) obstack_copy (&permanent_obstack, t->buf,
1440 t = (struct pending_inline *) obstack_copy (&permanent_obstack,
1441 (char *)t, sizeof (*t));
1442 obstack_free (&inline_text_obstack, free_to);
1444 inlines = &pending_template_expansions;
1449 inlines = &pending_inlines;
1450 DECL_PENDING_INLINE_INFO (decl) = t;
1453 /* Because we use obstacks, we must process these in precise order. */
1458 void reinit_parse_for_block ();
1461 reinit_parse_for_method (yychar, decl)
1466 int starting_lineno = lineno;
1467 char *starting_filename = input_filename;
1469 reinit_parse_for_block (yychar, &inline_text_obstack, 0);
1471 len = obstack_object_size (&inline_text_obstack);
1472 current_base_init_list = NULL_TREE;
1473 current_member_init_list = NULL_TREE;
1474 if (decl == void_type_node
1475 || (current_class_type && TYPE_REDEFINED (current_class_type)))
1477 /* Happens when we get two declarations of the same
1478 function in the same scope. */
1479 char *buf = obstack_finish (&inline_text_obstack);
1480 obstack_free (&inline_text_obstack, buf);
1485 struct pending_inline *t;
1486 char *buf = obstack_finish (&inline_text_obstack);
1488 t = (struct pending_inline *) obstack_alloc (&inline_text_obstack,
1489 sizeof (struct pending_inline));
1490 t->lineno = starting_lineno;
1491 t->filename = starting_filename;
1498 if (interface_unknown && processing_template_defn && flag_external_templates && ! DECL_IN_SYSTEM_HEADER (decl))
1499 warn_if_unknown_interface ();
1500 t->interface = (interface_unknown ? 1 : (interface_only ? 0 : 2));
1501 store_pending_inline (decl, t);
1505 /* Consume a block -- actually, a method or template definition beginning
1506 with `:' or `{' -- and save it away on the specified obstack.
1508 Argument IS_TEMPLATE indicates which set of error messages should be
1509 output if something goes wrong. This should really be cleaned up somehow,
1510 without loss of clarity. */
1512 reinit_parse_for_block (yychar, obstackp, is_template)
1514 struct obstack *obstackp;
1519 int starting_lineno = lineno;
1520 char *starting_filename = input_filename;
1522 int look_for_semicolon = 0;
1523 int look_for_lbrac = 0;
1526 obstack_1grow (obstackp, '{');
1527 else if (yychar == '=')
1528 look_for_semicolon = 1;
1529 else if (yychar != ':' && (yychar != RETURN || is_template))
1531 yyerror (is_template
1532 ? "parse error in template specification"
1533 : "parse error in method specification");
1534 obstack_1grow (obstackp, '{');
1538 obstack_1grow (obstackp, yychar);
1543 if (nextchar != EOF)
1553 int this_lineno = lineno;
1555 c = skip_white_space (c);
1557 /* Don't lose our cool if there are lots of comments. */
1558 if (lineno == this_lineno + 1)
1559 obstack_1grow (obstackp, '\n');
1560 else if (lineno == this_lineno)
1562 else if (lineno - this_lineno < 10)
1565 for (i = lineno - this_lineno; i > 0; i--)
1566 obstack_1grow (obstackp, '\n');
1571 sprintf (buf, "\n# %d \"", lineno);
1573 obstack_grow (obstackp, buf, len);
1575 len = strlen (input_filename);
1576 obstack_grow (obstackp, input_filename, len);
1577 obstack_1grow (obstackp, '\"');
1578 obstack_1grow (obstackp, '\n');
1581 while (c > ' ') /* ASCII dependent... */
1583 obstack_1grow (obstackp, c);
1592 if (blev == 0 && !look_for_semicolon)
1597 /* Don't act on the next character...e.g, doing an escaped
1602 error_with_file_and_line (starting_filename,
1604 "end of file read inside definition");
1607 obstack_1grow (obstackp, c);
1610 consume_string (obstackp, c);
1612 consume_string (obstackp, c);
1618 ? "template body missing"
1619 : "function body for constructor missing");
1620 obstack_1grow (obstackp, '{');
1621 obstack_1grow (obstackp, '}');
1625 else if (look_for_semicolon && blev == 0)
1633 error_with_file_and_line (starting_filename,
1635 "end of file read inside definition");
1640 obstack_1grow (obstackp, c);
1645 obstack_1grow (obstackp, '\0');
1648 /* Build a default function named NAME for type TYPE.
1649 KIND says what to build.
1651 When KIND == 0, build default destructor.
1652 When KIND == 1, build virtual destructor.
1653 When KIND == 2, build default constructor.
1654 When KIND == 3, build default X(const X&) constructor.
1655 When KIND == 4, build default X(X&) constructor.
1656 When KIND == 5, build default operator = (const X&).
1657 When KIND == 6, build default operator = (X&). */
1660 cons_up_default_function (type, name, fields, kind)
1661 tree type, name, fields;
1664 extern tree void_list_node;
1665 char *func_buf = NULL;
1667 tree declspecs = NULL_TREE;
1672 name = constructor_name (name);
1677 declspecs = build_decl_list (NULL_TREE, ridpointers [(int) RID_VIRTUAL]);
1678 /* Fall through... */
1680 name = build_parse_node (BIT_NOT_EXPR, name);
1681 /* Fall through... */
1683 /* Default constructor. */
1684 args = void_list_node;
1687 declspecs = decl_tree_cons (NULL_TREE,
1688 ridpointers [(int) RID_INLINE],
1691 declspecs = build_decl_list (NULL_TREE, ridpointers [(int) RID_INLINE]);
1696 type = build_type_variant (type, 1, 0);
1697 /* Fall through... */
1699 /* According to ARM $12.8, the default copy ctor will be declared, but
1700 not defined, unless it's needed. So we mark this as `inline'; that
1701 way, if it's never used it won't be emitted. */
1702 declspecs = build_decl_list (NULL_TREE, ridpointers [(int) RID_INLINE]);
1704 argtype = build_reference_type (type);
1705 args = tree_cons (NULL_TREE,
1706 build_tree_list (hash_tree_chain (argtype, NULL_TREE),
1707 get_identifier ("_ctor_arg")),
1709 default_copy_constructor_body (&func_buf, &func_len, type, fields);
1713 type = build_type_variant (type, 1, 0);
1714 /* Fall through... */
1718 decl_tree_cons (NULL_TREE, name,
1719 decl_tree_cons (NULL_TREE,
1720 ridpointers [(int) RID_INLINE],
1723 name = ansi_opname [(int) MODIFY_EXPR];
1725 argtype = build_reference_type (type);
1726 args = tree_cons (NULL_TREE,
1727 build_tree_list (hash_tree_chain (argtype, NULL_TREE),
1728 get_identifier ("_ctor_arg")),
1730 default_assign_ref_body (&func_buf, &func_len, type, fields);
1734 my_friendly_abort (59);
1740 func_buf = obstack_alloc (&inline_text_obstack, func_len);
1741 strcpy (func_buf, "{}");
1744 TREE_PARMLIST (args) = 1;
1747 tree declarator = build_parse_node (CALL_EXPR, name, args, NULL_TREE);
1749 declarator = build_parse_node (ADDR_EXPR, declarator);
1751 fn = start_method (declspecs, declarator, NULL_TREE);
1754 if (fn == void_type_node)
1757 current_base_init_list = NULL_TREE;
1758 current_member_init_list = NULL_TREE;
1761 struct pending_inline *t;
1763 t = (struct pending_inline *) obstack_alloc (&inline_text_obstack,
1764 sizeof (struct pending_inline));
1768 t->filename = input_filename;
1769 #else /* This breaks; why? */
1770 #define MGMSG "(synthetic code at) "
1771 t->filename = obstack_alloc (&inline_text_obstack,
1772 strlen (input_filename) + sizeof (MGMSG) + 1);
1773 strcpy (t->filename, MGMSG);
1774 strcat (t->filename, input_filename);
1782 if (interface_unknown && processing_template_defn && flag_external_templates && ! DECL_IN_SYSTEM_HEADER (fn))
1783 warn_if_unknown_interface ();
1784 t->interface = (interface_unknown ? 1 : (interface_only ? 0 : 2));
1785 store_pending_inline (fn, t);
1786 if (interface_unknown)
1787 TREE_PUBLIC (fn) = 0;
1790 TREE_PUBLIC (fn) = 1;
1791 DECL_EXTERNAL (fn) = interface_only;
1797 #ifdef DEBUG_DEFAULT_FUNCTIONS
1798 { char *fn_type = NULL;
1802 case 0: fn_type = "default destructor"; break;
1803 case 1: fn_type = "virtual destructor"; break;
1804 case 2: fn_type = "default constructor"; break;
1805 case 3: fn_type = "default X(const X&)"; break;
1806 case 4: fn_type = "default X(X&)"; break;
1810 if (TREE_CODE (name) == BIT_NOT_EXPR)
1811 t = TREE_OPERAND (name, 0);
1812 fprintf (stderr, "[[[[ %s for %s:\n%s]]]]\n", fn_type,
1813 IDENTIFIER_POINTER (t), func_buf);
1816 #endif /* DEBUG_DEFAULT_FUNCTIONS */
1818 DECL_CLASS_CONTEXT (fn) = TYPE_MAIN_VARIANT (type);
1820 /* Show that this function was generated by the compiler. */
1821 SET_DECL_ARTIFICIAL (fn);
1826 /* Used by default_copy_constructor_body. For the anonymous union
1827 in TYPE, return the member that is at least as large as the rest
1828 of the members, so we can copy it. */
1830 largest_union_member (type)
1833 tree f, type_size = TYPE_SIZE (type);
1835 for (f = TYPE_FIELDS (type); f; f = TREE_CHAIN (f))
1836 if (simple_cst_equal (DECL_SIZE (f), type_size))
1839 /* We should always find one. */
1840 my_friendly_abort (323);
1844 /* Construct the body of a default assignment operator.
1845 Mostly copied directly from default_copy_constructor_body. */
1847 default_assign_ref_body (bufp, lenp, type, fields)
1852 static struct obstack body;
1853 static int inited = FALSE;
1854 int n_bases = CLASSTYPE_N_BASECLASSES (type);
1860 obstack_init (&body);
1863 body.next_free = body.object_base;
1865 obstack_1grow (&body, '{');
1867 /* Small buffer for sprintf(). */
1870 tbuf = (char *) alloca (tgot);
1872 /* If we don't need a real op=, just do a bitwise copy. */
1873 if (! TYPE_HAS_COMPLEX_ASSIGN_REF (type))
1875 tbuf = "{__builtin_memcpy(this,&_ctor_arg,sizeof(_ctor_arg));return *this;}";
1876 *lenp = strlen (tbuf);
1877 *bufp = obstack_alloc (&inline_text_obstack, *lenp + 1);
1878 strcpy (*bufp, tbuf);
1882 if (TREE_CODE (type) == UNION_TYPE)
1890 for (f = TREE_CHAIN (fields); f; f = TREE_CHAIN (f))
1891 if (tree_int_cst_lt (TYPE_SIZE (TREE_TYPE (main)),
1892 TYPE_SIZE (TREE_TYPE (f))))
1895 s = IDENTIFIER_POINTER (DECL_NAME (main));
1897 tneed = (2 * strlen (s)) + 28;
1901 tbuf = (char *) alloca (tgot);
1904 sprintf (tbuf, "{%s=_ctor_arg.%s;return *this;}", s, s);
1909 *lenp = strlen (tbuf);
1910 *bufp = obstack_alloc (&inline_text_obstack, *lenp + 1);
1911 strcpy (*bufp, tbuf);
1915 /* Construct base classes...
1916 FIXME: Does not deal with multiple inheritance and virtual bases
1917 correctly. See g++.old-deja/g++.jason/opeq5.C for a testcase.
1918 We need to do wacky things if everything between us and the virtual
1919 base (by all paths) has a "complex" op=. */
1923 tree bases = TYPE_BINFO_BASETYPES (type);
1926 for (i = 0; i < n_bases; i++)
1928 tree binfo = TREE_VEC_ELT (bases, i);
1932 btype = BINFO_TYPE (binfo);
1933 name = TYPE_NESTED_NAME (btype);
1934 s = IDENTIFIER_POINTER (name);
1936 tneed = (2 * strlen (s)) + 33;
1940 tbuf = (char *) alloca (tgot);
1943 sprintf (tbuf, "%s::operator=((%s%s&)_ctor_arg);", s,
1944 TYPE_READONLY (type) ? "const " : "", s);
1945 obstack_grow (&body, tbuf, strlen (tbuf));
1949 /* Construct fields. */
1955 for (f = fields; f; f = TREE_CHAIN (f))
1957 if (TREE_CODE (f) == FIELD_DECL && ! DECL_VIRTUAL_P (f))
1961 tree t = TREE_TYPE (f);
1965 else if (t != NULL_TREE
1966 && TREE_CODE (t) == UNION_TYPE
1967 && ((TREE_CODE (TYPE_NAME (t)) == IDENTIFIER_NODE
1968 && ANON_AGGRNAME_P (TYPE_NAME (t)))
1969 || (TREE_CODE (TYPE_NAME (t)) == TYPE_DECL
1970 && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))))
1971 && TYPE_FIELDS (t) != NULL_TREE)
1972 x = largest_union_member (t);
1976 s = IDENTIFIER_POINTER (DECL_NAME (x));
1977 tneed = (2 * strlen (s)) + 13;
1981 tbuf = (char *) alloca (tgot);
1984 sprintf (tbuf, "%s=_ctor_arg.%s;", s, s);
1985 obstack_grow (&body, tbuf, strlen (tbuf));
1990 obstack_grow (&body, "return *this;}", 15);
1992 *lenp = obstack_object_size (&body) - 1;
1993 *bufp = obstack_alloc (&inline_text_obstack, *lenp);
1995 strcpy (*bufp, body.object_base);
1998 /* Construct the body of a default copy constructor. */
2000 default_copy_constructor_body (bufp, lenp, type, fields)
2005 static struct obstack prologue;
2006 static int inited = FALSE;
2007 int n_bases = CLASSTYPE_N_BASECLASSES (type);
2012 /* Create a buffer to call base class constructors and construct members
2017 obstack_init (&prologue);
2020 prologue.next_free = prologue.object_base;
2022 /* If we don't need a real copy ctor, just do a bitwise copy. */
2023 if (! TYPE_HAS_COMPLEX_INIT_REF (type))
2025 tbuf = "{__builtin_memcpy(this,&_ctor_arg,sizeof(_ctor_arg));}";
2026 *lenp = strlen (tbuf);
2027 *bufp = obstack_alloc (&inline_text_obstack, *lenp + 1);
2028 strcpy (*bufp, tbuf);
2032 /* Small buffer for sprintf(). */
2035 tbuf = (char *) alloca (tgot);
2037 if (TREE_CODE (type) == UNION_TYPE)
2045 for (f = TREE_CHAIN (fields); f; f = TREE_CHAIN (f))
2046 if (tree_int_cst_lt (TYPE_SIZE (TREE_TYPE (main)),
2047 TYPE_SIZE (TREE_TYPE (f))))
2050 s = IDENTIFIER_POINTER (DECL_NAME (main));
2051 tneed = (2 * strlen (s)) + 16;
2055 tbuf = (char *) alloca (tgot);
2058 sprintf (tbuf, ":%s(_ctor_arg.%s){}", s, s);
2063 *lenp = strlen (tbuf);
2064 *bufp = obstack_alloc (&inline_text_obstack, *lenp + 1);
2065 strcpy (*bufp, tbuf);
2069 /* Construct base classes... */
2073 /* Note that CLASSTYPE_VBASECLASSES isn't set yet... */
2074 tree v = get_vbase_types (type);
2075 tree bases = TYPE_BINFO_BASETYPES (type);
2080 tree binfo, btype, name;
2088 else if (i < n_bases)
2090 binfo = TREE_VEC_ELT (bases, i++);
2091 if (TREE_VIA_VIRTUAL (binfo))
2097 btype = BINFO_TYPE (binfo);
2098 name = TYPE_NESTED_NAME (btype);
2099 s = IDENTIFIER_POINTER (name);
2101 tneed = (2 * strlen (s)) + 30;
2105 tbuf = (char *) alloca (tgot);
2108 sprintf (tbuf, "%c%s((%s%s&)_ctor_arg)", sep, s,
2109 TYPE_READONLY (type) ? "const " : "", s);
2111 obstack_grow (&prologue, tbuf, strlen (tbuf));
2115 /* Construct fields. */
2121 for (f = fields; f; f = TREE_CHAIN (f))
2123 if (TREE_CODE (f) == FIELD_DECL && ! DECL_VIRTUAL_P (f))
2127 tree t = TREE_TYPE (f);
2131 else if (t != NULL_TREE
2132 && TREE_CODE (t) == UNION_TYPE
2133 && ((TREE_CODE (TYPE_NAME (t)) == IDENTIFIER_NODE
2134 && ANON_AGGRNAME_P (TYPE_NAME (t)))
2135 || (TREE_CODE (TYPE_NAME (t)) == TYPE_DECL
2136 && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))))
2137 && TYPE_FIELDS (t) != NULL_TREE)
2138 x = largest_union_member (t);
2142 s = IDENTIFIER_POINTER (DECL_NAME (x));
2143 tneed = (2 * strlen (s)) + 30;
2147 tbuf = (char *) alloca (tgot);
2150 sprintf (tbuf, "%c%s(_ctor_arg.%s)", sep, s, s);
2152 obstack_grow (&prologue, tbuf, strlen (tbuf));
2157 /* Concatenate constructor body to prologue. */
2159 *lenp = obstack_object_size (&prologue) + 2;
2160 *bufp = obstack_alloc (&inline_text_obstack, *lenp + 1);
2162 obstack_1grow (&prologue, '\0');
2164 strcpy (*bufp, prologue.object_base);
2165 strcat (*bufp, "{}");
2168 /* Heuristic to tell whether the user is missing a semicolon
2169 after a struct or enum declaration. Emit an error message
2170 if we know the user has blown it. */
2172 check_for_missing_semicolon (type)
2180 && yychar != IDENTIFIER
2181 && yychar != TYPENAME)
2183 if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (type)))
2184 error ("semicolon missing after %s declaration",
2185 TREE_CODE (type) == ENUMERAL_TYPE ? "enum" : "struct");
2187 error ("semicolon missing after declaration of `%s'",
2188 TYPE_NAME_STRING (type));
2189 shadow_tag (build_tree_list (0, type));
2191 /* Could probably also hack cases where class { ... } f (); appears. */
2196 note_got_semicolon (type)
2199 if (TREE_CODE_CLASS (TREE_CODE (type)) != 't')
2200 my_friendly_abort (60);
2201 if (IS_AGGR_TYPE (type))
2202 CLASSTYPE_GOT_SEMICOLON (type) = 1;
2206 note_list_got_semicolon (declspecs)
2211 for (link = declspecs; link; link = TREE_CHAIN (link))
2213 tree type = TREE_VALUE (link);
2214 if (TREE_CODE_CLASS (TREE_CODE (type)) == 't')
2215 note_got_semicolon (type);
2220 /* If C is not whitespace, return C.
2221 Otherwise skip whitespace and return first nonwhite char read. */
2224 skip_white_space (c)
2232 c = check_newline ();
2243 while (c == ' ' || c == '\t');
2251 error ("stray '\\' in program");
2263 /* Make the token buffer longer, preserving the data in it.
2264 P should point to just beyond the last valid character in the old buffer.
2265 The value we return is a pointer to the new buffer
2266 at a place corresponding to P. */
2269 extend_token_buffer (p)
2272 int offset = p - token_buffer;
2274 maxtoken = maxtoken * 2 + 10;
2275 token_buffer = (char *) xrealloc (token_buffer, maxtoken + 2);
2277 return token_buffer + offset;
2281 get_last_nonwhite_on_line ()
2285 /* Is this the last nonwhite stuff on the line? */
2287 c = nextchar, nextchar = -1;
2291 while (c == ' ' || c == '\t')
2296 /* At the beginning of a line, increment the line number
2297 and process any #-directive on this line.
2298 If the line is a #-directive, read the entire line and return a newline.
2299 Otherwise, return the line's first non-whitespace character. */
2307 /* Read first nonwhite char on the line. Do this before incrementing the
2308 line number, in case we're at the end of saved text. */
2312 while (c == ' ' || c == '\t');
2318 /* If not #, return it so caller will use it. */
2322 /* Read first nonwhite char after the `#'. */
2326 while (c == ' ' || c == '\t');
2328 /* If a letter follows, then if the word here is `line', skip
2329 it and ignore it; otherwise, ignore the line, with an error
2330 if the word isn't `pragma'. */
2332 if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
2342 /* Read first nonwhite char after the `#pragma'. */
2346 while (c == ' ' || c == '\t');
2354 && ((c = getch ()) == ' ' || c == '\t' || c == '\n'))
2356 extern tree pending_vtables;
2358 /* More follows: it must be a string constant (class name). */
2359 token = real_yylex ();
2360 if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
2362 error ("invalid #pragma vtable");
2365 if (write_virtuals != 2)
2367 warning ("use `+e2' option to enable #pragma vtable");
2370 pending_vtables = perm_tree_cons (NULL_TREE, get_identifier (TREE_STRING_POINTER (yylval.ttype)), pending_vtables);
2372 nextchar = getch ();
2375 warning ("trailing characters ignored");
2381 && ((c = getch ()) == ' ' || c == '\t' || c == '\n'))
2383 /* More follows: it must be a string constant (unit name). */
2384 token = real_yylex ();
2385 if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
2387 error ("invalid #pragma unit");
2390 current_unit_name = get_identifier (TREE_STRING_POINTER (yylval.ttype));
2391 current_unit_language = current_lang_name;
2393 nextchar = getch ();
2396 warning ("trailing characters ignored");
2400 tree fileinfo = IDENTIFIER_CLASS_VALUE (get_time_identifier (input_filename));
2411 && ((c = getch ()) == ' ' || c == '\t' || c == '\n'))
2413 int warned_already = 0;
2414 char *main_filename = input_filename;
2416 main_filename = FILE_NAME_NONDIRECTORY (main_filename);
2417 while (c == ' ' || c == '\t')
2422 token = real_yylex ();
2424 || TREE_CODE (yylval.ttype) != STRING_CST)
2426 error ("invalid `#pragma interface'");
2429 main_filename = TREE_STRING_POINTER (yylval.ttype);
2434 while (c == ' ' || c == '\t')
2439 if (!warned_already && extra_warnings
2440 && c != ' ' && c != '\t' && c != '\n')
2442 warning ("garbage after `#pragma interface' ignored");
2450 if (impl_file_chain == 0)
2452 /* If this is zero at this point, then we are
2453 auto-implementing. */
2454 if (main_input_filename == 0)
2455 main_input_filename = input_filename;
2457 #ifdef AUTO_IMPLEMENT
2458 filename = FILE_NAME_NONDIRECTORY (main_input_filename);
2459 fi = get_time_identifier (filename);
2460 fi = IDENTIFIER_CLASS_VALUE (fi);
2461 TREE_INT_CST_LOW (fi) = 0;
2462 TREE_INT_CST_HIGH (fi) = 1;
2464 impl_file_chain = (struct impl_files *)permalloc (sizeof (struct impl_files));
2465 impl_file_chain->filename = filename;
2466 impl_file_chain->next = 0;
2470 interface_only = interface_strcmp (main_filename);
2471 interface_unknown = 0;
2472 TREE_INT_CST_LOW (fileinfo) = interface_only;
2473 TREE_INT_CST_HIGH (fileinfo) = interface_unknown;
2488 && ((c = getch ()) == ' ' || c == '\t' || c == '\n'))
2490 int warned_already = 0;
2491 char *main_filename = main_input_filename ? main_input_filename : input_filename;
2493 main_filename = FILE_NAME_NONDIRECTORY (main_filename);
2494 while (c == ' ' || c == '\t')
2499 token = real_yylex ();
2501 || TREE_CODE (yylval.ttype) != STRING_CST)
2503 error ("invalid `#pragma implementation'");
2506 main_filename = TREE_STRING_POINTER (yylval.ttype);
2511 while (c == ' ' || c == '\t')
2516 if (!warned_already && extra_warnings
2517 && c != ' ' && c != '\t' && c != '\n')
2519 warning ("garbage after `#pragma implementation' ignored");
2525 if (write_virtuals == 3)
2527 struct impl_files *ifiles = impl_file_chain;
2530 if (! strcmp (ifiles->filename, main_filename))
2532 ifiles = ifiles->next;
2536 ifiles = (struct impl_files*) permalloc (sizeof (struct impl_files));
2537 ifiles->filename = main_filename;
2538 ifiles->next = impl_file_chain;
2539 impl_file_chain = ifiles;
2542 else if ((main_input_filename != 0
2543 && ! strcmp (main_input_filename, input_filename))
2544 || ! strcmp (input_filename, main_filename))
2547 if (impl_file_chain == 0)
2549 impl_file_chain = (struct impl_files*) permalloc (sizeof (struct impl_files));
2550 impl_file_chain->filename = main_filename;
2551 impl_file_chain->next = 0;
2555 error ("`#pragma implementation' can only appear at top-level");
2558 /* We make this non-zero so that we infer decl linkage
2559 in the impl file only for variables first declared
2560 in the interface file. */
2561 interface_unknown = 1;
2563 /* We make this zero so that templates in the impl
2564 file will be emitted properly. */
2565 interface_unknown = 0;
2567 TREE_INT_CST_LOW (fileinfo) = interface_only;
2568 TREE_INT_CST_HIGH (fileinfo) = interface_unknown;
2581 && ((c = getch ()) == ' ' || c == '\t' || c == '\n'))
2583 #ifdef DWARF_DEBUGGING_INFO
2584 if ((debug_info_level == DINFO_LEVEL_VERBOSE)
2585 && (write_symbols == DWARF_DEBUG))
2586 dwarfout_define (lineno, get_directive_line (finput));
2587 #endif /* DWARF_DEBUGGING_INFO */
2597 && ((c = getch ()) == ' ' || c == '\t' || c == '\n'))
2599 #ifdef DWARF_DEBUGGING_INFO
2600 if ((debug_info_level == DINFO_LEVEL_VERBOSE)
2601 && (write_symbols == DWARF_DEBUG))
2602 dwarfout_undef (lineno, get_directive_line (finput));
2603 #endif /* DWARF_DEBUGGING_INFO */
2612 && ((c = getch ()) == ' ' || c == '\t'))
2621 && ((c = getch ()) == ' ' || c == '\t'))
2623 #ifdef ASM_OUTPUT_IDENT
2624 extern FILE *asm_out_file;
2626 /* #ident. The pedantic warning is now in cccp.c. */
2628 /* Here we have just seen `#ident '.
2629 A string constant should follow. */
2631 while (c == ' ' || c == '\t')
2634 /* If no argument, ignore the line. */
2639 token = real_yylex ();
2641 || TREE_CODE (yylval.ttype) != STRING_CST)
2643 error ("invalid #ident");
2647 if (! flag_no_ident)
2649 #ifdef ASM_OUTPUT_IDENT
2650 ASM_OUTPUT_IDENT (asm_out_file,
2651 TREE_STRING_POINTER (yylval.ttype));
2655 /* Skip the rest of this line. */
2668 && ((c = getch ()) == ' ' || c == '\t'))
2670 /* Used to test incremental compilation. */
2671 sorry ("#pragma newworld");
2675 error ("undefined or invalid # directive");
2680 /* Here we have either `#line' or `# <nonletter>'.
2681 In either case, it should be a line number; a digit should follow. */
2683 while (c == ' ' || c == '\t')
2686 /* If the # is the only nonwhite char on the line,
2687 just ignore it. Check the new newline. */
2691 /* Something follows the #; read a token. */
2694 token = real_yylex ();
2696 if (token == CONSTANT
2697 && TREE_CODE (yylval.ttype) == INTEGER_CST)
2699 int old_lineno = lineno;
2700 enum { act_none, act_push, act_pop } action = act_none;
2701 int entering_system_header = 0;
2702 int entering_c_header = 0;
2704 /* subtract one, because it is the following line that
2705 gets the specified number */
2707 int l = TREE_INT_CST_LOW (yylval.ttype) - 1;
2708 c = get_last_nonwhite_on_line ();
2711 /* No more: store the line number and check following line. */
2717 /* More follows: it must be a string constant (filename). */
2719 /* Read the string constant, but don't treat \ as special. */
2720 ignore_escape_flag = 1;
2721 token = real_yylex ();
2722 ignore_escape_flag = 0;
2724 if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
2726 error ("invalid #line");
2730 /* Changing files again. This means currently collected time
2731 is charged against header time, and body time starts back
2733 if (flag_detailed_statistics)
2735 int this_time = my_get_run_time ();
2736 tree time_identifier = get_time_identifier (TREE_STRING_POINTER (yylval.ttype));
2737 header_time += this_time - body_time;
2738 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (this_filename_time))
2739 += this_time - body_time;
2740 this_filename_time = time_identifier;
2741 body_time = this_time;
2745 cadillac_note_source ();
2748 = (char *) permalloc (TREE_STRING_LENGTH (yylval.ttype) + 1);
2749 strcpy (input_filename, TREE_STRING_POINTER (yylval.ttype));
2751 GNU_xref_file (input_filename);
2753 if (main_input_filename == 0)
2755 struct impl_files *ifiles = impl_file_chain;
2759 while (ifiles->next)
2760 ifiles = ifiles->next;
2761 ifiles->filename = FILE_NAME_NONDIRECTORY (input_filename);
2764 main_input_filename = input_filename;
2765 if (write_virtuals == 3)
2766 walk_vtables (set_typedecl_interface_info, set_vardecl_interface_info);
2769 extract_interface_info ();
2771 c = get_last_nonwhite_on_line ();
2776 token = real_yylex ();
2778 /* `1' after file name means entering new file.
2779 `2' after file name means just left a file. */
2781 if (token == CONSTANT
2782 && TREE_CODE (yylval.ttype) == INTEGER_CST)
2784 if (TREE_INT_CST_LOW (yylval.ttype) == 1)
2786 else if (TREE_INT_CST_LOW (yylval.ttype) == 2)
2791 c = get_last_nonwhite_on_line ();
2795 token = real_yylex ();
2800 /* `3' after file name means this is a system header file. */
2802 if (token == CONSTANT
2803 && TREE_CODE (yylval.ttype) == INTEGER_CST
2804 && TREE_INT_CST_LOW (yylval.ttype) == 3)
2806 entering_system_header = 1;
2808 c = get_last_nonwhite_on_line ();
2812 token = real_yylex ();
2816 /* `4' after file name means this is a C header file. */
2818 if (token == CONSTANT
2819 && TREE_CODE (yylval.ttype) == INTEGER_CST
2820 && TREE_INT_CST_LOW (yylval.ttype) == 4)
2822 entering_c_header = 1;
2824 c = get_last_nonwhite_on_line ();
2828 token = real_yylex ();
2832 /* Do the actions implied by the preceeding numbers. */
2834 if (action == act_push)
2836 /* Pushing to a new file. */
2837 struct file_stack *p;
2839 p = (struct file_stack *) xmalloc (sizeof (struct file_stack));
2840 input_file_stack->line = old_lineno;
2841 p->next = input_file_stack;
2842 p->name = input_filename;
2843 input_file_stack = p;
2844 input_file_stack_tick++;
2845 #ifdef DWARF_DEBUGGING_INFO
2846 if (debug_info_level == DINFO_LEVEL_VERBOSE
2847 && write_symbols == DWARF_DEBUG)
2848 dwarfout_start_new_source_file (input_filename);
2849 #endif /* DWARF_DEBUGGING_INFO */
2851 cadillac_push_source ();
2852 in_system_header = entering_system_header;
2855 else if (entering_c_header)
2858 ++pending_lang_change;
2861 else if (action == act_pop)
2863 /* Popping out of a file. */
2864 if (input_file_stack->next)
2866 struct file_stack *p;
2868 if (c_header_level && --c_header_level == 0)
2870 if (entering_c_header)
2871 warning ("Badly nested C headers from preprocessor");
2872 --pending_lang_change;
2875 cadillac_pop_source ();
2876 in_system_header = entering_system_header;
2878 p = input_file_stack;
2879 input_file_stack = p->next;
2881 input_file_stack_tick++;
2882 #ifdef DWARF_DEBUGGING_INFO
2883 if (debug_info_level == DINFO_LEVEL_VERBOSE
2884 && write_symbols == DWARF_DEBUG)
2885 dwarfout_resume_previous_source_file (input_file_stack->line);
2886 #endif /* DWARF_DEBUGGING_INFO */
2889 error ("#-lines for entering and leaving files don't match");
2893 in_system_header = entering_system_header;
2895 cadillac_switch_source (-1);
2899 /* If NEXTCHAR is not end of line, we don't care what it is. */
2900 if (nextchar == '\n')
2904 error ("invalid #-line");
2906 /* skip the rest of this line. */
2910 while ((c = getch ()) != EOF && c != '\n');
2915 do_pending_lang_change ()
2917 for (; pending_lang_change > 0; --pending_lang_change)
2918 push_lang_context (lang_name_c);
2919 for (; pending_lang_change < 0; ++pending_lang_change)
2920 pop_lang_context ();
2924 #define isalnum(char) (char >= 'a' ? char <= 'z' : char >= '0' ? char <= '9' || (char >= 'A' && char <= 'Z') : 0)
2925 #define isdigit(char) (char >= '0' && char <= '9')
2930 #define ENDFILE -1 /* token that represents end-of-file */
2932 /* Read an escape sequence, returning its equivalent as a character,
2933 or store 1 in *ignore_ptr if it is backslash-newline. */
2936 readescape (ignore_ptr)
2939 register int c = getch ();
2941 register unsigned count;
2948 if (warn_traditional)
2949 warning ("the meaning of `\\x' varies with -traditional");
2951 if (flag_traditional)
2966 if (c >= 'a' && c <= 'f')
2967 code += c - 'a' + 10;
2968 if (c >= 'A' && c <= 'F')
2969 code += c - 'A' + 10;
2970 if (c >= '0' && c <= '9')
2972 if (code != 0 || count != 0)
2981 error ("\\x used with no following hex digits");
2982 else if (count == 0)
2983 /* Digits are all 0's. Ok. */
2985 else if ((count - 1) * 4 >= TYPE_PRECISION (integer_type_node)
2987 && ((1 << (TYPE_PRECISION (integer_type_node) - (count - 1) * 4))
2989 pedwarn ("hex escape out of range");
2992 case '0': case '1': case '2': case '3': case '4':
2993 case '5': case '6': case '7':
2996 while ((c <= '7') && (c >= '0') && (count++ < 3))
2998 code = (code * 8) + (c - '0');
3004 case '\\': case '\'': case '"':
3013 return TARGET_NEWLINE;
3028 if (warn_traditional)
3029 warning ("the meaning of `\\a' varies with -traditional");
3031 if (flag_traditional)
3041 pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c);
3047 /* `\(', etc, are used at beginning of line to avoid confusing Emacs. */
3051 /* `\%' is used to prevent SCCS from getting confused. */
3054 pedwarn ("unknown escape sequence `\\%c'", c);
3057 if (c >= 040 && c < 0177)
3058 pedwarn ("unknown escape sequence `\\%c'", c);
3060 pedwarn ("unknown escape sequence: `\\' followed by char code 0x%x", c);
3064 /* Value is 1 (or 2) if we should try to make the next identifier look like
3065 a typename (when it may be a local variable or a class variable).
3066 Value is 0 if we treat this name in a default fashion. */
3067 int looking_for_typename = 0;
3070 /* NO LONGER USED: Value is -1 if we must not see a type name. */
3072 dont_see_typename ()
3074 looking_for_typename = -1;
3075 if (yychar == TYPENAME || yychar == PTYPENAME)
3077 yychar = IDENTIFIER;
3084 extern __inline int identifier_type ();
3088 identifier_type (decl)
3091 if (TREE_CODE (decl) == TEMPLATE_DECL
3092 && DECL_TEMPLATE_IS_CLASS (decl))
3094 if (TREE_CODE (decl) != TYPE_DECL)
3102 looking_for_typename = 0;
3103 if (yychar == IDENTIFIER)
3105 lastiddecl = lookup_name (yylval.ttype, -2);
3106 if (lastiddecl == 0)
3109 lastiddecl = IDENTIFIER_LABEL_VALUE (yylval.ttype);
3112 yychar = identifier_type (lastiddecl);
3117 do_identifier (token)
3118 register tree token;
3120 register tree id = lastiddecl;
3122 if (yychar == YYEMPTY)
3124 /* Scope class declarations before global
3126 if (id == IDENTIFIER_GLOBAL_VALUE (token)
3127 && current_class_type != 0
3128 && TYPE_SIZE (current_class_type) == 0
3129 && TREE_CODE (current_class_type) != UNINSTANTIATED_P_TYPE)
3131 /* Could be from one of the base classes. */
3132 tree field = lookup_field (current_class_type, token, 1, 0);
3135 else if (field == error_mark_node)
3136 /* We have already generated the error message.
3137 But we still want to return this value. */
3138 id = lookup_field (current_class_type, token, 0, 0);
3139 else if (TREE_CODE (field) == VAR_DECL
3140 || TREE_CODE (field) == CONST_DECL)
3142 else if (TREE_CODE (field) != FIELD_DECL)
3143 my_friendly_abort (61);
3146 cp_error ("invalid use of member `%D' from base class `%T'", field,
3147 DECL_FIELD_CONTEXT (field));
3148 id = error_mark_node;
3153 /* Remember that this name has been used in the class definition, as per
3155 if (id && current_class_type
3156 && TYPE_BEING_DEFINED (current_class_type)
3157 && ! IDENTIFIER_CLASS_VALUE (token))
3158 pushdecl_class_level (id);
3160 if (!id || id == error_mark_node)
3162 if (id == error_mark_node && current_class_type != NULL_TREE)
3164 id = lookup_nested_field (token, 1);
3165 /* In lookup_nested_field(), we marked this so we can gracefully
3166 leave this whole mess. */
3167 if (id && id != error_mark_node && TREE_TYPE (id) == error_mark_node)
3170 if (yychar == '(' || yychar == LEFT_RIGHT)
3172 id = implicitly_declare (token);
3174 else if (current_function_decl == 0)
3176 cp_error ("`%D' was not declared in this scope", token);
3177 id = error_mark_node;
3181 if (IDENTIFIER_GLOBAL_VALUE (token) != error_mark_node
3182 || IDENTIFIER_ERROR_LOCUS (token) != current_function_decl)
3184 static int undeclared_variable_notice;
3186 cp_error ("`%D' undeclared (first use this function)", token);
3188 if (! undeclared_variable_notice)
3190 error ("(Each undeclared identifier is reported only once");
3191 error ("for each function it appears in.)");
3192 undeclared_variable_notice = 1;
3195 id = error_mark_node;
3196 /* Prevent repeated error messages. */
3197 IDENTIFIER_GLOBAL_VALUE (token) = error_mark_node;
3198 SET_IDENTIFIER_ERROR_LOCUS (token, current_function_decl);
3201 /* TREE_USED is set in `hack_identifier'. */
3202 if (TREE_CODE (id) == CONST_DECL)
3204 if (IDENTIFIER_CLASS_VALUE (token) == id)
3207 enum access_type access
3208 = compute_access (TYPE_BINFO (current_class_type), id);
3209 if (access == access_private)
3210 cp_error ("enum `%D' is private", id);
3211 /* protected is OK, since it's an enum of `this'. */
3213 id = DECL_INITIAL (id);
3216 id = hack_identifier (id, token, yychar);
3221 identifier_typedecl_value (node)
3225 type = IDENTIFIER_TYPE_VALUE (node);
3226 if (type == NULL_TREE)
3231 if (t && TREE_CODE (t) == TYPE_DECL && TREE_TYPE (t) == type) \
3234 do (IDENTIFIER_LOCAL_VALUE (node));
3235 do (IDENTIFIER_CLASS_VALUE (node));
3236 do (IDENTIFIER_GLOBAL_VALUE (node));
3238 /* Will this one ever happen? */
3239 if (TYPE_NAME (type))
3240 return TYPE_NAME (type);
3242 /* We used to do an internal error of 62 here, but instead we will
3243 handle the return of a null appropriately in the callers. */
3252 char long_long_flag;
3255 struct try_type type_sequence[] =
3257 { &integer_type_node, 0, 0, 0},
3258 { &unsigned_type_node, 1, 0, 0},
3259 { &long_integer_type_node, 0, 1, 0},
3260 { &long_unsigned_type_node, 1, 1, 0},
3261 { &long_long_integer_type_node, 0, 1, 1},
3262 { &long_long_unsigned_type_node, 1, 1, 1}
3271 int dollar_seen = 0;
3275 c = nextchar, nextchar = -1;
3279 /* Effectively do c = skip_white_space (c)
3280 but do it faster in the usual cases. */
3293 /* Call skip_white_space so we can warn if appropriate. */
3298 c = skip_white_space (c);
3300 goto found_nonwhite;
3304 token_buffer[0] = c;
3305 token_buffer[1] = 0;
3307 /* yylloc.first_line = lineno; */
3312 token_buffer[0] = '\0';
3314 if (input_redirected ())
3315 value = END_OF_SAVED_INPUT;
3316 else if (do_pending_expansions ())
3317 /* this will set yychar for us */
3324 if (dollars_in_ident)
3333 /* Capital L may start a wide-string or wide-character constant. */
3335 register int c = getch ();
3344 goto string_constant;
3349 case 'A': case 'B': case 'C': case 'D': case 'E':
3350 case 'F': case 'G': case 'H': case 'I': case 'J':
3351 case 'K': case 'M': case 'N': case 'O':
3352 case 'P': case 'Q': case 'R': case 'S': case 'T':
3353 case 'U': case 'V': case 'W': case 'X': case 'Y':
3355 case 'a': case 'b': case 'c': case 'd': case 'e':
3356 case 'f': case 'g': case 'h': case 'i': case 'j':
3357 case 'k': case 'l': case 'm': case 'n': case 'o':
3358 case 'p': case 'q': case 'r': case 's': case 't':
3359 case 'u': case 'v': case 'w': case 'x': case 'y':
3369 /* We know that `token_buffer' can hold at least on char,
3370 so we install C immediately.
3371 We may have to read the value in `putback_char', so call
3376 /* Make this run fast. We know that we are reading straight
3377 from FINPUT in this case (since identifiers cannot straddle
3379 while (isalnum (c) || (c == '_') || c == '$')
3381 if (c == '$' && ! dollars_in_ident)
3383 if (p >= token_buffer + maxtoken)
3384 p = extend_token_buffer (p);
3392 /* We know that `token_buffer' can hold at least on char,
3393 so we install C immediately. */
3397 while (isalnum (c) || (c == '_') || c == '$')
3399 if (c == '$' && ! dollars_in_ident)
3401 if (p >= token_buffer + maxtoken)
3402 p = extend_token_buffer (p);
3415 /* Try to recognize a keyword. Uses minimum-perfect hash function */
3418 register struct resword *ptr;
3420 if (ptr = is_reserved_word (token_buffer, p - token_buffer))
3424 tree old_ttype = ridpointers[(int) ptr->rid];
3426 /* If this provides a type for us, then revert lexical
3427 state to standard state. */
3428 if (TREE_CODE (old_ttype) == IDENTIFIER_NODE
3429 && IDENTIFIER_GLOBAL_VALUE (old_ttype) != 0
3430 && TREE_CODE (IDENTIFIER_GLOBAL_VALUE (old_ttype)) == TYPE_DECL)
3431 looking_for_typename = 0;
3432 else if (ptr->token == AGGR || ptr->token == ENUM)
3433 looking_for_typename = 1;
3435 /* Check if this is a language-type declaration.
3436 Just glimpse the next non-white character. */
3437 nextchar = skip_white_space (nextchar);
3438 if (nextchar == '"')
3440 /* We are looking at a string. Complain
3441 if the token before the string is no `extern'.
3443 Could cheat some memory by placing this string
3444 on the temporary_, instead of the saveable_
3447 if (ptr->rid != RID_EXTERN)
3448 error ("invalid modifier `%s' for language string",
3451 value = EXTERN_LANG_STRING;
3452 yylval.ttype = get_identifier (TREE_STRING_POINTER (yylval.ttype));
3455 if (ptr->token == VISSPEC)
3460 yylval.itype = access_public;
3463 yylval.itype = access_private;
3466 yylval.itype = access_protected;
3469 my_friendly_abort (63);
3473 yylval.ttype = old_ttype;
3475 value = (int) ptr->token;
3479 /* If we did not find a keyword, look for an identifier
3482 if (strcmp ("catch", token_buffer) == 0
3483 || strcmp ("throw", token_buffer) == 0
3484 || strcmp ("try", token_buffer) == 0)
3486 static int did_warn = 0;
3487 if (! did_warn && ! flag_handle_exceptions)
3489 pedwarn ("`catch', `throw', and `try' are all C++ reserved words");
3494 if (value == IDENTIFIER || value == TYPESPEC)
3495 GNU_xref_ref (current_function_decl, token_buffer);
3497 if (value == IDENTIFIER)
3499 register tree tmp = get_identifier (token_buffer);
3501 #if !defined(VMS) && defined(JOINER)
3502 /* Make sure that user does not collide with our internal
3506 && (THIS_NAME_P (tmp)
3507 || VPTR_NAME_P (tmp)
3508 || DESTRUCTOR_NAME_P (tmp)
3509 || VTABLE_NAME_P (tmp)
3510 || TEMP_NAME_P (tmp)
3511 || ANON_AGGRNAME_P (tmp)
3512 || ANON_PARMNAME_P (tmp)))
3513 warning ("identifier name `%s' conflicts with GNU C++ internal naming strategy",
3519 /* A user-invisible read-only initialized variable
3520 should be replaced by its value. We only handle strings
3521 since that's the only case used in C (and C++). */
3522 /* Note we go right after the local value for the identifier
3523 (e.g., __FUNCTION__ or __PRETTY_FUNCTION__). We used to
3524 call lookup_name, but that could result in an error about
3526 tmp = IDENTIFIER_LOCAL_VALUE (yylval.ttype);
3527 if (tmp != NULL_TREE
3528 && TREE_CODE (tmp) == VAR_DECL
3529 && DECL_IGNORED_P (tmp)
3530 && TREE_READONLY (tmp)
3531 && DECL_INITIAL (tmp) != NULL_TREE
3532 && TREE_CODE (DECL_INITIAL (tmp)) == STRING_CST)
3534 yylval.ttype = DECL_INITIAL (tmp);
3538 if (value == NEW && ! global_bindings_p ())
3548 register int c1 = getch ();
3549 token_buffer[0] = c;
3550 token_buffer[1] = c1;
3554 token_buffer[2] = 0;
3562 token_buffer[2] = c1;
3563 token_buffer[3] = 0;
3568 token_buffer[2] = '\0';
3575 goto resume_numerical_scan;
3579 token_buffer[1] = 0;
3583 /* Optimize for most frequent case. */
3585 register int c1 = getch ();
3586 if (! isalnum (c1) && c1 != '.')
3588 /* Terminate string. */
3589 token_buffer[0] = c;
3590 token_buffer[1] = 0;
3592 yylval.ttype = integer_zero_node;
3594 yylval.ttype = integer_one_node;
3601 /* fall through... */
3602 case '2': case '3': case '4':
3603 case '5': case '6': case '7': case '8': case '9':
3604 resume_numerical_scan:
3609 int largest_digit = 0;
3611 /* for multi-precision arithmetic,
3612 we actually store only HOST_BITS_PER_CHAR bits in each part.
3613 The number of parts is chosen so as to be sufficient to hold
3614 the enough bits to fit into the two HOST_WIDE_INTs that contain
3615 the integer value (this is always at least as many bits as are
3616 in a target `long long' value, but may be wider). */
3617 #define TOTAL_PARTS ((HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR) * 2 + 2)
3618 int parts[TOTAL_PARTS];
3621 enum anon1 { NOT_FLOAT, AFTER_POINT, TOO_MANY_POINTS} floatflag
3627 for (count = 0; count < TOTAL_PARTS; count++)
3632 *p++ = (c = getch ());
3633 if ((c == 'x') || (c == 'X'))
3636 *p++ = (c = getch ());
3638 /* Leading 0 forces octal unless the 0 is the only digit. */
3639 else if (c >= '0' && c <= '9')
3648 /* Read all the digits-and-decimal-points. */
3651 || (isalnum (c) && (c != 'l') && (c != 'L')
3652 && (c != 'u') && (c != 'U')
3653 && (floatflag == NOT_FLOAT || ((c != 'f') && (c != 'F')))))
3658 error ("floating constant may not be in radix 16");
3659 if (floatflag == AFTER_POINT)
3661 error ("malformed floating constant");
3662 floatflag = TOO_MANY_POINTS;
3665 floatflag = AFTER_POINT;
3668 *p++ = c = getch ();
3669 /* Accept '.' as the start of a floating-point number
3670 only when it is followed by a digit.
3671 Otherwise, unread the following non-digit
3672 and use the '.' as a structural token. */
3673 if (p == token_buffer + 2 && !isdigit (c))
3686 token_buffer[2] = '\0';
3691 token_buffer[1] = '\0';
3698 /* It is not a decimal point.
3699 It should be a digit (perhaps a hex digit). */
3705 else if (base <= 10)
3707 if (c == 'e' || c == 'E')
3710 floatflag = AFTER_POINT;
3711 break; /* start of exponent */
3713 error ("nondigits in number and not hexadecimal");
3724 if (c >= largest_digit)
3728 for (count = 0; count < TOTAL_PARTS; count++)
3730 parts[count] *= base;
3734 += (parts[count-1] >> HOST_BITS_PER_CHAR);
3736 &= (1 << HOST_BITS_PER_CHAR) - 1;
3742 /* If the extra highest-order part ever gets anything in it,
3743 the number is certainly too big. */
3744 if (parts[TOTAL_PARTS - 1] != 0)
3747 if (p >= token_buffer + maxtoken - 3)
3748 p = extend_token_buffer (p);
3749 *p++ = (c = getch ());
3754 error ("numeric constant with no digits");
3756 if (largest_digit >= base)
3757 error ("numeric constant contains digits beyond the radix");
3759 /* Remove terminating char from the token buffer and delimit the string */
3762 if (floatflag != NOT_FLOAT)
3764 tree type = double_type_node;
3767 int garbage_chars = 0;
3768 REAL_VALUE_TYPE value;
3771 /* Read explicit exponent if any, and put it in tokenbuf. */
3773 if ((c == 'e') || (c == 'E'))
3775 if (p >= token_buffer + maxtoken - 3)
3776 p = extend_token_buffer (p);
3779 if ((c == '+') || (c == '-'))
3785 error ("floating constant exponent has no digits");
3788 if (p >= token_buffer + maxtoken - 3)
3789 p = extend_token_buffer (p);
3798 /* Convert string to a double, checking for overflow. */
3799 if (setjmp (handler))
3801 error ("floating constant out of range");
3806 set_float_handler (handler);
3807 /* The second argument, machine_mode, of REAL_VALUE_ATOF
3808 tells the desired precision of the binary result of
3809 decimal-to-binary conversion. */
3811 /* Read the suffixes to choose a data type. */
3815 type = float_type_node;
3816 value = REAL_VALUE_ATOF (token_buffer, TYPE_MODE (type));
3821 type = long_double_type_node;
3822 value = REAL_VALUE_ATOF (token_buffer, TYPE_MODE (type));
3827 value = REAL_VALUE_ATOF (token_buffer, TYPE_MODE (type));
3829 set_float_handler (NULL_PTR);
3832 && (REAL_VALUE_ISINF (value)
3834 || (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
3836 /* ERANGE is also reported for underflow, so test the
3837 value to distinguish overflow from that. */
3838 && (REAL_VALUES_LESS (dconst1, value)
3839 || REAL_VALUES_LESS (value, dconstm1)))
3843 pedwarn ("floating point number exceeds range of `%s'",
3844 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
3846 /* Note: garbage_chars is -1 if first char is *not* garbage. */
3849 if (c == 'f' || c == 'F')
3852 error ("two `f's in floating constant");
3855 if (c == 'l' || c == 'L')
3858 error ("two `l's in floating constant");
3861 if (p >= token_buffer + maxtoken - 3)
3862 p = extend_token_buffer (p);
3868 if (garbage_chars > 0)
3869 error ("garbage at end of number");
3871 /* Create a node with determined type and value. */
3872 yylval.ttype = build_real (type, value);
3880 HOST_WIDE_INT high, low;
3881 int spec_unsigned = 0;
3883 int spec_long_long = 0;
3888 if (c == 'u' || c == 'U')
3891 error ("two `u's in integer constant");
3894 else if (c == 'l' || c == 'L')
3899 error ("three `l's in integer constant");
3901 pedwarn ("ANSI C++ forbids long long integer constants");
3910 error ("garbage at end of number");
3913 if (p >= token_buffer + maxtoken - 3)
3914 p = extend_token_buffer (p);
3921 if (p >= token_buffer + maxtoken - 3)
3922 p = extend_token_buffer (p);
3929 /* If the constant is not long long and it won't fit in an
3930 unsigned long, or if the constant is long long and won't fit
3931 in an unsigned long long, then warn that the constant is out
3934 /* ??? This assumes that long long and long integer types are
3935 a multiple of 8 bits. This better than the original code
3936 though which assumed that long was exactly 32 bits and long
3937 long was exactly 64 bits. */
3940 bytes = TYPE_PRECISION (long_long_integer_type_node) / 8;
3942 bytes = TYPE_PRECISION (long_integer_type_node) / 8;
3945 for (i = bytes; i < TOTAL_PARTS; i++)
3949 pedwarn ("integer constant out of range");
3951 /* This is simplified by the fact that our constant
3952 is always positive. */
3955 for (i = 0; i < HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR; i++)
3957 high |= ((HOST_WIDE_INT) parts[i + (HOST_BITS_PER_WIDE_INT
3958 / HOST_BITS_PER_CHAR)]
3959 << (i * HOST_BITS_PER_CHAR));
3960 low |= (HOST_WIDE_INT) parts[i] << (i * HOST_BITS_PER_CHAR);
3964 yylval.ttype = build_int_2 (low, high);
3965 TREE_TYPE (yylval.ttype) = long_long_unsigned_type_node;
3968 /* Find the first allowable type that the value fits in. */
3970 for (i = 0; i < sizeof (type_sequence) / sizeof (type_sequence[0]);
3972 if (!(spec_long && !type_sequence[i].long_flag)
3973 && !(spec_long_long && !type_sequence[i].long_long_flag)
3974 && !(spec_unsigned && !type_sequence[i].unsigned_flag)
3975 /* A hex or octal constant traditionally is unsigned. */
3976 && !(base != 10 && flag_traditional
3977 && !type_sequence[i].unsigned_flag)
3978 /* A decimal constant can't be unsigned int
3979 unless explicitly specified. */
3980 && !(base == 10 && !spec_unsigned
3981 && *type_sequence[i].node_var == unsigned_type_node))
3982 if (int_fits_type_p (yylval.ttype, *type_sequence[i].node_var))
3984 type = *type_sequence[i].node_var;
3987 if (flag_traditional && type == long_unsigned_type_node
3989 type = long_integer_type_node;
3993 type = long_long_integer_type_node;
3994 warning ("integer constant out of range");
3997 /* Warn about some cases where the type of a given constant
3998 changes from traditional C to ANSI C. */
3999 if (warn_traditional)
4001 tree other_type = 0;
4003 /* This computation is the same as the previous one
4004 except that flag_traditional is used backwards. */
4005 for (i = 0; i < sizeof (type_sequence) / sizeof (type_sequence[0]);
4007 if (!(spec_long && !type_sequence[i].long_flag)
4008 && !(spec_long_long && !type_sequence[i].long_long_flag)
4009 && !(spec_unsigned && !type_sequence[i].unsigned_flag)
4010 /* A hex or octal constant traditionally is unsigned. */
4011 && !(base != 10 && !flag_traditional
4012 && !type_sequence[i].unsigned_flag)
4013 /* A decimal constant can't be unsigned int
4014 unless explicitly specified. */
4015 && !(base == 10 && !spec_unsigned
4016 && *type_sequence[i].node_var == unsigned_type_node))
4017 if (int_fits_type_p (yylval.ttype, *type_sequence[i].node_var))
4019 other_type = *type_sequence[i].node_var;
4022 if (!flag_traditional && type == long_unsigned_type_node
4024 type = long_integer_type_node;
4026 if (other_type != 0 && other_type != type)
4028 if (flag_traditional)
4029 warning ("type of integer constant would be different without -traditional");
4031 warning ("type of integer constant would be different with -traditional");
4036 if (!spec_long && !spec_unsigned
4037 && !(flag_traditional && base != 10)
4038 && int_fits_type_p (yylval.ttype, integer_type_node))
4041 if (warn_traditional && base != 10)
4042 warning ("small nondecimal constant becomes signed in ANSI C++");
4044 type = integer_type_node;
4046 else if (!spec_long && (base != 10 || spec_unsigned)
4047 && int_fits_type_p (yylval.ttype, unsigned_type_node))
4049 /* Nondecimal constants try unsigned even in traditional C. */
4050 type = unsigned_type_node;
4053 else if (!spec_unsigned && !spec_long_long
4054 && int_fits_type_p (yylval.ttype, long_integer_type_node))
4055 type = long_integer_type_node;
4057 else if (! spec_long_long
4058 && int_fits_type_p (yylval.ttype,
4059 long_unsigned_type_node))
4062 if (warn_traditional && !spec_unsigned)
4063 warning ("large integer constant becomes unsigned in ANSI C++");
4065 if (flag_traditional && !spec_unsigned)
4066 type = long_integer_type_node;
4068 type = long_unsigned_type_node;
4071 else if (! spec_unsigned
4072 /* Verify value does not overflow into sign bit. */
4073 && TREE_INT_CST_HIGH (yylval.ttype) >= 0
4074 && int_fits_type_p (yylval.ttype,
4075 long_long_integer_type_node))
4076 type = long_long_integer_type_node;
4078 else if (int_fits_type_p (yylval.ttype,
4079 long_long_unsigned_type_node))
4082 if (warn_traditional && !spec_unsigned)
4083 warning ("large nondecimal constant is unsigned in ANSI C++");
4086 if (flag_traditional && !spec_unsigned)
4087 type = long_long_integer_type_node;
4089 type = long_long_unsigned_type_node;
4094 type = long_long_integer_type_node;
4095 warning ("integer constant out of range");
4097 if (base == 10 && ! spec_unsigned && TREE_UNSIGNED (type))
4098 warning ("decimal integer constant is so large that it is unsigned");
4102 TREE_TYPE (yylval.ttype) = type;
4106 value = CONSTANT; break;
4112 register int result = 0;
4113 register int num_chars = 0;
4114 unsigned width = TYPE_PRECISION (char_type_node);
4119 width = WCHAR_TYPE_SIZE;
4120 #ifdef MULTIBYTE_CHARS
4121 max_chars = MB_CUR_MAX;
4127 max_chars = TYPE_PRECISION (integer_type_node) / width;
4135 if (c == '\'' || c == EOF)
4141 c = readescape (&ignore);
4144 if (width < HOST_BITS_PER_INT
4145 && (unsigned) c >= (1 << width))
4146 pedwarn ("escape sequence out of range for character");
4147 #ifdef MAP_CHARACTER
4149 c = MAP_CHARACTER (c);
4155 pedwarn ("ANSI C++ forbids newline in character constant");
4158 #ifdef MAP_CHARACTER
4160 c = MAP_CHARACTER (c);
4164 if (num_chars > maxtoken - 4)
4165 extend_token_buffer (token_buffer);
4167 token_buffer[num_chars] = c;
4169 /* Merge character into result; ignore excess chars. */
4170 if (num_chars < max_chars + 1)
4172 if (width < HOST_BITS_PER_INT)
4173 result = (result << width) | (c & ((1 << width) - 1));
4179 token_buffer[num_chars + 1] = '\'';
4180 token_buffer[num_chars + 2] = 0;
4183 error ("malformatted character constant");
4184 else if (num_chars == 0)
4185 error ("empty character constant");
4186 else if (num_chars > max_chars)
4188 num_chars = max_chars;
4189 error ("character constant too long");
4191 else if (num_chars != 1 && ! flag_traditional)
4192 warning ("multi-character character constant");
4194 /* If char type is signed, sign-extend the constant. */
4197 int num_bits = num_chars * width;
4199 /* We already got an error; avoid invalid shift. */
4200 yylval.ttype = build_int_2 (0, 0);
4201 else if (TREE_UNSIGNED (char_type_node)
4202 || ((result >> (num_bits - 1)) & 1) == 0)
4204 = build_int_2 (result & ((unsigned HOST_WIDE_INT) ~0
4205 >> (HOST_BITS_PER_INT - num_bits)),
4209 = build_int_2 (result | ~((unsigned HOST_WIDE_INT) ~0
4210 >> (HOST_BITS_PER_INT - num_bits)),
4213 TREE_TYPE (yylval.ttype) = char_type_node;
4215 TREE_TYPE (yylval.ttype) = integer_type_node;
4219 #ifdef MULTIBYTE_CHARS
4220 /* Set the initial shift state and convert the next sequence. */
4222 /* In all locales L'\0' is zero and mbtowc will return zero,
4225 || (num_chars == 1 && token_buffer[1] != '\0'))
4228 (void) mbtowc (NULL, NULL, 0);
4229 if (mbtowc (& wc, token_buffer + 1, num_chars) == num_chars)
4232 warning ("Ignoring invalid multibyte character");
4235 yylval.ttype = build_int_2 (result, 0);
4236 TREE_TYPE (yylval.ttype) = wchar_type_node;
4249 p = token_buffer + 1;
4251 while (c != '"' && c >= 0)
4253 /* ignore_escape_flag is set for reading the filename in #line. */
4254 if (!ignore_escape_flag && c == '\\')
4257 c = readescape (&ignore);
4261 && TYPE_PRECISION (char_type_node) < HOST_BITS_PER_INT
4262 && c >= ((unsigned) 1 << TYPE_PRECISION (char_type_node)))
4263 pedwarn ("escape sequence out of range for character");
4268 pedwarn ("ANSI C++ forbids newline in string constant");
4272 if (p == token_buffer + maxtoken)
4273 p = extend_token_buffer (p);
4279 error("Unterminated string");
4285 /* We have read the entire constant.
4286 Construct a STRING_CST for the result. */
4290 /* If this is a L"..." wide-string, convert the multibyte string
4291 to a wide character string. */
4292 char *widep = (char *) alloca ((p - token_buffer) * WCHAR_BYTES);
4295 #ifdef MULTIBYTE_CHARS
4296 len = mbstowcs ((wchar_t *) widep, token_buffer + 1, p - token_buffer);
4297 if (len < 0 || len >= (p - token_buffer))
4299 warning ("Ignoring invalid multibyte string");
4302 bzero (widep + (len * WCHAR_BYTES), WCHAR_BYTES);
4305 union { long l; char c[sizeof (long)]; } u;
4309 /* Determine whether host is little or big endian. */
4311 big_endian = u.c[sizeof (long) - 1];
4312 wp = widep + (big_endian ? WCHAR_BYTES - 1 : 0);
4314 bzero (widep, (p - token_buffer) * WCHAR_BYTES);
4315 for (cp = token_buffer + 1; cp < p; cp++)
4316 *wp = *cp, wp += WCHAR_BYTES;
4317 len = p - token_buffer - 1;
4320 yylval.ttype = build_string ((len + 1) * WCHAR_BYTES, widep);
4321 TREE_TYPE (yylval.ttype) = wchar_array_type_node;
4325 yylval.ttype = build_string (p - token_buffer, token_buffer + 1);
4326 TREE_TYPE (yylval.ttype) = char_array_type_node;
4332 value = STRING; break;
4355 yylval.code = PLUS_EXPR; break;
4357 yylval.code = MINUS_EXPR; break;
4359 yylval.code = BIT_AND_EXPR; break;
4361 yylval.code = BIT_IOR_EXPR; break;
4363 yylval.code = MULT_EXPR; break;
4365 yylval.code = TRUNC_DIV_EXPR; break;
4367 yylval.code = TRUNC_MOD_EXPR; break;
4369 yylval.code = BIT_XOR_EXPR; break;
4371 yylval.code = LSHIFT_EXPR; break;
4373 yylval.code = RSHIFT_EXPR; break;
4375 yylval.code = LT_EXPR; break;
4377 yylval.code = GT_EXPR; break;
4380 token_buffer[1] = c1 = getch ();
4381 token_buffer[2] = 0;
4388 value = ARITHCOMPARE; yylval.code = LE_EXPR; goto done;
4390 value = ARITHCOMPARE; yylval.code = GE_EXPR; goto done;
4392 value = EQCOMPARE; yylval.code = NE_EXPR; goto done;
4394 value = EQCOMPARE; yylval.code = EQ_EXPR; goto done;
4396 value = ASSIGN; goto done;
4402 value = PLUSPLUS; goto done;
4404 value = MINUSMINUS; goto done;
4406 value = ANDAND; goto done;
4408 value = OROR; goto done;
4416 else if ((c == '-') && (c1 == '>'))
4418 nextchar = skip_white_space (getch ());
4419 if (nextchar == '*')
4422 value = POINTSAT_STAR;
4428 else if (c1 == '?' && (c == '<' || c == '>'))
4430 token_buffer[3] = 0;
4433 yylval.code = (c == '<' ? MIN_EXPR : MAX_EXPR);
4436 /* <?= or >?= expression. */
4437 token_buffer[2] = c1;
4446 error ("use of `operator %s' is not standard C++",
4452 token_buffer[1] = 0;
4462 token_buffer[1] = ':';
4463 token_buffer[2] = '\0';
4475 /* Don't make yyparse think this is eof. */
4480 /* try, weakly, to handle casts to pointers to functions. */
4481 nextchar = skip_white_space (getch ());
4482 if (nextchar == '*')
4484 int next_c = skip_white_space (getch ());
4488 yylval.ttype = build1 (INDIRECT_REF, 0, 0);
4489 value = PAREN_STAR_PAREN;
4497 else if (nextchar == ')')
4500 yylval.ttype = NULL_TREE;
4511 /* yylloc.last_line = lineno; */
4512 #ifdef GATHER_STATISTICS
4513 token_count[value] += 1;
4521 d_kind, t_kind, s_kind, r_kind, e_kind, c_kind,
4522 id_kind, op_id_kind, perm_list_kind, temp_list_kind,
4523 vec_kind, x_kind, lang_decl, lang_type, all_kinds
4525 extern int tree_node_counts[];
4526 extern int tree_node_sizes[];
4527 extern char *tree_node_kind_names[];
4529 /* Place to save freed lang_decls which were allocated on the
4530 permanent_obstack. @@ Not currently used. */
4531 tree free_lang_decl_chain;
4534 build_lang_decl (code, name, type)
4535 enum tree_code code;
4539 register tree t = build_decl (code, name, type);
4540 struct obstack *obstack = current_obstack;
4541 register int i = sizeof (struct lang_decl) / sizeof (int);
4544 if (! TREE_PERMANENT (t))
4545 obstack = saveable_obstack;
4547 /* Could be that saveable is permanent and current is not. */
4548 obstack = &permanent_obstack;
4550 if (free_lang_decl_chain && obstack == &permanent_obstack)
4552 pi = (int *)free_lang_decl_chain;
4553 free_lang_decl_chain = TREE_CHAIN (free_lang_decl_chain);
4556 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl));
4561 DECL_LANG_SPECIFIC (t) = (struct lang_decl *) pi;
4562 LANG_DECL_PERMANENT ((struct lang_decl *) pi)
4563 = obstack == &permanent_obstack;
4564 my_friendly_assert (LANG_DECL_PERMANENT ((struct lang_decl *) pi)
4565 == TREE_PERMANENT (t), 234);
4566 DECL_MAIN_VARIANT (t) = t;
4567 if (current_lang_name == lang_name_cplusplus)
4569 DECL_LANGUAGE (t) = lang_cplusplus;
4571 #ifndef NO_AUTO_OVERLOAD
4572 if (code == FUNCTION_DECL && name != 0
4573 && ! (IDENTIFIER_LENGTH (name) == 4
4574 && IDENTIFIER_POINTER (name)[0] == 'm'
4575 && strcmp (IDENTIFIER_POINTER (name), "main") == 0)
4576 && ! (IDENTIFIER_LENGTH (name) > 10
4577 && IDENTIFIER_POINTER (name)[0] == '_'
4578 && IDENTIFIER_POINTER (name)[1] == '_'
4579 && strncmp (IDENTIFIER_POINTER (name)+2, "builtin_", 8) == 0))
4580 TREE_OVERLOADED (name) = 1;
4584 else if (current_lang_name == lang_name_c)
4585 DECL_LANGUAGE (t) = lang_c;
4586 else my_friendly_abort (64);
4588 #if 0 /* not yet, should get fixed properly later */
4589 if (code == TYPE_DECL)
4592 id = get_identifier (build_overload_name (type, 1, 1));
4593 DECL_ASSEMBLER_NAME (t) = id;
4597 #ifdef GATHER_STATISTICS
4598 tree_node_counts[(int)lang_decl] += 1;
4599 tree_node_sizes[(int)lang_decl] += sizeof(struct lang_decl);
4606 build_lang_field_decl (code, name, type)
4607 enum tree_code code;
4611 extern struct obstack *current_obstack, *saveable_obstack;
4612 register tree t = build_decl (code, name, type);
4613 struct obstack *obstack = current_obstack;
4614 register int i = sizeof (struct lang_decl_flags) / sizeof (int);
4616 #if 0 /* not yet, should get fixed properly later */
4618 if (code == TYPE_DECL)
4621 id = get_identifier (build_overload_name (type, 1, 1));
4622 DECL_ASSEMBLER_NAME (t) = id;
4626 if (! TREE_PERMANENT (t))
4627 obstack = saveable_obstack;
4629 my_friendly_assert (obstack == &permanent_obstack, 235);
4631 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl_flags));
4635 DECL_LANG_SPECIFIC (t) = (struct lang_decl *) pi;
4640 copy_lang_decl (node)
4646 if (TREE_CODE (node) == FIELD_DECL)
4647 size = sizeof (struct lang_decl_flags);
4649 size = sizeof (struct lang_decl);
4650 pi = (int *)obstack_alloc (&permanent_obstack, size);
4651 bcopy ((char *)DECL_LANG_SPECIFIC (node), (char *)pi, size);
4652 DECL_LANG_SPECIFIC (node) = (struct lang_decl *)pi;
4656 make_lang_type (code)
4657 enum tree_code code;
4659 extern struct obstack *current_obstack, *saveable_obstack;
4660 register tree t = make_node (code);
4661 struct obstack *obstack = current_obstack;
4662 register int i = sizeof (struct lang_type) / sizeof (int);
4665 /* Set up some flags that give proper default behavior. */
4666 IS_AGGR_TYPE (t) = 1;
4668 if (! TREE_PERMANENT (t))
4669 obstack = saveable_obstack;
4671 my_friendly_assert (obstack == &permanent_obstack, 236);
4673 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_type));
4677 TYPE_LANG_SPECIFIC (t) = (struct lang_type *) pi;
4678 CLASSTYPE_AS_LIST (t) = build_tree_list (NULL_TREE, t);
4679 SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown);
4680 CLASSTYPE_INTERFACE_ONLY (t) = interface_only;
4681 CLASSTYPE_VBASE_SIZE (t) = integer_zero_node;
4682 TYPE_BINFO (t) = make_binfo (integer_zero_node, t, NULL_TREE, NULL_TREE,
4684 CLASSTYPE_BINFO_AS_LIST (t) = build_tree_list (NULL_TREE, TYPE_BINFO (t));
4686 /* Make sure this is laid out, for ease of use later.
4687 In the presence of parse errors, the normal was of assuring
4688 this might not ever get executed, so we lay it out *immediately*. */
4689 build_pointer_type (t);
4691 #ifdef GATHER_STATISTICS
4692 tree_node_counts[(int)lang_type] += 1;
4693 tree_node_sizes[(int)lang_type] += sizeof(struct lang_type);
4700 copy_decl_lang_specific (decl)
4703 extern struct obstack *current_obstack, *saveable_obstack;
4704 register int *old = (int *)DECL_LANG_SPECIFIC (decl);
4705 struct obstack *obstack = current_obstack;
4706 register int i = sizeof (struct lang_decl) / sizeof (int);
4709 if (! TREE_PERMANENT (decl))
4710 obstack = saveable_obstack;
4712 my_friendly_assert (obstack == &permanent_obstack, 237);
4714 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl));
4718 DECL_LANG_SPECIFIC (decl) = (struct lang_decl *) pi;
4720 #ifdef GATHER_STATISTICS
4721 tree_node_counts[(int)lang_decl] += 1;
4722 tree_node_sizes[(int)lang_decl] += sizeof(struct lang_decl);
4727 dump_time_statistics ()
4729 register tree prev = 0, decl, next;
4730 int this_time = my_get_run_time ();
4731 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (this_filename_time))
4732 += this_time - body_time;
4734 fprintf (stderr, "\n******\n");
4735 print_time ("header files (total)", header_time);
4736 print_time ("main file (total)", this_time - body_time);
4737 fprintf (stderr, "ratio = %g : 1\n",
4738 (double)header_time / (double)(this_time - body_time));
4739 fprintf (stderr, "\n******\n");
4741 for (decl = filename_times; decl; decl = next)
4743 next = IDENTIFIER_GLOBAL_VALUE (decl);
4744 IDENTIFIER_GLOBAL_VALUE (decl) = prev;
4748 for (decl = prev; decl; decl = IDENTIFIER_GLOBAL_VALUE (decl))
4749 print_time (IDENTIFIER_POINTER (decl),
4750 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (decl)));
4754 compiler_error (s, v, v2)
4756 HOST_WIDE_INT v, v2; /* @@also used as pointer */
4759 sprintf (buf, s, v, v2);
4760 error_with_file_and_line (input_filename, lineno, "%s (compiler error)", buf);
4764 compiler_error_with_decl (decl, s)
4771 report_error_function (0);
4773 if (TREE_CODE (decl) == PARM_DECL)
4774 fprintf (stderr, "%s:%d: ",
4775 DECL_SOURCE_FILE (DECL_CONTEXT (decl)),
4776 DECL_SOURCE_LINE (DECL_CONTEXT (decl)));
4778 fprintf (stderr, "%s:%d: ",
4779 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
4781 name = lang_printable_name (decl);
4783 fprintf (stderr, s, name);
4785 fprintf (stderr, s, "((anonymous))");
4786 fprintf (stderr, " (compiler error)\n");
4793 extern int end_of_file;
4796 strcpy (buf, string);
4798 /* We can't print string and character constants well
4799 because the token_buffer contains the result of processing escapes. */
4801 strcat (buf, input_redirected ()
4802 ? " at end of saved text"
4803 : " at end of input");
4804 else if (token_buffer[0] == 0)
4805 strcat (buf, " at null character");
4806 else if (token_buffer[0] == '"')
4807 strcat (buf, " before string constant");
4808 else if (token_buffer[0] == '\'')
4809 strcat (buf, " before character constant");
4810 else if (token_buffer[0] < 040 || (unsigned char) token_buffer[0] >= 0177)
4811 sprintf (buf + strlen (buf), " before character 0%o",
4812 (unsigned char) token_buffer[0]);
4814 strcat (buf, " before `%s'");
4816 error (buf, token_buffer);