]> gcc.gnu.org Git - gcc.git/blob - gcc/cp/decl2.c
decl2.c (finish_objects): Don't use .?tors.* if we don't have ASM_OUTPUT_CONSTRUCTOR.
[gcc.git] / gcc / cp / decl2.c
1 /* Process declarations and variables for C compiler.
2 Copyright (C) 1988, 92-98, 1999 Free Software Foundation, Inc.
3 Hacked by Michael Tiemann (tiemann@cygnus.com)
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22
23 /* Process declarations and symbol lookup for C front end.
24 Also constructs types; the standard scalar types at initialization,
25 and structure, union, array and enum types when they are declared. */
26
27 /* ??? not all decl nodes are given the most useful possible
28 line numbers. For example, the CONST_DECLs for enum values. */
29
30 #include "config.h"
31 #include "system.h"
32 #include "tree.h"
33 #include "rtl.h"
34 #include "flags.h"
35 #include "cp-tree.h"
36 #include "decl.h"
37 #include "lex.h"
38 #include "output.h"
39 #include "except.h"
40 #include "expr.h"
41 #include "defaults.h"
42 #include "toplev.h"
43 #include "dwarf2out.h"
44 #include "dwarfout.h"
45 #include "splay-tree.h"
46 #include "varray.h"
47
48 #if USE_CPPLIB
49 #include "cpplib.h"
50 extern cpp_reader parse_in;
51 #endif
52
53 /* This structure contains information about the initializations
54 and/or destructions required for a particular priority level. */
55 typedef struct priority_info_s {
56 /* A label indicating where we should generate the next
57 initialization with this priority. */
58 rtx initialization_sequence;
59 /* A label indicating where we should generate the next destruction
60 with this priority. */
61 rtx destruction_sequence;
62 /* Non-zero if there have been any initializations at this priority
63 throughout the translation unit. */
64 int initializations_p;
65 /* Non-zero if there have been any destructions at this priority
66 throughout the translation unit. */
67 int destructions_p;
68 } *priority_info;
69
70 static tree get_sentry PROTO((tree));
71 static void mark_vtable_entries PROTO((tree));
72 static void grok_function_init PROTO((tree, tree));
73 static int finish_vtable_vardecl PROTO((tree *, void *));
74 static int prune_vtable_vardecl PROTO((tree *, void *));
75 static int finish_sigtable_vardecl PROTO((tree *, void *));
76 static int is_namespace_ancestor PROTO((tree, tree));
77 static void add_using_namespace PROTO((tree, tree, int));
78 static tree ambiguous_decl PROTO((tree, tree, tree,int));
79 static tree build_anon_union_vars PROTO((tree, tree*, int, int));
80 static int acceptable_java_type PROTO((tree));
81 static void output_vtable_inherit PROTO((tree));
82 static void start_objects PROTO((int, int));
83 static void finish_objects PROTO((int, int));
84 static tree merge_functions PROTO((tree, tree));
85 static tree decl_namespace PROTO((tree));
86 static tree validate_nonmember_using_decl PROTO((tree, tree *, tree *));
87 static void do_nonmember_using_decl PROTO((tree, tree, tree, tree,
88 tree *, tree *));
89 static void start_static_storage_duration_function PROTO((void));
90 static int generate_inits_for_priority PROTO((splay_tree_node, void *));
91 static void finish_static_storage_duration_function PROTO((void));
92 static priority_info get_priority_info PROTO((int));
93 static void do_static_initialization PROTO((tree, tree, tree, int));
94 static void do_static_destruction PROTO((tree, tree, int));
95 static void do_static_initialization_and_destruction PROTO((tree, tree));
96 static void generate_ctor_or_dtor_function PROTO((int, int));
97 static int generate_ctor_and_dtor_functions_for_priority
98 PROTO((splay_tree_node, void *));
99 extern int current_class_depth;
100
101 /* A list of virtual function tables we must make sure to write out. */
102 tree pending_vtables;
103
104 /* A list of static class variables. This is needed, because a
105 static class variable can be declared inside the class without
106 an initializer, and then initialized, staticly, outside the class. */
107 static varray_type pending_statics;
108 static size_t pending_statics_used;
109
110 /* A list of functions which were declared inline, but which we
111 may need to emit outline anyway. */
112 static varray_type saved_inlines;
113 static size_t saved_inlines_used;
114
115 /* Used to help generate temporary names which are unique within
116 a function. Reset to 0 by start_function. */
117
118 int temp_name_counter;
119
120 /* Same, but not reset. Local temp variables and global temp variables
121 can have the same name. */
122 static int global_temp_name_counter;
123
124 /* Flag used when debugging spew.c */
125
126 extern int spew_debug;
127
128 /* Nonzero if we're done parsing and into end-of-file activities. */
129
130 int at_eof;
131
132 /* Functions called along with real static constructors and destructors. */
133
134 tree static_ctors, static_dtors;
135
136 /* The current open namespace, and ::. */
137
138 tree current_namespace;
139 tree global_namespace;
140
141 /* The stack for namespaces of current declarations. */
142
143 static tree decl_namespace_list;
144
145 \f
146 /* C (and C++) language-specific option variables. */
147
148 /* Nonzero means allow type mismatches in conditional expressions;
149 just make their values `void'. */
150
151 int flag_cond_mismatch;
152
153 /* Nonzero means give `double' the same size as `float'. */
154
155 int flag_short_double;
156
157 /* Nonzero means don't recognize the keyword `asm'. */
158
159 int flag_no_asm;
160
161 /* Nonzero means don't recognize any extension keywords. */
162
163 int flag_no_gnu_keywords;
164
165 /* Nonzero means don't recognize the non-ANSI builtin functions. */
166
167 int flag_no_builtin;
168
169 /* Nonzero means don't recognize the non-ANSI builtin functions.
170 -ansi sets this. */
171
172 int flag_no_nonansi_builtin;
173
174 /* Nonzero means do some things the same way PCC does. Only provided so
175 the compiler will link. */
176
177 int flag_traditional;
178
179 /* Nonzero means to treat bitfields as unsigned unless they say `signed'. */
180
181 int flag_signed_bitfields = 1;
182
183 /* Nonzero means enable obscure ANSI features and disable GNU extensions
184 that might cause ANSI-compliant code to be miscompiled. */
185
186 int flag_ansi;
187
188 /* Nonzero means do emit exported implementations of functions even if
189 they can be inlined. */
190
191 int flag_implement_inlines = 1;
192
193 /* Nonzero means do emit exported implementations of templates, instead of
194 multiple static copies in each file that needs a definition. */
195
196 int flag_external_templates;
197
198 /* Nonzero means that the decision to emit or not emit the implementation of a
199 template depends on where the template is instantiated, rather than where
200 it is defined. */
201
202 int flag_alt_external_templates;
203
204 /* Nonzero means that implicit instantiations will be emitted if needed. */
205
206 int flag_implicit_templates = 1;
207
208 /* Nonzero means that implicit instantiations of inline templates will be
209 emitted if needed, even if instantiations of non-inline templates
210 aren't. */
211
212 int flag_implicit_inline_templates = 1;
213
214 /* Nonzero means warn about implicit declarations. */
215
216 int warn_implicit = 1;
217
218 /* Nonzero means warn about usage of long long when `-pedantic'. */
219
220 int warn_long_long = 1;
221
222 /* Nonzero means warn when all ctors or dtors are private, and the class
223 has no friends. */
224
225 int warn_ctor_dtor_privacy = 1;
226
227 /* True if we want to implement vtables using "thunks".
228 The default is off. */
229
230 #ifndef DEFAULT_VTABLE_THUNKS
231 #define DEFAULT_VTABLE_THUNKS 0
232 #endif
233 int flag_vtable_thunks = DEFAULT_VTABLE_THUNKS;
234
235 /* True if we want to deal with repository information. */
236
237 int flag_use_repository;
238
239 /* Nonzero if we want to issue diagnostics that the standard says are not
240 required. */
241
242 int flag_optional_diags = 1;
243
244 /* Nonzero means give string constants the type `const char *', as mandated
245 by the standard. */
246
247 int flag_const_strings = 1;
248
249 /* Nonzero means warn about deprecated conversion from string constant to
250 `char *'. */
251
252 int warn_write_strings;
253
254 /* Nonzero means warn about pointer casts that can drop a type qualifier
255 from the pointer target type. */
256
257 int warn_cast_qual;
258
259 /* Nonzero means warn about sizeof(function) or addition/subtraction
260 of function pointers. */
261
262 int warn_pointer_arith = 1;
263
264 /* Nonzero means warn for any function def without prototype decl. */
265
266 int warn_missing_prototypes;
267
268 /* Nonzero means warn about multiple (redundant) decls for the same single
269 variable or function. */
270
271 int warn_redundant_decls;
272
273 /* Warn if initializer is not completely bracketed. */
274
275 int warn_missing_braces;
276
277 /* Warn about comparison of signed and unsigned values. */
278
279 int warn_sign_compare;
280
281 /* Warn about *printf or *scanf format/argument anomalies. */
282
283 int warn_format;
284
285 /* Warn about a subscript that has type char. */
286
287 int warn_char_subscripts;
288
289 /* Warn if a type conversion is done that might have confusing results. */
290
291 int warn_conversion;
292
293 /* Warn if adding () is suggested. */
294
295 int warn_parentheses;
296
297 /* Non-zero means warn in function declared in derived class has the
298 same name as a virtual in the base class, but fails to match the
299 type signature of any virtual function in the base class. */
300 int warn_overloaded_virtual;
301
302 /* Non-zero means warn when declaring a class that has a non virtual
303 destructor, when it really ought to have a virtual one. */
304 int warn_nonvdtor;
305
306 /* Non-zero means warn when a function is declared extern and later inline. */
307 int warn_extern_inline;
308
309 /* Non-zero means warn when the compiler will reorder code. */
310 int warn_reorder;
311
312 /* Non-zero means warn when synthesis behavior differs from Cfront's. */
313 int warn_synth;
314
315 /* Non-zero means warn when we convert a pointer to member function
316 into a pointer to (void or function). */
317 int warn_pmf2ptr = 1;
318
319 /* Nonzero means warn about violation of some Effective C++ style rules. */
320
321 int warn_ecpp;
322
323 /* Nonzero means warn where overload resolution chooses a promotion from
324 unsigned to signed over a conversion to an unsigned of the same size. */
325
326 int warn_sign_promo;
327
328 /* Nonzero means warn when an old-style cast is used. */
329
330 int warn_old_style_cast;
331
332 /* Warn about #pragma directives that are not recognised. */
333
334 int warn_unknown_pragmas; /* Tri state variable. */
335
336 /* Nonzero means warn about use of multicharacter literals. */
337
338 int warn_multichar = 1;
339
340 /* Nonzero means warn when non-templatized friend functions are
341 declared within a template */
342
343 int warn_nontemplate_friend = 1;
344
345 /* Nonzero means complain about deprecated features. */
346
347 int warn_deprecated = 1;
348
349 /* Nonzero means `$' can be in an identifier. */
350
351 #ifndef DOLLARS_IN_IDENTIFIERS
352 #define DOLLARS_IN_IDENTIFIERS 1
353 #endif
354 int dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
355
356 /* Nonzero for -fno-strict-prototype switch: do not consider empty
357 argument prototype to mean function takes no arguments. */
358
359 int flag_strict_prototype = 2;
360 int strict_prototype = 1;
361 int strict_prototypes_lang_c, strict_prototypes_lang_cplusplus = 1;
362
363 /* Nonzero means that labels can be used as first-class objects */
364
365 int flag_labels_ok;
366
367 /* Non-zero means to collect statistics which might be expensive
368 and to print them when we are done. */
369 int flag_detailed_statistics;
370
371 /* C++ specific flags. */
372 /* Zero means that `this' is a *const. This gives nice behavior in the
373 2.0 world. 1 gives 1.2-compatible behavior. 2 gives Spring behavior.
374 -2 means we're constructing an object and it has fixed type. */
375
376 int flag_this_is_variable;
377
378 /* 3 means write out only virtuals function tables `defined'
379 in this implementation file.
380 0 means write out virtual function tables and give them
381 (C) static access (default). */
382
383 int write_virtuals;
384
385 /* Nonzero means we should attempt to elide constructors when possible. */
386
387 int flag_elide_constructors = 1;
388
389 /* Nonzero means recognize and handle signature language constructs. */
390
391 int flag_handle_signatures;
392
393 /* Nonzero means that member functions defined in class scope are
394 inline by default. */
395
396 int flag_default_inline = 1;
397
398 /* Controls whether compiler generates 'type descriptor' that give
399 run-time type information. */
400 int flag_rtti = 1;
401
402 /* Nonzero if we wish to output cross-referencing information
403 for the GNU class browser. */
404 extern int flag_gnu_xref;
405
406 /* Nonzero if we want to support huge (> 2^(sizeof(short)*8-1) bytes)
407 objects. */
408
409 int flag_huge_objects;
410
411 /* Nonzero if we want to conserve space in the .o files. We do this
412 by putting uninitialized data and runtime initialized data into
413 .common instead of .data at the expense of not flagging multiple
414 definitions. */
415
416 int flag_conserve_space;
417
418 /* Nonzero if we want to obey access control semantics. */
419
420 int flag_access_control = 1;
421
422 /* Nonzero if we want to understand the operator names, i.e. 'bitand'. */
423
424 int flag_operator_names;
425
426 /* Nonzero if we want to check the return value of new and avoid calling
427 constructors if it is a null pointer. */
428
429 int flag_check_new;
430
431 /* Nonzero if we want the new ANSI rules for pushing a new scope for `for'
432 initialization variables.
433 0: Old rules, set by -fno-for-scope.
434 2: New ANSI rules, set by -ffor-scope.
435 1: Try to implement new ANSI rules, but with backup compatibility
436 (and warnings). This is the default, for now. */
437
438 int flag_new_for_scope = 1;
439
440 /* Nonzero if we want to emit defined symbols with common-like linkage as
441 weak symbols where possible, in order to conform to C++ semantics.
442 Otherwise, emit them as local symbols. */
443
444 int flag_weak = 1;
445
446 /* Nonzero to enable experimental ABI changes. */
447
448 int flag_new_abi;
449
450 /* Nonzero to not ignore namespace std. */
451
452 int flag_honor_std;
453
454 /* Maximum template instantiation depth. Must be at least 17 for ANSI
455 compliance. */
456
457 int max_tinst_depth = 17;
458
459 /* The name-mangling scheme to use. Must be 1 or greater to support
460 template functions with identical types, but different template
461 arguments. */
462 int name_mangling_version = 2;
463
464 /* Nonzero means that guiding declarations are allowed. */
465 int flag_guiding_decls;
466
467 /* Nonzero if squashed mangling is to be performed.
468 This uses the B and K codes to reference previously seen class types
469 and class qualifiers. */
470 int flag_do_squangling;
471
472 /* Nonzero means output .vtable_{entry,inherit} for use in doing vtable gc. */
473
474 int flag_vtable_gc;
475
476 /* Nonzero means make the default pedwarns warnings instead of errors.
477 The value of this flag is ignored if -pedantic is specified. */
478
479 int flag_permissive;
480
481 /* Table of language-dependent -f options.
482 STRING is the option name. VARIABLE is the address of the variable.
483 ON_VALUE is the value to store in VARIABLE
484 if `-fSTRING' is seen as an option.
485 (If `-fno-STRING' is seen as an option, the opposite value is stored.) */
486
487 static struct { const char *string; int *variable; int on_value;}
488 lang_f_options[] =
489 {
490 /* C/C++ options. */
491 {"signed-char", &flag_signed_char, 1},
492 {"unsigned-char", &flag_signed_char, 0},
493 {"signed-bitfields", &flag_signed_bitfields, 1},
494 {"unsigned-bitfields", &flag_signed_bitfields, 0},
495 {"short-enums", &flag_short_enums, 1},
496 {"short-double", &flag_short_double, 1},
497 {"cond-mismatch", &flag_cond_mismatch, 1},
498 {"asm", &flag_no_asm, 0},
499 {"builtin", &flag_no_builtin, 0},
500
501 /* C++-only options. */
502 {"access-control", &flag_access_control, 1},
503 {"check-new", &flag_check_new, 1},
504 {"conserve-space", &flag_conserve_space, 1},
505 {"const-strings", &flag_const_strings, 1},
506 {"default-inline", &flag_default_inline, 1},
507 {"dollars-in-identifiers", &dollars_in_ident, 1},
508 {"elide-constructors", &flag_elide_constructors, 1},
509 {"external-templates", &flag_external_templates, 1},
510 {"for-scope", &flag_new_for_scope, 2},
511 {"gnu-keywords", &flag_no_gnu_keywords, 0},
512 {"handle-exceptions", &flag_exceptions, 1},
513 {"handle-signatures", &flag_handle_signatures, 1},
514 {"honor-std", &flag_honor_std, 1},
515 {"huge-objects", &flag_huge_objects, 1},
516 {"implement-inlines", &flag_implement_inlines, 1},
517 {"implicit-inline-templates", &flag_implicit_inline_templates, 1},
518 {"implicit-templates", &flag_implicit_templates, 1},
519 {"labels-ok", &flag_labels_ok, 1},
520 {"nonansi-builtins", &flag_no_nonansi_builtin, 0},
521 {"operator-names", &flag_operator_names, 1},
522 {"optional-diags", &flag_optional_diags, 1},
523 {"permissive", &flag_permissive, 1},
524 {"repo", &flag_use_repository, 1},
525 {"rtti", &flag_rtti, 1},
526 {"squangle", &flag_do_squangling, 1},
527 {"stats", &flag_detailed_statistics, 1},
528 {"strict-prototype", &flag_strict_prototype, 1},
529 {"this-is-variable", &flag_this_is_variable, 1},
530 {"vtable-gc", &flag_vtable_gc, 1},
531 {"vtable-thunks", &flag_vtable_thunks, 1},
532 {"weak", &flag_weak, 1},
533 {"xref", &flag_gnu_xref, 1}
534 };
535
536 /* Decode the string P as a language-specific option.
537 Return the number of strings consumed for a valid option.
538 Otherwise return 0. */
539
540 int
541 lang_decode_option (argc, argv)
542 int argc
543 #if !USE_CPPLIB
544 ATTRIBUTE_UNUSED
545 #endif
546 ;
547 char **argv;
548
549 {
550 int strings_processed;
551 char *p = argv[0];
552 #if USE_CPPLIB
553 strings_processed = cpp_handle_option (&parse_in, argc, argv);
554 #else
555 strings_processed = 0;
556 #endif /* ! USE_CPPLIB */
557
558 if (!strcmp (p, "-ftraditional") || !strcmp (p, "-traditional"))
559 /* ignore */;
560 else if (p[0] == '-' && p[1] == 'f')
561 {
562 /* Some kind of -f option.
563 P's value is the option sans `-f'.
564 Search for it in the table of options. */
565 int found = 0;
566 size_t j;
567
568 p += 2;
569 /* Try special -f options. */
570
571 if (!strcmp (p, "handle-exceptions")
572 || !strcmp (p, "no-handle-exceptions"))
573 warning ("-fhandle-exceptions has been renamed to -fexceptions (and is now on by default)");
574
575 if (!strcmp (p, "memoize-lookups")
576 || !strcmp (p, "no-memoize-lookups")
577 || !strcmp (p, "save-memoized")
578 || !strcmp (p, "no-save-memoized")
579 || !strcmp (p, "no-all-virtual")
580 || !strcmp (p, "no-enum-int-equiv")
581 || !strcmp (p, "nonnull-objects")
582 || !strcmp (p, "ansi-overloading"))
583 {
584 /* ignore */
585 found = 1;
586 }
587 else if (!strcmp (p, "all-virtual")
588 || !strcmp (p, "enum-int-equiv")
589 || !strcmp (p, "no-nonnull-objects")
590 || !strcmp (p, "no-ansi-overloading"))
591 {
592 warning ("-f%s is no longer supported", p);
593 found = 1;
594 }
595 else if (! strcmp (p, "alt-external-templates"))
596 {
597 flag_external_templates = 1;
598 flag_alt_external_templates = 1;
599 found = 1;
600 cp_deprecated ("-falt-external-templates");
601 }
602 else if (! strcmp (p, "no-alt-external-templates"))
603 {
604 flag_alt_external_templates = 0;
605 found = 1;
606 }
607 else if (!strcmp (p, "repo"))
608 {
609 flag_use_repository = 1;
610 flag_implicit_templates = 0;
611 found = 1;
612 }
613 else if (!strcmp (p, "guiding-decls"))
614 {
615 flag_guiding_decls = 1;
616 name_mangling_version = 0;
617 found = 1;
618 }
619 else if (!strcmp (p, "no-guiding-decls"))
620 {
621 flag_guiding_decls = 0;
622 found = 1;
623 }
624 else if (!strcmp (p, "this-is-variable"))
625 {
626 flag_this_is_variable = 1;
627 found = 1;
628 cp_deprecated ("-fthis-is-variable");
629 }
630 else if (!strcmp (p, "external-templates"))
631 {
632 flag_external_templates = 1;
633 found = 1;
634 cp_deprecated ("-fexternal-templates");
635 }
636 else if (!strcmp (p, "new-abi"))
637 {
638 flag_new_abi = 1;
639 flag_do_squangling = 1;
640 flag_honor_std = 1;
641 flag_vtable_thunks = 1;
642 }
643 else if (!strcmp (p, "no-new-abi"))
644 {
645 flag_new_abi = 0;
646 flag_do_squangling = 0;
647 flag_honor_std = 0;
648 }
649 else if (!strncmp (p, "template-depth-", 15))
650 {
651 max_tinst_depth =
652 read_integral_parameter (p + 15, p - 2, max_tinst_depth);
653 }
654 else if (!strncmp (p, "name-mangling-version-", 22))
655 {
656 name_mangling_version =
657 read_integral_parameter (p + 22, p - 2, name_mangling_version);
658 }
659 else for (j = 0;
660 !found && j < sizeof (lang_f_options) / sizeof (lang_f_options[0]);
661 j++)
662 {
663 if (!strcmp (p, lang_f_options[j].string))
664 {
665 *lang_f_options[j].variable = lang_f_options[j].on_value;
666 /* A goto here would be cleaner,
667 but breaks the vax pcc. */
668 found = 1;
669 }
670 if (p[0] == 'n' && p[1] == 'o' && p[2] == '-'
671 && ! strcmp (p+3, lang_f_options[j].string))
672 {
673 *lang_f_options[j].variable = ! lang_f_options[j].on_value;
674 found = 1;
675 }
676 }
677 return found;
678 }
679 else if (p[0] == '-' && p[1] == 'W')
680 {
681 int setting = 1;
682
683 /* The -W options control the warning behavior of the compiler. */
684 p += 2;
685
686 if (p[0] == 'n' && p[1] == 'o' && p[2] == '-')
687 setting = 0, p += 3;
688
689 if (!strcmp (p, "implicit"))
690 warn_implicit = setting;
691 else if (!strcmp (p, "long-long"))
692 warn_long_long = setting;
693 else if (!strcmp (p, "return-type"))
694 warn_return_type = setting;
695 else if (!strcmp (p, "ctor-dtor-privacy"))
696 warn_ctor_dtor_privacy = setting;
697 else if (!strcmp (p, "write-strings"))
698 warn_write_strings = setting;
699 else if (!strcmp (p, "cast-qual"))
700 warn_cast_qual = setting;
701 else if (!strcmp (p, "char-subscripts"))
702 warn_char_subscripts = setting;
703 else if (!strcmp (p, "pointer-arith"))
704 warn_pointer_arith = setting;
705 else if (!strcmp (p, "missing-prototypes"))
706 warn_missing_prototypes = setting;
707 else if (!strcmp (p, "redundant-decls"))
708 warn_redundant_decls = setting;
709 else if (!strcmp (p, "missing-braces"))
710 warn_missing_braces = setting;
711 else if (!strcmp (p, "sign-compare"))
712 warn_sign_compare = setting;
713 else if (!strcmp (p, "format"))
714 warn_format = setting;
715 else if (!strcmp (p, "conversion"))
716 warn_conversion = setting;
717 else if (!strcmp (p, "parentheses"))
718 warn_parentheses = setting;
719 else if (!strcmp (p, "non-virtual-dtor"))
720 warn_nonvdtor = setting;
721 else if (!strcmp (p, "extern-inline"))
722 warn_extern_inline = setting;
723 else if (!strcmp (p, "reorder"))
724 warn_reorder = setting;
725 else if (!strcmp (p, "synth"))
726 warn_synth = setting;
727 else if (!strcmp (p, "pmf-conversions"))
728 warn_pmf2ptr = setting;
729 else if (!strcmp (p, "effc++"))
730 warn_ecpp = setting;
731 else if (!strcmp (p, "sign-promo"))
732 warn_sign_promo = setting;
733 else if (!strcmp (p, "old-style-cast"))
734 warn_old_style_cast = setting;
735 else if (!strcmp (p, "overloaded-virtual"))
736 warn_overloaded_virtual = setting;
737 else if (!strcmp (p, "multichar"))
738 warn_multichar = setting;
739 else if (!strcmp (p, "unknown-pragmas"))
740 /* Set to greater than 1, so that even unknown pragmas in
741 system headers will be warned about. */
742 warn_unknown_pragmas = setting * 2;
743 else if (!strcmp (p, "non-template-friend"))
744 warn_nontemplate_friend = setting;
745 else if (!strcmp (p, "deprecated"))
746 warn_deprecated = setting;
747 else if (!strcmp (p, "comment"))
748 ; /* cpp handles this one. */
749 else if (!strcmp (p, "comments"))
750 ; /* cpp handles this one. */
751 else if (!strcmp (p, "trigraphs"))
752 ; /* cpp handles this one. */
753 else if (!strcmp (p, "import"))
754 ; /* cpp handles this one. */
755 else if (!strcmp (p, "all"))
756 {
757 warn_return_type = setting;
758 warn_unused = setting;
759 warn_implicit = setting;
760 warn_switch = setting;
761 warn_format = setting;
762 warn_parentheses = setting;
763 warn_missing_braces = setting;
764 warn_sign_compare = setting;
765 warn_multichar = setting;
766 /* We save the value of warn_uninitialized, since if they put
767 -Wuninitialized on the command line, we need to generate a
768 warning about not using it without also specifying -O. */
769 if (warn_uninitialized != 1)
770 warn_uninitialized = (setting ? 2 : 0);
771 /* Only warn about unknown pragmas that are not in system
772 headers. */
773 warn_unknown_pragmas = 1;
774
775 /* C++-specific warnings. */
776 warn_ctor_dtor_privacy = setting;
777 warn_nonvdtor = setting;
778 warn_reorder = setting;
779 warn_nontemplate_friend = setting;
780 }
781 else return strings_processed;
782 }
783 else if (!strcmp (p, "-ansi"))
784 flag_no_nonansi_builtin = 1, flag_ansi = 1,
785 flag_no_gnu_keywords = 1, flag_operator_names = 1;
786 #ifdef SPEW_DEBUG
787 /* Undocumented, only ever used when you're invoking cc1plus by hand, since
788 it's probably safe to assume no sane person would ever want to use this
789 under normal circumstances. */
790 else if (!strcmp (p, "-spew-debug"))
791 spew_debug = 1;
792 #endif
793 else
794 return strings_processed;
795
796 return 1;
797 }
798 \f
799 /* Incorporate `const' and `volatile' qualifiers for member functions.
800 FUNCTION is a TYPE_DECL or a FUNCTION_DECL.
801 QUALS is a list of qualifiers. */
802
803 tree
804 grok_method_quals (ctype, function, quals)
805 tree ctype, function, quals;
806 {
807 tree fntype = TREE_TYPE (function);
808 tree raises = TYPE_RAISES_EXCEPTIONS (fntype);
809 int type_quals = TYPE_UNQUALIFIED;
810 int dup_quals = TYPE_UNQUALIFIED;
811
812 do
813 {
814 int tq = cp_type_qual_from_rid (TREE_VALUE (quals));
815
816 if (type_quals & tq)
817 dup_quals |= tq;
818 else
819 type_quals |= tq;
820 quals = TREE_CHAIN (quals);
821 }
822 while (quals);
823
824 if (dup_quals != TYPE_UNQUALIFIED)
825 cp_error ("duplicate type qualifiers in %s declaration",
826 TREE_CODE (function) == FUNCTION_DECL
827 ? "member function" : "type");
828
829 ctype = cp_build_qualified_type (ctype, type_quals);
830 fntype = build_cplus_method_type (ctype, TREE_TYPE (fntype),
831 (TREE_CODE (fntype) == METHOD_TYPE
832 ? TREE_CHAIN (TYPE_ARG_TYPES (fntype))
833 : TYPE_ARG_TYPES (fntype)));
834 if (raises)
835 fntype = build_exception_variant (fntype, raises);
836
837 TREE_TYPE (function) = fntype;
838 return ctype;
839 }
840
841 /* Warn when -fexternal-templates is used and #pragma
842 interface/implementation is not used all the times it should be,
843 inform the user. */
844
845 void
846 warn_if_unknown_interface (decl)
847 tree decl;
848 {
849 static int already_warned = 0;
850 if (already_warned++)
851 return;
852
853 if (flag_alt_external_templates)
854 {
855 struct tinst_level *til = tinst_for_decl ();
856 int sl = lineno;
857 char *sf = input_filename;
858
859 if (til)
860 {
861 lineno = til->line;
862 input_filename = til->file;
863 }
864 cp_warning ("template `%#D' instantiated in file without #pragma interface",
865 decl);
866 lineno = sl;
867 input_filename = sf;
868 }
869 else
870 cp_warning_at ("template `%#D' defined in file without #pragma interface",
871 decl);
872 }
873
874 /* A subroutine of the parser, to handle a component list. */
875
876 void
877 grok_x_components (specs)
878 tree specs;
879 {
880 struct pending_inline **p;
881 tree t;
882
883 specs = strip_attrs (specs);
884
885 check_tag_decl (specs);
886 t = groktypename (build_decl_list (specs, NULL_TREE));
887
888 /* The only case where we need to do anything additional here is an
889 anonymous union field, e.g.: `struct S { union { int i; }; };'. */
890 if (t == NULL_TREE || !ANON_UNION_TYPE_P (t))
891 return;
892
893 fixup_anonymous_union (t);
894 finish_member_declaration (build_lang_field_decl (FIELD_DECL,
895 NULL_TREE,
896 t));
897
898 /* Ignore any inline function definitions in the anonymous union
899 since an anonymous union may not have function members. */
900 p = &pending_inlines;
901 for (; *p; *p = (*p)->next)
902 if (DECL_CONTEXT ((*p)->fndecl) != t)
903 break;
904 }
905
906 /* Constructors for types with virtual baseclasses need an "in-charge" flag
907 saying whether this constructor is responsible for initialization of
908 virtual baseclasses or not. All destructors also need this "in-charge"
909 flag, which additionally determines whether or not the destructor should
910 free the memory for the object.
911
912 This function adds the "in-charge" flag to member function FN if
913 appropriate. It is called from grokclassfn and tsubst.
914 FN must be either a constructor or destructor. */
915
916 void
917 maybe_retrofit_in_chrg (fn)
918 tree fn;
919 {
920 tree basetype, arg_types, parms, parm, fntype;
921
922 if (DECL_CONSTRUCTOR_P (fn)
923 && TYPE_USES_VIRTUAL_BASECLASSES (DECL_CLASS_CONTEXT (fn))
924 && ! DECL_CONSTRUCTOR_FOR_VBASE_P (fn))
925 /* OK */;
926 else if (! DECL_CONSTRUCTOR_P (fn)
927 && TREE_CHAIN (DECL_ARGUMENTS (fn)) == NULL_TREE)
928 /* OK */;
929 else
930 return;
931
932 if (DECL_CONSTRUCTOR_P (fn))
933 DECL_CONSTRUCTOR_FOR_VBASE_P (fn) = 1;
934
935 /* First add it to DECL_ARGUMENTS... */
936 parm = build_decl (PARM_DECL, in_charge_identifier, integer_type_node);
937 /* Mark the artificial `__in_chrg' parameter as "artificial". */
938 SET_DECL_ARTIFICIAL (parm);
939 DECL_ARG_TYPE (parm) = integer_type_node;
940 TREE_READONLY (parm) = 1;
941 parms = DECL_ARGUMENTS (fn);
942 TREE_CHAIN (parm) = TREE_CHAIN (parms);
943 TREE_CHAIN (parms) = parm;
944
945 /* ...and then to TYPE_ARG_TYPES. */
946 arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn));
947 basetype = TREE_TYPE (TREE_VALUE (arg_types));
948 arg_types = hash_tree_chain (integer_type_node, TREE_CHAIN (arg_types));
949 fntype = build_cplus_method_type (basetype, TREE_TYPE (TREE_TYPE (fn)),
950 arg_types);
951 if (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn)))
952 fntype = build_exception_variant (fntype,
953 TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn)));
954 TREE_TYPE (fn) = fntype;
955 }
956
957 /* Classes overload their constituent function names automatically.
958 When a function name is declared in a record structure,
959 its name is changed to it overloaded name. Since names for
960 constructors and destructors can conflict, we place a leading
961 '$' for destructors.
962
963 CNAME is the name of the class we are grokking for.
964
965 FUNCTION is a FUNCTION_DECL. It was created by `grokdeclarator'.
966
967 FLAGS contains bits saying what's special about today's
968 arguments. 1 == DESTRUCTOR. 2 == OPERATOR.
969
970 If FUNCTION is a destructor, then we must add the `auto-delete' field
971 as a second parameter. There is some hair associated with the fact
972 that we must "declare" this variable in the manner consistent with the
973 way the rest of the arguments were declared.
974
975 QUALS are the qualifiers for the this pointer. */
976
977 void
978 grokclassfn (ctype, function, flags, quals)
979 tree ctype, function;
980 enum overload_flags flags;
981 tree quals;
982 {
983 tree fn_name = DECL_NAME (function);
984 tree arg_types;
985 tree parm;
986 tree qualtype;
987
988 if (fn_name == NULL_TREE)
989 {
990 error ("name missing for member function");
991 fn_name = get_identifier ("<anonymous>");
992 DECL_NAME (function) = fn_name;
993 }
994
995 if (quals)
996 qualtype = grok_method_quals (ctype, function, quals);
997 else
998 qualtype = ctype;
999
1000 arg_types = TYPE_ARG_TYPES (TREE_TYPE (function));
1001 if (TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE)
1002 {
1003 /* Must add the class instance variable up front. */
1004 /* Right now we just make this a pointer. But later
1005 we may wish to make it special. */
1006 tree type = TREE_VALUE (arg_types);
1007 int constp = 1;
1008
1009 if ((flag_this_is_variable > 0)
1010 && (flags == DTOR_FLAG || DECL_CONSTRUCTOR_P (function)))
1011 constp = 0;
1012
1013 parm = build_decl (PARM_DECL, this_identifier, type);
1014 /* Mark the artificial `this' parameter as "artificial". */
1015 SET_DECL_ARTIFICIAL (parm);
1016 DECL_ARG_TYPE (parm) = type;
1017 /* We can make this a register, so long as we don't
1018 accidentally complain if someone tries to take its address. */
1019 DECL_REGISTER (parm) = 1;
1020 if (constp)
1021 TREE_READONLY (parm) = 1;
1022 TREE_CHAIN (parm) = last_function_parms;
1023 last_function_parms = parm;
1024 }
1025
1026 DECL_ARGUMENTS (function) = last_function_parms;
1027 /* First approximations. */
1028 DECL_CONTEXT (function) = ctype;
1029 DECL_CLASS_CONTEXT (function) = ctype;
1030
1031 if (flags == DTOR_FLAG || DECL_CONSTRUCTOR_P (function))
1032 {
1033 maybe_retrofit_in_chrg (function);
1034 arg_types = TYPE_ARG_TYPES (TREE_TYPE (function));
1035 }
1036
1037 if (flags == DTOR_FLAG)
1038 {
1039 DECL_ASSEMBLER_NAME (function) = build_destructor_name (ctype);
1040 TYPE_HAS_DESTRUCTOR (ctype) = 1;
1041 }
1042 else
1043 set_mangled_name_for_decl (function);
1044 }
1045
1046 /* Work on the expr used by alignof (this is only called by the parser). */
1047
1048 tree
1049 grok_alignof (expr)
1050 tree expr;
1051 {
1052 tree best, t;
1053 int bestalign;
1054
1055 if (processing_template_decl)
1056 return build_min (ALIGNOF_EXPR, sizetype, expr);
1057
1058 if (TREE_CODE (expr) == COMPONENT_REF
1059 && DECL_C_BIT_FIELD (TREE_OPERAND (expr, 1)))
1060 error ("`__alignof__' applied to a bit-field");
1061
1062 if (TREE_CODE (expr) == INDIRECT_REF)
1063 {
1064 best = t = TREE_OPERAND (expr, 0);
1065 bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
1066
1067 while (TREE_CODE (t) == NOP_EXPR
1068 && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE)
1069 {
1070 int thisalign;
1071 t = TREE_OPERAND (t, 0);
1072 thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
1073 if (thisalign > bestalign)
1074 best = t, bestalign = thisalign;
1075 }
1076 return c_alignof (TREE_TYPE (TREE_TYPE (best)));
1077 }
1078 else
1079 {
1080 /* ANSI says arrays and fns are converted inside comma.
1081 But we can't convert them in build_compound_expr
1082 because that would break commas in lvalues.
1083 So do the conversion here if operand was a comma. */
1084 if (TREE_CODE (expr) == COMPOUND_EXPR
1085 && (TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE
1086 || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE))
1087 expr = default_conversion (expr);
1088 return c_alignof (TREE_TYPE (expr));
1089 }
1090 }
1091
1092 /* Create an ARRAY_REF, checking for the user doing things backwards
1093 along the way. */
1094
1095 tree
1096 grok_array_decl (array_expr, index_exp)
1097 tree array_expr, index_exp;
1098 {
1099 tree type = TREE_TYPE (array_expr);
1100 tree p1, p2, i1, i2;
1101
1102 if (type == error_mark_node || index_exp == error_mark_node)
1103 return error_mark_node;
1104 if (processing_template_decl)
1105 return build_min (ARRAY_REF, type ? TREE_TYPE (type) : NULL_TREE,
1106 array_expr, index_exp);
1107
1108 if (type == NULL_TREE)
1109 {
1110 /* Something has gone very wrong. Assume we are mistakenly reducing
1111 an expression instead of a declaration. */
1112 error ("parser may be lost: is there a '{' missing somewhere?");
1113 return NULL_TREE;
1114 }
1115
1116 if (TREE_CODE (type) == OFFSET_TYPE
1117 || TREE_CODE (type) == REFERENCE_TYPE)
1118 type = TREE_TYPE (type);
1119
1120 /* If they have an `operator[]', use that. */
1121 if (IS_AGGR_TYPE (type) || IS_AGGR_TYPE (TREE_TYPE (index_exp)))
1122 return build_opfncall (ARRAY_REF, LOOKUP_NORMAL,
1123 array_expr, index_exp, NULL_TREE);
1124
1125 /* Otherwise, create an ARRAY_REF for a pointer or array type. It
1126 is a little-known fact that, if `a' is an array and `i' is an
1127 int, you can write `i[a]', which means the same thing as `a[i]'. */
1128
1129 if (TREE_CODE (type) == ARRAY_TYPE)
1130 p1 = array_expr;
1131 else
1132 p1 = build_expr_type_conversion (WANT_POINTER, array_expr, 0);
1133
1134 if (TREE_CODE (TREE_TYPE (index_exp)) == ARRAY_TYPE)
1135 p2 = index_exp;
1136 else
1137 p2 = build_expr_type_conversion (WANT_POINTER, index_exp, 0);
1138
1139 i1 = build_expr_type_conversion (WANT_INT | WANT_ENUM, array_expr, 0);
1140 i2 = build_expr_type_conversion (WANT_INT | WANT_ENUM, index_exp, 0);
1141
1142 if ((p1 && i2) && (i1 && p2))
1143 error ("ambiguous conversion for array subscript");
1144
1145 if (p1 && i2)
1146 array_expr = p1, index_exp = i2;
1147 else if (i1 && p2)
1148 array_expr = p2, index_exp = i1;
1149 else
1150 {
1151 cp_error ("invalid types `%T[%T]' for array subscript",
1152 type, TREE_TYPE (index_exp));
1153 return error_mark_node;
1154 }
1155
1156 if (array_expr == error_mark_node || index_exp == error_mark_node)
1157 error ("ambiguous conversion for array subscript");
1158
1159 return build_array_ref (array_expr, index_exp);
1160 }
1161
1162 /* Given the cast expression EXP, checking out its validity. Either return
1163 an error_mark_node if there was an unavoidable error, return a cast to
1164 void for trying to delete a pointer w/ the value 0, or return the
1165 call to delete. If DOING_VEC is 1, we handle things differently
1166 for doing an array delete. If DOING_VEC is 2, they gave us the
1167 array size as an argument to delete.
1168 Implements ARM $5.3.4. This is called from the parser. */
1169
1170 tree
1171 delete_sanity (exp, size, doing_vec, use_global_delete)
1172 tree exp, size;
1173 int doing_vec, use_global_delete;
1174 {
1175 tree t, type;
1176 /* For a regular vector delete (aka, no size argument) we will pass
1177 this down as a NULL_TREE into build_vec_delete. */
1178 tree maxindex = NULL_TREE;
1179
1180 if (exp == error_mark_node)
1181 return exp;
1182
1183 if (processing_template_decl)
1184 {
1185 t = build_min (DELETE_EXPR, void_type_node, exp, size);
1186 DELETE_EXPR_USE_GLOBAL (t) = use_global_delete;
1187 DELETE_EXPR_USE_VEC (t) = doing_vec;
1188 return t;
1189 }
1190
1191 if (TREE_CODE (exp) == OFFSET_REF)
1192 exp = resolve_offset_ref (exp);
1193 exp = convert_from_reference (exp);
1194 t = stabilize_reference (exp);
1195 t = build_expr_type_conversion (WANT_POINTER, t, 1);
1196
1197 if (t == NULL_TREE || t == error_mark_node)
1198 {
1199 cp_error ("type `%#T' argument given to `delete', expected pointer",
1200 TREE_TYPE (exp));
1201 return error_mark_node;
1202 }
1203
1204 if (doing_vec == 2)
1205 {
1206 maxindex = build_binary_op (MINUS_EXPR, size, integer_one_node);
1207 pedwarn ("anachronistic use of array size in vector delete");
1208 }
1209
1210 type = TREE_TYPE (t);
1211
1212 /* As of Valley Forge, you can delete a pointer to const. */
1213
1214 /* You can't delete functions. */
1215 if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
1216 {
1217 error ("cannot delete a function");
1218 return error_mark_node;
1219 }
1220
1221 /* Deleting ptr to void is undefined behaviour [expr.delete/3]. */
1222 if (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE)
1223 cp_warning ("`%T' is not a pointer-to-object type", type);
1224
1225 /* An array can't have been allocated by new, so complain. */
1226 if (TREE_CODE (t) == ADDR_EXPR
1227 && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL
1228 && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == ARRAY_TYPE)
1229 cp_warning ("deleting array `%#D'", TREE_OPERAND (t, 0));
1230
1231 /* Deleting a pointer with the value zero is valid and has no effect. */
1232 if (integer_zerop (t))
1233 return build1 (NOP_EXPR, void_type_node, t);
1234
1235 if (doing_vec)
1236 return build_vec_delete (t, maxindex, integer_one_node,
1237 integer_zero_node, use_global_delete);
1238 else
1239 {
1240 if (IS_AGGR_TYPE (TREE_TYPE (type))
1241 && TYPE_GETS_REG_DELETE (TREE_TYPE (type)))
1242 {
1243 /* Only do access checking here; we'll be calling op delete
1244 from the destructor. */
1245 tree tmp = build_op_delete_call (DELETE_EXPR, t, size_zero_node,
1246 LOOKUP_NORMAL, NULL_TREE);
1247 if (tmp == error_mark_node)
1248 return error_mark_node;
1249 }
1250
1251 return build_delete (type, t, integer_three_node,
1252 LOOKUP_NORMAL, use_global_delete);
1253 }
1254 }
1255
1256 /* Report an error if the indicated template declaration is not the
1257 sort of thing that should be a member template. */
1258
1259 void
1260 check_member_template (tmpl)
1261 tree tmpl;
1262 {
1263 tree decl;
1264
1265 my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 0);
1266 decl = DECL_TEMPLATE_RESULT (tmpl);
1267
1268 if (TREE_CODE (decl) == FUNCTION_DECL
1269 || (TREE_CODE (decl) == TYPE_DECL
1270 && IS_AGGR_TYPE (TREE_TYPE (decl))))
1271 {
1272 if (current_function_decl)
1273 /* 14.5.2.2 [temp.mem]
1274
1275 A local class shall not have member templates. */
1276 cp_error ("declaration of member template `%#D' in local class",
1277 decl);
1278
1279 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_VIRTUAL_P (decl))
1280 {
1281 /* 14.5.2.3 [temp.mem]
1282
1283 A member function template shall not be virtual. */
1284 cp_error
1285 ("invalid use of `virtual' in template declaration of `%#D'",
1286 decl);
1287 DECL_VIRTUAL_P (decl) = 0;
1288 }
1289
1290 /* The debug-information generating code doesn't know what to do
1291 with member templates. */
1292 DECL_IGNORED_P (tmpl) = 1;
1293 }
1294 else
1295 cp_error ("template declaration of `%#D'", decl);
1296 }
1297
1298 /* Return true iff TYPE is a valid Java parameter or return type. */
1299
1300 static int
1301 acceptable_java_type (type)
1302 tree type;
1303 {
1304 if (TREE_CODE (type) == VOID_TYPE || TYPE_FOR_JAVA (type))
1305 return 1;
1306 if (TREE_CODE (type) == POINTER_TYPE)
1307 {
1308 type = TREE_TYPE (type);
1309 if (TREE_CODE (type) == RECORD_TYPE)
1310 {
1311 tree args; int i;
1312 if (! TYPE_FOR_JAVA (type))
1313 return 0;
1314 if (! CLASSTYPE_TEMPLATE_INFO (type))
1315 return 1;
1316 args = CLASSTYPE_TI_ARGS (type);
1317 i = TREE_VEC_LENGTH (args);
1318 while (--i >= 0)
1319 {
1320 type = TREE_VEC_ELT (args, i);
1321 if (TREE_CODE (type) == POINTER_TYPE)
1322 type = TREE_TYPE (type);
1323 if (! TYPE_FOR_JAVA (type))
1324 return 0;
1325 }
1326 return 1;
1327 }
1328 }
1329 return 0;
1330 }
1331
1332 /* For a METHOD in a Java class CTYPE, return 1 if
1333 the parameter and return types are valid Java types.
1334 Otherwise, print appropriate error messages, and return 0. */
1335
1336 int
1337 check_java_method (method)
1338 tree method;
1339 {
1340 int jerr = 0;
1341 tree arg_types = TYPE_ARG_TYPES (TREE_TYPE (method));
1342 tree ret_type = TREE_TYPE (TREE_TYPE (method));
1343 if (! acceptable_java_type (ret_type))
1344 {
1345 cp_error ("Java method '%D' has non-Java return type `%T'",
1346 method, ret_type);
1347 jerr++;
1348 }
1349 for (; arg_types != NULL_TREE; arg_types = TREE_CHAIN (arg_types))
1350 {
1351 tree type = TREE_VALUE (arg_types);
1352 if (! acceptable_java_type (type))
1353 {
1354 cp_error ("Java method '%D' has non-Java parameter type `%T'",
1355 method, type);
1356 jerr++;
1357 }
1358 }
1359 return jerr ? 0 : 1;
1360 }
1361
1362 /* Sanity check: report error if this function FUNCTION is not
1363 really a member of the class (CTYPE) it is supposed to belong to.
1364 CNAME is the same here as it is for grokclassfn above. */
1365
1366 tree
1367 check_classfn (ctype, function)
1368 tree ctype, function;
1369 {
1370 tree fn_name = DECL_NAME (function);
1371 tree fndecl, fndecls;
1372 tree method_vec = CLASSTYPE_METHOD_VEC (complete_type (ctype));
1373 tree *methods = 0;
1374 tree *end = 0;
1375
1376 if (DECL_USE_TEMPLATE (function)
1377 && is_member_template (DECL_TI_TEMPLATE (function)))
1378 /* Since this is a specialization of a member template,
1379 we're not going to find the declaration in the class.
1380 For example, in:
1381
1382 struct S { template <typename T> void f(T); };
1383 template <> void S::f(int);
1384
1385 we're not going to find `S::f(int)', but there's no
1386 reason we should, either. We let our callers know we didn't
1387 find the method, but we don't complain. */
1388 return NULL_TREE;
1389
1390 if (method_vec != 0)
1391 {
1392 methods = &TREE_VEC_ELT (method_vec, 0);
1393 end = TREE_VEC_END (method_vec);
1394
1395 /* First suss out ctors and dtors. */
1396 if (*methods && fn_name == DECL_NAME (OVL_CURRENT (*methods))
1397 && DECL_CONSTRUCTOR_P (function))
1398 goto got_it;
1399 if (*++methods && fn_name == DECL_NAME (OVL_CURRENT (*methods))
1400 && DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (function)))
1401 goto got_it;
1402
1403 while (++methods != end && *methods)
1404 {
1405 fndecl = *methods;
1406 if (fn_name == DECL_NAME (OVL_CURRENT (*methods)))
1407 {
1408 got_it:
1409 for (fndecls = *methods; fndecls != NULL_TREE;
1410 fndecls = OVL_NEXT (fndecls))
1411 {
1412 fndecl = OVL_CURRENT (fndecls);
1413 /* The DECL_ASSEMBLER_NAME for a TEMPLATE_DECL, or
1414 for a for member function of a template class, is
1415 not mangled, so the check below does not work
1416 correctly in that case. Since mangled destructor
1417 names do not include the type of the arguments,
1418 we can't use this short-cut for them, either.
1419 (It's not legal to declare arguments for a
1420 destructor, but some people try.) */
1421 if (!DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (function))
1422 && (DECL_ASSEMBLER_NAME (function)
1423 != DECL_NAME (function))
1424 && (DECL_ASSEMBLER_NAME (fndecl)
1425 != DECL_NAME (fndecl))
1426 && (DECL_ASSEMBLER_NAME (function)
1427 == DECL_ASSEMBLER_NAME (fndecl)))
1428 return fndecl;
1429
1430 /* We cannot simply call decls_match because this
1431 doesn't work for static member functions that are
1432 pretending to be methods, and because the name
1433 may have been changed by asm("new_name"). */
1434 if (DECL_NAME (function) == DECL_NAME (fndecl))
1435 {
1436 tree p1 = TYPE_ARG_TYPES (TREE_TYPE (function));
1437 tree p2 = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1438
1439 /* Get rid of the this parameter on functions that become
1440 static. */
1441 if (DECL_STATIC_FUNCTION_P (fndecl)
1442 && TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE)
1443 p1 = TREE_CHAIN (p1);
1444
1445 if (same_type_p (TREE_TYPE (TREE_TYPE (function)),
1446 TREE_TYPE (TREE_TYPE (fndecl)))
1447 && compparms (p1, p2)
1448 && (DECL_TEMPLATE_SPECIALIZATION (function)
1449 == DECL_TEMPLATE_SPECIALIZATION (fndecl))
1450 && (!DECL_TEMPLATE_SPECIALIZATION (function)
1451 || (DECL_TI_TEMPLATE (function)
1452 == DECL_TI_TEMPLATE (fndecl))))
1453 return fndecl;
1454 }
1455 }
1456 break; /* loser */
1457 }
1458 }
1459 }
1460
1461 if (methods != end && *methods)
1462 {
1463 tree fndecl = *methods;
1464 cp_error ("prototype for `%#D' does not match any in class `%T'",
1465 function, ctype);
1466 cp_error_at ("candidate%s: %+#D", OVL_NEXT (fndecl) ? "s are" : " is",
1467 OVL_CURRENT (fndecl));
1468 while (fndecl = OVL_NEXT (fndecl), fndecl)
1469 cp_error_at (" %#D", OVL_CURRENT(fndecl));
1470 }
1471 else
1472 {
1473 methods = 0;
1474 if (TYPE_SIZE (ctype) == 0)
1475 incomplete_type_error (function, ctype);
1476 else
1477 cp_error ("no `%#D' member function declared in class `%T'",
1478 function, ctype);
1479 }
1480
1481 /* If we did not find the method in the class, add it to avoid
1482 spurious errors (unless the CTYPE is not yet defined, in which
1483 case we'll only confuse ourselves when the function is declared
1484 properly within the class. */
1485 if (TYPE_SIZE (ctype))
1486 add_method (ctype, methods, function);
1487 return NULL_TREE;
1488 }
1489
1490 /* We have just processed the DECL, which is a static data member.
1491 Its initializer, if present, is INIT. The ASMSPEC_TREE, if
1492 present, is the assembly-language name for the data member.
1493 NEED_POP and FLAGS are as for cp_finish_decl. */
1494
1495 void
1496 finish_static_data_member_decl (decl, init, asmspec_tree, need_pop, flags)
1497 tree decl;
1498 tree init;
1499 tree asmspec_tree;
1500 int need_pop;
1501 int flags;
1502 {
1503 char* asmspec = 0;
1504
1505 if (asmspec_tree)
1506 asmspec = TREE_STRING_POINTER (asmspec_tree);
1507
1508 my_friendly_assert (TREE_PUBLIC (decl), 0);
1509
1510 /* We cannot call pushdecl here, because that would fill in the
1511 decl of our TREE_CHAIN. Instead, we modify cp_finish_decl to do
1512 the right thing, namely, to put this decl out straight away. */
1513 /* current_class_type can be NULL_TREE in case of error. */
1514 if (!asmspec && current_class_type)
1515 {
1516 DECL_INITIAL (decl) = error_mark_node;
1517 DECL_ASSEMBLER_NAME (decl)
1518 = build_static_name (current_class_type, DECL_NAME (decl));
1519 }
1520 if (! processing_template_decl)
1521 {
1522 if (!pending_statics)
1523 VARRAY_TREE_INIT (pending_statics, 32, "pending_statics");
1524
1525 if (pending_statics_used == pending_statics->num_elements)
1526 VARRAY_GROW (pending_statics,
1527 2 * pending_statics->num_elements);
1528 VARRAY_TREE (pending_statics, pending_statics_used) = decl;
1529 ++pending_statics_used;
1530 }
1531
1532 /* Static consts need not be initialized in the class definition. */
1533 if (init != NULL_TREE && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
1534 {
1535 static int explanation = 0;
1536
1537 error ("initializer invalid for static member with constructor");
1538 if (explanation++ == 0)
1539 error ("(you really want to initialize it separately)");
1540 init = 0;
1541 }
1542 /* Force the compiler to know when an uninitialized static const
1543 member is being used. */
1544 if (CP_TYPE_CONST_P (TREE_TYPE (decl)) && init == 0)
1545 TREE_USED (decl) = 1;
1546 DECL_INITIAL (decl) = init;
1547 DECL_IN_AGGR_P (decl) = 1;
1548 DECL_CONTEXT (decl) = current_class_type;
1549 DECL_CLASS_CONTEXT (decl) = current_class_type;
1550
1551 cp_finish_decl (decl, init, asmspec_tree, need_pop, flags);
1552 }
1553
1554 /* Process the specs, declarator (NULL if omitted) and width (NULL if omitted)
1555 of a structure component, returning a FIELD_DECL node.
1556 QUALS is a list of type qualifiers for this decl (such as for declaring
1557 const member functions).
1558
1559 This is done during the parsing of the struct declaration.
1560 The FIELD_DECL nodes are chained together and the lot of them
1561 are ultimately passed to `build_struct' to make the RECORD_TYPE node.
1562
1563 C++:
1564
1565 If class A defines that certain functions in class B are friends, then
1566 the way I have set things up, it is B who is interested in permission
1567 granted by A. However, it is in A's context that these declarations
1568 are parsed. By returning a void_type_node, class A does not attempt
1569 to incorporate the declarations of the friends within its structure.
1570
1571 DO NOT MAKE ANY CHANGES TO THIS CODE WITHOUT MAKING CORRESPONDING
1572 CHANGES TO CODE IN `start_method'. */
1573
1574 tree
1575 grokfield (declarator, declspecs, init, asmspec_tree, attrlist)
1576 tree declarator, declspecs, init, asmspec_tree, attrlist;
1577 {
1578 register tree value;
1579 char *asmspec = 0;
1580 int flags = LOOKUP_ONLYCONVERTING;
1581
1582 /* Convert () initializers to = initializers. */
1583 if (init == NULL_TREE && declarator != NULL_TREE
1584 && TREE_CODE (declarator) == CALL_EXPR
1585 && TREE_OPERAND (declarator, 0)
1586 && (TREE_CODE (TREE_OPERAND (declarator, 0)) == IDENTIFIER_NODE
1587 || TREE_CODE (TREE_OPERAND (declarator, 0)) == SCOPE_REF)
1588 && parmlist_is_exprlist (TREE_OPERAND (declarator, 1)))
1589 {
1590 init = TREE_OPERAND (declarator, 1);
1591 declarator = TREE_OPERAND (declarator, 0);
1592 flags = 0;
1593 }
1594
1595 if (declspecs == NULL_TREE
1596 && TREE_CODE (declarator) == SCOPE_REF
1597 && TREE_CODE (TREE_OPERAND (declarator, 1)) == IDENTIFIER_NODE)
1598 {
1599 /* Access declaration */
1600 if (! IS_AGGR_TYPE_CODE (TREE_CODE (TREE_OPERAND (declarator, 0))))
1601 ;
1602 else if (TREE_COMPLEXITY (declarator) == current_class_depth)
1603 pop_nested_class ();
1604 return do_class_using_decl (declarator);
1605 }
1606
1607 if (init
1608 && TREE_CODE (init) == TREE_LIST
1609 && TREE_VALUE (init) == error_mark_node
1610 && TREE_CHAIN (init) == NULL_TREE)
1611 init = NULL_TREE;
1612
1613 value = grokdeclarator (declarator, declspecs, FIELD, init != 0, attrlist);
1614 if (! value || value == error_mark_node)
1615 /* friend or constructor went bad. */
1616 return value;
1617
1618 /* Pass friendly classes back. */
1619 if (TREE_CODE (value) == VOID_TYPE)
1620 return void_type_node;
1621
1622 if (DECL_NAME (value) != NULL_TREE
1623 && IDENTIFIER_POINTER (DECL_NAME (value))[0] == '_'
1624 && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (value)), "_vptr"))
1625 cp_error ("member `%D' conflicts with virtual function table field name",
1626 value);
1627
1628 /* Stash away type declarations. */
1629 if (TREE_CODE (value) == TYPE_DECL)
1630 {
1631 DECL_NONLOCAL (value) = 1;
1632 DECL_CONTEXT (value) = current_class_type;
1633 DECL_CLASS_CONTEXT (value) = current_class_type;
1634
1635 /* Now that we've updated the context, we need to remangle the
1636 name for this TYPE_DECL. */
1637 DECL_ASSEMBLER_NAME (value) = DECL_NAME (value);
1638 if (!uses_template_parms (value))
1639 DECL_ASSEMBLER_NAME (value) =
1640 get_identifier (build_overload_name (TREE_TYPE (value), 1, 1));
1641
1642 return value;
1643 }
1644
1645 if (IS_SIGNATURE (current_class_type)
1646 && TREE_CODE (value) != FUNCTION_DECL)
1647 {
1648 error ("field declaration not allowed in signature");
1649 return void_type_node;
1650 }
1651
1652 if (DECL_IN_AGGR_P (value))
1653 {
1654 cp_error ("`%D' is already defined in `%T'", value,
1655 DECL_CONTEXT (value));
1656 return void_type_node;
1657 }
1658
1659 if (asmspec_tree)
1660 asmspec = TREE_STRING_POINTER (asmspec_tree);
1661
1662 if (init)
1663 {
1664 if (IS_SIGNATURE (current_class_type)
1665 && TREE_CODE (value) == FUNCTION_DECL)
1666 {
1667 error ("function declarations cannot have initializers in signature");
1668 init = NULL_TREE;
1669 }
1670 else if (TREE_CODE (value) == FUNCTION_DECL)
1671 {
1672 grok_function_init (value, init);
1673 init = NULL_TREE;
1674 }
1675 else if (pedantic && TREE_CODE (value) != VAR_DECL)
1676 /* Already complained in grokdeclarator. */
1677 init = NULL_TREE;
1678 else
1679 {
1680 /* We allow initializers to become parameters to base
1681 initializers. */
1682 if (TREE_CODE (init) == TREE_LIST)
1683 {
1684 if (TREE_CHAIN (init) == NULL_TREE)
1685 init = TREE_VALUE (init);
1686 else
1687 init = digest_init (TREE_TYPE (value), init, (tree *)0);
1688 }
1689
1690 if (TREE_CODE (init) == CONST_DECL)
1691 init = DECL_INITIAL (init);
1692 else if (TREE_READONLY_DECL_P (init))
1693 init = decl_constant_value (init);
1694 else if (TREE_CODE (init) == CONSTRUCTOR)
1695 init = digest_init (TREE_TYPE (value), init, (tree *)0);
1696 my_friendly_assert (TREE_PERMANENT (init), 192);
1697 if (init == error_mark_node)
1698 /* We must make this look different than `error_mark_node'
1699 because `decl_const_value' would mis-interpret it
1700 as only meaning that this VAR_DECL is defined. */
1701 init = build1 (NOP_EXPR, TREE_TYPE (value), init);
1702 else if (processing_template_decl)
1703 ;
1704 else if (! TREE_CONSTANT (init))
1705 {
1706 /* We can allow references to things that are effectively
1707 static, since references are initialized with the address. */
1708 if (TREE_CODE (TREE_TYPE (value)) != REFERENCE_TYPE
1709 || (TREE_STATIC (init) == 0
1710 && (TREE_CODE_CLASS (TREE_CODE (init)) != 'd'
1711 || DECL_EXTERNAL (init) == 0)))
1712 {
1713 error ("field initializer is not constant");
1714 init = error_mark_node;
1715 }
1716 }
1717 }
1718 }
1719
1720 /* The corresponding pop_obstacks is in cp_finish_decl. */
1721 push_obstacks_nochange ();
1722
1723 if (processing_template_decl && ! current_function_decl
1724 && (TREE_CODE (value) == VAR_DECL || TREE_CODE (value) == FUNCTION_DECL))
1725 value = push_template_decl (value);
1726
1727 if (attrlist)
1728 cplus_decl_attributes (value, TREE_PURPOSE (attrlist),
1729 TREE_VALUE (attrlist));
1730
1731 if (TREE_CODE (value) == VAR_DECL)
1732 {
1733 finish_static_data_member_decl (value, init, asmspec_tree,
1734 /*need_pop=*/1, flags);
1735 return value;
1736 }
1737 if (TREE_CODE (value) == FIELD_DECL)
1738 {
1739 if (asmspec)
1740 {
1741 /* This must override the asm specifier which was placed
1742 by grokclassfn. Lay this out fresh. */
1743 DECL_RTL (value) = NULL_RTX;
1744 DECL_ASSEMBLER_NAME (value) = get_identifier (asmspec);
1745 }
1746 if (DECL_INITIAL (value) == error_mark_node)
1747 init = error_mark_node;
1748 cp_finish_decl (value, init, asmspec_tree, 1, flags);
1749 DECL_INITIAL (value) = init;
1750 DECL_IN_AGGR_P (value) = 1;
1751 return value;
1752 }
1753 if (TREE_CODE (value) == FUNCTION_DECL)
1754 {
1755 if (asmspec)
1756 {
1757 /* This must override the asm specifier which was placed
1758 by grokclassfn. Lay this out fresh. */
1759 DECL_RTL (value) = NULL_RTX;
1760 DECL_ASSEMBLER_NAME (value) = get_identifier (asmspec);
1761 }
1762 cp_finish_decl (value, init, asmspec_tree, 1, flags);
1763
1764 /* Pass friends back this way. */
1765 if (DECL_FRIEND_P (value))
1766 return void_type_node;
1767
1768 #if 0 /* Just because a fn is declared doesn't mean we'll try to define it. */
1769 if (current_function_decl && ! IS_SIGNATURE (current_class_type))
1770 cp_error ("method `%#D' of local class must be defined in class body",
1771 value);
1772 #endif
1773
1774 DECL_IN_AGGR_P (value) = 1;
1775 return value;
1776 }
1777 my_friendly_abort (21);
1778 /* NOTREACHED */
1779 return NULL_TREE;
1780 }
1781
1782 /* Like `grokfield', but for bitfields.
1783 WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node. */
1784
1785 tree
1786 grokbitfield (declarator, declspecs, width)
1787 tree declarator, declspecs, width;
1788 {
1789 register tree value = grokdeclarator (declarator, declspecs, BITFIELD,
1790 0, NULL_TREE);
1791
1792 if (! value) return NULL_TREE; /* friends went bad. */
1793
1794 /* Pass friendly classes back. */
1795 if (TREE_CODE (value) == VOID_TYPE)
1796 return void_type_node;
1797
1798 if (TREE_CODE (value) == TYPE_DECL)
1799 {
1800 cp_error ("cannot declare `%D' to be a bitfield type", value);
1801 return NULL_TREE;
1802 }
1803
1804 /* Usually, finish_struct_1 catches bitifields with invalid types.
1805 But, in the case of bitfields with function type, we confuse
1806 ourselves into thinking they are member functions, so we must
1807 check here. */
1808 if (TREE_CODE (value) == FUNCTION_DECL)
1809 {
1810 cp_error ("cannot declare bitfield `%D' with funcion type",
1811 DECL_NAME (value));
1812 return NULL_TREE;
1813 }
1814
1815 if (IS_SIGNATURE (current_class_type))
1816 {
1817 error ("field declaration not allowed in signature");
1818 return void_type_node;
1819 }
1820
1821 if (DECL_IN_AGGR_P (value))
1822 {
1823 cp_error ("`%D' is already defined in the class %T", value,
1824 DECL_CONTEXT (value));
1825 return void_type_node;
1826 }
1827
1828 GNU_xref_member (current_class_name, value);
1829
1830 if (TREE_STATIC (value))
1831 {
1832 cp_error ("static member `%D' cannot be a bitfield", value);
1833 return NULL_TREE;
1834 }
1835 cp_finish_decl (value, NULL_TREE, NULL_TREE, 0, 0);
1836
1837 if (width != error_mark_node)
1838 {
1839 constant_expression_warning (width);
1840 DECL_INITIAL (value) = width;
1841 SET_DECL_C_BIT_FIELD (value);
1842 }
1843
1844 DECL_IN_AGGR_P (value) = 1;
1845 return value;
1846 }
1847
1848 tree
1849 grokoptypename (declspecs, declarator)
1850 tree declspecs, declarator;
1851 {
1852 tree t = grokdeclarator (declarator, declspecs, TYPENAME, 0, NULL_TREE);
1853 return build_typename_overload (t);
1854 }
1855
1856 /* When a function is declared with an initializer,
1857 do the right thing. Currently, there are two possibilities:
1858
1859 class B
1860 {
1861 public:
1862 // initialization possibility #1.
1863 virtual void f () = 0;
1864 int g ();
1865 };
1866
1867 class D1 : B
1868 {
1869 public:
1870 int d1;
1871 // error, no f ();
1872 };
1873
1874 class D2 : B
1875 {
1876 public:
1877 int d2;
1878 void f ();
1879 };
1880
1881 class D3 : B
1882 {
1883 public:
1884 int d3;
1885 // initialization possibility #2
1886 void f () = B::f;
1887 };
1888
1889 */
1890
1891 int
1892 copy_assignment_arg_p (parmtype, virtualp)
1893 tree parmtype;
1894 int virtualp ATTRIBUTE_UNUSED;
1895 {
1896 if (current_class_type == NULL_TREE)
1897 return 0;
1898
1899 if (TREE_CODE (parmtype) == REFERENCE_TYPE)
1900 parmtype = TREE_TYPE (parmtype);
1901
1902 if ((TYPE_MAIN_VARIANT (parmtype) == current_class_type)
1903 #if 0
1904 /* Non-standard hack to support old Booch components. */
1905 || (! virtualp && DERIVED_FROM_P (parmtype, current_class_type))
1906 #endif
1907 )
1908 return 1;
1909
1910 return 0;
1911 }
1912
1913 static void
1914 grok_function_init (decl, init)
1915 tree decl;
1916 tree init;
1917 {
1918 /* An initializer for a function tells how this function should
1919 be inherited. */
1920 tree type = TREE_TYPE (decl);
1921
1922 if (TREE_CODE (type) == FUNCTION_TYPE)
1923 cp_error ("initializer specified for non-member function `%D'", decl);
1924 #if 0
1925 /* We'll check for this in finish_struct_1. */
1926 else if (DECL_VINDEX (decl) == NULL_TREE)
1927 cp_error ("initializer specified for non-virtual method `%D'", decl);
1928 #endif
1929 else if (integer_zerop (init))
1930 {
1931 #if 0
1932 /* Mark this function as being "defined". */
1933 DECL_INITIAL (decl) = error_mark_node;
1934 /* pure virtual destructors must be defined. */
1935 /* pure virtual needs to be defined (as abort) only when put in
1936 vtbl. For wellformed call, it should be itself. pr4737 */
1937 if (!DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl)))
1938 {
1939 extern tree abort_fndecl;
1940 /* Give this node rtl from `abort'. */
1941 DECL_RTL (decl) = DECL_RTL (abort_fndecl);
1942 }
1943 #endif
1944 DECL_ABSTRACT_VIRTUAL_P (decl) = 1;
1945 if (DECL_NAME (decl) == ansi_opname [(int) MODIFY_EXPR])
1946 {
1947 tree parmtype
1948 = TREE_VALUE (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl))));
1949
1950 if (copy_assignment_arg_p (parmtype, 1))
1951 TYPE_HAS_ABSTRACT_ASSIGN_REF (current_class_type) = 1;
1952 }
1953 }
1954 else
1955 cp_error ("invalid initializer for virtual method `%D'", decl);
1956 }
1957 \f
1958 void
1959 cplus_decl_attributes (decl, attributes, prefix_attributes)
1960 tree decl, attributes, prefix_attributes;
1961 {
1962 if (decl == NULL_TREE || decl == void_type_node)
1963 return;
1964
1965 if (TREE_CODE (decl) == TEMPLATE_DECL)
1966 decl = DECL_TEMPLATE_RESULT (decl);
1967
1968 decl_attributes (decl, attributes, prefix_attributes);
1969
1970 if (TREE_CODE (decl) == TYPE_DECL)
1971 SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (decl), TREE_TYPE (decl));
1972 }
1973 \f
1974 /* CONSTRUCTOR_NAME:
1975 Return the name for the constructor (or destructor) for the
1976 specified class. Argument can be RECORD_TYPE, TYPE_DECL, or
1977 IDENTIFIER_NODE. When given a template, this routine doesn't
1978 lose the specialization. */
1979
1980 tree
1981 constructor_name_full (thing)
1982 tree thing;
1983 {
1984 if (TREE_CODE (thing) == TEMPLATE_TYPE_PARM
1985 || TREE_CODE (thing) == TEMPLATE_TEMPLATE_PARM
1986 || TREE_CODE (thing) == TYPENAME_TYPE)
1987 thing = TYPE_NAME (thing);
1988 else if (IS_AGGR_TYPE_CODE (TREE_CODE (thing)))
1989 {
1990 if (TYPE_WAS_ANONYMOUS (thing) && TYPE_HAS_CONSTRUCTOR (thing))
1991 thing = DECL_NAME (OVL_CURRENT (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (thing), 0)));
1992 else
1993 thing = TYPE_NAME (thing);
1994 }
1995 if (TREE_CODE (thing) == TYPE_DECL
1996 || (TREE_CODE (thing) == TEMPLATE_DECL
1997 && TREE_CODE (DECL_TEMPLATE_RESULT (thing)) == TYPE_DECL))
1998 thing = DECL_NAME (thing);
1999 my_friendly_assert (TREE_CODE (thing) == IDENTIFIER_NODE, 197);
2000 return thing;
2001 }
2002
2003 /* CONSTRUCTOR_NAME:
2004 Return the name for the constructor (or destructor) for the
2005 specified class. Argument can be RECORD_TYPE, TYPE_DECL, or
2006 IDENTIFIER_NODE. When given a template, return the plain
2007 unspecialized name. */
2008
2009 tree
2010 constructor_name (thing)
2011 tree thing;
2012 {
2013 tree t;
2014 thing = constructor_name_full (thing);
2015 t = IDENTIFIER_TEMPLATE (thing);
2016 if (!t)
2017 return thing;
2018 return t;
2019 }
2020 \f
2021 /* Cache the value of this class's main virtual function table pointer
2022 in a register variable. This will save one indirection if a
2023 more than one virtual function call is made this function. */
2024
2025 void
2026 setup_vtbl_ptr ()
2027 {
2028 extern tree base_init_expr;
2029
2030 if (base_init_expr == 0
2031 && DECL_CONSTRUCTOR_P (current_function_decl))
2032 {
2033 if (processing_template_decl)
2034 add_tree (build_min_nt
2035 (CTOR_INITIALIZER,
2036 current_member_init_list, current_base_init_list));
2037 else
2038 emit_base_init (current_class_type, 0);
2039 }
2040 }
2041
2042 /* Record the existence of an addressable inline function. */
2043
2044 void
2045 mark_inline_for_output (decl)
2046 tree decl;
2047 {
2048 decl = DECL_MAIN_VARIANT (decl);
2049 if (DECL_SAVED_INLINE (decl))
2050 return;
2051 my_friendly_assert (TREE_PERMANENT (decl), 363);
2052 DECL_SAVED_INLINE (decl) = 1;
2053 if (!saved_inlines)
2054 VARRAY_TREE_INIT (saved_inlines, 32, "saved_inlines");
2055
2056 if (saved_inlines_used == saved_inlines->num_elements)
2057 VARRAY_GROW (saved_inlines,
2058 2 * saved_inlines->num_elements);
2059 VARRAY_TREE (saved_inlines, saved_inlines_used) = decl;
2060 ++saved_inlines_used;
2061 }
2062
2063 void
2064 clear_temp_name ()
2065 {
2066 temp_name_counter = 0;
2067 }
2068
2069 /* Hand off a unique name which can be used for variable we don't really
2070 want to know about anyway, for example, the anonymous variables which
2071 are needed to make references work. Declare this thing so we can use it.
2072 The variable created will be of type TYPE.
2073
2074 STATICP is nonzero if this variable should be static. */
2075
2076 tree
2077 get_temp_name (type, staticp)
2078 tree type;
2079 int staticp;
2080 {
2081 char buf[sizeof (AUTO_TEMP_FORMAT) + 20];
2082 tree decl;
2083 int toplev = toplevel_bindings_p ();
2084
2085 push_obstacks_nochange ();
2086 if (toplev || staticp)
2087 {
2088 end_temporary_allocation ();
2089 sprintf (buf, AUTO_TEMP_FORMAT, global_temp_name_counter++);
2090 decl = pushdecl_top_level (build_decl (VAR_DECL, get_identifier (buf), type));
2091 }
2092 else
2093 {
2094 sprintf (buf, AUTO_TEMP_FORMAT, temp_name_counter++);
2095 decl = pushdecl (build_decl (VAR_DECL, get_identifier (buf), type));
2096 }
2097 TREE_USED (decl) = 1;
2098 TREE_STATIC (decl) = staticp;
2099 DECL_ARTIFICIAL (decl) = 1;
2100
2101 /* If this is a local variable, then lay out its rtl now.
2102 Otherwise, callers of this function are responsible for dealing
2103 with this variable's rtl. */
2104 if (! toplev)
2105 {
2106 expand_decl (decl);
2107 expand_decl_init (decl);
2108 }
2109 pop_obstacks ();
2110
2111 return decl;
2112 }
2113
2114 /* Get a variable which we can use for multiple assignments.
2115 It is not entered into current_binding_level, because
2116 that breaks things when it comes time to do final cleanups
2117 (which take place "outside" the binding contour of the function). */
2118
2119 tree
2120 get_temp_regvar (type, init)
2121 tree type, init;
2122 {
2123 tree decl;
2124
2125 decl = build_decl (VAR_DECL, NULL_TREE, type);
2126 TREE_USED (decl) = 1;
2127 DECL_REGISTER (decl) = 1;
2128 DECL_ARTIFICIAL (decl) = 1;
2129
2130 DECL_RTL (decl) = assign_temp (type, 2, 0, 1);
2131 /* We can expand these without fear, since they cannot need
2132 constructors or destructors. */
2133 expand_expr (build_modify_expr (decl, INIT_EXPR, init),
2134 NULL_RTX, VOIDmode, 0);
2135
2136 return decl;
2137 }
2138
2139 /* Hunts through the global anonymous union ANON_DECL, building
2140 appropriate VAR_DECLs. Stores cleanups on the list of ELEMS, and
2141 returns a VAR_DECL whose size is the same as the size of the
2142 ANON_DECL, if one is available. */
2143
2144 static tree
2145 build_anon_union_vars (anon_decl, elems, static_p, external_p)
2146 tree anon_decl;
2147 tree* elems;
2148 int static_p;
2149 int external_p;
2150 {
2151 tree type = TREE_TYPE (anon_decl);
2152 tree main_decl = NULL_TREE;
2153 tree field;
2154
2155 for (field = TYPE_FIELDS (type);
2156 field != NULL_TREE;
2157 field = TREE_CHAIN (field))
2158 {
2159 tree decl;
2160
2161 if (DECL_ARTIFICIAL (field))
2162 continue;
2163 if (TREE_CODE (field) != FIELD_DECL)
2164 {
2165 cp_pedwarn_at ("`%#D' invalid; an anonymous union can only have non-static data members",
2166 field);
2167 continue;
2168 }
2169
2170 if (TREE_PRIVATE (field))
2171 cp_pedwarn_at ("private member `%#D' in anonymous union", field);
2172 else if (TREE_PROTECTED (field))
2173 cp_pedwarn_at ("protected member `%#D' in anonymous union", field);
2174
2175 if (DECL_NAME (field) == NULL_TREE
2176 && TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)
2177 {
2178 decl = build_anon_union_vars (field, elems, static_p, external_p);
2179 if (!decl)
2180 continue;
2181 }
2182 else if (DECL_NAME (field) == NULL_TREE)
2183 continue;
2184 else
2185 {
2186 decl = build_decl (VAR_DECL, DECL_NAME (field), TREE_TYPE (field));
2187 /* tell `pushdecl' that this is not tentative. */
2188 DECL_INITIAL (decl) = error_mark_node;
2189 TREE_PUBLIC (decl) = 0;
2190 TREE_STATIC (decl) = static_p;
2191 DECL_EXTERNAL (decl) = external_p;
2192 decl = pushdecl (decl);
2193 DECL_INITIAL (decl) = NULL_TREE;
2194 }
2195
2196 /* Only write out one anon union element--choose the one that
2197 can hold them all. */
2198 if (main_decl == NULL_TREE
2199 && simple_cst_equal (DECL_SIZE (decl),
2200 DECL_SIZE (anon_decl)) == 1)
2201 main_decl = decl;
2202 else
2203 /* ??? This causes there to be no debug info written out
2204 about this decl. */
2205 TREE_ASM_WRITTEN (decl) = 1;
2206
2207 if (DECL_NAME (field) == NULL_TREE
2208 && TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)
2209 /* The remainder of the processing was already done in the
2210 recursive call. */
2211 continue;
2212
2213 /* If there's a cleanup to do, it belongs in the
2214 TREE_PURPOSE of the following TREE_LIST. */
2215 *elems = scratch_tree_cons (NULL_TREE, decl, *elems);
2216 TREE_TYPE (*elems) = type;
2217 }
2218
2219 return main_decl;
2220 }
2221
2222 /* Finish off the processing of a UNION_TYPE structure.
2223 If there are static members, then all members are
2224 static, and must be laid out together. If the
2225 union is an anonymous union, we arrange for that
2226 as well. PUBLIC_P is nonzero if this union is
2227 not declared static. */
2228
2229 void
2230 finish_anon_union (anon_union_decl)
2231 tree anon_union_decl;
2232 {
2233 tree type = TREE_TYPE (anon_union_decl);
2234 tree elems = NULL_TREE;
2235 tree main_decl;
2236 int public_p = TREE_PUBLIC (anon_union_decl);
2237 int static_p = TREE_STATIC (anon_union_decl);
2238 int external_p = DECL_EXTERNAL (anon_union_decl);
2239
2240 if (TYPE_FIELDS (type) == NULL_TREE)
2241 return;
2242
2243 if (public_p)
2244 {
2245 error ("global anonymous unions must be declared static");
2246 return;
2247 }
2248
2249 main_decl = build_anon_union_vars (anon_union_decl, &elems,
2250 static_p, external_p);
2251
2252 if (main_decl == NULL_TREE)
2253 {
2254 warning ("anonymous union with no members");
2255 return;
2256 }
2257
2258 if (static_p)
2259 {
2260 make_decl_rtl (main_decl, 0, toplevel_bindings_p ());
2261 DECL_RTL (anon_union_decl) = DECL_RTL (main_decl);
2262 }
2263
2264 /* The following call assumes that there are never any cleanups
2265 for anonymous unions--a reasonable assumption. */
2266 expand_anon_union_decl (anon_union_decl, NULL_TREE, elems);
2267 }
2268
2269 /* Finish processing a builtin type TYPE. It's name is NAME,
2270 its fields are in the array FIELDS. LEN is the number of elements
2271 in FIELDS minus one, or put another way, it is the maximum subscript
2272 used in FIELDS.
2273
2274 It is given the same alignment as ALIGN_TYPE. */
2275
2276 void
2277 finish_builtin_type (type, name, fields, len, align_type)
2278 tree type;
2279 const char *name;
2280 tree fields[];
2281 int len;
2282 tree align_type;
2283 {
2284 register int i;
2285
2286 TYPE_FIELDS (type) = fields[0];
2287 for (i = 0; i < len; i++)
2288 {
2289 layout_type (TREE_TYPE (fields[i]));
2290 DECL_FIELD_CONTEXT (fields[i]) = type;
2291 TREE_CHAIN (fields[i]) = fields[i+1];
2292 }
2293 DECL_FIELD_CONTEXT (fields[i]) = type;
2294 DECL_CLASS_CONTEXT (fields[i]) = type;
2295 TYPE_ALIGN (type) = TYPE_ALIGN (align_type);
2296 layout_type (type);
2297 #if 0 /* not yet, should get fixed properly later */
2298 TYPE_NAME (type) = make_type_decl (get_identifier (name), type);
2299 #else
2300 TYPE_NAME (type) = build_decl (TYPE_DECL, get_identifier (name), type);
2301 #endif
2302 TYPE_STUB_DECL (type) = TYPE_NAME (type);
2303 layout_decl (TYPE_NAME (type), 0);
2304 }
2305 \f
2306 /* Auxiliary functions to make type signatures for
2307 `operator new' and `operator delete' correspond to
2308 what compiler will be expecting. */
2309
2310 tree
2311 coerce_new_type (type)
2312 tree type;
2313 {
2314 int e1 = 0, e2 = 0;
2315
2316 if (TREE_CODE (type) == METHOD_TYPE)
2317 type = build_function_type (TREE_TYPE (type), TREE_CHAIN (TYPE_ARG_TYPES (type)));
2318 if (! same_type_p (TREE_TYPE (type), ptr_type_node))
2319 e1 = 1, error ("`operator new' must return type `void *'");
2320
2321 /* Technically the type must be `size_t', but we may not know
2322 what that is. */
2323 if (TYPE_ARG_TYPES (type) == NULL_TREE)
2324 e1 = 1, error ("`operator new' takes type `size_t' parameter");
2325 else if (! same_type_p (TREE_VALUE (TYPE_ARG_TYPES (type)), sizetype))
2326 e2 = 1, error ("`operator new' takes type `size_t' as first parameter");
2327 if (e2)
2328 type = build_function_type (ptr_type_node, tree_cons (NULL_TREE, sizetype, TREE_CHAIN (TYPE_ARG_TYPES (type))));
2329 else if (e1)
2330 type = build_function_type (ptr_type_node, TYPE_ARG_TYPES (type));
2331 return type;
2332 }
2333
2334 tree
2335 coerce_delete_type (type)
2336 tree type;
2337 {
2338 int e1 = 0, e2 = 0;
2339 #if 0
2340 e3 = 0;
2341 #endif
2342 tree arg_types = TYPE_ARG_TYPES (type);
2343
2344 if (TREE_CODE (type) == METHOD_TYPE)
2345 {
2346 type = build_function_type (TREE_TYPE (type), TREE_CHAIN (arg_types));
2347 arg_types = TREE_CHAIN (arg_types);
2348 }
2349
2350 if (TREE_TYPE (type) != void_type_node)
2351 e1 = 1, error ("`operator delete' must return type `void'");
2352
2353 if (arg_types == NULL_TREE
2354 || ! same_type_p (TREE_VALUE (arg_types), ptr_type_node))
2355 e2 = 1, error ("`operator delete' takes type `void *' as first parameter");
2356
2357 #if 0
2358 if (arg_types
2359 && TREE_CHAIN (arg_types)
2360 && TREE_CHAIN (arg_types) != void_list_node)
2361 {
2362 /* Again, technically this argument must be `size_t', but again
2363 we may not know what that is. */
2364 tree t2 = TREE_VALUE (TREE_CHAIN (arg_types));
2365 if (! same_type_p (t2, sizetype))
2366 e3 = 1, error ("second argument to `operator delete' must be of type `size_t'");
2367 else if (TREE_CHAIN (TREE_CHAIN (arg_types)) != void_list_node)
2368 {
2369 e3 = 1;
2370 if (TREE_CHAIN (TREE_CHAIN (arg_types)))
2371 error ("too many arguments in declaration of `operator delete'");
2372 else
2373 error ("`...' invalid in specification of `operator delete'");
2374 }
2375 }
2376
2377 if (e3)
2378 arg_types = tree_cons (NULL_TREE, ptr_type_node,
2379 build_tree_list (NULL_TREE, sizetype));
2380 else if (e3 |= e2)
2381 {
2382 if (arg_types == NULL_TREE)
2383 arg_types = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
2384 else
2385 arg_types = tree_cons (NULL_TREE, ptr_type_node, TREE_CHAIN (arg_types));
2386 }
2387 else e3 |= e1;
2388 #endif
2389
2390 if (e2)
2391 arg_types = tree_cons (NULL_TREE, ptr_type_node,
2392 arg_types ? TREE_CHAIN (arg_types): NULL_TREE);
2393 if (e2 || e1)
2394 type = build_function_type (void_type_node, arg_types);
2395
2396 return type;
2397 }
2398 \f
2399 extern tree abort_fndecl;
2400
2401 static void
2402 mark_vtable_entries (decl)
2403 tree decl;
2404 {
2405 tree entries = CONSTRUCTOR_ELTS (DECL_INITIAL (decl));
2406
2407 for (; entries; entries = TREE_CHAIN (entries))
2408 {
2409 tree fnaddr;
2410 tree fn;
2411
2412 if (TREE_CODE (TREE_VALUE (entries)) == NOP_EXPR)
2413 /* RTTI offset. */
2414 continue;
2415
2416 fnaddr = (flag_vtable_thunks ? TREE_VALUE (entries)
2417 : FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (entries)));
2418 fn = TREE_OPERAND (fnaddr, 0);
2419 TREE_ADDRESSABLE (fn) = 1;
2420 if (DECL_LANG_SPECIFIC (fn) && DECL_ABSTRACT_VIRTUAL_P (fn))
2421 {
2422 TREE_OPERAND (fnaddr, 0) = fn = copy_node (fn);
2423 DECL_RTL (fn) = DECL_RTL (abort_fndecl);
2424 mark_used (abort_fndecl);
2425 }
2426 if (TREE_CODE (fn) == THUNK_DECL && DECL_EXTERNAL (fn))
2427 {
2428 DECL_EXTERNAL (fn) = 0;
2429 emit_thunk (fn);
2430 }
2431 mark_used (fn);
2432 }
2433 }
2434
2435 /* Set DECL up to have the closest approximation of "initialized common"
2436 linkage available. */
2437
2438 void
2439 comdat_linkage (decl)
2440 tree decl;
2441 {
2442 if (flag_weak)
2443 make_decl_one_only (decl);
2444 else if (TREE_CODE (decl) == FUNCTION_DECL || DECL_VIRTUAL_P (decl))
2445 /* We can just emit functions and vtables statically; it doesn't really
2446 matter if we have multiple copies. */
2447 TREE_PUBLIC (decl) = 0;
2448 else
2449 {
2450 /* Static data member template instantiations, however, cannot
2451 have multiple copies. */
2452 if (DECL_INITIAL (decl) == 0
2453 || DECL_INITIAL (decl) == error_mark_node)
2454 DECL_COMMON (decl) = 1;
2455 else if (EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl)))
2456 {
2457 DECL_COMMON (decl) = 1;
2458 DECL_INITIAL (decl) = error_mark_node;
2459 }
2460 else
2461 {
2462 /* We can't do anything useful; leave vars for explicit
2463 instantiation. */
2464 DECL_EXTERNAL (decl) = 1;
2465 DECL_NOT_REALLY_EXTERN (decl) = 0;
2466 }
2467 }
2468
2469 if (DECL_LANG_SPECIFIC (decl))
2470 DECL_COMDAT (decl) = 1;
2471 }
2472
2473 /* For win32 we also want to put explicit instantiations in
2474 linkonce sections, so that they will be merged with implicit
2475 instantiations; otherwise we get duplicate symbol errors. */
2476
2477 void
2478 maybe_make_one_only (decl)
2479 tree decl;
2480 {
2481 /* This is not necessary on targets that support weak symbols, because
2482 the implicit instantiations will defer to the explicit one. */
2483 if (! supports_one_only () || SUPPORTS_WEAK)
2484 return;
2485
2486 /* We can't set DECL_COMDAT on functions, or finish_file will think
2487 we can get away with not emitting them if they aren't used. We need
2488 to for variables so that cp_finish_decl will update their linkage,
2489 because their DECL_INITIAL may not have been set properly yet. */
2490
2491 make_decl_one_only (decl);
2492
2493 if (TREE_CODE (decl) == VAR_DECL && DECL_LANG_SPECIFIC (decl))
2494 DECL_COMDAT (decl) = 1;
2495 }
2496
2497 /* Set TREE_PUBLIC and/or DECL_EXTERN on the vtable DECL,
2498 based on TYPE and other static flags.
2499
2500 Note that anything public is tagged TREE_PUBLIC, whether
2501 it's public in this file or in another one. */
2502
2503 void
2504 import_export_vtable (decl, type, final)
2505 tree decl, type;
2506 int final;
2507 {
2508 if (DECL_INTERFACE_KNOWN (decl))
2509 return;
2510
2511 if (TYPE_FOR_JAVA (type))
2512 {
2513 TREE_PUBLIC (decl) = 1;
2514 DECL_EXTERNAL (decl) = 1;
2515 DECL_INTERFACE_KNOWN (decl) = 1;
2516 }
2517 else if (CLASSTYPE_INTERFACE_KNOWN (type))
2518 {
2519 TREE_PUBLIC (decl) = 1;
2520 DECL_EXTERNAL (decl) = ! CLASSTYPE_VTABLE_NEEDS_WRITING (type);
2521 DECL_INTERFACE_KNOWN (decl) = 1;
2522 }
2523 else
2524 {
2525 /* We can only wait to decide if we have real non-inline virtual
2526 functions in our class, or if we come from a template. */
2527
2528 int found = CLASSTYPE_TEMPLATE_INSTANTIATION (type);
2529
2530 if (! found && ! final)
2531 {
2532 tree method;
2533 for (method = TYPE_METHODS (type); method != NULL_TREE;
2534 method = TREE_CHAIN (method))
2535 if (DECL_VINDEX (method) != NULL_TREE
2536 && ! DECL_THIS_INLINE (method)
2537 && ! DECL_ABSTRACT_VIRTUAL_P (method))
2538 {
2539 found = 1;
2540 break;
2541 }
2542 }
2543
2544 if (final || ! found)
2545 {
2546 comdat_linkage (decl);
2547 DECL_EXTERNAL (decl) = 0;
2548 }
2549 else
2550 {
2551 TREE_PUBLIC (decl) = 1;
2552 DECL_EXTERNAL (decl) = 1;
2553 }
2554 }
2555 }
2556
2557 /* Determine whether or not we want to specifically import or export CTYPE,
2558 using various heuristics. */
2559
2560 void
2561 import_export_class (ctype)
2562 tree ctype;
2563 {
2564 /* -1 for imported, 1 for exported. */
2565 int import_export = 0;
2566
2567 if (CLASSTYPE_INTERFACE_KNOWN (ctype))
2568 return;
2569
2570 /* If MULTIPLE_SYMBOL_SPACES is defined and we saw a #pragma interface,
2571 we will have CLASSTYPE_INTERFACE_ONLY set but not
2572 CLASSTYPE_INTERFACE_KNOWN. In that case, we don't want to use this
2573 heuristic because someone will supply a #pragma implementation
2574 elsewhere, and deducing it here would produce a conflict. */
2575 if (CLASSTYPE_INTERFACE_ONLY (ctype))
2576 return;
2577
2578 #ifdef VALID_MACHINE_TYPE_ATTRIBUTE
2579 /* FIXME this should really use some sort of target-independent macro. */
2580 if (lookup_attribute ("dllimport", TYPE_ATTRIBUTES (ctype)))
2581 import_export = -1;
2582 else if (lookup_attribute ("dllexport", TYPE_ATTRIBUTES (ctype)))
2583 import_export = 1;
2584 #endif
2585
2586 /* If we got -fno-implicit-templates, we import template classes that
2587 weren't explicitly instantiated. */
2588 if (import_export == 0
2589 && CLASSTYPE_IMPLICIT_INSTANTIATION (ctype)
2590 && ! flag_implicit_templates)
2591 import_export = -1;
2592
2593 /* Base our import/export status on that of the first non-inline,
2594 non-abstract virtual function, if any. */
2595 if (import_export == 0
2596 && TYPE_VIRTUAL_P (ctype)
2597 && ! CLASSTYPE_TEMPLATE_INSTANTIATION (ctype))
2598 {
2599 tree method;
2600 for (method = TYPE_METHODS (ctype); method != NULL_TREE;
2601 method = TREE_CHAIN (method))
2602 {
2603 if (DECL_VINDEX (method) != NULL_TREE
2604 && !DECL_THIS_INLINE (method)
2605 && !DECL_ABSTRACT_VIRTUAL_P (method))
2606 {
2607 import_export = (DECL_REALLY_EXTERN (method) ? -1 : 1);
2608 break;
2609 }
2610 }
2611 }
2612
2613 #ifdef MULTIPLE_SYMBOL_SPACES
2614 if (import_export == -1)
2615 import_export = 0;
2616 #endif
2617
2618 if (import_export)
2619 {
2620 SET_CLASSTYPE_INTERFACE_KNOWN (ctype);
2621 CLASSTYPE_VTABLE_NEEDS_WRITING (ctype) = (import_export > 0);
2622 CLASSTYPE_INTERFACE_ONLY (ctype) = (import_export < 0);
2623 }
2624 }
2625
2626 /* We need to describe to the assembler the relationship between
2627 a vtable and the vtable of the parent class. */
2628
2629 static void
2630 output_vtable_inherit (vars)
2631 tree vars;
2632 {
2633 tree parent;
2634 rtx op[2];
2635
2636 op[0] = XEXP (DECL_RTL (vars), 0); /* strip the mem ref */
2637
2638 parent = binfo_for_vtable (vars);
2639
2640 if (parent == TYPE_BINFO (DECL_CONTEXT (vars)))
2641 op[1] = const0_rtx;
2642 else if (parent)
2643 {
2644 parent = TYPE_BINFO_VTABLE (BINFO_TYPE (parent));
2645 op[1] = XEXP (DECL_RTL (parent), 0); /* strip the mem ref */
2646 }
2647 else
2648 my_friendly_abort (980826);
2649
2650 output_asm_insn (".vtable_inherit %c0, %c1", op);
2651 }
2652
2653 static int
2654 finish_vtable_vardecl (t, data)
2655 tree *t;
2656 void *data ATTRIBUTE_UNUSED;
2657 {
2658 tree vars = *t;
2659 tree ctype = DECL_CONTEXT (vars);
2660 import_export_class (ctype);
2661 import_export_vtable (vars, ctype, 1);
2662
2663 if (! DECL_EXTERNAL (vars)
2664 && (DECL_INTERFACE_KNOWN (vars)
2665 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (vars))
2666 || (hack_decl_function_context (vars) && TREE_USED (vars)))
2667 && ! TREE_ASM_WRITTEN (vars))
2668 {
2669 /* Write it out. */
2670 mark_vtable_entries (vars);
2671 if (TREE_TYPE (DECL_INITIAL (vars)) == 0)
2672 store_init_value (vars, DECL_INITIAL (vars));
2673
2674 if (write_symbols == DWARF_DEBUG || write_symbols == DWARF2_DEBUG)
2675 {
2676 /* Mark the VAR_DECL node representing the vtable itself as a
2677 "gratuitous" one, thereby forcing dwarfout.c to ignore it.
2678 It is rather important that such things be ignored because
2679 any effort to actually generate DWARF for them will run
2680 into trouble when/if we encounter code like:
2681
2682 #pragma interface
2683 struct S { virtual void member (); };
2684
2685 because the artificial declaration of the vtable itself (as
2686 manufactured by the g++ front end) will say that the vtable
2687 is a static member of `S' but only *after* the debug output
2688 for the definition of `S' has already been output. This causes
2689 grief because the DWARF entry for the definition of the vtable
2690 will try to refer back to an earlier *declaration* of the
2691 vtable as a static member of `S' and there won't be one.
2692 We might be able to arrange to have the "vtable static member"
2693 attached to the member list for `S' before the debug info for
2694 `S' get written (which would solve the problem) but that would
2695 require more intrusive changes to the g++ front end. */
2696
2697 DECL_IGNORED_P (vars) = 1;
2698 }
2699
2700 /* Always make vtables weak. */
2701 if (flag_weak)
2702 comdat_linkage (vars);
2703
2704 rest_of_decl_compilation (vars, NULL_PTR, 1, 1);
2705
2706 if (flag_vtable_gc)
2707 output_vtable_inherit (vars);
2708
2709 return 1;
2710 }
2711 else if (! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (vars)))
2712 /* We don't know what to do with this one yet. */
2713 return 0;
2714
2715 *t = TREE_CHAIN (vars);
2716 return 0;
2717 }
2718
2719 static int
2720 prune_vtable_vardecl (t, data)
2721 tree *t;
2722 void *data ATTRIBUTE_UNUSED;
2723 {
2724 *t = TREE_CHAIN (*t);
2725 return 1;
2726 }
2727
2728 static int
2729 finish_sigtable_vardecl (t, data)
2730 tree *t;
2731 void *data ATTRIBUTE_UNUSED;
2732 {
2733 /* We don't need to mark sigtable entries as addressable here as is done
2734 for vtables. Since sigtables, unlike vtables, are always written out,
2735 that was already done in build_signature_table_constructor. */
2736
2737 rest_of_decl_compilation (*t, NULL_PTR, 1, 1);
2738 *t = TREE_CHAIN (*t);
2739 return 1;
2740 }
2741
2742 /* Determines the proper settings of TREE_PUBLIC and DECL_EXTERNAL for an
2743 inline function or template instantiation at end-of-file. */
2744
2745 void
2746 import_export_decl (decl)
2747 tree decl;
2748 {
2749 if (DECL_INTERFACE_KNOWN (decl))
2750 return;
2751
2752 if (DECL_TEMPLATE_INSTANTIATION (decl)
2753 || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl))
2754 {
2755 DECL_NOT_REALLY_EXTERN (decl) = 1;
2756 if ((DECL_IMPLICIT_INSTANTIATION (decl)
2757 || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl))
2758 && (flag_implicit_templates
2759 || (flag_implicit_inline_templates && DECL_THIS_INLINE (decl))))
2760 {
2761 if (!TREE_PUBLIC (decl))
2762 /* Templates are allowed to have internal linkage. See
2763 [basic.link]. */
2764 ;
2765 else
2766 comdat_linkage (decl);
2767 }
2768 else
2769 DECL_NOT_REALLY_EXTERN (decl) = 0;
2770 }
2771 else if (DECL_FUNCTION_MEMBER_P (decl))
2772 {
2773 tree ctype = DECL_CLASS_CONTEXT (decl);
2774 import_export_class (ctype);
2775 if (CLASSTYPE_INTERFACE_KNOWN (ctype)
2776 && (! DECL_ARTIFICIAL (decl) || DECL_VINDEX (decl)))
2777 {
2778 DECL_NOT_REALLY_EXTERN (decl)
2779 = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
2780 || (DECL_THIS_INLINE (decl) && ! flag_implement_inlines
2781 && !DECL_VINDEX (decl)));
2782
2783 /* Always make artificials weak. */
2784 if (DECL_ARTIFICIAL (decl) && flag_weak)
2785 comdat_linkage (decl);
2786 else
2787 maybe_make_one_only (decl);
2788 }
2789 else
2790 comdat_linkage (decl);
2791 }
2792 else if (DECL_TINFO_FN_P (decl))
2793 {
2794 tree ctype = TREE_TYPE (DECL_NAME (decl));
2795
2796 if (IS_AGGR_TYPE (ctype))
2797 import_export_class (ctype);
2798
2799 if (IS_AGGR_TYPE (ctype) && CLASSTYPE_INTERFACE_KNOWN (ctype)
2800 && TYPE_VIRTUAL_P (ctype)
2801 /* If the type is a cv-qualified variant of a type, then we
2802 must emit the tinfo function in this translation unit
2803 since it will not be emitted when the vtable for the type
2804 is output (which is when the unqualified version is
2805 generated). */
2806 && ctype == TYPE_MAIN_VARIANT (ctype))
2807 {
2808 DECL_NOT_REALLY_EXTERN (decl)
2809 = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
2810 || (DECL_THIS_INLINE (decl) && ! flag_implement_inlines
2811 && !DECL_VINDEX (decl)));
2812
2813 /* Always make artificials weak. */
2814 if (flag_weak)
2815 comdat_linkage (decl);
2816 }
2817 else if (TYPE_BUILT_IN (ctype) && ctype == TYPE_MAIN_VARIANT (ctype))
2818 DECL_NOT_REALLY_EXTERN (decl) = 0;
2819 else
2820 comdat_linkage (decl);
2821 }
2822 else
2823 comdat_linkage (decl);
2824
2825 DECL_INTERFACE_KNOWN (decl) = 1;
2826 }
2827
2828 tree
2829 build_cleanup (decl)
2830 tree decl;
2831 {
2832 tree temp;
2833 tree type = TREE_TYPE (decl);
2834
2835 if (TREE_CODE (type) == ARRAY_TYPE)
2836 temp = decl;
2837 else
2838 {
2839 mark_addressable (decl);
2840 temp = build1 (ADDR_EXPR, build_pointer_type (type), decl);
2841 }
2842 temp = build_delete (TREE_TYPE (temp), temp,
2843 integer_two_node,
2844 LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
2845 return temp;
2846 }
2847
2848 extern int parse_time, varconst_time;
2849
2850 static tree
2851 get_sentry (base)
2852 tree base;
2853 {
2854 tree sname = get_id_2 ("__sn", base);
2855 /* For struct X foo __attribute__((weak)), there is a counter
2856 __snfoo. Since base is already an assembler name, sname should
2857 be globally unique */
2858 tree sentry = IDENTIFIER_GLOBAL_VALUE (sname);
2859 if (! sentry)
2860 {
2861 push_obstacks_nochange ();
2862 end_temporary_allocation ();
2863 sentry = build_decl (VAR_DECL, sname, integer_type_node);
2864 TREE_PUBLIC (sentry) = 1;
2865 DECL_ARTIFICIAL (sentry) = 1;
2866 TREE_STATIC (sentry) = 1;
2867 TREE_USED (sentry) = 1;
2868 DECL_COMMON (sentry) = 1;
2869 pushdecl_top_level (sentry);
2870 cp_finish_decl (sentry, NULL_TREE, NULL_TREE, 0, 0);
2871 pop_obstacks ();
2872 }
2873 return sentry;
2874 }
2875
2876 /* Start the process of running a particular set of global constructors
2877 or destructors. Subroutine of do_[cd]tors. */
2878
2879 static void
2880 start_objects (method_type, initp)
2881 int method_type, initp;
2882 {
2883 tree fnname;
2884 char type[10];
2885
2886 /* Make ctor or dtor function. METHOD_TYPE may be 'I' or 'D'. */
2887
2888 if (initp != DEFAULT_INIT_PRIORITY)
2889 {
2890 char joiner;
2891
2892 #ifdef JOINER
2893 joiner = JOINER;
2894 #else
2895 joiner = '_';
2896 #endif
2897
2898 sprintf (type, "%c%c%.5u", method_type, joiner, initp);
2899 }
2900 else
2901 sprintf (type, "%c", method_type);
2902
2903 fnname = get_file_function_name_long (type);
2904
2905 start_function (void_list_node,
2906 make_call_declarator (fnname, void_list_node, NULL_TREE,
2907 NULL_TREE),
2908 NULL_TREE, 0);
2909
2910 #if defined(ASM_OUTPUT_CONSTRUCTOR) && defined(ASM_OUTPUT_DESTRUCTOR)
2911 /* It can be a static function as long as collect2 does not have
2912 to scan the object file to find its ctor/dtor routine. */
2913 TREE_PUBLIC (current_function_decl) = 0;
2914 #endif
2915
2916 store_parm_decls ();
2917 pushlevel (0);
2918 clear_last_expr ();
2919 push_momentary ();
2920 expand_start_bindings (0);
2921
2922 /* We cannot allow these functions to be elided, even if they do not
2923 have external linkage. And, there's no point in deferring
2924 copmilation of thes functions; they're all going to have to be
2925 out anyhow. */
2926 current_function_cannot_inline
2927 = "static constructors and destructors cannot be inlined";
2928 }
2929
2930 /* Finish the process of running a particular set of global constructors
2931 or destructors. Subroutine of do_[cd]tors. */
2932
2933 static void
2934 finish_objects (method_type, initp)
2935 int method_type, initp;
2936 {
2937 char *fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
2938
2939 /* Finish up. */
2940 expand_end_bindings (getdecls (), 1, 0);
2941 poplevel (1, 0, 0);
2942 pop_momentary ();
2943 finish_function (lineno, 0, 0);
2944
2945 if (initp == DEFAULT_INIT_PRIORITY)
2946 {
2947 if (method_type == 'I')
2948 assemble_constructor (fnname);
2949 else
2950 assemble_destructor (fnname);
2951 }
2952
2953 #if defined (ASM_OUTPUT_SECTION_NAME) && defined (ASM_OUTPUT_CONSTRUCTOR)
2954 /* If we're using init priority we can't use assemble_*tor, but on ELF
2955 targets we can stick the references into named sections for GNU ld
2956 to collect. */
2957 else
2958 {
2959 char buf[15];
2960 sprintf (buf, ".%ctors.%.5u", method_type == 'I' ? 'c' : 'd',
2961 /* invert the numbering so the linker puts us in the proper
2962 order; constructors are run from right to left, and the
2963 linker sorts in increasing order. */
2964 MAX_INIT_PRIORITY - initp);
2965 named_section (NULL_TREE, buf, 0);
2966 assemble_integer (gen_rtx_SYMBOL_REF (Pmode, fnname),
2967 POINTER_SIZE / BITS_PER_UNIT, 1);
2968 }
2969 #endif
2970 }
2971
2972 /* The names of the parameters to the function created to handle
2973 initializations and destructions for objects with static storage
2974 duration. */
2975 #define INITIALIZE_P_IDENTIFIER "__initialize_p"
2976 #define PRIORITY_IDENTIFIER "__priority"
2977
2978 /* The name of the function we create to handle initializations and
2979 destructions for objects with static storage duration. */
2980 #define SSDF_IDENTIFIER "__static_initialization_and_destruction"
2981
2982 /* The declaration for the __INITIALIZE_P argument. */
2983 static tree initialize_p_decl;
2984
2985 /* The declaration for the __PRIORITY argument. */
2986 static tree priority_decl;
2987
2988 /* The declaration for the static storage duration function. */
2989 static tree ssdf_decl;
2990
2991 /* All the static storage duration functions created in this
2992 translation unit. */
2993 static varray_type ssdf_decls;
2994 static size_t ssdf_decls_used;
2995
2996 /* A map from priority levels to information about that priority
2997 level. There may be many such levels, so efficient lookup is
2998 important. */
2999 static splay_tree priority_info_map;
3000
3001 /* Begins the generation of the function that will handle all
3002 initialization and destruction of objects with static storage
3003 duration. The function generated takes two parameters of type
3004 `int': __INITIALIZE_P and __PRIORITY. If __INITIALIZE_P is
3005 non-zero, it performs initializations. Otherwise, it performs
3006 destructions. It only performs those initializations or
3007 destructions with the indicated __PRIORITY. The generated function
3008 returns no value.
3009
3010 It is assumed that this function will only be called once per
3011 translation unit. */
3012
3013 static void
3014 start_static_storage_duration_function ()
3015 {
3016 static unsigned ssdf_number;
3017
3018 tree parm_types;
3019 tree type;
3020 char id[sizeof (SSDF_IDENTIFIER) + 1 /* '\0' */ + 32];
3021
3022 /* Create the identifier for this function. It will be of the form
3023 SSDF_IDENTIFIER_<number>. */
3024 sprintf (id, "%s_%u", SSDF_IDENTIFIER, ssdf_number++);
3025 if (ssdf_number == 0)
3026 {
3027 /* Overflow occurred. That means there are at least 4 billion
3028 initialization functions. */
3029 sorry ("too many initialization functions required");
3030 my_friendly_abort (19990430);
3031 }
3032
3033 /* Create the parameters. */
3034 parm_types = void_list_node;
3035 parm_types = perm_tree_cons (NULL_TREE, integer_type_node, parm_types);
3036 parm_types = perm_tree_cons (NULL_TREE, integer_type_node, parm_types);
3037 type = build_function_type (void_type_node, parm_types);
3038
3039 /* Create the FUNCTION_DECL itself. */
3040 ssdf_decl = build_lang_decl (FUNCTION_DECL,
3041 get_identifier (id),
3042 type);
3043 TREE_PUBLIC (ssdf_decl) = 0;
3044 DECL_ARTIFICIAL (ssdf_decl) = 1;
3045
3046 /* Put this function in the list of functions to be called from the
3047 static constructors and destructors. */
3048 if (!ssdf_decls)
3049 {
3050 VARRAY_TREE_INIT (ssdf_decls, 32, "ssdf_decls");
3051
3052 /* Take this opportunity to initialize the map from priority
3053 numbers to information about that priority level. */
3054 priority_info_map = splay_tree_new (splay_tree_compare_ints,
3055 /*delete_key_fn=*/0,
3056 /*delete_value_fn=*/
3057 (splay_tree_delete_value_fn) &free);
3058
3059 /* We always need to generate functions for the
3060 DEFAULT_INIT_PRIORITY so enter it now. That way when we walk
3061 priorities later, we'll be sure to find the
3062 DEFAULT_INIT_PRIORITY. */
3063 get_priority_info (DEFAULT_INIT_PRIORITY);
3064 }
3065
3066 if (ssdf_decls_used == ssdf_decls->num_elements)
3067 VARRAY_GROW (ssdf_decls, 2 * ssdf_decls_used);
3068 VARRAY_TREE (ssdf_decls, ssdf_decls_used) = ssdf_decl;
3069 ++ssdf_decls_used;
3070
3071 /* Create the argument list. */
3072 initialize_p_decl = build_decl (PARM_DECL,
3073 get_identifier (INITIALIZE_P_IDENTIFIER),
3074 integer_type_node);
3075 DECL_CONTEXT (initialize_p_decl) = ssdf_decl;
3076 DECL_ARG_TYPE (initialize_p_decl) = integer_type_node;
3077 TREE_USED (initialize_p_decl) = 1;
3078 priority_decl = build_decl (PARM_DECL, get_identifier (PRIORITY_IDENTIFIER),
3079 integer_type_node);
3080 DECL_CONTEXT (priority_decl) = ssdf_decl;
3081 DECL_ARG_TYPE (priority_decl) = integer_type_node;
3082 TREE_USED (priority_decl) = 1;
3083
3084 TREE_CHAIN (initialize_p_decl) = priority_decl;
3085 DECL_ARGUMENTS (ssdf_decl) = initialize_p_decl;
3086
3087 /* Start the function itself. This is equivalent to declarating the
3088 function as:
3089
3090 static inline void __ssdf (int __initialize_p, init __priority_p);
3091
3092 It is static because we only need to call this function from the
3093 various constructor and destructor functions for this module. */
3094 start_function (/*specs=*/NULL_TREE,
3095 ssdf_decl,
3096 /*attrs=*/NULL_TREE,
3097 /*pre_parsed_p=*/1);
3098
3099 /* Set up the scope of the outermost block in the function. */
3100 store_parm_decls ();
3101 pushlevel (0);
3102 clear_last_expr ();
3103 push_momentary ();
3104 expand_start_bindings (0);
3105
3106 /* This function must not be deferred because we are depending on
3107 its compilation to tell us what is TREE_SYMBOL_REFERENCED. */
3108 current_function_cannot_inline
3109 = "static storage duration functions cannot be inlined";
3110 }
3111
3112 /* Generate the initialization code for the priority indicated in N. */
3113
3114 static int
3115 generate_inits_for_priority (n, data)
3116 splay_tree_node n;
3117 void *data ATTRIBUTE_UNUSED;
3118 {
3119 int priority = (int) n->key;
3120 priority_info pi = (priority_info) n->value;
3121
3122 /* For each priority N which has been used generate code which looks
3123 like:
3124
3125 if (__priority == N) {
3126 if (__initialize_p)
3127 ...
3128 else
3129 ...
3130 }
3131
3132 We use the sequences we've accumulated to fill in the `...'s. */
3133 expand_start_cond (build_binary_op (EQ_EXPR,
3134 priority_decl,
3135 build_int_2 (priority, 0)),
3136 /*exit_flag=*/0);
3137
3138 /* Do the initializations. */
3139 expand_start_cond (build_binary_op (NE_EXPR,
3140 initialize_p_decl,
3141 integer_zero_node),
3142 /*exit_flag=*/0);
3143 if (pi->initialization_sequence)
3144 {
3145 rtx insns;
3146
3147 push_to_sequence (pi->initialization_sequence);
3148 insns = gen_sequence ();
3149 end_sequence ();
3150
3151 emit_insn (insns);
3152 pi->initialization_sequence = NULL_RTX;
3153 pi->initializations_p = 1;
3154 }
3155
3156 /* Do the destructions. */
3157 expand_start_else ();
3158 if (pi->destruction_sequence)
3159 {
3160 rtx insns;
3161
3162 push_to_sequence (pi->destruction_sequence);
3163 insns = gen_sequence ();
3164 end_sequence ();
3165
3166 emit_insn (insns);
3167 pi->destruction_sequence = NULL_RTX;
3168 pi->destructions_p = 1;
3169 }
3170
3171 /* Close out the conditionals. */
3172 expand_end_cond ();
3173 expand_end_cond ();
3174
3175 /* Don't stop iterating. */
3176 return 0;
3177 }
3178
3179 /* Finish the generation of the function which performs initialization
3180 and destruction of objects with static storage duration. After
3181 this point, no more such objects can be created. */
3182
3183 static void
3184 finish_static_storage_duration_function ()
3185 {
3186 splay_tree_foreach (priority_info_map,
3187 generate_inits_for_priority,
3188 /*data=*/0);
3189
3190 /* Close out the function. */
3191 expand_end_bindings (getdecls (), 1, 0);
3192 poplevel (1, 0, 0);
3193 pop_momentary ();
3194 finish_function (lineno, 0, 0);
3195 }
3196
3197 /* Return the information about the indicated PRIORITY level. If no
3198 code to handle this level has yet been generated, generate the
3199 appropriate prologue. */
3200
3201 static priority_info
3202 get_priority_info (priority)
3203 int priority;
3204 {
3205 priority_info pi;
3206 splay_tree_node n;
3207
3208 n = splay_tree_lookup (priority_info_map,
3209 (splay_tree_key) priority);
3210 if (!n)
3211 {
3212 /* Create a new priority information structure, and insert it
3213 into the map. */
3214 pi = (priority_info) xmalloc (sizeof (struct priority_info_s));
3215 pi->initialization_sequence = NULL_RTX;
3216 pi->destruction_sequence = NULL_RTX;
3217 pi->initializations_p = 0;
3218 pi->destructions_p = 0;
3219 splay_tree_insert (priority_info_map,
3220 (splay_tree_key) priority,
3221 (splay_tree_value) pi);
3222 }
3223 else
3224 pi = (priority_info) n->value;
3225
3226 return pi;
3227 }
3228
3229 /* Generate code to do the static initialization of DECL. The
3230 initialization is INIT. If DECL may be initialized more than once
3231 in different object files, SENTRY is the guard variable to
3232 check. PRIORITY is the priority for the initialization. */
3233
3234 static void
3235 do_static_initialization (decl, init, sentry, priority)
3236 tree decl;
3237 tree init;
3238 tree sentry;
3239 int priority;
3240 {
3241 priority_info pi;
3242
3243 /* Get the priority information for this PRIORITY, */
3244 pi = get_priority_info (priority);
3245 if (!pi->initialization_sequence)
3246 start_sequence ();
3247 else
3248 push_to_sequence (pi->initialization_sequence);
3249
3250 /* Tell the debugger that we are at the location of the static
3251 variable in question. */
3252 emit_note (input_filename, lineno);
3253
3254 /* If there's a SENTRY, we only do the initialization if it is
3255 zero, i.e., if we are the first to initialize it. */
3256 if (sentry)
3257 expand_start_cond (build_binary_op (EQ_EXPR,
3258 build_unary_op (PREINCREMENT_EXPR,
3259 sentry,
3260 /*noconvert=*/0),
3261 integer_one_node),
3262 /*exit_flag=*/0);
3263
3264 /* Prepare a binding level for temporaries created during the
3265 initialization. */
3266 expand_start_target_temps ();
3267
3268 if (IS_AGGR_TYPE (TREE_TYPE (decl))
3269 || TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
3270 expand_aggr_init (decl, init, 0);
3271 else if (TREE_CODE (init) == TREE_VEC)
3272 expand_expr (expand_vec_init (decl, TREE_VEC_ELT (init, 0),
3273 TREE_VEC_ELT (init, 1),
3274 TREE_VEC_ELT (init, 2), 0),
3275 const0_rtx, VOIDmode, EXPAND_NORMAL);
3276 else
3277 expand_assignment (decl, init, 0, 0);
3278
3279 /* The expression might have involved increments and decrements. */
3280 emit_queue ();
3281
3282 /* Cleanup any temporaries needed for the initial value. */
3283 expand_end_target_temps ();
3284
3285 /* Cleanup any deferred pops from function calls. This would be done
3286 by expand_end_cond, but we also need it when !SENTRY, since we are
3287 constructing these sequences by parts. */
3288 do_pending_stack_adjust ();
3289
3290 /* Close the conditional opened above. */
3291 if (sentry)
3292 expand_end_cond ();
3293
3294 /* Save the sequence for later use. */
3295 pi->initialization_sequence = get_insns ();
3296 end_sequence ();
3297 }
3298
3299 /* Generate code to do the static destruction of DECL. If DECL may be
3300 initialized more than once in different object files, SENTRY is the
3301 guard variable to check. PRIORITY is the priority for the
3302 destruction. */
3303
3304 static void
3305 do_static_destruction (decl, sentry, priority)
3306 tree decl;
3307 tree sentry;
3308 int priority;
3309 {
3310 rtx new_insns;
3311 priority_info pi;
3312
3313 /* If we don't need a destructor, there's nothing to do. */
3314 if (!TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (decl)))
3315 return;
3316
3317 /* Get the priority information for this PRIORITY, */
3318 pi = get_priority_info (priority);
3319 if (!pi->destruction_sequence)
3320 start_sequence ();
3321 else
3322 push_to_sequence (pi->destruction_sequence);
3323
3324 /* Start a new sequence to handle just this destruction. */
3325 start_sequence ();
3326
3327 /* Tell the debugger that we are at the location of the static
3328 variable in question. */
3329 emit_note (input_filename, lineno);
3330
3331 /* If there's a SENTRY, we only do the destruction if it is one,
3332 i.e., if we are the last to destroy it. */
3333 if (sentry)
3334 expand_start_cond (build_binary_op (EQ_EXPR,
3335 build_unary_op (PREDECREMENT_EXPR,
3336 sentry,
3337 /*nonconvert=*/1),
3338 integer_zero_node),
3339 /*exit_flag=*/0);
3340
3341 /* Actually to the destruction. */
3342 expand_expr_stmt (build_cleanup (decl));
3343
3344 /* Cleanup any deferred pops from function calls. This would be done
3345 by expand_end_cond, but we also need it when !SENTRY, since we are
3346 constructing these sequences by parts. */
3347 do_pending_stack_adjust ();
3348
3349 /* Close the conditional opened above. */
3350 if (sentry)
3351 expand_end_cond ();
3352
3353 /* Insert the NEW_INSNS before the current insns. (Destructions are
3354 run in reverse order of initializations.) */
3355 new_insns = gen_sequence ();
3356 end_sequence ();
3357 if (pi->destruction_sequence)
3358 emit_insn_before (new_insns, pi->destruction_sequence);
3359 else
3360 emit_insn (new_insns);
3361
3362 /* Save the sequence for later use. */
3363 pi->destruction_sequence = get_insns ();
3364 end_sequence ();
3365 }
3366
3367 /* Add code to the static storage duration function that will handle
3368 DECL (a static variable that needs initializing and/or destruction)
3369 with the indicated PRIORITY. If DECL needs initializing, INIT is
3370 the initializer. */
3371
3372 static void
3373 do_static_initialization_and_destruction (decl, init)
3374 tree decl;
3375 tree init;
3376 {
3377 tree sentry = NULL_TREE;
3378 int priority;
3379
3380 /* Deal gracefully with error. */
3381 if (decl == error_mark_node)
3382 return;
3383
3384 /* The only things that can be initialized are variables. */
3385 my_friendly_assert (TREE_CODE (decl) == VAR_DECL, 19990420);
3386
3387 /* If this object is not defined, we don't need to do anything
3388 here. */
3389 if (DECL_EXTERNAL (decl))
3390 return;
3391
3392 /* Also, if the initializer already contains errors, we can bail out
3393 now. */
3394 if (init && TREE_CODE (init) == TREE_LIST
3395 && value_member (error_mark_node, init))
3396 return;
3397
3398 /* Trick the compiler into thinking we are at the file and line
3399 where DECL was declared so that error-messages make sense, and so
3400 that the debugger will show somewhat sensible file and line
3401 information. */
3402 input_filename = DECL_SOURCE_FILE (decl);
3403 lineno = DECL_SOURCE_LINE (decl);
3404
3405 /* Because of:
3406
3407 [class.access.spec]
3408
3409 Access control for implicit calls to the constructors,
3410 the conversion functions, or the destructor called to
3411 create and destroy a static data member is performed as
3412 if these calls appeared in the scope of the member's
3413 class.
3414
3415 we pretend we are in a static member function of the class of
3416 which the DECL is a member. */
3417 if (member_p (decl))
3418 {
3419 DECL_CLASS_CONTEXT (current_function_decl) = DECL_CONTEXT (decl);
3420 DECL_STATIC_FUNCTION_P (current_function_decl) = 1;
3421 }
3422
3423 /* We need a sentry if this is an object with external linkage that
3424 might be initialized in more than one place. */
3425 if (TREE_PUBLIC (decl) && (DECL_COMMON (decl)
3426 || DECL_ONE_ONLY (decl)
3427 || DECL_WEAK (decl)))
3428 sentry = get_sentry (DECL_ASSEMBLER_NAME (decl));
3429
3430 /* Generate the code to actually do the intialization and
3431 destruction. */
3432 priority = DECL_INIT_PRIORITY (decl);
3433 if (!priority)
3434 priority = DEFAULT_INIT_PRIORITY;
3435 do_static_initialization (decl, init, sentry, priority);
3436 do_static_destruction (decl, sentry, priority);
3437
3438 /* Now that we're done with DECL we don't need to pretend to be a
3439 member of its class any longer. */
3440 DECL_CLASS_CONTEXT (current_function_decl) = NULL_TREE;
3441 DECL_STATIC_FUNCTION_P (current_function_decl) = 0;
3442 }
3443
3444 /* Generate a static constructor (if CONSTRUCTOR_P) or destructor
3445 (otherwise) that will initialize all gobal objects with static
3446 storage duration having the indicated PRIORITY. */
3447
3448 static void
3449 generate_ctor_or_dtor_function (constructor_p, priority)
3450 int constructor_p;
3451 int priority;
3452 {
3453 char function_key;
3454 tree arguments;
3455 size_t i;
3456
3457 /* We use `I' to indicate initialization and `D' to indicate
3458 destruction. */
3459 if (constructor_p)
3460 function_key = 'I';
3461 else
3462 function_key = 'D';
3463
3464 /* Begin the function. */
3465 start_objects (function_key, priority);
3466
3467 /* Call the static storage duration function with appropriate
3468 arguments. */
3469 for (i = 0; i < ssdf_decls_used; ++i)
3470 {
3471 arguments = tree_cons (NULL_TREE, build_int_2 (priority, 0),
3472 NULL_TREE);
3473 arguments = tree_cons (NULL_TREE, build_int_2 (constructor_p, 0),
3474 arguments);
3475 expand_expr_stmt (build_function_call (VARRAY_TREE (ssdf_decls, i),
3476 arguments));
3477 }
3478
3479 /* If we're generating code for the DEFAULT_INIT_PRIORITY, throw in
3480 calls to any functions marked with attributes indicating that
3481 they should be called at initialization- or destruction-time. */
3482 if (priority == DEFAULT_INIT_PRIORITY)
3483 {
3484 tree fns;
3485
3486 for (fns = constructor_p ? static_ctors : static_dtors;
3487 fns;
3488 fns = TREE_CHAIN (fns))
3489 expand_expr_stmt (build_function_call (TREE_VALUE (fns), NULL_TREE));
3490 }
3491
3492 /* Close out the function. */
3493 finish_objects (function_key, priority);
3494 }
3495
3496 /* Generate constructor and destructor functions for the priority
3497 indicated by N. */
3498
3499 static int
3500 generate_ctor_and_dtor_functions_for_priority (n, data)
3501 splay_tree_node n;
3502 void *data ATTRIBUTE_UNUSED;
3503 {
3504 int priority = (int) n->key;
3505 priority_info pi = (priority_info) n->value;
3506
3507 /* Generate the functions themselves, but only if they are really
3508 needed. */
3509 if (pi->initializations_p
3510 || (priority == DEFAULT_INIT_PRIORITY && static_ctors))
3511 generate_ctor_or_dtor_function (/*constructor_p=*/1,
3512 priority);
3513 if (pi->destructions_p
3514 || (priority == DEFAULT_INIT_PRIORITY && static_dtors))
3515 generate_ctor_or_dtor_function (/*constructor_p=*/0,
3516 priority);
3517
3518 /* Keep iterating. */
3519 return 0;
3520 }
3521
3522 /* This routine is called from the last rule in yyparse ().
3523 Its job is to create all the code needed to initialize and
3524 destroy the global aggregates. We do the destruction
3525 first, since that way we only need to reverse the decls once. */
3526
3527 void
3528 finish_file ()
3529 {
3530 extern int lineno;
3531 int start_time, this_time;
3532 tree vars;
3533 int reconsider;
3534 size_t i;
3535
3536 at_eof = 1;
3537
3538 /* Bad parse errors. Just forget about it. */
3539 if (! global_bindings_p () || current_class_type || decl_namespace_list)
3540 return;
3541
3542 start_time = get_run_time ();
3543
3544 /* Otherwise, GDB can get confused, because in only knows
3545 about source for LINENO-1 lines. */
3546 lineno -= 1;
3547
3548 interface_unknown = 1;
3549 interface_only = 0;
3550
3551 /* We now have to write out all the stuff we put off writing out.
3552 These include:
3553
3554 o Template specializations that we have not yet instantiated,
3555 but which are needed.
3556 o Initialization and destruction for non-local objects with
3557 static storage duration. (Local objects with static storage
3558 duration are initialized when their scope is first entered,
3559 and are cleaned up via atexit.)
3560 o Virtual function tables.
3561
3562 All of these may cause others to be needed. For example,
3563 instantiating one function may cause another to be needed, and
3564 generating the intiailzer for an object may cause templates to be
3565 instantiated, etc., etc. */
3566
3567 this_time = get_run_time ();
3568 parse_time -= this_time - start_time;
3569 varconst_time += this_time - start_time;
3570 start_time = get_run_time ();
3571 permanent_allocation (1);
3572
3573 do
3574 {
3575 /* We need to start a new initialization function each time
3576 through the loop. That's because we need to know which
3577 vtables have been referenced, and TREE_SYMBOL_REFERENCED
3578 isn't computed until a function is finished, and written out.
3579 That's a deficiency in the back-end. When this is fixed,
3580 these initialization functions could all become inline, with
3581 resulting performance improvements. */
3582 start_static_storage_duration_function ();
3583 push_to_top_level ();
3584
3585 reconsider = 0;
3586
3587 /* If there are templates that we've put off instantiating, do
3588 them now. */
3589 instantiate_pending_templates ();
3590
3591 /* Write out signature-tables and virtual tables as required.
3592 Note that writing out the virtual table for a template class
3593 may cause the instantiation of members of that class. */
3594 if (flag_handle_signatures
3595 && walk_globals (sigtable_decl_p,
3596 finish_sigtable_vardecl,
3597 /*data=*/0))
3598 reconsider = 1;
3599 if (walk_globals (vtable_decl_p,
3600 finish_vtable_vardecl,
3601 /*data=*/0))
3602 reconsider = 1;
3603
3604 /* Come back to the static storage duration function; we're
3605 about to emit instructions there for static initializations
3606 and such. */
3607 pop_from_top_level ();
3608 /* The list of objects with static storage duration is built up
3609 in reverse order, so we reverse it here. We also clear
3610 STATIC_AGGREGATES so that any new aggregates added during the
3611 initialization of these will be initialized in the correct
3612 order when we next come around the loop. */
3613 vars = nreverse (static_aggregates);
3614 static_aggregates = NULL_TREE;
3615 while (vars)
3616 {
3617 if (! TREE_ASM_WRITTEN (TREE_VALUE (vars)))
3618 rest_of_decl_compilation (TREE_VALUE (vars), 0, 1, 1);
3619 do_static_initialization_and_destruction (TREE_VALUE (vars),
3620 TREE_PURPOSE (vars));
3621 reconsider = 1;
3622 vars = TREE_CHAIN (vars);
3623 }
3624
3625 /* Finish up the static storage duration function for this
3626 round. */
3627 finish_static_storage_duration_function ();
3628
3629 /* Go through the various inline functions, and see if any need
3630 synthesizing. */
3631 for (i = 0; i < saved_inlines_used; ++i)
3632 {
3633 tree decl = VARRAY_TREE (saved_inlines, i);
3634 import_export_decl (decl);
3635 if (DECL_ARTIFICIAL (decl) && ! DECL_INITIAL (decl)
3636 && TREE_USED (decl)
3637 && (! DECL_REALLY_EXTERN (decl) || DECL_INLINE (decl)))
3638 {
3639 /* Even though we're already at the top-level, we push
3640 there again. That way, when we pop back a few lines
3641 hence, all of our state is restored. Otherwise,
3642 finish_function doesn't clean things up, and we end
3643 up with CURRENT_FUNCTION_DECL set. */
3644 push_to_top_level ();
3645 if (DECL_TINFO_FN_P (decl))
3646 synthesize_tinfo_fn (decl);
3647 else
3648 synthesize_method (decl);
3649 pop_from_top_level ();
3650 reconsider = 1;
3651 }
3652 }
3653
3654 /* Mark all functions that might deal with exception-handling as
3655 referenced. */
3656 mark_all_runtime_matches ();
3657
3658 /* We lie to the back-end, pretending that some functions are
3659 not defined when they really are. This keeps these functions
3660 from being put out unncessarily. But, we must stop lying
3661 when the functions are referenced, or if they are not comdat
3662 since they need to be put out now. */
3663 for (i = 0; i < saved_inlines_used; ++i)
3664 {
3665 tree decl = VARRAY_TREE (saved_inlines, i);
3666
3667 if (DECL_NOT_REALLY_EXTERN (decl)
3668 && DECL_INITIAL (decl)
3669 && (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
3670 || !DECL_COMDAT (decl)))
3671 DECL_EXTERNAL (decl) = 0;
3672 }
3673
3674 if (saved_inlines_used
3675 && wrapup_global_declarations (&VARRAY_TREE (saved_inlines, 0),
3676 saved_inlines_used))
3677 reconsider = 1;
3678 if (walk_namespaces (wrapup_globals_for_namespace, /*data=*/0))
3679 reconsider = 1;
3680
3681 /* Static data members are just like namespace-scope globals. */
3682 for (i = 0; i < pending_statics_used; ++i)
3683 {
3684 tree decl = VARRAY_TREE (pending_statics, i);
3685 if (TREE_ASM_WRITTEN (decl))
3686 continue;
3687 import_export_decl (decl);
3688 if (DECL_NOT_REALLY_EXTERN (decl) && ! DECL_IN_AGGR_P (decl))
3689 DECL_EXTERNAL (decl) = 0;
3690 }
3691 if (pending_statics
3692 && wrapup_global_declarations (&VARRAY_TREE (pending_statics, 0),
3693 pending_statics_used))
3694 reconsider = 1;
3695 }
3696 while (reconsider);
3697
3698 /* We give C linkage to static constructors and destructors. */
3699 push_lang_context (lang_name_c);
3700
3701 /* Generate initialization and destruction functions for all
3702 priorities for which they are required. */
3703 if (priority_info_map)
3704 splay_tree_foreach (priority_info_map,
3705 generate_ctor_and_dtor_functions_for_priority,
3706 /*data=*/0);
3707
3708 /* We're done with the splay-tree now. */
3709 if (priority_info_map)
3710 splay_tree_delete (priority_info_map);
3711
3712 /* We're done with static constructors, so we can go back to "C++"
3713 linkage now. */
3714 pop_lang_context ();
3715
3716 /* Now delete from the chain of variables all virtual function tables.
3717 We output them all ourselves, because each will be treated
3718 specially. */
3719 walk_globals (vtable_decl_p, prune_vtable_vardecl, /*data=*/0);
3720
3721 /* Now, issue warnings about static, but not defined, functions,
3722 etc. */
3723 walk_namespaces (wrapup_globals_for_namespace, /*data=*/&reconsider);
3724
3725 finish_repo ();
3726
3727 this_time = get_run_time ();
3728 parse_time -= this_time - start_time;
3729 varconst_time += this_time - start_time;
3730
3731 if (flag_detailed_statistics)
3732 {
3733 dump_tree_statistics ();
3734 dump_time_statistics ();
3735 }
3736 }
3737
3738 /* This is something of the form 'A()()()()()+1' that has turned out to be an
3739 expr. Since it was parsed like a type, we need to wade through and fix
3740 that. Unfortunately, since operator() is left-associative, we can't use
3741 tail recursion. In the above example, TYPE is `A', and DECL is
3742 `()()()()()'.
3743
3744 Maybe this shouldn't be recursive, but how often will it actually be
3745 used? (jason) */
3746
3747 tree
3748 reparse_absdcl_as_expr (type, decl)
3749 tree type, decl;
3750 {
3751 /* do build_functional_cast (type, NULL_TREE) at bottom */
3752 if (TREE_OPERAND (decl, 0) == NULL_TREE)
3753 return build_functional_cast (type, NULL_TREE);
3754
3755 /* recurse */
3756 decl = reparse_absdcl_as_expr (type, TREE_OPERAND (decl, 0));
3757
3758 decl = build_x_function_call (decl, NULL_TREE, current_class_ref);
3759
3760 if (TREE_CODE (decl) == CALL_EXPR
3761 && (! TREE_TYPE (decl)
3762 || TREE_CODE (TREE_TYPE (decl)) != VOID_TYPE))
3763 decl = require_complete_type (decl);
3764
3765 return decl;
3766 }
3767
3768 /* This is something of the form `int ((int)(int)(int)1)' that has turned
3769 out to be an expr. Since it was parsed like a type, we need to wade
3770 through and fix that. Since casts are right-associative, we are
3771 reversing the order, so we don't have to recurse.
3772
3773 In the above example, DECL is the `(int)(int)(int)', and EXPR is the
3774 `1'. */
3775
3776 tree
3777 reparse_absdcl_as_casts (decl, expr)
3778 tree decl, expr;
3779 {
3780 tree type;
3781
3782 if (TREE_CODE (expr) == CONSTRUCTOR
3783 && TREE_TYPE (expr) == 0)
3784 {
3785 type = groktypename (TREE_VALUE (TREE_OPERAND (decl, 1)));
3786 decl = TREE_OPERAND (decl, 0);
3787
3788 if (IS_SIGNATURE (type))
3789 {
3790 error ("cast specifies signature type");
3791 return error_mark_node;
3792 }
3793
3794 expr = digest_init (type, expr, (tree *) 0);
3795 if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0)
3796 {
3797 int failure = complete_array_type (type, expr, 1);
3798 if (failure)
3799 my_friendly_abort (78);
3800 }
3801 }
3802
3803 while (decl)
3804 {
3805 type = groktypename (TREE_VALUE (TREE_OPERAND (decl, 1)));
3806 decl = TREE_OPERAND (decl, 0);
3807 expr = build_c_cast (type, expr);
3808 }
3809
3810 if (warn_old_style_cast)
3811 warning ("use of old-style cast");
3812
3813 return expr;
3814 }
3815
3816 /* Given plain tree nodes for an expression, build up the full semantics. */
3817
3818 tree
3819 build_expr_from_tree (t)
3820 tree t;
3821 {
3822 if (t == NULL_TREE || t == error_mark_node)
3823 return t;
3824
3825 switch (TREE_CODE (t))
3826 {
3827 case IDENTIFIER_NODE:
3828 return do_identifier (t, 0, NULL_TREE);
3829
3830 case LOOKUP_EXPR:
3831 if (LOOKUP_EXPR_GLOBAL (t))
3832 return do_scoped_id (TREE_OPERAND (t, 0), 0);
3833 else
3834 return do_identifier (TREE_OPERAND (t, 0), 0, NULL_TREE);
3835
3836 case TEMPLATE_ID_EXPR:
3837 return (lookup_template_function
3838 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3839 build_expr_from_tree (TREE_OPERAND (t, 1))));
3840
3841 case INDIRECT_REF:
3842 return build_x_indirect_ref
3843 (build_expr_from_tree (TREE_OPERAND (t, 0)), "unary *");
3844
3845 case CAST_EXPR:
3846 return build_functional_cast
3847 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3848
3849 case REINTERPRET_CAST_EXPR:
3850 return build_reinterpret_cast
3851 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3852
3853 case CONST_CAST_EXPR:
3854 return build_const_cast
3855 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3856
3857 case DYNAMIC_CAST_EXPR:
3858 return build_dynamic_cast
3859 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3860
3861 case STATIC_CAST_EXPR:
3862 return build_static_cast
3863 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3864
3865 case PREDECREMENT_EXPR:
3866 case PREINCREMENT_EXPR:
3867 case POSTDECREMENT_EXPR:
3868 case POSTINCREMENT_EXPR:
3869 case NEGATE_EXPR:
3870 case BIT_NOT_EXPR:
3871 case ABS_EXPR:
3872 case TRUTH_NOT_EXPR:
3873 case ADDR_EXPR:
3874 case CONVERT_EXPR: /* Unary + */
3875 if (TREE_TYPE (t))
3876 return t;
3877 return build_x_unary_op (TREE_CODE (t),
3878 build_expr_from_tree (TREE_OPERAND (t, 0)));
3879
3880 case PLUS_EXPR:
3881 case MINUS_EXPR:
3882 case MULT_EXPR:
3883 case TRUNC_DIV_EXPR:
3884 case CEIL_DIV_EXPR:
3885 case FLOOR_DIV_EXPR:
3886 case ROUND_DIV_EXPR:
3887 case EXACT_DIV_EXPR:
3888 case BIT_AND_EXPR:
3889 case BIT_ANDTC_EXPR:
3890 case BIT_IOR_EXPR:
3891 case BIT_XOR_EXPR:
3892 case TRUNC_MOD_EXPR:
3893 case FLOOR_MOD_EXPR:
3894 case TRUTH_ANDIF_EXPR:
3895 case TRUTH_ORIF_EXPR:
3896 case TRUTH_AND_EXPR:
3897 case TRUTH_OR_EXPR:
3898 case RSHIFT_EXPR:
3899 case LSHIFT_EXPR:
3900 case RROTATE_EXPR:
3901 case LROTATE_EXPR:
3902 case EQ_EXPR:
3903 case NE_EXPR:
3904 case MAX_EXPR:
3905 case MIN_EXPR:
3906 case LE_EXPR:
3907 case GE_EXPR:
3908 case LT_EXPR:
3909 case GT_EXPR:
3910 case MEMBER_REF:
3911 return build_x_binary_op
3912 (TREE_CODE (t),
3913 build_expr_from_tree (TREE_OPERAND (t, 0)),
3914 build_expr_from_tree (TREE_OPERAND (t, 1)));
3915
3916 case DOTSTAR_EXPR:
3917 return build_m_component_ref
3918 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3919 build_expr_from_tree (TREE_OPERAND (t, 1)));
3920
3921 case SCOPE_REF:
3922 return build_offset_ref (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1));
3923
3924 case ARRAY_REF:
3925 if (TREE_OPERAND (t, 0) == NULL_TREE)
3926 /* new-type-id */
3927 return build_parse_node (ARRAY_REF, NULL_TREE,
3928 build_expr_from_tree (TREE_OPERAND (t, 1)));
3929 return grok_array_decl (build_expr_from_tree (TREE_OPERAND (t, 0)),
3930 build_expr_from_tree (TREE_OPERAND (t, 1)));
3931
3932 case SIZEOF_EXPR:
3933 case ALIGNOF_EXPR:
3934 {
3935 tree r = build_expr_from_tree (TREE_OPERAND (t, 0));
3936 if (TREE_CODE_CLASS (TREE_CODE (r)) != 't')
3937 r = TREE_TYPE (r);
3938 return TREE_CODE (t) == SIZEOF_EXPR ? c_sizeof (r) : c_alignof (r);
3939 }
3940
3941 case MODOP_EXPR:
3942 return build_x_modify_expr
3943 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3944 TREE_CODE (TREE_OPERAND (t, 1)),
3945 build_expr_from_tree (TREE_OPERAND (t, 2)));
3946
3947 case ARROW_EXPR:
3948 return build_x_arrow
3949 (build_expr_from_tree (TREE_OPERAND (t, 0)));
3950
3951 case NEW_EXPR:
3952 return build_new
3953 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3954 build_expr_from_tree (TREE_OPERAND (t, 1)),
3955 build_expr_from_tree (TREE_OPERAND (t, 2)),
3956 NEW_EXPR_USE_GLOBAL (t));
3957
3958 case DELETE_EXPR:
3959 return delete_sanity
3960 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3961 build_expr_from_tree (TREE_OPERAND (t, 1)),
3962 DELETE_EXPR_USE_VEC (t), DELETE_EXPR_USE_GLOBAL (t));
3963
3964 case COMPOUND_EXPR:
3965 if (TREE_OPERAND (t, 1) == NULL_TREE)
3966 return build_x_compound_expr
3967 (build_expr_from_tree (TREE_OPERAND (t, 0)));
3968 else
3969 my_friendly_abort (42);
3970
3971 case METHOD_CALL_EXPR:
3972 if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF)
3973 {
3974 tree ref = TREE_OPERAND (t, 0);
3975 return build_scoped_method_call
3976 (build_expr_from_tree (TREE_OPERAND (t, 1)),
3977 build_expr_from_tree (TREE_OPERAND (ref, 0)),
3978 TREE_OPERAND (ref, 1),
3979 build_expr_from_tree (TREE_OPERAND (t, 2)));
3980 }
3981 else
3982 {
3983 tree fn = TREE_OPERAND (t, 0);
3984
3985 /* We can get a TEMPLATE_ID_EXPR here on code like:
3986
3987 x->f<2>();
3988
3989 so we must resolve that. However, we can also get things
3990 like a BIT_NOT_EXPR here, when referring to a destructor,
3991 and things like that are not correctly resolved by
3992 build_expr_from_tree. So, just use build_expr_from_tree
3993 when we really need it. */
3994 if (TREE_CODE (fn) == TEMPLATE_ID_EXPR)
3995 fn = build_expr_from_tree (fn);
3996
3997 return build_method_call
3998 (build_expr_from_tree (TREE_OPERAND (t, 1)),
3999 fn,
4000 build_expr_from_tree (TREE_OPERAND (t, 2)),
4001 NULL_TREE, LOOKUP_NORMAL);
4002 }
4003
4004 case CALL_EXPR:
4005 if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF)
4006 {
4007 tree ref = TREE_OPERAND (t, 0);
4008 return build_member_call
4009 (build_expr_from_tree (TREE_OPERAND (ref, 0)),
4010 TREE_OPERAND (ref, 1),
4011 build_expr_from_tree (TREE_OPERAND (t, 1)));
4012 }
4013 else
4014 {
4015 tree name = TREE_OPERAND (t, 0);
4016 tree id;
4017 tree args = build_expr_from_tree (TREE_OPERAND (t, 1));
4018 if (args != NULL_TREE && TREE_CODE (name) == LOOKUP_EXPR
4019 && !LOOKUP_EXPR_GLOBAL (name)
4020 && TREE_CODE ((id = TREE_OPERAND (name, 0))) == IDENTIFIER_NODE
4021 && (!current_class_type
4022 || !lookup_member (current_class_type, id, 0, 0)))
4023 {
4024 /* Do Koenig lookup if there are no class members. */
4025 name = do_identifier (id, 0, args);
4026 }
4027 else if (TREE_CODE (name) == TEMPLATE_ID_EXPR
4028 || ! really_overloaded_fn (name))
4029 name = build_expr_from_tree (name);
4030 return build_x_function_call (name, args, current_class_ref);
4031 }
4032
4033 case COND_EXPR:
4034 return build_x_conditional_expr
4035 (build_expr_from_tree (TREE_OPERAND (t, 0)),
4036 build_expr_from_tree (TREE_OPERAND (t, 1)),
4037 build_expr_from_tree (TREE_OPERAND (t, 2)));
4038
4039 case TREE_LIST:
4040 {
4041 tree purpose, value, chain;
4042
4043 if (t == void_list_node)
4044 return t;
4045
4046 purpose = TREE_PURPOSE (t);
4047 if (purpose)
4048 purpose = build_expr_from_tree (purpose);
4049 value = TREE_VALUE (t);
4050 if (value)
4051 value = build_expr_from_tree (value);
4052 chain = TREE_CHAIN (t);
4053 if (chain && chain != void_type_node)
4054 chain = build_expr_from_tree (chain);
4055 return expr_tree_cons (purpose, value, chain);
4056 }
4057
4058 case COMPONENT_REF:
4059 return build_x_component_ref
4060 (build_expr_from_tree (TREE_OPERAND (t, 0)),
4061 TREE_OPERAND (t, 1), NULL_TREE, 1);
4062
4063 case THROW_EXPR:
4064 return build_throw (build_expr_from_tree (TREE_OPERAND (t, 0)));
4065
4066 case CONSTRUCTOR:
4067 {
4068 tree r;
4069
4070 /* digest_init will do the wrong thing if we let it. */
4071 if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
4072 return t;
4073
4074 r = build_nt (CONSTRUCTOR, NULL_TREE,
4075 build_expr_from_tree (CONSTRUCTOR_ELTS (t)));
4076 TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t);
4077
4078 if (TREE_TYPE (t))
4079 return digest_init (TREE_TYPE (t), r, 0);
4080 return r;
4081 }
4082
4083 case TYPEID_EXPR:
4084 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 0))) == 't')
4085 return get_typeid (TREE_OPERAND (t, 0));
4086 return build_x_typeid (build_expr_from_tree (TREE_OPERAND (t, 0)));
4087
4088 case VAR_DECL:
4089 return convert_from_reference (t);
4090
4091 default:
4092 return t;
4093 }
4094 }
4095
4096 /* This is something of the form `int (*a)++' that has turned out to be an
4097 expr. It was only converted into parse nodes, so we need to go through
4098 and build up the semantics. Most of the work is done by
4099 build_expr_from_tree, above.
4100
4101 In the above example, TYPE is `int' and DECL is `*a'. */
4102
4103 tree
4104 reparse_decl_as_expr (type, decl)
4105 tree type, decl;
4106 {
4107 decl = build_expr_from_tree (decl);
4108 if (type)
4109 return build_functional_cast (type, build_expr_list (NULL_TREE, decl));
4110 else
4111 return decl;
4112 }
4113
4114 /* This is something of the form `int (*a)' that has turned out to be a
4115 decl. It was only converted into parse nodes, so we need to do the
4116 checking that make_{pointer,reference}_declarator do. */
4117
4118 tree
4119 finish_decl_parsing (decl)
4120 tree decl;
4121 {
4122 extern int current_class_depth;
4123
4124 switch (TREE_CODE (decl))
4125 {
4126 case IDENTIFIER_NODE:
4127 return decl;
4128 case INDIRECT_REF:
4129 return make_pointer_declarator
4130 (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0)));
4131 case ADDR_EXPR:
4132 return make_reference_declarator
4133 (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0)));
4134 case BIT_NOT_EXPR:
4135 TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0));
4136 return decl;
4137 case SCOPE_REF:
4138 push_nested_class (TREE_TYPE (TREE_OPERAND (decl, 0)), 3);
4139 TREE_COMPLEXITY (decl) = current_class_depth;
4140 return decl;
4141 case ARRAY_REF:
4142 TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0));
4143 return decl;
4144 case TREE_LIST:
4145 /* For attribute handling. */
4146 TREE_VALUE (decl) = finish_decl_parsing (TREE_VALUE (decl));
4147 return decl;
4148 default:
4149 my_friendly_abort (5);
4150 return NULL_TREE;
4151 }
4152 }
4153
4154 tree
4155 check_cp_case_value (value)
4156 tree value;
4157 {
4158 if (value == NULL_TREE)
4159 return value;
4160
4161 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
4162 STRIP_TYPE_NOPS (value);
4163
4164 if (TREE_READONLY_DECL_P (value))
4165 {
4166 value = decl_constant_value (value);
4167 STRIP_TYPE_NOPS (value);
4168 }
4169 value = fold (value);
4170
4171 if (TREE_CODE (value) != INTEGER_CST
4172 && value != error_mark_node)
4173 {
4174 cp_error ("case label `%E' does not reduce to an integer constant",
4175 value);
4176 value = error_mark_node;
4177 }
4178 else
4179 /* Promote char or short to int. */
4180 value = default_conversion (value);
4181
4182 constant_expression_warning (value);
4183
4184 return value;
4185 }
4186
4187 /* Return 1 if root encloses child. */
4188
4189 static int
4190 is_namespace_ancestor (root, child)
4191 tree root, child;
4192 {
4193 if (root == child)
4194 return 1;
4195 if (root == global_namespace)
4196 return 1;
4197 if (child == global_namespace)
4198 return 0;
4199 return is_namespace_ancestor (root, CP_DECL_CONTEXT (child));
4200 }
4201
4202
4203 /* Return the namespace that is the common ancestor
4204 of two given namespaces. */
4205
4206 tree
4207 namespace_ancestor (ns1, ns2)
4208 tree ns1, ns2;
4209 {
4210 if (is_namespace_ancestor (ns1, ns2))
4211 return ns1;
4212 return namespace_ancestor (CP_DECL_CONTEXT (ns1), ns2);
4213 }
4214
4215 /* Insert used into the using list of user. Set indirect_flag if this
4216 directive is not directly from the source. Also find the common
4217 ancestor and let our users know about the new namespace */
4218 static void
4219 add_using_namespace (user, used, indirect)
4220 tree user;
4221 tree used;
4222 int indirect;
4223 {
4224 tree t;
4225 /* Using oneself is a no-op. */
4226 if (user == used)
4227 return;
4228 my_friendly_assert (TREE_CODE (user) == NAMESPACE_DECL, 380);
4229 my_friendly_assert (TREE_CODE (used) == NAMESPACE_DECL, 380);
4230 /* Check if we already have this. */
4231 t = purpose_member (used, DECL_NAMESPACE_USING (user));
4232 if (t != NULL_TREE)
4233 {
4234 if (!indirect)
4235 /* Promote to direct usage. */
4236 TREE_INDIRECT_USING (t) = 0;
4237 return;
4238 }
4239
4240 /* Add used to the user's using list. */
4241 DECL_NAMESPACE_USING (user)
4242 = perm_tree_cons (used, namespace_ancestor (user, used),
4243 DECL_NAMESPACE_USING (user));
4244
4245 TREE_INDIRECT_USING (DECL_NAMESPACE_USING (user)) = indirect;
4246
4247 /* Add user to the used's users list. */
4248 DECL_NAMESPACE_USERS (used)
4249 = perm_tree_cons (user, 0, DECL_NAMESPACE_USERS (used));
4250
4251 /* Recursively add all namespaces used. */
4252 for (t = DECL_NAMESPACE_USING (used); t; t = TREE_CHAIN (t))
4253 /* indirect usage */
4254 add_using_namespace (user, TREE_PURPOSE (t), 1);
4255
4256 /* Tell everyone using us about the new used namespaces. */
4257 for (t = DECL_NAMESPACE_USERS (user); t; t = TREE_CHAIN (t))
4258 add_using_namespace (TREE_PURPOSE (t), used, 1);
4259 }
4260
4261 /* Combines two sets of overloaded functions into an OVERLOAD chain, removing
4262 duplicates. The first list becomes the tail of the result.
4263
4264 The algorithm is O(n^2). We could get this down to O(n log n) by
4265 doing a sort on the addresses of the functions, if that becomes
4266 necessary. */
4267
4268 static tree
4269 merge_functions (s1, s2)
4270 tree s1;
4271 tree s2;
4272 {
4273 for (; s2; s2 = OVL_NEXT (s2))
4274 {
4275 tree fn = OVL_CURRENT (s2);
4276 if (! ovl_member (fn, s1))
4277 s1 = build_overload (fn, s1);
4278 }
4279 return s1;
4280 }
4281
4282 /* This should return an error not all definitions define functions.
4283 It is not an error if we find two functions with exactly the
4284 same signature, only if these are selected in overload resolution.
4285 old is the current set of bindings, new the freshly-found binding.
4286 XXX Do we want to give *all* candidates in case of ambiguity?
4287 XXX In what way should I treat extern declarations?
4288 XXX I don't want to repeat the entire duplicate_decls here */
4289
4290 static tree
4291 ambiguous_decl (name, old, new, flags)
4292 tree name;
4293 tree old;
4294 tree new;
4295 int flags;
4296 {
4297 tree val, type;
4298 my_friendly_assert (old != NULL_TREE, 393);
4299 /* Copy the value. */
4300 val = BINDING_VALUE (new);
4301 if (val)
4302 switch (TREE_CODE (val))
4303 {
4304 case TEMPLATE_DECL:
4305 /* If we expect types or namespaces, and not templates,
4306 or this is not a template class. */
4307 if (LOOKUP_QUALIFIERS_ONLY (flags)
4308 && !DECL_CLASS_TEMPLATE_P (val))
4309 val = NULL_TREE;
4310 break;
4311 case TYPE_DECL:
4312 if (LOOKUP_NAMESPACES_ONLY (flags))
4313 val = NULL_TREE;
4314 break;
4315 case NAMESPACE_DECL:
4316 if (LOOKUP_TYPES_ONLY (flags))
4317 val = NULL_TREE;
4318 break;
4319 default:
4320 if (LOOKUP_QUALIFIERS_ONLY (flags))
4321 val = NULL_TREE;
4322 }
4323
4324 if (!BINDING_VALUE (old))
4325 BINDING_VALUE (old) = val;
4326 else if (val && val != BINDING_VALUE (old))
4327 {
4328 if (is_overloaded_fn (BINDING_VALUE (old))
4329 && is_overloaded_fn (val))
4330 {
4331 BINDING_VALUE (old) = merge_functions (BINDING_VALUE (old),
4332 val);
4333 }
4334 else
4335 {
4336 /* Some declarations are functions, some are not. */
4337 if (flags & LOOKUP_COMPLAIN)
4338 {
4339 /* If we've already given this error for this lookup,
4340 BINDING_VALUE (old) is error_mark_node, so let's not
4341 repeat ourselves. */
4342 if (BINDING_VALUE (old) != error_mark_node)
4343 {
4344 cp_error ("use of `%D' is ambiguous", name);
4345 cp_error_at (" first declared as `%#D' here",
4346 BINDING_VALUE (old));
4347 }
4348 cp_error_at (" also declared as `%#D' here", val);
4349 }
4350 return error_mark_node;
4351 }
4352 }
4353 /* ... and copy the type. */
4354 type = BINDING_TYPE (new);
4355 if (LOOKUP_NAMESPACES_ONLY (flags))
4356 type = NULL_TREE;
4357 if (!BINDING_TYPE (old))
4358 BINDING_TYPE (old) = type;
4359 else if (type && BINDING_TYPE (old) != type)
4360 {
4361 if (flags & LOOKUP_COMPLAIN)
4362 {
4363 cp_error ("`%D' denotes an ambiguous type",name);
4364 cp_error_at (" first type here", BINDING_TYPE (old));
4365 cp_error_at (" other type here", type);
4366 }
4367 }
4368 return old;
4369 }
4370
4371 /* Add the bindings of name in used namespaces to val.
4372 The using list is defined by usings, and the lookup goes to scope.
4373 Returns zero on errors. */
4374
4375 int
4376 lookup_using_namespace (name, val, usings, scope, flags)
4377 tree name, val, usings, scope;
4378 int flags;
4379 {
4380 tree iter;
4381 tree val1;
4382 /* Iterate over all used namespaces in current, searching for using
4383 directives of scope. */
4384 for (iter = usings; iter; iter = TREE_CHAIN (iter))
4385 if (TREE_VALUE (iter) == scope)
4386 {
4387 val1 = binding_for_name (name, TREE_PURPOSE (iter));
4388 /* Resolve ambiguities. */
4389 val = ambiguous_decl (name, val, val1, flags);
4390 }
4391 return val != error_mark_node;
4392 }
4393
4394 /* [namespace.qual]
4395 Excepts the name to lookup and its qualifying scope.
4396 Returns the name/type pair found into the CPLUS_BINDING result,
4397 or 0 on error. */
4398
4399 int
4400 qualified_lookup_using_namespace (name, scope, result, flags)
4401 tree name;
4402 tree scope;
4403 tree result;
4404 int flags;
4405 {
4406 /* Maintain a list of namespaces visited... */
4407 tree seen = NULL_TREE;
4408 /* ... and a list of namespace yet to see. */
4409 tree todo = NULL_TREE;
4410 tree usings;
4411 while (scope && (result != error_mark_node))
4412 {
4413 seen = temp_tree_cons (scope, NULL_TREE, seen);
4414 result = ambiguous_decl (name, result,
4415 binding_for_name (name, scope), flags);
4416 if (!BINDING_VALUE (result) && !BINDING_TYPE (result))
4417 /* Consider using directives. */
4418 for (usings = DECL_NAMESPACE_USING (scope); usings;
4419 usings = TREE_CHAIN (usings))
4420 /* If this was a real directive, and we have not seen it. */
4421 if (!TREE_INDIRECT_USING (usings)
4422 && !purpose_member (TREE_PURPOSE (usings), seen))
4423 todo = temp_tree_cons (TREE_PURPOSE (usings), NULL_TREE, todo);
4424 if (todo)
4425 {
4426 scope = TREE_PURPOSE (todo);
4427 todo = TREE_CHAIN (todo);
4428 }
4429 else
4430 scope = NULL_TREE; /* If there never was a todo list. */
4431 }
4432 return result != error_mark_node;
4433 }
4434
4435 /* [namespace.memdef]/2 */
4436
4437 /* Set the context of a declaration to scope. Complain if we are not
4438 outside scope. */
4439
4440 void
4441 set_decl_namespace (decl, scope, friendp)
4442 tree decl;
4443 tree scope;
4444 int friendp;
4445 {
4446 tree old;
4447 if (scope == std_node)
4448 scope = global_namespace;
4449 /* Get rid of namespace aliases. */
4450 scope = ORIGINAL_NAMESPACE (scope);
4451
4452 /* It is ok for friends to be qualified in parallel space. */
4453 if (!friendp && !is_namespace_ancestor (current_namespace, scope))
4454 cp_error ("declaration of `%D' not in a namespace surrounding `%D'",
4455 decl, scope);
4456 DECL_CONTEXT (decl) = FROB_CONTEXT (scope);
4457 if (scope != current_namespace)
4458 {
4459 /* See whether this has been declared in the namespace. */
4460 old = namespace_binding (DECL_NAME (decl), scope);
4461 if (!old)
4462 /* No old declaration at all. */
4463 goto complain;
4464 if (!is_overloaded_fn (decl))
4465 /* Don't compare non-function decls with decls_match here,
4466 since it can't check for the correct constness at this
4467 point. pushdecl will find those errors later. */
4468 return;
4469 /* Since decl is a function, old should contain a function decl. */
4470 if (!is_overloaded_fn (old))
4471 goto complain;
4472 for (; old; old = OVL_NEXT (old))
4473 if (decls_match (decl, OVL_CURRENT (old)))
4474 return;
4475 }
4476 else
4477 return;
4478 complain:
4479 cp_error ("`%D' should have been declared inside `%D'",
4480 decl, scope);
4481 }
4482
4483 /* Compute the namespace where a declaration is defined. */
4484
4485 static tree
4486 decl_namespace (decl)
4487 tree decl;
4488 {
4489 while (DECL_CONTEXT (decl))
4490 {
4491 decl = DECL_CONTEXT (decl);
4492 if (TREE_CODE (decl) == NAMESPACE_DECL)
4493 return decl;
4494 if (TREE_CODE_CLASS (TREE_CODE (decl)) == 't')
4495 decl = TYPE_STUB_DECL (decl);
4496 my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (decl)) == 'd', 390);
4497 }
4498
4499 return global_namespace;
4500 }
4501
4502 /* Return the namespace where the current declaration is declared. */
4503
4504 tree
4505 current_decl_namespace ()
4506 {
4507 tree result;
4508 /* If we have been pushed into a different namespace, use it. */
4509 if (decl_namespace_list)
4510 return TREE_PURPOSE (decl_namespace_list);
4511
4512 if (current_class_type)
4513 result = decl_namespace (TYPE_STUB_DECL (current_class_type));
4514 else if (current_function_decl)
4515 result = decl_namespace (current_function_decl);
4516 else
4517 result = current_namespace;
4518 return result;
4519 }
4520
4521 /* Temporarily set the namespace for the current declaration. */
4522
4523 void
4524 push_decl_namespace (decl)
4525 tree decl;
4526 {
4527 if (TREE_CODE (decl) != NAMESPACE_DECL)
4528 decl = decl_namespace (decl);
4529 decl_namespace_list = tree_cons (decl, NULL_TREE, decl_namespace_list);
4530 }
4531
4532 void
4533 pop_decl_namespace ()
4534 {
4535 decl_namespace_list = TREE_CHAIN (decl_namespace_list);
4536 }
4537
4538 /* Enter a class or namespace scope. */
4539
4540 void
4541 push_scope (t)
4542 tree t;
4543 {
4544 if (TREE_CODE (t) == NAMESPACE_DECL)
4545 push_decl_namespace (t);
4546 else
4547 pushclass (t, 2);
4548 }
4549
4550 /* Leave scope pushed by push_scope. */
4551
4552 void
4553 pop_scope (t)
4554 tree t;
4555 {
4556 if (TREE_CODE (t) == NAMESPACE_DECL)
4557 pop_decl_namespace ();
4558 else
4559 popclass ();
4560 }
4561
4562 /* [basic.lookup.koenig] */
4563 /* A non-zero return value in the functions below indicates an error.
4564 All nodes allocated in the procedure are on the scratch obstack. */
4565
4566 struct arg_lookup
4567 {
4568 tree name;
4569 tree namespaces;
4570 tree classes;
4571 tree functions;
4572 };
4573
4574 static int arg_assoc PROTO((struct arg_lookup*, tree));
4575 static int arg_assoc_args PROTO((struct arg_lookup*, tree));
4576 static int arg_assoc_type PROTO((struct arg_lookup*, tree));
4577 static int add_function PROTO((struct arg_lookup *, tree));
4578 static int arg_assoc_namespace PROTO((struct arg_lookup *, tree));
4579 static int arg_assoc_class PROTO((struct arg_lookup *, tree));
4580
4581 /* Add a function to the lookup structure.
4582 Returns 1 on error. */
4583
4584 static int
4585 add_function (k, fn)
4586 struct arg_lookup *k;
4587 tree fn;
4588 {
4589 if (ovl_member (fn, k->functions))
4590 return 0;
4591 /* We must find only functions, or exactly one non-function. */
4592 if (k->functions && is_overloaded_fn (k->functions)
4593 && is_overloaded_fn (fn))
4594 k->functions = build_overload (fn, k->functions);
4595 else
4596 if(k->functions)
4597 {
4598 tree f1 = OVL_CURRENT (k->functions);
4599 tree f2 = fn;
4600 if (is_overloaded_fn (f1))
4601 {
4602 fn = f1; f1 = f2; f2 = fn;
4603 }
4604 cp_error_at ("`%D' is not a function,", f1);
4605 cp_error_at (" conflict with `%D'", f2);
4606 cp_error (" in call to `%D'", k->name);
4607 return 1;
4608 }
4609 else
4610 k->functions = fn;
4611 return 0;
4612 }
4613
4614 /* Add functions of a namespace to the lookup structure.
4615 Returns 1 on error. */
4616
4617 static int
4618 arg_assoc_namespace (k, scope)
4619 struct arg_lookup *k;
4620 tree scope;
4621 {
4622 tree value;
4623
4624 if (purpose_member (scope, k->namespaces))
4625 return 0;
4626 k->namespaces = tree_cons (scope, NULL_TREE, k->namespaces);
4627
4628 value = namespace_binding (k->name, scope);
4629 if (!value)
4630 return 0;
4631
4632 for (; value; value = OVL_NEXT (value))
4633 if (add_function (k, OVL_CURRENT (value)))
4634 return 1;
4635
4636 return 0;
4637 }
4638
4639 /* Adds everything associated with class to the lookup structure.
4640 Returns 1 on error. */
4641
4642 static int
4643 arg_assoc_class (k, type)
4644 struct arg_lookup* k;
4645 tree type;
4646 {
4647 tree list, friends, context;
4648 int i;
4649
4650 if (purpose_member (type, k->classes))
4651 return 0;
4652 k->classes = tree_cons (type, NULL_TREE, k->classes);
4653
4654 context = decl_namespace (TYPE_MAIN_DECL (type));
4655 if (arg_assoc_namespace (k, context))
4656 return 1;
4657
4658 /* Process baseclasses. */
4659 for (i = 0; i < CLASSTYPE_N_BASECLASSES (type); i++)
4660 if (arg_assoc_class (k, TYPE_BINFO_BASETYPE (type, i)))
4661 return 1;
4662
4663 /* Process friends. */
4664 for (list = DECL_FRIENDLIST (TYPE_MAIN_DECL (type)); list;
4665 list = TREE_CHAIN (list))
4666 if (k->name == TREE_PURPOSE (list))
4667 for (friends = TREE_VALUE (list); friends;
4668 friends = TREE_CHAIN (friends))
4669 /* Only interested in global functions with potentially hidden
4670 (i.e. unqualified) declarations. */
4671 if (TREE_PURPOSE (list) == error_mark_node && TREE_VALUE (list)
4672 && decl_namespace (TREE_VALUE (list)) == context)
4673 if (add_function (k, TREE_VALUE (list)))
4674 return 1;
4675
4676 /* Process template arguments. */
4677 if (CLASSTYPE_TEMPLATE_INFO (type))
4678 {
4679 list = innermost_args (CLASSTYPE_TI_ARGS (type));
4680 for (i = 0; i < TREE_VEC_LENGTH (list); ++i)
4681 arg_assoc (k, TREE_VEC_ELT (list, i));
4682 }
4683
4684 return 0;
4685 }
4686
4687 /* Adds everything associated with a given type.
4688 Returns 1 on error. */
4689
4690 static int
4691 arg_assoc_type (k, type)
4692 struct arg_lookup *k;
4693 tree type;
4694 {
4695 switch (TREE_CODE (type))
4696 {
4697 case VOID_TYPE:
4698 case INTEGER_TYPE:
4699 case REAL_TYPE:
4700 case COMPLEX_TYPE:
4701 case CHAR_TYPE:
4702 case BOOLEAN_TYPE:
4703 return 0;
4704 case RECORD_TYPE:
4705 if (TYPE_PTRMEMFUNC_P (type))
4706 return arg_assoc_type (k, TYPE_PTRMEMFUNC_FN_TYPE (type));
4707 return arg_assoc_class (k, type);
4708 case POINTER_TYPE:
4709 case REFERENCE_TYPE:
4710 case ARRAY_TYPE:
4711 return arg_assoc_type (k, TREE_TYPE (type));
4712 case UNION_TYPE:
4713 case ENUMERAL_TYPE:
4714 return arg_assoc_namespace (k, decl_namespace (TYPE_MAIN_DECL (type)));
4715 case OFFSET_TYPE:
4716 /* Pointer to member: associate class type and value type. */
4717 if (arg_assoc_type (k, TYPE_OFFSET_BASETYPE (type)))
4718 return 1;
4719 return arg_assoc_type (k, TREE_TYPE (type));
4720 case METHOD_TYPE:
4721 /* The basetype is referenced in the first arg type, so just
4722 fall through. */
4723 case FUNCTION_TYPE:
4724 /* Associate the parameter types. */
4725 if (arg_assoc_args (k, TYPE_ARG_TYPES (type)))
4726 return 1;
4727 /* Associate the return type. */
4728 return arg_assoc_type (k, TREE_TYPE (type));
4729 case TEMPLATE_TYPE_PARM:
4730 case TEMPLATE_TEMPLATE_PARM:
4731 return 0;
4732 case LANG_TYPE:
4733 if (type == unknown_type_node)
4734 return 0;
4735 /* else fall through */
4736 default:
4737 my_friendly_abort (390);
4738 }
4739 return 0;
4740 }
4741
4742 /* Adds everything associated with arguments. Returns 1 on error. */
4743
4744 static int
4745 arg_assoc_args (k, args)
4746 struct arg_lookup* k;
4747 tree args;
4748 {
4749 for (; args; args = TREE_CHAIN (args))
4750 if (arg_assoc (k, TREE_VALUE (args)))
4751 return 1;
4752 return 0;
4753 }
4754
4755 /* Adds everything associated with a given tree_node. Returns 1 on error. */
4756
4757 static int
4758 arg_assoc (k, n)
4759 struct arg_lookup* k;
4760 tree n;
4761 {
4762 if (n == error_mark_node)
4763 return 0;
4764
4765 if (TREE_CODE_CLASS (TREE_CODE (n)) == 't')
4766 return arg_assoc_type (k, n);
4767
4768 if (! type_unknown_p (n))
4769 return arg_assoc_type (k, TREE_TYPE (n));
4770
4771 if (TREE_CODE (n) == ADDR_EXPR)
4772 n = TREE_OPERAND (n, 0);
4773 if (TREE_CODE (n) == COMPONENT_REF)
4774 n = TREE_OPERAND (n, 1);
4775 if (TREE_CODE (n) == OFFSET_REF)
4776 n = TREE_OPERAND (n, 1);
4777 while (TREE_CODE (n) == TREE_LIST)
4778 n = TREE_VALUE (n);
4779
4780 if (TREE_CODE (n) == FUNCTION_DECL)
4781 return arg_assoc_type (k, TREE_TYPE (n));
4782 if (TREE_CODE (n) == TEMPLATE_ID_EXPR)
4783 {
4784 /* [basic.lookup.koenig]
4785
4786 If T is a template-id, its associated namespaces and classes
4787 are the namespace in which the template is defined; for
4788 member templates, the member template's class; the namespaces
4789 and classes associated with the types of the template
4790 arguments provided for template type parameters (excluding
4791 template template parameters); the namespaces in which any
4792 template template arguments are defined; and the classes in
4793 which any member templates used as template template
4794 arguments are defined. [Note: non-type template arguments do
4795 not contribute to the set of associated namespaces. ] */
4796 tree template = TREE_OPERAND (n, 0);
4797 tree args = TREE_OPERAND (n, 1);
4798 tree ctx;
4799 tree arg;
4800
4801 /* First, the template. There may actually be more than one if
4802 this is an overloaded function template. But, in that case,
4803 we only need the first; all the functions will be in the same
4804 namespace. */
4805 template = OVL_CURRENT (template);
4806
4807 ctx = CP_DECL_CONTEXT (template);
4808
4809 if (TREE_CODE (ctx) == NAMESPACE_DECL)
4810 {
4811 if (arg_assoc_namespace (k, ctx) == 1)
4812 return 1;
4813 }
4814 /* It must be a member template. */
4815 else if (arg_assoc_class (k, ctx) == 1)
4816 return 1;
4817
4818 /* Now the arguments. */
4819 for (arg = args; arg != NULL_TREE; arg = TREE_CHAIN (arg))
4820 {
4821 tree t = TREE_VALUE (arg);
4822
4823 if (TREE_CODE (t) == TEMPLATE_DECL)
4824 {
4825 ctx = CP_DECL_CONTEXT (t);
4826 if (TREE_CODE (ctx) == NAMESPACE_DECL)
4827 {
4828 if (arg_assoc_namespace (k, ctx) == 1)
4829 return 1;
4830 }
4831 else if (arg_assoc_class (k, ctx) == 1)
4832 return 1;
4833 }
4834 else if (TREE_CODE_CLASS (TREE_CODE (t)) == 't'
4835 && arg_assoc_type (k, t) == 1)
4836 return 1;
4837 }
4838 }
4839 else
4840 {
4841 my_friendly_assert (TREE_CODE (n) == OVERLOAD, 980715);
4842
4843 for (; n; n = OVL_CHAIN (n))
4844 if (arg_assoc_type (k, TREE_TYPE (OVL_FUNCTION (n))))
4845 return 1;
4846 }
4847
4848 return 0;
4849 }
4850
4851 /* Performs Koenig lookup depending on arguments, where fns
4852 are the functions found in normal lookup. */
4853
4854 tree
4855 lookup_arg_dependent (name, fns, args)
4856 tree name;
4857 tree fns;
4858 tree args;
4859 {
4860 struct arg_lookup k;
4861 k.name = name;
4862 k.functions = fns;
4863 k.namespaces = NULL_TREE;
4864 k.classes = NULL_TREE;
4865
4866 push_scratch_obstack ();
4867 arg_assoc_args (&k, args);
4868 pop_obstacks ();
4869 return k.functions;
4870 }
4871
4872 /* Process a namespace-alias declaration. */
4873
4874 void
4875 do_namespace_alias (alias, namespace)
4876 tree alias, namespace;
4877 {
4878 if (TREE_CODE (namespace) != NAMESPACE_DECL)
4879 {
4880 /* The parser did not find it, so it's not there. */
4881 cp_error ("unknown namespace `%D'", namespace);
4882 return;
4883 }
4884
4885 namespace = ORIGINAL_NAMESPACE (namespace);
4886
4887 /* Build the alias. */
4888 alias = build_lang_decl (NAMESPACE_DECL, alias, void_type_node);
4889 DECL_NAMESPACE_ALIAS (alias) = namespace;
4890 pushdecl (alias);
4891 }
4892
4893 /* Check a non-member using-declaration. Return the name and scope
4894 being used, and the USING_DECL, or NULL_TREE on failure. */
4895
4896 static tree
4897 validate_nonmember_using_decl (decl, scope, name)
4898 tree decl;
4899 tree *scope;
4900 tree *name;
4901 {
4902 if (TREE_CODE (decl) == SCOPE_REF
4903 && TREE_OPERAND (decl, 0) == std_node)
4904 {
4905 if (namespace_bindings_p ()
4906 && current_namespace == global_namespace)
4907 /* There's no need for a using declaration at all, here,
4908 since `std' is the same as `::'. We can't just pass this
4909 on because we'll complain later about declaring something
4910 in the same scope as a using declaration with the same
4911 name. We return NULL_TREE which indicates to the caller
4912 that there's no need to do any further processing. */
4913 return NULL_TREE;
4914
4915 *scope = global_namespace;
4916 *name = TREE_OPERAND (decl, 1);
4917 }
4918 else if (TREE_CODE (decl) == SCOPE_REF)
4919 {
4920 *scope = TREE_OPERAND (decl, 0);
4921 *name = TREE_OPERAND (decl, 1);
4922
4923 /* [namespace.udecl]
4924
4925 A using-declaration for a class member shall be a
4926 member-declaration. */
4927 if (TREE_CODE (*scope) != NAMESPACE_DECL)
4928 {
4929 if (TYPE_P (*scope))
4930 cp_error ("`%T' is not a namespace", *scope);
4931 else
4932 cp_error ("`%D' is not a namespace", *scope);
4933 return NULL_TREE;
4934 }
4935 }
4936 else if (TREE_CODE (decl) == IDENTIFIER_NODE
4937 || TREE_CODE (decl) == TYPE_DECL
4938 || TREE_CODE (decl) == TEMPLATE_DECL)
4939 {
4940 *scope = global_namespace;
4941 *name = decl;
4942 }
4943 else
4944 my_friendly_abort (382);
4945 if (TREE_CODE_CLASS (TREE_CODE (*name)) == 'd')
4946 *name = DECL_NAME (*name);
4947 /* Make a USING_DECL. */
4948 return push_using_decl (*scope, *name);
4949 }
4950
4951 /* Process local and global using-declarations. */
4952
4953 static void
4954 do_nonmember_using_decl (scope, name, oldval, oldtype, newval, newtype)
4955 tree scope, name;
4956 tree oldval, oldtype;
4957 tree *newval, *newtype;
4958 {
4959 tree decls;
4960 struct tree_binding _decls;
4961
4962 *newval = *newtype = NULL_TREE;
4963 decls = binding_init (&_decls);
4964 if (!qualified_lookup_using_namespace (name, scope, decls, 0))
4965 /* Lookup error */
4966 return;
4967
4968 if (!BINDING_VALUE (decls) && !BINDING_TYPE (decls))
4969 {
4970 cp_error ("`%D' not declared", name);
4971 return;
4972 }
4973
4974 /* Check for using functions. */
4975 if (BINDING_VALUE (decls) && is_overloaded_fn (BINDING_VALUE (decls)))
4976 {
4977 tree tmp, tmp1;
4978
4979 if (oldval && !is_overloaded_fn (oldval))
4980 {
4981 duplicate_decls (OVL_CURRENT (BINDING_VALUE (decls)), oldval);
4982 oldval = NULL_TREE;
4983 }
4984
4985 *newval = oldval;
4986 for (tmp = BINDING_VALUE (decls); tmp; tmp = OVL_NEXT (tmp))
4987 {
4988 tree new_fn = OVL_CURRENT (tmp);
4989
4990 /* [namespace.udecl]
4991
4992 If a function declaration in namespace scope or block
4993 scope has the same name and the same parameter types as a
4994 function introduced by a using declaration the program is
4995 ill-formed. */
4996 for (tmp1 = oldval; tmp1; tmp1 = OVL_NEXT (tmp1))
4997 {
4998 tree old_fn = OVL_CURRENT (tmp1);
4999
5000 if (!OVL_USED (tmp1)
5001 && compparms (TYPE_ARG_TYPES (TREE_TYPE (new_fn)),
5002 TYPE_ARG_TYPES (TREE_TYPE (old_fn))))
5003 {
5004 /* There was already a non-using declaration in
5005 this scope with the same parameter types. */
5006 cp_error ("`%D' is already declared in this scope",
5007 name);
5008 break;
5009 }
5010 else if (duplicate_decls (new_fn, old_fn))
5011 /* We're re-using something we already used
5012 before. We don't need to add it again. */
5013 break;
5014 }
5015
5016 /* If we broke out of the loop, there's no reason to add
5017 this function to the using declarations for this
5018 scope. */
5019 if (tmp1)
5020 continue;
5021
5022 *newval = build_overload (OVL_CURRENT (tmp), *newval);
5023 if (TREE_CODE (*newval) != OVERLOAD)
5024 *newval = ovl_cons (*newval, NULL_TREE);
5025 OVL_USED (*newval) = 1;
5026 }
5027 }
5028 else
5029 {
5030 *newval = BINDING_VALUE (decls);
5031 if (oldval)
5032 duplicate_decls (*newval, oldval);
5033 }
5034
5035 *newtype = BINDING_TYPE (decls);
5036 if (oldtype && *newtype && oldtype != *newtype)
5037 {
5038 cp_error ("using directive `%D' introduced ambiguous type `%T'",
5039 name, oldtype);
5040 return;
5041 }
5042 }
5043
5044 /* Process a using-declaration not appearing in class or local scope. */
5045
5046 void
5047 do_toplevel_using_decl (decl)
5048 tree decl;
5049 {
5050 tree scope, name, binding;
5051 tree oldval, oldtype, newval, newtype;
5052
5053 decl = validate_nonmember_using_decl (decl, &scope, &name);
5054 if (decl == NULL_TREE)
5055 return;
5056
5057 binding = binding_for_name (name, current_namespace);
5058
5059 oldval = BINDING_VALUE (binding);
5060 oldtype = BINDING_TYPE (binding);
5061
5062 do_nonmember_using_decl (scope, name, oldval, oldtype, &newval, &newtype);
5063
5064 /* Copy declarations found. */
5065 if (newval)
5066 BINDING_VALUE (binding) = newval;
5067 if (newtype)
5068 BINDING_TYPE (binding) = newtype;
5069 return;
5070 }
5071
5072 /* Process a using-declaration at function scope. */
5073
5074 void
5075 do_local_using_decl (decl)
5076 tree decl;
5077 {
5078 tree scope, name;
5079 tree oldval, oldtype, newval, newtype;
5080
5081 decl = validate_nonmember_using_decl (decl, &scope, &name);
5082 if (decl == NULL_TREE)
5083 return;
5084
5085 oldval = lookup_name_current_level (name);
5086 oldtype = lookup_type_current_level (name);
5087
5088 do_nonmember_using_decl (scope, name, oldval, oldtype, &newval, &newtype);
5089
5090 if (newval)
5091 {
5092 if (is_overloaded_fn (newval))
5093 {
5094 tree fn, term;
5095
5096 /* We only need to push declarations for those functions
5097 that were not already bound in the current level.
5098 The old value might be NULL_TREE, it might be a single
5099 function, or an OVERLOAD. */
5100 if (oldval && TREE_CODE (oldval) == OVERLOAD)
5101 term = OVL_FUNCTION (oldval);
5102 else
5103 term = oldval;
5104 for (fn = newval; fn && OVL_CURRENT (fn) != term;
5105 fn = OVL_NEXT (fn))
5106 push_overloaded_decl (OVL_CURRENT (fn),
5107 PUSH_LOCAL | PUSH_USING);
5108 }
5109 else
5110 push_local_binding (name, newval, PUSH_USING);
5111 }
5112 if (newtype)
5113 set_identifier_type_value (name, newtype);
5114 }
5115
5116 tree
5117 do_class_using_decl (decl)
5118 tree decl;
5119 {
5120 tree name, value;
5121
5122 if (TREE_CODE (decl) != SCOPE_REF
5123 || TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (decl, 0))) != 't')
5124 {
5125 cp_error ("using-declaration for non-member at class scope");
5126 return NULL_TREE;
5127 }
5128 name = TREE_OPERAND (decl, 1);
5129 if (TREE_CODE (name) == BIT_NOT_EXPR)
5130 {
5131 cp_error ("using-declaration for destructor");
5132 return NULL_TREE;
5133 }
5134 if (TREE_CODE (name) == TYPE_DECL)
5135 name = DECL_NAME (name);
5136
5137 my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 980716);
5138
5139 value = build_lang_field_decl (USING_DECL, name, void_type_node);
5140 DECL_INITIAL (value) = TREE_OPERAND (decl, 0);
5141 return value;
5142 }
5143
5144 /* Process a using-directive. */
5145
5146 void
5147 do_using_directive (namespace)
5148 tree namespace;
5149 {
5150 if (namespace == std_node)
5151 return;
5152 /* using namespace A::B::C; */
5153 if (TREE_CODE (namespace) == SCOPE_REF)
5154 namespace = TREE_OPERAND (namespace, 1);
5155 if (TREE_CODE (namespace) == IDENTIFIER_NODE)
5156 {
5157 /* Lookup in lexer did not find a namespace. */
5158 cp_error ("namespace `%T' undeclared", namespace);
5159 return;
5160 }
5161 if (TREE_CODE (namespace) != NAMESPACE_DECL)
5162 {
5163 cp_error ("`%T' is not a namespace", namespace);
5164 return;
5165 }
5166 namespace = ORIGINAL_NAMESPACE (namespace);
5167 if (!toplevel_bindings_p ())
5168 push_using_directive (namespace);
5169 else
5170 /* direct usage */
5171 add_using_namespace (current_namespace, namespace, 0);
5172 }
5173
5174 void
5175 check_default_args (x)
5176 tree x;
5177 {
5178 tree arg = TYPE_ARG_TYPES (TREE_TYPE (x));
5179 int saw_def = 0, i = 0 - (TREE_CODE (TREE_TYPE (x)) == METHOD_TYPE);
5180 for (; arg && arg != void_list_node; arg = TREE_CHAIN (arg), ++i)
5181 {
5182 if (TREE_PURPOSE (arg))
5183 saw_def = 1;
5184 else if (saw_def)
5185 {
5186 cp_error_at ("default argument missing for parameter %P of `%+#D'",
5187 i, x);
5188 break;
5189 }
5190 }
5191 }
5192
5193 void
5194 mark_used (decl)
5195 tree decl;
5196 {
5197 TREE_USED (decl) = 1;
5198 if (processing_template_decl)
5199 return;
5200 assemble_external (decl);
5201
5202 /* Is it a synthesized method that needs to be synthesized? */
5203 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_CLASS_CONTEXT (decl)
5204 && DECL_ARTIFICIAL (decl) && ! DECL_INITIAL (decl)
5205 /* Kludge: don't synthesize for default args. */
5206 && current_function_decl)
5207 synthesize_method (decl);
5208
5209 /* If this is a function or variable that is an instance of some
5210 template, we now know that we will need to actually do the
5211 instantiation. A TEMPLATE_DECL may also have DECL_TEMPLATE_INFO,
5212 if it's a partial instantiation, but there's no need to
5213 instantiate such a thing. We check that DECL is not an explicit
5214 instantiation because that is not checked in instantiate_decl. */
5215 if (TREE_CODE (decl) != TEMPLATE_DECL
5216 && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)
5217 && !DECL_EXPLICIT_INSTANTIATION (decl))
5218 instantiate_decl (decl);
5219 }
5220
5221 /* Helper function for named_class_head_sans_basetype nonterminal. We
5222 have just seen something of the form `AGGR SCOPE::ID'. Return a
5223 TYPE_DECL for the type declared by ID in SCOPE. */
5224
5225 tree
5226 handle_class_head (aggr, scope, id)
5227 tree aggr, scope, id;
5228 {
5229 tree decl;
5230
5231 if (TREE_CODE (id) == TYPE_DECL)
5232 decl = id;
5233 else if (DECL_CLASS_TEMPLATE_P (id))
5234 decl = DECL_TEMPLATE_RESULT (id);
5235 else
5236 {
5237 if (scope)
5238 cp_error ("`%T' does not have a nested type named `%D'", scope, id);
5239 else
5240 cp_error ("no file-scope type named `%D'", id);
5241
5242 decl = TYPE_MAIN_DECL (xref_tag (aggr, make_anon_name (), 1));
5243 }
5244
5245 /* This syntax is only allowed when we're defining a type, so we
5246 enter the SCOPE. */
5247 push_scope (CP_DECL_CONTEXT (decl));
5248
5249 /* If we see something like:
5250
5251 template <typename T> struct S::I ....
5252
5253 we must create a TEMPLATE_DECL for the nested type. */
5254 if (PROCESSING_REAL_TEMPLATE_DECL_P ())
5255 decl = push_template_decl (decl);
5256
5257 return decl;
5258 }
This page took 0.288721 seconds and 5 git commands to generate.