1 /* Separate lexical analyzer for GNU C++.
2 Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001 Free Software Foundation, Inc.
4 Hacked by Michael Tiemann (tiemann@cygnus.com)
6 This file is part of GNU CC.
8 GNU CC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GNU CC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU CC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
24 /* This file is the lexical analyzer for GNU C++. */
26 /* Cause the `yydebug' variable to be defined. */
45 #include "diagnostic.h"
47 #ifdef MULTIBYTE_CHARS
52 extern void yyprint
PARAMS ((FILE *, int, YYSTYPE
));
54 static int interface_strcmp
PARAMS ((const char *));
55 static int *init_cpp_parse
PARAMS ((void));
56 static void init_reswords
PARAMS ((void));
57 static void init_cp_pragma
PARAMS ((void));
59 static tree parse_strconst_pragma
PARAMS ((const char *, int));
60 static void handle_pragma_vtable
PARAMS ((cpp_reader
*));
61 static void handle_pragma_unit
PARAMS ((cpp_reader
*));
62 static void handle_pragma_interface
PARAMS ((cpp_reader
*));
63 static void handle_pragma_implementation
PARAMS ((cpp_reader
*));
64 static void cxx_init
PARAMS ((void));
65 static void cxx_finish
PARAMS ((void));
66 static void cxx_init_options
PARAMS ((void));
67 static void cxx_post_options
PARAMS ((void));
69 #ifdef GATHER_STATISTICS
71 static int reduce_cmp
PARAMS ((int *, int *));
72 static int token_cmp
PARAMS ((int *, int *));
75 static int is_global
PARAMS ((tree
));
76 static void init_operators
PARAMS ((void));
78 /* A constraint that can be tested at compile time. */
80 #define CONSTRAINT(name, expr) extern int constraint_##name [(expr) ? 1 : -1]
82 #define CONSTRAINT(name, expr) extern int constraint_/**/name [(expr) ? 1 : -1]
87 extern int yychar
; /* the lookahead symbol */
88 extern YYSTYPE yylval
; /* the semantic value of the */
89 /* lookahead symbol */
91 /* These flags are used by c-lex.c. In C++, they're always off and on,
93 int warn_traditional
= 0;
94 int flag_digraphs
= 1;
96 /* the declaration found for the last IDENTIFIER token read in.
97 yylex must look this up to detect typedefs, which get token type TYPENAME,
98 so it is left around in case the identifier is not a typedef but is
99 used in a context which makes it a reference to a variable. */
102 /* Array for holding counts of the numbers of tokens seen. */
103 extern int *token_count
;
105 /* Functions and data structures for #pragma interface.
107 `#pragma implementation' means that the main file being compiled
108 is considered to implement (provide) the classes that appear in
109 its main body. I.e., if this is file "foo.cc", and class `bar'
110 is defined in "foo.cc", then we say that "foo.cc implements bar".
112 All main input files "implement" themselves automagically.
114 `#pragma interface' means that unless this file (of the form "foo.h"
115 is not presently being included by file "foo.cc", the
116 CLASSTYPE_INTERFACE_ONLY bit gets set. The effect is that none
117 of the vtables nor any of the inline functions defined in foo.h
120 There are cases when we want to link files such as "defs.h" and
121 "main.cc". In this case, we give "defs.h" a `#pragma interface',
122 and "main.cc" has `#pragma implementation "defs.h"'. */
126 const char *filename
;
127 struct impl_files
*next
;
130 static struct impl_files
*impl_file_chain
;
133 /* Return something to represent absolute declarators containing a *.
134 TARGET is the absolute declarator that the * contains.
135 CV_QUALIFIERS is a list of modifiers such as const or volatile
136 to apply to the pointer type, represented as identifiers.
138 We return an INDIRECT_REF whose "contents" are TARGET
139 and whose type is the modifier list. */
142 make_pointer_declarator (cv_qualifiers
, target
)
143 tree cv_qualifiers
, target
;
145 if (target
&& TREE_CODE (target
) == IDENTIFIER_NODE
146 && ANON_AGGRNAME_P (target
))
147 error ("type name expected before `*'");
148 target
= build_nt (INDIRECT_REF
, target
);
149 TREE_TYPE (target
) = cv_qualifiers
;
153 /* Return something to represent absolute declarators containing a &.
154 TARGET is the absolute declarator that the & contains.
155 CV_QUALIFIERS is a list of modifiers such as const or volatile
156 to apply to the reference type, represented as identifiers.
158 We return an ADDR_EXPR whose "contents" are TARGET
159 and whose type is the modifier list. */
162 make_reference_declarator (cv_qualifiers
, target
)
163 tree cv_qualifiers
, target
;
167 if (TREE_CODE (target
) == ADDR_EXPR
)
169 error ("cannot declare references to references");
172 if (TREE_CODE (target
) == INDIRECT_REF
)
174 error ("cannot declare pointers to references");
177 if (TREE_CODE (target
) == IDENTIFIER_NODE
&& ANON_AGGRNAME_P (target
))
178 error ("type name expected before `&'");
180 target
= build_nt (ADDR_EXPR
, target
);
181 TREE_TYPE (target
) = cv_qualifiers
;
186 make_call_declarator (target
, parms
, cv_qualifiers
, exception_specification
)
187 tree target
, parms
, cv_qualifiers
, exception_specification
;
189 target
= build_nt (CALL_EXPR
, target
,
190 tree_cons (parms
, cv_qualifiers
, NULL_TREE
),
191 /* The third operand is really RTL. We
192 shouldn't put anything there. */
194 CALL_DECLARATOR_EXCEPTION_SPEC (target
) = exception_specification
;
199 set_quals_and_spec (call_declarator
, cv_qualifiers
, exception_specification
)
200 tree call_declarator
, cv_qualifiers
, exception_specification
;
202 CALL_DECLARATOR_QUALS (call_declarator
) = cv_qualifiers
;
203 CALL_DECLARATOR_EXCEPTION_SPEC (call_declarator
) = exception_specification
;
206 int interface_only
; /* whether or not current file is only for
207 interface definitions. */
208 int interface_unknown
; /* whether or not we know this class
209 to behave according to #pragma interface. */
211 /* Tree code classes. */
213 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
215 static char cplus_tree_code_type
[] = {
217 #include "cp-tree.def"
221 /* Table indexed by tree code giving number of expression
222 operands beyond the fixed part of the node structure.
223 Not used for types or decls. */
225 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
227 static int cplus_tree_code_length
[] = {
229 #include "cp-tree.def"
233 /* Names of tree components.
234 Used for printing out the tree and error messages. */
235 #define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
237 static const char *cplus_tree_code_name
[] = {
239 #include "cp-tree.def"
243 /* Each front end provides its own hooks, for toplev.c. */
244 struct lang_hooks lang_hooks
= {cxx_init
,
250 /* Post-switch processing. */
254 cpp_post_options (parse_in
);
260 parse_in
= cpp_create_reader (CLK_GNUCXX
);
262 /* Default exceptions on. */
264 /* Mark as "unspecified". */
265 flag_bounds_check
= -1;
266 /* By default wrap lines at 80 characters. Is getenv ("COLUMNS")
268 diagnostic_message_length_per_line
= 80;
269 /* By default, emit location information once for every
270 diagnostic message. */
271 set_message_prefixing_rule (DIAGNOSTICS_SHOW_PREFIX_ONCE
);
277 c_common_lang_init ();
279 if (flag_gnu_xref
) GNU_xref_begin (input_filename
);
280 init_repo (input_filename
);
286 if (flag_gnu_xref
) GNU_xref_end (errorcount
+sorrycount
);
298 #ifdef GATHER_STATISTICS
300 reduce_count
= (int *) xcalloc (sizeof (int), (REDUCE_LENGTH
+ 1));
302 token_count
= (int *) xcalloc (sizeof (int), (TOKEN_LENGTH
+ 1));
309 /* A mapping from tree codes to operator name information. */
310 operator_name_info_t operator_name_info
[(int) LAST_CPLUS_TREE_CODE
];
311 /* Similar, but for assignment operators. */
312 operator_name_info_t assignment_operator_name_info
[(int) LAST_CPLUS_TREE_CODE
];
314 /* Initialize data structures that keep track of operator names. */
316 #define DEF_OPERATOR(NAME, C, M, AR, AP) \
317 CONSTRAINT (C, sizeof "operator " + sizeof NAME <= 256);
318 #include "operators.def"
326 struct operator_name_info_t
*oni
;
328 #define DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, ASSN_P) \
329 sprintf (buffer, ISALPHA (NAME[0]) ? "operator %s" : "operator%s", NAME); \
330 identifier = get_identifier (buffer); \
331 IDENTIFIER_OPNAME_P (identifier) = 1; \
334 ? &assignment_operator_name_info[(int) CODE] \
335 : &operator_name_info[(int) CODE]); \
336 oni->identifier = identifier; \
338 oni->mangled_name = MANGLING;
340 #include "operators.def"
343 operator_name_info
[(int) ERROR_MARK
].identifier
344 = get_identifier ("<invalid operator>");
346 /* Handle some special cases. These operators are not defined in
347 the language, but can be produced internally. We may need them
348 for error-reporting. (Eventually, we should ensure that this
349 does not happen. Error messages involving these operators will
350 be confusing to users.) */
352 operator_name_info
[(int) INIT_EXPR
].name
353 = operator_name_info
[(int) MODIFY_EXPR
].name
;
354 operator_name_info
[(int) EXACT_DIV_EXPR
].name
= "(ceiling /)";
355 operator_name_info
[(int) CEIL_DIV_EXPR
].name
= "(ceiling /)";
356 operator_name_info
[(int) FLOOR_DIV_EXPR
].name
= "(floor /)";
357 operator_name_info
[(int) ROUND_DIV_EXPR
].name
= "(round /)";
358 operator_name_info
[(int) CEIL_MOD_EXPR
].name
= "(ceiling %)";
359 operator_name_info
[(int) FLOOR_MOD_EXPR
].name
= "(floor %)";
360 operator_name_info
[(int) ROUND_MOD_EXPR
].name
= "(round %)";
361 operator_name_info
[(int) ABS_EXPR
].name
= "abs";
362 operator_name_info
[(int) FFS_EXPR
].name
= "ffs";
363 operator_name_info
[(int) BIT_ANDTC_EXPR
].name
= "&~";
364 operator_name_info
[(int) TRUTH_AND_EXPR
].name
= "strict &&";
365 operator_name_info
[(int) TRUTH_OR_EXPR
].name
= "strict ||";
366 operator_name_info
[(int) IN_EXPR
].name
= "in";
367 operator_name_info
[(int) RANGE_EXPR
].name
= "...";
368 operator_name_info
[(int) CONVERT_EXPR
].name
= "+";
370 assignment_operator_name_info
[(int) EXACT_DIV_EXPR
].name
372 assignment_operator_name_info
[(int) CEIL_DIV_EXPR
].name
374 assignment_operator_name_info
[(int) FLOOR_DIV_EXPR
].name
376 assignment_operator_name_info
[(int) ROUND_DIV_EXPR
].name
378 assignment_operator_name_info
[(int) CEIL_MOD_EXPR
].name
380 assignment_operator_name_info
[(int) FLOOR_MOD_EXPR
].name
382 assignment_operator_name_info
[(int) ROUND_MOD_EXPR
].name
386 /* The reserved keyword table. */
390 ENUM_BITFIELD(rid
) rid
: 16;
391 unsigned int disable
: 16;
394 /* Disable mask. Keywords are disabled if (reswords[i].disable & mask) is
396 #define D_EXT 0x01 /* GCC extension */
397 #define D_ASM 0x02 /* in C99, but has a switch to turn it off */
398 #define D_OPNAME 0x04 /* operator names */
400 CONSTRAINT(ridbits_fit
, RID_LAST_MODIFIER
< sizeof(unsigned long) * CHAR_BIT
);
402 static const struct resword reswords
[] =
404 { "_Complex", RID_COMPLEX
, 0 },
405 { "__alignof", RID_ALIGNOF
, 0 },
406 { "__alignof__", RID_ALIGNOF
, 0 },
407 { "__asm", RID_ASM
, 0 },
408 { "__asm__", RID_ASM
, 0 },
409 { "__attribute", RID_ATTRIBUTE
, 0 },
410 { "__attribute__", RID_ATTRIBUTE
, 0 },
411 { "__builtin_va_arg", RID_VA_ARG
, 0 },
412 { "__complex", RID_COMPLEX
, 0 },
413 { "__complex__", RID_COMPLEX
, 0 },
414 { "__const", RID_CONST
, 0 },
415 { "__const__", RID_CONST
, 0 },
416 { "__extension__", RID_EXTENSION
, 0 },
417 { "__imag", RID_IMAGPART
, 0 },
418 { "__imag__", RID_IMAGPART
, 0 },
419 { "__inline", RID_INLINE
, 0 },
420 { "__inline__", RID_INLINE
, 0 },
421 { "__label__", RID_LABEL
, 0 },
422 { "__null", RID_NULL
, 0 },
423 { "__real", RID_REALPART
, 0 },
424 { "__real__", RID_REALPART
, 0 },
425 { "__restrict", RID_RESTRICT
, 0 },
426 { "__restrict__", RID_RESTRICT
, 0 },
427 { "__signed", RID_SIGNED
, 0 },
428 { "__signed__", RID_SIGNED
, 0 },
429 { "__typeof", RID_TYPEOF
, 0 },
430 { "__typeof__", RID_TYPEOF
, 0 },
431 { "__volatile", RID_VOLATILE
, 0 },
432 { "__volatile__", RID_VOLATILE
, 0 },
433 { "asm", RID_ASM
, D_ASM
},
434 { "and", RID_AND
, D_OPNAME
},
435 { "and_eq", RID_AND_EQ
, D_OPNAME
},
436 { "auto", RID_AUTO
, 0 },
437 { "bitand", RID_BITAND
, D_OPNAME
},
438 { "bitor", RID_BITOR
, D_OPNAME
},
439 { "bool", RID_BOOL
, 0 },
440 { "break", RID_BREAK
, 0 },
441 { "case", RID_CASE
, 0 },
442 { "catch", RID_CATCH
, 0 },
443 { "char", RID_CHAR
, 0 },
444 { "class", RID_CLASS
, 0 },
445 { "compl", RID_COMPL
, D_OPNAME
},
446 { "const", RID_CONST
, 0 },
447 { "const_cast", RID_CONSTCAST
, 0 },
448 { "continue", RID_CONTINUE
, 0 },
449 { "default", RID_DEFAULT
, 0 },
450 { "delete", RID_DELETE
, 0 },
452 { "double", RID_DOUBLE
, 0 },
453 { "dynamic_cast", RID_DYNCAST
, 0 },
454 { "else", RID_ELSE
, 0 },
455 { "enum", RID_ENUM
, 0 },
456 { "explicit", RID_EXPLICIT
, 0 },
457 { "export", RID_EXPORT
, 0 },
458 { "extern", RID_EXTERN
, 0 },
459 { "false", RID_FALSE
, 0 },
460 { "float", RID_FLOAT
, 0 },
461 { "for", RID_FOR
, 0 },
462 { "friend", RID_FRIEND
, 0 },
463 { "goto", RID_GOTO
, 0 },
465 { "inline", RID_INLINE
, 0 },
466 { "int", RID_INT
, 0 },
467 { "long", RID_LONG
, 0 },
468 { "mutable", RID_MUTABLE
, 0 },
469 { "namespace", RID_NAMESPACE
, 0 },
470 { "new", RID_NEW
, 0 },
471 { "not", RID_NOT
, D_OPNAME
},
472 { "not_eq", RID_NOT_EQ
, D_OPNAME
},
473 { "operator", RID_OPERATOR
, 0 },
474 { "or", RID_OR
, D_OPNAME
},
475 { "or_eq", RID_OR_EQ
, D_OPNAME
},
476 { "private", RID_PRIVATE
, 0 },
477 { "protected", RID_PROTECTED
, 0 },
478 { "public", RID_PUBLIC
, 0 },
479 { "register", RID_REGISTER
, 0 },
480 { "reinterpret_cast", RID_REINTCAST
, 0 },
481 { "return", RID_RETURN
, 0 },
482 { "short", RID_SHORT
, 0 },
483 { "signed", RID_SIGNED
, 0 },
484 { "sizeof", RID_SIZEOF
, 0 },
485 { "static", RID_STATIC
, 0 },
486 { "static_cast", RID_STATCAST
, 0 },
487 { "struct", RID_STRUCT
, 0 },
488 { "switch", RID_SWITCH
, 0 },
489 { "template", RID_TEMPLATE
, 0 },
490 { "this", RID_THIS
, 0 },
491 { "throw", RID_THROW
, 0 },
492 { "true", RID_TRUE
, 0 },
493 { "try", RID_TRY
, 0 },
494 { "typedef", RID_TYPEDEF
, 0 },
495 { "typename", RID_TYPENAME
, 0 },
496 { "typeid", RID_TYPEID
, 0 },
497 { "typeof", RID_TYPEOF
, D_ASM
|D_EXT
},
498 { "union", RID_UNION
, 0 },
499 { "unsigned", RID_UNSIGNED
, 0 },
500 { "using", RID_USING
, 0 },
501 { "virtual", RID_VIRTUAL
, 0 },
502 { "void", RID_VOID
, 0 },
503 { "volatile", RID_VOLATILE
, 0 },
504 { "wchar_t", RID_WCHAR
, 0 },
505 { "while", RID_WHILE
, 0 },
506 { "xor", RID_XOR
, D_OPNAME
},
507 { "xor_eq", RID_XOR_EQ
, D_OPNAME
},
510 #define N_reswords (sizeof reswords / sizeof (struct resword))
512 /* Table mapping from RID_* constants to yacc token numbers.
513 Unfortunately we have to have entries for all the keywords in all
515 const short rid_to_yy
[RID_MAX
] =
517 /* RID_STATIC */ SCSPEC
,
518 /* RID_UNSIGNED */ TYPESPEC
,
519 /* RID_LONG */ TYPESPEC
,
520 /* RID_CONST */ CV_QUALIFIER
,
521 /* RID_EXTERN */ SCSPEC
,
522 /* RID_REGISTER */ SCSPEC
,
523 /* RID_TYPEDEF */ SCSPEC
,
524 /* RID_SHORT */ TYPESPEC
,
525 /* RID_INLINE */ SCSPEC
,
526 /* RID_VOLATILE */ CV_QUALIFIER
,
527 /* RID_SIGNED */ TYPESPEC
,
528 /* RID_AUTO */ SCSPEC
,
529 /* RID_RESTRICT */ CV_QUALIFIER
,
531 /* C extensions. Bounded pointers are not yet in C++ */
533 /* RID_UNBOUNDED */ 0,
534 /* RID_COMPLEX */ TYPESPEC
,
537 /* RID_FRIEND */ SCSPEC
,
538 /* RID_VIRTUAL */ SCSPEC
,
539 /* RID_EXPLICIT */ SCSPEC
,
540 /* RID_EXPORT */ EXPORT
,
541 /* RID_MUTABLE */ SCSPEC
,
552 /* RID_INT */ TYPESPEC
,
553 /* RID_CHAR */ TYPESPEC
,
554 /* RID_FLOAT */ TYPESPEC
,
555 /* RID_DOUBLE */ TYPESPEC
,
556 /* RID_VOID */ TYPESPEC
,
558 /* RID_STRUCT */ AGGR
,
559 /* RID_UNION */ AGGR
,
562 /* RID_WHILE */ WHILE
,
565 /* RID_SWITCH */ SWITCH
,
567 /* RID_DEFAULT */ DEFAULT
,
568 /* RID_BREAK */ BREAK
,
569 /* RID_CONTINUE */ CONTINUE
,
570 /* RID_RETURN */ RETURN_KEYWORD
,
572 /* RID_SIZEOF */ SIZEOF
,
575 /* RID_ASM */ ASM_KEYWORD
,
576 /* RID_TYPEOF */ TYPEOF
,
577 /* RID_ALIGNOF */ ALIGNOF
,
578 /* RID_ATTRIBUTE */ ATTRIBUTE
,
579 /* RID_VA_ARG */ VA_ARG
,
580 /* RID_EXTENSION */ EXTENSION
,
581 /* RID_IMAGPART */ IMAGPART
,
582 /* RID_REALPART */ REALPART
,
583 /* RID_LABEL */ LABEL
,
585 /* RID_PTREXTENT */ 0,
586 /* RID_PTRVALUE */ 0,
589 /* RID_BOOL */ TYPESPEC
,
590 /* RID_WCHAR */ TYPESPEC
,
591 /* RID_CLASS */ AGGR
,
592 /* RID_PUBLIC */ VISSPEC
,
593 /* RID_PRIVATE */ VISSPEC
,
594 /* RID_PROTECTED */ VISSPEC
,
595 /* RID_TEMPLATE */ TEMPLATE
,
596 /* RID_NULL */ CONSTANT
,
597 /* RID_CATCH */ CATCH
,
598 /* RID_DELETE */ DELETE
,
599 /* RID_FALSE */ CXX_FALSE
,
600 /* RID_NAMESPACE */ NAMESPACE
,
602 /* RID_OPERATOR */ OPERATOR
,
604 /* RID_THROW */ THROW
,
605 /* RID_TRUE */ CXX_TRUE
,
607 /* RID_TYPENAME */ TYPENAME_KEYWORD
,
608 /* RID_TYPEID */ TYPEID
,
609 /* RID_USING */ USING
,
612 /* RID_CONSTCAST */ CONST_CAST
,
613 /* RID_DYNCAST */ DYNAMIC_CAST
,
614 /* RID_REINTCAST */ REINTERPRET_CAST
,
615 /* RID_STATCAST */ STATIC_CAST
,
617 /* alternate spellings */
618 /* RID_AND */ ANDAND
,
619 /* RID_AND_EQ */ ASSIGN
,
621 /* RID_NOT_EQ */ EQCOMPARE
,
623 /* RID_OR_EQ */ ASSIGN
,
625 /* RID_XOR_EQ */ ASSIGN
,
626 /* RID_BITAND */ '&',
632 /* RID_AT_ENCODE */ 0,
634 /* RID_AT_CLASS */ 0,
635 /* RID_AT_ALIAS */ 0,
637 /* RID_AT_PRIVATE */ 0,
638 /* RID_AT_PROTECTED */ 0,
639 /* RID_AT_PUBLIC */ 0,
640 /* RID_AT_PROTOCOL */ 0,
641 /* RID_AT_SELECTOR */ 0,
642 /* RID_AT_INTERFACE */ 0,
643 /* RID_AT_IMPLEMENTATION */ 0
651 int mask
= ((flag_operator_names
? 0 : D_OPNAME
)
652 | (flag_no_asm
? D_ASM
: 0)
653 | (flag_no_gnu_keywords
? D_EXT
: 0));
655 /* It is not necessary to register ridpointers as a GC root, because
656 all the trees it points to are permanently interned in the
657 get_identifier hash anyway. */
658 ridpointers
= (tree
*) xcalloc ((int) RID_MAX
, sizeof (tree
));
659 for (i
= 0; i
< N_reswords
; i
++)
661 id
= get_identifier (reswords
[i
].word
);
662 C_RID_CODE (id
) = reswords
[i
].rid
;
663 ridpointers
[(int) reswords
[i
].rid
] = id
;
664 if (! (reswords
[i
].disable
& mask
))
665 C_IS_RESERVED_WORD (id
) = 1;
672 cpp_register_pragma (parse_in
, 0, "vtable", handle_pragma_vtable
);
673 cpp_register_pragma (parse_in
, 0, "unit", handle_pragma_unit
);
675 cpp_register_pragma (parse_in
, 0, "interface", handle_pragma_interface
);
676 cpp_register_pragma (parse_in
, 0, "implementation",
677 handle_pragma_implementation
);
679 cpp_register_pragma_space (parse_in
, "GCC");
680 cpp_register_pragma (parse_in
, "GCC", "interface", handle_pragma_interface
);
681 cpp_register_pragma (parse_in
, "GCC", "implementation",
682 handle_pragma_implementation
);
686 init_parse (filename
)
687 const char *filename
;
689 /* Make identifier nodes long enough for the language-specific slots. */
690 set_identifier_size (sizeof (struct lang_identifier
));
691 decl_printable_name
= lang_printable_name
;
693 input_filename
= "<internal>";
700 init_cplus_expand ();
701 init_cp_semantics ();
705 memcpy (tree_code_type
+ (int) LAST_C_TREE_CODE
,
706 cplus_tree_code_type
,
707 (int)LAST_CPLUS_TREE_CODE
- (int)LAST_C_TREE_CODE
);
708 memcpy (tree_code_length
+ (int) LAST_C_TREE_CODE
,
709 cplus_tree_code_length
,
710 (LAST_CPLUS_TREE_CODE
- (int)LAST_C_TREE_CODE
) * sizeof (int));
711 memcpy (tree_code_name
+ (int) LAST_C_TREE_CODE
,
712 cplus_tree_code_name
,
713 (LAST_CPLUS_TREE_CODE
- (int)LAST_C_TREE_CODE
) * sizeof (char *));
719 current_function_decl
= NULL
;
721 class_type_node
= build_int_2 (class_type
, 0);
722 TREE_TYPE (class_type_node
) = class_type_node
;
723 ridpointers
[(int) RID_CLASS
] = class_type_node
;
725 record_type_node
= build_int_2 (record_type
, 0);
726 TREE_TYPE (record_type_node
) = record_type_node
;
727 ridpointers
[(int) RID_STRUCT
] = record_type_node
;
729 union_type_node
= build_int_2 (union_type
, 0);
730 TREE_TYPE (union_type_node
) = union_type_node
;
731 ridpointers
[(int) RID_UNION
] = union_type_node
;
733 enum_type_node
= build_int_2 (enum_type
, 0);
734 TREE_TYPE (enum_type_node
) = enum_type_node
;
735 ridpointers
[(int) RID_ENUM
] = enum_type_node
;
737 /* Create the built-in __null node. Note that we can't yet call for
738 type_for_size here because integer_type_node and so forth are not
739 set up. Therefore, we don't set the type of these nodes until
740 init_decl_processing. */
741 null_node
= build_int_2 (0, 0);
742 ridpointers
[RID_NULL
] = null_node
;
744 token_count
= init_cpp_parse ();
745 interface_unknown
= 1;
747 return init_c_lex (filename
);
753 cpp_finish (parse_in
);
754 /* Call to cpp_destroy () omitted for performance reasons. */
755 errorcount
+= cpp_errors (parse_in
);
759 yyprint (file
, yychar
, yylval
)
772 case IDENTIFIER_DEFN
:
776 case PRE_PARSED_CLASS_DECL
:
778 if (TREE_CODE (t
) == TYPE_DECL
|| TREE_CODE (t
) == TEMPLATE_DECL
)
780 fprintf (file
, " `%s'", IDENTIFIER_POINTER (DECL_NAME (t
)));
783 my_friendly_assert (TREE_CODE (t
) == IDENTIFIER_NODE
, 224);
784 if (IDENTIFIER_POINTER (t
))
785 fprintf (file
, " `%s'", IDENTIFIER_POINTER (t
));
789 if (yylval
.ttype
== class_type_node
)
790 fprintf (file
, " `class'");
791 else if (yylval
.ttype
== record_type_node
)
792 fprintf (file
, " `struct'");
793 else if (yylval
.ttype
== union_type_node
)
794 fprintf (file
, " `union'");
795 else if (yylval
.ttype
== enum_type_node
)
796 fprintf (file
, " `enum'");
798 my_friendly_abort (80);
803 if (TREE_CODE (t
) == INTEGER_CST
)
805 #if HOST_BITS_PER_WIDE_INT == 64
806 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
809 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG
816 #if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
822 TREE_INT_CST_HIGH (t
), TREE_INT_CST_LOW (t
));
827 #if defined(GATHER_STATISTICS) && defined(REDUCE_LENGTH)
828 static int *reduce_count
;
834 #define REDUCE_LENGTH (sizeof (yyr2) / sizeof (yyr2[0]))
835 #define TOKEN_LENGTH (256 + sizeof (yytname) / sizeof (yytname[0]))
838 #ifdef GATHER_STATISTICS
844 reduce_count
[yyn
] += 1;
851 return reduce_count
[*q
] - reduce_count
[*p
];
858 return token_count
[*q
] - token_count
[*p
];
864 print_parse_statistics ()
866 #ifdef GATHER_STATISTICS
870 int maxlen
= REDUCE_LENGTH
;
873 if (reduce_count
[-1] == 0)
876 if (TOKEN_LENGTH
> REDUCE_LENGTH
)
877 maxlen
= TOKEN_LENGTH
;
878 sorted
= (unsigned *) alloca (sizeof (int) * maxlen
);
880 for (i
= 0; i
< TOKEN_LENGTH
; i
++)
882 qsort (sorted
, TOKEN_LENGTH
, sizeof (int), token_cmp
);
883 for (i
= 0; i
< TOKEN_LENGTH
; i
++)
886 if (token_count
[idx
] == 0)
888 if (token_count
[idx
] < token_count
[-1])
890 fprintf (stderr
, "token %d, `%s', count = %d\n",
891 idx
, yytname
[YYTRANSLATE (idx
)], token_count
[idx
]);
893 fprintf (stderr
, "\n");
894 for (i
= 0; i
< REDUCE_LENGTH
; i
++)
896 qsort (sorted
, REDUCE_LENGTH
, sizeof (int), reduce_cmp
);
897 for (i
= 0; i
< REDUCE_LENGTH
; i
++)
900 if (reduce_count
[idx
] == 0)
902 if (reduce_count
[idx
] < reduce_count
[-1])
904 fprintf (stderr
, "rule %d, line %d, count = %d\n",
905 idx
, yyrline
[idx
], reduce_count
[idx
]);
907 fprintf (stderr
, "\n");
913 /* Sets the value of the 'yydebug' variable to VALUE.
914 This is a function so we don't have to have YYDEBUG defined
915 in order to build the compiler. */
925 warning ("YYDEBUG not defined.");
929 /* Helper function to load global variables with interface
933 extract_interface_info ()
935 struct c_fileinfo
*finfo
= 0;
937 if (flag_alt_external_templates
)
939 tree til
= tinst_for_decl ();
942 finfo
= get_fileinfo (TINST_FILE (til
));
945 finfo
= get_fileinfo (input_filename
);
947 interface_only
= finfo
->interface_only
;
948 interface_unknown
= finfo
->interface_unknown
;
950 /* This happens to be a convenient place to put this. */
951 if (flag_gnu_xref
) GNU_xref_file (input_filename
);
954 /* Return nonzero if S is not considered part of an
955 INTERFACE/IMPLEMENTATION pair. Otherwise, return 0. */
961 /* Set the interface/implementation bits for this scope. */
962 struct impl_files
*ifiles
;
965 for (ifiles
= impl_file_chain
; ifiles
; ifiles
= ifiles
->next
)
967 const char *t1
= ifiles
->filename
;
970 if (*s1
!= *t1
|| *s1
== 0)
973 while (*s1
== *t1
&& *s1
!= 0)
980 /* Don't get faked out by xxx.yyy.cc vs xxx.zzz.cc. */
981 if (strchr (s1
, '.') || strchr (t1
, '.'))
984 if (*s1
== '\0' || s1
[-1] != '.' || t1
[-1] != '.')
995 /* Heuristic to tell whether the user is missing a semicolon
996 after a struct or enum declaration. Emit an error message
997 if we know the user has blown it. */
1000 check_for_missing_semicolon (type
)
1008 && yychar
!= IDENTIFIER
1009 && yychar
!= TYPENAME
1010 && yychar
!= CV_QUALIFIER
1011 && yychar
!= SELFNAME
)
1012 || yychar
== 0 /* EOF */)
1014 if (TYPE_ANONYMOUS_P (type
))
1015 error ("semicolon missing after %s declaration",
1016 TREE_CODE (type
) == ENUMERAL_TYPE
? "enum" : "struct");
1018 cp_error ("semicolon missing after declaration of `%T'", type
);
1019 shadow_tag (build_tree_list (0, type
));
1021 /* Could probably also hack cases where class { ... } f (); appears. */
1026 note_got_semicolon (type
)
1030 my_friendly_abort (60);
1031 if (CLASS_TYPE_P (type
))
1032 CLASSTYPE_GOT_SEMICOLON (type
) = 1;
1036 note_list_got_semicolon (declspecs
)
1041 for (link
= declspecs
; link
; link
= TREE_CHAIN (link
))
1043 tree type
= TREE_VALUE (link
);
1045 note_got_semicolon (type
);
1051 /* Parse a #pragma whose sole argument is a string constant.
1052 If OPT is true, the argument is optional. */
1054 parse_strconst_pragma (name
, opt
)
1062 if (t
== CPP_STRING
)
1065 if (c_lex (&x
) != CPP_EOF
)
1066 warning ("junk at end of #pragma %s", name
);
1070 if (t
== CPP_EOF
&& opt
)
1073 error ("invalid #pragma %s", name
);
1078 handle_pragma_vtable (dfile
)
1079 cpp_reader
*dfile ATTRIBUTE_UNUSED
;
1081 tree vtbl
= parse_strconst_pragma ("vtable", 0);
1083 if (vtbl
&& vtbl
!= (tree
)-1)
1084 pending_vtables
= tree_cons (NULL_TREE
,
1085 get_identifier (TREE_STRING_POINTER (vtbl
)),
1090 handle_pragma_unit (dfile
)
1091 cpp_reader
*dfile ATTRIBUTE_UNUSED
;
1093 /* Validate syntax, but don't do anything. */
1094 parse_strconst_pragma ("unit", 0);
1098 handle_pragma_interface (dfile
)
1099 cpp_reader
*dfile ATTRIBUTE_UNUSED
;
1101 tree fname
= parse_strconst_pragma ("interface", 1);
1102 struct c_fileinfo
*finfo
;
1103 const char *main_filename
;
1105 if (fname
== (tree
)-1)
1107 else if (fname
== 0)
1108 main_filename
= file_name_nondirectory (input_filename
);
1110 main_filename
= TREE_STRING_POINTER (fname
);
1112 finfo
= get_fileinfo (input_filename
);
1114 if (impl_file_chain
== 0)
1116 /* If this is zero at this point, then we are
1117 auto-implementing. */
1118 if (main_input_filename
== 0)
1119 main_input_filename
= input_filename
;
1122 interface_only
= interface_strcmp (main_filename
);
1123 #ifdef MULTIPLE_SYMBOL_SPACES
1124 if (! interface_only
)
1126 interface_unknown
= 0;
1128 finfo
->interface_only
= interface_only
;
1129 finfo
->interface_unknown
= interface_unknown
;
1132 /* Note that we have seen a #pragma implementation for the key MAIN_FILENAME.
1133 We used to only allow this at toplevel, but that restriction was buggy
1134 in older compilers and it seems reasonable to allow it in the headers
1135 themselves, too. It only needs to precede the matching #p interface.
1137 We don't touch interface_only or interface_unknown; the user must specify
1138 a matching #p interface for this to have any effect. */
1141 handle_pragma_implementation (dfile
)
1142 cpp_reader
*dfile ATTRIBUTE_UNUSED
;
1144 tree fname
= parse_strconst_pragma ("implementation", 1);
1145 const char *main_filename
;
1146 struct impl_files
*ifiles
= impl_file_chain
;
1148 if (fname
== (tree
)-1)
1153 if (main_input_filename
)
1154 main_filename
= main_input_filename
;
1156 main_filename
= input_filename
;
1157 main_filename
= file_name_nondirectory (main_filename
);
1161 main_filename
= TREE_STRING_POINTER (fname
);
1162 if (cpp_included (parse_in
, main_filename
))
1163 warning ("#pragma implementation for %s appears after file is included",
1167 for (; ifiles
; ifiles
= ifiles
->next
)
1169 if (! strcmp (ifiles
->filename
, main_filename
))
1174 ifiles
= (struct impl_files
*) xmalloc (sizeof (struct impl_files
));
1175 ifiles
->filename
= main_filename
;
1176 ifiles
->next
= impl_file_chain
;
1177 impl_file_chain
= ifiles
;
1182 do_pending_lang_change ()
1184 for (; pending_lang_change
> 0; --pending_lang_change
)
1185 push_lang_context (lang_name_c
);
1186 for (; pending_lang_change
< 0; ++pending_lang_change
)
1187 pop_lang_context ();
1190 /* Return true if d is in a global scope. */
1197 switch (TREE_CODE (d
))
1202 case OVERLOAD
: d
= OVL_FUNCTION (d
); continue;
1203 case TREE_LIST
: d
= TREE_VALUE (d
); continue;
1205 my_friendly_assert (DECL_P (d
), 980629);
1207 return DECL_NAMESPACE_SCOPE_P (d
);
1212 do_identifier (token
, parsing
, args
)
1213 register tree token
;
1218 int lexing
= (parsing
== 1);
1221 id
= lookup_name (token
, 0);
1225 /* Do Koenig lookup if appropriate (inside templates we build lookup
1226 expressions instead).
1228 [basic.lookup.koenig]: If the ordinary unqualified lookup of the name
1229 finds the declaration of a class member function, the associated
1230 namespaces and classes are not considered. */
1232 if (args
&& !current_template_parms
&& (!id
|| is_global (id
)))
1233 id
= lookup_arg_dependent (token
, id
, args
);
1235 /* Remember that this name has been used in the class definition, as per
1238 maybe_note_name_used_in_class (token
, id
);
1240 if (id
== error_mark_node
)
1242 /* lookup_name quietly returns error_mark_node if we're parsing,
1243 as we don't want to complain about an identifier that ends up
1244 being used as a declarator. So we call it again to get the error
1246 id
= lookup_name (token
, 0);
1247 return error_mark_node
;
1250 if (!id
|| (TREE_CODE (id
) == FUNCTION_DECL
1251 && DECL_ANTICIPATED (id
)))
1253 if (current_template_parms
)
1254 return build_min_nt (LOOKUP_EXPR
, token
);
1255 else if (IDENTIFIER_OPNAME_P (token
))
1257 if (token
!= ansi_opname (ERROR_MARK
))
1258 cp_error ("`%D' not defined", token
);
1259 id
= error_mark_node
;
1261 else if (current_function_decl
== 0)
1263 cp_error ("`%D' was not declared in this scope", token
);
1264 id
= error_mark_node
;
1268 if (IDENTIFIER_NAMESPACE_VALUE (token
) != error_mark_node
1269 || IDENTIFIER_ERROR_LOCUS (token
) != current_function_decl
)
1271 static int undeclared_variable_notice
;
1273 cp_error ("`%D' undeclared (first use this function)", token
);
1275 if (! undeclared_variable_notice
)
1277 error ("(Each undeclared identifier is reported only once for each function it appears in.)");
1278 undeclared_variable_notice
= 1;
1281 id
= error_mark_node
;
1282 /* Prevent repeated error messages. */
1283 SET_IDENTIFIER_NAMESPACE_VALUE (token
, error_mark_node
);
1284 SET_IDENTIFIER_ERROR_LOCUS (token
, current_function_decl
);
1288 if (TREE_CODE (id
) == VAR_DECL
&& DECL_DEAD_FOR_LOCAL (id
))
1290 tree shadowed
= DECL_SHADOWED_FOR_VAR (id
);
1291 while (shadowed
!= NULL_TREE
&& TREE_CODE (shadowed
) == VAR_DECL
1292 && DECL_DEAD_FOR_LOCAL (shadowed
))
1293 shadowed
= DECL_SHADOWED_FOR_VAR (shadowed
);
1295 shadowed
= IDENTIFIER_NAMESPACE_VALUE (DECL_NAME (id
));
1298 if (!DECL_ERROR_REPORTED (id
))
1300 warning ("name lookup of `%s' changed",
1301 IDENTIFIER_POINTER (token
));
1302 cp_warning_at (" matches this `%D' under ISO standard rules",
1304 cp_warning_at (" matches this `%D' under old rules", id
);
1305 DECL_ERROR_REPORTED (id
) = 1;
1309 else if (!DECL_ERROR_REPORTED (id
))
1311 DECL_ERROR_REPORTED (id
) = 1;
1312 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (id
)))
1314 error ("name lookup of `%s' changed for new ISO `for' scoping",
1315 IDENTIFIER_POINTER (token
));
1316 cp_error_at (" cannot use obsolete binding at `%D' because it has a destructor", id
);
1317 id
= error_mark_node
;
1321 pedwarn ("name lookup of `%s' changed for new ISO `for' scoping",
1322 IDENTIFIER_POINTER (token
));
1323 cp_pedwarn_at (" using obsolete binding at `%D'", id
);
1327 /* TREE_USED is set in `hack_identifier'. */
1328 if (TREE_CODE (id
) == CONST_DECL
)
1331 if (IDENTIFIER_CLASS_VALUE (token
) == id
)
1332 enforce_access (CP_DECL_CONTEXT(id
), id
);
1333 if (!processing_template_decl
|| DECL_TEMPLATE_PARM_P (id
))
1334 id
= DECL_INITIAL (id
);
1337 id
= hack_identifier (id
, token
);
1339 /* We must look up dependent names when the template is
1340 instantiated, not while parsing it. For now, we don't
1341 distinguish between dependent and independent names. So, for
1342 example, we look up all overloaded functions at
1343 instantiation-time, even though in some cases we should just use
1344 the DECL we have here. We also use LOOKUP_EXPRs to find things
1345 like local variables, rather than creating TEMPLATE_DECLs for the
1346 local variables and then finding matching instantiations. */
1347 if (current_template_parms
1348 && (is_overloaded_fn (id
)
1349 || (TREE_CODE (id
) == VAR_DECL
1350 && CP_DECL_CONTEXT (id
)
1351 && TREE_CODE (CP_DECL_CONTEXT (id
)) == FUNCTION_DECL
)
1352 || TREE_CODE (id
) == PARM_DECL
1353 || TREE_CODE (id
) == RESULT_DECL
1354 || TREE_CODE (id
) == USING_DECL
))
1355 id
= build_min_nt (LOOKUP_EXPR
, token
);
1361 do_scoped_id (token
, parsing
)
1366 /* during parsing, this is ::name. Otherwise, it is black magic. */
1369 id
= make_node (CPLUS_BINDING
);
1370 if (!qualified_lookup_using_namespace (token
, global_namespace
, id
, 0))
1373 id
= BINDING_VALUE (id
);
1376 id
= IDENTIFIER_GLOBAL_VALUE (token
);
1377 if (parsing
&& yychar
== YYEMPTY
)
1381 if (processing_template_decl
)
1383 id
= build_min_nt (LOOKUP_EXPR
, token
);
1384 LOOKUP_EXPR_GLOBAL (id
) = 1;
1387 if (IDENTIFIER_NAMESPACE_VALUE (token
) != error_mark_node
)
1388 cp_error ("`::%D' undeclared (first use here)", token
);
1389 id
= error_mark_node
;
1390 /* Prevent repeated error messages. */
1391 SET_IDENTIFIER_NAMESPACE_VALUE (token
, error_mark_node
);
1395 if (TREE_CODE (id
) == ADDR_EXPR
)
1396 mark_used (TREE_OPERAND (id
, 0));
1397 else if (TREE_CODE (id
) != OVERLOAD
)
1400 if (TREE_CODE (id
) == CONST_DECL
&& ! processing_template_decl
)
1402 /* XXX CHS - should we set TREE_USED of the constant? */
1403 id
= DECL_INITIAL (id
);
1404 /* This is to prevent an enum whose value is 0
1405 from being considered a null pointer constant. */
1406 id
= build1 (NOP_EXPR
, TREE_TYPE (id
), id
);
1407 TREE_CONSTANT (id
) = 1;
1410 if (processing_template_decl
)
1412 if (is_overloaded_fn (id
))
1414 id
= build_min_nt (LOOKUP_EXPR
, token
);
1415 LOOKUP_EXPR_GLOBAL (id
) = 1;
1418 /* else just use the decl */
1420 return convert_from_reference (id
);
1424 identifier_typedecl_value (node
)
1428 type
= IDENTIFIER_TYPE_VALUE (node
);
1429 if (type
== NULL_TREE
)
1432 if (IDENTIFIER_BINDING (node
))
1434 t
= IDENTIFIER_VALUE (node
);
1435 if (t
&& TREE_CODE (t
) == TYPE_DECL
&& TREE_TYPE (t
) == type
)
1438 if (IDENTIFIER_NAMESPACE_VALUE (node
))
1440 t
= IDENTIFIER_NAMESPACE_VALUE (node
);
1441 if (t
&& TREE_CODE (t
) == TYPE_DECL
&& TREE_TYPE (t
) == type
)
1445 /* Will this one ever happen? */
1446 if (TYPE_MAIN_DECL (type
))
1447 return TYPE_MAIN_DECL (type
);
1449 /* We used to do an internal error of 62 here, but instead we will
1450 handle the return of a null appropriately in the callers. */
1454 #ifdef GATHER_STATISTICS
1455 /* The original for tree_node_kind is in the toplevel tree.c; changes there
1456 need to be brought into here, unless this were actually put into a header
1458 /* Statistics-gathering stuff. */
1479 extern int tree_node_counts
[];
1480 extern int tree_node_sizes
[];
1484 build_lang_decl (code
, name
, type
)
1485 enum tree_code code
;
1491 t
= build_decl (code
, name
, type
);
1492 retrofit_lang_decl (t
);
1497 /* Add DECL_LANG_SPECIFIC info to T. Called from build_lang_decl
1498 and pushdecl (for functions generated by the backend). */
1501 retrofit_lang_decl (t
)
1504 struct lang_decl
*ld
;
1507 if (CAN_HAVE_FULL_LANG_DECL_P (t
))
1508 size
= sizeof (struct lang_decl
);
1510 size
= sizeof (struct lang_decl_flags
);
1512 ld
= (struct lang_decl
*) ggc_alloc_cleared (size
);
1514 DECL_LANG_SPECIFIC (t
) = ld
;
1515 if (current_lang_name
== lang_name_cplusplus
)
1516 SET_DECL_LANGUAGE (t
, lang_cplusplus
);
1517 else if (current_lang_name
== lang_name_c
)
1518 SET_DECL_LANGUAGE (t
, lang_c
);
1519 else if (current_lang_name
== lang_name_java
)
1520 SET_DECL_LANGUAGE (t
, lang_java
);
1521 else my_friendly_abort (64);
1523 #ifdef GATHER_STATISTICS
1524 tree_node_counts
[(int)lang_decl
] += 1;
1525 tree_node_sizes
[(int)lang_decl
] += size
;
1530 copy_lang_decl (node
)
1534 struct lang_decl
*ld
;
1536 if (! DECL_LANG_SPECIFIC (node
))
1539 if (!CAN_HAVE_FULL_LANG_DECL_P (node
))
1540 size
= sizeof (struct lang_decl_flags
);
1542 size
= sizeof (struct lang_decl
);
1543 ld
= (struct lang_decl
*) ggc_alloc (size
);
1544 memcpy (ld
, DECL_LANG_SPECIFIC (node
), size
);
1545 DECL_LANG_SPECIFIC (node
) = ld
;
1548 /* Copy DECL, including any language-specific parts. */
1556 copy
= copy_node (decl
);
1557 copy_lang_decl (copy
);
1562 cp_make_lang_type (code
)
1563 enum tree_code code
;
1565 register tree t
= make_node (code
);
1567 /* Set up some flags that give proper default behavior. */
1568 if (IS_AGGR_TYPE_CODE (code
))
1570 struct lang_type
*pi
;
1572 pi
= ((struct lang_type
*)
1573 ggc_alloc_cleared (sizeof (struct lang_type
)));
1575 TYPE_LANG_SPECIFIC (t
) = pi
;
1576 SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t
, interface_unknown
);
1577 CLASSTYPE_INTERFACE_ONLY (t
) = interface_only
;
1579 /* Make sure this is laid out, for ease of use later. In the
1580 presence of parse errors, the normal was of assuring this
1581 might not ever get executed, so we lay it out *immediately*. */
1582 build_pointer_type (t
);
1584 #ifdef GATHER_STATISTICS
1585 tree_node_counts
[(int)lang_type
] += 1;
1586 tree_node_sizes
[(int)lang_type
] += sizeof (struct lang_type
);
1590 /* We use TYPE_ALIAS_SET for the CLASSTYPE_MARKED bits. But,
1591 TYPE_ALIAS_SET is initialized to -1 by default, so we must
1593 TYPE_ALIAS_SET (t
) = 0;
1595 /* We need to allocate a TYPE_BINFO even for TEMPLATE_TYPE_PARMs
1596 since they can be virtual base types, and we then need a
1597 canonical binfo for them. Ideally, this would be done lazily for
1599 if (IS_AGGR_TYPE_CODE (code
) || code
== TEMPLATE_TYPE_PARM
)
1600 TYPE_BINFO (t
) = make_binfo (size_zero_node
, t
, NULL_TREE
, NULL_TREE
);
1606 make_aggr_type (code
)
1607 enum tree_code code
;
1609 tree t
= cp_make_lang_type (code
);
1611 if (IS_AGGR_TYPE_CODE (code
))
1612 SET_IS_AGGR_TYPE (t
, 1);
1618 compiler_error
VPARAMS ((const char *msg
, ...))
1620 #ifndef ANSI_PROTOTYPES
1628 #ifndef ANSI_PROTOTYPES
1629 msg
= va_arg (ap
, const char *);
1632 vsprintf (buf
, msg
, ap
);
1634 error_with_file_and_line (input_filename
, lineno
, "%s (compiler error)", buf
);
1637 /* Return the type-qualifier corresponding to the identifier given by
1641 cp_type_qual_from_rid (rid
)
1644 if (rid
== ridpointers
[(int) RID_CONST
])
1645 return TYPE_QUAL_CONST
;
1646 else if (rid
== ridpointers
[(int) RID_VOLATILE
])
1647 return TYPE_QUAL_VOLATILE
;
1648 else if (rid
== ridpointers
[(int) RID_RESTRICT
])
1649 return TYPE_QUAL_RESTRICT
;
1651 my_friendly_abort (0);
1652 return TYPE_UNQUALIFIED
;