OSDN Git Service

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