OSDN Git Service

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