OSDN Git Service

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