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((FILE *, 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;
120 /* Pending language change.
121 Positive is push count, negative is pop count. */
122 int pending_lang_change = 0;
124 /* Wrap the current header file in extern "C". */
125 static int c_header_level = 0;
127 extern int first_token;
128 extern struct obstack token_obstack;
130 /* ??? Don't really know where this goes yet. */
134 extern void put_back (/* int */);
135 extern int input_redirected ();
136 extern void feed_input (/* char *, int */);
139 /* Holds translations from TREE_CODEs to operator name strings,
140 i.e., opname_tab[PLUS_EXPR] == "+". */
144 extern int yychar; /* the lookahead symbol */
145 extern YYSTYPE yylval; /* the semantic value of the */
146 /* lookahead symbol */
149 YYLTYPE yylloc; /* location data for the lookahead */
154 /* the declaration found for the last IDENTIFIER token read in.
155 yylex must look this up to detect typedefs, which get token type TYPENAME,
156 so it is left around in case the identifier is not a typedef but is
157 used in a context which makes it a reference to a variable. */
160 /* The elements of `ridpointers' are identifier nodes
161 for the reserved type names and storage classes.
162 It is indexed by a RID_... value. */
163 tree ridpointers[(int) RID_MAX];
165 /* We may keep statistics about how long which files took to compile. */
166 static int header_time, body_time;
167 static tree filename_times;
168 static tree this_filename_time;
170 /* Array for holding counts of the numbers of tokens seen. */
171 extern int *token_count;
173 /* Return something to represent absolute declarators containing a *.
174 TARGET is the absolute declarator that the * contains.
175 CV_QUALIFIERS is a list of modifiers such as const or volatile
176 to apply to the pointer type, represented as identifiers.
178 We return an INDIRECT_REF whose "contents" are TARGET
179 and whose type is the modifier list. */
182 make_pointer_declarator (cv_qualifiers, target)
183 tree cv_qualifiers, target;
185 if (target && TREE_CODE (target) == IDENTIFIER_NODE
186 && ANON_AGGRNAME_P (target))
187 error ("type name expected before `*'");
188 target = build_parse_node (INDIRECT_REF, target);
189 TREE_TYPE (target) = cv_qualifiers;
193 /* Return something to represent absolute declarators containing a &.
194 TARGET is the absolute declarator that the & contains.
195 CV_QUALIFIERS is a list of modifiers such as const or volatile
196 to apply to the reference type, represented as identifiers.
198 We return an ADDR_EXPR whose "contents" are TARGET
199 and whose type is the modifier list. */
202 make_reference_declarator (cv_qualifiers, target)
203 tree cv_qualifiers, target;
207 if (TREE_CODE (target) == ADDR_EXPR)
209 error ("cannot declare references to references");
212 if (TREE_CODE (target) == INDIRECT_REF)
214 error ("cannot declare pointers to references");
217 if (TREE_CODE (target) == IDENTIFIER_NODE && ANON_AGGRNAME_P (target))
218 error ("type name expected before `&'");
220 target = build_parse_node (ADDR_EXPR, target);
221 TREE_TYPE (target) = cv_qualifiers;
226 make_call_declarator (target, parms, cv_qualifiers, exception_specification)
227 tree target, parms, cv_qualifiers, exception_specification;
229 target = build_parse_node (CALL_EXPR, target, parms, cv_qualifiers);
230 TREE_TYPE (target) = exception_specification;
235 set_quals_and_spec (call_declarator, cv_qualifiers, exception_specification)
236 tree call_declarator, cv_qualifiers, exception_specification;
238 TREE_OPERAND (call_declarator, 2) = cv_qualifiers;
239 TREE_TYPE (call_declarator) = exception_specification;
242 /* Build names and nodes for overloaded operators. */
244 tree ansi_opname[LAST_CPLUS_TREE_CODE];
245 tree ansi_assopname[LAST_CPLUS_TREE_CODE];
248 operator_name_string (name)
251 char *opname = IDENTIFIER_POINTER (name) + 2;
255 /* Works for builtin and user defined types. */
256 if (IDENTIFIER_GLOBAL_VALUE (name)
257 && TREE_CODE (IDENTIFIER_GLOBAL_VALUE (name)) == TYPE_DECL)
258 return IDENTIFIER_POINTER (name);
260 if (opname[0] == 'a' && opname[2] != '\0' && opname[2] != '_')
264 opname_table = ansi_assopname;
269 opname_table = ansi_opname;
272 for (i = 0; i < (int) LAST_CPLUS_TREE_CODE; i++)
274 if (opname[0] == IDENTIFIER_POINTER (opname_table[i])[2+assign]
275 && opname[1] == IDENTIFIER_POINTER (opname_table[i])[3+assign])
279 if (i == LAST_CPLUS_TREE_CODE)
280 return "<invalid operator>";
283 return assignop_tab[i];
285 return opname_tab[i];
288 int interface_only; /* whether or not current file is only for
289 interface definitions. */
290 int interface_unknown; /* whether or not we know this class
291 to behave according to #pragma interface. */
293 /* lexical analyzer */
295 /* File used for outputting assembler code. */
296 extern FILE *asm_out_file;
298 #ifndef WCHAR_TYPE_SIZE
300 #define WCHAR_TYPE_SIZE INT_TYPE_SIZE
302 #define WCHAR_TYPE_SIZE BITS_PER_WORD
306 /* Number of bytes in a wide character. */
307 #define WCHAR_BYTES (WCHAR_TYPE_SIZE / BITS_PER_UNIT)
309 static int maxtoken; /* Current nominal length of token buffer. */
310 char *token_buffer; /* Pointer to token buffer.
311 Actual allocated length is maxtoken + 2. */
316 /* Nonzero tells yylex to ignore \ in string constants. */
317 static int ignore_escape_flag = 0;
320 get_time_identifier (name)
323 tree time_identifier;
324 int len = strlen (name);
325 char *buf = (char *) alloca (len + 6);
326 strcpy (buf, "file ");
327 bcopy (name, buf+5, len);
329 time_identifier = get_identifier (buf);
330 if (IDENTIFIER_LOCAL_VALUE (time_identifier) == NULL_TREE)
332 push_obstacks_nochange ();
333 end_temporary_allocation ();
334 IDENTIFIER_LOCAL_VALUE (time_identifier) = build_int_2 (0, 0);
335 IDENTIFIER_CLASS_VALUE (time_identifier) = build_int_2 (0, 1);
336 SET_IDENTIFIER_GLOBAL_VALUE (time_identifier, filename_times);
337 filename_times = time_identifier;
340 return time_identifier;
349 int old_quiet_flag = quiet_flag;
352 this_time = get_run_time ();
353 quiet_flag = old_quiet_flag;
357 /* Table indexed by tree code giving a string containing a character
358 classifying the tree code. Possibilities are
359 t, d, s, c, r, <, 1 and 2. See cp/cp-tree.def for details. */
361 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
363 char cplus_tree_code_type[] = {
365 #include "cp-tree.def"
369 /* Table indexed by tree code giving number of expression
370 operands beyond the fixed part of the node structure.
371 Not used for types or decls. */
373 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
375 int cplus_tree_code_length[] = {
377 #include "cp-tree.def"
381 /* Names of tree components.
382 Used for printing out the tree and error messages. */
383 #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
385 char *cplus_tree_code_name[] = {
387 #include "cp-tree.def"
391 /* toplev.c needs to call these. */
396 /* the beginning of the file is a new line; check for # */
397 /* With luck, we discover the real source file's name from that
398 and put it in input_filename. */
399 put_back (check_newline ());
400 if (flag_gnu_xref) GNU_xref_begin (input_filename);
401 init_repo (input_filename);
403 /* See comments in toplev.c before the call to lang_init. */
404 if (flag_exceptions == 2)
411 extern int errorcount, sorrycount;
412 if (flag_gnu_xref) GNU_xref_end (errorcount+sorrycount);
422 init_filename_times ()
424 this_filename_time = get_time_identifier ("<top level>");
425 if (flag_detailed_statistics)
428 body_time = my_get_run_time ();
429 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (this_filename_time)) = body_time;
433 /* Change by Bryan Boreham, Kewill, Thu Jul 27 09:46:05 1989.
434 Stuck this hack in to get the files open correctly; this is called
435 in place of init_parse if we are an unexec'd binary. */
439 reinit_lang_specific ()
441 init_filename_times ();
442 reinit_search_statistics ();
449 #ifdef GATHER_STATISTICS
451 reduce_count = (int *)malloc (sizeof (int) * (REDUCE_LENGTH + 1));
452 bzero (reduce_count, sizeof (int) * (REDUCE_LENGTH + 1));
454 token_count = (int *)malloc (sizeof (int) * (TOKEN_LENGTH + 1));
455 bzero (token_count, sizeof (int) * (TOKEN_LENGTH + 1));
463 init_parse (filename)
466 extern int flag_no_gnu_keywords;
467 extern int flag_operator_names;
472 /* Open input file. */
473 if (filename == 0 || !strcmp (filename, "-"))
479 finput = fopen (filename, "r");
481 pfatal_with_name (filename);
483 #ifdef IO_BUFFER_SIZE
484 setvbuf (finput, (char *) xmalloc (IO_BUFFER_SIZE), _IOFBF, IO_BUFFER_SIZE);
486 #endif /* !USE_CPPLIB */
488 /* Initialize the lookahead machinery. */
491 /* Make identifier nodes long enough for the language-specific slots. */
492 set_identifier_size (sizeof (struct lang_identifier));
493 decl_printable_name = lang_printable_name;
495 init_cplus_expand ();
497 bcopy (cplus_tree_code_type,
498 tree_code_type + (int) LAST_AND_UNUSED_TREE_CODE,
499 (int)LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE);
500 bcopy ((char *)cplus_tree_code_length,
501 (char *)(tree_code_length + (int) LAST_AND_UNUSED_TREE_CODE),
502 (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (int));
503 bcopy ((char *)cplus_tree_code_name,
504 (char *)(tree_code_name + (int) LAST_AND_UNUSED_TREE_CODE),
505 (LAST_CPLUS_TREE_CODE - (int)LAST_AND_UNUSED_TREE_CODE) * sizeof (char *));
507 opname_tab = (char **)oballoc ((int)LAST_CPLUS_TREE_CODE * sizeof (char *));
508 bzero ((char *)opname_tab, (int)LAST_CPLUS_TREE_CODE * sizeof (char *));
509 assignop_tab = (char **)oballoc ((int)LAST_CPLUS_TREE_CODE * sizeof (char *));
510 bzero ((char *)assignop_tab, (int)LAST_CPLUS_TREE_CODE * sizeof (char *));
512 ansi_opname[0] = get_identifier ("<invalid operator>");
513 for (i = 0; i < (int) LAST_CPLUS_TREE_CODE; i++)
515 ansi_opname[i] = ansi_opname[0];
516 ansi_assopname[i] = ansi_opname[0];
519 ansi_opname[(int) MULT_EXPR] = get_identifier ("__ml");
520 IDENTIFIER_OPNAME_P (ansi_opname[(int) MULT_EXPR]) = 1;
521 ansi_opname[(int) INDIRECT_REF] = ansi_opname[(int) MULT_EXPR];
522 ansi_assopname[(int) MULT_EXPR] = get_identifier ("__aml");
523 IDENTIFIER_OPNAME_P (ansi_assopname[(int) MULT_EXPR]) = 1;
524 ansi_assopname[(int) INDIRECT_REF] = ansi_assopname[(int) MULT_EXPR];
525 ansi_opname[(int) TRUNC_MOD_EXPR] = get_identifier ("__md");
526 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUNC_MOD_EXPR]) = 1;
527 ansi_assopname[(int) TRUNC_MOD_EXPR] = get_identifier ("__amd");
528 IDENTIFIER_OPNAME_P (ansi_assopname[(int) TRUNC_MOD_EXPR]) = 1;
529 ansi_opname[(int) CEIL_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR];
530 ansi_opname[(int) FLOOR_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR];
531 ansi_opname[(int) ROUND_MOD_EXPR] = ansi_opname[(int) TRUNC_MOD_EXPR];
532 ansi_opname[(int) MINUS_EXPR] = get_identifier ("__mi");
533 IDENTIFIER_OPNAME_P (ansi_opname[(int) MINUS_EXPR]) = 1;
534 ansi_opname[(int) NEGATE_EXPR] = ansi_opname[(int) MINUS_EXPR];
535 ansi_assopname[(int) MINUS_EXPR] = get_identifier ("__ami");
536 IDENTIFIER_OPNAME_P (ansi_assopname[(int) MINUS_EXPR]) = 1;
537 ansi_assopname[(int) NEGATE_EXPR] = ansi_assopname[(int) MINUS_EXPR];
538 ansi_opname[(int) RSHIFT_EXPR] = get_identifier ("__rs");
539 IDENTIFIER_OPNAME_P (ansi_opname[(int) RSHIFT_EXPR]) = 1;
540 ansi_assopname[(int) RSHIFT_EXPR] = get_identifier ("__ars");
541 IDENTIFIER_OPNAME_P (ansi_assopname[(int) RSHIFT_EXPR]) = 1;
542 ansi_opname[(int) NE_EXPR] = get_identifier ("__ne");
543 IDENTIFIER_OPNAME_P (ansi_opname[(int) NE_EXPR]) = 1;
544 ansi_opname[(int) GT_EXPR] = get_identifier ("__gt");
545 IDENTIFIER_OPNAME_P (ansi_opname[(int) GT_EXPR]) = 1;
546 ansi_opname[(int) GE_EXPR] = get_identifier ("__ge");
547 IDENTIFIER_OPNAME_P (ansi_opname[(int) GE_EXPR]) = 1;
548 ansi_opname[(int) BIT_IOR_EXPR] = get_identifier ("__or");
549 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_IOR_EXPR]) = 1;
550 ansi_assopname[(int) BIT_IOR_EXPR] = get_identifier ("__aor");
551 IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_IOR_EXPR]) = 1;
552 ansi_opname[(int) TRUTH_ANDIF_EXPR] = get_identifier ("__aa");
553 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_ANDIF_EXPR]) = 1;
554 ansi_opname[(int) TRUTH_NOT_EXPR] = get_identifier ("__nt");
555 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_NOT_EXPR]) = 1;
556 ansi_opname[(int) PREINCREMENT_EXPR] = get_identifier ("__pp");
557 IDENTIFIER_OPNAME_P (ansi_opname[(int) PREINCREMENT_EXPR]) = 1;
558 ansi_opname[(int) POSTINCREMENT_EXPR] = ansi_opname[(int) PREINCREMENT_EXPR];
559 ansi_opname[(int) MODIFY_EXPR] = get_identifier ("__as");
560 IDENTIFIER_OPNAME_P (ansi_opname[(int) MODIFY_EXPR]) = 1;
561 ansi_assopname[(int) NOP_EXPR] = ansi_opname[(int) MODIFY_EXPR];
562 ansi_opname[(int) COMPOUND_EXPR] = get_identifier ("__cm");
563 IDENTIFIER_OPNAME_P (ansi_opname[(int) COMPOUND_EXPR]) = 1;
564 ansi_opname[(int) EXACT_DIV_EXPR] = get_identifier ("__dv");
565 IDENTIFIER_OPNAME_P (ansi_opname[(int) EXACT_DIV_EXPR]) = 1;
566 ansi_assopname[(int) EXACT_DIV_EXPR] = get_identifier ("__adv");
567 IDENTIFIER_OPNAME_P (ansi_assopname[(int) EXACT_DIV_EXPR]) = 1;
568 ansi_opname[(int) TRUNC_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
569 ansi_opname[(int) CEIL_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
570 ansi_opname[(int) FLOOR_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
571 ansi_opname[(int) ROUND_DIV_EXPR] = ansi_opname[(int) EXACT_DIV_EXPR];
572 ansi_opname[(int) PLUS_EXPR] = get_identifier ("__pl");
573 ansi_assopname[(int) TRUNC_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
574 ansi_assopname[(int) CEIL_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
575 ansi_assopname[(int) FLOOR_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
576 ansi_assopname[(int) ROUND_DIV_EXPR] = ansi_assopname[(int) EXACT_DIV_EXPR];
577 IDENTIFIER_OPNAME_P (ansi_opname[(int) PLUS_EXPR]) = 1;
578 ansi_assopname[(int) PLUS_EXPR] = get_identifier ("__apl");
579 IDENTIFIER_OPNAME_P (ansi_assopname[(int) PLUS_EXPR]) = 1;
580 ansi_opname[(int) CONVERT_EXPR] = ansi_opname[(int) PLUS_EXPR];
581 ansi_assopname[(int) CONVERT_EXPR] = ansi_assopname[(int) PLUS_EXPR];
582 ansi_opname[(int) LSHIFT_EXPR] = get_identifier ("__ls");
583 IDENTIFIER_OPNAME_P (ansi_opname[(int) LSHIFT_EXPR]) = 1;
584 ansi_assopname[(int) LSHIFT_EXPR] = get_identifier ("__als");
585 IDENTIFIER_OPNAME_P (ansi_assopname[(int) LSHIFT_EXPR]) = 1;
586 ansi_opname[(int) EQ_EXPR] = get_identifier ("__eq");
587 IDENTIFIER_OPNAME_P (ansi_opname[(int) EQ_EXPR]) = 1;
588 ansi_opname[(int) LT_EXPR] = get_identifier ("__lt");
589 IDENTIFIER_OPNAME_P (ansi_opname[(int) LT_EXPR]) = 1;
590 ansi_opname[(int) LE_EXPR] = get_identifier ("__le");
591 IDENTIFIER_OPNAME_P (ansi_opname[(int) LE_EXPR]) = 1;
592 ansi_opname[(int) BIT_AND_EXPR] = get_identifier ("__ad");
593 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_AND_EXPR]) = 1;
594 ansi_assopname[(int) BIT_AND_EXPR] = get_identifier ("__aad");
595 IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_AND_EXPR]) = 1;
596 ansi_opname[(int) ADDR_EXPR] = ansi_opname[(int) BIT_AND_EXPR];
597 ansi_assopname[(int) ADDR_EXPR] = ansi_assopname[(int) BIT_AND_EXPR];
598 ansi_opname[(int) BIT_XOR_EXPR] = get_identifier ("__er");
599 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_XOR_EXPR]) = 1;
600 ansi_assopname[(int) BIT_XOR_EXPR] = get_identifier ("__aer");
601 IDENTIFIER_OPNAME_P (ansi_assopname[(int) BIT_XOR_EXPR]) = 1;
602 ansi_opname[(int) TRUTH_ORIF_EXPR] = get_identifier ("__oo");
603 IDENTIFIER_OPNAME_P (ansi_opname[(int) TRUTH_ORIF_EXPR]) = 1;
604 ansi_opname[(int) BIT_NOT_EXPR] = get_identifier ("__co");
605 IDENTIFIER_OPNAME_P (ansi_opname[(int) BIT_NOT_EXPR]) = 1;
606 ansi_opname[(int) PREDECREMENT_EXPR] = get_identifier ("__mm");
607 IDENTIFIER_OPNAME_P (ansi_opname[(int) PREDECREMENT_EXPR]) = 1;
608 ansi_opname[(int) POSTDECREMENT_EXPR] = ansi_opname[(int) PREDECREMENT_EXPR];
609 ansi_opname[(int) COMPONENT_REF] = get_identifier ("__rf");
610 IDENTIFIER_OPNAME_P (ansi_opname[(int) COMPONENT_REF]) = 1;
611 ansi_opname[(int) MEMBER_REF] = get_identifier ("__rm");
612 IDENTIFIER_OPNAME_P (ansi_opname[(int) MEMBER_REF]) = 1;
613 ansi_opname[(int) CALL_EXPR] = get_identifier ("__cl");
614 IDENTIFIER_OPNAME_P (ansi_opname[(int) CALL_EXPR]) = 1;
615 ansi_opname[(int) ARRAY_REF] = get_identifier ("__vc");
616 IDENTIFIER_OPNAME_P (ansi_opname[(int) ARRAY_REF]) = 1;
617 ansi_opname[(int) NEW_EXPR] = get_identifier ("__nw");
618 IDENTIFIER_OPNAME_P (ansi_opname[(int) NEW_EXPR]) = 1;
619 ansi_opname[(int) DELETE_EXPR] = get_identifier ("__dl");
620 IDENTIFIER_OPNAME_P (ansi_opname[(int) DELETE_EXPR]) = 1;
621 ansi_opname[(int) VEC_NEW_EXPR] = get_identifier ("__vn");
622 IDENTIFIER_OPNAME_P (ansi_opname[(int) VEC_NEW_EXPR]) = 1;
623 ansi_opname[(int) VEC_DELETE_EXPR] = get_identifier ("__vd");
624 IDENTIFIER_OPNAME_P (ansi_opname[(int) VEC_DELETE_EXPR]) = 1;
625 ansi_opname[(int) TYPE_EXPR] = get_identifier ("__op");
626 IDENTIFIER_OPNAME_P (ansi_opname[(int) TYPE_EXPR]) = 1;
628 /* This is not true: these operators are not defined in ANSI,
629 but we need them anyway. */
630 ansi_opname[(int) MIN_EXPR] = get_identifier ("__mn");
631 IDENTIFIER_OPNAME_P (ansi_opname[(int) MIN_EXPR]) = 1;
632 ansi_opname[(int) MAX_EXPR] = get_identifier ("__mx");
633 IDENTIFIER_OPNAME_P (ansi_opname[(int) MAX_EXPR]) = 1;
634 ansi_opname[(int) COND_EXPR] = get_identifier ("__cn");
635 IDENTIFIER_OPNAME_P (ansi_opname[(int) COND_EXPR]) = 1;
636 ansi_opname[(int) SIZEOF_EXPR] = get_identifier ("__sz");
637 IDENTIFIER_OPNAME_P (ansi_opname[(int) SIZEOF_EXPR]) = 1;
641 gcc_obstack_init (&inline_text_obstack);
642 inline_text_firstobj = (char *) obstack_alloc (&inline_text_obstack, 0);
644 /* Start it at 0, because check_newline is called at the very beginning
645 and will increment it to 1. */
647 input_filename = "<internal>";
648 current_function_decl = NULL;
651 token_buffer = (char *) xmalloc (maxtoken + 2);
653 ridpointers[(int) RID_INT] = get_identifier ("int");
654 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_INT],
655 build_tree_list (NULL_TREE, ridpointers[(int) RID_INT]));
656 ridpointers[(int) RID_BOOL] = get_identifier ("bool");
657 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_BOOL],
658 build_tree_list (NULL_TREE, ridpointers[(int) RID_BOOL]));
659 ridpointers[(int) RID_CHAR] = get_identifier ("char");
660 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_CHAR],
661 build_tree_list (NULL_TREE, ridpointers[(int) RID_CHAR]));
662 ridpointers[(int) RID_VOID] = get_identifier ("void");
663 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VOID],
664 build_tree_list (NULL_TREE, ridpointers[(int) RID_VOID]));
665 ridpointers[(int) RID_FLOAT] = get_identifier ("float");
666 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_FLOAT],
667 build_tree_list (NULL_TREE, ridpointers[(int) RID_FLOAT]));
668 ridpointers[(int) RID_DOUBLE] = get_identifier ("double");
669 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_DOUBLE],
670 build_tree_list (NULL_TREE, ridpointers[(int) RID_DOUBLE]));
671 ridpointers[(int) RID_SHORT] = get_identifier ("short");
672 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_SHORT],
673 build_tree_list (NULL_TREE, ridpointers[(int) RID_SHORT]));
674 ridpointers[(int) RID_LONG] = get_identifier ("long");
675 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_LONG],
676 build_tree_list (NULL_TREE, ridpointers[(int) RID_LONG]));
677 ridpointers[(int) RID_UNSIGNED] = get_identifier ("unsigned");
678 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_UNSIGNED],
679 build_tree_list (NULL_TREE, ridpointers[(int) RID_UNSIGNED]));
680 ridpointers[(int) RID_SIGNED] = get_identifier ("signed");
681 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_SIGNED],
682 build_tree_list (NULL_TREE, ridpointers[(int) RID_SIGNED]));
683 ridpointers[(int) RID_INLINE] = get_identifier ("inline");
684 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_INLINE],
685 build_tree_list (NULL_TREE, ridpointers[(int) RID_INLINE]));
686 ridpointers[(int) RID_CONST] = get_identifier ("const");
687 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_CONST],
688 build_tree_list (NULL_TREE, ridpointers[(int) RID_CONST]));
689 ridpointers[(int) RID_VOLATILE] = get_identifier ("volatile");
690 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VOLATILE],
691 build_tree_list (NULL_TREE, ridpointers[(int) RID_VOLATILE]));
692 ridpointers[(int) RID_AUTO] = get_identifier ("auto");
693 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_AUTO],
694 build_tree_list (NULL_TREE, ridpointers[(int) RID_AUTO]));
695 ridpointers[(int) RID_STATIC] = get_identifier ("static");
696 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_STATIC],
697 build_tree_list (NULL_TREE, ridpointers[(int) RID_STATIC]));
698 ridpointers[(int) RID_EXTERN] = get_identifier ("extern");
699 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_EXTERN],
700 build_tree_list (NULL_TREE, ridpointers[(int) RID_EXTERN]));
701 ridpointers[(int) RID_TYPEDEF] = get_identifier ("typedef");
702 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_TYPEDEF],
703 build_tree_list (NULL_TREE, ridpointers[(int) RID_TYPEDEF]));
704 ridpointers[(int) RID_REGISTER] = get_identifier ("register");
705 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_REGISTER],
706 build_tree_list (NULL_TREE, ridpointers[(int) RID_REGISTER]));
707 ridpointers[(int) RID_COMPLEX] = get_identifier ("__complex");
708 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_COMPLEX],
709 build_tree_list (NULL_TREE, ridpointers[(int) RID_COMPLEX]));
711 /* C++ extensions. These are probably not correctly named. */
712 ridpointers[(int) RID_WCHAR] = get_identifier ("__wchar_t");
713 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_WCHAR],
714 build_tree_list (NULL_TREE, ridpointers[(int) RID_WCHAR]));
715 class_type_node = build_int_2 (class_type, 0);
716 TREE_TYPE (class_type_node) = class_type_node;
717 ridpointers[(int) RID_CLASS] = class_type_node;
719 record_type_node = build_int_2 (record_type, 0);
720 TREE_TYPE (record_type_node) = record_type_node;
721 ridpointers[(int) RID_RECORD] = record_type_node;
723 union_type_node = build_int_2 (union_type, 0);
724 TREE_TYPE (union_type_node) = union_type_node;
725 ridpointers[(int) RID_UNION] = union_type_node;
727 enum_type_node = build_int_2 (enum_type, 0);
728 TREE_TYPE (enum_type_node) = enum_type_node;
729 ridpointers[(int) RID_ENUM] = enum_type_node;
731 ridpointers[(int) RID_VIRTUAL] = get_identifier ("virtual");
732 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_VIRTUAL],
733 build_tree_list (NULL_TREE, ridpointers[(int) RID_VIRTUAL]));
734 ridpointers[(int) RID_EXPLICIT] = get_identifier ("explicit");
735 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_EXPLICIT],
736 build_tree_list (NULL_TREE, ridpointers[(int) RID_EXPLICIT]));
737 ridpointers[(int) RID_FRIEND] = get_identifier ("friend");
738 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_FRIEND],
739 build_tree_list (NULL_TREE, ridpointers[(int) RID_FRIEND]));
741 ridpointers[(int) RID_PUBLIC] = get_identifier ("public");
742 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PUBLIC],
743 build_tree_list (NULL_TREE, ridpointers[(int) RID_PUBLIC]));
744 ridpointers[(int) RID_PRIVATE] = get_identifier ("private");
745 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PRIVATE],
746 build_tree_list (NULL_TREE, ridpointers[(int) RID_PRIVATE]));
747 ridpointers[(int) RID_PROTECTED] = get_identifier ("protected");
748 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_PROTECTED],
749 build_tree_list (NULL_TREE, ridpointers[(int) RID_PROTECTED]));
750 ridpointers[(int) RID_TEMPLATE] = get_identifier ("template");
751 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_TEMPLATE],
752 build_tree_list (NULL_TREE, ridpointers[(int) RID_TEMPLATE]));
753 /* This is for ANSI C++. */
754 ridpointers[(int) RID_MUTABLE] = get_identifier ("mutable");
755 SET_IDENTIFIER_AS_LIST (ridpointers[(int) RID_MUTABLE],
756 build_tree_list (NULL_TREE, ridpointers[(int) RID_MUTABLE]));
758 /* Signature handling extensions. */
759 signature_type_node = build_int_2 (signature_type, 0);
760 TREE_TYPE (signature_type_node) = signature_type_node;
761 ridpointers[(int) RID_SIGNATURE] = signature_type_node;
763 null_node = build_int_2 (0, 0);
764 ridpointers[RID_NULL] = null_node;
766 opname_tab[(int) COMPONENT_REF] = "->";
767 opname_tab[(int) MEMBER_REF] = "->*";
768 opname_tab[(int) INDIRECT_REF] = "*";
769 opname_tab[(int) ARRAY_REF] = "[]";
770 opname_tab[(int) MODIFY_EXPR] = "=";
771 opname_tab[(int) NEW_EXPR] = "new";
772 opname_tab[(int) DELETE_EXPR] = "delete";
773 opname_tab[(int) VEC_NEW_EXPR] = "new []";
774 opname_tab[(int) VEC_DELETE_EXPR] = "delete []";
775 opname_tab[(int) COND_EXPR] = "?:";
776 opname_tab[(int) CALL_EXPR] = "()";
777 opname_tab[(int) PLUS_EXPR] = "+";
778 opname_tab[(int) MINUS_EXPR] = "-";
779 opname_tab[(int) MULT_EXPR] = "*";
780 opname_tab[(int) TRUNC_DIV_EXPR] = "/";
781 opname_tab[(int) CEIL_DIV_EXPR] = "(ceiling /)";
782 opname_tab[(int) FLOOR_DIV_EXPR] = "(floor /)";
783 opname_tab[(int) ROUND_DIV_EXPR] = "(round /)";
784 opname_tab[(int) TRUNC_MOD_EXPR] = "%";
785 opname_tab[(int) CEIL_MOD_EXPR] = "(ceiling %)";
786 opname_tab[(int) FLOOR_MOD_EXPR] = "(floor %)";
787 opname_tab[(int) ROUND_MOD_EXPR] = "(round %)";
788 opname_tab[(int) NEGATE_EXPR] = "-";
789 opname_tab[(int) MIN_EXPR] = "<?";
790 opname_tab[(int) MAX_EXPR] = ">?";
791 opname_tab[(int) ABS_EXPR] = "abs";
792 opname_tab[(int) FFS_EXPR] = "ffs";
793 opname_tab[(int) LSHIFT_EXPR] = "<<";
794 opname_tab[(int) RSHIFT_EXPR] = ">>";
795 opname_tab[(int) BIT_IOR_EXPR] = "|";
796 opname_tab[(int) BIT_XOR_EXPR] = "^";
797 opname_tab[(int) BIT_AND_EXPR] = "&";
798 opname_tab[(int) BIT_ANDTC_EXPR] = "&~";
799 opname_tab[(int) BIT_NOT_EXPR] = "~";
800 opname_tab[(int) TRUTH_ANDIF_EXPR] = "&&";
801 opname_tab[(int) TRUTH_ORIF_EXPR] = "||";
802 opname_tab[(int) TRUTH_AND_EXPR] = "strict &&";
803 opname_tab[(int) TRUTH_OR_EXPR] = "strict ||";
804 opname_tab[(int) TRUTH_NOT_EXPR] = "!";
805 opname_tab[(int) LT_EXPR] = "<";
806 opname_tab[(int) LE_EXPR] = "<=";
807 opname_tab[(int) GT_EXPR] = ">";
808 opname_tab[(int) GE_EXPR] = ">=";
809 opname_tab[(int) EQ_EXPR] = "==";
810 opname_tab[(int) NE_EXPR] = "!=";
811 opname_tab[(int) IN_EXPR] = "in";
812 opname_tab[(int) RANGE_EXPR] = "...";
813 opname_tab[(int) CONVERT_EXPR] = "+";
814 opname_tab[(int) ADDR_EXPR] = "&";
815 opname_tab[(int) PREDECREMENT_EXPR] = "--";
816 opname_tab[(int) PREINCREMENT_EXPR] = "++";
817 opname_tab[(int) POSTDECREMENT_EXPR] = "--";
818 opname_tab[(int) POSTINCREMENT_EXPR] = "++";
819 opname_tab[(int) COMPOUND_EXPR] = ",";
821 assignop_tab[(int) NOP_EXPR] = "=";
822 assignop_tab[(int) PLUS_EXPR] = "+=";
823 assignop_tab[(int) CONVERT_EXPR] = "+=";
824 assignop_tab[(int) MINUS_EXPR] = "-=";
825 assignop_tab[(int) NEGATE_EXPR] = "-=";
826 assignop_tab[(int) MULT_EXPR] = "*=";
827 assignop_tab[(int) INDIRECT_REF] = "*=";
828 assignop_tab[(int) TRUNC_DIV_EXPR] = "/=";
829 assignop_tab[(int) EXACT_DIV_EXPR] = "(exact /=)";
830 assignop_tab[(int) CEIL_DIV_EXPR] = "(ceiling /=)";
831 assignop_tab[(int) FLOOR_DIV_EXPR] = "(floor /=)";
832 assignop_tab[(int) ROUND_DIV_EXPR] = "(round /=)";
833 assignop_tab[(int) TRUNC_MOD_EXPR] = "%=";
834 assignop_tab[(int) CEIL_MOD_EXPR] = "(ceiling %=)";
835 assignop_tab[(int) FLOOR_MOD_EXPR] = "(floor %=)";
836 assignop_tab[(int) ROUND_MOD_EXPR] = "(round %=)";
837 assignop_tab[(int) MIN_EXPR] = "<?=";
838 assignop_tab[(int) MAX_EXPR] = ">?=";
839 assignop_tab[(int) LSHIFT_EXPR] = "<<=";
840 assignop_tab[(int) RSHIFT_EXPR] = ">>=";
841 assignop_tab[(int) BIT_IOR_EXPR] = "|=";
842 assignop_tab[(int) BIT_XOR_EXPR] = "^=";
843 assignop_tab[(int) BIT_AND_EXPR] = "&=";
844 assignop_tab[(int) ADDR_EXPR] = "&=";
846 init_filename_times ();
848 /* Some options inhibit certain reserved words.
849 Clear those words out of the hash table so they won't be recognized. */
850 #define UNSET_RESERVED_WORD(STRING) \
851 do { struct resword *s = is_reserved_word (STRING, sizeof (STRING) - 1); \
852 if (s) s->name = ""; } while (0)
855 /* let's parse things, and if they use it, then give them an error. */
856 if (!flag_exceptions)
858 UNSET_RESERVED_WORD ("throw");
859 UNSET_RESERVED_WORD ("try");
860 UNSET_RESERVED_WORD ("catch");
864 if (!flag_rtti || flag_no_gnu_keywords)
866 UNSET_RESERVED_WORD ("classof");
867 UNSET_RESERVED_WORD ("headof");
870 if (! flag_handle_signatures || flag_no_gnu_keywords)
872 /* Easiest way to not recognize signature
873 handling extensions... */
874 UNSET_RESERVED_WORD ("signature");
875 UNSET_RESERVED_WORD ("sigof");
877 if (flag_no_asm || flag_no_gnu_keywords)
878 UNSET_RESERVED_WORD ("typeof");
879 if (! flag_operator_names)
881 /* These are new ANSI keywords that may break code. */
882 UNSET_RESERVED_WORD ("and");
883 UNSET_RESERVED_WORD ("and_eq");
884 UNSET_RESERVED_WORD ("bitand");
885 UNSET_RESERVED_WORD ("bitor");
886 UNSET_RESERVED_WORD ("compl");
887 UNSET_RESERVED_WORD ("not");
888 UNSET_RESERVED_WORD ("not_eq");
889 UNSET_RESERVED_WORD ("or");
890 UNSET_RESERVED_WORD ("or_eq");
891 UNSET_RESERVED_WORD ("xor");
892 UNSET_RESERVED_WORD ("xor_eq");
895 token_count = init_cpp_parse ();
896 interface_unknown = 1;
905 cpp_finish (&parse_in);
912 reinit_parse_for_function ()
914 current_base_init_list = NULL_TREE;
915 current_member_init_list = NULL_TREE;
922 yyprint (file, yychar, yylval)
934 case IDENTIFIER_DEFN:
938 case PRE_PARSED_CLASS_DECL:
940 if (TREE_CODE (t) == TYPE_DECL || TREE_CODE (t) == TEMPLATE_DECL)
942 fprintf (file, " `%s'", IDENTIFIER_POINTER (DECL_NAME (t)));
945 my_friendly_assert (TREE_CODE (t) == IDENTIFIER_NODE, 224);
946 if (IDENTIFIER_POINTER (t))
947 fprintf (file, " `%s'", IDENTIFIER_POINTER (t));
950 if (yylval.ttype == class_type_node)
951 fprintf (file, " `class'");
952 else if (yylval.ttype == record_type_node)
953 fprintf (file, " `struct'");
954 else if (yylval.ttype == union_type_node)
955 fprintf (file, " `union'");
956 else if (yylval.ttype == enum_type_node)
957 fprintf (file, " `enum'");
958 else if (yylval.ttype == signature_type_node)
959 fprintf (file, " `signature'");
961 my_friendly_abort (80);
966 #if defined(GATHER_STATISTICS) && defined(REDUCE_LENGTH)
967 static int *reduce_count;
973 #define REDUCE_LENGTH (sizeof (yyr2) / sizeof (yyr2[0]))
974 #define TOKEN_LENGTH (256 + sizeof (yytname) / sizeof (yytname[0]))
977 #ifdef GATHER_STATISTICS
983 reduce_count[yyn] += 1;
990 return reduce_count[*q] - reduce_count[*p];
997 return token_count[*q] - token_count[*p];
1003 print_parse_statistics ()
1005 #ifdef GATHER_STATISTICS
1006 #ifdef REDUCE_LENGTH
1009 int maxlen = REDUCE_LENGTH;
1012 if (reduce_count[-1] == 0)
1015 if (TOKEN_LENGTH > REDUCE_LENGTH)
1016 maxlen = TOKEN_LENGTH;
1017 sorted = (unsigned *) alloca (sizeof (int) * maxlen);
1019 for (i = 0; i < TOKEN_LENGTH; i++)
1021 qsort (sorted, TOKEN_LENGTH, sizeof (int), token_cmp);
1022 for (i = 0; i < TOKEN_LENGTH; i++)
1024 int idx = sorted[i];
1025 if (token_count[idx] == 0)
1027 if (token_count[idx] < token_count[-1])
1029 fprintf (stderr, "token %d, `%s', count = %d\n",
1030 idx, yytname[YYTRANSLATE (idx)], token_count[idx]);
1032 fprintf (stderr, "\n");
1033 for (i = 0; i < REDUCE_LENGTH; i++)
1035 qsort (sorted, REDUCE_LENGTH, sizeof (int), reduce_cmp);
1036 for (i = 0; i < REDUCE_LENGTH; i++)
1038 int idx = sorted[i];
1039 if (reduce_count[idx] == 0)
1041 if (reduce_count[idx] < reduce_count[-1])
1043 fprintf (stderr, "rule %d, line %d, count = %d\n",
1044 idx, yyrline[idx], reduce_count[idx]);
1046 fprintf (stderr, "\n");
1052 /* Sets the value of the 'yydebug' variable to VALUE.
1053 This is a function so we don't have to have YYDEBUG defined
1054 in order to build the compiler. */
1064 warning ("YYDEBUG not defined.");
1069 /* Functions and data structures for #pragma interface.
1071 `#pragma implementation' means that the main file being compiled
1072 is considered to implement (provide) the classes that appear in
1073 its main body. I.e., if this is file "foo.cc", and class `bar'
1074 is defined in "foo.cc", then we say that "foo.cc implements bar".
1076 All main input files "implement" themselves automagically.
1078 `#pragma interface' means that unless this file (of the form "foo.h"
1079 is not presently being included by file "foo.cc", the
1080 CLASSTYPE_INTERFACE_ONLY bit gets set. The effect is that none
1081 of the vtables nor any of the inline functions defined in foo.h
1082 will ever be output.
1084 There are cases when we want to link files such as "defs.h" and
1085 "main.cc". In this case, we give "defs.h" a `#pragma interface',
1086 and "main.cc" has `#pragma implementation "defs.h"'. */
1091 struct impl_files *next;
1094 static struct impl_files *impl_file_chain;
1096 /* Helper function to load global variables with interface
1100 extract_interface_info ()
1104 if (flag_alt_external_templates)
1106 struct tinst_level *til = tinst_for_decl ();
1109 fileinfo = get_time_identifier (til->file);
1112 fileinfo = get_time_identifier (input_filename);
1113 fileinfo = IDENTIFIER_CLASS_VALUE (fileinfo);
1114 interface_only = TREE_INT_CST_LOW (fileinfo);
1115 interface_unknown = TREE_INT_CST_HIGH (fileinfo);
1118 /* Return nonzero if S is not considered part of an
1119 INTERFACE/IMPLEMENTATION pair. Otherwise, return 0. */
1122 interface_strcmp (s)
1125 /* Set the interface/implementation bits for this scope. */
1126 struct impl_files *ifiles;
1129 for (ifiles = impl_file_chain; ifiles; ifiles = ifiles->next)
1131 char *t1 = ifiles->filename;
1134 if (*s1 != *t1 || *s1 == 0)
1137 while (*s1 == *t1 && *s1 != 0)
1144 /* Don't get faked out by xxx.yyy.cc vs xxx.zzz.cc. */
1145 if (index (s1, '.') || index (t1, '.'))
1148 if (*s1 == '\0' || s1[-1] != '.' || t1[-1] != '.')
1160 set_typedecl_interface_info (prev, vars)
1163 tree id = get_time_identifier (DECL_SOURCE_FILE (vars));
1164 tree fileinfo = IDENTIFIER_CLASS_VALUE (id);
1165 tree type = TREE_TYPE (vars);
1167 CLASSTYPE_INTERFACE_ONLY (type) = TREE_INT_CST_LOW (fileinfo)
1168 = interface_strcmp (file_name_nondirectory (DECL_SOURCE_FILE (vars)));
1172 set_vardecl_interface_info (prev, vars)
1175 tree type = DECL_CONTEXT (vars);
1177 if (CLASSTYPE_INTERFACE_KNOWN (type))
1179 if (CLASSTYPE_INTERFACE_ONLY (type))
1180 set_typedecl_interface_info (prev, TYPE_MAIN_DECL (type));
1182 CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 1;
1183 DECL_EXTERNAL (vars) = CLASSTYPE_INTERFACE_ONLY (type);
1184 TREE_PUBLIC (vars) = 1;
1190 /* Called from the top level: if there are any pending inlines to
1191 do, set up to process them now. This function sets up the first function
1192 to be parsed; after it has been, the rule for fndef in parse.y will
1193 call process_next_inline to start working on the next one. */
1196 do_pending_inlines ()
1198 struct pending_inline *t;
1201 /* Oops, we're still dealing with the last batch. */
1202 if (yychar == PRE_PARSED_FUNCTION_DECL)
1205 /* Reverse the pending inline functions, since
1206 they were cons'd instead of appended. */
1208 struct pending_inline *prev = 0, *tail;
1209 t = pending_inlines;
1210 pending_inlines = 0;
1225 /* Now start processing the first inline function. */
1226 context = hack_decl_function_context (t->fndecl);
1228 push_cp_function_context (context);
1229 maybe_begin_member_template_processing (t->fndecl);
1232 feed_input (t->buf, t->len);
1235 if (input_filename != t->filename)
1237 input_filename = t->filename;
1238 /* Get interface/implementation back in sync. */
1239 extract_interface_info ();
1242 input_filename = t->filename;
1243 interface_unknown = t->interface == 1;
1244 interface_only = t->interface == 0;
1246 yychar = PRE_PARSED_FUNCTION_DECL;
1248 /* Pass back a handle on the rest of the inline functions, so that they
1249 can be processed later. */
1250 yylval.ttype = build_tree_list ((tree) t, t->fndecl);
1251 DECL_PENDING_INLINE_INFO (t->fndecl) = 0;
1254 static int nextchar = -1;
1256 /* Called from the fndecl rule in the parser when the function just parsed
1257 was declared using a PRE_PARSED_FUNCTION_DECL (i.e. came from
1258 do_pending_inlines). */
1261 process_next_inline (t)
1265 struct pending_inline *i = (struct pending_inline *) TREE_PURPOSE (t);
1266 context = hack_decl_function_context (i->fndecl);
1267 maybe_end_member_template_processing (i->fndecl);
1269 pop_cp_function_context (context);
1271 if (yychar == YYEMPTY)
1273 if (yychar != END_OF_SAVED_INPUT)
1275 error ("parse error at end of saved function text");
1277 /* restore_pending_input will abort unless yychar is either
1278 END_OF_SAVED_INPUT or YYEMPTY; since we already know we're
1279 hosed, feed back YYEMPTY. We also need to discard nextchar,
1280 since that may have gotten set as well. */
1285 if (i && i->fndecl != NULL_TREE)
1287 context = hack_decl_function_context (i->fndecl);
1289 push_cp_function_context (context);
1290 maybe_begin_member_template_processing (i->fndecl);
1291 feed_input (i->buf, i->len);
1293 input_filename = i->filename;
1294 yychar = PRE_PARSED_FUNCTION_DECL;
1295 yylval.ttype = build_tree_list ((tree) i, i->fndecl);
1296 DECL_PENDING_INLINE_INFO (i->fndecl) = 0;
1300 interface_unknown = i->interface == 1;
1301 interface_only = i->interface == 0;
1304 extract_interface_info ();
1307 /* Since inline methods can refer to text which has not yet been seen,
1308 we store the text of the method in a structure which is placed in the
1309 DECL_PENDING_INLINE_INFO field of the FUNCTION_DECL.
1310 After parsing the body of the class definition, the FUNCTION_DECL's are
1311 scanned to see which ones have this field set. Those are then digested
1314 This function's FUNCTION_DECL will have a bit set in its common so
1315 that we know to watch out for it. */
1318 consume_string (this_obstack, matching_char)
1319 register struct obstack *this_obstack;
1323 int starting_lineno = lineno;
1329 int save_lineno = lineno;
1330 lineno = starting_lineno;
1331 if (matching_char == '"')
1332 error ("end of file encountered inside string constant");
1334 error ("end of file encountered inside character constant");
1335 lineno = save_lineno;
1340 obstack_1grow (this_obstack, c);
1342 obstack_1grow (this_obstack, c);
1344 /* Make sure we continue the loop */
1351 pedwarn ("ANSI C++ forbids newline in string constant");
1354 obstack_1grow (this_obstack, c);
1356 while (c != matching_char);
1359 static int nextyychar = YYEMPTY;
1360 static YYSTYPE nextyylval;
1362 struct pending_input {
1363 int nextchar, yychar, nextyychar, eof;
1364 YYSTYPE yylval, nextyylval;
1365 struct obstack token_obstack;
1369 struct pending_input *
1370 save_pending_input ()
1372 struct pending_input *p;
1373 p = (struct pending_input *) xmalloc (sizeof (struct pending_input));
1374 p->nextchar = nextchar;
1376 p->nextyychar = nextyychar;
1378 p->nextyylval = nextyylval;
1379 p->eof = end_of_file;
1380 yychar = nextyychar = YYEMPTY;
1382 p->first_token = first_token;
1383 p->token_obstack = token_obstack;
1386 gcc_obstack_init (&token_obstack);
1392 restore_pending_input (p)
1393 struct pending_input *p;
1395 my_friendly_assert (nextchar == -1, 229);
1396 nextchar = p->nextchar;
1397 my_friendly_assert (yychar == YYEMPTY || yychar == END_OF_SAVED_INPUT, 230);
1399 my_friendly_assert (nextyychar == YYEMPTY, 231);
1400 nextyychar = p->nextyychar;
1402 nextyylval = p->nextyylval;
1403 first_token = p->first_token;
1404 obstack_free (&token_obstack, (char *) 0);
1405 token_obstack = p->token_obstack;
1406 end_of_file = p->eof;
1410 /* Unget character CH from the input stream.
1411 If RESCAN is non-zero, then we want to `see' this
1412 character as the next input token. */
1415 yyungetc (ch, rescan)
1419 /* Unget a character from the input stream. */
1420 if (yychar == YYEMPTY || rescan == 0)
1423 put_back (nextchar);
1428 my_friendly_assert (nextyychar == YYEMPTY, 232);
1429 nextyychar = yychar;
1430 nextyylval = yylval;
1436 clear_inline_text_obstack ()
1438 obstack_free (&inline_text_obstack, inline_text_firstobj);
1441 /* This function stores away the text for an inline function that should
1442 be processed later. It decides how much later, and may need to move
1443 the info between obstacks; therefore, the caller should not refer to
1444 the T parameter after calling this function. */
1447 store_pending_inline (decl, t)
1449 struct pending_inline *t;
1452 DECL_PENDING_INLINE_INFO (decl) = t;
1454 /* Because we use obstacks, we must process these in precise order. */
1455 t->next = pending_inlines;
1456 pending_inlines = t;
1460 reinit_parse_for_method (yychar, decl)
1465 int starting_lineno = lineno;
1466 char *starting_filename = input_filename;
1468 reinit_parse_for_block (yychar, &inline_text_obstack);
1470 len = obstack_object_size (&inline_text_obstack);
1471 current_base_init_list = NULL_TREE;
1472 current_member_init_list = NULL_TREE;
1473 if (decl == void_type_node
1474 || (current_class_type && TYPE_REDEFINED (current_class_type)))
1476 /* Happens when we get two declarations of the same
1477 function in the same scope. */
1478 char *buf = obstack_finish (&inline_text_obstack);
1479 obstack_free (&inline_text_obstack, buf);
1484 struct pending_inline *t;
1485 char *buf = obstack_finish (&inline_text_obstack);
1487 t = (struct pending_inline *) obstack_alloc (&inline_text_obstack,
1488 sizeof (struct pending_inline));
1489 t->lineno = starting_lineno;
1490 t->filename = starting_filename;
1497 if (interface_unknown && processing_template_defn && flag_external_templates && ! DECL_IN_SYSTEM_HEADER (decl))
1498 warn_if_unknown_interface (decl);
1500 t->interface = (interface_unknown ? 1 : (interface_only ? 0 : 2));
1501 store_pending_inline (decl, t);
1505 /* Consume a block -- actually, a method beginning
1506 with `:' or `{' -- and save it away on the specified obstack. */
1509 reinit_parse_for_block (pyychar, obstackp)
1511 struct obstack *obstackp;
1515 int starting_lineno = lineno;
1516 char *starting_filename = input_filename;
1518 int look_for_semicolon = 0;
1519 int look_for_lbrac = 0;
1522 obstack_1grow (obstackp, '{');
1523 else if (pyychar == '=')
1524 look_for_semicolon = 1;
1525 else if (pyychar == ':')
1527 obstack_1grow (obstackp, pyychar);
1531 else if (pyychar == RETURN)
1533 obstack_grow (obstackp, "return", 6);
1537 else if (pyychar == TRY)
1539 obstack_grow (obstackp, "try", 3);
1545 yyerror ("parse error in method specification");
1546 obstack_1grow (obstackp, '{');
1549 if (nextchar != EOF)
1559 int this_lineno = lineno;
1561 c = skip_white_space (c);
1563 /* Don't lose our cool if there are lots of comments. */
1564 if (lineno == this_lineno + 1)
1565 obstack_1grow (obstackp, '\n');
1566 else if (lineno == this_lineno)
1568 else if (lineno - this_lineno < 10)
1571 for (i = lineno - this_lineno; i > 0; i--)
1572 obstack_1grow (obstackp, '\n');
1577 sprintf (buf, "\n# %d \"", lineno);
1579 obstack_grow (obstackp, buf, len);
1581 len = strlen (input_filename);
1582 obstack_grow (obstackp, input_filename, len);
1583 obstack_1grow (obstackp, '\"');
1584 obstack_1grow (obstackp, '\n');
1587 while (c > ' ') /* ASCII dependent... */
1589 obstack_1grow (obstackp, c);
1598 if (blev == 0 && !look_for_semicolon)
1602 if (peekyylex () == CATCH)
1605 obstack_grow (obstackp, " catch ", 7);
1622 /* Don't act on the next character...e.g, doing an escaped
1627 error_with_file_and_line (starting_filename,
1629 "end of file read inside definition");
1632 obstack_1grow (obstackp, c);
1635 consume_string (obstackp, c);
1637 consume_string (obstackp, c);
1642 error ("function body for constructor missing");
1643 obstack_1grow (obstackp, '{');
1644 obstack_1grow (obstackp, '}');
1648 else if (look_for_semicolon && blev == 0)
1656 error_with_file_and_line (starting_filename,
1658 "end of file read inside definition");
1663 obstack_1grow (obstackp, c);
1668 obstack_1grow (obstackp, '\0');
1671 /* Consume a no-commas expression -- actually, a default argument -- and
1672 save it away on the specified obstack. */
1675 reinit_parse_for_expr (obstackp)
1676 struct obstack *obstackp;
1679 int starting_lineno = lineno;
1680 char *starting_filename = input_filename;
1684 if (nextchar != EOF)
1694 int this_lineno = lineno;
1696 c = skip_white_space (c);
1698 /* Don't lose our cool if there are lots of comments. */
1699 if (lineno == this_lineno + 1)
1700 obstack_1grow (obstackp, '\n');
1701 else if (lineno == this_lineno)
1703 else if (lineno - this_lineno < 10)
1706 for (i = lineno - this_lineno; i > 0; --i)
1707 obstack_1grow (obstackp, '\n');
1712 sprintf (buf, "\n# %d \"", lineno);
1714 obstack_grow (obstackp, buf, len);
1716 len = strlen (input_filename);
1717 obstack_grow (obstackp, input_filename, len);
1718 obstack_1grow (obstackp, '\"');
1719 obstack_1grow (obstackp, '\n');
1722 while (c > ' ') /* ASCII dependent... */
1724 if (plev <= 0 && (c == ')' || c == ','))
1729 obstack_1grow (obstackp, c);
1730 if (c == '(' || c == '[')
1732 else if (c == ']' || c == ')')
1736 /* Don't act on the next character...e.g, doing an escaped
1741 error_with_file_and_line (starting_filename,
1743 "end of file read inside definition");
1746 obstack_1grow (obstackp, c);
1749 consume_string (obstackp, c);
1751 consume_string (obstackp, c);
1757 error_with_file_and_line (starting_filename,
1759 "end of file read inside definition");
1764 obstack_1grow (obstackp, c);
1769 obstack_1grow (obstackp, '\0');
1772 int do_snarf_defarg;
1774 /* Decide whether the default argument we are about to see should be
1775 gobbled up as text for later parsing. */
1778 maybe_snarf_defarg ()
1780 if (current_class_type && TYPE_BEING_DEFINED (current_class_type))
1781 do_snarf_defarg = 1;
1784 /* When we see a default argument in a method declaration, we snarf it as
1785 text using snarf_defarg. When we get up to namespace scope, we then go
1786 through and parse all of them using do_pending_defargs. Since yacc
1787 parsers are not reentrant, we retain defargs state in these two
1788 variables so that subsequent calls to do_pending_defargs can resume
1789 where the previous call left off. */
1801 reinit_parse_for_expr (&inline_text_obstack);
1802 len = obstack_object_size (&inline_text_obstack);
1803 buf = obstack_finish (&inline_text_obstack);
1805 push_obstacks (&inline_text_obstack, &inline_text_obstack);
1806 arg = make_node (DEFAULT_ARG);
1807 DEFARG_LENGTH (arg) = len - 1;
1808 DEFARG_POINTER (arg) = buf;
1814 /* Called from grokfndecl to note a function decl with unparsed default
1815 arguments for later processing. Also called from grokdeclarator
1816 for function types with unparsed defargs; the call from grokfndecl
1817 will always come second, so we can overwrite the entry from the type. */
1820 add_defarg_fn (decl)
1823 if (TREE_CODE (decl) == FUNCTION_DECL)
1824 TREE_VALUE (defarg_fns) = decl;
1827 push_obstacks (&inline_text_obstack, &inline_text_obstack);
1828 defarg_fns = tree_cons (current_class_type, decl, defarg_fns);
1833 /* Helper for do_pending_defargs. Starts the parsing of a default arg. */
1839 tree d = TREE_PURPOSE (p);
1840 feed_input (DEFARG_POINTER (d), DEFARG_LENGTH (d));
1841 if (TREE_CODE (f) == FUNCTION_DECL)
1843 lineno = DECL_SOURCE_LINE (f);
1844 input_filename = DECL_SOURCE_FILE (f);
1846 yychar = DEFARG_MARKER;
1850 /* Helper for do_pending_defargs. Ends the parsing of a default arg. */
1855 if (yychar == YYEMPTY)
1857 if (yychar != END_OF_SAVED_INPUT)
1859 error ("parse error at end of saved function text");
1861 /* restore_pending_input will abort unless yychar is either
1862 END_OF_SAVED_INPUT or YYEMPTY; since we already know we're
1863 hosed, feed back YYEMPTY. We also need to discard nextchar,
1864 since that may have gotten set as well. */
1871 /* Main function for deferred parsing of default arguments. Called from
1875 do_pending_defargs ()
1880 for (; defarg_fns; defarg_fns = TREE_CHAIN (defarg_fns))
1882 tree defarg_fn = TREE_VALUE (defarg_fns);
1883 if (defarg_parm == NULL_TREE)
1885 push_nested_class (TREE_PURPOSE (defarg_fns), 1);
1887 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1888 maybe_begin_member_template_processing (defarg_fn);
1890 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1894 for (p = DECL_ARGUMENTS (defarg_fn); p; p = TREE_CHAIN (p))
1895 pushdecl (copy_node (p));
1897 defarg_parm = TYPE_ARG_TYPES (TREE_TYPE (defarg_fn));
1900 defarg_parm = TYPE_ARG_TYPES (defarg_fn);
1903 defarg_parm = TREE_CHAIN (defarg_parm);
1905 for (; defarg_parm; defarg_parm = TREE_CHAIN (defarg_parm))
1906 if (TREE_PURPOSE (defarg_parm)
1907 && TREE_CODE (TREE_PURPOSE (defarg_parm)) == DEFAULT_ARG)
1909 feed_defarg (defarg_fn, defarg_parm);
1911 /* Return to the parser, which will process this defarg
1912 and call us again. */
1916 if (TREE_CODE (defarg_fn) == FUNCTION_DECL)
1917 maybe_end_member_template_processing (defarg_fn);
1919 pop_nested_class (1);
1923 /* Build a default function named NAME for type TYPE.
1924 KIND says what to build.
1926 When KIND == 0, build default destructor.
1927 When KIND == 1, build virtual destructor.
1928 When KIND == 2, build default constructor.
1929 When KIND == 3, build default X(const X&) constructor.
1930 When KIND == 4, build default X(X&) constructor.
1931 When KIND == 5, build default operator = (const X&).
1932 When KIND == 6, build default operator = (X&). */
1935 cons_up_default_function (type, full_name, kind)
1936 tree type, full_name;
1939 extern tree void_list_node;
1940 tree declspecs = NULL_TREE;
1941 tree fn, args = NULL_TREE;
1944 tree name = constructor_name (full_name);
1950 declspecs = build_decl_list (NULL_TREE, ridpointers [(int) RID_VIRTUAL]);
1951 /* Fall through... */
1953 name = build_parse_node (BIT_NOT_EXPR, name);
1954 args = void_list_node;
1958 /* Default constructor. */
1959 args = void_list_node;
1963 type = build_type_variant (type, 1, 0);
1964 /* Fall through... */
1966 /* According to ARM $12.8, the default copy ctor will be declared, but
1967 not defined, unless it's needed. */
1968 argtype = build_reference_type (type);
1969 args = tree_cons (NULL_TREE,
1970 build_tree_list (hash_tree_chain (argtype, NULL_TREE),
1971 get_identifier ("_ctor_arg")),
1978 declspecs = build_decl_list (NULL_TREE, type);
1981 type = build_type_variant (type, 1, 0);
1983 name = ansi_opname [(int) MODIFY_EXPR];
1985 argtype = build_reference_type (type);
1986 args = tree_cons (NULL_TREE,
1987 build_tree_list (hash_tree_chain (argtype, NULL_TREE),
1988 get_identifier ("_ctor_arg")),
1993 my_friendly_abort (59);
1996 declspecs = decl_tree_cons (NULL_TREE, ridpointers [(int) RID_INLINE],
1999 TREE_PARMLIST (args) = 1;
2002 tree declarator = make_call_declarator (name, args, NULL_TREE, NULL_TREE);
2004 declarator = build_parse_node (ADDR_EXPR, declarator);
2006 fn = grokfield (declarator, declspecs, NULL_TREE, NULL_TREE, NULL_TREE);
2009 if (fn == void_type_node)
2013 SET_DECL_ARTIFICIAL (TREE_CHAIN (DECL_ARGUMENTS (fn)));
2016 if (processing_template_defn)
2018 SET_DECL_IMPLICIT_INSTANTIATION (fn);
2019 repo_template_used (fn);
2024 if (CLASSTYPE_INTERFACE_KNOWN (type))
2026 DECL_INTERFACE_KNOWN (fn) = 1;
2027 DECL_NOT_REALLY_EXTERN (fn) = (!CLASSTYPE_INTERFACE_ONLY (type)
2028 && flag_implement_inlines);
2032 DECL_NOT_REALLY_EXTERN (fn) = 1;
2034 mark_inline_for_output (fn);
2036 #ifdef DEBUG_DEFAULT_FUNCTIONS
2037 { char *fn_type = NULL;
2041 case 0: fn_type = "default destructor"; break;
2042 case 1: fn_type = "virtual destructor"; break;
2043 case 2: fn_type = "default constructor"; break;
2044 case 3: fn_type = "default X(const X&)"; break;
2045 case 4: fn_type = "default X(X&)"; break;
2049 if (TREE_CODE (name) == BIT_NOT_EXPR)
2050 t = TREE_OPERAND (name, 0);
2051 fprintf (stderr, "[[[[ %s for %s:\n%s]]]]\n", fn_type,
2052 IDENTIFIER_POINTER (t), func_buf);
2055 #endif /* DEBUG_DEFAULT_FUNCTIONS */
2057 /* Show that this function was generated by the compiler. */
2058 SET_DECL_ARTIFICIAL (fn);
2063 /* Heuristic to tell whether the user is missing a semicolon
2064 after a struct or enum declaration. Emit an error message
2065 if we know the user has blown it. */
2068 check_for_missing_semicolon (type)
2076 && yychar != IDENTIFIER
2077 && yychar != TYPENAME
2078 && yychar != CV_QUALIFIER
2079 && yychar != SELFNAME)
2082 if (ANON_AGGRNAME_P (TYPE_IDENTIFIER (type)))
2083 error ("semicolon missing after %s declaration",
2084 TREE_CODE (type) == ENUMERAL_TYPE ? "enum" : "struct");
2086 cp_error ("semicolon missing after declaration of `%T'", type);
2087 shadow_tag (build_tree_list (0, type));
2089 /* Could probably also hack cases where class { ... } f (); appears. */
2094 note_got_semicolon (type)
2097 if (TREE_CODE_CLASS (TREE_CODE (type)) != 't')
2098 my_friendly_abort (60);
2099 if (IS_AGGR_TYPE (type))
2100 CLASSTYPE_GOT_SEMICOLON (type) = 1;
2104 note_list_got_semicolon (declspecs)
2109 for (link = declspecs; link; link = TREE_CHAIN (link))
2111 tree type = TREE_VALUE (link);
2112 if (TREE_CODE_CLASS (TREE_CODE (type)) == 't')
2113 note_got_semicolon (type);
2118 /* If C is not whitespace, return C.
2119 Otherwise skip whitespace and return first nonwhite char read. */
2122 skip_white_space (c)
2130 c = check_newline ();
2141 while (c == ' ' || c == '\t');
2149 error ("stray '\\' in program");
2161 /* Make the token buffer longer, preserving the data in it.
2162 P should point to just beyond the last valid character in the old buffer.
2163 The value we return is a pointer to the new buffer
2164 at a place corresponding to P. */
2167 extend_token_buffer (p)
2170 int offset = p - token_buffer;
2172 maxtoken = maxtoken * 2 + 10;
2173 token_buffer = (char *) xrealloc (token_buffer, maxtoken + 2);
2175 return token_buffer + offset;
2179 get_last_nonwhite_on_line ()
2183 /* Is this the last nonwhite stuff on the line? */
2185 c = nextchar, nextchar = -1;
2189 while (c == ' ' || c == '\t')
2194 /* At the beginning of a line, increment the line number
2195 and process any #-directive on this line.
2196 If the line is a #-directive, read the entire line and return a newline.
2197 Otherwise, return the line's first non-whitespace character. */
2201 #ifdef HANDLE_SYSV_PRAGMA
2202 static int handle_sysv_pragma PROTO((FILE *, int));
2204 static int handle_cp_pragma PROTO((char *));
2212 /* Read first nonwhite char on the line. Do this before incrementing the
2213 line number, in case we're at the end of saved text. */
2217 while (c == ' ' || c == '\t');
2223 /* If not #, return it so caller will use it. */
2227 /* Don't read beyond this line. */
2230 /* Read first nonwhite char after the `#'. */
2234 while (c == ' ' || c == '\t');
2236 /* If a letter follows, then if the word here is `line', skip
2237 it and ignore it; otherwise, ignore the line, with an error
2238 if the word isn't `pragma'. */
2240 if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
2250 token = real_yylex ();
2251 if (token == IDENTIFIER
2252 && TREE_CODE (yylval.ttype) == IDENTIFIER_NODE)
2254 /* If this is 1, we handled it; if it's -1, it was one we
2255 wanted but had something wrong with it. Only if it's
2256 0 was it not handled. */
2257 if (handle_cp_pragma (IDENTIFIER_POINTER (yylval.ttype)))
2260 else if (token == END_OF_LINE)
2263 #ifdef HANDLE_SYSV_PRAGMA
2264 if (handle_sysv_pragma (finput, token))
2267 #ifdef HANDLE_PRAGMA
2268 if (HANDLE_PRAGMA (finput, yylval.ttype))
2282 && ((c = getch ()) == ' ' || c == '\t'))
2284 debug_define (lineno, get_directive_line (finput));
2294 && ((c = getch ()) == ' ' || c == '\t'))
2296 debug_undef (lineno, get_directive_line (finput));
2305 && ((c = getch ()) == ' ' || c == '\t'))
2314 && ((c = getch ()) == ' ' || c == '\t'))
2316 #ifdef ASM_OUTPUT_IDENT
2317 extern FILE *asm_out_file;
2319 /* #ident. The pedantic warning is now in cccp.c. */
2321 /* Here we have just seen `#ident '.
2322 A string constant should follow. */
2324 token = real_yylex ();
2325 if (token == END_OF_LINE)
2328 || TREE_CODE (yylval.ttype) != STRING_CST)
2330 error ("invalid #ident");
2334 if (! flag_no_ident)
2336 #ifdef ASM_OUTPUT_IDENT
2337 ASM_OUTPUT_IDENT (asm_out_file,
2338 TREE_STRING_POINTER (yylval.ttype));
2342 /* Skip the rest of this line. */
2355 && ((c = getch ()) == ' ' || c == '\t'))
2357 /* Used to test incremental compilation. */
2358 sorry ("#pragma newworld");
2362 error ("undefined or invalid # directive");
2367 /* Here we have either `#line' or `# <nonletter>'.
2368 In either case, it should be a line number; a digit should follow. */
2370 while (c == ' ' || c == '\t')
2373 /* If the # is the only nonwhite char on the line,
2374 just ignore it. Check the new newline. */
2378 /* Something follows the #; read a token. */
2381 token = real_yylex ();
2383 if (token == CONSTANT
2384 && TREE_CODE (yylval.ttype) == INTEGER_CST)
2386 int old_lineno = lineno;
2387 enum { act_none, act_push, act_pop } action = act_none;
2388 int entering_system_header = 0;
2389 int entering_c_header = 0;
2391 /* subtract one, because it is the following line that
2392 gets the specified number */
2394 int l = TREE_INT_CST_LOW (yylval.ttype) - 1;
2395 c = get_last_nonwhite_on_line ();
2398 /* No more: store the line number and check following line. */
2404 /* More follows: it must be a string constant (filename). */
2406 /* Read the string constant, but don't treat \ as special. */
2407 ignore_escape_flag = 1;
2408 token = real_yylex ();
2409 ignore_escape_flag = 0;
2411 if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
2413 error ("invalid #line");
2417 /* Changing files again. This means currently collected time
2418 is charged against header time, and body time starts back
2420 if (flag_detailed_statistics)
2422 int this_time = my_get_run_time ();
2423 tree time_identifier = get_time_identifier (TREE_STRING_POINTER (yylval.ttype));
2424 header_time += this_time - body_time;
2425 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (this_filename_time))
2426 += this_time - body_time;
2427 this_filename_time = time_identifier;
2428 body_time = this_time;
2432 = (char *) permalloc (TREE_STRING_LENGTH (yylval.ttype) + 1);
2433 strcpy (input_filename, TREE_STRING_POINTER (yylval.ttype));
2435 GNU_xref_file (input_filename);
2437 if (main_input_filename == 0)
2439 struct impl_files *ifiles = impl_file_chain;
2443 while (ifiles->next)
2444 ifiles = ifiles->next;
2445 ifiles->filename = file_name_nondirectory (input_filename);
2448 main_input_filename = input_filename;
2449 if (write_virtuals == 3)
2450 walk_vtables (set_typedecl_interface_info, set_vardecl_interface_info);
2453 extract_interface_info ();
2455 c = get_last_nonwhite_on_line ();
2458 /* Update the name in the top element of input_file_stack. */
2459 if (input_file_stack)
2460 input_file_stack->name = input_filename;
2466 token = real_yylex ();
2468 /* `1' after file name means entering new file.
2469 `2' after file name means just left a file. */
2471 if (token == CONSTANT
2472 && TREE_CODE (yylval.ttype) == INTEGER_CST)
2474 if (TREE_INT_CST_LOW (yylval.ttype) == 1)
2476 else if (TREE_INT_CST_LOW (yylval.ttype) == 2)
2481 c = get_last_nonwhite_on_line ();
2485 token = real_yylex ();
2490 /* `3' after file name means this is a system header file. */
2492 if (token == CONSTANT
2493 && TREE_CODE (yylval.ttype) == INTEGER_CST
2494 && TREE_INT_CST_LOW (yylval.ttype) == 3)
2496 entering_system_header = 1;
2498 c = get_last_nonwhite_on_line ();
2502 token = real_yylex ();
2506 /* `4' after file name means this is a C header file. */
2508 if (token == CONSTANT
2509 && TREE_CODE (yylval.ttype) == INTEGER_CST
2510 && TREE_INT_CST_LOW (yylval.ttype) == 4)
2512 entering_c_header = 1;
2514 c = get_last_nonwhite_on_line ();
2518 token = real_yylex ();
2522 /* Do the actions implied by the preceding numbers. */
2524 if (action == act_push)
2526 /* Pushing to a new file. */
2527 struct file_stack *p;
2529 p = (struct file_stack *) xmalloc (sizeof (struct file_stack));
2530 input_file_stack->line = old_lineno;
2531 p->next = input_file_stack;
2532 p->name = input_filename;
2533 input_file_stack = p;
2534 input_file_stack_tick++;
2535 debug_start_source_file (input_filename);
2536 in_system_header = entering_system_header;
2539 else if (entering_c_header)
2542 ++pending_lang_change;
2545 else if (action == act_pop)
2547 /* Popping out of a file. */
2548 if (input_file_stack->next)
2550 struct file_stack *p;
2552 if (c_header_level && --c_header_level == 0)
2554 if (entering_c_header)
2555 warning ("badly nested C headers from preprocessor");
2556 --pending_lang_change;
2558 in_system_header = entering_system_header;
2560 p = input_file_stack;
2561 input_file_stack = p->next;
2563 input_file_stack_tick++;
2564 debug_end_source_file (input_file_stack->line);
2567 error ("#-lines for entering and leaving files don't match");
2570 in_system_header = entering_system_header;
2573 /* If NEXTCHAR is not end of line, we don't care what it is. */
2574 if (nextchar == EOF)
2578 error ("invalid #-line");
2580 /* skip the rest of this line. */
2585 while ((c = getch ()) != EOF && c != '\n');
2590 do_pending_lang_change ()
2592 for (; pending_lang_change > 0; --pending_lang_change)
2593 push_lang_context (lang_name_c);
2594 for (; pending_lang_change < 0; ++pending_lang_change)
2595 pop_lang_context ();
2598 #define ENDFILE -1 /* token that represents end-of-file */
2600 /* Read an escape sequence, returning its equivalent as a character,
2601 or store 1 in *ignore_ptr if it is backslash-newline. */
2604 readescape (ignore_ptr)
2607 register int c = getch ();
2609 register unsigned count;
2610 unsigned firstdig = 0;
2628 if (c >= 'a' && c <= 'f')
2629 code += c - 'a' + 10;
2630 if (c >= 'A' && c <= 'F')
2631 code += c - 'A' + 10;
2632 if (c >= '0' && c <= '9')
2634 if (code != 0 || count != 0)
2643 error ("\\x used with no following hex digits");
2644 else if (count == 0)
2645 /* Digits are all 0's. Ok. */
2647 else if ((count - 1) * 4 >= TYPE_PRECISION (integer_type_node)
2649 && ((1 << (TYPE_PRECISION (integer_type_node) - (count - 1) * 4))
2651 pedwarn ("hex escape out of range");
2654 case '0': case '1': case '2': case '3': case '4':
2655 case '5': case '6': case '7':
2658 while ((c <= '7') && (c >= '0') && (count++ < 3))
2660 code = (code * 8) + (c - '0');
2666 case '\\': case '\'': case '"':
2675 return TARGET_NEWLINE;
2698 pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c);
2704 /* `\(', etc, are used at beginning of line to avoid confusing Emacs. */
2708 /* `\%' is used to prevent SCCS from getting confused. */
2711 pedwarn ("unknown escape sequence `\\%c'", c);
2714 if (c >= 040 && c < 0177)
2715 pedwarn ("unknown escape sequence `\\%c'", c);
2717 pedwarn ("unknown escape sequence: `\\' followed by char code 0x%x", c);
2721 /* Value is 1 (or 2) if we should try to make the next identifier look like
2722 a typename (when it may be a local variable or a class variable).
2723 Value is 0 if we treat this name in a default fashion. */
2724 int looking_for_typename = 0;
2730 identifier_type (decl)
2733 if (TREE_CODE (decl) == TEMPLATE_DECL)
2735 if (TREE_CODE (DECL_RESULT (decl)) == TYPE_DECL)
2737 else if (looking_for_template)
2740 if (looking_for_template && really_overloaded_fn (decl))
2743 for (t = decl; t != NULL_TREE; t = OVL_CHAIN (t))
2744 if (DECL_FUNCTION_TEMPLATE_P (OVL_FUNCTION (t)))
2747 if (TREE_CODE (decl) == NAMESPACE_DECL)
2749 if (TREE_CODE (decl) != TYPE_DECL)
2751 if (((got_scope && TREE_TYPE (decl) == got_scope)
2752 || TREE_TYPE (decl) == current_class_type)
2753 && DECL_ARTIFICIAL (decl))
2761 /* Only types expected, not even namespaces. */
2762 looking_for_typename = 2;
2764 if ((yychar = yylex ()) < 0) yychar = 0;
2765 looking_for_typename = 0;
2766 if (yychar == IDENTIFIER)
2768 lastiddecl = lookup_name (yylval.ttype, -2);
2769 if (lastiddecl == 0)
2772 lastiddecl = IDENTIFIER_LABEL_VALUE (yylval.ttype);
2775 yychar = identifier_type (lastiddecl);
2780 do_identifier (token, parsing)
2781 register tree token;
2786 if (! parsing || IDENTIFIER_OPNAME_P (token))
2787 id = lookup_name (token, 0);
2791 if (parsing && yychar == YYEMPTY)
2793 /* Scope class declarations before global
2795 if (id == IDENTIFIER_NAMESPACE_VALUE (token)
2796 && current_class_type != 0
2797 && TYPE_SIZE (current_class_type) == 0)
2799 /* Could be from one of the base classes. */
2800 tree field = lookup_field (current_class_type, token, 1, 0);
2803 else if (field == error_mark_node)
2804 /* We have already generated the error message.
2805 But we still want to return this value. */
2806 id = lookup_field (current_class_type, token, 0, 0);
2807 else if (TREE_CODE (field) == VAR_DECL
2808 || TREE_CODE (field) == CONST_DECL
2809 || TREE_CODE (field) == TEMPLATE_DECL)
2811 else if (TREE_CODE (field) != FIELD_DECL)
2812 my_friendly_abort (61);
2815 cp_error ("invalid use of member `%D' from base class `%T'", field,
2816 DECL_FIELD_CONTEXT (field));
2817 id = error_mark_node;
2822 /* Remember that this name has been used in the class definition, as per
2824 if (id && current_class_type && parsing
2825 && TYPE_BEING_DEFINED (current_class_type)
2826 && ! IDENTIFIER_CLASS_VALUE (token)
2827 /* Avoid breaking if we get called for a default argument that
2828 refers to an overloaded method. Eventually this will not be
2829 necessary, since default arguments shouldn't be parsed until
2830 after the class is complete. (jason 3/12/97) */
2831 && TREE_CODE (id) != OVERLOAD)
2832 pushdecl_class_level (id);
2834 if (!id || id == error_mark_node)
2836 if (id == error_mark_node && current_class_type != NULL_TREE)
2838 id = lookup_nested_field (token, 1);
2839 /* In lookup_nested_field(), we marked this so we can gracefully
2840 leave this whole mess. */
2841 if (id && id != error_mark_node && TREE_TYPE (id) == error_mark_node)
2845 if (current_template_parms)
2846 return build_min_nt (LOOKUP_EXPR, token, NULL_TREE);
2847 else if (IDENTIFIER_OPNAME_P (token))
2849 if (token != ansi_opname[ERROR_MARK])
2850 cp_error ("`%D' not defined", token);
2851 id = error_mark_node;
2853 else if (parsing && (yychar == '(' || yychar == LEFT_RIGHT))
2855 id = implicitly_declare (token);
2857 else if (current_function_decl == 0)
2859 cp_error ("`%D' was not declared in this scope", token);
2860 id = error_mark_node;
2864 if (IDENTIFIER_NAMESPACE_VALUE (token) != error_mark_node
2865 || IDENTIFIER_ERROR_LOCUS (token) != current_function_decl)
2867 static int undeclared_variable_notice;
2869 cp_error ("`%D' undeclared (first use this function)", token);
2871 if (! undeclared_variable_notice)
2873 error ("(Each undeclared identifier is reported only once");
2874 error ("for each function it appears in.)");
2875 undeclared_variable_notice = 1;
2878 id = error_mark_node;
2879 /* Prevent repeated error messages. */
2880 SET_IDENTIFIER_NAMESPACE_VALUE (token, error_mark_node);
2881 SET_IDENTIFIER_ERROR_LOCUS (token, current_function_decl);
2885 if (TREE_CODE (id) == VAR_DECL && DECL_DEAD_FOR_LOCAL (id))
2887 tree shadowed = DECL_SHADOWED_FOR_VAR (id);
2888 while (shadowed != NULL_TREE && TREE_CODE (shadowed) == VAR_DECL
2889 && DECL_DEAD_FOR_LOCAL (shadowed))
2890 shadowed = DECL_SHADOWED_FOR_VAR (shadowed);
2892 shadowed = IDENTIFIER_NAMESPACE_VALUE (DECL_NAME (id));
2895 if (!DECL_ERROR_REPORTED (id))
2897 warning ("name lookup of `%s' changed",
2898 IDENTIFIER_POINTER (token));
2899 cp_warning_at (" matches this `%D' under current ANSI rules",
2901 cp_warning_at (" matches this `%D' under old rules", id);
2902 DECL_ERROR_REPORTED (id) = 1;
2906 else if (!DECL_ERROR_REPORTED (id))
2909 = "name lookup of `%s' changed for new ANSI `for' scoping";
2910 DECL_ERROR_REPORTED (id) = 1;
2911 if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (id)))
2913 error (msg, IDENTIFIER_POINTER (token));
2914 cp_error_at (" cannot use obsolete binding at `%D' because it has a destructor", id);
2915 id = error_mark_node;
2919 pedwarn (msg, IDENTIFIER_POINTER (token));
2920 cp_pedwarn_at (" using obsolete binding at `%D'", id);
2924 /* TREE_USED is set in `hack_identifier'. */
2925 if (TREE_CODE (id) == CONST_DECL)
2927 if (IDENTIFIER_CLASS_VALUE (token) == id)
2930 tree access = compute_access (TYPE_BINFO (current_class_type), id);
2931 if (access == access_private_node)
2932 cp_error ("enum `%D' is private", id);
2933 /* protected is OK, since it's an enum of `this'. */
2935 if (! processing_template_decl
2936 || (DECL_INITIAL (id)
2937 && TREE_CODE (DECL_INITIAL (id)) == TEMPLATE_PARM_INDEX))
2938 id = DECL_INITIAL (id);
2941 id = hack_identifier (id, token);
2943 if (current_template_parms)
2945 if (is_overloaded_fn (id))
2947 tree t = build_min (LOOKUP_EXPR, unknown_type_node,
2948 token, get_first_fn (id));
2949 if (id != IDENTIFIER_NAMESPACE_VALUE (token))
2950 TREE_OPERAND (t, 1) = error_mark_node;
2953 else if (! TREE_PERMANENT (id) || TREE_CODE (id) == PARM_DECL
2954 || TREE_CODE (id) == USING_DECL)
2955 id = build_min (LOOKUP_EXPR, TREE_TYPE (id), token, error_mark_node);
2956 /* else just use the decl */
2963 do_scoped_id (token, parsing)
2968 /* during parsing, this is ::name. Otherwise, it is black magic. */
2971 struct tree_binding _b;
2972 id = binding_init (&_b);
2973 if (!qualified_lookup_using_namespace (token, global_namespace, id))
2976 id = BINDING_VALUE (id);
2979 id = IDENTIFIER_GLOBAL_VALUE (token);
2980 if (parsing && yychar == YYEMPTY)
2984 if (processing_template_decl)
2986 id = build_min_nt (LOOKUP_EXPR, token, NULL_TREE);
2987 LOOKUP_EXPR_GLOBAL (id) = 1;
2990 if (parsing && (yychar == '(' || yychar == LEFT_RIGHT))
2991 id = implicitly_declare (token);
2994 if (IDENTIFIER_NAMESPACE_VALUE (token) != error_mark_node)
2995 error ("undeclared variable `%s' (first use here)",
2996 IDENTIFIER_POINTER (token));
2997 id = error_mark_node;
2998 /* Prevent repeated error messages. */
2999 SET_IDENTIFIER_NAMESPACE_VALUE (token, error_mark_node);
3004 if (TREE_CODE (id) == ADDR_EXPR)
3005 mark_used (TREE_OPERAND (id, 0));
3006 else if (TREE_CODE (id) != OVERLOAD)
3009 if (TREE_CODE (id) == CONST_DECL && ! processing_template_decl)
3011 /* XXX CHS - should we set TREE_USED of the constant? */
3012 id = DECL_INITIAL (id);
3013 /* This is to prevent an enum whose value is 0
3014 from being considered a null pointer constant. */
3015 id = build1 (NOP_EXPR, TREE_TYPE (id), id);
3016 TREE_CONSTANT (id) = 1;
3019 if (processing_template_decl)
3021 if (is_overloaded_fn (id))
3023 id = build_min (LOOKUP_EXPR, unknown_type_node,
3024 token, get_first_fn (id));
3025 LOOKUP_EXPR_GLOBAL (id) = 1;
3027 /* else just use the decl */
3029 return convert_from_reference (id);
3033 identifier_typedecl_value (node)
3037 type = IDENTIFIER_TYPE_VALUE (node);
3038 if (type == NULL_TREE)
3043 if (t && TREE_CODE (t) == TYPE_DECL && TREE_TYPE (t) == type) \
3046 do (IDENTIFIER_LOCAL_VALUE (node));
3047 do (IDENTIFIER_CLASS_VALUE (node));
3048 do (IDENTIFIER_NAMESPACE_VALUE (node));
3050 /* Will this one ever happen? */
3051 if (TYPE_MAIN_DECL (type))
3052 return TYPE_MAIN_DECL (type);
3054 /* We used to do an internal error of 62 here, but instead we will
3055 handle the return of a null appropriately in the callers. */
3065 int dollar_seen = 0;
3069 c = nextchar, nextchar = -1;
3073 /* Effectively do c = skip_white_space (c)
3074 but do it faster in the usual cases. */
3087 /* Call skip_white_space so we can warn if appropriate. */
3092 c = skip_white_space (c);
3094 goto found_nonwhite;
3098 token_buffer[0] = c;
3099 token_buffer[1] = 0;
3101 /* yylloc.first_line = lineno; */
3106 token_buffer[0] = '\0';
3108 if (input_redirected ())
3109 value = END_OF_SAVED_INPUT;
3111 value = END_OF_LINE;
3117 if (! dollars_in_ident)
3118 error ("`$' in identifier");
3120 pedwarn ("`$' in identifier");
3125 /* Capital L may start a wide-string or wide-character constant. */
3127 register int c = getch ();
3136 goto string_constant;
3141 case 'A': case 'B': case 'C': case 'D': case 'E':
3142 case 'F': case 'G': case 'H': case 'I': case 'J':
3143 case 'K': case 'M': case 'N': case 'O':
3144 case 'P': case 'Q': case 'R': case 'S': case 'T':
3145 case 'U': case 'V': case 'W': case 'X': case 'Y':
3147 case 'a': case 'b': case 'c': case 'd': case 'e':
3148 case 'f': case 'g': case 'h': case 'i': case 'j':
3149 case 'k': case 'l': case 'm': case 'n': case 'o':
3150 case 'p': case 'q': case 'r': case 's': case 't':
3151 case 'u': case 'v': case 'w': case 'x': case 'y':
3161 /* We know that `token_buffer' can hold at least on char,
3162 so we install C immediately.
3163 We may have to read the value in `putback_char', so call
3168 /* Make this run fast. We know that we are reading straight
3169 from FINPUT in this case (since identifiers cannot straddle
3171 while (ISALNUM (c) || (c == '_') || c == '$')
3175 if (! dollars_in_ident)
3176 error ("`$' in identifier");
3178 pedwarn ("`$' in identifier");
3181 if (p >= token_buffer + maxtoken)
3182 p = extend_token_buffer (p);
3188 if (linemode && c == '\n')
3196 /* We know that `token_buffer' can hold at least on char,
3197 so we install C immediately. */
3201 while (ISALNUM (c) || (c == '_') || c == '$')
3205 if (! dollars_in_ident)
3206 error ("`$' in identifier");
3208 pedwarn ("`$' in identifier");
3211 if (p >= token_buffer + maxtoken)
3212 p = extend_token_buffer (p);
3225 /* Try to recognize a keyword. Uses minimum-perfect hash function */
3228 register struct resword *ptr;
3230 if ((ptr = is_reserved_word (token_buffer, p - token_buffer)))
3234 tree old_ttype = ridpointers[(int) ptr->rid];
3236 /* If this provides a type for us, then revert lexical
3237 state to standard state. */
3238 if (TREE_CODE (old_ttype) == IDENTIFIER_NODE
3239 && IDENTIFIER_GLOBAL_VALUE (old_ttype) != 0
3240 && TREE_CODE (IDENTIFIER_GLOBAL_VALUE (old_ttype)) == TYPE_DECL)
3241 looking_for_typename = 0;
3242 else if (ptr->token == AGGR || ptr->token == ENUM)
3243 looking_for_typename = 2;
3245 /* Check if this is a language-type declaration.
3246 Just glimpse the next non-white character. */
3247 nextchar = skip_white_space (nextchar);
3248 if (nextchar == '"')
3250 /* We are looking at a string. Complain
3251 if the token before the string is no `extern'.
3253 Could cheat some memory by placing this string
3254 on the temporary_, instead of the saveable_
3257 if (ptr->rid != RID_EXTERN)
3258 error ("invalid modifier `%s' for language string",
3261 value = EXTERN_LANG_STRING;
3262 yylval.ttype = get_identifier (TREE_STRING_POINTER (yylval.ttype));
3265 if (ptr->token == VISSPEC)
3270 yylval.ttype = access_public_node;
3273 yylval.ttype = access_private_node;
3276 yylval.ttype = access_protected_node;
3279 my_friendly_abort (63);
3283 yylval.ttype = old_ttype;
3285 else if (ptr->token == EQCOMPARE)
3287 yylval.code = NE_EXPR;
3288 token_buffer[0] = '!';
3289 token_buffer[1] = '=';
3290 token_buffer[2] = 0;
3292 else if (ptr->token == ASSIGN)
3294 if (strcmp ("and_eq", token_buffer) == 0)
3296 yylval.code = BIT_AND_EXPR;
3297 token_buffer[0] = '&';
3299 else if (strcmp ("or_eq", token_buffer) == 0)
3301 yylval.code = BIT_IOR_EXPR;
3302 token_buffer[0] = '|';
3304 else if (strcmp ("xor_eq", token_buffer) == 0)
3306 yylval.code = BIT_XOR_EXPR;
3307 token_buffer[0] = '^';
3309 token_buffer[1] = '=';
3310 token_buffer[2] = 0;
3312 else if (ptr->token == '&')
3314 yylval.code = BIT_AND_EXPR;
3315 token_buffer[0] = '&';
3316 token_buffer[1] = 0;
3318 else if (ptr->token == '|')
3320 yylval.code = BIT_IOR_EXPR;
3321 token_buffer[0] = '|';
3322 token_buffer[1] = 0;
3324 else if (ptr->token == '^')
3326 yylval.code = BIT_XOR_EXPR;
3327 token_buffer[0] = '^';
3328 token_buffer[1] = 0;
3331 value = (int) ptr->token;
3335 /* If we did not find a keyword, look for an identifier
3338 if (value == IDENTIFIER || value == TYPESPEC)
3339 GNU_xref_ref (current_function_decl, token_buffer);
3341 if (value == IDENTIFIER)
3343 register tree tmp = get_identifier (token_buffer);
3345 #if !defined(VMS) && defined(JOINER)
3346 /* Make sure that user does not collide with our internal
3350 && (THIS_NAME_P (tmp)
3351 || VPTR_NAME_P (tmp)
3352 || DESTRUCTOR_NAME_P (tmp)
3353 || VTABLE_NAME_P (tmp)
3354 || TEMP_NAME_P (tmp)
3355 || ANON_AGGRNAME_P (tmp)
3356 || ANON_PARMNAME_P (tmp)))
3357 warning ("identifier name `%s' conflicts with GNU C++ internal naming strategy",
3363 if (value == NEW && ! global_bindings_p ())
3373 register int c1 = getch ();
3374 token_buffer[0] = c;
3375 token_buffer[1] = c1;
3379 token_buffer[2] = 0;
3387 token_buffer[2] = c1;
3388 token_buffer[3] = 0;
3392 error ("parse error at `..'");
3397 goto resume_numerical_scan;
3401 token_buffer[1] = 0;
3405 /* Optimize for most frequent case. */
3407 register int c1 = getch ();
3408 if (! ISALNUM (c1) && c1 != '.')
3410 /* Terminate string. */
3411 token_buffer[0] = c;
3412 token_buffer[1] = 0;
3414 yylval.ttype = integer_zero_node;
3416 yylval.ttype = integer_one_node;
3423 /* fall through... */
3424 case '2': case '3': case '4':
3425 case '5': case '6': case '7': case '8': case '9':
3426 resume_numerical_scan:
3431 int largest_digit = 0;
3433 /* for multi-precision arithmetic,
3434 we actually store only HOST_BITS_PER_CHAR bits in each part.
3435 The number of parts is chosen so as to be sufficient to hold
3436 the enough bits to fit into the two HOST_WIDE_INTs that contain
3437 the integer value (this is always at least as many bits as are
3438 in a target `long long' value, but may be wider). */
3439 #define TOTAL_PARTS ((HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR) * 2 + 2)
3440 int parts[TOTAL_PARTS];
3443 enum anon1 { NOT_FLOAT, AFTER_POINT, TOO_MANY_POINTS} floatflag
3446 for (count = 0; count < TOTAL_PARTS; count++)
3454 *p++ = (c = getch ());
3455 if ((c == 'x') || (c == 'X'))
3458 *p++ = (c = getch ());
3460 /* Leading 0 forces octal unless the 0 is the only digit. */
3461 else if (c >= '0' && c <= '9')
3470 /* Read all the digits-and-decimal-points. */
3473 || (ISALNUM (c) && (c != 'l') && (c != 'L')
3474 && (c != 'u') && (c != 'U')
3475 && c != 'i' && c != 'I' && c != 'j' && c != 'J'
3476 && (floatflag == NOT_FLOAT || ((c != 'f') && (c != 'F')))))
3481 error ("floating constant may not be in radix 16");
3482 if (floatflag == TOO_MANY_POINTS)
3483 /* We have already emitted an error. Don't need another. */
3485 else if (floatflag == AFTER_POINT)
3487 error ("malformed floating constant");
3488 floatflag = TOO_MANY_POINTS;
3489 /* Avoid another error from atof by forcing all characters
3490 from here on to be ignored. */
3494 floatflag = AFTER_POINT;
3497 *p++ = c = getch ();
3498 /* Accept '.' as the start of a floating-point number
3499 only when it is followed by a digit.
3500 Otherwise, unread the following non-digit
3501 and use the '.' as a structural token. */
3502 if (p == token_buffer + 2 && !ISDIGIT (c))
3514 error ("parse error at `..'");
3517 token_buffer[1] = '\0';
3524 /* It is not a decimal point.
3525 It should be a digit (perhaps a hex digit). */
3531 else if (base <= 10)
3533 if (c == 'e' || c == 'E')
3536 floatflag = AFTER_POINT;
3537 break; /* start of exponent */
3539 error ("nondigits in number and not hexadecimal");
3550 if (c >= largest_digit)
3554 for (count = 0; count < TOTAL_PARTS; count++)
3556 parts[count] *= base;
3560 += (parts[count-1] >> HOST_BITS_PER_CHAR);
3562 &= (1 << HOST_BITS_PER_CHAR) - 1;
3568 /* If the extra highest-order part ever gets anything in it,
3569 the number is certainly too big. */
3570 if (parts[TOTAL_PARTS - 1] != 0)
3573 if (p >= token_buffer + maxtoken - 3)
3574 p = extend_token_buffer (p);
3575 *p++ = (c = getch ());
3580 error ("numeric constant with no digits");
3582 if (largest_digit >= base)
3583 error ("numeric constant contains digits beyond the radix");
3585 /* Remove terminating char from the token buffer and delimit the string */
3588 if (floatflag != NOT_FLOAT)
3590 tree type = double_type_node;
3591 int exceeds_double = 0;
3593 REAL_VALUE_TYPE value;
3596 /* Read explicit exponent if any, and put it in tokenbuf. */
3598 if ((c == 'e') || (c == 'E'))
3600 if (p >= token_buffer + maxtoken - 3)
3601 p = extend_token_buffer (p);
3604 if ((c == '+') || (c == '-'))
3610 error ("floating constant exponent has no digits");
3613 if (p >= token_buffer + maxtoken - 3)
3614 p = extend_token_buffer (p);
3623 /* Convert string to a double, checking for overflow. */
3624 if (setjmp (handler))
3626 error ("floating constant out of range");
3631 int fflag = 0, lflag = 0;
3632 /* Copy token_buffer now, while it has just the number
3633 and not the suffixes; once we add `f' or `i',
3634 REAL_VALUE_ATOF may not work any more. */
3635 char *copy = (char *) alloca (p - token_buffer + 1);
3636 bcopy (token_buffer, copy, p - token_buffer + 1);
3638 set_float_handler (handler);
3644 /* Read the suffixes to choose a data type. */
3649 error ("more than one `f' in numeric constant");
3655 error ("more than one `l' in numeric constant");
3661 error ("more than one `i' or `j' in numeric constant");
3663 pedwarn ("ANSI C++ forbids imaginary numeric constants");
3674 if (p >= token_buffer + maxtoken - 3)
3675 p = extend_token_buffer (p);
3681 /* The second argument, machine_mode, of REAL_VALUE_ATOF
3682 tells the desired precision of the binary result
3683 of decimal-to-binary conversion. */
3688 error ("both `f' and `l' in floating constant");
3690 type = float_type_node;
3691 value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
3692 /* A diagnostic is required here by some ANSI C testsuites.
3693 This is not pedwarn, become some people don't want
3694 an error for this. */
3695 if (REAL_VALUE_ISINF (value) && pedantic)
3696 warning ("floating point number exceeds range of `float'");
3700 type = long_double_type_node;
3701 value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
3702 if (REAL_VALUE_ISINF (value) && pedantic)
3703 warning ("floating point number exceeds range of `long double'");
3707 value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
3708 if (REAL_VALUE_ISINF (value) && pedantic)
3709 warning ("floating point number exceeds range of `double'");
3712 set_float_handler (NULL_PTR);
3715 if (errno == ERANGE && pedantic)
3717 /* ERANGE is also reported for underflow,
3718 so test the value to distinguish overflow from that. */
3719 if (REAL_VALUES_LESS (dconst1, value)
3720 || REAL_VALUES_LESS (value, dconstm1))
3722 pedwarn ("floating point number exceeds range of `%s'",
3723 IDENTIFIER_POINTER (TYPE_IDENTIFIER (type)));
3729 /* If the result is not a number, assume it must have been
3730 due to some error message above, so silently convert
3732 if (REAL_VALUE_ISNAN (value))
3735 /* Create a node with determined type and value. */
3737 yylval.ttype = build_complex (NULL_TREE,
3738 cp_convert (type, integer_zero_node),
3739 build_real (type, value));
3741 yylval.ttype = build_real (type, value);
3746 HOST_WIDE_INT high, low;
3747 int spec_unsigned = 0;
3749 int spec_long_long = 0;
3755 if (c == 'u' || c == 'U')
3758 error ("two `u's in integer constant");
3761 else if (c == 'l' || c == 'L')
3766 error ("three `l's in integer constant");
3768 pedwarn ("ANSI C++ forbids long long integer constants");
3773 else if (c == 'i' || c == 'j' || c == 'I' || c == 'J')
3776 error ("more than one `i' or `j' in numeric constant");
3778 pedwarn ("ANSI C++ forbids imaginary numeric constants");
3783 if (p >= token_buffer + maxtoken - 3)
3784 p = extend_token_buffer (p);
3789 /* If the constant is not long long and it won't fit in an
3790 unsigned long, or if the constant is long long and won't fit
3791 in an unsigned long long, then warn that the constant is out
3794 /* ??? This assumes that long long and long integer types are
3795 a multiple of 8 bits. This better than the original code
3796 though which assumed that long was exactly 32 bits and long
3797 long was exactly 64 bits. */
3800 bytes = TYPE_PRECISION (long_long_integer_type_node) / 8;
3802 bytes = TYPE_PRECISION (long_integer_type_node) / 8;
3805 for (i = bytes; i < TOTAL_PARTS; i++)
3809 pedwarn ("integer constant out of range");
3811 /* This is simplified by the fact that our constant
3812 is always positive. */
3815 for (i = 0; i < HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR; i++)
3817 high |= ((HOST_WIDE_INT) parts[i + (HOST_BITS_PER_WIDE_INT
3818 / HOST_BITS_PER_CHAR)]
3819 << (i * HOST_BITS_PER_CHAR));
3820 low |= (HOST_WIDE_INT) parts[i] << (i * HOST_BITS_PER_CHAR);
3824 yylval.ttype = build_int_2 (low, high);
3825 TREE_TYPE (yylval.ttype) = long_long_unsigned_type_node;
3827 /* Calculate the ANSI type. */
3828 if (!spec_long && !spec_unsigned
3829 && int_fits_type_p (yylval.ttype, integer_type_node))
3830 type = integer_type_node;
3831 else if (!spec_long && (base != 10 || spec_unsigned)
3832 && int_fits_type_p (yylval.ttype, unsigned_type_node))
3833 /* Nondecimal constants try unsigned even in traditional C. */
3834 type = unsigned_type_node;
3835 else if (!spec_unsigned && !spec_long_long
3836 && int_fits_type_p (yylval.ttype, long_integer_type_node))
3837 type = long_integer_type_node;
3838 else if (! spec_long_long)
3839 type = long_unsigned_type_node;
3840 else if (! spec_unsigned
3841 /* Verify value does not overflow into sign bit. */
3842 && TREE_INT_CST_HIGH (yylval.ttype) >= 0
3843 && int_fits_type_p (yylval.ttype,
3844 long_long_integer_type_node))
3845 type = long_long_integer_type_node;
3847 type = long_long_unsigned_type_node;
3849 if (!int_fits_type_p (yylval.ttype, type) && !warn)
3850 pedwarn ("integer constant out of range");
3852 if (base == 10 && ! spec_unsigned && TREE_UNSIGNED (type))
3853 warning ("decimal integer constant is so large that it is unsigned");
3857 if (TYPE_PRECISION (type)
3858 <= TYPE_PRECISION (integer_type_node))
3860 = build_complex (NULL_TREE, integer_zero_node,
3861 cp_convert (integer_type_node,
3864 error ("complex integer constant is too wide for `__complex int'");
3867 TREE_TYPE (yylval.ttype) = type;
3873 value = CONSTANT; break;
3879 register int result = 0;
3880 register int num_chars = 0;
3881 unsigned width = TYPE_PRECISION (char_type_node);
3886 width = WCHAR_TYPE_SIZE;
3887 #ifdef MULTIBYTE_CHARS
3888 max_chars = MB_CUR_MAX;
3894 max_chars = TYPE_PRECISION (integer_type_node) / width;
3902 if (c == '\'' || c == EOF)
3908 c = readescape (&ignore);
3911 if (width < HOST_BITS_PER_INT
3912 && (unsigned) c >= (1 << width))
3913 warning ("escape sequence out of range for character");
3914 #ifdef MAP_CHARACTER
3916 c = MAP_CHARACTER (c);
3922 pedwarn ("ANSI C++ forbids newline in character constant");
3925 #ifdef MAP_CHARACTER
3927 c = MAP_CHARACTER (c);
3931 if (num_chars > maxtoken - 4)
3932 extend_token_buffer (token_buffer);
3934 token_buffer[num_chars] = c;
3936 /* Merge character into result; ignore excess chars. */
3937 if (num_chars < max_chars + 1)
3939 if (width < HOST_BITS_PER_INT)
3940 result = (result << width) | (c & ((1 << width) - 1));
3946 token_buffer[num_chars + 1] = '\'';
3947 token_buffer[num_chars + 2] = 0;
3950 error ("malformatted character constant");
3951 else if (num_chars == 0)
3952 error ("empty character constant");
3953 else if (num_chars > max_chars)
3955 num_chars = max_chars;
3956 error ("character constant too long");
3958 else if (num_chars != 1)
3959 warning ("multi-character character constant");
3961 /* If char type is signed, sign-extend the constant. */
3964 int num_bits = num_chars * width;
3966 /* We already got an error; avoid invalid shift. */
3967 yylval.ttype = build_int_2 (0, 0);
3968 else if (TREE_UNSIGNED (char_type_node)
3969 || ((result >> (num_bits - 1)) & 1) == 0)
3971 = build_int_2 (result & ((unsigned HOST_WIDE_INT) ~0
3972 >> (HOST_BITS_PER_WIDE_INT - num_bits)),
3976 = build_int_2 (result | ~((unsigned HOST_WIDE_INT) ~0
3977 >> (HOST_BITS_PER_WIDE_INT - num_bits)),
3980 TREE_TYPE (yylval.ttype) = char_type_node;
3982 TREE_TYPE (yylval.ttype) = integer_type_node;
3986 #ifdef MULTIBYTE_CHARS
3987 /* Set the initial shift state and convert the next sequence. */
3989 /* In all locales L'\0' is zero and mbtowc will return zero,
3992 || (num_chars == 1 && token_buffer[1] != '\0'))
3995 (void) mbtowc (NULL, NULL, 0);
3996 if (mbtowc (& wc, token_buffer + 1, num_chars) == num_chars)
3999 warning ("Ignoring invalid multibyte character");
4002 yylval.ttype = build_int_2 (result, 0);
4003 TREE_TYPE (yylval.ttype) = wchar_type_node;
4016 p = token_buffer + 1;
4018 while (c != '"' && c >= 0)
4020 /* ignore_escape_flag is set for reading the filename in #line. */
4021 if (!ignore_escape_flag && c == '\\')
4024 c = readescape (&ignore);
4028 && TYPE_PRECISION (char_type_node) < HOST_BITS_PER_INT
4029 && c >= ((unsigned) 1 << TYPE_PRECISION (char_type_node)))
4030 warning ("escape sequence out of range for character");
4035 pedwarn ("ANSI C++ forbids newline in string constant");
4039 if (p == token_buffer + maxtoken)
4040 p = extend_token_buffer (p);
4046 error ("Unterminated string");
4052 /* We have read the entire constant.
4053 Construct a STRING_CST for the result. */
4057 /* If this is a L"..." wide-string, convert the multibyte string
4058 to a wide character string. */
4059 char *widep = (char *) alloca ((p - token_buffer) * WCHAR_BYTES);
4062 #ifdef MULTIBYTE_CHARS
4063 len = mbstowcs ((wchar_t *) widep, token_buffer + 1, p - token_buffer);
4064 if (len < 0 || len >= (p - token_buffer))
4066 warning ("Ignoring invalid multibyte string");
4069 bzero (widep + (len * WCHAR_BYTES), WCHAR_BYTES);
4074 wp = widep + (BYTES_BIG_ENDIAN ? WCHAR_BYTES - 1 : 0);
4075 bzero (widep, (p - token_buffer) * WCHAR_BYTES);
4076 for (cp = token_buffer + 1; cp < p; cp++)
4077 *wp = *cp, wp += WCHAR_BYTES;
4078 len = p - token_buffer - 1;
4081 if (processing_template_decl)
4082 push_obstacks (&permanent_obstack, &permanent_obstack);
4083 yylval.ttype = build_string ((len + 1) * WCHAR_BYTES, widep);
4084 if (processing_template_decl)
4086 TREE_TYPE (yylval.ttype) = wchar_array_type_node;
4090 if (processing_template_decl)
4091 push_obstacks (&permanent_obstack, &permanent_obstack);
4092 yylval.ttype = build_string (p - token_buffer, token_buffer + 1);
4093 if (processing_template_decl)
4095 TREE_TYPE (yylval.ttype) = char_array_type_node;
4101 value = STRING; break;
4124 yylval.code = PLUS_EXPR; break;
4126 yylval.code = MINUS_EXPR; break;
4128 yylval.code = BIT_AND_EXPR; break;
4130 yylval.code = BIT_IOR_EXPR; break;
4132 yylval.code = MULT_EXPR; break;
4134 yylval.code = TRUNC_DIV_EXPR; break;
4136 yylval.code = TRUNC_MOD_EXPR; break;
4138 yylval.code = BIT_XOR_EXPR; break;
4140 yylval.code = LSHIFT_EXPR; break;
4142 yylval.code = RSHIFT_EXPR; break;
4144 yylval.code = LT_EXPR; break;
4146 yylval.code = GT_EXPR; break;
4149 token_buffer[1] = c1 = getch ();
4150 token_buffer[2] = 0;
4157 value = ARITHCOMPARE; yylval.code = LE_EXPR; goto done;
4159 value = ARITHCOMPARE; yylval.code = GE_EXPR; goto done;
4161 value = EQCOMPARE; yylval.code = NE_EXPR; goto done;
4163 value = EQCOMPARE; yylval.code = EQ_EXPR; goto done;
4165 value = ASSIGN; goto done;
4171 value = PLUSPLUS; goto done;
4173 value = MINUSMINUS; goto done;
4175 value = ANDAND; goto done;
4177 value = OROR; goto done;
4185 else if ((c == '-') && (c1 == '>'))
4187 nextchar = getch ();
4188 if (nextchar == '*')
4191 value = POINTSAT_STAR;
4197 else if (c1 == '?' && (c == '<' || c == '>'))
4199 token_buffer[3] = 0;
4202 yylval.code = (c == '<' ? MIN_EXPR : MAX_EXPR);
4205 /* <?= or >?= expression. */
4206 token_buffer[2] = c1;
4215 pedwarn ("use of `operator %s' is not standard C++",
4220 else if (c == '<' && c1 == '%')
4221 { value = '{'; goto done; }
4222 else if (c == '<' && c1 == ':')
4223 { value = '['; goto done; }
4224 else if (c == '%' && c1 == '>')
4225 { value = '}'; goto done; }
4226 else if (c == '%' && c1 == ':')
4227 { value = '#'; goto done; }
4230 token_buffer[1] = 0;
4240 token_buffer[1] = ':';
4241 token_buffer[2] = '\0';
4258 /* Don't make yyparse think this is eof. */
4263 /* try, weakly, to handle casts to pointers to functions. */
4264 nextchar = skip_white_space (getch ());
4265 if (nextchar == '*')
4267 int next_c = skip_white_space (getch ());
4271 yylval.ttype = build1 (INDIRECT_REF, 0, 0);
4272 value = PAREN_STAR_PAREN;
4280 else if (nextchar == ')')
4283 yylval.ttype = NULL_TREE;
4294 /* yylloc.last_line = lineno; */
4295 #ifdef GATHER_STATISTICS
4296 #ifdef REDUCE_LENGTH
4297 token_count[value] += 1;
4308 return !!is_reserved_word (IDENTIFIER_POINTER (t), IDENTIFIER_LENGTH (t));
4311 #ifdef GATHER_STATISTICS
4312 /* The original for tree_node_kind is in the toplevel tree.c; changes there
4313 need to be brought into here, unless this were actually put into a header
4315 /* Statistics-gathering stuff. */
4336 extern int tree_node_counts[];
4337 extern int tree_node_sizes[];
4340 /* Place to save freed lang_decls which were allocated on the
4341 permanent_obstack. @@ Not currently used. */
4342 tree free_lang_decl_chain;
4345 build_lang_decl (code, name, type)
4346 enum tree_code code;
4350 register tree t = build_decl (code, name, type);
4351 struct obstack *obstack = current_obstack;
4352 register int i = sizeof (struct lang_decl) / sizeof (int);
4355 if (! TREE_PERMANENT (t))
4356 obstack = saveable_obstack;
4358 /* Could be that saveable is permanent and current is not. */
4359 obstack = &permanent_obstack;
4361 if (free_lang_decl_chain && obstack == &permanent_obstack)
4363 pi = (int *)free_lang_decl_chain;
4364 free_lang_decl_chain = TREE_CHAIN (free_lang_decl_chain);
4367 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl));
4372 DECL_LANG_SPECIFIC (t) = (struct lang_decl *) pi;
4373 LANG_DECL_PERMANENT ((struct lang_decl *) pi)
4374 = obstack == &permanent_obstack;
4375 my_friendly_assert (LANG_DECL_PERMANENT ((struct lang_decl *) pi)
4376 == TREE_PERMANENT (t), 234);
4377 DECL_MAIN_VARIANT (t) = t;
4378 if (current_lang_name == lang_name_cplusplus)
4379 DECL_LANGUAGE (t) = lang_cplusplus;
4380 else if (current_lang_name == lang_name_c)
4381 DECL_LANGUAGE (t) = lang_c;
4382 else if (current_lang_name == lang_name_java)
4383 DECL_LANGUAGE (t) = lang_java;
4384 else my_friendly_abort (64);
4386 #if 0 /* not yet, should get fixed properly later */
4387 if (code == TYPE_DECL)
4390 id = get_identifier (build_overload_name (type, 1, 1));
4391 DECL_ASSEMBLER_NAME (t) = id;
4395 #ifdef GATHER_STATISTICS
4396 tree_node_counts[(int)lang_decl] += 1;
4397 tree_node_sizes[(int)lang_decl] += sizeof (struct lang_decl);
4404 build_lang_field_decl (code, name, type)
4405 enum tree_code code;
4409 extern struct obstack *current_obstack, *saveable_obstack;
4410 register tree t = build_decl (code, name, type);
4411 struct obstack *obstack = current_obstack;
4412 register int i = sizeof (struct lang_decl_flags) / sizeof (int);
4414 #if 0 /* not yet, should get fixed properly later */
4416 if (code == TYPE_DECL)
4419 id = get_identifier (build_overload_name (type, 1, 1));
4420 DECL_ASSEMBLER_NAME (t) = id;
4424 if (! TREE_PERMANENT (t))
4425 obstack = saveable_obstack;
4427 my_friendly_assert (obstack == &permanent_obstack, 235);
4429 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_decl_flags));
4433 DECL_LANG_SPECIFIC (t) = (struct lang_decl *) pi;
4438 copy_lang_decl (node)
4444 if (! DECL_LANG_SPECIFIC (node))
4447 if (TREE_CODE (node) == FIELD_DECL)
4448 size = sizeof (struct lang_decl_flags);
4450 size = sizeof (struct lang_decl);
4451 pi = (int *)obstack_alloc (&permanent_obstack, size);
4452 bcopy ((char *)DECL_LANG_SPECIFIC (node), (char *)pi, size);
4453 DECL_LANG_SPECIFIC (node) = (struct lang_decl *)pi;
4457 make_lang_type (code)
4458 enum tree_code code;
4460 extern struct obstack *current_obstack, *saveable_obstack;
4461 register tree t = make_node (code);
4462 struct obstack *obstack = current_obstack;
4463 register int i = sizeof (struct lang_type) / sizeof (int);
4466 /* Set up some flags that give proper default behavior. */
4467 IS_AGGR_TYPE (t) = 1;
4469 if (! TREE_PERMANENT (t))
4470 obstack = saveable_obstack;
4472 my_friendly_assert (obstack == &permanent_obstack, 236);
4474 pi = (int *) obstack_alloc (obstack, sizeof (struct lang_type));
4478 TYPE_LANG_SPECIFIC (t) = (struct lang_type *) pi;
4479 CLASSTYPE_AS_LIST (t) = build_expr_list (NULL_TREE, t);
4480 SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown);
4481 CLASSTYPE_INTERFACE_ONLY (t) = interface_only;
4482 TYPE_BINFO (t) = make_binfo (integer_zero_node, t, NULL_TREE, NULL_TREE,
4484 CLASSTYPE_BINFO_AS_LIST (t) = build_tree_list (NULL_TREE, TYPE_BINFO (t));
4486 /* Make sure this is laid out, for ease of use later.
4487 In the presence of parse errors, the normal was of assuring
4488 this might not ever get executed, so we lay it out *immediately*. */
4489 build_pointer_type (t);
4491 #ifdef GATHER_STATISTICS
4492 tree_node_counts[(int)lang_type] += 1;
4493 tree_node_sizes[(int)lang_type] += sizeof (struct lang_type);
4500 dump_time_statistics ()
4502 register tree prev = 0, decl, next;
4503 int this_time = my_get_run_time ();
4504 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (this_filename_time))
4505 += this_time - body_time;
4507 fprintf (stderr, "\n******\n");
4508 print_time ("header files (total)", header_time);
4509 print_time ("main file (total)", this_time - body_time);
4510 fprintf (stderr, "ratio = %g : 1\n",
4511 (double)header_time / (double)(this_time - body_time));
4512 fprintf (stderr, "\n******\n");
4514 for (decl = filename_times; decl; decl = next)
4516 next = IDENTIFIER_GLOBAL_VALUE (decl);
4517 SET_IDENTIFIER_GLOBAL_VALUE (decl, prev);
4521 for (decl = prev; decl; decl = IDENTIFIER_GLOBAL_VALUE (decl))
4522 print_time (IDENTIFIER_POINTER (decl),
4523 TREE_INT_CST_LOW (IDENTIFIER_LOCAL_VALUE (decl)));
4527 compiler_error (s, v, v2)
4529 HOST_WIDE_INT v, v2; /* @@also used as pointer */
4532 sprintf (buf, s, v, v2);
4533 error_with_file_and_line (input_filename, lineno, "%s (compiler error)", buf);
4540 extern int end_of_file;
4543 strcpy (buf, string);
4545 /* We can't print string and character constants well
4546 because the token_buffer contains the result of processing escapes. */
4548 strcat (buf, input_redirected ()
4549 ? " at end of saved text"
4550 : " at end of input");
4551 else if (token_buffer[0] == 0)
4552 strcat (buf, " at null character");
4553 else if (token_buffer[0] == '"')
4554 strcat (buf, " before string constant");
4555 else if (token_buffer[0] == '\'')
4556 strcat (buf, " before character constant");
4557 else if (token_buffer[0] < 040 || (unsigned char) token_buffer[0] >= 0177)
4558 sprintf (buf + strlen (buf), " before character 0%o",
4559 (unsigned char) token_buffer[0]);
4561 strcat (buf, " before `%s'");
4563 error (buf, token_buffer);
4567 handle_cp_pragma (pname)
4572 if (! strcmp (pname, "vtable"))
4574 extern tree pending_vtables;
4576 /* More follows: it must be a string constant (class name). */
4577 token = real_yylex ();
4578 if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
4580 error ("invalid #pragma vtable");
4584 if (write_virtuals != 2)
4586 warning ("use `+e2' option to enable #pragma vtable");
4590 = perm_tree_cons (NULL_TREE,
4591 get_identifier (TREE_STRING_POINTER (yylval.ttype)),
4593 token = real_yylex ();
4594 if (token != END_OF_LINE)
4595 warning ("trailing characters ignored");
4598 else if (! strcmp (pname, "unit"))
4600 /* More follows: it must be a string constant (unit name). */
4601 token = real_yylex ();
4602 if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
4604 error ("invalid #pragma unit");
4607 token = real_yylex ();
4608 if (token != END_OF_LINE)
4609 warning ("trailing characters ignored");
4612 else if (! strcmp (pname, "interface"))
4614 tree fileinfo = IDENTIFIER_CLASS_VALUE (get_time_identifier (input_filename));
4615 char *main_filename = input_filename;
4617 main_filename = file_name_nondirectory (main_filename);
4619 token = real_yylex ();
4621 if (token != END_OF_LINE)
4624 || TREE_CODE (yylval.ttype) != STRING_CST)
4626 error ("invalid `#pragma interface'");
4629 main_filename = TREE_STRING_POINTER (yylval.ttype);
4630 token = real_yylex ();
4633 if (token != END_OF_LINE)
4634 warning ("garbage after `#pragma interface' ignored");
4636 #ifndef NO_LINKAGE_HEURISTICS
4639 if (impl_file_chain == 0)
4641 /* If this is zero at this point, then we are
4642 auto-implementing. */
4643 if (main_input_filename == 0)
4644 main_input_filename = input_filename;
4646 #ifdef AUTO_IMPLEMENT
4647 filename = file_name_nondirectory (main_input_filename);
4648 fi = get_time_identifier (filename);
4649 fi = IDENTIFIER_CLASS_VALUE (fi);
4650 TREE_INT_CST_LOW (fi) = 0;
4651 TREE_INT_CST_HIGH (fi) = 1;
4653 impl_file_chain = (struct impl_files *)permalloc (sizeof (struct impl_files));
4654 impl_file_chain->filename = filename;
4655 impl_file_chain->next = 0;
4659 interface_only = interface_strcmp (main_filename);
4660 interface_unknown = 0;
4661 TREE_INT_CST_LOW (fileinfo) = interface_only;
4662 TREE_INT_CST_HIGH (fileinfo) = interface_unknown;
4663 #endif /* NO_LINKAGE_HEURISTICS */
4667 else if (! strcmp (pname, "implementation"))
4669 tree fileinfo = IDENTIFIER_CLASS_VALUE (get_time_identifier (input_filename));
4670 char *main_filename = main_input_filename ? main_input_filename : input_filename;
4672 main_filename = file_name_nondirectory (main_filename);
4673 token = real_yylex ();
4674 if (token != END_OF_LINE)
4677 || TREE_CODE (yylval.ttype) != STRING_CST)
4679 error ("invalid `#pragma implementation'");
4682 main_filename = TREE_STRING_POINTER (yylval.ttype);
4683 token = real_yylex ();
4686 if (token != END_OF_LINE)
4687 warning ("garbage after `#pragma implementation' ignored");
4689 #ifndef NO_LINKAGE_HEURISTICS
4690 if (write_virtuals == 3)
4692 struct impl_files *ifiles = impl_file_chain;
4695 if (! strcmp (ifiles->filename, main_filename))
4697 ifiles = ifiles->next;
4701 ifiles = (struct impl_files*) permalloc (sizeof (struct impl_files));
4702 ifiles->filename = main_filename;
4703 ifiles->next = impl_file_chain;
4704 impl_file_chain = ifiles;
4707 else if ((main_input_filename != 0
4708 && ! strcmp (main_input_filename, input_filename))
4709 || ! strcmp (input_filename, main_filename))
4712 if (impl_file_chain == 0)
4714 impl_file_chain = (struct impl_files*) permalloc (sizeof (struct impl_files));
4715 impl_file_chain->filename = main_filename;
4716 impl_file_chain->next = 0;
4720 error ("`#pragma implementation' can only appear at top-level");
4723 /* We make this non-zero so that we infer decl linkage
4724 in the impl file only for variables first declared
4725 in the interface file. */
4726 interface_unknown = 1;
4728 /* We make this zero so that templates in the impl
4729 file will be emitted properly. */
4730 interface_unknown = 0;
4732 TREE_INT_CST_LOW (fileinfo) = interface_only;
4733 TREE_INT_CST_HIGH (fileinfo) = interface_unknown;
4734 #endif /* NO_LINKAGE_HEURISTICS */
4742 #ifdef HANDLE_SYSV_PRAGMA
4744 /* Handle a #pragma directive. INPUT is the current input stream,
4745 and C is a character to reread. Processes the entire input line
4746 and returns a character for the caller to reread: either \n or EOF. */
4748 /* This function has to be in this file, in order to get at
4752 handle_sysv_pragma (finput, token)
4764 handle_pragma_token ("ignored", yylval.ttype);
4767 handle_pragma_token ("(", NULL_TREE);
4770 handle_pragma_token (")", NULL_TREE);
4773 handle_pragma_token (",", NULL_TREE);
4776 handle_pragma_token ("=", NULL_TREE);
4779 handle_pragma_token ("(", NULL_TREE);
4780 handle_pragma_token (")", NULL_TREE);
4784 handle_pragma_token (NULL_PTR, NULL_TREE);
4787 token = real_yylex ();
4790 #endif /* HANDLE_SYSV_PRAGMA */