1 /* Separate lexical analyzer for GNU C++.
2 Copyright (C) 1987, 89, 92-97, 1998 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, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
23 /* This file is the lexical analyzer for GNU C++. */
25 /* Cause the `yydebug' variable to be defined. */
42 /* MULTIBYTE_CHARS support only works for native compilers.
43 ??? Ideally what we want is to model widechar support after
44 the current floating point support. */
46 #undef MULTIBYTE_CHARS
49 #ifdef MULTIBYTE_CHARS
53 #define obstack_chunk_alloc xmalloc
54 #define obstack_chunk_free free
57 #define DIR_SEPARATOR '/'
60 extern struct obstack permanent_obstack;
61 extern struct obstack *current_obstack, *saveable_obstack;
63 extern void yyprint PROTO((FILE *, int, YYSTYPE));
64 extern void set_float_handler PROTO((jmp_buf));
65 extern void compiler_error PROTO((char *, HOST_WIDE_INT,
68 static tree get_time_identifier PROTO((char *));
69 static int check_newline PROTO((void));
70 static int skip_white_space PROTO((int));
71 static void finish_defarg PROTO((void));
72 static int my_get_run_time PROTO((void));
73 static int get_last_nonwhite_on_line PROTO((void));
74 static int interface_strcmp PROTO((char *));
75 static int readescape PROTO((int *));
76 static char *extend_token_buffer PROTO((char *));
77 static void consume_string PROTO((struct obstack *, int));
78 static void set_typedecl_interface_info PROTO((tree, tree));
79 static void feed_defarg PROTO((tree, tree));
80 static int set_vardecl_interface_info PROTO((tree, tree));
81 static void store_pending_inline PROTO((tree, struct pending_inline *));
82 static void reinit_parse_for_expr PROTO((struct obstack *));
83 static int *init_cpp_parse PROTO((void));
84 static int handle_cp_pragma PROTO((char *));
85 #ifdef HANDLE_SYSV_PRAGMA
86 static int handle_sysv_pragma PROTO((int));
88 #ifdef GATHER_STATISTICS
90 static int reduce_cmp PROTO((int *, int *));
91 static int token_cmp PROTO((int *, int *));
95 /* Given a file name X, return the nondirectory portion.
96 Keep in mind that X can be computed more than once. */
98 file_name_nondirectory (x)
101 char *tmp = (char *) rindex (x, '/');
102 if (DIR_SEPARATOR != '/' && ! tmp)
103 tmp = (char *) rindex (x, DIR_SEPARATOR);
105 return (char *) (tmp + 1);
110 /* This obstack is needed to hold text. It is not safe to use
111 TOKEN_BUFFER because `check_newline' calls `yylex'. */
112 struct obstack inline_text_obstack;
113 char *inline_text_firstobj;
117 extern cpp_reader parse_in;
118 extern cpp_options parse_options;
119 extern unsigned char *yy_cur, *yy_lim;
125 /* Pending language change.
126 Positive is push count, negative is pop count. */
127 int pending_lang_change = 0;
129 /* Wrap the current header file in extern "C". */
130 static int c_header_level = 0;
132 extern int first_token;
133 extern struct obstack token_obstack;
135 /* ??? Don't really know where this goes yet. */
139 extern void put_back (/* int */);
140 extern int input_redirected ();
141 extern void feed_input (/* char *, int */);
144 /* Holds translations from TREE_CODEs to operator name strings,
145 i.e., opname_tab[PLUS_EXPR] == "+". */
149 extern int yychar; /* the lookahead symbol */
150 extern YYSTYPE yylval; /* the semantic value of the */
151 /* lookahead symbol */
154 YYLTYPE yylloc; /* location data for the lookahead */
159 /* the declaration found for the last IDENTIFIER token read in.
160 yylex must look this up to detect typedefs, which get token type TYPENAME,
161 so it is left around in case the identifier is not a typedef but is
162 used in a context which makes it a reference to a variable. */
165 /* The elements of `ridpointers' are identifier nodes
166 for the reserved type names and storage classes.
167 It is indexed by a RID_... value. */
168 tree ridpointers[(int) RID_MAX];
170 /* We may keep statistics about how long which files took to compile. */
171 static int header_time, body_time;
172 static tree filename_times;
173 static tree this_filename_time;
175 /* Array for holding counts of the numbers of tokens seen. */
176 extern int *token_count;
178 /* Return something to represent absolute declarators containing a *.
179 TARGET is the absolute declarator that the * contains.
180 CV_QUALIFIERS is a list of modifiers such as const or volatile
181 to apply to the pointer type, represented as identifiers.
183 We return an INDIRECT_REF whose "contents" are TARGET
184 and whose type is the modifier list. */
187 make_pointer_declarator (cv_qualifiers, target)
188 tree cv_qualifiers, target;
190 if (target && TREE_CODE (target) == IDENTIFIER_NODE
191 && ANON_AGGRNAME_P (target))
192 error ("type name expected before `*'");
193 target = build_parse_node (INDIRECT_REF, target);
194 TREE_TYPE (target) = cv_qualifiers;
198 /* Return something to represent absolute declarators containing a &.
199 TARGET is the absolute declarator that the & contains.
200 CV_QUALIFIERS is a list of modifiers such as const or volatile
201 to apply to the reference type, represented as identifiers.
203 We return an ADDR_EXPR whose "contents" are TARGET
204 and whose type is the modifier list. */
207 make_reference_declarator (cv_qualifiers, target)
208 tree cv_qualifiers, target;
212 if (TREE_CODE (target) == ADDR_EXPR)
214 error ("cannot declare references to references");
217 if (TREE_CODE (target) == INDIRECT_REF)
219 error ("cannot declare pointers to references");
222 if (TREE_CODE (target) == IDENTIFIER_NODE && ANON_AGGRNAME_P (target))
223 error ("type name expected before `&'");
225 target = build_parse_node (ADDR_EXPR, target);
226 TREE_TYPE (target) = cv_qualifiers;
231 make_call_declarator (target, parms, cv_qualifiers, exception_specification)
232 tree target, parms, cv_qualifiers, exception_specification;
234 target = build_parse_node (CALL_EXPR, target, parms, cv_qualifiers);
235 TREE_TYPE (target) = exception_specification;
240 set_quals_and_spec (call_declarator, cv_qualifiers, exception_specification)
241 tree call_declarator, cv_qualifiers, exception_specification;
243 TREE_OPERAND (call_declarator, 2) = cv_qualifiers;
244 TREE_TYPE (call_declarator) = exception_specification;
247 /* Build names and nodes for overloaded operators. */
249 tree ansi_opname[LAST_CPLUS_TREE_CODE];
250 tree ansi_assopname[LAST_CPLUS_TREE_CODE];
253 operator_name_string (name)
256 char *opname = IDENTIFIER_POINTER (name) + 2;
260 /* Works for builtin and user defined types. */
261 if (IDENTIFIER_GLOBAL_VALUE (name)
262 && TREE_CODE (IDENTIFIER_GLOBAL_VALUE (name)) == TYPE_DECL)
263 return IDENTIFIER_POINTER (name);
265 if (opname[0] == 'a' && opname[2] != '\0' && opname[2] != '_')
269 opname_table = ansi_assopname;
274 opname_table = ansi_opname;
277 for (i = 0; i < (int) LAST_CPLUS_TREE_CODE; i++)
279 if (opname[0] == IDENTIFIER_POINTER (opname_table[i])[2+assign]
280 && opname[1] == IDENTIFIER_POINTER (opname_table[i])[3+assign])
284 if (i == LAST_CPLUS_TREE_CODE)
285 return "<invalid operator>";
288 return assignop_tab[i];
290 return opname_tab[i];
293 int interface_only; /* whether or not current file is only for
294 interface definitions. */
295 int interface_unknown; /* whether or not we know this class
296 to behave according to #pragma interface. */
298 /* lexical analyzer */
300 /* File used for outputting assembler code. */
301 extern FILE *asm_out_file;
303 #ifndef WCHAR_TYPE_SIZE
305 #define WCHAR_TYPE_SIZE INT_TYPE_SIZE
307 #define WCHAR_TYPE_SIZE BITS_PER_WORD
311 /* Number of bytes in a wide character. */
312 #define WCHAR_BYTES (WCHAR_TYPE_SIZE / BITS_PER_UNIT)
314 static int maxtoken; /* Current nominal length of token buffer. */
315 char *token_buffer; /* Pointer to token buffer.
316 Actual allocated length is maxtoken + 2. */
321 /* Nonzero tells yylex to ignore \ in string constants. */
322 static int ignore_escape_flag = 0;
325 get_time_identifier (name)
328 tree time_identifier;
329 int len = strlen (name);
330 char *buf = (char *) alloca (len + 6);
331 strcpy (buf, "file ");
332 bcopy (name, buf+5, len);
334 time_identifier = get_identifier (buf);
335 if (IDENTIFIER_LOCAL_VALUE (time_identifier) == NULL_TREE)
337 push_obstacks_nochange ();
338 end_temporary_allocation ();
339 IDENTIFIER_LOCAL_VALUE (time_identifier) = build_int_2 (0, 0);
340 IDENTIFIER_CLASS_VALUE (time_identifier) = build_int_2 (0, 1);
341 SET_IDENTIFIER_GLOBAL_VALUE (time_identifier, filename_times);
342 filename_times = time_identifier;
345 return time_identifier;
354 int old_quiet_flag = quiet_flag;
357 this_time = get_run_time ();
358 quiet_flag = old_quiet_flag;
362 /* Table indexed by tree code giving a string containing a character
363 classifying the tree code. Possibilities are
364 t, d, s, c, r, <, 1 and 2. See cp/cp-tree.def for details. */
366 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
368 char cplus_tree_code_type[] = {
370 #include "cp-tree.def"
374 /* Table indexed by tree code giving number of expression
375 operands beyond the fixed part of the node structure.
376 Not used for types or decls. */
378 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
380 int cplus_tree_code_length[] = {
382 #include "cp-tree.def"
386 /* Names of tree components.
387 Used for printing out the tree and error messages. */
388 #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
390 char *cplus_tree_code_name[] = {
392 #include "cp-tree.def"
396 /* toplev.c needs to call these. */
401 /* Default exceptions on. */
408 /* the beginning of the file is a new line; check for # */
409 /* With luck, we discover the real source file's name from that
410 and put it in input_filename. */
411 put_back (check_newline ());
412 if (flag_gnu_xref) GNU_xref_begin (input_filename);
413 init_repo (input_filename);
419 extern int errorcount, sorrycount;
420 if (flag_gnu_xref) GNU_xref_end (errorcount+sorrycount);
430 init_filename_times ()
432 this_filename_time = get_time_identifier ("<top level>");
433 if (flag_detailed_statistics)
436 body_time = my_get_run_time ();
437 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (this_filename_time)) = body_time;
441 /* Change by Bryan Boreham, Kewill, Thu Jul 27 09:46:05 1989.
442 Stuck this hack in to get the files open correctly; this is called
443 in place of init_parse if we are an unexec'd binary. */
447 reinit_lang_specific ()
449 init_filename_times ();
450 reinit_search_statistics ();
457 #ifdef GATHER_STATISTICS
459 reduce_count = (int *)malloc (sizeof (int) * (REDUCE_LENGTH + 1));
460 bzero (reduce_count, sizeof (int) * (REDUCE_LENGTH + 1));
462 token_count = (int *)malloc (sizeof (int) * (TOKEN_LENGTH + 1));
463 bzero (token_count, sizeof (int) * (TOKEN_LENGTH + 1));
471 init_parse (filename)
474 extern int flag_no_gnu_keywords;
475 extern int flag_operator_names;
483 cpp_reader_init (&parse_in);
484 parse_in.data = &parse_options;
485 cpp_options_init (&parse_options);
486 cpp_handle_options (&parse_in, 0, NULL); /* FIXME */
487 parse_in.show_column = 1;
488 if (! cpp_start_read (&parse_in, filename))
491 /* Open input file. */
492 if (filename == 0 || !strcmp (filename, "-"))
498 finput = fopen (filename, "r");
500 pfatal_with_name (filename);
502 #ifdef IO_BUFFER_SIZE
503 setvbuf (finput, (char *) xmalloc (IO_BUFFER_SIZE), _IOFBF, IO_BUFFER_SIZE);
505 #endif /* !USE_CPPLIB */
507 /* Initialize the lookahead machinery. */
510 /* Make identifier nodes long enough for the language-specific slots. */
511 set_identifier_size (sizeof (struct lang_identifier));
512 decl_printable_name = lang_printable_name;
514 init_cplus_expand ();
516 bcopy (cplus_tree_code_type,
517 tree_code_type + (int) LAST_AND_UNUSED_TREE_CODE,
518 (int)LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE);
519 bcopy ((char *)cplus_tree_code_length,
520 (char *)(tree_code_length + (int) LAST_AND_UNUSED_TREE_CODE),
521 (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (int));
522 bcopy ((char *)cplus_tree_code_name,
523 (char *)(tree_code_name + (int) LAST_AND_UNUSED_TREE_CODE),
524 (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (char *));
526 opname_tab = (char **)oballoc ((int)LAST_CPLUS_TREE_CODE * sizeof (char *));
527 bzero ((char *)opname_tab, (int)LAST_CPLUS_TREE_CODE * sizeof (char *));
528 assignop_tab = (char **)oballoc ((int)LAST_CPLUS_TREE_CODE * sizeof (char *));
529 bzero ((char *)assignop_tab, (int)LAST_CPLUS_TREE_CODE * sizeof (char *));
531 ansi_opname[0] = get_identifier ("<invalid operator>");
532 for (i = 0; i < (int) LAST_CPLUS_TREE_CODE; i++)
534 ansi_opname[i] = ansi_opname[0];
535 ansi_assopname[i] = ansi_opname[0];
538 ansi_opname[(int) MULT_EXPR] = get_identifier ("__ml");
539 IDENTIFIER_OPNAME_P (ansi_opname[(int) MULT_EXPR]) = 1;
540 ansi_opname[(int) INDIRECT_REF] = ansi_opname[(int) MULT_EXPR];
541 ansi_assopname[(int) MULT_EXPR] = get_identifier ("__aml");
542 IDENTIFIER_OPNAME_P (ansi_assopname[(int) MULT_EXPR]) = 1;
543 ansi_assopname[(int) INDIRECT_REF] = ansi_assopname[(int) MULT_EXPR];
544 ansi_opname[(int) TRUNC_MOD_EXPR] = get_identifier ("__md");
545 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUNC_MOD_EXPR]) = 1;
546 ansi_assopname[(int) TRUNC_MOD_EXPR] = get_identifier ("__amd");
547 IDENTIFIER_OPNAME_P (ansi_assopname[(int) TRUNC_MOD_EXPR]) = 1;
548 ansi_opname[(int) CEIL_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR];
549 ansi_opname[(int) FLOOR_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR];
550 ansi_opname[(int) ROUND_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR];
551 ansi_opname[(int) MINUS_EXPR] = get_identifier ("__mi");
552 IDENTIFIER_OPNAME_P (ansi_opname[(int) MINUS_EXPR]) = 1;
553 ansi_opname[(int) NEGATE_EXPR] = ansi_opname[(int) MINUS_EXPR];
554 ansi_assopname[(int) MINUS_EXPR] = get_identifier ("__ami");
555 IDENTIFIER_OPNAME_P (ansi_assopname[(int) MINUS_EXPR]) = 1;
556 ansi_assopname[(int) NEGATE_EXPR] = ansi_assopname[(int) MINUS_EXPR];
557 ansi_opname[(int) RSHIFT_EXPR] = get_identifier ("__rs");
558 IDENTIFIER_OPNAME_P (ansi_opname[(int) RSHIFT_EXPR]) = 1;
559 ansi_assopname[(int) RSHIFT_EXPR] = get_identifier ("__ars");
560 IDENTIFIER_OPNAME_P (ansi_assopname[(int) RSHIFT_EXPR]) = 1;
561 ansi_opname[(int) NE_EXPR] = get_identifier ("__ne");
562 IDENTIFIER_OPNAME_P (ansi_opname[(int) NE_EXPR]) = 1;
563 ansi_opname[(int) GT_EXPR] = get_identifier ("__gt");
564 IDENTIFIER_OPNAME_P (ansi_opname[(int) GT_EXPR]) = 1;
565 ansi_opname[(int) GE_EXPR] = get_identifier ("__ge");
566 IDENTIFIER_OPNAME_P (ansi_opname[(int) GE_EXPR]) = 1;
567 ansi_opname[(int) BIT_IOR_EXPR] = get_identifier ("__or");
568 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_IOR_EXPR]) = 1;
569 ansi_assopname[(int) BIT_IOR_EXPR] = get_identifier ("__aor");
570 IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_IOR_EXPR]) = 1;
571 ansi_opname[(int) TRUTH_ANDIF_EXPR] = get_identifier ("__aa");
572 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_ANDIF_EXPR]) = 1;
573 ansi_opname[(int) TRUTH_NOT_EXPR] = get_identifier ("__nt");
574 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_NOT_EXPR]) = 1;
575 ansi_opname[(int) PREINCREMENT_EXPR] = get_identifier ("__pp");
576 IDENTIFIER_OPNAME_P (ansi_opname[(int) PREINCREMENT_EXPR]) = 1;
577 ansi_opname[(int) POSTINCREMENT_EXPR] = ansi_opname[(int) PREINCREMENT_EXPR];
578 ansi_opname[(int) MODIFY_EXPR] = get_identifier ("__as");
579 IDENTIFIER_OPNAME_P (ansi_opname[(int) MODIFY_EXPR]) = 1;
580 ansi_assopname[(int) NOP_EXPR] = ansi_opname[(int) MODIFY_EXPR];
581 ansi_opname[(int) COMPOUND_EXPR] = get_identifier ("__cm");
582 IDENTIFIER_OPNAME_P (ansi_opname[(int) COMPOUND_EXPR]) = 1;
583 ansi_opname[(int) EXACT_DIV_EXPR] = get_identifier ("__dv");
584 IDENTIFIER_OPNAME_P (ansi_opname[(int) EXACT_DIV_EXPR]) = 1;
585 ansi_assopname[(int) EXACT_DIV_EXPR] = get_identifier ("__adv");
586 IDENTIFIER_OPNAME_P (ansi_assopname[(int) EXACT_DIV_EXPR]) = 1;
587 ansi_opname[(int) TRUNC_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
588 ansi_opname[(int) CEIL_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
589 ansi_opname[(int) FLOOR_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
590 ansi_opname[(int) ROUND_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
591 ansi_opname[(int) PLUS_EXPR] = get_identifier ("__pl");
592 ansi_assopname[(int) TRUNC_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
593 ansi_assopname[(int) CEIL_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
594 ansi_assopname[(int) FLOOR_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
595 ansi_assopname[(int) ROUND_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
596 IDENTIFIER_OPNAME_P (ansi_opname[(int) PLUS_EXPR]) = 1;
597 ansi_assopname[(int) PLUS_EXPR] = get_identifier ("__apl");
598 IDENTIFIER_OPNAME_P (ansi_assopname[(int) PLUS_EXPR]) = 1;
599 ansi_opname[(int) CONVERT_EXPR] = ansi_opname[(int) PLUS_EXPR];
600 ansi_assopname[(int) CONVERT_EXPR] = ansi_assopname[(int) PLUS_EXPR];
601 ansi_opname[(int) LSHIFT_EXPR] = get_identifier ("__ls");
602 IDENTIFIER_OPNAME_P (ansi_opname[(int) LSHIFT_EXPR]) = 1;
603 ansi_assopname[(int) LSHIFT_EXPR] = get_identifier ("__als");
604 IDENTIFIER_OPNAME_P (ansi_assopname[(int) LSHIFT_EXPR]) = 1;
605 ansi_opname[(int) EQ_EXPR] = get_identifier ("__eq");
606 IDENTIFIER_OPNAME_P (ansi_opname[(int) EQ_EXPR]) = 1;
607 ansi_opname[(int) LT_EXPR] = get_identifier ("__lt");
608 IDENTIFIER_OPNAME_P (ansi_opname[(int) LT_EXPR]) = 1;
609 ansi_opname[(int) LE_EXPR] = get_identifier ("__le");
610 IDENTIFIER_OPNAME_P (ansi_opname[(int) LE_EXPR]) = 1;
611 ansi_opname[(int) BIT_AND_EXPR] = get_identifier ("__ad");
612 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_AND_EXPR]) = 1;
613 ansi_assopname[(int) BIT_AND_EXPR] = get_identifier ("__aad");
614 IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_AND_EXPR]) = 1;
615 ansi_opname[(int) ADDR_EXPR] = ansi_opname[(int) BIT_AND_EXPR];
616 ansi_assopname[(int) ADDR_EXPR] = ansi_assopname[(int) BIT_AND_EXPR];
617 ansi_opname[(int) BIT_XOR_EXPR] = get_identifier ("__er");
618 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_XOR_EXPR]) = 1;
619 ansi_assopname[(int) BIT_XOR_EXPR] = get_identifier ("__aer");
620 IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_XOR_EXPR]) = 1;
621 ansi_opname[(int) TRUTH_ORIF_EXPR] = get_identifier ("__oo");
622 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_ORIF_EXPR]) = 1;
623 ansi_opname[(int) BIT_NOT_EXPR] = get_identifier ("__co");
624 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_NOT_EXPR]) = 1;
625 ansi_opname[(int) PREDECREMENT_EXPR] = get_identifier ("__mm");
626 IDENTIFIER_OPNAME_P (ansi_opname[(int) PREDECREMENT_EXPR]) = 1;
627 ansi_opname[(int) POSTDECREMENT_EXPR] = ansi_opname[(int) PREDECREMENT_EXPR];
628 ansi_opname[(int) COMPONENT_REF] = get_identifier ("__rf");
629 IDENTIFIER_OPNAME_P (ansi_opname[(int) COMPONENT_REF]) = 1;
630 ansi_opname[(int) MEMBER_REF] = get_identifier ("__rm");
631 IDENTIFIER_OPNAME_P (ansi_opname[(int) MEMBER_REF]) = 1;
632 ansi_opname[(int) CALL_EXPR] = get_identifier ("__cl");
633 IDENTIFIER_OPNAME_P (ansi_opname[(int) CALL_EXPR]) = 1;
634 ansi_opname[(int) ARRAY_REF] = get_identifier ("__vc");
635 IDENTIFIER_OPNAME_P (ansi_opname[(int) ARRAY_REF]) = 1;
636 ansi_opname[(int) NEW_EXPR] = get_identifier ("__nw");
637 IDENTIFIER_OPNAME_P (ansi_opname[(int) NEW_EXPR]) = 1;
638 ansi_opname[(int) DELETE_EXPR] = get_identifier ("__dl");
639 IDENTIFIER_OPNAME_P (ansi_opname[(int) DELETE_EXPR]) = 1;
640 ansi_opname[(int) VEC_NEW_EXPR] = get_identifier ("__vn");
641 IDENTIFIER_OPNAME_P (ansi_opname[(int) VEC_NEW_EXPR]) = 1;
642 ansi_opname[(int) VEC_DELETE_EXPR] = get_identifier ("__vd");
643 IDENTIFIER_OPNAME_P (ansi_opname[(int) VEC_DELETE_EXPR]) = 1;
644 ansi_opname[(int) TYPE_EXPR] = get_identifier ("__op");
645 IDENTIFIER_OPNAME_P (ansi_opname[(int) TYPE_EXPR]) = 1;
647 /* This is not true: these operators are not defined in ANSI,
648 but we need them anyway. */
649 ansi_opname[(int) MIN_EXPR] = get_identifier ("__mn");
650 IDENTIFIER_OPNAME_P (ansi_opname[(int) MIN_EXPR]) = 1;
651 ansi_opname[(int) MAX_EXPR] = get_identifier ("__mx");
652 IDENTIFIER_OPNAME_P (ansi_opname[(int) MAX_EXPR]) = 1;
653 ansi_opname[(int) COND_EXPR] = get_identifier ("__cn");
654 IDENTIFIER_OPNAME_P (ansi_opname[(int) COND_EXPR]) = 1;
655 ansi_opname[(int) SIZEOF_EXPR] = get_identifier ("__sz");
656 IDENTIFIER_OPNAME_P (ansi_opname[(int) SIZEOF_EXPR]) = 1;
660 gcc_obstack_init (&inline_text_obstack);
661 inline_text_firstobj = (char *) obstack_alloc (&inline_text_obstack, 0);
663 /* Start it at 0, because check_newline is called at the very beginning
664 and will increment it to 1. */
666 input_filename = "<internal>";
667 current_function_decl = NULL;
670 token_buffer = (char *) xmalloc (maxtoken + 2);
672 ridpointers[(int) RID_INT] = get_identifier ("int");
673 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_INT],
674 build_tree_list (NULL_TREE, ridpointers[(int) RID_INT]));
675 ridpointers[(int) RID_BOOL] = get_identifier ("bool");
676 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_BOOL],
677 build_tree_list (NULL_TREE, ridpointers[(int) RID_BOOL]));
678 ridpointers[(int) RID_CHAR] = get_identifier ("char");
679 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_CHAR],
680 build_tree_list (NULL_TREE, ridpointers[(int) RID_CHAR]));
681 ridpointers[(int) RID_VOID] = get_identifier ("void");
682 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VOID],
683 build_tree_list (NULL_TREE, ridpointers[(int) RID_VOID]));
684 ridpointers[(int) RID_FLOAT] = get_identifier ("float");
685 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_FLOAT],
686 build_tree_list (NULL_TREE, ridpointers[(int) RID_FLOAT]));
687 ridpointers[(int) RID_DOUBLE] = get_identifier ("double");
688 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_DOUBLE],
689 build_tree_list (NULL_TREE, ridpointers[(int) RID_DOUBLE]));
690 ridpointers[(int) RID_SHORT] = get_identifier ("short");
691 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_SHORT],
692 build_tree_list (NULL_TREE, ridpointers[(int) RID_SHORT]));
693 ridpointers[(int) RID_LONG] = get_identifier ("long");
694 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_LONG],
695 build_tree_list (NULL_TREE, ridpointers[(int) RID_LONG]));
696 ridpointers[(int) RID_UNSIGNED] = get_identifier ("unsigned");
697 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_UNSIGNED],
698 build_tree_list (NULL_TREE, ridpointers[(int) RID_UNSIGNED]));
699 ridpointers[(int) RID_SIGNED] = get_identifier ("signed");
700 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_SIGNED],
701 build_tree_list (NULL_TREE, ridpointers[(int) RID_SIGNED]));
702 ridpointers[(int) RID_INLINE] = get_identifier ("inline");
703 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_INLINE],
704 build_tree_list (NULL_TREE, ridpointers[(int) RID_INLINE]));
705 ridpointers[(int) RID_CONST] = get_identifier ("const");
706 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_CONST],
707 build_tree_list (NULL_TREE, ridpointers[(int) RID_CONST]));
708 ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile");
709 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VOLATILE],
710 build_tree_list (NULL_TREE, ridpointers[(int) RID_VOLATILE]));
711 ridpointers[(int) RID_AUTO] = get_identifier ("auto");
712 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_AUTO],
713 build_tree_list (NULL_TREE, ridpointers[(int) RID_AUTO]));
714 ridpointers[(int) RID_STATIC] = get_identifier ("static");
715 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_STATIC],
716 build_tree_list (NULL_TREE, ridpointers[(int) RID_STATIC]));
717 ridpointers[(int) RID_EXTERN] = get_identifier ("extern");
718 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_EXTERN],
719 build_tree_list (NULL_TREE, ridpointers[(int) RID_EXTERN]));
720 ridpointers[(int) RID_TYPEDEF] = get_identifier ("typedef");
721 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_TYPEDEF],
722 build_tree_list (NULL_TREE, ridpointers[(int) RID_TYPEDEF]));
723 ridpointers[(int) RID_REGISTER] = get_identifier ("register");
724 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_REGISTER],
725 build_tree_list (NULL_TREE, ridpointers[(int) RID_REGISTER]));
726 ridpointers[(int) RID_COMPLEX] = get_identifier ("__complex");
727 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_COMPLEX],
728 build_tree_list (NULL_TREE, ridpointers[(int) RID_COMPLEX]));
730 /* C++ extensions. These are probably not correctly named. */
731 ridpointers[(int) RID_WCHAR] = get_identifier ("__wchar_t");
732 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_WCHAR],
733 build_tree_list (NULL_TREE, ridpointers[(int) RID_WCHAR]));
734 class_type_node = build_int_2 (class_type, 0);
735 TREE_TYPE (class_type_node) = class_type_node;
736 ridpointers[(int) RID_CLASS] = class_type_node;
738 record_type_node = build_int_2 (record_type, 0);
739 TREE_TYPE (record_type_node) = record_type_node;
740 ridpointers[(int) RID_RECORD] = record_type_node;
742 union_type_node = build_int_2 (union_type, 0);
743 TREE_TYPE (union_type_node) = union_type_node;
744 ridpointers[(int) RID_UNION] = union_type_node;
746 enum_type_node = build_int_2 (enum_type, 0);
747 TREE_TYPE (enum_type_node) = enum_type_node;
748 ridpointers[(int) RID_ENUM] = enum_type_node;
750 ridpointers[(int) RID_VIRTUAL] = get_identifier ("virtual");
751 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VIRTUAL],
752 build_tree_list (NULL_TREE, ridpointers[(int) RID_VIRTUAL]));
753 ridpointers[(int) RID_EXPLICIT] = get_identifier ("explicit");
754 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_EXPLICIT],
755 build_tree_list (NULL_TREE, ridpointers[(int) RID_EXPLICIT]));
756 ridpointers[(int) RID_FRIEND] = get_identifier ("friend");
757 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_FRIEND],
758 build_tree_list (NULL_TREE, ridpointers[(int) RID_FRIEND]));
760 ridpointers[(int) RID_PUBLIC] = get_identifier ("public");
761 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PUBLIC],
762 build_tree_list (NULL_TREE, ridpointers[(int) RID_PUBLIC]));
763 ridpointers[(int) RID_PRIVATE] = get_identifier ("private");
764 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PRIVATE],
765 build_tree_list (NULL_TREE, ridpointers[(int) RID_PRIVATE]));
766 ridpointers[(int) RID_PROTECTED] = get_identifier ("protected");
767 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PROTECTED],
768 build_tree_list (NULL_TREE, ridpointers[(int) RID_PROTECTED]));
769 ridpointers[(int) RID_TEMPLATE] = get_identifier ("template");
770 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_TEMPLATE],
771 build_tree_list (NULL_TREE, ridpointers[(int) RID_TEMPLATE]));
772 /* This is for ANSI C++. */
773 ridpointers[(int) RID_MUTABLE] = get_identifier ("mutable");
774 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_MUTABLE],
775 build_tree_list (NULL_TREE, ridpointers[(int) RID_MUTABLE]));
777 /* Signature handling extensions. */
778 signature_type_node = build_int_2 (signature_type, 0);
779 TREE_TYPE (signature_type_node) = signature_type_node;
780 ridpointers[(int) RID_SIGNATURE] = signature_type_node;
782 null_node = build_int_2 (0, 0);
783 ridpointers[RID_NULL] = null_node;
785 opname_tab[(int) COMPONENT_REF] = "->";
786 opname_tab[(int) MEMBER_REF] = "->*";
787 opname_tab[(int) INDIRECT_REF] = "*";
788 opname_tab[(int) ARRAY_REF] = "[]";
789 opname_tab[(int) MODIFY_EXPR] = "=";
790 opname_tab[(int) NEW_EXPR] = "new";
791 opname_tab[(int) DELETE_EXPR] = "delete";
792 opname_tab[(int) VEC_NEW_EXPR] = "new []";
793 opname_tab[(int) VEC_DELETE_EXPR] = "delete []";
794 opname_tab[(int) COND_EXPR] = "?:";
795 opname_tab[(int) CALL_EXPR] = "()";
796 opname_tab[(int) PLUS_EXPR] = "+";
797 opname_tab[(int) MINUS_EXPR] = "-";
798 opname_tab[(int) MULT_EXPR] = "*";
799 opname_tab[(int) TRUNC_DIV_EXPR] = "/";
800 opname_tab[(int) CEIL_DIV_EXPR] = "(ceiling /)";
801 opname_tab[(int) FLOOR_DIV_EXPR] = "(floor /)";
802 opname_tab[(int) ROUND_DIV_EXPR] = "(round /)";
803 opname_tab[(int) TRUNC_MOD_EXPR] = "%";
804 opname_tab[(int) CEIL_MOD_EXPR] = "(ceiling %)";
805 opname_tab[(int) FLOOR_MOD_EXPR] = "(floor %)";
806 opname_tab[(int) ROUND_MOD_EXPR] = "(round %)";
807 opname_tab[(int) NEGATE_EXPR] = "-";
808 opname_tab[(int) MIN_EXPR] = "<?";
809 opname_tab[(int) MAX_EXPR] = ">?";
810 opname_tab[(int) ABS_EXPR] = "abs";
811 opname_tab[(int) FFS_EXPR] = "ffs";
812 opname_tab[(int) LSHIFT_EXPR] = "<<";
813 opname_tab[(int) RSHIFT_EXPR] = ">>";
814 opname_tab[(int) BIT_IOR_EXPR] = "|";
815 opname_tab[(int) BIT_XOR_EXPR] = "^";
816 opname_tab[(int) BIT_AND_EXPR] = "&";
817 opname_tab[(int) BIT_ANDTC_EXPR] = "&~";
818 opname_tab[(int) BIT_NOT_EXPR] = "~";
819 opname_tab[(int) TRUTH_ANDIF_EXPR] = "&&";
820 opname_tab[(int) TRUTH_ORIF_EXPR] = "||";
821 opname_tab[(int) TRUTH_AND_EXPR] = "strict &&";
822 opname_tab[(int) TRUTH_OR_EXPR] = "strict ||";
823 opname_tab[(int) TRUTH_NOT_EXPR] = "!";
824 opname_tab[(int) LT_EXPR] = "<";
825 opname_tab[(int) LE_EXPR] = "<=";
826 opname_tab[(int) GT_EXPR] = ">";
827 opname_tab[(int) GE_EXPR] = ">=";
828 opname_tab[(int) EQ_EXPR] = "==";
829 opname_tab[(int) NE_EXPR] = "!=";
830 opname_tab[(int) IN_EXPR] = "in";
831 opname_tab[(int) RANGE_EXPR] = "...";
832 opname_tab[(int) CONVERT_EXPR] = "+";
833 opname_tab[(int) ADDR_EXPR] = "&";
834 opname_tab[(int) PREDECREMENT_EXPR] = "--";
835 opname_tab[(int) PREINCREMENT_EXPR] = "++";
836 opname_tab[(int) POSTDECREMENT_EXPR] = "--";
837 opname_tab[(int) POSTINCREMENT_EXPR] = "++";
838 opname_tab[(int) COMPOUND_EXPR] = ",";
840 assignop_tab[(int) NOP_EXPR] = "=";
841 assignop_tab[(int) PLUS_EXPR] = "+=";
842 assignop_tab[(int) CONVERT_EXPR] = "+=";
843 assignop_tab[(int) MINUS_EXPR] = "-=";
844 assignop_tab[(int) NEGATE_EXPR] = "-=";
845 assignop_tab[(int) MULT_EXPR] = "*=";
846 assignop_tab[(int) INDIRECT_REF] = "*=";
847 assignop_tab[(int) TRUNC_DIV_EXPR] = "/=";
848 assignop_tab[(int) EXACT_DIV_EXPR] = "(exact /=)";
849 assignop_tab[(int) CEIL_DIV_EXPR] = "(ceiling /=)";
850 assignop_tab[(int) FLOOR_DIV_EXPR] = "(floor /=)";
851 assignop_tab[(int) ROUND_DIV_EXPR] = "(round /=)";
852 assignop_tab[(int) TRUNC_MOD_EXPR] = "%=";
853 assignop_tab[(int) CEIL_MOD_EXPR] = "(ceiling %=)";
854 assignop_tab[(int) FLOOR_MOD_EXPR] = "(floor %=)";
855 assignop_tab[(int) ROUND_MOD_EXPR] = "(round %=)";
856 assignop_tab[(int) MIN_EXPR] = "<?=";
857 assignop_tab[(int) MAX_EXPR] = ">?=";
858 assignop_tab[(int) LSHIFT_EXPR] = "<<=";
859 assignop_tab[(int) RSHIFT_EXPR] = ">>=";
860 assignop_tab[(int) BIT_IOR_EXPR] = "|=";
861 assignop_tab[(int) BIT_XOR_EXPR] = "^=";
862 assignop_tab[(int) BIT_AND_EXPR] = "&=";
863 assignop_tab[(int) ADDR_EXPR] = "&=";
865 init_filename_times ();
867 /* Some options inhibit certain reserved words.
868 Clear those words out of the hash table so they won't be recognized. */
869 #define UNSET_RESERVED_WORD(STRING) \
870 do { struct resword *s = is_reserved_word (STRING, sizeof (STRING) - 1); \
871 if (s) s->name = ""; } while (0)
874 /* let's parse things, and if they use it, then give them an error. */
875 if (!flag_exceptions)
877 UNSET_RESERVED_WORD ("throw");
878 UNSET_RESERVED_WORD ("try");
879 UNSET_RESERVED_WORD ("catch");
883 if (!flag_rtti || flag_no_gnu_keywords)
885 UNSET_RESERVED_WORD ("classof");
886 UNSET_RESERVED_WORD ("headof");
889 if (! flag_handle_signatures || flag_no_gnu_keywords)
891 /* Easiest way to not recognize signature
892 handling extensions... */
893 UNSET_RESERVED_WORD ("signature");
894 UNSET_RESERVED_WORD ("sigof");
896 if (flag_no_asm || flag_no_gnu_keywords)
897 UNSET_RESERVED_WORD ("typeof");
898 if (! flag_operator_names)
900 /* These are new ANSI keywords that may break code. */
901 UNSET_RESERVED_WORD ("and");
902 UNSET_RESERVED_WORD ("and_eq");
903 UNSET_RESERVED_WORD ("bitand");
904 UNSET_RESERVED_WORD ("bitor");
905 UNSET_RESERVED_WORD ("compl");
906 UNSET_RESERVED_WORD ("not");
907 UNSET_RESERVED_WORD ("not_eq");
908 UNSET_RESERVED_WORD ("or");
909 UNSET_RESERVED_WORD ("or_eq");
910 UNSET_RESERVED_WORD ("xor");
911 UNSET_RESERVED_WORD ("xor_eq");
914 token_count = init_cpp_parse ();
915 interface_unknown = 1;
924 cpp_finish (&parse_in);
931 reinit_parse_for_function ()
933 current_base_init_list = NULL_TREE;
934 current_member_init_list = NULL_TREE;
941 yyprint (file, yychar, yylval)
953 case IDENTIFIER_DEFN:
957 case PRE_PARSED_CLASS_DECL:
959 if (TREE_CODE (t) == TYPE_DECL || TREE_CODE (t) == TEMPLATE_DECL)
961 fprintf (file, " `%s'", IDENTIFIER_POINTER (DECL_NAME (t)));
964 my_friendly_assert (TREE_CODE (t) == IDENTIFIER_NODE, 224);
965 if (IDENTIFIER_POINTER (t))
966 fprintf (file, " `%s'", IDENTIFIER_POINTER (t));
969 if (yylval.ttype == class_type_node)
970 fprintf (file, " `class'");
971 else if (yylval.ttype == record_type_node)
972 fprintf (file, " `struct'");
973 else if (yylval.ttype == union_type_node)
974 fprintf (file, " `union'");
975 else if (yylval.ttype == enum_type_node)
976 fprintf (file, " `enum'");
977 else if (yylval.ttype == signature_type_node)
978 fprintf (file, " `signature'");
980 my_friendly_abort (80);
985 #if defined(GATHER_STATISTICS) && defined(REDUCE_LENGTH)
986 static int *reduce_count;
992 #define REDUCE_LENGTH (sizeof (yyr2) / sizeof (yyr2[0]))
993 #define TOKEN_LENGTH (256 + sizeof (yytname) / sizeof (yytname[0]))
996 #ifdef GATHER_STATISTICS
1002 reduce_count[yyn] += 1;
1009 return reduce_count[*q] - reduce_count[*p];
1016 return token_count[*q] - token_count[*p];
1022 print_parse_statistics ()
1024 #ifdef GATHER_STATISTICS
1025 #ifdef REDUCE_LENGTH
1028 int maxlen = REDUCE_LENGTH;
1031 if (reduce_count[-1] == 0)
1034 if (TOKEN_LENGTH > REDUCE_LENGTH)
1035 maxlen = TOKEN_LENGTH;
1036 sorted = (unsigned *) alloca (sizeof (int) * maxlen);
1038 for (i = 0; i < TOKEN_LENGTH; i++)
1040 qsort (sorted, TOKEN_LENGTH, sizeof (int), token_cmp);
1041 for (i = 0; i < TOKEN_LENGTH; i++)
1043 int idx = sorted[i];
1044 if (token_count[idx] == 0)
1046 if (token_count[idx] < token_count[-1])
1048 fprintf (stderr, "token %d, `%s', count = %d\n",
1049 idx, yytname[YYTRANSLATE (idx)], token_count[idx]);
1051 fprintf (stderr, "\n");
1052 for (i = 0; i < REDUCE_LENGTH; i++)
1054 qsort (sorted, REDUCE_LENGTH, sizeof (int), reduce_cmp);
1055 for (i = 0; i < REDUCE_LENGTH; i++)
1057 int idx = sorted[i];
1058 if (reduce_count[idx] == 0)
1060 if (reduce_count[idx] < reduce_count[-1])
1062 fprintf (stderr, "rule %d, line %d, count = %d\n",
1063 idx, yyrline[idx], reduce_count[idx]);
1065 fprintf (stderr, "\n");
1071 /* Sets the value of the 'yydebug' variable to VALUE.
1072 This is a function so we don't have to have YYDEBUG defined
1073 in order to build the compiler. */
1083 warning ("YYDEBUG not defined.");
1088 /* Functions and data structures for #pragma interface.
1090 `#pragma implementation' means that the main file being compiled
1091 is considered to implement (provide) the classes that appear in
1092 its main body. I.e., if this is file "foo.cc", and class `bar'
1093 is defined in "foo.cc", then we say that "foo.cc implements bar".
1095 All main input files "implement" themselves automagically.
1097 `#pragma interface' means that unless this file (of the form "foo.h"
1098 is not presently being included by file "foo.cc", the
1099 CLASSTYPE_INTERFACE_ONLY bit gets set. The effect is that none
1100 of the vtables nor any of the inline functions defined in foo.h
1101 will ever be output.
1103 There are cases when we want to link files such as "defs.h" and
1104 "main.cc". In this case, we give "defs.h" a `#pragma interface',
1105 and "main.cc" has `#pragma implementation "defs.h"'. */
1110 struct impl_files *next;
1113 static struct impl_files *impl_file_chain;
1115 /* Helper function to load global variables with interface
1119 extract_interface_info ()
1123 if (flag_alt_external_templates)
1125 struct tinst_level *til = tinst_for_decl ();
1128 fileinfo = get_time_identifier (til->file);
1131 fileinfo = get_time_identifier (input_filename);
1132 fileinfo = IDENTIFIER_CLASS_VALUE (fileinfo);
1133 interface_only = TREE_INT_CST_LOW (fileinfo);
1134 interface_unknown = TREE_INT_CST_HIGH (fileinfo);
1137 /* Return nonzero if S is not considered part of an
1138 INTERFACE/IMPLEMENTATION pair. Otherwise, return 0. */
1141 interface_strcmp (s)
1144 /* Set the interface/implementation bits for this scope. */
1145 struct impl_files *ifiles;
1148 for (ifiles = impl_file_chain; ifiles; ifiles = ifiles->next)
1150 char *t1 = ifiles->filename;
1153 if (*s1 != *t1 || *s1 == 0)
1156 while (*s1 == *t1 && *s1 != 0)
1163 /* Don't get faked out by xxx.yyy.cc vs xxx.zzz.cc. */
1164 if (index (s1, '.') || index (t1, '.'))
1167 if (*s1 == '\0' || s1[-1] != '.' || t1[-1] != '.')
1179 set_typedecl_interface_info (prev, vars)
1182 tree id = get_time_identifier (DECL_SOURCE_FILE (vars));
1183 tree fileinfo = IDENTIFIER_CLASS_VALUE (id);
1184 tree type = TREE_TYPE (vars);
1186 CLASSTYPE_INTERFACE_ONLY (type) = TREE_INT_CST_LOW (fileinfo)
1187 = interface_strcmp (file_name_nondirectory (DECL_SOURCE_FILE (vars)));
1191 set_vardecl_interface_info (prev, vars)
1194 tree type = DECL_CONTEXT (vars);
1196 if (CLASSTYPE_INTERFACE_KNOWN (type))
1198 if (CLASSTYPE_INTERFACE_ONLY (type))
1199 set_typedecl_interface_info (prev, TYPE_MAIN_DECL (type));
1201 CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 1;
1202 DECL_EXTERNAL (vars) = CLASSTYPE_INTERFACE_ONLY (type);
1203 TREE_PUBLIC (vars) = 1;
1209 /* Called from the top level: if there are any pending inlines to
1210 do, set up to process them now. This function sets up the first function
1211 to be parsed; after it has been, the rule for fndef in parse.y will
1212 call process_next_inline to start working on the next one. */
1215 do_pending_inlines ()
1217 struct pending_inline *t;
1220 /* Oops, we're still dealing with the last batch. */
1221 if (yychar == PRE_PARSED_FUNCTION_DECL)
1224 /* Reverse the pending inline functions, since
1225 they were cons'd instead of appended. */
1227 struct pending_inline *prev = 0, *tail;
1228 t = pending_inlines;
1229 pending_inlines = 0;
1244 /* Now start processing the first inline function. */
1245 context = hack_decl_function_context (t->fndecl);
1247 push_cp_function_context (context);
1248 maybe_begin_member_template_processing (t->fndecl);
1251 feed_input (t->buf, t->len);
1254 if (input_filename != t->filename)
1256 input_filename = t->filename;
1257 /* Get interface/implementation back in sync. */
1258 extract_interface_info ();
1261 input_filename = t->filename;
1262 interface_unknown = t->interface == 1;
1263 interface_only = t->interface == 0;
1265 yychar = PRE_PARSED_FUNCTION_DECL;
1267 /* Pass back a handle on the rest of the inline functions, so that they
1268 can be processed later. */
1269 yylval.ttype = build_tree_list ((tree) t, t->fndecl);
1270 DECL_PENDING_INLINE_INFO (t->fndecl) = 0;
1273 static int nextchar = -1;
1275 /* Called from the fndecl rule in the parser when the function just parsed
1276 was declared using a PRE_PARSED_FUNCTION_DECL (i.e. came from
1277 do_pending_inlines). */
1280 process_next_inline (t)
1284 struct pending_inline *i = (struct pending_inline *) TREE_PURPOSE (t);
1285 context = hack_decl_function_context (i->fndecl);
1286 maybe_end_member_template_processing (i->fndecl);
1288 pop_cp_function_context (context);
1290 if (yychar == YYEMPTY)
1292 if (yychar != END_OF_SAVED_INPUT)
1294 error ("parse error at end of saved function text");
1296 /* restore_pending_input will abort unless yychar is either
1297 END_OF_SAVED_INPUT or YYEMPTY; since we already know we're
1298 hosed, feed back YYEMPTY. We also need to discard nextchar,
1299 since that may have gotten set as well. */
1304 if (i && i->fndecl != NULL_TREE)
1306 context = hack_decl_function_context (i->fndecl);
1308 push_cp_function_context (context);
1309 maybe_begin_member_template_processing (i->fndecl);
1310 feed_input (i->buf, i->len);
1312 input_filename = i->filename;
1313 yychar = PRE_PARSED_FUNCTION_DECL;
1314 yylval.ttype = build_tree_list ((tree) i, i->fndecl);
1315 DECL_PENDING_INLINE_INFO (i->fndecl) = 0;
1319 interface_unknown = i->interface == 1;
1320 interface_only = i->interface == 0;
1323 extract_interface_info ();
1326 /* Since inline methods can refer to text which has not yet been seen,
1327 we store the text of the method in a structure which is placed in the
1328 DECL_PENDING_INLINE_INFO field of the FUNCTION_DECL.
1329 After parsing the body of the class definition, the FUNCTION_DECL's are
1330 scanned to see which ones have this field set. Those are then digested
1333 This function's FUNCTION_DECL will have a bit set in its common so
1334 that we know to watch out for it. */
1337 consume_string (this_obstack, matching_char)
1338 register struct obstack *this_obstack;
1342 int starting_lineno = lineno;
1348 int save_lineno = lineno;
1349 lineno = starting_lineno;
1350 if (matching_char == '"')
1351 error ("end of file encountered inside string constant");
1353 error ("end of file encountered inside character constant");
1354 lineno = save_lineno;
1359 obstack_1grow (this_obstack, c);
1361 obstack_1grow (this_obstack, c);
1363 /* Make sure we continue the loop */
1370 pedwarn ("ANSI C++ forbids newline in string constant");
1373 obstack_1grow (this_obstack, c);
1375 while (c != matching_char);
1378 static int nextyychar = YYEMPTY;
1379 static YYSTYPE nextyylval;
1381 struct pending_input {
1382 int nextchar, yychar, nextyychar, eof;
1383 YYSTYPE yylval, nextyylval;
1384 struct obstack token_obstack;
1388 struct pending_input *
1389 save_pending_input ()
1391 struct pending_input *p;
1392 p = (struct pending_input *) xmalloc (sizeof (struct pending_input));
1393 p->nextchar = nextchar;
1395 p->nextyychar = nextyychar;
1397 p->nextyylval = nextyylval;
1398 p->eof = end_of_file;
1399 yychar = nextyychar = YYEMPTY;
1401 p->first_token = first_token;
1402 p->token_obstack = token_obstack;
1405 gcc_obstack_init (&token_obstack);
1411 restore_pending_input (p)
1412 struct pending_input *p;
1414 my_friendly_assert (nextchar == -1, 229);
1415 nextchar = p->nextchar;
1416 my_friendly_assert (yychar == YYEMPTY || yychar == END_OF_SAVED_INPUT, 230);
1418 my_friendly_assert (nextyychar == YYEMPTY, 231);
1419 nextyychar = p->nextyychar;
1421 nextyylval = p->nextyylval;
1422 first_token = p->first_token;
1423 obstack_free (&token_obstack, (char *) 0);
1424 token_obstack = p->token_obstack;
1425 end_of_file = p->eof;
1429 /* Unget character CH from the input stream.
1430 If RESCAN is non-zero, then we want to `see' this
1431 character as the next input token. */
1434 yyungetc (ch, rescan)
1438 /* Unget a character from the input stream. */
1439 if (yychar == YYEMPTY || rescan == 0)
1442 put_back (nextchar);
1447 my_friendly_assert (nextyychar == YYEMPTY, 232);
1448 nextyychar = yychar;
1449 nextyylval = yylval;
1455 clear_inline_text_obstack ()
1457 obstack_free (&inline_text_obstack, inline_text_firstobj);
1460 /* This function stores away the text for an inline function that should
1461 be processed later. It decides how much later, and may need to move
1462 the info between obstacks; therefore, the caller should not refer to
1463 the T parameter after calling this function. */
1466 store_pending_inline (decl, t)
1468 struct pending_inline *t;
1471 DECL_PENDING_INLINE_INFO (decl) = t;
1473 /* Because we use obstacks, we must process these in precise order. */
1474 t->next = pending_inlines;
1475 pending_inlines = t;
1479 reinit_parse_for_method (yychar, decl)
1484 int starting_lineno = lineno;
1485 char *starting_filename = input_filename;
1487 reinit_parse_for_block (yychar, &inline_text_obstack);
1489 len = obstack_object_size (&inline_text_obstack);
1490 current_base_init_list = NULL_TREE;
1491 current_member_init_list = NULL_TREE;
1492 if (decl == void_type_node
1493 || (current_class_type && TYPE_REDEFINED (current_class_type)))
1495 /* Happens when we get two declarations of the same
1496 function in the same scope. */
1497 char *buf = obstack_finish (&inline_text_obstack);
1498 obstack_free (&inline_text_obstack, buf);
1503 struct pending_inline *t;
1504 char *buf = obstack_finish (&inline_text_obstack);
1506 t = (struct pending_inline *) obstack_alloc (&inline_text_obstack,
1507 sizeof (struct pending_inline));
1508 t->lineno = starting_lineno;
1509 t->filename = starting_filename;
1516 if (interface_unknown && processing_template_defn && flag_external_templates && ! DECL_IN_SYSTEM_HEADER (decl))
1517 warn_if_unknown_interface (decl);
1519 t->interface = (interface_unknown ? 1 : (interface_only ? 0 : 2));
1520 store_pending_inline (decl, t);
1524 /* Consume a block -- actually, a method beginning
1525 with `:' or `{' -- and save it away on the specified obstack. */
1528 reinit_parse_for_block (pyychar, obstackp)
1530 struct obstack *obstackp;
1534 int starting_lineno = lineno;
1535 char *starting_filename = input_filename;
1537 int look_for_semicolon = 0;
1538 int look_for_lbrac = 0;
1541 obstack_1grow (obstackp, '{');
1542 else if (pyychar == '=')
1543 look_for_semicolon = 1;
1544 else if (pyychar == ':')
1546 obstack_1grow (obstackp, pyychar);
1550 else if (pyychar == RETURN)
1552 obstack_grow (obstackp, "return", 6);
1556 else if (pyychar == TRY)
1558 obstack_grow (obstackp, "try", 3);
1564 yyerror ("parse error in method specification");
1565 obstack_1grow (obstackp, '{');
1568 if (nextchar != EOF)
1578 int this_lineno = lineno;
1580 c = skip_white_space (c);
1582 /* Don't lose our cool if there are lots of comments. */
1583 if (lineno == this_lineno + 1)
1584 obstack_1grow (obstackp, '\n');
1585 else if (lineno == this_lineno)
1587 else if (lineno - this_lineno < 10)
1590 for (i = lineno - this_lineno; i > 0; i--)
1591 obstack_1grow (obstackp, '\n');
1596 sprintf (buf, "\n# %d \"", lineno);
1598 obstack_grow (obstackp, buf, len);
1600 len = strlen (input_filename);
1601 obstack_grow (obstackp, input_filename, len);
1602 obstack_1grow (obstackp, '\"');
1603 obstack_1grow (obstackp, '\n');
1606 while (c > ' ') /* ASCII dependent... */
1608 obstack_1grow (obstackp, c);
1617 if (blev == 0 && !look_for_semicolon)
1621 if (peekyylex () == CATCH)
1624 obstack_grow (obstackp, " catch ", 7);
1641 /* Don't act on the next character...e.g, doing an escaped
1646 error_with_file_and_line (starting_filename,
1648 "end of file read inside definition");
1651 obstack_1grow (obstackp, c);
1654 consume_string (obstackp, c);
1656 consume_string (obstackp, c);
1661 error ("function body for constructor missing");
1662 obstack_1grow (obstackp, '{');
1663 obstack_1grow (obstackp, '}');
1667 else if (look_for_semicolon && blev == 0)
1675 error_with_file_and_line (starting_filename,
1677 "end of file read inside definition");
1682 obstack_1grow (obstackp, c);
1687 obstack_1grow (obstackp, '\0');
1690 /* Consume a no-commas expression -- actually, a default argument -- and
1691 save it away on the specified obstack. */
1694 reinit_parse_for_expr (obstackp)
1695 struct obstack *obstackp;
1698 int starting_lineno = lineno;
1699 char *starting_filename = input_filename;
1703 if (nextchar != EOF)
1713 int this_lineno = lineno;
1715 c = skip_white_space (c);
1717 /* Don't lose our cool if there are lots of comments. */
1718 if (lineno == this_lineno + 1)
1719 obstack_1grow (obstackp, '\n');
1720 else if (lineno == this_lineno)
1722 else if (lineno - this_lineno < 10)
1725 for (i = lineno - this_lineno; i > 0; --i)
1726 obstack_1grow (obstackp, '\n');
1731 sprintf (buf, "\n# %d \"", lineno);
1733 obstack_grow (obstackp, buf, len);
1735 len = strlen (input_filename);
1736 obstack_grow (obstackp, input_filename, len);
1737 obstack_1grow (obstackp, '\"');
1738 obstack_1grow (obstackp, '\n');
1741 while (c > ' ') /* ASCII dependent... */
1743 if (plev <= 0 && (c == ')' || c == ','))
1748 obstack_1grow (obstackp, c);
1749 if (c == '(' || c == '[')
1751 else if (c == ']' || c == ')')
1755 /* Don't act on the next character...e.g, doing an escaped
1760 error_with_file_and_line (starting_filename,
1762 "end of file read inside definition");
1765 obstack_1grow (obstackp, c);
1768 consume_string (obstackp, c);
1770 consume_string (obstackp, c);
1776 error_with_file_and_line (starting_filename,
1778 "end of file read inside definition");
1783 obstack_1grow (obstackp, c);
1788 obstack_1grow (obstackp, '\0');
1791 int do_snarf_defarg;
1793 /* Decide whether the default argument we are about to see should be
1794 gobbled up as text for later parsing. */
1797 maybe_snarf_defarg ()
1799 if (current_class_type && TYPE_BEING_DEFINED (current_class_type))
1800 do_snarf_defarg = 1;
1803 /* When we see a default argument in a method declaration, we snarf it as
1804 text using snarf_defarg. When we get up to namespace scope, we then go
1805 through and parse all of them using do_pending_defargs. Since yacc
1806 parsers are not reentrant, we retain defargs state in these two
1807 variables so that subsequent calls to do_pending_defargs can resume
1808 where the previous call left off. */
1820 reinit_parse_for_expr (&inline_text_obstack);
1821 len = obstack_object_size (&inline_text_obstack);
1822 buf = obstack_finish (&inline_text_obstack);
1824 push_obstacks (&inline_text_obstack, &inline_text_obstack);
1825 arg = make_node (DEFAULT_ARG);
1826 DEFARG_LENGTH (arg) = len - 1;
1827 DEFARG_POINTER (arg) = buf;
1833 /* Called from grokfndecl to note a function decl with unparsed default
1834 arguments for later processing. Also called from grokdeclarator
1835 for function types with unparsed defargs; the call from grokfndecl
1836 will always come second, so we can overwrite the entry from the type. */
1839 add_defarg_fn (decl)
1842 if (TREE_CODE (decl) == FUNCTION_DECL)
1843 TREE_VALUE (defarg_fns) = decl;
1846 push_obstacks (&inline_text_obstack, &inline_text_obstack);
1847 defarg_fns = tree_cons (current_class_type, decl, defarg_fns);
1852 /* Helper for do_pending_defargs. Starts the parsing of a default arg. */
1858 tree d = TREE_PURPOSE (p);
1859 feed_input (DEFARG_POINTER (d), DEFARG_LENGTH (d));
1860 if (TREE_CODE (f) == FUNCTION_DECL)
1862 lineno = DECL_SOURCE_LINE (f);
1863 input_filename = DECL_SOURCE_FILE (f);
1865 yychar = DEFARG_MARKER;
1869 /* Helper for do_pending_defargs. Ends the parsing of a default arg. */
1874 if (yychar == YYEMPTY)
1876 if (yychar != END_OF_SAVED_INPUT)
1878 error ("parse error at end of saved function text");
1880 /* restore_pending_input will abort unless yychar is either
1881 END_OF_SAVED_INPUT or YYEMPTY; since we already know we're
1882 hosed, feed back YYEMPTY. We also need to discard nextchar,
1883 since that may have gotten set as well. */
1890 /* Main function for deferred parsing of default arguments. Called from
1894 do_pending_defargs ()
1899 for (; defarg_fns; defarg_fns = TREE_CHAIN (defarg_fns))
1901 tree defarg_fn = TREE_VALUE (defarg_fns);
1902 if (defarg_parm == NULL_TREE)
1904 push_nested_class (TREE_PURPOSE (defarg_fns), 1);
1906 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1907 maybe_begin_member_template_processing (defarg_fn);
1909 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1913 for (p = DECL_ARGUMENTS (defarg_fn); p; p = TREE_CHAIN (p))
1914 pushdecl (copy_node (p));
1916 defarg_parm = TYPE_ARG_TYPES (TREE_TYPE (defarg_fn));
1919 defarg_parm = TYPE_ARG_TYPES (defarg_fn);
1922 defarg_parm = TREE_CHAIN (defarg_parm);
1924 for (; defarg_parm; defarg_parm = TREE_CHAIN (defarg_parm))
1925 if (TREE_PURPOSE (defarg_parm)
1926 && TREE_CODE (TREE_PURPOSE (defarg_parm)) == DEFAULT_ARG)
1928 feed_defarg (defarg_fn, defarg_parm);
1930 /* Return to the parser, which will process this defarg
1931 and call us again. */
1935 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1937 maybe_end_member_template_processing (defarg_fn);
1938 check_default_args (defarg_fn);
1942 pop_nested_class (1);
1946 /* Build a default function named NAME for type TYPE.
1947 KIND says what to build.
1949 When KIND == 0, build default destructor.
1950 When KIND == 1, build virtual destructor.
1951 When KIND == 2, build default constructor.
1952 When KIND == 3, build default X(const X&) constructor.
1953 When KIND == 4, build default X(X&) constructor.
1954 When KIND == 5, build default operator = (const X&).
1955 When KIND == 6, build default operator = (X&). */
1958 cons_up_default_function (type, full_name, kind)
1959 tree type, full_name;
1962 extern tree void_list_node;
1963 tree declspecs = NULL_TREE;
1964 tree fn, args = NULL_TREE;
1967 tree name = constructor_name (full_name);
1973 declspecs = build_decl_list (NULL_TREE, ridpointers [(int) RID_VIRTUAL]);
1974 /* Fall through... */
1976 name = build_parse_node (BIT_NOT_EXPR, name);
1977 args = void_list_node;
1981 /* Default constructor. */
1982 args = void_list_node;
1986 type = build_type_variant (type, 1, 0);
1987 /* Fall through... */
1989 /* According to ARM $12.8, the default copy ctor will be declared, but
1990 not defined, unless it's needed. */
1991 argtype = build_reference_type (type);
1992 args = tree_cons (NULL_TREE,
1993 build_tree_list (hash_tree_chain (argtype, NULL_TREE),
1994 get_identifier ("_ctor_arg")),
2001 declspecs = build_decl_list (NULL_TREE, type);
2004 type = build_type_variant (type, 1, 0);
2006 name = ansi_opname [(int) MODIFY_EXPR];
2008 argtype = build_reference_type (type);
2009 args = tree_cons (NULL_TREE,
2010 build_tree_list (hash_tree_chain (argtype, NULL_TREE),
2011 get_identifier ("_ctor_arg")),
2016 my_friendly_abort (59);
2019 declspecs = decl_tree_cons (NULL_TREE, ridpointers [(int) RID_INLINE],
2022 TREE_PARMLIST (args) = 1;
2025 tree declarator = make_call_declarator (name, args, NULL_TREE, NULL_TREE);
2027 declarator = build_parse_node (ADDR_EXPR, declarator);
2029 fn = grokfield (declarator, declspecs, NULL_TREE, NULL_TREE, NULL_TREE);
2032 if (fn == void_type_node)
2036 SET_DECL_ARTIFICIAL (TREE_CHAIN (DECL_ARGUMENTS (fn)));
2039 if (processing_template_defn)
2041 SET_DECL_IMPLICIT_INSTANTIATION (fn);
2042 repo_template_used (fn);
2047 if (CLASSTYPE_INTERFACE_KNOWN (type))
2049 DECL_INTERFACE_KNOWN (fn) = 1;
2050 DECL_NOT_REALLY_EXTERN (fn) = (!CLASSTYPE_INTERFACE_ONLY (type)
2051 && flag_implement_inlines);
2055 DECL_NOT_REALLY_EXTERN (fn) = 1;
2057 mark_inline_for_output (fn);
2059 #ifdef DEBUG_DEFAULT_FUNCTIONS
2060 { char *fn_type = NULL;
2064 case 0: fn_type = "default destructor"; break;
2065 case 1: fn_type = "virtual destructor"; break;
2066 case 2: fn_type = "default constructor"; break;
2067 case 3: fn_type = "default X(const X&)"; break;
2068 case 4: fn_type = "default X(X&)"; break;
2072 if (TREE_CODE (name) == BIT_NOT_EXPR)
2073 t = TREE_OPERAND (name, 0);
2074 fprintf (stderr, "[[[[ %s for %s:\n%s]]]]\n", fn_type,
2075 IDENTIFIER_POINTER (t), func_buf);
2078 #endif /* DEBUG_DEFAULT_FUNCTIONS */
2080 /* Show that this function was generated by the compiler. */
2081 SET_DECL_ARTIFICIAL (fn);
2086 /* Heuristic to tell whether the user is missing a semicolon
2087 after a struct or enum declaration. Emit an error message
2088 if we know the user has blown it. */
2091 check_for_missing_semicolon (type)
2099 && yychar != IDENTIFIER
2100 && yychar != TYPENAME
2101 && yychar != CV_QUALIFIER
2102 && yychar != SELFNAME)
2105 if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (type)))
2106 error ("semicolon missing after %s declaration",
2107 TREE_CODE (type) == ENUMERAL_TYPE ? "enum" : "struct");
2109 cp_error ("semicolon missing after declaration of `%T'", type);
2110 shadow_tag (build_tree_list (0, type));
2112 /* Could probably also hack cases where class { ... } f (); appears. */
2117 note_got_semicolon (type)
2120 if (TREE_CODE_CLASS (TREE_CODE (type)) != 't')
2121 my_friendly_abort (60);
2122 if (IS_AGGR_TYPE (type))
2123 CLASSTYPE_GOT_SEMICOLON (type) = 1;
2127 note_list_got_semicolon (declspecs)
2132 for (link = declspecs; link; link = TREE_CHAIN (link))
2134 tree type = TREE_VALUE (link);
2135 if (TREE_CODE_CLASS (TREE_CODE (type)) == 't')
2136 note_got_semicolon (type);
2141 /* If C is not whitespace, return C.
2142 Otherwise skip whitespace and return first nonwhite char read. */
2145 skip_white_space (c)
2153 c = check_newline ();
2164 while (c == ' ' || c == '\t');
2172 error ("stray '\\' in program");
2184 /* Make the token buffer longer, preserving the data in it.
2185 P should point to just beyond the last valid character in the old buffer.
2186 The value we return is a pointer to the new buffer
2187 at a place corresponding to P. */
2190 extend_token_buffer (p)
2193 int offset = p - token_buffer;
2195 maxtoken = maxtoken * 2 + 10;
2196 token_buffer = (char *) xrealloc (token_buffer, maxtoken + 2);
2198 return token_buffer + offset;
2202 get_last_nonwhite_on_line ()
2206 /* Is this the last nonwhite stuff on the line? */
2208 c = nextchar, nextchar = -1;
2212 while (c == ' ' || c == '\t')
2217 /* At the beginning of a line, increment the line number
2218 and process any #-directive on this line.
2219 If the line is a #-directive, read the entire line and return a newline.
2220 Otherwise, return the line's first non-whitespace character. */
2224 static int handle_cp_pragma PROTO((char *));
2232 /* Read first nonwhite char on the line. Do this before incrementing the
2233 line number, in case we're at the end of saved text. */
2237 while (c == ' ' || c == '\t');
2243 /* If not #, return it so caller will use it. */
2247 /* Don't read beyond this line. */
2250 /* Read first nonwhite char after the `#'. */
2254 while (c == ' ' || c == '\t');
2256 /* If a letter follows, then if the word here is `line', skip
2257 it and ignore it; otherwise, ignore the line, with an error
2258 if the word isn't `pragma'. */
2260 if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
2270 token = real_yylex ();
2271 if (token == IDENTIFIER
2272 && TREE_CODE (yylval.ttype) == IDENTIFIER_NODE)
2274 /* If this is 1, we handled it; if it's -1, it was one we
2275 wanted but had something wrong with it. Only if it's
2276 0 was it not handled. */
2277 if (handle_cp_pragma (IDENTIFIER_POINTER (yylval.ttype)))
2280 else if (token == END_OF_LINE)
2283 #ifdef HANDLE_SYSV_PRAGMA
2284 if (handle_sysv_pragma (token))
2287 #ifdef HANDLE_PRAGMA
2292 if (HANDLE_PRAGMA (finput, yylval.ttype))
2294 #endif /* !USE_CPPLIB */
2307 && ((c = getch ()) == ' ' || c == '\t'))
2309 debug_define (lineno, GET_DIRECTIVE_LINE ());
2319 && ((c = getch ()) == ' ' || c == '\t'))
2321 debug_undef (lineno, GET_DIRECTIVE_LINE ());
2330 && ((c = getch ()) == ' ' || c == '\t'))
2339 && ((c = getch ()) == ' ' || c == '\t'))
2341 #ifdef ASM_OUTPUT_IDENT
2342 extern FILE *asm_out_file;
2344 /* #ident. The pedantic warning is now in cccp.c. */
2346 /* Here we have just seen `#ident '.
2347 A string constant should follow. */
2349 token = real_yylex ();
2350 if (token == END_OF_LINE)
2353 || TREE_CODE (yylval.ttype) != STRING_CST)
2355 error ("invalid #ident");
2359 if (! flag_no_ident)
2361 #ifdef ASM_OUTPUT_IDENT
2362 ASM_OUTPUT_IDENT (asm_out_file,
2363 TREE_STRING_POINTER (yylval.ttype));
2367 /* Skip the rest of this line. */
2380 && ((c = getch ()) == ' ' || c == '\t'))
2382 /* Used to test incremental compilation. */
2383 sorry ("#pragma newworld");
2387 error ("undefined or invalid # directive");
2392 /* Here we have either `#line' or `# <nonletter>'.
2393 In either case, it should be a line number; a digit should follow. */
2395 while (c == ' ' || c == '\t')
2398 /* If the # is the only nonwhite char on the line,
2399 just ignore it. Check the new newline. */
2403 /* Something follows the #; read a token. */
2406 token = real_yylex ();
2408 if (token == CONSTANT
2409 && TREE_CODE (yylval.ttype) == INTEGER_CST)
2411 int old_lineno = lineno;
2412 enum { act_none, act_push, act_pop } action = act_none;
2413 int entering_system_header = 0;
2414 int entering_c_header = 0;
2416 /* subtract one, because it is the following line that
2417 gets the specified number */
2419 int l = TREE_INT_CST_LOW (yylval.ttype) - 1;
2420 c = get_last_nonwhite_on_line ();
2423 /* No more: store the line number and check following line. */
2429 /* More follows: it must be a string constant (filename). */
2431 /* Read the string constant, but don't treat \ as special. */
2432 ignore_escape_flag = 1;
2433 token = real_yylex ();
2434 ignore_escape_flag = 0;
2436 if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
2438 error ("invalid #line");
2442 /* Changing files again. This means currently collected time
2443 is charged against header time, and body time starts back
2445 if (flag_detailed_statistics)
2447 int this_time = my_get_run_time ();
2448 tree time_identifier = get_time_identifier (TREE_STRING_POINTER (yylval.ttype));
2449 header_time += this_time - body_time;
2450 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (this_filename_time))
2451 += this_time - body_time;
2452 this_filename_time = time_identifier;
2453 body_time = this_time;
2457 = (char *) permalloc (TREE_STRING_LENGTH (yylval.ttype) + 1);
2458 strcpy (input_filename, TREE_STRING_POINTER (yylval.ttype));
2460 GNU_xref_file (input_filename);
2462 if (main_input_filename == 0)
2464 struct impl_files *ifiles = impl_file_chain;
2468 while (ifiles->next)
2469 ifiles = ifiles->next;
2470 ifiles->filename = file_name_nondirectory (input_filename);
2473 main_input_filename = input_filename;
2474 if (write_virtuals == 3)
2475 walk_vtables (set_typedecl_interface_info, set_vardecl_interface_info);
2478 extract_interface_info ();
2480 c = get_last_nonwhite_on_line ();
2483 /* Update the name in the top element of input_file_stack. */
2484 if (input_file_stack)
2485 input_file_stack->name = input_filename;
2491 token = real_yylex ();
2493 /* `1' after file name means entering new file.
2494 `2' after file name means just left a file. */
2496 if (token == CONSTANT
2497 && TREE_CODE (yylval.ttype) == INTEGER_CST)
2499 if (TREE_INT_CST_LOW (yylval.ttype) == 1)
2501 else if (TREE_INT_CST_LOW (yylval.ttype) == 2)
2506 c = get_last_nonwhite_on_line ();
2510 token = real_yylex ();
2515 /* `3' after file name means this is a system header file. */
2517 if (token == CONSTANT
2518 && TREE_CODE (yylval.ttype) == INTEGER_CST
2519 && TREE_INT_CST_LOW (yylval.ttype) == 3)
2521 entering_system_header = 1;
2523 c = get_last_nonwhite_on_line ();
2527 token = real_yylex ();
2531 /* `4' after file name means this is a C header file. */
2533 if (token == CONSTANT
2534 && TREE_CODE (yylval.ttype) == INTEGER_CST
2535 && TREE_INT_CST_LOW (yylval.ttype) == 4)
2537 entering_c_header = 1;
2539 c = get_last_nonwhite_on_line ();
2543 token = real_yylex ();
2547 /* Do the actions implied by the preceding numbers. */
2549 if (action == act_push)
2551 /* Pushing to a new file. */
2552 struct file_stack *p;
2554 p = (struct file_stack *) xmalloc (sizeof (struct file_stack));
2555 input_file_stack->line = old_lineno;
2556 p->next = input_file_stack;
2557 p->name = input_filename;
2558 input_file_stack = p;
2559 input_file_stack_tick++;
2560 debug_start_source_file (input_filename);
2561 in_system_header = entering_system_header;
2564 else if (entering_c_header)
2567 ++pending_lang_change;
2570 else if (action == act_pop)
2572 /* Popping out of a file. */
2573 if (input_file_stack->next)
2575 struct file_stack *p;
2577 if (c_header_level && --c_header_level == 0)
2579 if (entering_c_header)
2580 warning ("badly nested C headers from preprocessor");
2581 --pending_lang_change;
2583 in_system_header = entering_system_header;
2585 p = input_file_stack;
2586 input_file_stack = p->next;
2588 input_file_stack_tick++;
2589 debug_end_source_file (input_file_stack->line);
2592 error ("#-lines for entering and leaving files don't match");
2595 in_system_header = entering_system_header;
2598 /* If NEXTCHAR is not end of line, we don't care what it is. */
2599 if (nextchar == EOF)
2603 error ("invalid #-line");
2605 /* skip the rest of this line. */
2610 while ((c = getch ()) != EOF && c != '\n');
2615 do_pending_lang_change ()
2617 for (; pending_lang_change > 0; --pending_lang_change)
2618 push_lang_context (lang_name_c);
2619 for (; pending_lang_change < 0; ++pending_lang_change)
2620 pop_lang_context ();
2623 #define ENDFILE -1 /* token that represents end-of-file */
2625 /* Read an escape sequence, returning its equivalent as a character,
2626 or store 1 in *ignore_ptr if it is backslash-newline. */
2629 readescape (ignore_ptr)
2632 register int c = getch ();
2634 register unsigned count;
2635 unsigned firstdig = 0;
2653 if (c >= 'a' && c <= 'f')
2654 code += c - 'a' + 10;
2655 if (c >= 'A' && c <= 'F')
2656 code += c - 'A' + 10;
2657 if (c >= '0' && c <= '9')
2659 if (code != 0 || count != 0)
2668 error ("\\x used with no following hex digits");
2669 else if (count == 0)
2670 /* Digits are all 0's. Ok. */
2672 else if ((count - 1) * 4 >= TYPE_PRECISION (integer_type_node)
2674 && ((1 << (TYPE_PRECISION (integer_type_node) - (count - 1) * 4))
2676 pedwarn ("hex escape out of range");
2679 case '0': case '1': case '2': case '3': case '4':
2680 case '5': case '6': case '7':
2683 while ((c <= '7') && (c >= '0') && (count++ < 3))
2685 code = (code * 8) + (c - '0');
2691 case '\\': case '\'': case '"':
2700 return TARGET_NEWLINE;
2723 pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c);
2729 /* `\(', etc, are used at beginning of line to avoid confusing Emacs. */
2733 /* `\%' is used to prevent SCCS from getting confused. */
2736 pedwarn ("unknown escape sequence `\\%c'", c);
2739 if (c >= 040 && c < 0177)
2740 pedwarn ("unknown escape sequence `\\%c'", c);
2742 pedwarn ("unknown escape sequence: `\\' followed by char code 0x%x", c);
2746 /* Value is 1 (or 2) if we should try to make the next identifier look like
2747 a typename (when it may be a local variable or a class variable).
2748 Value is 0 if we treat this name in a default fashion. */
2749 int looking_for_typename = 0;
2755 identifier_type (decl)
2758 if (TREE_CODE (decl) == TEMPLATE_DECL)
2760 if (TREE_CODE (DECL_RESULT (decl)) == TYPE_DECL)
2762 else if (looking_for_template)
2765 if (looking_for_template && really_overloaded_fn (decl))
2768 for (t = decl; t != NULL_TREE; t = OVL_CHAIN (t))
2769 if (DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (t)))
2772 if (TREE_CODE (decl) == NAMESPACE_DECL)
2774 if (TREE_CODE (decl) != TYPE_DECL)
2776 if (((got_scope && TREE_TYPE (decl) == got_scope)
2777 || TREE_TYPE (decl) == current_class_type)
2778 && DECL_ARTIFICIAL (decl))
2786 /* Only types expected, not even namespaces. */
2787 looking_for_typename = 2;
2789 if ((yychar = yylex ()) < 0) yychar = 0;
2790 looking_for_typename = 0;
2791 if (yychar == IDENTIFIER)
2793 lastiddecl = lookup_name (yylval.ttype, -2);
2794 if (lastiddecl == 0)
2797 lastiddecl = IDENTIFIER_LABEL_VALUE (yylval.ttype);
2800 yychar = identifier_type (lastiddecl);
2805 do_identifier (token, parsing)
2806 register tree token;
2811 if (! parsing || IDENTIFIER_OPNAME_P (token))
2812 id = lookup_name (token, 0);
2816 if (parsing && yychar == YYEMPTY)
2818 /* Scope class declarations before global
2820 if (id == IDENTIFIER_NAMESPACE_VALUE (token)
2821 && current_class_type != 0
2822 && TYPE_SIZE (current_class_type) == 0)
2824 /* Could be from one of the base classes. */
2825 tree field = lookup_field (current_class_type, token, 1, 0);
2828 else if (field == error_mark_node)
2829 /* We have already generated the error message.
2830 But we still want to return this value. */
2831 id = lookup_field (current_class_type, token, 0, 0);
2832 else if (TREE_CODE (field) == VAR_DECL
2833 || TREE_CODE (field) == CONST_DECL
2834 || TREE_CODE (field) == TEMPLATE_DECL)
2836 else if (TREE_CODE (field) != FIELD_DECL)
2837 my_friendly_abort (61);
2840 cp_error ("invalid use of member `%D' from base class `%T'", field,
2841 DECL_FIELD_CONTEXT (field));
2842 id = error_mark_node;
2847 /* Remember that this name has been used in the class definition, as per
2849 if (id && current_class_type && parsing
2850 && TYPE_BEING_DEFINED (current_class_type)
2851 && ! IDENTIFIER_CLASS_VALUE (token)
2852 /* Avoid breaking if we get called for a default argument that
2853 refers to an overloaded method. Eventually this will not be
2854 necessary, since default arguments shouldn't be parsed until
2855 after the class is complete. (jason 3/12/97) */
2856 && TREE_CODE (id) != OVERLOAD)
2857 pushdecl_class_level (id);
2859 if (!id || id == error_mark_node)
2861 if (id == error_mark_node && current_class_type != NULL_TREE)
2863 id = lookup_nested_field (token, 1);
2864 /* In lookup_nested_field(), we marked this so we can gracefully
2865 leave this whole mess. */
2866 if (id && id != error_mark_node && TREE_TYPE (id) == error_mark_node)
2870 if (current_template_parms)
2871 return build_min_nt (LOOKUP_EXPR, token, NULL_TREE);
2872 else if (IDENTIFIER_OPNAME_P (token))
2874 if (token != ansi_opname[ERROR_MARK])
2875 cp_error ("`%D' not defined", token);
2876 id = error_mark_node;
2878 else if (parsing && (yychar == '(' || yychar == LEFT_RIGHT))
2880 id = implicitly_declare (token);
2882 else if (current_function_decl == 0)
2884 cp_error ("`%D' was not declared in this scope", token);
2885 id = error_mark_node;
2889 if (IDENTIFIER_NAMESPACE_VALUE (token) != error_mark_node
2890 || IDENTIFIER_ERROR_LOCUS (token) != current_function_decl)
2892 static int undeclared_variable_notice;
2894 cp_error ("`%D' undeclared (first use this function)", token);
2896 if (! undeclared_variable_notice)
2898 error ("(Each undeclared identifier is reported only once");
2899 error ("for each function it appears in.)");
2900 undeclared_variable_notice = 1;
2903 id = error_mark_node;
2904 /* Prevent repeated error messages. */
2905 SET_IDENTIFIER_NAMESPACE_VALUE (token, error_mark_node);
2906 SET_IDENTIFIER_ERROR_LOCUS (token, current_function_decl);
2910 if (TREE_CODE (id) == VAR_DECL && DECL_DEAD_FOR_LOCAL (id))
2912 tree shadowed = DECL_SHADOWED_FOR_VAR (id);
2913 while (shadowed != NULL_TREE && TREE_CODE (shadowed) == VAR_DECL
2914 && DECL_DEAD_FOR_LOCAL (shadowed))
2915 shadowed = DECL_SHADOWED_FOR_VAR (shadowed);
2917 shadowed = IDENTIFIER_NAMESPACE_VALUE (DECL_NAME (id));
2920 if (!DECL_ERROR_REPORTED (id))
2922 warning ("name lookup of `%s' changed",
2923 IDENTIFIER_POINTER (token));
2924 cp_warning_at (" matches this `%D' under current ANSI rules",
2926 cp_warning_at (" matches this `%D' under old rules", id);
2927 DECL_ERROR_REPORTED (id) = 1;
2931 else if (!DECL_ERROR_REPORTED (id))
2934 = "name lookup of `%s' changed for new ANSI `for' scoping";
2935 DECL_ERROR_REPORTED (id) = 1;
2936 if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (id)))
2938 error (msg, IDENTIFIER_POINTER (token));
2939 cp_error_at (" cannot use obsolete binding at `%D' because it has a destructor", id);
2940 id = error_mark_node;
2944 pedwarn (msg, IDENTIFIER_POINTER (token));
2945 cp_pedwarn_at (" using obsolete binding at `%D'", id);
2949 /* TREE_USED is set in `hack_identifier'. */
2950 if (TREE_CODE (id) == CONST_DECL)
2952 if (IDENTIFIER_CLASS_VALUE (token) == id)
2955 tree access = compute_access (TYPE_BINFO (current_class_type), id);
2956 if (access == access_private_node)
2957 cp_error ("enum `%D' is private", id);
2958 /* protected is OK, since it's an enum of `this'. */
2960 if (! processing_template_decl
2961 || (DECL_INITIAL (id)
2962 && TREE_CODE (DECL_INITIAL (id)) == TEMPLATE_PARM_INDEX))
2963 id = DECL_INITIAL (id);
2966 id = hack_identifier (id, token);
2968 if (current_template_parms)
2970 if (is_overloaded_fn (id))
2972 tree t = build_min (LOOKUP_EXPR, unknown_type_node,
2973 token, get_first_fn (id));
2974 if (id != IDENTIFIER_NAMESPACE_VALUE (token))
2975 TREE_OPERAND (t, 1) = error_mark_node;
2978 else if (! TREE_PERMANENT (id) || TREE_CODE (id) == PARM_DECL
2979 || TREE_CODE (id) == USING_DECL)
2980 id = build_min (LOOKUP_EXPR, TREE_TYPE (id), token, error_mark_node);
2981 /* else just use the decl */
2988 do_scoped_id (token, parsing)
2993 /* during parsing, this is ::name. Otherwise, it is black magic. */
2996 struct tree_binding _b;
2997 id = binding_init (&_b);
2998 if (!qualified_lookup_using_namespace (token, global_namespace, id))
3001 id = BINDING_VALUE (id);
3004 id = IDENTIFIER_GLOBAL_VALUE (token);
3005 if (parsing && yychar == YYEMPTY)
3009 if (processing_template_decl)
3011 id = build_min_nt (LOOKUP_EXPR, token, NULL_TREE);
3012 LOOKUP_EXPR_GLOBAL (id) = 1;
3015 if (parsing && (yychar == '(' || yychar == LEFT_RIGHT))
3016 id = implicitly_declare (token);
3019 if (IDENTIFIER_NAMESPACE_VALUE (token) != error_mark_node)
3020 error ("undeclared variable `%s' (first use here)",
3021 IDENTIFIER_POINTER (token));
3022 id = error_mark_node;
3023 /* Prevent repeated error messages. */
3024 SET_IDENTIFIER_NAMESPACE_VALUE (token, error_mark_node);
3029 if (TREE_CODE (id) == ADDR_EXPR)
3030 mark_used (TREE_OPERAND (id, 0));
3031 else if (TREE_CODE (id) != OVERLOAD)
3034 if (TREE_CODE (id) == CONST_DECL && ! processing_template_decl)
3036 /* XXX CHS - should we set TREE_USED of the constant? */
3037 id = DECL_INITIAL (id);
3038 /* This is to prevent an enum whose value is 0
3039 from being considered a null pointer constant. */
3040 id = build1 (NOP_EXPR, TREE_TYPE (id), id);
3041 TREE_CONSTANT (id) = 1;
3044 if (processing_template_decl)
3046 if (is_overloaded_fn (id))
3048 id = build_min (LOOKUP_EXPR, unknown_type_node,
3049 token, get_first_fn (id));
3050 LOOKUP_EXPR_GLOBAL (id) = 1;
3052 /* else just use the decl */
3054 return convert_from_reference (id);
3058 identifier_typedecl_value (node)
3062 type = IDENTIFIER_TYPE_VALUE (node);
3063 if (type == NULL_TREE)
3068 if (t && TREE_CODE (t) == TYPE_DECL && TREE_TYPE (t) == type) \
3071 do (IDENTIFIER_LOCAL_VALUE (node));
3072 do (IDENTIFIER_CLASS_VALUE (node));
3073 do (IDENTIFIER_NAMESPACE_VALUE (node));
3075 /* Will this one ever happen? */
3076 if (TYPE_MAIN_DECL (type))
3077 return TYPE_MAIN_DECL (type);
3079 /* We used to do an internal error of 62 here, but instead we will
3080 handle the return of a null appropriately in the callers. */
3090 int dollar_seen = 0;
3094 c = nextchar, nextchar = -1;
3098 /* Effectively do c = skip_white_space (c)
3099 but do it faster in the usual cases. */
3112 /* Call skip_white_space so we can warn if appropriate. */
3117 c = skip_white_space (c);
3119 goto found_nonwhite;
3123 token_buffer[0] = c;
3124 token_buffer[1] = 0;
3126 /* yylloc.first_line = lineno; */
3131 token_buffer[0] = '\0';
3133 if (input_redirected ())
3134 value = END_OF_SAVED_INPUT;
3136 value = END_OF_LINE;
3142 if (! dollars_in_ident)
3143 error ("`$' in identifier");
3145 pedwarn ("`$' in identifier");
3150 /* Capital L may start a wide-string or wide-character constant. */
3152 register int c = getch ();
3161 goto string_constant;
3166 case 'A': case 'B': case 'C': case 'D': case 'E':
3167 case 'F': case 'G': case 'H': case 'I': case 'J':
3168 case 'K': case 'M': case 'N': case 'O':
3169 case 'P': case 'Q': case 'R': case 'S': case 'T':
3170 case 'U': case 'V': case 'W': case 'X': case 'Y':
3172 case 'a': case 'b': case 'c': case 'd': case 'e':
3173 case 'f': case 'g': case 'h': case 'i': case 'j':
3174 case 'k': case 'l': case 'm': case 'n': case 'o':
3175 case 'p': case 'q': case 'r': case 's': case 't':
3176 case 'u': case 'v': case 'w': case 'x': case 'y':
3186 /* We know that `token_buffer' can hold at least on char,
3187 so we install C immediately.
3188 We may have to read the value in `putback_char', so call
3193 /* Make this run fast. We know that we are reading straight
3194 from FINPUT in this case (since identifiers cannot straddle
3196 while (ISALNUM (c) || (c == '_') || c == '$')
3200 if (! dollars_in_ident)
3201 error ("`$' in identifier");
3203 pedwarn ("`$' in identifier");
3206 if (p >= token_buffer + maxtoken)
3207 p = extend_token_buffer (p);
3213 if (linemode && c == '\n')
3221 /* We know that `token_buffer' can hold at least on char,
3222 so we install C immediately. */
3226 while (ISALNUM (c) || (c == '_') || c == '$')
3230 if (! dollars_in_ident)
3231 error ("`$' in identifier");
3233 pedwarn ("`$' in identifier");
3236 if (p >= token_buffer + maxtoken)
3237 p = extend_token_buffer (p);
3250 /* Try to recognize a keyword. Uses minimum-perfect hash function */
3253 register struct resword *ptr;
3255 if ((ptr = is_reserved_word (token_buffer, p - token_buffer)))
3259 tree old_ttype = ridpointers[(int) ptr->rid];
3261 /* If this provides a type for us, then revert lexical
3262 state to standard state. */
3263 if (TREE_CODE (old_ttype) == IDENTIFIER_NODE
3264 && IDENTIFIER_GLOBAL_VALUE (old_ttype) != 0
3265 && TREE_CODE (IDENTIFIER_GLOBAL_VALUE (old_ttype)) == TYPE_DECL)
3266 looking_for_typename = 0;
3267 else if (ptr->token == AGGR || ptr->token == ENUM)
3268 looking_for_typename = 2;
3270 /* Check if this is a language-type declaration.
3271 Just glimpse the next non-white character. */
3272 nextchar = skip_white_space (nextchar);
3273 if (nextchar == '"')
3275 /* We are looking at a string. Complain
3276 if the token before the string is no `extern'.
3278 Could cheat some memory by placing this string
3279 on the temporary_, instead of the saveable_
3282 if (ptr->rid != RID_EXTERN)
3283 error ("invalid modifier `%s' for language string",
3286 value = EXTERN_LANG_STRING;
3287 yylval.ttype = get_identifier (TREE_STRING_POINTER (yylval.ttype));
3290 if (ptr->token == VISSPEC)
3295 yylval.ttype = access_public_node;
3298 yylval.ttype = access_private_node;
3301 yylval.ttype = access_protected_node;
3304 my_friendly_abort (63);
3308 yylval.ttype = old_ttype;
3310 else if (ptr->token == EQCOMPARE)
3312 yylval.code = NE_EXPR;
3313 token_buffer[0] = '!';
3314 token_buffer[1] = '=';
3315 token_buffer[2] = 0;
3317 else if (ptr->token == ASSIGN)
3319 if (strcmp ("and_eq", token_buffer) == 0)
3321 yylval.code = BIT_AND_EXPR;
3322 token_buffer[0] = '&';
3324 else if (strcmp ("or_eq", token_buffer) == 0)
3326 yylval.code = BIT_IOR_EXPR;
3327 token_buffer[0] = '|';
3329 else if (strcmp ("xor_eq", token_buffer) == 0)
3331 yylval.code = BIT_XOR_EXPR;
3332 token_buffer[0] = '^';
3334 token_buffer[1] = '=';
3335 token_buffer[2] = 0;
3337 else if (ptr->token == '&')
3339 yylval.code = BIT_AND_EXPR;
3340 token_buffer[0] = '&';
3341 token_buffer[1] = 0;
3343 else if (ptr->token == '|')
3345 yylval.code = BIT_IOR_EXPR;
3346 token_buffer[0] = '|';
3347 token_buffer[1] = 0;
3349 else if (ptr->token == '^')
3351 yylval.code = BIT_XOR_EXPR;
3352 token_buffer[0] = '^';
3353 token_buffer[1] = 0;
3356 value = (int) ptr->token;
3360 /* If we did not find a keyword, look for an identifier
3363 if (value == IDENTIFIER || value == TYPESPEC)
3364 GNU_xref_ref (current_function_decl, token_buffer);
3366 if (value == IDENTIFIER)
3368 register tree tmp = get_identifier (token_buffer);
3370 #if !defined(VMS) && defined(JOINER)
3371 /* Make sure that user does not collide with our internal
3375 && (THIS_NAME_P (tmp)
3376 || VPTR_NAME_P (tmp)
3377 || DESTRUCTOR_NAME_P (tmp)
3378 || VTABLE_NAME_P (tmp)
3379 || TEMP_NAME_P (tmp)
3380 || ANON_AGGRNAME_P (tmp)
3381 || ANON_PARMNAME_P (tmp)))
3382 warning ("identifier name `%s' conflicts with GNU C++ internal naming strategy",
3388 if (value == NEW && ! global_bindings_p ())
3398 register int c1 = getch ();
3399 token_buffer[0] = c;
3400 token_buffer[1] = c1;
3404 token_buffer[2] = 0;
3412 token_buffer[2] = c1;
3413 token_buffer[3] = 0;
3417 error ("parse error at `..'");
3422 goto resume_numerical_scan;
3426 token_buffer[1] = 0;
3430 /* Optimize for most frequent case. */
3432 register int c1 = getch ();
3433 if (! ISALNUM (c1) && c1 != '.')
3435 /* Terminate string. */
3436 token_buffer[0] = c;
3437 token_buffer[1] = 0;
3439 yylval.ttype = integer_zero_node;
3441 yylval.ttype = integer_one_node;
3448 /* fall through... */
3449 case '2': case '3': case '4':
3450 case '5': case '6': case '7': case '8': case '9':
3451 resume_numerical_scan:
3456 int largest_digit = 0;
3458 /* for multi-precision arithmetic,
3459 we actually store only HOST_BITS_PER_CHAR bits in each part.
3460 The number of parts is chosen so as to be sufficient to hold
3461 the enough bits to fit into the two HOST_WIDE_INTs that contain
3462 the integer value (this is always at least as many bits as are
3463 in a target `long long' value, but may be wider). */
3464 #define TOTAL_PARTS ((HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR) * 2 + 2)
3465 int parts[TOTAL_PARTS];
3468 enum anon1 { NOT_FLOAT, AFTER_POINT, TOO_MANY_POINTS} floatflag
3471 for (count = 0; count < TOTAL_PARTS; count++)
3479 *p++ = (c = getch ());
3480 if ((c == 'x') || (c == 'X'))
3483 *p++ = (c = getch ());
3485 /* Leading 0 forces octal unless the 0 is the only digit. */
3486 else if (c >= '0' && c <= '9')
3495 /* Read all the digits-and-decimal-points. */
3498 || (ISALNUM (c) && (c != 'l') && (c != 'L')
3499 && (c != 'u') && (c != 'U')
3500 && c != 'i' && c != 'I' && c != 'j' && c != 'J'
3501 && (floatflag == NOT_FLOAT || ((c != 'f') && (c != 'F')))))
3506 error ("floating constant may not be in radix 16");
3507 if (floatflag == TOO_MANY_POINTS)
3508 /* We have already emitted an error. Don't need another. */
3510 else if (floatflag == AFTER_POINT)
3512 error ("malformed floating constant");
3513 floatflag = TOO_MANY_POINTS;
3514 /* Avoid another error from atof by forcing all characters
3515 from here on to be ignored. */
3519 floatflag = AFTER_POINT;
3522 *p++ = c = getch ();
3523 /* Accept '.' as the start of a floating-point number
3524 only when it is followed by a digit.
3525 Otherwise, unread the following non-digit
3526 and use the '.' as a structural token. */
3527 if (p == token_buffer + 2 && !ISDIGIT (c))
3539 error ("parse error at `..'");
3542 token_buffer[1] = '\0';
3549 /* It is not a decimal point.
3550 It should be a digit (perhaps a hex digit). */
3556 else if (base <= 10)
3558 if (c == 'e' || c == 'E')
3561 floatflag = AFTER_POINT;
3562 break; /* start of exponent */
3564 error ("nondigits in number and not hexadecimal");
3575 if (c >= largest_digit)
3579 for (count = 0; count < TOTAL_PARTS; count++)
3581 parts[count] *= base;
3585 += (parts[count-1] >> HOST_BITS_PER_CHAR);
3587 &= (1 << HOST_BITS_PER_CHAR) - 1;
3593 /* If the extra highest-order part ever gets anything in it,
3594 the number is certainly too big. */
3595 if (parts[TOTAL_PARTS - 1] != 0)
3598 if (p >= token_buffer + maxtoken - 3)
3599 p = extend_token_buffer (p);
3600 *p++ = (c = getch ());
3605 error ("numeric constant with no digits");
3607 if (largest_digit >= base)
3608 error ("numeric constant contains digits beyond the radix");
3610 /* Remove terminating char from the token buffer and delimit the string */
3613 if (floatflag != NOT_FLOAT)
3615 tree type = double_type_node;
3616 int exceeds_double = 0;
3618 REAL_VALUE_TYPE value;
3621 /* Read explicit exponent if any, and put it in tokenbuf. */
3623 if ((c == 'e') || (c == 'E'))
3625 if (p >= token_buffer + maxtoken - 3)
3626 p = extend_token_buffer (p);
3629 if ((c == '+') || (c == '-'))
3635 error ("floating constant exponent has no digits");
3638 if (p >= token_buffer + maxtoken - 3)
3639 p = extend_token_buffer (p);
3648 /* Convert string to a double, checking for overflow. */
3649 if (setjmp (handler))
3651 error ("floating constant out of range");
3656 int fflag = 0, lflag = 0;
3657 /* Copy token_buffer now, while it has just the number
3658 and not the suffixes; once we add `f' or `i',
3659 REAL_VALUE_ATOF may not work any more. */
3660 char *copy = (char *) alloca (p - token_buffer + 1);
3661 bcopy (token_buffer, copy, p - token_buffer + 1);
3663 set_float_handler (handler);
3669 /* Read the suffixes to choose a data type. */
3674 error ("more than one `f' in numeric constant");
3680 error ("more than one `l' in numeric constant");
3686 error ("more than one `i' or `j' in numeric constant");
3688 pedwarn ("ANSI C++ forbids imaginary numeric constants");
3699 if (p >= token_buffer + maxtoken - 3)
3700 p = extend_token_buffer (p);
3706 /* The second argument, machine_mode, of REAL_VALUE_ATOF
3707 tells the desired precision of the binary result
3708 of decimal-to-binary conversion. */
3713 error ("both `f' and `l' in floating constant");
3715 type = float_type_node;
3716 value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
3717 /* A diagnostic is required here by some ANSI C testsuites.
3718 This is not pedwarn, become some people don't want
3719 an error for this. */
3720 if (REAL_VALUE_ISINF (value) && pedantic)
3721 warning ("floating point number exceeds range of `float'");
3725 type = long_double_type_node;
3726 value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
3727 if (REAL_VALUE_ISINF (value) && pedantic)
3728 warning ("floating point number exceeds range of `long double'");
3732 value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
3733 if (REAL_VALUE_ISINF (value) && pedantic)
3734 warning ("floating point number exceeds range of `double'");
3737 set_float_handler (NULL_PTR);
3740 if (errno == ERANGE && pedantic)
3742 /* ERANGE is also reported for underflow,
3743 so test the value to distinguish overflow from that. */
3744 if (REAL_VALUES_LESS (dconst1, value)
3745 || REAL_VALUES_LESS (value, dconstm1))
3747 pedwarn ("floating point number exceeds range of `%s'",
3748 IDENTIFIER_POINTER (TYPE_IDENTIFIER (type)));
3754 /* If the result is not a number, assume it must have been
3755 due to some error message above, so silently convert
3757 if (REAL_VALUE_ISNAN (value))
3760 /* Create a node with determined type and value. */
3762 yylval.ttype = build_complex (NULL_TREE,
3763 cp_convert (type, integer_zero_node),
3764 build_real (type, value));
3766 yylval.ttype = build_real (type, value);
3771 HOST_WIDE_INT high, low;
3772 int spec_unsigned = 0;
3774 int spec_long_long = 0;
3780 if (c == 'u' || c == 'U')
3783 error ("two `u's in integer constant");
3786 else if (c == 'l' || c == 'L')
3791 error ("three `l's in integer constant");
3793 pedwarn ("ANSI C++ forbids long long integer constants");
3798 else if (c == 'i' || c == 'j' || c == 'I' || c == 'J')
3801 error ("more than one `i' or `j' in numeric constant");
3803 pedwarn ("ANSI C++ forbids imaginary numeric constants");
3808 if (p >= token_buffer + maxtoken - 3)
3809 p = extend_token_buffer (p);
3814 /* If the constant is not long long and it won't fit in an
3815 unsigned long, or if the constant is long long and won't fit
3816 in an unsigned long long, then warn that the constant is out
3819 /* ??? This assumes that long long and long integer types are
3820 a multiple of 8 bits. This better than the original code
3821 though which assumed that long was exactly 32 bits and long
3822 long was exactly 64 bits. */
3825 bytes = TYPE_PRECISION (long_long_integer_type_node) / 8;
3827 bytes = TYPE_PRECISION (long_integer_type_node) / 8;
3830 for (i = bytes; i < TOTAL_PARTS; i++)
3834 pedwarn ("integer constant out of range");
3836 /* This is simplified by the fact that our constant
3837 is always positive. */
3840 for (i = 0; i < HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR; i++)
3842 high |= ((HOST_WIDE_INT) parts[i + (HOST_BITS_PER_WIDE_INT
3843 / HOST_BITS_PER_CHAR)]
3844 << (i * HOST_BITS_PER_CHAR));
3845 low |= (HOST_WIDE_INT) parts[i] << (i * HOST_BITS_PER_CHAR);
3849 yylval.ttype = build_int_2 (low, high);
3850 TREE_TYPE (yylval.ttype) = long_long_unsigned_type_node;
3852 /* Calculate the ANSI type. */
3853 if (!spec_long && !spec_unsigned
3854 && int_fits_type_p (yylval.ttype, integer_type_node))
3855 type = integer_type_node;
3856 else if (!spec_long && (base != 10 || spec_unsigned)
3857 && int_fits_type_p (yylval.ttype, unsigned_type_node))
3858 /* Nondecimal constants try unsigned even in traditional C. */
3859 type = unsigned_type_node;
3860 else if (!spec_unsigned && !spec_long_long
3861 && int_fits_type_p (yylval.ttype, long_integer_type_node))
3862 type = long_integer_type_node;
3863 else if (! spec_long_long)
3864 type = long_unsigned_type_node;
3865 else if (! spec_unsigned
3866 /* Verify value does not overflow into sign bit. */
3867 && TREE_INT_CST_HIGH (yylval.ttype) >= 0
3868 && int_fits_type_p (yylval.ttype,
3869 long_long_integer_type_node))
3870 type = long_long_integer_type_node;
3872 type = long_long_unsigned_type_node;
3874 if (!int_fits_type_p (yylval.ttype, type) && !warn)
3875 pedwarn ("integer constant out of range");
3877 if (base == 10 && ! spec_unsigned && TREE_UNSIGNED (type))
3878 warning ("decimal integer constant is so large that it is unsigned");
3882 if (TYPE_PRECISION (type)
3883 <= TYPE_PRECISION (integer_type_node))
3885 = build_complex (NULL_TREE, integer_zero_node,
3886 cp_convert (integer_type_node,
3889 error ("complex integer constant is too wide for `__complex int'");
3892 TREE_TYPE (yylval.ttype) = type;
3898 value = CONSTANT; break;
3904 register int result = 0;
3905 register int num_chars = 0;
3906 unsigned width = TYPE_PRECISION (char_type_node);
3911 width = WCHAR_TYPE_SIZE;
3912 #ifdef MULTIBYTE_CHARS
3913 max_chars = MB_CUR_MAX;
3919 max_chars = TYPE_PRECISION (integer_type_node) / width;
3927 if (c == '\'' || c == EOF)
3933 c = readescape (&ignore);
3936 if (width < HOST_BITS_PER_INT
3937 && (unsigned) c >= (1 << width))
3938 warning ("escape sequence out of range for character");
3939 #ifdef MAP_CHARACTER
3941 c = MAP_CHARACTER (c);
3947 pedwarn ("ANSI C++ forbids newline in character constant");
3950 #ifdef MAP_CHARACTER
3952 c = MAP_CHARACTER (c);
3956 if (num_chars > maxtoken - 4)
3957 extend_token_buffer (token_buffer);
3959 token_buffer[num_chars] = c;
3961 /* Merge character into result; ignore excess chars. */
3962 if (num_chars < max_chars + 1)
3964 if (width < HOST_BITS_PER_INT)
3965 result = (result << width) | (c & ((1 << width) - 1));
3971 token_buffer[num_chars + 1] = '\'';
3972 token_buffer[num_chars + 2] = 0;
3975 error ("malformatted character constant");
3976 else if (num_chars == 0)
3977 error ("empty character constant");
3978 else if (num_chars > max_chars)
3980 num_chars = max_chars;
3981 error ("character constant too long");
3983 else if (num_chars != 1)
3984 warning ("multi-character character constant");
3986 /* If char type is signed, sign-extend the constant. */
3989 int num_bits = num_chars * width;
3991 /* We already got an error; avoid invalid shift. */
3992 yylval.ttype = build_int_2 (0, 0);
3993 else if (TREE_UNSIGNED (char_type_node)
3994 || ((result >> (num_bits - 1)) & 1) == 0)
3996 = build_int_2 (result & ((unsigned HOST_WIDE_INT) ~0
3997 >> (HOST_BITS_PER_WIDE_INT - num_bits)),
4001 = build_int_2 (result | ~((unsigned HOST_WIDE_INT) ~0
4002 >> (HOST_BITS_PER_WIDE_INT - num_bits)),
4005 TREE_TYPE (yylval.ttype) = char_type_node;
4007 TREE_TYPE (yylval.ttype) = integer_type_node;
4011 #ifdef MULTIBYTE_CHARS
4012 /* Set the initial shift state and convert the next sequence. */
4014 /* In all locales L'\0' is zero and mbtowc will return zero,
4017 || (num_chars == 1 && token_buffer[1] != '\0'))
4020 (void) mbtowc (NULL, NULL, 0);
4021 if (mbtowc (& wc, token_buffer + 1, num_chars) == num_chars)
4024 warning ("Ignoring invalid multibyte character");
4027 yylval.ttype = build_int_2 (result, 0);
4028 TREE_TYPE (yylval.ttype) = wchar_type_node;
4041 p = token_buffer + 1;
4043 while (c != '"' && c >= 0)
4045 /* ignore_escape_flag is set for reading the filename in #line. */
4046 if (!ignore_escape_flag && c == '\\')
4049 c = readescape (&ignore);
4053 && TYPE_PRECISION (char_type_node) < HOST_BITS_PER_INT
4054 && c >= ((unsigned) 1 << TYPE_PRECISION (char_type_node)))
4055 warning ("escape sequence out of range for character");
4060 pedwarn ("ANSI C++ forbids newline in string constant");
4064 if (p == token_buffer + maxtoken)
4065 p = extend_token_buffer (p);
4071 error ("Unterminated string");
4077 /* We have read the entire constant.
4078 Construct a STRING_CST for the result. */
4082 /* If this is a L"..." wide-string, convert the multibyte string
4083 to a wide character string. */
4084 char *widep = (char *) alloca ((p - token_buffer) * WCHAR_BYTES);
4087 #ifdef MULTIBYTE_CHARS
4088 len = mbstowcs ((wchar_t *) widep, token_buffer + 1, p - token_buffer);
4089 if (len < 0 || len >= (p - token_buffer))
4091 warning ("Ignoring invalid multibyte string");
4094 bzero (widep + (len * WCHAR_BYTES), WCHAR_BYTES);
4099 wp = widep + (BYTES_BIG_ENDIAN ? WCHAR_BYTES - 1 : 0);
4100 bzero (widep, (p - token_buffer) * WCHAR_BYTES);
4101 for (cp = token_buffer + 1; cp < p; cp++)
4102 *wp = *cp, wp += WCHAR_BYTES;
4103 len = p - token_buffer - 1;
4106 if (processing_template_decl)
4107 push_obstacks (&permanent_obstack, &permanent_obstack);
4108 yylval.ttype = build_string ((len + 1) * WCHAR_BYTES, widep);
4109 if (processing_template_decl)
4111 TREE_TYPE (yylval.ttype) = wchar_array_type_node;
4115 if (processing_template_decl)
4116 push_obstacks (&permanent_obstack, &permanent_obstack);
4117 yylval.ttype = build_string (p - token_buffer, token_buffer + 1);
4118 if (processing_template_decl)
4120 TREE_TYPE (yylval.ttype) = char_array_type_node;
4126 value = STRING; break;
4149 yylval.code = PLUS_EXPR; break;
4151 yylval.code = MINUS_EXPR; break;
4153 yylval.code = BIT_AND_EXPR; break;
4155 yylval.code = BIT_IOR_EXPR; break;
4157 yylval.code = MULT_EXPR; break;
4159 yylval.code = TRUNC_DIV_EXPR; break;
4161 yylval.code = TRUNC_MOD_EXPR; break;
4163 yylval.code = BIT_XOR_EXPR; break;
4165 yylval.code = LSHIFT_EXPR; break;
4167 yylval.code = RSHIFT_EXPR; break;
4169 yylval.code = LT_EXPR; break;
4171 yylval.code = GT_EXPR; break;
4174 token_buffer[1] = c1 = getch ();
4175 token_buffer[2] = 0;
4182 value = ARITHCOMPARE; yylval.code = LE_EXPR; goto done;
4184 value = ARITHCOMPARE; yylval.code = GE_EXPR; goto done;
4186 value = EQCOMPARE; yylval.code = NE_EXPR; goto done;
4188 value = EQCOMPARE; yylval.code = EQ_EXPR; goto done;
4190 value = ASSIGN; goto done;
4196 value = PLUSPLUS; goto done;
4198 value = MINUSMINUS; goto done;
4200 value = ANDAND; goto done;
4202 value = OROR; goto done;
4210 else if ((c == '-') && (c1 == '>'))
4212 nextchar = getch ();
4213 if (nextchar == '*')
4216 value = POINTSAT_STAR;
4222 else if (c1 == '?' && (c == '<' || c == '>'))
4224 token_buffer[3] = 0;
4227 yylval.code = (c == '<' ? MIN_EXPR : MAX_EXPR);
4230 /* <?= or >?= expression. */
4231 token_buffer[2] = c1;
4240 pedwarn ("use of `operator %s' is not standard C++",
4245 else if (c == '<' && c1 == '%')
4246 { value = '{'; goto done; }
4247 else if (c == '<' && c1 == ':')
4248 { value = '['; goto done; }
4249 else if (c == '%' && c1 == '>')
4250 { value = '}'; goto done; }
4251 else if (c == '%' && c1 == ':')
4252 { value = '#'; goto done; }
4255 token_buffer[1] = 0;
4265 token_buffer[1] = ':';
4266 token_buffer[2] = '\0';
4283 /* Don't make yyparse think this is eof. */
4288 /* try, weakly, to handle casts to pointers to functions. */
4289 nextchar = skip_white_space (getch ());
4290 if (nextchar == '*')
4292 int next_c = skip_white_space (getch ());
4296 yylval.ttype = build1 (INDIRECT_REF, 0, 0);
4297 value = PAREN_STAR_PAREN;
4305 else if (nextchar == ')')
4308 yylval.ttype = NULL_TREE;
4319 /* yylloc.last_line = lineno; */
4320 #ifdef GATHER_STATISTICS
4321 #ifdef REDUCE_LENGTH
4322 token_count[value] += 1;
4333 return !!is_reserved_word (IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t));
4336 #ifdef GATHER_STATISTICS
4337 /* The original for tree_node_kind is in the toplevel tree.c; changes there
4338 need to be brought into here, unless this were actually put into a header
4340 /* Statistics-gathering stuff. */
4361 extern int tree_node_counts[];
4362 extern int tree_node_sizes[];
4365 /* Place to save freed lang_decls which were allocated on the
4366 permanent_obstack. @@ Not currently used. */
4367 tree free_lang_decl_chain;
4370 build_lang_decl (code, name, type)
4371 enum tree_code code;
4375 register tree t = build_decl (code, name, type);
4376 struct obstack *obstack = current_obstack;
4377 register int i = sizeof (struct lang_decl) / sizeof (int);
4380 if (! TREE_PERMANENT (t))
4381 obstack = saveable_obstack;
4383 /* Could be that saveable is permanent and current is not. */
4384 obstack = &permanent_obstack;
4386 if (free_lang_decl_chain && obstack == &permanent_obstack)
4388 pi = (int *)free_lang_decl_chain;
4389 free_lang_decl_chain = TREE_CHAIN (free_lang_decl_chain);
4392 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl));
4397 DECL_LANG_SPECIFIC (t) = (struct lang_decl *) pi;
4398 LANG_DECL_PERMANENT ((struct lang_decl *) pi)
4399 = obstack == &permanent_obstack;
4400 my_friendly_assert (LANG_DECL_PERMANENT ((struct lang_decl *) pi)
4401 == TREE_PERMANENT (t), 234);
4402 DECL_MAIN_VARIANT (t) = t;
4403 if (current_lang_name == lang_name_cplusplus)
4404 DECL_LANGUAGE (t) = lang_cplusplus;
4405 else if (current_lang_name == lang_name_c)
4406 DECL_LANGUAGE (t) = lang_c;
4407 else if (current_lang_name == lang_name_java)
4408 DECL_LANGUAGE (t) = lang_java;
4409 else my_friendly_abort (64);
4411 #if 0 /* not yet, should get fixed properly later */
4412 if (code == TYPE_DECL)
4415 id = get_identifier (build_overload_name (type, 1, 1));
4416 DECL_ASSEMBLER_NAME (t) = id;
4420 #ifdef GATHER_STATISTICS
4421 tree_node_counts[(int)lang_decl] += 1;
4422 tree_node_sizes[(int)lang_decl] += sizeof (struct lang_decl);
4429 build_lang_field_decl (code, name, type)
4430 enum tree_code code;
4434 extern struct obstack *current_obstack, *saveable_obstack;
4435 register tree t = build_decl (code, name, type);
4436 struct obstack *obstack = current_obstack;
4437 register int i = sizeof (struct lang_decl_flags) / sizeof (int);
4439 #if 0 /* not yet, should get fixed properly later */
4441 if (code == TYPE_DECL)
4444 id = get_identifier (build_overload_name (type, 1, 1));
4445 DECL_ASSEMBLER_NAME (t) = id;
4449 if (! TREE_PERMANENT (t))
4450 obstack = saveable_obstack;
4452 my_friendly_assert (obstack == &permanent_obstack, 235);
4454 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl_flags));
4458 DECL_LANG_SPECIFIC (t) = (struct lang_decl *) pi;
4463 copy_lang_decl (node)
4469 if (! DECL_LANG_SPECIFIC (node))
4472 if (TREE_CODE (node) == FIELD_DECL)
4473 size = sizeof (struct lang_decl_flags);
4475 size = sizeof (struct lang_decl);
4476 pi = (int *)obstack_alloc (&permanent_obstack, size);
4477 bcopy ((char *)DECL_LANG_SPECIFIC (node), (char *)pi, size);
4478 DECL_LANG_SPECIFIC (node) = (struct lang_decl *)pi;
4482 make_lang_type (code)
4483 enum tree_code code;
4485 extern struct obstack *current_obstack, *saveable_obstack;
4486 register tree t = make_node (code);
4487 struct obstack *obstack = current_obstack;
4488 register int i = sizeof (struct lang_type) / sizeof (int);
4491 /* Set up some flags that give proper default behavior. */
4492 IS_AGGR_TYPE (t) = 1;
4494 if (! TREE_PERMANENT (t))
4495 obstack = saveable_obstack;
4497 my_friendly_assert (obstack == &permanent_obstack, 236);
4499 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_type));
4503 TYPE_LANG_SPECIFIC (t) = (struct lang_type *) pi;
4504 CLASSTYPE_AS_LIST (t) = build_expr_list (NULL_TREE, t);
4505 SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown);
4506 CLASSTYPE_INTERFACE_ONLY (t) = interface_only;
4507 TYPE_BINFO (t) = make_binfo (integer_zero_node, t, NULL_TREE, NULL_TREE,
4509 CLASSTYPE_BINFO_AS_LIST (t) = build_tree_list (NULL_TREE, TYPE_BINFO (t));
4511 /* Make sure this is laid out, for ease of use later.
4512 In the presence of parse errors, the normal was of assuring
4513 this might not ever get executed, so we lay it out *immediately*. */
4514 build_pointer_type (t);
4516 #ifdef GATHER_STATISTICS
4517 tree_node_counts[(int)lang_type] += 1;
4518 tree_node_sizes[(int)lang_type] += sizeof (struct lang_type);
4525 dump_time_statistics ()
4527 register tree prev = 0, decl, next;
4528 int this_time = my_get_run_time ();
4529 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (this_filename_time))
4530 += this_time - body_time;
4532 fprintf (stderr, "\n******\n");
4533 print_time ("header files (total)", header_time);
4534 print_time ("main file (total)", this_time - body_time);
4535 fprintf (stderr, "ratio = %g : 1\n",
4536 (double)header_time / (double)(this_time - body_time));
4537 fprintf (stderr, "\n******\n");
4539 for (decl = filename_times; decl; decl = next)
4541 next = IDENTIFIER_GLOBAL_VALUE (decl);
4542 SET_IDENTIFIER_GLOBAL_VALUE (decl, prev);
4546 for (decl = prev; decl; decl = IDENTIFIER_GLOBAL_VALUE (decl))
4547 print_time (IDENTIFIER_POINTER (decl),
4548 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (decl)));
4552 compiler_error (s, v, v2)
4554 HOST_WIDE_INT v, v2; /* @@also used as pointer */
4557 sprintf (buf, s, v, v2);
4558 error_with_file_and_line (input_filename, lineno, "%s (compiler error)", buf);
4565 extern int end_of_file;
4568 strcpy (buf, string);
4570 /* We can't print string and character constants well
4571 because the token_buffer contains the result of processing escapes. */
4573 strcat (buf, input_redirected ()
4574 ? " at end of saved text"
4575 : " at end of input");
4576 else if (token_buffer[0] == 0)
4577 strcat (buf, " at null character");
4578 else if (token_buffer[0] == '"')
4579 strcat (buf, " before string constant");
4580 else if (token_buffer[0] == '\'')
4581 strcat (buf, " before character constant");
4582 else if (token_buffer[0] < 040 || (unsigned char) token_buffer[0] >= 0177)
4583 sprintf (buf + strlen (buf), " before character 0%o",
4584 (unsigned char) token_buffer[0]);
4586 strcat (buf, " before `%s'");
4588 error (buf, token_buffer);
4592 handle_cp_pragma (pname)
4597 if (! strcmp (pname, "vtable"))
4599 extern tree pending_vtables;
4601 /* More follows: it must be a string constant (class name). */
4602 token = real_yylex ();
4603 if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
4605 error ("invalid #pragma vtable");
4609 if (write_virtuals != 2)
4611 warning ("use `+e2' option to enable #pragma vtable");
4615 = perm_tree_cons (NULL_TREE,
4616 get_identifier (TREE_STRING_POINTER (yylval.ttype)),
4618 token = real_yylex ();
4619 if (token != END_OF_LINE)
4620 warning ("trailing characters ignored");
4623 else if (! strcmp (pname, "unit"))
4625 /* More follows: it must be a string constant (unit name). */
4626 token = real_yylex ();
4627 if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
4629 error ("invalid #pragma unit");
4632 token = real_yylex ();
4633 if (token != END_OF_LINE)
4634 warning ("trailing characters ignored");
4637 else if (! strcmp (pname, "interface"))
4639 tree fileinfo = IDENTIFIER_CLASS_VALUE (get_time_identifier (input_filename));
4640 char *main_filename = input_filename;
4642 main_filename = file_name_nondirectory (main_filename);
4644 token = real_yylex ();
4646 if (token != END_OF_LINE)
4649 || TREE_CODE (yylval.ttype) != STRING_CST)
4651 error ("invalid `#pragma interface'");
4654 main_filename = TREE_STRING_POINTER (yylval.ttype);
4655 token = real_yylex ();
4658 if (token != END_OF_LINE)
4659 warning ("garbage after `#pragma interface' ignored");
4661 #ifndef NO_LINKAGE_HEURISTICS
4664 if (impl_file_chain == 0)
4666 /* If this is zero at this point, then we are
4667 auto-implementing. */
4668 if (main_input_filename == 0)
4669 main_input_filename = input_filename;
4671 #ifdef AUTO_IMPLEMENT
4672 filename = file_name_nondirectory (main_input_filename);
4673 fi = get_time_identifier (filename);
4674 fi = IDENTIFIER_CLASS_VALUE (fi);
4675 TREE_INT_CST_LOW (fi) = 0;
4676 TREE_INT_CST_HIGH (fi) = 1;
4678 impl_file_chain = (struct impl_files *)permalloc (sizeof (struct impl_files));
4679 impl_file_chain->filename = filename;
4680 impl_file_chain->next = 0;
4684 interface_only = interface_strcmp (main_filename);
4685 interface_unknown = 0;
4686 TREE_INT_CST_LOW (fileinfo) = interface_only;
4687 TREE_INT_CST_HIGH (fileinfo) = interface_unknown;
4688 #endif /* NO_LINKAGE_HEURISTICS */
4692 else if (! strcmp (pname, "implementation"))
4694 tree fileinfo = IDENTIFIER_CLASS_VALUE (get_time_identifier (input_filename));
4695 char *main_filename = main_input_filename ? main_input_filename : input_filename;
4697 main_filename = file_name_nondirectory (main_filename);
4698 token = real_yylex ();
4699 if (token != END_OF_LINE)
4702 || TREE_CODE (yylval.ttype) != STRING_CST)
4704 error ("invalid `#pragma implementation'");
4707 main_filename = TREE_STRING_POINTER (yylval.ttype);
4708 token = real_yylex ();
4711 if (token != END_OF_LINE)
4712 warning ("garbage after `#pragma implementation' ignored");
4714 #ifndef NO_LINKAGE_HEURISTICS
4715 if (write_virtuals == 3)
4717 struct impl_files *ifiles = impl_file_chain;
4720 if (! strcmp (ifiles->filename, main_filename))
4722 ifiles = ifiles->next;
4726 ifiles = (struct impl_files*) permalloc (sizeof (struct impl_files));
4727 ifiles->filename = main_filename;
4728 ifiles->next = impl_file_chain;
4729 impl_file_chain = ifiles;
4732 else if ((main_input_filename != 0
4733 && ! strcmp (main_input_filename, input_filename))
4734 || ! strcmp (input_filename, main_filename))
4737 if (impl_file_chain == 0)
4739 impl_file_chain = (struct impl_files*) permalloc (sizeof (struct impl_files));
4740 impl_file_chain->filename = main_filename;
4741 impl_file_chain->next = 0;
4745 error ("`#pragma implementation' can only appear at top-level");
4748 /* We make this non-zero so that we infer decl linkage
4749 in the impl file only for variables first declared
4750 in the interface file. */
4751 interface_unknown = 1;
4753 /* We make this zero so that templates in the impl
4754 file will be emitted properly. */
4755 interface_unknown = 0;
4757 TREE_INT_CST_LOW (fileinfo) = interface_only;
4758 TREE_INT_CST_HIGH (fileinfo) = interface_unknown;
4759 #endif /* NO_LINKAGE_HEURISTICS */
4767 #ifdef HANDLE_SYSV_PRAGMA
4769 /* Handle a #pragma directive. INPUT is the current input stream,
4770 and C is a character to reread. Processes the entire input line
4771 and returns a character for the caller to reread: either \n or EOF. */
4773 /* This function has to be in this file, in order to get at
4777 handle_sysv_pragma (token)
4788 handle_pragma_token ("ignored", yylval.ttype);
4791 handle_pragma_token ("(", NULL_TREE);
4794 handle_pragma_token (")", NULL_TREE);
4797 handle_pragma_token (",", NULL_TREE);
4800 handle_pragma_token ("=", NULL_TREE);
4803 handle_pragma_token ("(", NULL_TREE);
4804 handle_pragma_token (")", NULL_TREE);
4808 handle_pragma_token (NULL_PTR, NULL_TREE);
4811 token = real_yylex ();
4814 #endif /* HANDLE_SYSV_PRAGMA */