OSDN Git Service

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