OSDN Git Service

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