OSDN Git Service

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