]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/lex.c
* cppfiles.c (stack_include_file): Don't optimize zero-length
[thirdparty/gcc.git] / gcc / cp / lex.c
CommitLineData
471086d6 1/* Separate lexical analyzer for GNU C++.
107c7f39 2 Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
76a6e674 3 1999, 2000, 2001 Free Software Foundation, Inc.
471086d6 4 Hacked by Michael Tiemann (tiemann@cygnus.com)
5
6This file is part of GNU CC.
7
8GNU CC is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2, or (at your option)
11any later version.
12
13GNU CC is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with GNU CC; see the file COPYING. If not, write to
c58d4270 20the Free Software Foundation, 59 Temple Place - Suite 330,
21Boston, MA 02111-1307, USA. */
471086d6 22
23
24/* This file is the lexical analyzer for GNU C++. */
25
0543e7a9 26/* Cause the `yydebug' variable to be defined. */
471086d6 27#define YYDEBUG 1
471086d6 28
39c8ac16 29#include "config.h"
b3ef7553 30#include "system.h"
471086d6 31#include "input.h"
32#include "tree.h"
471086d6 33#include "cp-tree.h"
518796ad 34#include "cpplib.h"
35#include "c-lex.h"
988fc1d1 36#include "lex.h"
0e0a0dea 37#include "parse.h"
471086d6 38#include "flags.h"
917aa082 39#include "c-pragma.h"
2a4e40b0 40#include "toplev.h"
0ba25c9a 41#include "output.h"
1e4853c2 42#include "ggc.h"
d8c9779c 43#include "tm_p.h"
74d2af64 44#include "timevar.h"
8c57b41f 45#include "diagnostic.h"
471086d6 46
47#ifdef MULTIBYTE_CHARS
5d830682 48#include "mbchar.h"
471086d6 49#include <locale.h>
50#endif
51
24054144 52extern void yyprint PARAMS ((FILE *, int, YYSTYPE));
53
24054144 54static int interface_strcmp PARAMS ((const char *));
24054144 55static int *init_cpp_parse PARAMS ((void));
518796ad 56static void init_cp_pragma PARAMS ((void));
518796ad 57
58static tree parse_strconst_pragma PARAMS ((const char *, int));
59static void handle_pragma_vtable PARAMS ((cpp_reader *));
60static void handle_pragma_unit PARAMS ((cpp_reader *));
61static void handle_pragma_interface PARAMS ((cpp_reader *));
62static void handle_pragma_implementation PARAMS ((cpp_reader *));
6df8a9dd 63static void handle_pragma_java_exceptions PARAMS ((cpp_reader *));
518796ad 64
47f75ffb 65#ifdef GATHER_STATISTICS
66#ifdef REDUCE_LENGTH
24054144 67static int reduce_cmp PARAMS ((int *, int *));
68static int token_cmp PARAMS ((int *, int *));
47f75ffb 69#endif
70#endif
24054144 71static int is_global PARAMS ((tree));
97cc4539 72static void init_operators PARAMS ((void));
f6020ad0 73static void copy_lang_type PARAMS ((tree));
471086d6 74
518796ad 75/* A constraint that can be tested at compile time. */
76#ifdef __STDC__
77#define CONSTRAINT(name, expr) extern int constraint_##name [(expr) ? 1 : -1]
78#else
79#define CONSTRAINT(name, expr) extern int constraint_/**/name [(expr) ? 1 : -1]
80#endif
1aaabfad 81
dd3e6a1a 82#include "cpplib.h"
46e5e818 83
471086d6 84extern int yychar; /* the lookahead symbol */
85extern YYSTYPE yylval; /* the semantic value of the */
86 /* lookahead symbol */
87
518796ad 88/* These flags are used by c-lex.c. In C++, they're always off and on,
89 respectively. */
90int warn_traditional = 0;
91int flag_digraphs = 1;
471086d6 92
93/* the declaration found for the last IDENTIFIER token read in.
94 yylex must look this up to detect typedefs, which get token type TYPENAME,
95 so it is left around in case the identifier is not a typedef but is
96 used in a context which makes it a reference to a variable. */
97tree lastiddecl;
98
471086d6 99/* Array for holding counts of the numbers of tokens seen. */
100extern int *token_count;
1e4853c2 101
23f83a9a 102/* Functions and data structures for #pragma interface.
103
104 `#pragma implementation' means that the main file being compiled
105 is considered to implement (provide) the classes that appear in
106 its main body. I.e., if this is file "foo.cc", and class `bar'
107 is defined in "foo.cc", then we say that "foo.cc implements bar".
108
109 All main input files "implement" themselves automagically.
110
111 `#pragma interface' means that unless this file (of the form "foo.h"
112 is not presently being included by file "foo.cc", the
113 CLASSTYPE_INTERFACE_ONLY bit gets set. The effect is that none
114 of the vtables nor any of the inline functions defined in foo.h
115 will ever be output.
116
117 There are cases when we want to link files such as "defs.h" and
118 "main.cc". In this case, we give "defs.h" a `#pragma interface',
119 and "main.cc" has `#pragma implementation "defs.h"'. */
120
121struct impl_files
122{
44acf429 123 const char *filename;
23f83a9a 124 struct impl_files *next;
125};
126
127static struct impl_files *impl_file_chain;
128
471086d6 129\f
130/* Return something to represent absolute declarators containing a *.
131 TARGET is the absolute declarator that the * contains.
f9670f72 132 CV_QUALIFIERS is a list of modifiers such as const or volatile
471086d6 133 to apply to the pointer type, represented as identifiers.
134
135 We return an INDIRECT_REF whose "contents" are TARGET
136 and whose type is the modifier list. */
137
138tree
f9670f72 139make_pointer_declarator (cv_qualifiers, target)
140 tree cv_qualifiers, target;
471086d6 141{
142 if (target && TREE_CODE (target) == IDENTIFIER_NODE
143 && ANON_AGGRNAME_P (target))
905d4035 144 error ("type name expected before `*'");
64ffa1a5 145 target = build_nt (INDIRECT_REF, target);
f9670f72 146 TREE_TYPE (target) = cv_qualifiers;
471086d6 147 return target;
148}
149
150/* Return something to represent absolute declarators containing a &.
151 TARGET is the absolute declarator that the & contains.
f9670f72 152 CV_QUALIFIERS is a list of modifiers such as const or volatile
471086d6 153 to apply to the reference type, represented as identifiers.
154
155 We return an ADDR_EXPR whose "contents" are TARGET
156 and whose type is the modifier list. */
3c3beda6 157
471086d6 158tree
f9670f72 159make_reference_declarator (cv_qualifiers, target)
160 tree cv_qualifiers, target;
471086d6 161{
162 if (target)
163 {
164 if (TREE_CODE (target) == ADDR_EXPR)
165 {
905d4035 166 error ("cannot declare references to references");
471086d6 167 return target;
168 }
169 if (TREE_CODE (target) == INDIRECT_REF)
170 {
905d4035 171 error ("cannot declare pointers to references");
471086d6 172 return target;
173 }
174 if (TREE_CODE (target) == IDENTIFIER_NODE && ANON_AGGRNAME_P (target))
905d4035 175 error ("type name expected before `&'");
471086d6 176 }
64ffa1a5 177 target = build_nt (ADDR_EXPR, target);
f9670f72 178 TREE_TYPE (target) = cv_qualifiers;
471086d6 179 return target;
180}
f9670f72 181
182tree
183make_call_declarator (target, parms, cv_qualifiers, exception_specification)
184 tree target, parms, cv_qualifiers, exception_specification;
185{
64ffa1a5 186 target = build_nt (CALL_EXPR, target,
187 tree_cons (parms, cv_qualifiers, NULL_TREE),
188 /* The third operand is really RTL. We
189 shouldn't put anything there. */
190 NULL_TREE);
f27113ad 191 CALL_DECLARATOR_EXCEPTION_SPEC (target) = exception_specification;
f9670f72 192 return target;
193}
194
195void
196set_quals_and_spec (call_declarator, cv_qualifiers, exception_specification)
197 tree call_declarator, cv_qualifiers, exception_specification;
198{
f27113ad 199 CALL_DECLARATOR_QUALS (call_declarator) = cv_qualifiers;
200 CALL_DECLARATOR_EXCEPTION_SPEC (call_declarator) = exception_specification;
f9670f72 201}
471086d6 202\f
471086d6 203int interface_only; /* whether or not current file is only for
204 interface definitions. */
205int interface_unknown; /* whether or not we know this class
206 to behave according to #pragma interface. */
207
51444f0d 208/* Tree code classes. */
471086d6 209
210#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
211
e99c3a1d 212static const char cplus_tree_code_type[] = {
b4dae43c 213 'x',
96624a9e 214#include "cp-tree.def"
471086d6 215};
216#undef DEFTREECODE
217
218/* Table indexed by tree code giving number of expression
219 operands beyond the fixed part of the node structure.
220 Not used for types or decls. */
221
222#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
223
e99c3a1d 224static const int cplus_tree_code_length[] = {
471086d6 225 0,
96624a9e 226#include "cp-tree.def"
471086d6 227};
228#undef DEFTREECODE
229
230/* Names of tree components.
231 Used for printing out the tree and error messages. */
232#define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
233
98003977 234static const char *const cplus_tree_code_name[] = {
471086d6 235 "@@dummy",
96624a9e 236#include "cp-tree.def"
471086d6 237};
238#undef DEFTREECODE
239\f
ef3823c3 240/* Post-switch processing. */
ca58dfe1 241void
ef3823c3 242cxx_post_options ()
243{
435fb09b 244 c_common_post_options ();
ef3823c3 245}
471086d6 246
435fb09b 247/* Initialization before switch parsing. */
ca58dfe1 248void
e486a835 249cxx_init_options ()
87c1a803 250{
435fb09b 251 c_common_init_options (clk_cplusplus);
5e3d663e 252
87c1a803 253 /* Default exceptions on. */
254 flag_exceptions = 1;
b9995fca 255 /* By default wrap lines at 80 characters. Is getenv ("COLUMNS")
256 preferable? */
b165d8b0 257 diagnostic_line_cutoff (global_dc) = 80;
8c57b41f 258 /* By default, emit location information once for every
259 diagnostic message. */
b165d8b0 260 diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
87c1a803 261}
262
ca58dfe1 263void
ef3823c3 264cxx_finish ()
471086d6 265{
ca58dfe1 266 if (flag_gnu_xref)
cdc9fa3e 267 GNU_xref_end (errorcount + sorrycount);
268 c_common_finish ();
471086d6 269}
270
17fd67d5 271static int *
272init_cpp_parse ()
273{
274#ifdef GATHER_STATISTICS
275#ifdef REDUCE_LENGTH
fac5c64c 276 reduce_count = (int *) xcalloc (sizeof (int), (REDUCE_LENGTH + 1));
17fd67d5 277 reduce_count += 1;
fac5c64c 278 token_count = (int *) xcalloc (sizeof (int), (TOKEN_LENGTH + 1));
17fd67d5 279 token_count += 1;
280#endif
281#endif
282 return token_count;
283}
284
97cc4539 285/* A mapping from tree codes to operator name information. */
286operator_name_info_t operator_name_info[(int) LAST_CPLUS_TREE_CODE];
287/* Similar, but for assignment operators. */
288operator_name_info_t assignment_operator_name_info[(int) LAST_CPLUS_TREE_CODE];
3c3beda6 289
97cc4539 290/* Initialize data structures that keep track of operator names. */
291
c5144efa 292#define DEF_OPERATOR(NAME, C, M, AR, AP) \
518796ad 293 CONSTRAINT (C, sizeof "operator " + sizeof NAME <= 256);
294#include "operators.def"
295#undef DEF_OPERATOR
296
97cc4539 297static void
298init_operators ()
299{
300 tree identifier;
301 char buffer[256];
302 struct operator_name_info_t *oni;
3c3beda6 303
c5144efa 304#define DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, ASSN_P) \
0169d787 305 sprintf (buffer, ISALPHA (NAME[0]) ? "operator %s" : "operator%s", NAME); \
97cc4539 306 identifier = get_identifier (buffer); \
307 IDENTIFIER_OPNAME_P (identifier) = 1; \
308 \
309 oni = (ASSN_P \
310 ? &assignment_operator_name_info[(int) CODE] \
311 : &operator_name_info[(int) CODE]); \
312 oni->identifier = identifier; \
313 oni->name = NAME; \
c5144efa 314 oni->mangled_name = MANGLING;
97cc4539 315
316#include "operators.def"
317#undef DEF_OPERATOR
318
3c3beda6 319 operator_name_info[(int) ERROR_MARK].identifier
97cc4539 320 = get_identifier ("<invalid operator>");
321
322 /* Handle some special cases. These operators are not defined in
323 the language, but can be produced internally. We may need them
324 for error-reporting. (Eventually, we should ensure that this
325 does not happen. Error messages involving these operators will
326 be confusing to users.) */
3c3beda6 327
328 operator_name_info [(int) INIT_EXPR].name
97cc4539 329 = operator_name_info [(int) MODIFY_EXPR].name;
330 operator_name_info [(int) EXACT_DIV_EXPR].name = "(ceiling /)";
331 operator_name_info [(int) CEIL_DIV_EXPR].name = "(ceiling /)";
332 operator_name_info [(int) FLOOR_DIV_EXPR].name = "(floor /)";
333 operator_name_info [(int) ROUND_DIV_EXPR].name = "(round /)";
334 operator_name_info [(int) CEIL_MOD_EXPR].name = "(ceiling %)";
335 operator_name_info [(int) FLOOR_MOD_EXPR].name = "(floor %)";
336 operator_name_info [(int) ROUND_MOD_EXPR].name = "(round %)";
337 operator_name_info [(int) ABS_EXPR].name = "abs";
338 operator_name_info [(int) FFS_EXPR].name = "ffs";
339 operator_name_info [(int) BIT_ANDTC_EXPR].name = "&~";
340 operator_name_info [(int) TRUTH_AND_EXPR].name = "strict &&";
341 operator_name_info [(int) TRUTH_OR_EXPR].name = "strict ||";
342 operator_name_info [(int) IN_EXPR].name = "in";
343 operator_name_info [(int) RANGE_EXPR].name = "...";
344 operator_name_info [(int) CONVERT_EXPR].name = "+";
345
3c3beda6 346 assignment_operator_name_info [(int) EXACT_DIV_EXPR].name
97cc4539 347 = "(exact /=)";
3c3beda6 348 assignment_operator_name_info [(int) CEIL_DIV_EXPR].name
97cc4539 349 = "(ceiling /=)";
3c3beda6 350 assignment_operator_name_info [(int) FLOOR_DIV_EXPR].name
97cc4539 351 = "(floor /=)";
3c3beda6 352 assignment_operator_name_info [(int) ROUND_DIV_EXPR].name
97cc4539 353 = "(round /=)";
3c3beda6 354 assignment_operator_name_info [(int) CEIL_MOD_EXPR].name
97cc4539 355 = "(ceiling %=)";
3c3beda6 356 assignment_operator_name_info [(int) FLOOR_MOD_EXPR].name
97cc4539 357 = "(floor %=)";
3c3beda6 358 assignment_operator_name_info [(int) ROUND_MOD_EXPR].name
97cc4539 359 = "(round %=)";
360}
361
518796ad 362/* The reserved keyword table. */
363struct resword
471086d6 364{
e99c3a1d 365 const char *const word;
366 const ENUM_BITFIELD(rid) rid : 16;
367 const unsigned int disable : 16;
518796ad 368};
471086d6 369
518796ad 370/* Disable mask. Keywords are disabled if (reswords[i].disable & mask) is
371 _true_. */
372#define D_EXT 0x01 /* GCC extension */
373#define D_ASM 0x02 /* in C99, but has a switch to turn it off */
374#define D_OPNAME 0x04 /* operator names */
375
376CONSTRAINT(ridbits_fit, RID_LAST_MODIFIER < sizeof(unsigned long) * CHAR_BIT);
377
378static const struct resword reswords[] =
379{
3b493511 380 { "_Complex", RID_COMPLEX, 0 },
65b7f83f 381 { "__FUNCTION__", RID_FUNCTION_NAME, 0 },
382 { "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME, 0 },
518796ad 383 { "__alignof", RID_ALIGNOF, 0 },
384 { "__alignof__", RID_ALIGNOF, 0 },
385 { "__asm", RID_ASM, 0 },
386 { "__asm__", RID_ASM, 0 },
387 { "__attribute", RID_ATTRIBUTE, 0 },
388 { "__attribute__", RID_ATTRIBUTE, 0 },
389 { "__builtin_va_arg", RID_VA_ARG, 0 },
390 { "__complex", RID_COMPLEX, 0 },
391 { "__complex__", RID_COMPLEX, 0 },
392 { "__const", RID_CONST, 0 },
393 { "__const__", RID_CONST, 0 },
394 { "__extension__", RID_EXTENSION, 0 },
65b7f83f 395 { "__func__", RID_C99_FUNCTION_NAME, 0 },
518796ad 396 { "__imag", RID_IMAGPART, 0 },
397 { "__imag__", RID_IMAGPART, 0 },
398 { "__inline", RID_INLINE, 0 },
399 { "__inline__", RID_INLINE, 0 },
400 { "__label__", RID_LABEL, 0 },
401 { "__null", RID_NULL, 0 },
402 { "__real", RID_REALPART, 0 },
403 { "__real__", RID_REALPART, 0 },
404 { "__restrict", RID_RESTRICT, 0 },
405 { "__restrict__", RID_RESTRICT, 0 },
406 { "__signed", RID_SIGNED, 0 },
407 { "__signed__", RID_SIGNED, 0 },
408 { "__typeof", RID_TYPEOF, 0 },
409 { "__typeof__", RID_TYPEOF, 0 },
410 { "__volatile", RID_VOLATILE, 0 },
411 { "__volatile__", RID_VOLATILE, 0 },
518796ad 412 { "asm", RID_ASM, D_ASM },
413 { "and", RID_AND, D_OPNAME },
414 { "and_eq", RID_AND_EQ, D_OPNAME },
415 { "auto", RID_AUTO, 0 },
416 { "bitand", RID_BITAND, D_OPNAME },
417 { "bitor", RID_BITOR, D_OPNAME },
418 { "bool", RID_BOOL, 0 },
419 { "break", RID_BREAK, 0 },
420 { "case", RID_CASE, 0 },
421 { "catch", RID_CATCH, 0 },
422 { "char", RID_CHAR, 0 },
423 { "class", RID_CLASS, 0 },
424 { "compl", RID_COMPL, D_OPNAME },
425 { "const", RID_CONST, 0 },
426 { "const_cast", RID_CONSTCAST, 0 },
427 { "continue", RID_CONTINUE, 0 },
428 { "default", RID_DEFAULT, 0 },
429 { "delete", RID_DELETE, 0 },
430 { "do", RID_DO, 0 },
431 { "double", RID_DOUBLE, 0 },
432 { "dynamic_cast", RID_DYNCAST, 0 },
433 { "else", RID_ELSE, 0 },
434 { "enum", RID_ENUM, 0 },
435 { "explicit", RID_EXPLICIT, 0 },
436 { "export", RID_EXPORT, 0 },
437 { "extern", RID_EXTERN, 0 },
438 { "false", RID_FALSE, 0 },
439 { "float", RID_FLOAT, 0 },
440 { "for", RID_FOR, 0 },
441 { "friend", RID_FRIEND, 0 },
442 { "goto", RID_GOTO, 0 },
443 { "if", RID_IF, 0 },
444 { "inline", RID_INLINE, 0 },
445 { "int", RID_INT, 0 },
446 { "long", RID_LONG, 0 },
447 { "mutable", RID_MUTABLE, 0 },
448 { "namespace", RID_NAMESPACE, 0 },
449 { "new", RID_NEW, 0 },
450 { "not", RID_NOT, D_OPNAME },
451 { "not_eq", RID_NOT_EQ, D_OPNAME },
452 { "operator", RID_OPERATOR, 0 },
453 { "or", RID_OR, D_OPNAME },
454 { "or_eq", RID_OR_EQ, D_OPNAME },
455 { "private", RID_PRIVATE, 0 },
456 { "protected", RID_PROTECTED, 0 },
457 { "public", RID_PUBLIC, 0 },
458 { "register", RID_REGISTER, 0 },
459 { "reinterpret_cast", RID_REINTCAST, 0 },
460 { "return", RID_RETURN, 0 },
461 { "short", RID_SHORT, 0 },
462 { "signed", RID_SIGNED, 0 },
463 { "sizeof", RID_SIZEOF, 0 },
464 { "static", RID_STATIC, 0 },
465 { "static_cast", RID_STATCAST, 0 },
466 { "struct", RID_STRUCT, 0 },
467 { "switch", RID_SWITCH, 0 },
468 { "template", RID_TEMPLATE, 0 },
469 { "this", RID_THIS, 0 },
470 { "throw", RID_THROW, 0 },
471 { "true", RID_TRUE, 0 },
472 { "try", RID_TRY, 0 },
473 { "typedef", RID_TYPEDEF, 0 },
474 { "typename", RID_TYPENAME, 0 },
475 { "typeid", RID_TYPEID, 0 },
476 { "typeof", RID_TYPEOF, D_ASM|D_EXT },
477 { "union", RID_UNION, 0 },
478 { "unsigned", RID_UNSIGNED, 0 },
479 { "using", RID_USING, 0 },
480 { "virtual", RID_VIRTUAL, 0 },
481 { "void", RID_VOID, 0 },
482 { "volatile", RID_VOLATILE, 0 },
3c3beda6 483 { "wchar_t", RID_WCHAR, 0 },
518796ad 484 { "while", RID_WHILE, 0 },
485 { "xor", RID_XOR, D_OPNAME },
486 { "xor_eq", RID_XOR_EQ, D_OPNAME },
5d830682 487
518796ad 488};
489#define N_reswords (sizeof reswords / sizeof (struct resword))
490
491/* Table mapping from RID_* constants to yacc token numbers.
492 Unfortunately we have to have entries for all the keywords in all
493 three languages. */
494const short rid_to_yy[RID_MAX] =
495{
496 /* RID_STATIC */ SCSPEC,
497 /* RID_UNSIGNED */ TYPESPEC,
498 /* RID_LONG */ TYPESPEC,
499 /* RID_CONST */ CV_QUALIFIER,
500 /* RID_EXTERN */ SCSPEC,
501 /* RID_REGISTER */ SCSPEC,
502 /* RID_TYPEDEF */ SCSPEC,
503 /* RID_SHORT */ TYPESPEC,
504 /* RID_INLINE */ SCSPEC,
505 /* RID_VOLATILE */ CV_QUALIFIER,
506 /* RID_SIGNED */ TYPESPEC,
507 /* RID_AUTO */ SCSPEC,
508 /* RID_RESTRICT */ CV_QUALIFIER,
509
510 /* C extensions. Bounded pointers are not yet in C++ */
511 /* RID_BOUNDED */ 0,
512 /* RID_UNBOUNDED */ 0,
513 /* RID_COMPLEX */ TYPESPEC,
514
515 /* C++ */
516 /* RID_FRIEND */ SCSPEC,
517 /* RID_VIRTUAL */ SCSPEC,
518 /* RID_EXPLICIT */ SCSPEC,
337ff821 519 /* RID_EXPORT */ EXPORT,
518796ad 520 /* RID_MUTABLE */ SCSPEC,
521
522 /* ObjC */
523 /* RID_IN */ 0,
524 /* RID_OUT */ 0,
525 /* RID_INOUT */ 0,
526 /* RID_BYCOPY */ 0,
527 /* RID_BYREF */ 0,
528 /* RID_ONEWAY */ 0,
3c3beda6 529
518796ad 530 /* C */
531 /* RID_INT */ TYPESPEC,
532 /* RID_CHAR */ TYPESPEC,
533 /* RID_FLOAT */ TYPESPEC,
534 /* RID_DOUBLE */ TYPESPEC,
535 /* RID_VOID */ TYPESPEC,
536 /* RID_ENUM */ ENUM,
537 /* RID_STRUCT */ AGGR,
538 /* RID_UNION */ AGGR,
539 /* RID_IF */ IF,
540 /* RID_ELSE */ ELSE,
541 /* RID_WHILE */ WHILE,
542 /* RID_DO */ DO,
543 /* RID_FOR */ FOR,
544 /* RID_SWITCH */ SWITCH,
545 /* RID_CASE */ CASE,
546 /* RID_DEFAULT */ DEFAULT,
547 /* RID_BREAK */ BREAK,
548 /* RID_CONTINUE */ CONTINUE,
549 /* RID_RETURN */ RETURN_KEYWORD,
550 /* RID_GOTO */ GOTO,
551 /* RID_SIZEOF */ SIZEOF,
552
553 /* C extensions */
554 /* RID_ASM */ ASM_KEYWORD,
555 /* RID_TYPEOF */ TYPEOF,
556 /* RID_ALIGNOF */ ALIGNOF,
557 /* RID_ATTRIBUTE */ ATTRIBUTE,
558 /* RID_VA_ARG */ VA_ARG,
559 /* RID_EXTENSION */ EXTENSION,
560 /* RID_IMAGPART */ IMAGPART,
561 /* RID_REALPART */ REALPART,
562 /* RID_LABEL */ LABEL,
563 /* RID_PTRBASE */ 0,
564 /* RID_PTREXTENT */ 0,
565 /* RID_PTRVALUE */ 0,
566
65b7f83f 567 /* RID_FUNCTION_NAME */ VAR_FUNC_NAME,
568 /* RID_PRETTY_FUNCTION_NAME */ VAR_FUNC_NAME,
569 /* RID_c99_FUNCTION_NAME */ VAR_FUNC_NAME,
570
518796ad 571 /* C++ */
572 /* RID_BOOL */ TYPESPEC,
573 /* RID_WCHAR */ TYPESPEC,
574 /* RID_CLASS */ AGGR,
575 /* RID_PUBLIC */ VISSPEC,
576 /* RID_PRIVATE */ VISSPEC,
577 /* RID_PROTECTED */ VISSPEC,
578 /* RID_TEMPLATE */ TEMPLATE,
579 /* RID_NULL */ CONSTANT,
580 /* RID_CATCH */ CATCH,
581 /* RID_DELETE */ DELETE,
582 /* RID_FALSE */ CXX_FALSE,
583 /* RID_NAMESPACE */ NAMESPACE,
584 /* RID_NEW */ NEW,
585 /* RID_OPERATOR */ OPERATOR,
586 /* RID_THIS */ THIS,
587 /* RID_THROW */ THROW,
588 /* RID_TRUE */ CXX_TRUE,
589 /* RID_TRY */ TRY,
590 /* RID_TYPENAME */ TYPENAME_KEYWORD,
591 /* RID_TYPEID */ TYPEID,
592 /* RID_USING */ USING,
593
594 /* casts */
595 /* RID_CONSTCAST */ CONST_CAST,
596 /* RID_DYNCAST */ DYNAMIC_CAST,
597 /* RID_REINTCAST */ REINTERPRET_CAST,
598 /* RID_STATCAST */ STATIC_CAST,
599
600 /* alternate spellings */
601 /* RID_AND */ ANDAND,
602 /* RID_AND_EQ */ ASSIGN,
603 /* RID_NOT */ '!',
604 /* RID_NOT_EQ */ EQCOMPARE,
605 /* RID_OR */ OROR,
606 /* RID_OR_EQ */ ASSIGN,
607 /* RID_XOR */ '^',
608 /* RID_XOR_EQ */ ASSIGN,
609 /* RID_BITAND */ '&',
610 /* RID_BITOR */ '|',
611 /* RID_COMPL */ '~',
612
613 /* Objective C */
614 /* RID_ID */ 0,
615 /* RID_AT_ENCODE */ 0,
616 /* RID_AT_END */ 0,
617 /* RID_AT_CLASS */ 0,
618 /* RID_AT_ALIAS */ 0,
619 /* RID_AT_DEFS */ 0,
620 /* RID_AT_PRIVATE */ 0,
621 /* RID_AT_PROTECTED */ 0,
622 /* RID_AT_PUBLIC */ 0,
623 /* RID_AT_PROTOCOL */ 0,
624 /* RID_AT_SELECTOR */ 0,
625 /* RID_AT_INTERFACE */ 0,
626 /* RID_AT_IMPLEMENTATION */ 0
627};
628
9ceb1c29 629void
518796ad 630init_reswords ()
631{
632 unsigned int i;
633 tree id;
634 int mask = ((flag_operator_names ? 0 : D_OPNAME)
635 | (flag_no_asm ? D_ASM : 0)
636 | (flag_no_gnu_keywords ? D_EXT : 0));
637
638 /* It is not necessary to register ridpointers as a GC root, because
639 all the trees it points to are permanently interned in the
640 get_identifier hash anyway. */
641 ridpointers = (tree *) xcalloc ((int) RID_MAX, sizeof (tree));
642 for (i = 0; i < N_reswords; i++)
17fd67d5 643 {
518796ad 644 id = get_identifier (reswords[i].word);
645 C_RID_CODE (id) = reswords[i].rid;
646 ridpointers [(int) reswords[i].rid] = id;
647 if (! (reswords[i].disable & mask))
648 C_IS_RESERVED_WORD (id) = 1;
17fd67d5 649 }
518796ad 650}
17fd67d5 651
518796ad 652static void
653init_cp_pragma ()
654{
9751c00e 655 cpp_register_pragma (parse_in, 0, "vtable", handle_pragma_vtable);
656 cpp_register_pragma (parse_in, 0, "unit", handle_pragma_unit);
9ee6a48d 657
9751c00e 658 cpp_register_pragma (parse_in, 0, "interface", handle_pragma_interface);
659 cpp_register_pragma (parse_in, 0, "implementation",
518796ad 660 handle_pragma_implementation);
9ee6a48d 661
9751c00e 662 cpp_register_pragma (parse_in, "GCC", "interface", handle_pragma_interface);
663 cpp_register_pragma (parse_in, "GCC", "implementation",
518796ad 664 handle_pragma_implementation);
6df8a9dd 665 cpp_register_pragma (parse_in, "GCC", "java_exceptions",
666 handle_pragma_java_exceptions);
518796ad 667}
471086d6 668
9ceb1c29 669/* Initialize the C++ front end. This function is very sensitive to
670 the exact order that things are done here. It would be nice if the
671 initialization done by this routine were moved to its subroutines,
672 and the ordering dependencies clarified and reduced. */
518796ad 673const char *
9ceb1c29 674cxx_init (filename)
518796ad 675 const char *filename;
676{
471086d6 677 decl_printable_name = lang_printable_name;
ec6cb94a 678 input_filename = "<internal>";
518796ad 679
680 init_reswords ();
518796ad 681 init_spew ();
23f83a9a 682 init_tree ();
471086d6 683 init_cplus_expand ();
41fb2c18 684 init_cp_semantics ();
471086d6 685
51444f0d 686 add_c_tree_codes ();
687
688 memcpy (tree_code_type + (int) LAST_C_TREE_CODE,
b144fd49 689 cplus_tree_code_type,
51444f0d 690 (int)LAST_CPLUS_TREE_CODE - (int)LAST_C_TREE_CODE);
691 memcpy (tree_code_length + (int) LAST_C_TREE_CODE,
b144fd49 692 cplus_tree_code_length,
51444f0d 693 (LAST_CPLUS_TREE_CODE - (int)LAST_C_TREE_CODE) * sizeof (int));
694 memcpy (tree_code_name + (int) LAST_C_TREE_CODE,
b144fd49 695 cplus_tree_code_name,
51444f0d 696 (LAST_CPLUS_TREE_CODE - (int)LAST_C_TREE_CODE) * sizeof (char *));
471086d6 697
97cc4539 698 init_operators ();
442fd60a 699 init_method ();
471086d6 700 init_error ();
cfa70726 701
471086d6 702 current_function_decl = NULL;
703
471086d6 704 class_type_node = build_int_2 (class_type, 0);
705 TREE_TYPE (class_type_node) = class_type_node;
706 ridpointers[(int) RID_CLASS] = class_type_node;
707
708 record_type_node = build_int_2 (record_type, 0);
709 TREE_TYPE (record_type_node) = record_type_node;
518796ad 710 ridpointers[(int) RID_STRUCT] = record_type_node;
471086d6 711
712 union_type_node = build_int_2 (union_type, 0);
713 TREE_TYPE (union_type_node) = union_type_node;
714 ridpointers[(int) RID_UNION] = union_type_node;
715
716 enum_type_node = build_int_2 (enum_type, 0);
717 TREE_TYPE (enum_type_node) = enum_type_node;
718 ridpointers[(int) RID_ENUM] = enum_type_node;
719
9ceb1c29 720 cxx_init_decl_processing ();
721
435fb09b 722 /* Create the built-in __null node. */
954885ed 723 null_node = build_int_2 (0, 0);
9ceb1c29 724 TREE_TYPE (null_node) = type_for_size (POINTER_SIZE, 0);
2739960c 725 ridpointers[RID_NULL] = null_node;
ec10e4ad 726
17fd67d5 727 token_count = init_cpp_parse ();
471086d6 728 interface_unknown = 1;
8c463cf0 729
435fb09b 730 filename = c_common_init (filename);
9ceb1c29 731
732 init_cp_pragma ();
733
734 if (flag_gnu_xref)
735 GNU_xref_begin (filename);
736 init_repo (filename);
737
738 return filename;
471086d6 739}
471086d6 740\f
1d0fdec1 741inline void
471086d6 742yyprint (file, yychar, yylval)
743 FILE *file;
744 int yychar;
745 YYSTYPE yylval;
746{
747 tree t;
748 switch (yychar)
749 {
750 case IDENTIFIER:
751 case TYPENAME:
752 case TYPESPEC:
753 case PTYPENAME:
4aebb696 754 case PFUNCNAME:
471086d6 755 case IDENTIFIER_DEFN:
756 case TYPENAME_DEFN:
757 case PTYPENAME_DEFN:
471086d6 758 case SCSPEC:
759 case PRE_PARSED_CLASS_DECL:
760 t = yylval.ttype;
eab00fbe 761 if (TREE_CODE (t) == TYPE_DECL || TREE_CODE (t) == TEMPLATE_DECL)
d2a15a12 762 {
f86b1dce 763 fprintf (file, " `%s'", IDENTIFIER_POINTER (DECL_NAME (t)));
d2a15a12 764 break;
765 }
471086d6 766 my_friendly_assert (TREE_CODE (t) == IDENTIFIER_NODE, 224);
767 if (IDENTIFIER_POINTER (t))
768 fprintf (file, " `%s'", IDENTIFIER_POINTER (t));
769 break;
9ee6a48d 770
471086d6 771 case AGGR:
772 if (yylval.ttype == class_type_node)
773 fprintf (file, " `class'");
774 else if (yylval.ttype == record_type_node)
775 fprintf (file, " `struct'");
776 else if (yylval.ttype == union_type_node)
777 fprintf (file, " `union'");
778 else if (yylval.ttype == enum_type_node)
779 fprintf (file, " `enum'");
471086d6 780 else
781 my_friendly_abort (80);
782 break;
9ee6a48d 783
784 case CONSTANT:
785 t = yylval.ttype;
786 if (TREE_CODE (t) == INTEGER_CST)
787 fprintf (file,
788#if HOST_BITS_PER_WIDE_INT == 64
789#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
790 " 0x%x%016x",
791#else
792#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
793 " 0x%lx%016lx",
794#else
795 " 0x%llx%016llx",
796#endif
797#endif
798#else
799#if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
800 " 0x%lx%08lx",
801#else
802 " 0x%x%08x",
803#endif
804#endif
805 TREE_INT_CST_HIGH (t), TREE_INT_CST_LOW (t));
806 break;
471086d6 807 }
808}
809
e857e9c7 810#if defined(GATHER_STATISTICS) && defined(REDUCE_LENGTH)
471086d6 811static int *reduce_count;
e857e9c7 812#endif
813
471086d6 814int *token_count;
815
3d4e092a 816#if 0
471086d6 817#define REDUCE_LENGTH (sizeof (yyr2) / sizeof (yyr2[0]))
818#define TOKEN_LENGTH (256 + sizeof (yytname) / sizeof (yytname[0]))
3d4e092a 819#endif
471086d6 820
471086d6 821#ifdef GATHER_STATISTICS
3d4e092a 822#ifdef REDUCE_LENGTH
471086d6 823void
824yyhook (yyn)
825 int yyn;
826{
827 reduce_count[yyn] += 1;
828}
471086d6 829
830static int
831reduce_cmp (p, q)
832 int *p, *q;
833{
834 return reduce_count[*q] - reduce_count[*p];
835}
836
837static int
838token_cmp (p, q)
839 int *p, *q;
840{
841 return token_count[*q] - token_count[*p];
842}
0543e7a9 843#endif
3d4e092a 844#endif
471086d6 845
846void
847print_parse_statistics ()
848{
849#ifdef GATHER_STATISTICS
3d4e092a 850#ifdef REDUCE_LENGTH
471086d6 851#if YYDEBUG != 0
852 int i;
853 int maxlen = REDUCE_LENGTH;
854 unsigned *sorted;
3c3beda6 855
471086d6 856 if (reduce_count[-1] == 0)
857 return;
858
859 if (TOKEN_LENGTH > REDUCE_LENGTH)
860 maxlen = TOKEN_LENGTH;
861 sorted = (unsigned *) alloca (sizeof (int) * maxlen);
862
863 for (i = 0; i < TOKEN_LENGTH; i++)
864 sorted[i] = i;
865 qsort (sorted, TOKEN_LENGTH, sizeof (int), token_cmp);
866 for (i = 0; i < TOKEN_LENGTH; i++)
867 {
96624a9e 868 int idx = sorted[i];
869 if (token_count[idx] == 0)
471086d6 870 break;
96624a9e 871 if (token_count[idx] < token_count[-1])
471086d6 872 break;
873 fprintf (stderr, "token %d, `%s', count = %d\n",
96624a9e 874 idx, yytname[YYTRANSLATE (idx)], token_count[idx]);
471086d6 875 }
876 fprintf (stderr, "\n");
877 for (i = 0; i < REDUCE_LENGTH; i++)
878 sorted[i] = i;
879 qsort (sorted, REDUCE_LENGTH, sizeof (int), reduce_cmp);
880 for (i = 0; i < REDUCE_LENGTH; i++)
881 {
96624a9e 882 int idx = sorted[i];
883 if (reduce_count[idx] == 0)
471086d6 884 break;
96624a9e 885 if (reduce_count[idx] < reduce_count[-1])
471086d6 886 break;
887 fprintf (stderr, "rule %d, line %d, count = %d\n",
96624a9e 888 idx, yyrline[idx], reduce_count[idx]);
471086d6 889 }
890 fprintf (stderr, "\n");
891#endif
892#endif
3d4e092a 893#endif
471086d6 894}
895
896/* Sets the value of the 'yydebug' variable to VALUE.
897 This is a function so we don't have to have YYDEBUG defined
898 in order to build the compiler. */
96624a9e 899
471086d6 900void
b7fced5e 901cxx_set_yydebug (value)
471086d6 902 int value;
903{
904#if YYDEBUG != 0
905 extern int yydebug;
906 yydebug = value;
907#else
905d4035 908 warning ("YYDEBUG not defined.");
471086d6 909#endif
910}
911
471086d6 912/* Helper function to load global variables with interface
913 information. */
96624a9e 914
471086d6 915void
916extract_interface_info ()
917{
518796ad 918 struct c_fileinfo *finfo = 0;
471086d6 919
920 if (flag_alt_external_templates)
921 {
04d89d04 922 tree til = tinst_for_decl ();
3c3beda6 923
471086d6 924 if (til)
518796ad 925 finfo = get_fileinfo (TINST_FILE (til));
471086d6 926 }
518796ad 927 if (!finfo)
928 finfo = get_fileinfo (input_filename);
929
930 interface_only = finfo->interface_only;
931 interface_unknown = finfo->interface_unknown;
932
933 /* This happens to be a convenient place to put this. */
934 if (flag_gnu_xref) GNU_xref_file (input_filename);
471086d6 935}
936
ac9386a0 937/* Return nonzero if S is not considered part of an
471086d6 938 INTERFACE/IMPLEMENTATION pair. Otherwise, return 0. */
96624a9e 939
471086d6 940static int
941interface_strcmp (s)
e1721763 942 const char *s;
471086d6 943{
944 /* Set the interface/implementation bits for this scope. */
945 struct impl_files *ifiles;
e1721763 946 const char *s1;
471086d6 947
471086d6 948 for (ifiles = impl_file_chain; ifiles; ifiles = ifiles->next)
949 {
e1721763 950 const char *t1 = ifiles->filename;
471086d6 951 s1 = s;
952
953 if (*s1 != *t1 || *s1 == 0)
954 continue;
955
956 while (*s1 == *t1 && *s1 != 0)
957 s1++, t1++;
958
959 /* A match. */
960 if (*s1 == *t1)
961 return 0;
962
963 /* Don't get faked out by xxx.yyy.cc vs xxx.zzz.cc. */
78dbff7c 964 if (strchr (s1, '.') || strchr (t1, '.'))
471086d6 965 continue;
966
967 if (*s1 == '\0' || s1[-1] != '.' || t1[-1] != '.')
968 continue;
969
970 /* A match. */
971 return 0;
972 }
973
974 /* No matches. */
975 return 1;
976}
977
518796ad 978/* Heuristic to tell whether the user is missing a semicolon
979 after a struct or enum declaration. Emit an error message
980 if we know the user has blown it. */
981
982void
983check_for_missing_semicolon (type)
984 tree type;
985{
986 if (yychar < 0)
987 yychar = yylex ();
988
989 if ((yychar > 255
990 && yychar != SCSPEC
991 && yychar != IDENTIFIER
992 && yychar != TYPENAME
993 && yychar != CV_QUALIFIER
994 && yychar != SELFNAME)
995 || yychar == 0 /* EOF */)
996 {
83c4eacf 997 if (TYPE_ANONYMOUS_P (type))
518796ad 998 error ("semicolon missing after %s declaration",
999 TREE_CODE (type) == ENUMERAL_TYPE ? "enum" : "struct");
1000 else
1001 cp_error ("semicolon missing after declaration of `%T'", type);
1002 shadow_tag (build_tree_list (0, type));
1003 }
1004 /* Could probably also hack cases where class { ... } f (); appears. */
1005 clear_anon_tags ();
1006}
1007
1008void
1009note_got_semicolon (type)
1010 tree type;
1011{
1012 if (!TYPE_P (type))
1013 my_friendly_abort (60);
1014 if (CLASS_TYPE_P (type))
1015 CLASSTYPE_GOT_SEMICOLON (type) = 1;
1016}
1017
1018void
1019note_list_got_semicolon (declspecs)
1020 tree declspecs;
1021{
1022 tree link;
1023
1024 for (link = declspecs; link; link = TREE_CHAIN (link))
1025 {
1026 tree type = TREE_VALUE (link);
1027 if (TYPE_P (type))
1028 note_got_semicolon (type);
1029 }
1030 clear_anon_tags ();
1031}
1032\f
1033
1034/* Parse a #pragma whose sole argument is a string constant.
1035 If OPT is true, the argument is optional. */
1036static tree
1037parse_strconst_pragma (name, opt)
1038 const char *name;
1039 int opt;
1040{
1041 tree result, x;
1042 enum cpp_ttype t;
1043
1044 t = c_lex (&x);
1045 if (t == CPP_STRING)
1046 {
1047 result = x;
1048 if (c_lex (&x) != CPP_EOF)
1049 warning ("junk at end of #pragma %s", name);
1050 return result;
1051 }
1052
1053 if (t == CPP_EOF && opt)
1054 return 0;
1055
1056 error ("invalid #pragma %s", name);
1057 return (tree)-1;
1058}
3c3beda6 1059
518796ad 1060static void
1061handle_pragma_vtable (dfile)
1062 cpp_reader *dfile ATTRIBUTE_UNUSED;
1063{
b53db2b0 1064 parse_strconst_pragma ("vtable", 0);
1065 sorry ("#pragma vtable no longer supported");
518796ad 1066}
1067
495d2af2 1068static void
518796ad 1069handle_pragma_unit (dfile)
1070 cpp_reader *dfile ATTRIBUTE_UNUSED;
495d2af2 1071{
518796ad 1072 /* Validate syntax, but don't do anything. */
1073 parse_strconst_pragma ("unit", 0);
1074}
1075
1076static void
1077handle_pragma_interface (dfile)
1078 cpp_reader *dfile ATTRIBUTE_UNUSED;
1079{
1080 tree fname = parse_strconst_pragma ("interface", 1);
1081 struct c_fileinfo *finfo;
1082 const char *main_filename;
1083
1084 if (fname == (tree)-1)
1085 return;
1086 else if (fname == 0)
40275504 1087 main_filename = lbasename (input_filename);
518796ad 1088 else
1089 main_filename = TREE_STRING_POINTER (fname);
1090
1091 finfo = get_fileinfo (input_filename);
495d2af2 1092
1093 if (impl_file_chain == 0)
1094 {
1095 /* If this is zero at this point, then we are
1096 auto-implementing. */
1097 if (main_input_filename == 0)
1098 main_input_filename = input_filename;
495d2af2 1099 }
1100
1101 interface_only = interface_strcmp (main_filename);
1102#ifdef MULTIPLE_SYMBOL_SPACES
1103 if (! interface_only)
518796ad 1104#endif
495d2af2 1105 interface_unknown = 0;
518796ad 1106
1107 finfo->interface_only = interface_only;
1108 finfo->interface_unknown = interface_unknown;
495d2af2 1109}
1110
e060fd61 1111/* Note that we have seen a #pragma implementation for the key MAIN_FILENAME.
1112 We used to only allow this at toplevel, but that restriction was buggy
1113 in older compilers and it seems reasonable to allow it in the headers
1114 themselves, too. It only needs to precede the matching #p interface.
1115
1116 We don't touch interface_only or interface_unknown; the user must specify
1117 a matching #p interface for this to have any effect. */
1118
495d2af2 1119static void
518796ad 1120handle_pragma_implementation (dfile)
1121 cpp_reader *dfile ATTRIBUTE_UNUSED;
495d2af2 1122{
518796ad 1123 tree fname = parse_strconst_pragma ("implementation", 1);
1124 const char *main_filename;
e060fd61 1125 struct impl_files *ifiles = impl_file_chain;
518796ad 1126
1127 if (fname == (tree)-1)
1128 return;
1129
1130 if (fname == 0)
1131 {
1132 if (main_input_filename)
1133 main_filename = main_input_filename;
1134 else
1135 main_filename = input_filename;
40275504 1136 main_filename = lbasename (main_filename);
518796ad 1137 }
1138 else
1139 {
1140 main_filename = TREE_STRING_POINTER (fname);
9751c00e 1141 if (cpp_included (parse_in, main_filename))
518796ad 1142 warning ("#pragma implementation for %s appears after file is included",
1143 main_filename);
518796ad 1144 }
1145
e060fd61 1146 for (; ifiles; ifiles = ifiles->next)
495d2af2 1147 {
e060fd61 1148 if (! strcmp (ifiles->filename, main_filename))
1149 break;
495d2af2 1150 }
e060fd61 1151 if (ifiles == 0)
495d2af2 1152 {
e060fd61 1153 ifiles = (struct impl_files*) xmalloc (sizeof (struct impl_files));
ec6cb94a 1154 ifiles->filename = main_filename;
e060fd61 1155 ifiles->next = impl_file_chain;
1156 impl_file_chain = ifiles;
495d2af2 1157 }
495d2af2 1158}
53137e6a 1159
6df8a9dd 1160/* Indicate that this file uses Java-personality exception handling. */
1161static void
1162handle_pragma_java_exceptions (dfile)
1163 cpp_reader *dfile ATTRIBUTE_UNUSED;
1164{
1165 tree x;
1166 if (c_lex (&x) != CPP_EOF)
1167 warning ("junk at end of #pragma GCC java_exceptions");
1168
1169 choose_personality_routine (lang_java);
1170}
1171
518796ad 1172void
1173do_pending_lang_change ()
53137e6a 1174{
518796ad 1175 for (; pending_lang_change > 0; --pending_lang_change)
1176 push_lang_context (lang_name_c);
1177 for (; pending_lang_change < 0; ++pending_lang_change)
1178 pop_lang_context ();
53137e6a 1179}
1180
518796ad 1181/* Return true if d is in a global scope. */
96624a9e 1182
518796ad 1183static int
1184is_global (d)
1185 tree d;
471086d6 1186{
518796ad 1187 while (1)
1188 switch (TREE_CODE (d))
1189 {
1190 case ERROR_MARK:
1191 return 1;
c38086bd 1192
518796ad 1193 case OVERLOAD: d = OVL_FUNCTION (d); continue;
1194 case TREE_LIST: d = TREE_VALUE (d); continue;
1195 default:
1196 my_friendly_assert (DECL_P (d), 980629);
c38086bd 1197
518796ad 1198 return DECL_NAMESPACE_SCOPE_P (d);
41bc62d4 1199 }
471086d6 1200}
1201
518796ad 1202tree
1203do_identifier (token, parsing, args)
1204 register tree token;
1205 int parsing;
1206 tree args;
471086d6 1207{
518796ad 1208 register tree id;
1209 int lexing = (parsing == 1);
96624a9e 1210
a2136ce6 1211 if (! lexing)
518796ad 1212 id = lookup_name (token, 0);
471086d6 1213 else
518796ad 1214 id = lastiddecl;
471086d6 1215
518796ad 1216 /* Do Koenig lookup if appropriate (inside templates we build lookup
1217 expressions instead).
471086d6 1218
518796ad 1219 [basic.lookup.koenig]: If the ordinary unqualified lookup of the name
1220 finds the declaration of a class member function, the associated
1221 namespaces and classes are not considered. */
2f72d0c8 1222
8257afbc 1223 if (args && !current_template_parms && (!id || is_global (id)))
53137e6a 1224 id = lookup_arg_dependent (token, id, args);
8257afbc 1225
f96b25bb 1226 /* Remember that this name has been used in the class definition, as per
1227 [class.scope0] */
fd8d6049 1228 if (id && parsing)
1eaf178d 1229 maybe_note_name_used_in_class (token, id);
3d4e092a 1230
de6778f0 1231 if (id == error_mark_node)
1232 {
1233 /* lookup_name quietly returns error_mark_node if we're parsing,
1234 as we don't want to complain about an identifier that ends up
1235 being used as a declarator. So we call it again to get the error
1236 message. */
1237 id = lookup_name (token, 0);
1238 return error_mark_node;
1239 }
c324ed63 1240
1241 if (!id || (TREE_CODE (id) == FUNCTION_DECL
1242 && DECL_ANTICIPATED (id)))
de6778f0 1243 {
e857e9c7 1244 if (current_template_parms)
3addf100 1245 return build_min_nt (LOOKUP_EXPR, token);
e857e9c7 1246 else if (IDENTIFIER_OPNAME_P (token))
3d4e092a 1247 {
97cc4539 1248 if (token != ansi_opname (ERROR_MARK))
905d4035 1249 cp_error ("`%D' not defined", token);
3d4e092a 1250 id = error_mark_node;
1251 }
471086d6 1252 else if (current_function_decl == 0)
1253 {
905d4035 1254 cp_error ("`%D' was not declared in this scope", token);
471086d6 1255 id = error_mark_node;
1256 }
1257 else
1258 {
18e99d00 1259 if (IDENTIFIER_NAMESPACE_VALUE (token) != error_mark_node
471086d6 1260 || IDENTIFIER_ERROR_LOCUS (token) != current_function_decl)
1261 {
1262 static int undeclared_variable_notice;
1263
905d4035 1264 cp_error ("`%D' undeclared (first use this function)", token);
471086d6 1265
1266 if (! undeclared_variable_notice)
1267 {
e77c6394 1268 error ("(Each undeclared identifier is reported only once for each function it appears in.)");
471086d6 1269 undeclared_variable_notice = 1;
1270 }
1271 }
1272 id = error_mark_node;
1273 /* Prevent repeated error messages. */
8417823c 1274 SET_IDENTIFIER_NAMESPACE_VALUE (token, error_mark_node);
471086d6 1275 SET_IDENTIFIER_ERROR_LOCUS (token, current_function_decl);
1276 }
1277 }
44733726 1278
1279 if (TREE_CODE (id) == VAR_DECL && DECL_DEAD_FOR_LOCAL (id))
1280 {
1281 tree shadowed = DECL_SHADOWED_FOR_VAR (id);
de9554eb 1282 while (shadowed != NULL_TREE && TREE_CODE (shadowed) == VAR_DECL
1283 && DECL_DEAD_FOR_LOCAL (shadowed))
1284 shadowed = DECL_SHADOWED_FOR_VAR (shadowed);
1285 if (!shadowed)
18e99d00 1286 shadowed = IDENTIFIER_NAMESPACE_VALUE (DECL_NAME (id));
44733726 1287 if (shadowed)
1288 {
1289 if (!DECL_ERROR_REPORTED (id))
1290 {
905d4035 1291 warning ("name lookup of `%s' changed",
44733726 1292 IDENTIFIER_POINTER (token));
657c76e1 1293 cp_warning_at (" matches this `%D' under ISO standard rules",
44733726 1294 shadowed);
905d4035 1295 cp_warning_at (" matches this `%D' under old rules", id);
44733726 1296 DECL_ERROR_REPORTED (id) = 1;
1297 }
1298 id = shadowed;
1299 }
1300 else if (!DECL_ERROR_REPORTED (id))
1301 {
44733726 1302 DECL_ERROR_REPORTED (id) = 1;
89e923d8 1303 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (id)))
44733726 1304 {
657c76e1 1305 error ("name lookup of `%s' changed for new ISO `for' scoping",
5212eb00 1306 IDENTIFIER_POINTER (token));
905d4035 1307 cp_error_at (" cannot use obsolete binding at `%D' because it has a destructor", id);
44733726 1308 id = error_mark_node;
1309 }
1310 else
1311 {
657c76e1 1312 pedwarn ("name lookup of `%s' changed for new ISO `for' scoping",
5212eb00 1313 IDENTIFIER_POINTER (token));
905d4035 1314 cp_pedwarn_at (" using obsolete binding at `%D'", id);
44733726 1315 }
1316 }
1317 }
471086d6 1318 /* TREE_USED is set in `hack_identifier'. */
1319 if (TREE_CODE (id) == CONST_DECL)
1320 {
b90e9c68 1321 /* Check access. */
471086d6 1322 if (IDENTIFIER_CLASS_VALUE (token) == id)
9ba4048d 1323 enforce_access (CP_DECL_CONTEXT(id), id);
6219a7c1 1324 if (!processing_template_decl || DECL_TEMPLATE_PARM_P (id))
e857e9c7 1325 id = DECL_INITIAL (id);
471086d6 1326 }
1327 else
e857e9c7 1328 id = hack_identifier (id, token);
1329
11fa0698 1330 /* We must look up dependent names when the template is
1331 instantiated, not while parsing it. For now, we don't
1332 distinguish between dependent and independent names. So, for
1333 example, we look up all overloaded functions at
1334 instantiation-time, even though in some cases we should just use
1335 the DECL we have here. We also use LOOKUP_EXPRs to find things
aed6ae85 1336 like local variables, rather than creating TEMPLATE_DECLs for the
11fa0698 1337 local variables and then finding matching instantiations. */
3addf100 1338 if (current_template_parms
3c3beda6 1339 && (is_overloaded_fn (id)
1340 || (TREE_CODE (id) == VAR_DECL
11fa0698 1341 && CP_DECL_CONTEXT (id)
1342 && TREE_CODE (CP_DECL_CONTEXT (id)) == FUNCTION_DECL)
3addf100 1343 || TREE_CODE (id) == PARM_DECL
0b43fa8e 1344 || TREE_CODE (id) == RESULT_DECL
3addf100 1345 || TREE_CODE (id) == USING_DECL))
1346 id = build_min_nt (LOOKUP_EXPR, token);
3c3beda6 1347
e857e9c7 1348 return id;
1349}
1350
1351tree
1352do_scoped_id (token, parsing)
1353 tree token;
1354 int parsing;
1355{
18e99d00 1356 tree id;
1357 /* during parsing, this is ::name. Otherwise, it is black magic. */
1358 if (parsing)
8417823c 1359 {
23f83a9a 1360 id = make_node (CPLUS_BINDING);
0309a517 1361 if (!qualified_lookup_using_namespace (token, global_namespace, id, 0))
8417823c 1362 id = NULL_TREE;
1363 else
1364 id = BINDING_VALUE (id);
3c3beda6 1365 }
18e99d00 1366 else
1367 id = IDENTIFIER_GLOBAL_VALUE (token);
e857e9c7 1368 if (parsing && yychar == YYEMPTY)
1369 yychar = yylex ();
1370 if (! id)
1371 {
3cc0b4b9 1372 if (processing_template_decl)
e857e9c7 1373 {
3addf100 1374 id = build_min_nt (LOOKUP_EXPR, token);
e857e9c7 1375 LOOKUP_EXPR_GLOBAL (id) = 1;
1376 return id;
1377 }
0f497990 1378 if (IDENTIFIER_NAMESPACE_VALUE (token) != error_mark_node)
1379 cp_error ("`::%D' undeclared (first use here)", token);
1380 id = error_mark_node;
1381 /* Prevent repeated error messages. */
1382 SET_IDENTIFIER_NAMESPACE_VALUE (token, error_mark_node);
e857e9c7 1383 }
1384 else
1385 {
1386 if (TREE_CODE (id) == ADDR_EXPR)
1387 mark_used (TREE_OPERAND (id, 0));
8417823c 1388 else if (TREE_CODE (id) != OVERLOAD)
e857e9c7 1389 mark_used (id);
1390 }
3cc0b4b9 1391 if (TREE_CODE (id) == CONST_DECL && ! processing_template_decl)
e857e9c7 1392 {
1393 /* XXX CHS - should we set TREE_USED of the constant? */
1394 id = DECL_INITIAL (id);
1395 /* This is to prevent an enum whose value is 0
1396 from being considered a null pointer constant. */
1397 id = build1 (NOP_EXPR, TREE_TYPE (id), id);
1398 TREE_CONSTANT (id) = 1;
1399 }
1400
3cc0b4b9 1401 if (processing_template_decl)
e857e9c7 1402 {
1403 if (is_overloaded_fn (id))
1404 {
3addf100 1405 id = build_min_nt (LOOKUP_EXPR, token);
e857e9c7 1406 LOOKUP_EXPR_GLOBAL (id) = 1;
3addf100 1407 return id;
e857e9c7 1408 }
1409 /* else just use the decl */
1410 }
03db3ebd 1411 return convert_from_reference (id);
471086d6 1412}
1413
1414tree
1415identifier_typedecl_value (node)
1416 tree node;
1417{
1418 tree t, type;
1419 type = IDENTIFIER_TYPE_VALUE (node);
1420 if (type == NULL_TREE)
1421 return NULL_TREE;
53137e6a 1422
1423 if (IDENTIFIER_BINDING (node))
1424 {
1425 t = IDENTIFIER_VALUE (node);
1426 if (t && TREE_CODE (t) == TYPE_DECL && TREE_TYPE (t) == type)
1427 return t;
1428 }
1429 if (IDENTIFIER_NAMESPACE_VALUE (node))
1430 {
1431 t = IDENTIFIER_NAMESPACE_VALUE (node);
1432 if (t && TREE_CODE (t) == TYPE_DECL && TREE_TYPE (t) == type)
1433 return t;
1434 }
1435
471086d6 1436 /* Will this one ever happen? */
b0df6589 1437 if (TYPE_MAIN_DECL (type))
1438 return TYPE_MAIN_DECL (type);
471086d6 1439
1440 /* We used to do an internal error of 62 here, but instead we will
1441 handle the return of a null appropriately in the callers. */
1442 return NULL_TREE;
1443}
1444
e857e9c7 1445#ifdef GATHER_STATISTICS
3cc0b4b9 1446/* The original for tree_node_kind is in the toplevel tree.c; changes there
1447 need to be brought into here, unless this were actually put into a header
1448 instead. */
1449/* Statistics-gathering stuff. */
1450typedef enum
1451{
1452 d_kind,
1453 t_kind,
1454 b_kind,
1455 s_kind,
1456 r_kind,
1457 e_kind,
1458 c_kind,
1459 id_kind,
1460 op_id_kind,
1461 perm_list_kind,
1462 temp_list_kind,
1463 vec_kind,
1464 x_kind,
1465 lang_decl,
1466 lang_type,
1467 all_kinds
1468} tree_node_kind;
1469
471086d6 1470extern int tree_node_counts[];
1471extern int tree_node_sizes[];
e857e9c7 1472#endif
471086d6 1473
471086d6 1474tree
1475build_lang_decl (code, name, type)
1476 enum tree_code code;
1477 tree name;
1478 tree type;
1479{
c4802aa6 1480 tree t;
1481
c4802aa6 1482 t = build_decl (code, name, type);
4ba5f733 1483 retrofit_lang_decl (t);
c4802aa6 1484
4ba5f733 1485 return t;
1486}
1487
1488/* Add DECL_LANG_SPECIFIC info to T. Called from build_lang_decl
1489 and pushdecl (for functions generated by the backend). */
1490
1491void
1492retrofit_lang_decl (t)
1493 tree t;
1494{
70a658bd 1495 struct lang_decl *ld;
c4802aa6 1496 size_t size;
471086d6 1497
c4802aa6 1498 if (CAN_HAVE_FULL_LANG_DECL_P (t))
1499 size = sizeof (struct lang_decl);
1500 else
1501 size = sizeof (struct lang_decl_flags);
c6138f2d 1502
791ceafe 1503 ld = (struct lang_decl *) ggc_alloc_cleared (size);
471086d6 1504
70a658bd 1505 DECL_LANG_SPECIFIC (t) = ld;
471086d6 1506 if (current_lang_name == lang_name_cplusplus)
4b1984f5 1507 SET_DECL_LANGUAGE (t, lang_cplusplus);
471086d6 1508 else if (current_lang_name == lang_name_c)
4b1984f5 1509 SET_DECL_LANGUAGE (t, lang_c);
f468434d 1510 else if (current_lang_name == lang_name_java)
4b1984f5 1511 SET_DECL_LANGUAGE (t, lang_java);
471086d6 1512 else my_friendly_abort (64);
1513
471086d6 1514#ifdef GATHER_STATISTICS
1515 tree_node_counts[(int)lang_decl] += 1;
c4802aa6 1516 tree_node_sizes[(int)lang_decl] += size;
471086d6 1517#endif
471086d6 1518}
1519
471086d6 1520void
1521copy_lang_decl (node)
1522 tree node;
1523{
1524 int size;
a1b0969c 1525 struct lang_decl *ld;
471086d6 1526
e857e9c7 1527 if (! DECL_LANG_SPECIFIC (node))
1528 return;
1529
c6138f2d 1530 if (!CAN_HAVE_FULL_LANG_DECL_P (node))
471086d6 1531 size = sizeof (struct lang_decl_flags);
1532 else
1533 size = sizeof (struct lang_decl);
a1b0969c 1534 ld = (struct lang_decl *) ggc_alloc (size);
b1b63592 1535 memcpy (ld, DECL_LANG_SPECIFIC (node), size);
a1b0969c 1536 DECL_LANG_SPECIFIC (node) = ld;
1d36b416 1537
1538#ifdef GATHER_STATISTICS
1539 tree_node_counts[(int)lang_decl] += 1;
1540 tree_node_sizes[(int)lang_decl] += size;
1541#endif
471086d6 1542}
1543
c771ec7a 1544/* Copy DECL, including any language-specific parts. */
1545
1546tree
1547copy_decl (decl)
1548 tree decl;
1549{
1550 tree copy;
1551
1552 copy = copy_node (decl);
1553 copy_lang_decl (copy);
1554 return copy;
1555}
1556
1d36b416 1557/* Replace the shared language-specific parts of NODE with a new copy. */
1558
f6020ad0 1559static void
1d36b416 1560copy_lang_type (node)
1561 tree node;
1562{
1563 int size;
1564 struct lang_type *lt;
1565
1566 if (! TYPE_LANG_SPECIFIC (node))
1567 return;
1568
1569 size = sizeof (struct lang_type);
1570 lt = (struct lang_type *) ggc_alloc (size);
1571 memcpy (lt, TYPE_LANG_SPECIFIC (node), size);
1572 TYPE_LANG_SPECIFIC (node) = lt;
1573
1574#ifdef GATHER_STATISTICS
1575 tree_node_counts[(int)lang_type] += 1;
1576 tree_node_sizes[(int)lang_type] += size;
1577#endif
1578}
1579
1580/* Copy TYPE, including any language-specific parts. */
1581
1582tree
1583copy_type (type)
1584 tree type;
1585{
1586 tree copy;
1587
1588 copy = copy_node (type);
1589 copy_lang_type (copy);
1590 return copy;
1591}
1592
471086d6 1593tree
6c19d207 1594cp_make_lang_type (code)
471086d6 1595 enum tree_code code;
1596{
471086d6 1597 register tree t = make_node (code);
471086d6 1598
1d36b416 1599 /* Create lang_type structure. */
1600 if (IS_AGGR_TYPE_CODE (code)
1601 || code == BOUND_TEMPLATE_TEMPLATE_PARM)
e4e283ec 1602 {
dc125c61 1603 struct lang_type *pi;
1604
3c3beda6 1605 pi = ((struct lang_type *)
a4e59c31 1606 ggc_alloc_cleared (sizeof (struct lang_type)));
471086d6 1607
dc125c61 1608 TYPE_LANG_SPECIFIC (t) = pi;
1d36b416 1609
1610#ifdef GATHER_STATISTICS
1611 tree_node_counts[(int)lang_type] += 1;
1612 tree_node_sizes[(int)lang_type] += sizeof (struct lang_type);
1613#endif
1614 }
1615
1616 /* Set up some flags that give proper default behavior. */
1617 if (IS_AGGR_TYPE_CODE (code))
1618 {
e4e283ec 1619 SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, interface_unknown);
1620 CLASSTYPE_INTERFACE_ONLY (t) = interface_only;
471086d6 1621
e4e283ec 1622 /* Make sure this is laid out, for ease of use later. In the
1623 presence of parse errors, the normal was of assuring this
1624 might not ever get executed, so we lay it out *immediately*. */
1625 build_pointer_type (t);
e4e283ec 1626 }
1627 else
1628 /* We use TYPE_ALIAS_SET for the CLASSTYPE_MARKED bits. But,
1629 TYPE_ALIAS_SET is initialized to -1 by default, so we must
1630 clear it here. */
1631 TYPE_ALIAS_SET (t) = 0;
471086d6 1632
4a8caefa 1633 /* We need to allocate a TYPE_BINFO even for TEMPLATE_TYPE_PARMs
3ac23ebc 1634 since they can be virtual base types, and we then need a
1635 canonical binfo for them. Ideally, this would be done lazily for
1636 all types. */
1d36b416 1637 if (IS_AGGR_TYPE_CODE (code) || code == TEMPLATE_TYPE_PARM
1638 || code == BOUND_TEMPLATE_TEMPLATE_PARM
1639 || code == TYPENAME_TYPE)
902de8ed 1640 TYPE_BINFO (t) = make_binfo (size_zero_node, t, NULL_TREE, NULL_TREE);
3ac23ebc 1641
471086d6 1642 return t;
1643}
1644
9972f65e 1645tree
1646make_aggr_type (code)
1647 enum tree_code code;
1648{
1649 tree t = cp_make_lang_type (code);
1650
1651 if (IS_AGGR_TYPE_CODE (code))
1652 SET_IS_AGGR_TYPE (t, 1);
1653
1654 return t;
1655}
1656
471086d6 1657void
24054144 1658compiler_error VPARAMS ((const char *msg, ...))
471086d6 1659{
1660 char buf[1024];
3c3beda6 1661
0903457a 1662 VA_OPEN (ap, msg);
1663 VA_FIXEDARG (ap, const char *, msg);
e1721763 1664
1665 vsprintf (buf, msg, ap);
0903457a 1666 VA_CLOSE (ap);
1667
471086d6 1668 error_with_file_and_line (input_filename, lineno, "%s (compiler error)", buf);
1669}
518796ad 1670
3e04bd45 1671/* Return the type-qualifier corresponding to the identifier given by
1672 RID. */
1673
1674int
1675cp_type_qual_from_rid (rid)
1676 tree rid;
1677{
1678 if (rid == ridpointers[(int) RID_CONST])
1679 return TYPE_QUAL_CONST;
1680 else if (rid == ridpointers[(int) RID_VOLATILE])
1681 return TYPE_QUAL_VOLATILE;
1682 else if (rid == ridpointers[(int) RID_RESTRICT])
1683 return TYPE_QUAL_RESTRICT;
1684
1685 my_friendly_abort (0);
1686 return TYPE_UNQUALIFIED;
1687}