OSDN Git Service

revert mangling patch
[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 (*((char **) p1), *((char **) 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   SET_DECL_ARTIFICIAL (parm);
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 = 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     cp_warning ("`%T' is not a pointer-to-object type", type);
1287   
1288   /* An array can't have been allocated by new, so complain.  */
1289   if (TREE_CODE (t) == ADDR_EXPR
1290       && TREE_CODE (TREE_OPERAND (t, 0)) == VAR_DECL
1291       && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == ARRAY_TYPE)
1292     cp_warning ("deleting array `%#D'", TREE_OPERAND (t, 0));
1293
1294   /* Deleting a pointer with the value zero is valid and has no effect.  */
1295   if (integer_zerop (t))
1296     return build1 (NOP_EXPR, void_type_node, t);
1297
1298   if (doing_vec)
1299     return build_vec_delete (t, maxindex, sfk_deleting_destructor,
1300                              use_global_delete);
1301   else
1302     {
1303       if (IS_AGGR_TYPE (TREE_TYPE (type))
1304           && TYPE_GETS_REG_DELETE (TREE_TYPE (type)))
1305         {
1306           /* Only do access checking here; we'll be calling op delete
1307              from the destructor.  */
1308           tree tmp = build_op_delete_call (DELETE_EXPR, t, size_zero_node,
1309                                            LOOKUP_NORMAL, NULL_TREE);
1310           if (tmp == error_mark_node)
1311             return error_mark_node;
1312         }
1313
1314       return build_delete (type, t, sfk_deleting_destructor,
1315                            LOOKUP_NORMAL, use_global_delete);
1316     }
1317 }
1318
1319 /* Report an error if the indicated template declaration is not the
1320    sort of thing that should be a member template.  */
1321
1322 void
1323 check_member_template (tmpl)
1324      tree tmpl;
1325 {
1326   tree decl;
1327
1328   my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 0);
1329   decl = DECL_TEMPLATE_RESULT (tmpl);
1330
1331   if (TREE_CODE (decl) == FUNCTION_DECL
1332       || (TREE_CODE (decl) == TYPE_DECL
1333           && IS_AGGR_TYPE (TREE_TYPE (decl))))
1334     {
1335       if (current_function_decl)
1336         /* 14.5.2.2 [temp.mem]
1337            
1338            A local class shall not have member templates. */
1339         cp_error ("invalid declaration of member template `%#D' in local class",
1340                   decl);
1341       
1342       if (TREE_CODE (decl) == FUNCTION_DECL && DECL_VIRTUAL_P (decl))
1343         {
1344           /* 14.5.2.3 [temp.mem]
1345
1346              A member function template shall not be virtual.  */
1347           cp_error 
1348             ("invalid use of `virtual' in template declaration of `%#D'",
1349              decl);
1350           DECL_VIRTUAL_P (decl) = 0;
1351         }
1352
1353       /* The debug-information generating code doesn't know what to do
1354          with member templates.  */ 
1355       DECL_IGNORED_P (tmpl) = 1;
1356     } 
1357   else
1358     cp_error ("template declaration of `%#D'", decl);
1359 }
1360
1361 /* Return true iff TYPE is a valid Java parameter or return type. */
1362
1363 static int
1364 acceptable_java_type (type)
1365      tree type;
1366 {
1367   if (TREE_CODE (type) == VOID_TYPE || TYPE_FOR_JAVA (type))
1368     return 1;
1369   if (TREE_CODE (type) == POINTER_TYPE)
1370     {
1371       type = TREE_TYPE (type);
1372       if (TREE_CODE (type) == RECORD_TYPE)
1373         {
1374           tree args;  int i;
1375           if (! TYPE_FOR_JAVA (type))
1376             return 0;
1377           if (! CLASSTYPE_TEMPLATE_INFO (type))
1378             return 1;
1379           args = CLASSTYPE_TI_ARGS (type);
1380           i = TREE_VEC_LENGTH (args);
1381           while (--i >= 0)
1382             {
1383               type = TREE_VEC_ELT (args, i);
1384               if (TREE_CODE (type) == POINTER_TYPE)
1385                 type = TREE_TYPE (type);
1386               if (! TYPE_FOR_JAVA (type))
1387                 return 0;
1388             }
1389           return 1;
1390         }
1391     }
1392   return 0;
1393 }
1394
1395 /* For a METHOD in a Java class CTYPE, return 1 if
1396    the parameter and return types are valid Java types.
1397    Otherwise, print appropriate error messages, and return 0.  */
1398
1399 int
1400 check_java_method (method)
1401      tree method;
1402 {
1403   int jerr = 0;
1404   tree arg_types = TYPE_ARG_TYPES (TREE_TYPE (method));
1405   tree ret_type = TREE_TYPE (TREE_TYPE (method));
1406   if (! acceptable_java_type (ret_type))
1407     {
1408       cp_error ("Java method '%D' has non-Java return type `%T'",
1409                 method, ret_type);
1410       jerr++;
1411     }
1412   for (; arg_types != NULL_TREE; arg_types = TREE_CHAIN (arg_types))
1413     {
1414       tree type = TREE_VALUE (arg_types);
1415       if (! acceptable_java_type (type))
1416         {
1417           cp_error ("Java method '%D' has non-Java parameter type `%T'",
1418                     method, type);
1419           jerr++;
1420         }
1421     }
1422   return jerr ? 0 : 1;
1423 }
1424
1425 /* Sanity check: report error if this function FUNCTION is not
1426    really a member of the class (CTYPE) it is supposed to belong to.
1427    CNAME is the same here as it is for grokclassfn above.  */
1428
1429 tree
1430 check_classfn (ctype, function)
1431      tree ctype, function;
1432 {
1433   tree fn_name = DECL_NAME (function);
1434   tree fndecl, fndecls;
1435   tree method_vec = CLASSTYPE_METHOD_VEC (complete_type (ctype));
1436   tree *methods = 0;
1437   tree *end = 0;
1438   
1439   if (DECL_USE_TEMPLATE (function)
1440       && !(TREE_CODE (function) == TEMPLATE_DECL
1441            && DECL_TEMPLATE_SPECIALIZATION (function))
1442       && is_member_template (DECL_TI_TEMPLATE (function)))
1443     /* Since this is a specialization of a member template,
1444        we're not going to find the declaration in the class.
1445        For example, in:
1446        
1447          struct S { template <typename T> void f(T); };
1448          template <> void S::f(int);
1449        
1450        we're not going to find `S::f(int)', but there's no
1451        reason we should, either.  We let our callers know we didn't
1452        find the method, but we don't complain.  */
1453     return NULL_TREE;
1454       
1455   if (method_vec != 0)
1456     {
1457       methods = &TREE_VEC_ELT (method_vec, 0);
1458       end = TREE_VEC_END (method_vec);
1459
1460       /* First suss out ctors and dtors.  */
1461       if (*methods && fn_name == DECL_NAME (OVL_CURRENT (*methods))
1462           && DECL_CONSTRUCTOR_P (function))
1463         goto got_it;
1464       if (*++methods && fn_name == DECL_NAME (OVL_CURRENT (*methods))
1465           && DECL_DESTRUCTOR_P (function))
1466         goto got_it;
1467
1468       while (++methods != end && *methods)
1469         {
1470           fndecl = *methods;
1471           if (fn_name == DECL_NAME (OVL_CURRENT (*methods)))
1472             {
1473             got_it:
1474               for (fndecls = *methods; fndecls != NULL_TREE;
1475                    fndecls = OVL_NEXT (fndecls))
1476                 {
1477                   fndecl = OVL_CURRENT (fndecls);
1478                   /* The DECL_ASSEMBLER_NAME for a TEMPLATE_DECL, or
1479                      for a for member function of a template class, is
1480                      not mangled, so the check below does not work
1481                      correctly in that case.  Since mangled destructor
1482                      names do not include the type of the arguments,
1483                      we can't use this short-cut for them, either.
1484                      (It's not legal to declare arguments for a
1485                      destructor, but some people try.)  */
1486                   if (!DECL_DESTRUCTOR_P (function)
1487                       && (DECL_ASSEMBLER_NAME (function)
1488                           != DECL_NAME (function))
1489                       && (DECL_ASSEMBLER_NAME (fndecl)
1490                           != DECL_NAME (fndecl))
1491                       && (DECL_ASSEMBLER_NAME (function) 
1492                           == DECL_ASSEMBLER_NAME (fndecl)))
1493                     return fndecl;
1494
1495                   /* We cannot simply call decls_match because this
1496                      doesn't work for static member functions that are 
1497                      pretending to be methods, and because the name
1498                      may have been changed by asm("new_name").  */ 
1499                   if (DECL_NAME (function) == DECL_NAME (fndecl))
1500                     {
1501                       tree p1 = TYPE_ARG_TYPES (TREE_TYPE (function));
1502                       tree p2 = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1503
1504                       /* Get rid of the this parameter on functions that become
1505                          static.  */
1506                       if (DECL_STATIC_FUNCTION_P (fndecl)
1507                           && TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE)
1508                         p1 = TREE_CHAIN (p1);
1509
1510                       if (same_type_p (TREE_TYPE (TREE_TYPE (function)),
1511                                        TREE_TYPE (TREE_TYPE (fndecl)))
1512                           && compparms (p1, p2)
1513                           && (DECL_TEMPLATE_SPECIALIZATION (function)
1514                               == DECL_TEMPLATE_SPECIALIZATION (fndecl))
1515                           && (!DECL_TEMPLATE_SPECIALIZATION (function)
1516                               || (DECL_TI_TEMPLATE (function) 
1517                                   == DECL_TI_TEMPLATE (fndecl))))
1518                         return fndecl;
1519                     }
1520                 }
1521               break;            /* loser */
1522             }
1523         }
1524     }
1525
1526   if (methods != end && *methods)
1527     {
1528       tree fndecl = *methods;
1529       cp_error ("prototype for `%#D' does not match any in class `%T'",
1530                 function, ctype);
1531       cp_error_at ("candidate%s: %+#D", OVL_NEXT (fndecl) ? "s are" : " is",
1532                    OVL_CURRENT (fndecl));
1533       while (fndecl = OVL_NEXT (fndecl), fndecl)
1534         cp_error_at ("                %#D", OVL_CURRENT(fndecl));
1535     }
1536   else
1537     {
1538       methods = 0;
1539       if (!COMPLETE_TYPE_P (ctype))
1540         incomplete_type_error (function, ctype);
1541       else
1542         cp_error ("no `%#D' member function declared in class `%T'",
1543                   function, ctype);
1544     }
1545
1546   /* If we did not find the method in the class, add it to avoid
1547      spurious errors (unless the CTYPE is not yet defined, in which
1548      case we'll only confuse ourselves when the function is declared
1549      properly within the class.  */
1550   if (COMPLETE_TYPE_P (ctype))
1551     add_method (ctype, methods, function);
1552   return NULL_TREE;
1553 }
1554
1555 /* We have just processed the DECL, which is a static data member.
1556    Its initializer, if present, is INIT.  The ASMSPEC_TREE, if
1557    present, is the assembly-language name for the data member.
1558    FLAGS is as for cp_finish_decl.  */
1559
1560 void
1561 finish_static_data_member_decl (decl, init, asmspec_tree, flags)
1562      tree decl;
1563      tree init;
1564      tree asmspec_tree;
1565      int flags;
1566 {
1567   const char *asmspec = 0;
1568
1569   if (asmspec_tree)
1570     asmspec = TREE_STRING_POINTER (asmspec_tree);
1571
1572   my_friendly_assert (TREE_PUBLIC (decl), 0);
1573
1574   DECL_CONTEXT (decl) = current_class_type;
1575
1576   /* We cannot call pushdecl here, because that would fill in the
1577      decl of our TREE_CHAIN.  Instead, we modify cp_finish_decl to do
1578      the right thing, namely, to put this decl out straight away.  */
1579   /* current_class_type can be NULL_TREE in case of error.  */
1580   if (!asmspec && current_class_type)
1581     {
1582       DECL_INITIAL (decl) = error_mark_node;
1583       if (flag_new_abi)
1584         DECL_ASSEMBLER_NAME (decl) = mangle_decl (decl);
1585       else
1586         DECL_ASSEMBLER_NAME (decl) 
1587           = build_static_name (current_class_type, DECL_NAME (decl));
1588     }
1589   if (! processing_template_decl)
1590     {
1591       if (!pending_statics)
1592         VARRAY_TREE_INIT (pending_statics, 32, "pending_statics");
1593       VARRAY_PUSH_TREE (pending_statics, decl);
1594     }
1595
1596   /* Static consts need not be initialized in the class definition.  */
1597   if (init != NULL_TREE && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
1598     {
1599       static int explanation = 0;
1600           
1601       error ("initializer invalid for static member with constructor");
1602       if (explanation++ == 0)
1603         error ("(you really want to initialize it separately)");
1604       init = 0;
1605     }
1606   /* Force the compiler to know when an uninitialized static const
1607      member is being used.  */
1608   if (CP_TYPE_CONST_P (TREE_TYPE (decl)) && init == 0)
1609     TREE_USED (decl) = 1;
1610   DECL_INITIAL (decl) = init;
1611   DECL_IN_AGGR_P (decl) = 1;
1612
1613   cp_finish_decl (decl, init, asmspec_tree, flags);
1614 }
1615
1616 /* Process the specs, declarator (NULL if omitted) and width (NULL if omitted)
1617    of a structure component, returning a FIELD_DECL node.
1618    QUALS is a list of type qualifiers for this decl (such as for declaring
1619    const member functions).
1620
1621    This is done during the parsing of the struct declaration.
1622    The FIELD_DECL nodes are chained together and the lot of them
1623    are ultimately passed to `build_struct' to make the RECORD_TYPE node.
1624
1625    C++:
1626
1627    If class A defines that certain functions in class B are friends, then
1628    the way I have set things up, it is B who is interested in permission
1629    granted by A.  However, it is in A's context that these declarations
1630    are parsed.  By returning a void_type_node, class A does not attempt
1631    to incorporate the declarations of the friends within its structure.
1632
1633    DO NOT MAKE ANY CHANGES TO THIS CODE WITHOUT MAKING CORRESPONDING
1634    CHANGES TO CODE IN `start_method'.  */
1635
1636 tree
1637 grokfield (declarator, declspecs, init, asmspec_tree, attrlist)
1638      tree declarator, declspecs, init, asmspec_tree, attrlist;
1639 {
1640   register tree value;
1641   const char *asmspec = 0;
1642   int flags = LOOKUP_ONLYCONVERTING;
1643
1644   /* Convert () initializers to = initializers.  */
1645   if (init == NULL_TREE && declarator != NULL_TREE
1646       && TREE_CODE (declarator) == CALL_EXPR
1647       && TREE_OPERAND (declarator, 0)
1648       && (TREE_CODE (TREE_OPERAND (declarator, 0)) == IDENTIFIER_NODE
1649           || TREE_CODE (TREE_OPERAND (declarator, 0)) == SCOPE_REF)
1650       && parmlist_is_exprlist (CALL_DECLARATOR_PARMS (declarator)))
1651     {
1652       /* It's invalid to try to initialize a data member using a
1653          functional notation, e.g.:
1654          
1655             struct S {
1656               static int i (3);
1657             };
1658             
1659          Explain that to the user.  */
1660       static int explained_p;
1661
1662       cp_error ("invalid data member initiailization");
1663       if (!explained_p)
1664         {
1665           cp_error ("use `=' to initialize static data members");
1666           explained_p = 1;
1667         }
1668
1669       declarator = TREE_OPERAND (declarator, 0);
1670       flags = 0;
1671     }
1672
1673   if (declspecs == NULL_TREE
1674       && TREE_CODE (declarator) == SCOPE_REF
1675       && TREE_CODE (TREE_OPERAND (declarator, 1)) == IDENTIFIER_NODE)
1676     {
1677       /* Access declaration */
1678       if (! IS_AGGR_TYPE_CODE (TREE_CODE (TREE_OPERAND (declarator, 0))))
1679         ;
1680       else if (TREE_COMPLEXITY (declarator) == current_class_depth)
1681         pop_nested_class ();
1682       return do_class_using_decl (declarator);
1683     }
1684
1685   if (init
1686       && TREE_CODE (init) == TREE_LIST
1687       && TREE_VALUE (init) == error_mark_node
1688       && TREE_CHAIN (init) == NULL_TREE)
1689     init = NULL_TREE;
1690
1691   value = grokdeclarator (declarator, declspecs, FIELD, init != 0, attrlist);
1692   if (! value || value == error_mark_node)
1693     /* friend or constructor went bad.  */
1694     return value;
1695   if (TREE_TYPE (value) == error_mark_node)
1696     return error_mark_node;  
1697
1698   /* Pass friendly classes back.  */
1699   if (TREE_CODE (value) == VOID_TYPE)
1700     return void_type_node;
1701
1702   if (DECL_NAME (value) != NULL_TREE
1703       && IDENTIFIER_POINTER (DECL_NAME (value))[0] == '_'
1704       && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (value)), "_vptr"))
1705     cp_error ("member `%D' conflicts with virtual function table field name",
1706               value);
1707
1708   /* Stash away type declarations.  */
1709   if (TREE_CODE (value) == TYPE_DECL)
1710     {
1711       DECL_NONLOCAL (value) = 1;
1712       DECL_CONTEXT (value) = current_class_type;
1713
1714       /* Now that we've updated the context, we need to remangle the
1715          name for this TYPE_DECL.  */
1716       DECL_ASSEMBLER_NAME (value) = DECL_NAME (value);
1717       if (!uses_template_parms (value)) 
1718         {
1719           if (flag_new_abi)
1720             DECL_ASSEMBLER_NAME (value) = mangle_type (TREE_TYPE (value));
1721           else
1722             DECL_ASSEMBLER_NAME (value) =
1723               get_identifier (build_overload_name (TREE_TYPE (value), 1, 1));
1724         }
1725
1726       if (processing_template_decl)
1727         value = push_template_decl (value);
1728
1729       return value;
1730     }
1731
1732   if (DECL_IN_AGGR_P (value))
1733     {
1734       cp_error ("`%D' is already defined in `%T'", value,
1735                 DECL_CONTEXT (value));
1736       return void_type_node;
1737     }
1738
1739   if (asmspec_tree)
1740     asmspec = TREE_STRING_POINTER (asmspec_tree);
1741
1742   if (init)
1743     {
1744       if (TREE_CODE (value) == FUNCTION_DECL)
1745         {
1746           grok_function_init (value, init);
1747           init = NULL_TREE;
1748         }
1749       else if (pedantic && TREE_CODE (value) != VAR_DECL)
1750         /* Already complained in grokdeclarator.  */
1751         init = NULL_TREE;
1752       else
1753         {
1754           /* We allow initializers to become parameters to base
1755              initializers.  */
1756           if (TREE_CODE (init) == TREE_LIST)
1757             {
1758               if (TREE_CHAIN (init) == NULL_TREE)
1759                 init = TREE_VALUE (init);
1760               else
1761                 init = digest_init (TREE_TYPE (value), init, (tree *)0);
1762             }
1763           
1764           if (TREE_CODE (init) == CONST_DECL)
1765             init = DECL_INITIAL (init);
1766           else if (TREE_READONLY_DECL_P (init))
1767             init = decl_constant_value (init);
1768           else if (TREE_CODE (init) == CONSTRUCTOR)
1769             init = digest_init (TREE_TYPE (value), init, (tree *)0);
1770           if (init == error_mark_node)
1771             /* We must make this look different than `error_mark_node'
1772                because `decl_const_value' would mis-interpret it
1773                as only meaning that this VAR_DECL is defined.  */
1774             init = build1 (NOP_EXPR, TREE_TYPE (value), init);
1775           else if (processing_template_decl)
1776             ;
1777           else if (! TREE_CONSTANT (init))
1778             {
1779               /* We can allow references to things that are effectively
1780                  static, since references are initialized with the address.  */
1781               if (TREE_CODE (TREE_TYPE (value)) != REFERENCE_TYPE
1782                   || (TREE_STATIC (init) == 0
1783                       && (!DECL_P (init) || DECL_EXTERNAL (init) == 0)))
1784                 {
1785                   error ("field initializer is not constant");
1786                   init = error_mark_node;
1787                 }
1788             }
1789         }
1790     }
1791
1792   if (processing_template_decl && ! current_function_decl
1793       && (TREE_CODE (value) == VAR_DECL || TREE_CODE (value) == FUNCTION_DECL))
1794     value = push_template_decl (value);
1795
1796   if (attrlist)
1797     cplus_decl_attributes (value, TREE_PURPOSE (attrlist),
1798                            TREE_VALUE (attrlist));
1799
1800   if (TREE_CODE (value) == VAR_DECL)
1801     {
1802       finish_static_data_member_decl (value, init, asmspec_tree, 
1803                                       flags);
1804       return value;
1805     }
1806   if (TREE_CODE (value) == FIELD_DECL)
1807     {
1808       if (asmspec)
1809         {
1810           /* This must override the asm specifier which was placed
1811              by grokclassfn.  Lay this out fresh.  */
1812           DECL_RTL (value) = NULL_RTX;
1813           DECL_ASSEMBLER_NAME (value) = get_identifier (asmspec);
1814         }
1815       if (DECL_INITIAL (value) == error_mark_node)
1816         init = error_mark_node;
1817       cp_finish_decl (value, init, asmspec_tree, flags);
1818       DECL_INITIAL (value) = init;
1819       DECL_IN_AGGR_P (value) = 1;
1820       return value;
1821     }
1822   if (TREE_CODE (value) == FUNCTION_DECL)
1823     {
1824       if (asmspec)
1825         {
1826           /* This must override the asm specifier which was placed
1827              by grokclassfn.  Lay this out fresh.  */
1828           DECL_RTL (value) = NULL_RTX;
1829           DECL_ASSEMBLER_NAME (value) = get_identifier (asmspec);
1830         }
1831       cp_finish_decl (value, init, asmspec_tree, flags);
1832
1833       /* Pass friends back this way.  */
1834       if (DECL_FRIEND_P (value))
1835         return void_type_node;
1836
1837       DECL_IN_AGGR_P (value) = 1;
1838       return value;
1839     }
1840   my_friendly_abort (21);
1841   /* NOTREACHED */
1842   return NULL_TREE;
1843 }
1844
1845 /* Like `grokfield', but for bitfields.
1846    WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node.  */
1847
1848 tree
1849 grokbitfield (declarator, declspecs, width)
1850      tree declarator, declspecs, width;
1851 {
1852   register tree value = grokdeclarator (declarator, declspecs, BITFIELD,
1853                                         0, NULL_TREE);
1854
1855   if (! value) return NULL_TREE; /* friends went bad.  */
1856
1857   /* Pass friendly classes back.  */
1858   if (TREE_CODE (value) == VOID_TYPE)
1859     return void_type_node;
1860
1861   if (TREE_CODE (value) == TYPE_DECL)
1862     {
1863       cp_error ("cannot declare `%D' to be a bitfield type", value);
1864       return NULL_TREE;
1865     }
1866
1867   /* Usually, finish_struct_1 catches bitifields with invalid types.
1868      But, in the case of bitfields with function type, we confuse
1869      ourselves into thinking they are member functions, so we must
1870      check here.  */
1871   if (TREE_CODE (value) == FUNCTION_DECL)
1872     {
1873       cp_error ("cannot declare bitfield `%D' with funcion type",
1874                 DECL_NAME (value));
1875       return NULL_TREE;
1876     }
1877
1878   if (DECL_IN_AGGR_P (value))
1879     {
1880       cp_error ("`%D' is already defined in the class %T", value,
1881                   DECL_CONTEXT (value));
1882       return void_type_node;
1883     }
1884
1885   GNU_xref_member (current_class_name, value);
1886
1887   if (TREE_STATIC (value))
1888     {
1889       cp_error ("static member `%D' cannot be a bitfield", value);
1890       return NULL_TREE;
1891     }
1892   cp_finish_decl (value, NULL_TREE, NULL_TREE, 0);
1893
1894   if (width != error_mark_node)
1895     {
1896       constant_expression_warning (width);
1897       DECL_INITIAL (value) = width;
1898       SET_DECL_C_BIT_FIELD (value);
1899     }
1900
1901   DECL_IN_AGGR_P (value) = 1;
1902   return value;
1903 }
1904
1905 tree
1906 grokoptypename (declspecs, declarator)
1907      tree declspecs, declarator;
1908 {
1909   tree t = grokdeclarator (declarator, declspecs, TYPENAME, 0, NULL_TREE);
1910   if (flag_new_abi)
1911     return mangle_conv_op_name_for_type (t);
1912   else
1913     return build_typename_overload (t);
1914 }
1915
1916 /* When a function is declared with an initializer,
1917    do the right thing.  Currently, there are two possibilities:
1918
1919    class B
1920    {
1921     public:
1922      // initialization possibility #1.
1923      virtual void f () = 0;
1924      int g ();
1925    };
1926    
1927    class D1 : B
1928    {
1929     public:
1930      int d1;
1931      // error, no f ();
1932    };
1933    
1934    class D2 : B
1935    {
1936     public:
1937      int d2;
1938      void f ();
1939    };
1940    
1941    class D3 : B
1942    {
1943     public:
1944      int d3;
1945      // initialization possibility #2
1946      void f () = B::f;
1947    };
1948
1949 */
1950
1951 int
1952 copy_assignment_arg_p (parmtype, virtualp)
1953      tree parmtype;
1954      int virtualp ATTRIBUTE_UNUSED;
1955 {
1956   if (current_class_type == NULL_TREE)
1957     return 0;
1958
1959   if (TREE_CODE (parmtype) == REFERENCE_TYPE)
1960     parmtype = TREE_TYPE (parmtype);
1961
1962   if ((TYPE_MAIN_VARIANT (parmtype) == current_class_type)
1963 #if 0
1964       /* Non-standard hack to support old Booch components.  */
1965       || (! virtualp && DERIVED_FROM_P (parmtype, current_class_type))
1966 #endif
1967       )
1968     return 1;
1969
1970   return 0;
1971 }
1972
1973 static void
1974 grok_function_init (decl, init)
1975      tree decl;
1976      tree init;
1977 {
1978   /* An initializer for a function tells how this function should
1979      be inherited.  */
1980   tree type = TREE_TYPE (decl);
1981
1982   if (TREE_CODE (type) == FUNCTION_TYPE)
1983     cp_error ("initializer specified for non-member function `%D'", decl);
1984 #if 0
1985   /* We'll check for this in finish_struct_1.  */
1986   else if (DECL_VINDEX (decl) == NULL_TREE)
1987     cp_error ("initializer specified for non-virtual member function `%D'", decl);
1988 #endif
1989   else if (integer_zerop (init))
1990     {
1991 #if 0
1992       /* Mark this function as being "defined".  */
1993       DECL_INITIAL (decl) = error_mark_node;
1994       /* pure virtual destructors must be defined.  */
1995       /* pure virtual needs to be defined (as abort) only when put in 
1996          vtbl. For wellformed call, it should be itself. pr4737 */
1997       if (!DECL_DESTRUCTOR_P (decl)))
1998         {
1999           /* Give this node rtl from `abort'.  */
2000           DECL_RTL (decl) = DECL_RTL (abort_fndecl);
2001         }
2002 #endif
2003       DECL_PURE_VIRTUAL_P (decl) = 1;
2004       if (DECL_OVERLOADED_OPERATOR_P (decl) == NOP_EXPR)
2005         {
2006           tree parmtype
2007             = TREE_VALUE (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl))));
2008
2009           if (copy_assignment_arg_p (parmtype, 1))
2010             TYPE_HAS_ABSTRACT_ASSIGN_REF (current_class_type) = 1;
2011         }
2012     }
2013   else
2014     cp_error ("invalid initializer for virtual method `%D'", decl);
2015 }
2016 \f
2017 void
2018 cplus_decl_attributes (decl, attributes, prefix_attributes)
2019      tree decl, attributes, prefix_attributes;
2020 {
2021   if (decl == NULL_TREE || decl == void_type_node)
2022     return;
2023
2024   if (TREE_CODE (decl) == TEMPLATE_DECL)
2025     decl = DECL_TEMPLATE_RESULT (decl);
2026
2027   decl_attributes (decl, attributes, prefix_attributes);
2028
2029   if (TREE_CODE (decl) == TYPE_DECL)
2030     SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (decl), TREE_TYPE (decl));
2031 }
2032 \f
2033 /* CONSTRUCTOR_NAME:
2034    Return the name for the constructor (or destructor) for the
2035    specified class.  Argument can be RECORD_TYPE, TYPE_DECL, or
2036    IDENTIFIER_NODE.  When given a template, this routine doesn't
2037    lose the specialization.  */
2038
2039 tree
2040 constructor_name_full (thing)
2041      tree thing;
2042 {
2043   if (TREE_CODE (thing) == TEMPLATE_TYPE_PARM
2044       || TREE_CODE (thing) == TEMPLATE_TEMPLATE_PARM
2045       || TREE_CODE (thing) == TYPENAME_TYPE)
2046     thing = TYPE_NAME (thing);
2047   else if (IS_AGGR_TYPE_CODE (TREE_CODE (thing)))
2048     {
2049       if (TYPE_WAS_ANONYMOUS (thing) && TYPE_HAS_CONSTRUCTOR (thing))
2050         thing = DECL_NAME (OVL_CURRENT (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (thing), 0)));
2051       else
2052         thing = TYPE_NAME (thing);
2053     }
2054   if (TREE_CODE (thing) == TYPE_DECL
2055       || (TREE_CODE (thing) == TEMPLATE_DECL
2056           && TREE_CODE (DECL_TEMPLATE_RESULT (thing)) == TYPE_DECL))
2057     thing = DECL_NAME (thing);
2058   my_friendly_assert (TREE_CODE (thing) == IDENTIFIER_NODE, 197);
2059   return thing;
2060 }
2061
2062 /* CONSTRUCTOR_NAME:
2063    Return the name for the constructor (or destructor) for the
2064    specified class.  Argument can be RECORD_TYPE, TYPE_DECL, or
2065    IDENTIFIER_NODE.  When given a template, return the plain
2066    unspecialized name.  */
2067
2068 tree
2069 constructor_name (thing)
2070      tree thing;
2071 {
2072   tree t;
2073   thing = constructor_name_full (thing);
2074   t = IDENTIFIER_TEMPLATE (thing);
2075   if (!t)
2076     return thing;
2077   return t;
2078 }
2079 \f
2080 /* Defer the compilation of the FN until the end of compilation.  */
2081
2082 void
2083 defer_fn (fn)
2084      tree fn;
2085 {
2086   if (DECL_DEFERRED_FN (fn))
2087     return;
2088   DECL_DEFERRED_FN (fn) = 1;
2089   if (!deferred_fns)
2090     VARRAY_TREE_INIT (deferred_fns, 32, "deferred_fns");
2091
2092   VARRAY_PUSH_TREE (deferred_fns, fn);
2093 }
2094
2095 /* Hand off a unique name which can be used for variable we don't really
2096    want to know about anyway, for example, the anonymous variables which
2097    are needed to make references work.  Declare this thing so we can use it.
2098    The variable created will be of type TYPE.
2099
2100    STATICP is nonzero if this variable should be static.  */
2101
2102 tree
2103 get_temp_name (type, staticp)
2104      tree type;
2105      int staticp;
2106 {
2107   char buf[sizeof (AUTO_TEMP_FORMAT) + 20];
2108   tree decl;
2109   int toplev = toplevel_bindings_p ();
2110
2111   if (toplev || staticp)
2112     {
2113       sprintf (buf, AUTO_TEMP_FORMAT, global_temp_name_counter++);
2114       decl = pushdecl_top_level (build_decl (VAR_DECL, get_identifier (buf), type));
2115     }
2116   else
2117     {
2118       sprintf (buf, AUTO_TEMP_FORMAT, temp_name_counter++);
2119       decl = pushdecl (build_decl (VAR_DECL, get_identifier (buf), type));
2120     }
2121   TREE_USED (decl) = 1;
2122   TREE_STATIC (decl) = staticp;
2123   DECL_ARTIFICIAL (decl) = 1;
2124
2125   /* If this is a local variable, then lay out its rtl now.
2126      Otherwise, callers of this function are responsible for dealing
2127      with this variable's rtl.  */
2128   if (! toplev)
2129     {
2130       expand_decl (decl);
2131       my_friendly_assert (DECL_INITIAL (decl) == NULL_TREE,
2132                           19990826);
2133     }
2134
2135   return decl;
2136 }
2137
2138 /* Hunts through the global anonymous union ANON_DECL, building
2139    appropriate VAR_DECLs.  Stores cleanups on the list of ELEMS, and
2140    returns a VAR_DECL whose size is the same as the size of the
2141    ANON_DECL, if one is available.  */
2142
2143 static tree 
2144 build_anon_union_vars (anon_decl, elems, static_p, external_p)
2145      tree anon_decl;
2146      tree* elems;
2147      int static_p;
2148      int external_p;
2149 {
2150   tree type = TREE_TYPE (anon_decl);
2151   tree main_decl = NULL_TREE;
2152   tree field;
2153
2154   /* Rather than write the code to handle the non-union case,
2155      just give an error.  */
2156   if (TREE_CODE (type) != UNION_TYPE)
2157     error ("anonymous struct not inside named type");
2158
2159   for (field = TYPE_FIELDS (type); 
2160        field != NULL_TREE; 
2161        field = TREE_CHAIN (field))
2162     {
2163       tree decl;
2164
2165       if (DECL_ARTIFICIAL (field))
2166         continue;
2167       if (TREE_CODE (field) != FIELD_DECL)
2168         {
2169           cp_pedwarn_at ("`%#D' invalid; an anonymous union can only have non-static data members",
2170                          field);
2171           continue;
2172         }
2173
2174       if (TREE_PRIVATE (field))
2175         cp_pedwarn_at ("private member `%#D' in anonymous union", field);
2176       else if (TREE_PROTECTED (field))
2177         cp_pedwarn_at ("protected member `%#D' in anonymous union", field);
2178
2179       if (DECL_NAME (field) == NULL_TREE
2180           && ANON_AGGR_TYPE_P (TREE_TYPE (field)))
2181         {
2182           decl = build_anon_union_vars (field, elems, static_p, external_p);
2183           if (!decl)
2184             continue;
2185         }
2186       else if (DECL_NAME (field) == NULL_TREE)
2187         continue;
2188       else
2189         {
2190           decl = build_decl (VAR_DECL, DECL_NAME (field), TREE_TYPE (field));
2191           /* tell `pushdecl' that this is not tentative.  */
2192           DECL_INITIAL (decl) = error_mark_node;
2193           TREE_PUBLIC (decl) = 0;
2194           TREE_STATIC (decl) = static_p;
2195           DECL_EXTERNAL (decl) = external_p;
2196           decl = pushdecl (decl);
2197           DECL_INITIAL (decl) = NULL_TREE;
2198         }
2199
2200       /* Only write out one anon union element--choose the one that
2201          can hold them all.  */
2202       if (main_decl == NULL_TREE
2203           && simple_cst_equal (DECL_SIZE (decl),
2204                                DECL_SIZE (anon_decl)) == 1)
2205         main_decl = decl;
2206       else 
2207         /* ??? This causes there to be no debug info written out
2208            about this decl.  */
2209         TREE_ASM_WRITTEN (decl) = 1;
2210       
2211       if (DECL_NAME (field) == NULL_TREE
2212           && ANON_AGGR_TYPE_P (TREE_TYPE (field)))
2213         /* The remainder of the processing was already done in the
2214            recursive call.  */
2215         continue;
2216
2217       /* If there's a cleanup to do, it belongs in the
2218          TREE_PURPOSE of the following TREE_LIST.  */
2219       *elems = tree_cons (NULL_TREE, decl, *elems);
2220       TREE_TYPE (*elems) = type;
2221     }
2222   
2223   return main_decl;
2224 }
2225
2226 /* Finish off the processing of a UNION_TYPE structure.
2227    If there are static members, then all members are
2228    static, and must be laid out together.  If the
2229    union is an anonymous union, we arrange for that
2230    as well.  PUBLIC_P is nonzero if this union is
2231    not declared static.  */
2232
2233 void
2234 finish_anon_union (anon_union_decl)
2235      tree anon_union_decl;
2236 {
2237   tree type = TREE_TYPE (anon_union_decl);
2238   tree main_decl;
2239   int public_p = TREE_PUBLIC (anon_union_decl);
2240   int static_p = TREE_STATIC (anon_union_decl);
2241   int external_p = DECL_EXTERNAL (anon_union_decl);
2242
2243   if (TYPE_FIELDS (type) == NULL_TREE)
2244     return;
2245
2246   if (public_p)
2247     {
2248       error ("namespace-scope anonymous aggregates must be static");
2249       return;
2250     }
2251
2252   main_decl = build_anon_union_vars (anon_union_decl,
2253                                      &DECL_ANON_UNION_ELEMS (anon_union_decl),
2254                                      static_p, external_p);
2255
2256   if (main_decl == NULL_TREE)
2257     {
2258       warning ("anonymous aggregate with no members");
2259       return;
2260     }
2261
2262   if (static_p)
2263     {
2264       make_decl_rtl (main_decl, 0, toplevel_bindings_p ());
2265       DECL_RTL (anon_union_decl) = DECL_RTL (main_decl);
2266       expand_anon_union_decl (anon_union_decl, 
2267                               NULL_TREE,
2268                               DECL_ANON_UNION_ELEMS (anon_union_decl));
2269     }
2270   else
2271     add_decl_stmt (anon_union_decl);
2272 }
2273
2274 /* Finish processing a builtin type TYPE.  It's name is NAME,
2275    its fields are in the array FIELDS.  LEN is the number of elements
2276    in FIELDS minus one, or put another way, it is the maximum subscript
2277    used in FIELDS.
2278
2279    It is given the same alignment as ALIGN_TYPE.  */
2280
2281 void
2282 finish_builtin_type (type, name, fields, len, align_type)
2283      tree type;
2284      const char *name;
2285      tree fields[];
2286      int len;
2287      tree align_type;
2288 {
2289   register int i;
2290
2291   TYPE_FIELDS (type) = fields[0];
2292   for (i = 0; i < len; i++)
2293     {
2294       layout_type (TREE_TYPE (fields[i]));
2295       DECL_FIELD_CONTEXT (fields[i]) = type;
2296       TREE_CHAIN (fields[i]) = fields[i+1];
2297     }
2298   DECL_FIELD_CONTEXT (fields[i]) = type;
2299   TYPE_ALIGN (type) = TYPE_ALIGN (align_type);
2300   layout_type (type);
2301 #if 0 /* not yet, should get fixed properly later */
2302   TYPE_NAME (type) = make_type_decl (get_identifier (name), type);
2303 #else
2304   TYPE_NAME (type) = build_decl (TYPE_DECL, get_identifier (name), type);
2305 #endif
2306   TYPE_STUB_DECL (type) = TYPE_NAME (type);
2307   layout_decl (TYPE_NAME (type), 0);
2308 }
2309 \f
2310 /* Auxiliary functions to make type signatures for
2311    `operator new' and `operator delete' correspond to
2312    what compiler will be expecting.  */
2313
2314 tree
2315 coerce_new_type (type)
2316      tree type;
2317 {
2318   int e1 = 0, e2 = 0;
2319
2320   if (TREE_CODE (type) == METHOD_TYPE)
2321     type = build_function_type (TREE_TYPE (type), TREE_CHAIN (TYPE_ARG_TYPES (type)));
2322   if (! same_type_p (TREE_TYPE (type), ptr_type_node))
2323     e1 = 1, error ("`operator new' must return type `void *'");
2324
2325   /* Technically the type must be `size_t', but we may not know
2326      what that is.  */
2327   if (TYPE_ARG_TYPES (type) == NULL_TREE)
2328     e1 = 1, error ("`operator new' takes type `size_t' parameter");
2329   else if (! same_type_p (TREE_VALUE (TYPE_ARG_TYPES (type)), sizetype))
2330     e2 = 1, error ("`operator new' takes type `size_t' as first parameter");
2331   if (e2)
2332     type = build_function_type (ptr_type_node, tree_cons (NULL_TREE, sizetype, TREE_CHAIN (TYPE_ARG_TYPES (type))));
2333   else if (e1)
2334     type = build_function_type (ptr_type_node, TYPE_ARG_TYPES (type));
2335   return type;
2336 }
2337
2338 tree
2339 coerce_delete_type (type)
2340      tree type;
2341 {
2342   int e1 = 0, e2 = 0;
2343 #if 0
2344   e3 = 0;
2345 #endif
2346   tree arg_types = TYPE_ARG_TYPES (type);
2347
2348   if (TREE_CODE (type) == METHOD_TYPE)
2349     {
2350       type = build_function_type (TREE_TYPE (type), TREE_CHAIN (arg_types));
2351       arg_types = TREE_CHAIN (arg_types);
2352     }
2353
2354   if (TREE_TYPE (type) != void_type_node)
2355     e1 = 1, error ("`operator delete' must return type `void'");
2356
2357   if (arg_types == NULL_TREE
2358       || ! same_type_p (TREE_VALUE (arg_types), ptr_type_node))
2359     e2 = 1, error ("`operator delete' takes type `void *' as first parameter");
2360
2361 #if 0
2362   if (arg_types
2363       && TREE_CHAIN (arg_types)
2364       && TREE_CHAIN (arg_types) != void_list_node)
2365     {
2366       /* Again, technically this argument must be `size_t', but again
2367          we may not know what that is.  */
2368       tree t2 = TREE_VALUE (TREE_CHAIN (arg_types));
2369       if (! same_type_p (t2, sizetype))
2370         e3 = 1, error ("second argument to `operator delete' must be of type `size_t'");
2371       else if (TREE_CHAIN (TREE_CHAIN (arg_types)) != void_list_node)
2372         {
2373           e3 = 1;
2374           if (TREE_CHAIN (TREE_CHAIN (arg_types)))
2375             error ("too many arguments in declaration of `operator delete'");
2376           else
2377             error ("`...' invalid in specification of `operator delete'");
2378         }
2379     }
2380
2381   if (e3)
2382     arg_types = tree_cons (NULL_TREE, ptr_type_node,
2383                            build_tree_list (NULL_TREE, sizetype));
2384   else if (e3 |= e2)
2385     {
2386       if (arg_types == NULL_TREE)
2387         arg_types = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
2388       else
2389         arg_types = tree_cons (NULL_TREE, ptr_type_node, TREE_CHAIN (arg_types));
2390     }
2391   else e3 |= e1;
2392 #endif
2393
2394   if (e2)
2395     arg_types = tree_cons (NULL_TREE, ptr_type_node,
2396                            arg_types ? TREE_CHAIN (arg_types): NULL_TREE);
2397   if (e2 || e1)
2398     type = build_function_type (void_type_node, arg_types);
2399
2400   return type;
2401 }
2402 \f
2403 static void
2404 mark_vtable_entries (decl)
2405      tree decl;
2406 {
2407   tree entries = CONSTRUCTOR_ELTS (DECL_INITIAL (decl));
2408
2409   for (; entries; entries = TREE_CHAIN (entries))
2410     {
2411       tree fnaddr;
2412       tree fn;
2413
2414       fnaddr = (flag_vtable_thunks ? TREE_VALUE (entries) 
2415                 : FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (entries)));
2416
2417       if (TREE_CODE (fnaddr) != ADDR_EXPR)
2418         /* This entry is an offset: a virtual base class offset, a
2419            virtual call offset, and RTTI offset, etc.  */
2420         continue;
2421
2422       fn = TREE_OPERAND (fnaddr, 0);
2423       TREE_ADDRESSABLE (fn) = 1;
2424       if (DECL_THUNK_P (fn) && DECL_EXTERNAL (fn))
2425         {
2426           DECL_EXTERNAL (fn) = 0;
2427           emit_thunk (fn);
2428         }
2429       mark_used (fn);
2430     }
2431 }
2432
2433 /* Set DECL up to have the closest approximation of "initialized common"
2434    linkage available.  */
2435
2436 void
2437 comdat_linkage (decl)
2438      tree decl;
2439 {
2440   if (flag_weak)
2441     make_decl_one_only (decl);
2442   else if (TREE_CODE (decl) == FUNCTION_DECL || DECL_VIRTUAL_P (decl))
2443     /* We can just emit functions and vtables statically; it doesn't really
2444        matter if we have multiple copies.  */
2445     TREE_PUBLIC (decl) = 0;
2446   else
2447     {
2448       /* Static data member template instantiations, however, cannot
2449          have multiple copies.  */
2450       if (DECL_INITIAL (decl) == 0
2451           || DECL_INITIAL (decl) == error_mark_node)
2452         DECL_COMMON (decl) = 1;
2453       else if (EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl)))
2454         {
2455           DECL_COMMON (decl) = 1;
2456           DECL_INITIAL (decl) = error_mark_node;
2457         }
2458       else
2459         {
2460           /* We can't do anything useful; leave vars for explicit
2461              instantiation.  */
2462           DECL_EXTERNAL (decl) = 1;
2463           DECL_NOT_REALLY_EXTERN (decl) = 0;
2464         }
2465     }
2466
2467   if (DECL_LANG_SPECIFIC (decl))
2468     DECL_COMDAT (decl) = 1;
2469 }
2470
2471 /* For win32 we also want to put explicit instantiations in
2472    linkonce sections, so that they will be merged with implicit
2473    instantiations; otherwise we get duplicate symbol errors.  */
2474
2475 void
2476 maybe_make_one_only (decl)
2477      tree decl;
2478 {
2479   /* We used to say that this was not necessary on targets that support weak
2480      symbols, because the implicit instantiations will defer to the explicit
2481      one.  However, that's not actually the case in SVR4; a strong definition
2482      after a weak one is an error.  Also, not making explicit
2483      instantiations one_only means that we can end up with two copies of
2484      some template instantiations. */
2485   if (! supports_one_only ())
2486     return;
2487
2488   /* We can't set DECL_COMDAT on functions, or finish_file will think
2489      we can get away with not emitting them if they aren't used.  We need
2490      to for variables so that cp_finish_decl will update their linkage,
2491      because their DECL_INITIAL may not have been set properly yet.  */
2492
2493   make_decl_one_only (decl);
2494
2495   if (TREE_CODE (decl) == VAR_DECL && DECL_LANG_SPECIFIC (decl))
2496     DECL_COMDAT (decl) = 1;
2497 }
2498
2499 /* Returns the virtual function with which the vtable for TYPE is
2500    emitted, or NULL_TREE if that heuristic is not applicable to TYPE.  */
2501
2502 static tree
2503 key_method (type)
2504      tree type;
2505 {
2506   tree method;
2507
2508   if (TYPE_FOR_JAVA (type)
2509       || CLASSTYPE_TEMPLATE_INSTANTIATION (type)
2510       || CLASSTYPE_INTERFACE_KNOWN (type))
2511     return NULL_TREE;
2512
2513   for (method = TYPE_METHODS (type); method != NULL_TREE;
2514        method = TREE_CHAIN (method))
2515     if (DECL_VINDEX (method) != NULL_TREE
2516         && ! DECL_THIS_INLINE (method)
2517         && ! DECL_PURE_VIRTUAL_P (method))
2518       return method;
2519
2520   return NULL_TREE;
2521 }
2522
2523 /* Set TREE_PUBLIC and/or DECL_EXTERN on the vtable DECL,
2524    based on TYPE and other static flags.
2525
2526    Note that anything public is tagged TREE_PUBLIC, whether
2527    it's public in this file or in another one.  */
2528
2529 void
2530 import_export_vtable (decl, type, final)
2531      tree decl, type;
2532      int final;
2533 {
2534   if (DECL_INTERFACE_KNOWN (decl))
2535     return;
2536
2537   if (TYPE_FOR_JAVA (type))
2538     {
2539       TREE_PUBLIC (decl) = 1;
2540       DECL_EXTERNAL (decl) = 1;
2541       DECL_INTERFACE_KNOWN (decl) = 1;
2542     }
2543   else if (CLASSTYPE_INTERFACE_KNOWN (type))
2544     {
2545       TREE_PUBLIC (decl) = 1;
2546       DECL_EXTERNAL (decl) = ! CLASSTYPE_VTABLE_NEEDS_WRITING (type);
2547       DECL_INTERFACE_KNOWN (decl) = 1;
2548     }
2549   else
2550     {
2551       /* We can only wait to decide if we have real non-inline virtual
2552          functions in our class, or if we come from a template.  */
2553
2554       int found = (CLASSTYPE_TEMPLATE_INSTANTIATION (type)
2555                    || key_method (type));
2556
2557       if (final || ! found)
2558         {
2559           comdat_linkage (decl);
2560           DECL_EXTERNAL (decl) = 0;
2561         }
2562       else
2563         {
2564           TREE_PUBLIC (decl) = 1;
2565           DECL_EXTERNAL (decl) = 1;
2566         }
2567     }
2568 }
2569
2570 /* Determine whether or not we want to specifically import or export CTYPE,
2571    using various heuristics.  */
2572
2573 static void
2574 import_export_class (ctype)
2575      tree ctype;
2576 {
2577   /* -1 for imported, 1 for exported.  */
2578   int import_export = 0;
2579
2580   /* It only makes sense to call this function at EOF.  The reason is
2581      that this function looks at whether or not the first non-inline
2582      non-abstract virtual member function has been defined in this
2583      translation unit.  But, we can't possibly know that until we've
2584      seen the entire translation unit.  */
2585   my_friendly_assert (at_eof, 20000226);
2586
2587   if (CLASSTYPE_INTERFACE_KNOWN (ctype))
2588     return;
2589
2590   /* If MULTIPLE_SYMBOL_SPACES is defined and we saw a #pragma interface,
2591      we will have CLASSTYPE_INTERFACE_ONLY set but not
2592      CLASSTYPE_INTERFACE_KNOWN.  In that case, we don't want to use this
2593      heuristic because someone will supply a #pragma implementation
2594      elsewhere, and deducing it here would produce a conflict.  */
2595   if (CLASSTYPE_INTERFACE_ONLY (ctype))
2596     return;
2597
2598 #ifdef VALID_MACHINE_TYPE_ATTRIBUTE
2599   /* FIXME this should really use some sort of target-independent macro.  */
2600   if (lookup_attribute ("dllimport", TYPE_ATTRIBUTES (ctype)))
2601     import_export = -1;
2602   else if (lookup_attribute ("dllexport", TYPE_ATTRIBUTES (ctype)))
2603     import_export = 1;
2604 #endif
2605
2606   /* If we got -fno-implicit-templates, we import template classes that
2607      weren't explicitly instantiated.  */
2608   if (import_export == 0
2609       && CLASSTYPE_IMPLICIT_INSTANTIATION (ctype)
2610       && ! flag_implicit_templates)
2611     import_export = -1;
2612
2613   /* Base our import/export status on that of the first non-inline,
2614      non-pure virtual function, if any.  */
2615   if (import_export == 0
2616       && TYPE_POLYMORPHIC_P (ctype))
2617     {
2618       tree method = key_method (ctype);
2619       if (method)
2620         import_export = (DECL_REALLY_EXTERN (method) ? -1 : 1);
2621     }
2622
2623 #ifdef MULTIPLE_SYMBOL_SPACES
2624   if (import_export == -1)
2625     import_export = 0;
2626 #endif
2627
2628   if (import_export)
2629     {
2630       SET_CLASSTYPE_INTERFACE_KNOWN (ctype);
2631       CLASSTYPE_VTABLE_NEEDS_WRITING (ctype) = (import_export > 0);
2632       CLASSTYPE_INTERFACE_ONLY (ctype) = (import_export < 0);
2633     }
2634 }
2635     
2636 /* We need to describe to the assembler the relationship between
2637    a vtable and the vtable of the parent class.  */
2638
2639 static void
2640 output_vtable_inherit (vars)
2641      tree vars;
2642 {
2643   tree parent;
2644   rtx op[2];
2645
2646   op[0] = XEXP (DECL_RTL (vars), 0);      /* strip the mem ref  */
2647
2648   parent = binfo_for_vtable (vars);
2649
2650   if (parent == TYPE_BINFO (DECL_CONTEXT (vars)))
2651     op[1] = const0_rtx;
2652   else if (parent)
2653     {
2654       parent = get_vtbl_decl_for_binfo (TYPE_BINFO (BINFO_TYPE (parent)));
2655       op[1] = XEXP (DECL_RTL (parent), 0);  /* strip the mem ref  */
2656     }
2657   else
2658     my_friendly_abort (980826);
2659
2660   output_asm_insn (".vtable_inherit %c0, %c1", op);
2661 }
2662
2663 static int
2664 finish_vtable_vardecl (t, data)
2665      tree *t;
2666      void *data ATTRIBUTE_UNUSED;
2667 {
2668   tree vars = *t;
2669   tree ctype = DECL_CONTEXT (vars);
2670   import_export_class (ctype);
2671   import_export_vtable (vars, ctype, 1);
2672
2673   if (! DECL_EXTERNAL (vars)
2674       && DECL_NEEDED_P (vars)
2675       && ! TREE_ASM_WRITTEN (vars))
2676     {
2677       if (TREE_TYPE (vars) == void_type_node)
2678         /* It is a dummy vtable made by get_vtable_decl. Ignore it.  */
2679         return 0;
2680       
2681       /* Write it out.  */
2682       mark_vtable_entries (vars);
2683       if (TREE_TYPE (DECL_INITIAL (vars)) == 0)
2684         store_init_value (vars, DECL_INITIAL (vars));
2685
2686       if (write_symbols == DWARF_DEBUG || write_symbols == DWARF2_DEBUG)
2687         {
2688           /* Mark the VAR_DECL node representing the vtable itself as a
2689              "gratuitous" one, thereby forcing dwarfout.c to ignore it.
2690              It is rather important that such things be ignored because
2691              any effort to actually generate DWARF for them will run
2692              into trouble when/if we encounter code like:
2693
2694                 #pragma interface
2695                 struct S { virtual void member (); };
2696
2697               because the artificial declaration of the vtable itself (as
2698               manufactured by the g++ front end) will say that the vtable
2699               is a static member of `S' but only *after* the debug output
2700               for the definition of `S' has already been output.  This causes
2701               grief because the DWARF entry for the definition of the vtable
2702               will try to refer back to an earlier *declaration* of the
2703               vtable as a static member of `S' and there won't be one.
2704               We might be able to arrange to have the "vtable static member"
2705               attached to the member list for `S' before the debug info for
2706               `S' get written (which would solve the problem) but that would
2707               require more intrusive changes to the g++ front end.  */
2708
2709           DECL_IGNORED_P (vars) = 1;
2710         }
2711
2712       /* Always make vtables weak.  */
2713       if (flag_weak)
2714         comdat_linkage (vars);
2715
2716       rest_of_decl_compilation (vars, NULL_PTR, 1, 1);
2717
2718       if (flag_vtable_gc)
2719         output_vtable_inherit (vars);
2720
2721       /* Because we're only doing syntax-checking, we'll never end up
2722          actually marking the variable as written.  */
2723       if (flag_syntax_only)
2724         TREE_ASM_WRITTEN (vars) = 1;
2725
2726       /* Since we're writing out the vtable here, also write the debug 
2727          info.  */
2728       note_debug_info_needed (ctype);
2729
2730       return 1;
2731     }
2732
2733   /* If the references to this class' vtables were optimized away, still
2734      emit the appropriate debugging information.  See dfs_debug_mark.  */
2735   if (DECL_COMDAT (vars)
2736       && CLASSTYPE_DEBUG_REQUESTED (ctype))
2737     note_debug_info_needed (ctype);
2738
2739   return 0;
2740 }
2741
2742 static int
2743 prune_vtable_vardecl (t, data)
2744      tree *t;
2745      void *data ATTRIBUTE_UNUSED;
2746 {
2747   *t = TREE_CHAIN (*t);
2748   return 1;
2749 }
2750
2751 /* Determines the proper settings of TREE_PUBLIC and DECL_EXTERNAL for an
2752    inline function or template instantiation at end-of-file.  */
2753
2754 void
2755 import_export_decl (decl)
2756      tree decl;
2757 {
2758   if (DECL_INTERFACE_KNOWN (decl))
2759     return;
2760
2761   if (DECL_TEMPLATE_INSTANTIATION (decl)
2762       || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl))
2763     {
2764       DECL_NOT_REALLY_EXTERN (decl) = 1;
2765       if ((DECL_IMPLICIT_INSTANTIATION (decl)
2766            || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl))
2767           && (flag_implicit_templates
2768               || (flag_implicit_inline_templates && DECL_THIS_INLINE (decl))))
2769         {
2770           if (!TREE_PUBLIC (decl))
2771             /* Templates are allowed to have internal linkage.  See 
2772                [basic.link].  */
2773             ;
2774           else
2775             comdat_linkage (decl);
2776         }
2777       else
2778         DECL_NOT_REALLY_EXTERN (decl) = 0;
2779     }
2780   else if (DECL_FUNCTION_MEMBER_P (decl))
2781     {
2782       tree ctype = DECL_CONTEXT (decl);
2783       import_export_class (ctype);
2784       if (CLASSTYPE_INTERFACE_KNOWN (ctype)
2785           && (flag_new_abi
2786               ? (! DECL_THIS_INLINE (decl))
2787               : (! DECL_ARTIFICIAL (decl) || DECL_VINDEX (decl))))
2788         {
2789           DECL_NOT_REALLY_EXTERN (decl)
2790             = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
2791                  || (DECL_THIS_INLINE (decl) && ! flag_implement_inlines
2792                      && !DECL_VINDEX (decl)));
2793
2794           /* Always make artificials weak.  */
2795           if (DECL_ARTIFICIAL (decl) && flag_weak)
2796             comdat_linkage (decl);
2797           else
2798             maybe_make_one_only (decl);
2799         }
2800       else
2801         comdat_linkage (decl);
2802     }
2803   else if (DECL_TINFO_FN_P (decl))
2804     {
2805       tree ctype = TREE_TYPE (DECL_NAME (decl));
2806
2807       if (IS_AGGR_TYPE (ctype))
2808         import_export_class (ctype);
2809
2810       if (IS_AGGR_TYPE (ctype) && CLASSTYPE_INTERFACE_KNOWN (ctype)
2811           && TYPE_POLYMORPHIC_P (ctype)
2812           /* If -fno-rtti, we're not necessarily emitting this stuff with
2813              the class, so go ahead and emit it now.  This can happen
2814              when a class is used in exception handling.  */
2815           && flag_rtti
2816           /* If the type is a cv-qualified variant of a type, then we
2817              must emit the tinfo function in this translation unit
2818              since it will not be emitted when the vtable for the type
2819              is output (which is when the unqualified version is
2820              generated).  */
2821           && same_type_p (ctype, TYPE_MAIN_VARIANT (ctype)))
2822         {
2823           DECL_NOT_REALLY_EXTERN (decl)
2824             = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
2825                  || (DECL_THIS_INLINE (decl) && ! flag_implement_inlines
2826                      && !DECL_VINDEX (decl)));
2827
2828           /* Always make artificials weak.  */
2829           if (flag_weak)
2830             comdat_linkage (decl);
2831         }
2832       else if (TYPE_BUILT_IN (ctype) 
2833                && same_type_p (ctype, TYPE_MAIN_VARIANT (ctype)))
2834         DECL_NOT_REALLY_EXTERN (decl) = 0;
2835       else
2836         comdat_linkage (decl);
2837     } 
2838   else
2839     comdat_linkage (decl);
2840
2841   DECL_INTERFACE_KNOWN (decl) = 1;
2842 }
2843
2844 tree
2845 build_cleanup (decl)
2846      tree decl;
2847 {
2848   tree temp;
2849   tree type = TREE_TYPE (decl);
2850
2851   if (TREE_CODE (type) == ARRAY_TYPE)
2852     temp = decl;
2853   else
2854     {
2855       mark_addressable (decl);
2856       temp = build1 (ADDR_EXPR, build_pointer_type (type), decl);
2857     }
2858   temp = build_delete (TREE_TYPE (temp), temp,
2859                        sfk_complete_destructor,
2860                        LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
2861   return temp;
2862 }
2863
2864 /* Returns the initialization guard variable for the non-local
2865    variable DECL.  */
2866
2867 static tree
2868 get_sentry (decl)
2869      tree decl;
2870 {
2871   tree sname;
2872   tree sentry;
2873
2874   if (!flag_new_abi)
2875     sname = get_id_2 ("__sn", DECL_ASSEMBLER_NAME (decl));
2876   else
2877     sname = mangle_guard_variable (decl);
2878
2879   /* For struct X foo __attribute__((weak)), there is a counter
2880      __snfoo. Since base is already an assembler name, sname should
2881      be globally unique */
2882   sentry = IDENTIFIER_GLOBAL_VALUE (sname);
2883   if (! sentry)
2884     {
2885       sentry = build_decl (VAR_DECL, sname, integer_type_node);
2886       TREE_PUBLIC (sentry) = 1;
2887       DECL_ARTIFICIAL (sentry) = 1;
2888       TREE_STATIC (sentry) = 1;
2889       TREE_USED (sentry) = 1;
2890       DECL_COMMON (sentry) = 1;
2891       pushdecl_top_level (sentry);
2892       cp_finish_decl (sentry, NULL_TREE, NULL_TREE, 0);
2893     }
2894   return sentry;
2895 }
2896
2897 /* Start the process of running a particular set of global constructors
2898    or destructors.  Subroutine of do_[cd]tors.  */
2899
2900 static tree
2901 start_objects (method_type, initp)
2902      int method_type, initp;
2903 {
2904   tree fnname;
2905   tree body;
2906   char type[10];
2907
2908   /* Make ctor or dtor function.  METHOD_TYPE may be 'I' or 'D'.  */
2909
2910   if (initp != DEFAULT_INIT_PRIORITY)
2911     {
2912       char joiner;
2913
2914 #ifdef JOINER
2915       joiner = JOINER;
2916 #else
2917       joiner = '_';
2918 #endif
2919
2920       sprintf (type, "%c%c%.5u", method_type, joiner, initp);
2921     }
2922   else
2923     sprintf (type, "%c", method_type);
2924
2925   fnname = get_file_function_name_long (type);
2926
2927   start_function (void_list_node,
2928                   make_call_declarator (fnname, void_list_node, NULL_TREE,
2929                                         NULL_TREE),
2930                   NULL_TREE, SF_DEFAULT);
2931
2932 #if defined(ASM_OUTPUT_CONSTRUCTOR) && defined(ASM_OUTPUT_DESTRUCTOR)
2933   /* It can be a static function as long as collect2 does not have
2934      to scan the object file to find its ctor/dtor routine.  */
2935   TREE_PUBLIC (current_function_decl) = 0;
2936 #endif
2937
2938   /* Mark this declaration as used to avoid spurious warnings.  */
2939   TREE_USED (current_function_decl) = 1;
2940
2941   /* Mark this function as a global constructor or destructor.  */
2942   if (method_type == 'I')
2943     DECL_GLOBAL_CTOR_P (current_function_decl) = 1;
2944   else
2945     DECL_GLOBAL_DTOR_P (current_function_decl) = 1;
2946   GLOBAL_INIT_PRIORITY (current_function_decl) = initp;
2947
2948   body = begin_compound_stmt (/*has_no_scope=*/0);
2949
2950   /* We cannot allow these functions to be elided, even if they do not
2951      have external linkage.  And, there's no point in deferring
2952      copmilation of thes functions; they're all going to have to be
2953      out anyhow.  */
2954   current_function_cannot_inline
2955     = "static constructors and destructors cannot be inlined";
2956
2957   return body;
2958 }
2959
2960 /* Finish the process of running a particular set of global constructors
2961    or destructors.  Subroutine of do_[cd]tors.  */
2962
2963 static void
2964 finish_objects (method_type, initp, body)
2965      int method_type, initp;
2966      tree body;
2967 {
2968   const char *fnname;
2969   tree fn;
2970
2971   /* Finish up. */
2972   finish_compound_stmt(/*has_no_scope=*/0, body);
2973   fn = finish_function (0);
2974   expand_body (fn);
2975
2976   /* When only doing semantic analysis, and no RTL generation, we
2977      can't call functions that directly emit assembly code; there is
2978      no assembly file in which to put the code.  */
2979   if (flag_syntax_only)
2980     return;
2981
2982   fnname = XSTR (XEXP (DECL_RTL (fn), 0), 0);
2983   if (initp == DEFAULT_INIT_PRIORITY)
2984     {
2985       if (method_type == 'I')
2986         assemble_constructor (fnname);
2987       else
2988         assemble_destructor (fnname);
2989     }
2990 #if defined (ASM_OUTPUT_SECTION_NAME) && defined (ASM_OUTPUT_CONSTRUCTOR)
2991   /* If we're using init priority we can't use assemble_*tor, but on ELF
2992      targets we can stick the references into named sections for GNU ld
2993      to collect.  */
2994   else
2995     {
2996       char buf[15];
2997       sprintf (buf, ".%ctors.%.5u", method_type == 'I' ? 'c' : 'd',
2998                /* invert the numbering so the linker puts us in the proper
2999                   order; constructors are run from right to left, and the
3000                   linker sorts in increasing order.  */
3001                MAX_INIT_PRIORITY - initp);
3002       named_section (NULL_TREE, buf, 0);
3003       assemble_integer (gen_rtx_SYMBOL_REF (Pmode, fnname),
3004                         POINTER_SIZE / BITS_PER_UNIT, 1);
3005     }
3006 #endif
3007 }
3008
3009 /* The names of the parameters to the function created to handle
3010    initializations and destructions for objects with static storage
3011    duration.  */
3012 #define INITIALIZE_P_IDENTIFIER "__initialize_p"
3013 #define PRIORITY_IDENTIFIER "__priority"
3014
3015 /* The name of the function we create to handle initializations and
3016    destructions for objects with static storage duration.  */
3017 #define SSDF_IDENTIFIER "__static_initialization_and_destruction"
3018
3019 /* The declaration for the __INITIALIZE_P argument.  */
3020 static tree initialize_p_decl;
3021
3022 /* The declaration for the __PRIORITY argument.  */
3023 static tree priority_decl;
3024
3025 /* The declaration for the static storage duration function.  */
3026 static tree ssdf_decl;
3027
3028 /* All the static storage duration functions created in this
3029    translation unit.  */
3030 static varray_type ssdf_decls;
3031
3032 /* A map from priority levels to information about that priority
3033    level.  There may be many such levels, so efficient lookup is
3034    important.  */
3035 static splay_tree priority_info_map;
3036
3037 /* Begins the generation of the function that will handle all
3038    initialization and destruction of objects with static storage
3039    duration.  The function generated takes two parameters of type
3040    `int': __INITIALIZE_P and __PRIORITY.  If __INITIALIZE_P is
3041    non-zero, it performs initializations.  Otherwise, it performs
3042    destructions.  It only performs those initializations or
3043    destructions with the indicated __PRIORITY.  The generated function
3044    returns no value.  
3045
3046    It is assumed that this function will only be called once per
3047    translation unit.  */
3048
3049 static tree
3050 start_static_storage_duration_function ()
3051 {
3052   static unsigned ssdf_number;
3053
3054   tree parm_types;
3055   tree type;
3056   tree body;
3057   char id[sizeof (SSDF_IDENTIFIER) + 1 /* '\0' */ + 32];
3058
3059   /* Create the identifier for this function.  It will be of the form
3060      SSDF_IDENTIFIER_<number>.  */
3061   sprintf (id, "%s_%u", SSDF_IDENTIFIER, ssdf_number++);
3062   if (ssdf_number == 0)
3063     {
3064       /* Overflow occurred.  That means there are at least 4 billion
3065          initialization functions.  */
3066       sorry ("too many initialization functions required");
3067       my_friendly_abort (19990430);
3068     }
3069
3070   /* Create the parameters.  */
3071   parm_types = void_list_node;
3072   parm_types = tree_cons (NULL_TREE, integer_type_node, parm_types);
3073   parm_types = tree_cons (NULL_TREE, integer_type_node, parm_types);
3074   type = build_function_type (void_type_node, parm_types);
3075
3076   /* Create the FUNCTION_DECL itself.  */
3077   ssdf_decl = build_lang_decl (FUNCTION_DECL, 
3078                                get_identifier (id),
3079                                type);
3080   TREE_PUBLIC (ssdf_decl) = 0;
3081   DECL_ARTIFICIAL (ssdf_decl) = 1;
3082
3083   /* Put this function in the list of functions to be called from the
3084      static constructors and destructors.  */
3085   if (!ssdf_decls)
3086     {
3087       VARRAY_TREE_INIT (ssdf_decls, 32, "ssdf_decls");
3088
3089       /* Take this opportunity to initialize the map from priority
3090          numbers to information about that priority level. */
3091       priority_info_map = splay_tree_new (splay_tree_compare_ints,
3092                                           /*delete_key_fn=*/0,
3093                                           /*delete_value_fn=*/
3094                                           (splay_tree_delete_value_fn) &free);
3095
3096       /* We always need to generate functions for the
3097          DEFAULT_INIT_PRIORITY so enter it now.  That way when we walk
3098          priorities later, we'll be sure to find the
3099          DEFAULT_INIT_PRIORITY.  */
3100       get_priority_info (DEFAULT_INIT_PRIORITY);
3101     }
3102
3103   VARRAY_PUSH_TREE (ssdf_decls, ssdf_decl);
3104
3105   /* Create the argument list.  */
3106   initialize_p_decl = build_decl (PARM_DECL,
3107                                   get_identifier (INITIALIZE_P_IDENTIFIER),
3108                                   integer_type_node);
3109   DECL_CONTEXT (initialize_p_decl) = ssdf_decl;
3110   DECL_ARG_TYPE (initialize_p_decl) = integer_type_node;
3111   TREE_USED (initialize_p_decl) = 1;
3112   priority_decl = build_decl (PARM_DECL, get_identifier (PRIORITY_IDENTIFIER),
3113                               integer_type_node);
3114   DECL_CONTEXT (priority_decl) = ssdf_decl;
3115   DECL_ARG_TYPE (priority_decl) = integer_type_node;
3116   TREE_USED (priority_decl) = 1;
3117
3118   TREE_CHAIN (initialize_p_decl) = priority_decl;
3119   DECL_ARGUMENTS (ssdf_decl) = initialize_p_decl;
3120
3121   /* Put the function in the global scope.  */
3122   pushdecl (ssdf_decl);
3123
3124   /* Start the function itself.  This is equivalent to declarating the
3125      function as:
3126
3127        static void __ssdf (int __initialize_p, init __priority_p);
3128        
3129      It is static because we only need to call this function from the
3130      various constructor and destructor functions for this module.  */
3131   start_function (/*specs=*/NULL_TREE, 
3132                   ssdf_decl,
3133                   /*attrs=*/NULL_TREE,
3134                   SF_PRE_PARSED);
3135
3136   /* Set up the scope of the outermost block in the function.  */
3137   body = begin_compound_stmt (/*has_no_scope=*/0);
3138
3139   /* This function must not be deferred because we are depending on
3140      its compilation to tell us what is TREE_SYMBOL_REFERENCED.  */
3141   current_function_cannot_inline 
3142     = "static storage duration functions cannot be inlined";
3143
3144   return body;
3145 }
3146
3147 /* Finish the generation of the function which performs initialization
3148    and destruction of objects with static storage duration.  After
3149    this point, no more such objects can be created.  */
3150
3151 static void
3152 finish_static_storage_duration_function (body)
3153      tree body;
3154 {
3155   /* Close out the function.  */
3156   finish_compound_stmt (/*has_no_scope=*/0, body);
3157   expand_body (finish_function (0));
3158 }
3159
3160 /* Return the information about the indicated PRIORITY level.  If no
3161    code to handle this level has yet been generated, generate the
3162    appropriate prologue.  */
3163
3164 static priority_info
3165 get_priority_info (priority)
3166      int priority;
3167 {
3168   priority_info pi;
3169   splay_tree_node n;
3170
3171   n = splay_tree_lookup (priority_info_map, 
3172                          (splay_tree_key) priority);
3173   if (!n)
3174     {
3175       /* Create a new priority information structure, and insert it
3176          into the map.  */
3177       pi = (priority_info) xmalloc (sizeof (struct priority_info_s));
3178       pi->initializations_p = 0;
3179       pi->destructions_p = 0;
3180       splay_tree_insert (priority_info_map,
3181                          (splay_tree_key) priority,
3182                          (splay_tree_value) pi);
3183     }
3184   else
3185     pi = (priority_info) n->value;
3186
3187   return pi;
3188 }
3189
3190 /* Set up to handle the initialization or destruction of DECL.  If
3191    INITP is non-zero, we are initializing the variable.  Otherwise, we
3192    are destroying it.  */
3193
3194 static tree
3195 start_static_initialization_or_destruction (decl, initp)
3196      tree decl;
3197      int initp;
3198 {
3199   tree sentry_if_stmt = NULL_TREE;
3200   int priority;
3201   tree cond;
3202   tree init_cond;
3203   priority_info pi;
3204
3205   /* Figure out the priority for this declaration.  */
3206   priority = DECL_INIT_PRIORITY (decl);
3207   if (!priority)
3208     priority = DEFAULT_INIT_PRIORITY;
3209
3210   /* Remember that we had an initialization or finalization at this
3211      priority.  */
3212   pi = get_priority_info (priority);
3213   if (initp)
3214     pi->initializations_p = 1;
3215   else
3216     pi->destructions_p = 1;
3217
3218   /* Trick the compiler into thinking we are at the file and line
3219      where DECL was declared so that error-messages make sense, and so
3220      that the debugger will show somewhat sensible file and line
3221      information.  */
3222   input_filename = DECL_SOURCE_FILE (decl);
3223   lineno = DECL_SOURCE_LINE (decl);
3224
3225   /* Because of:
3226
3227        [class.access.spec]
3228
3229        Access control for implicit calls to the constructors,
3230        the conversion functions, or the destructor called to
3231        create and destroy a static data member is performed as
3232        if these calls appeared in the scope of the member's
3233        class.  
3234
3235      we pretend we are in a static member function of the class of
3236      which the DECL is a member.  */
3237   if (member_p (decl))
3238     {
3239       DECL_CONTEXT (current_function_decl) = DECL_CONTEXT (decl);
3240       DECL_STATIC_FUNCTION_P (current_function_decl) = 1;
3241     }
3242   
3243   /* Conditionalize this initialization on being in the right priority
3244      and being initializing/finalizing appropriately.  */
3245   sentry_if_stmt = begin_if_stmt ();
3246   cond = build_binary_op (EQ_EXPR,
3247                           priority_decl,
3248                           build_int_2 (priority, 0));
3249   init_cond = initp ? integer_one_node : integer_zero_node;
3250   init_cond = build_binary_op (EQ_EXPR,
3251                                initialize_p_decl,
3252                                init_cond);
3253   cond = build_binary_op (TRUTH_ANDIF_EXPR, cond, init_cond);
3254
3255   /* We need a sentry if this is an object with external linkage that
3256      might be initialized in more than one place.  (For example, a
3257      static data member of a template, when the data member requires
3258      construction.)  */
3259   if (TREE_PUBLIC (decl) && (DECL_COMMON (decl) 
3260                              || DECL_ONE_ONLY (decl)
3261                              || DECL_WEAK (decl)))
3262     {
3263       tree sentry;
3264       tree sentry_cond;
3265
3266       sentry = get_sentry (decl);
3267
3268       /* We do initializations only if the SENTRY is zero, i.e., if we
3269          are the first to initialize the variable.  We do destructions
3270          only if the SENTRY is one, i.e., if we are the last to
3271          destroy the variable.  */
3272       if (initp)
3273         sentry_cond = build_binary_op (EQ_EXPR,
3274                                        build_unary_op (PREINCREMENT_EXPR,
3275                                                        sentry,
3276                                                        /*noconvert=*/1),
3277                                        integer_one_node);
3278       else
3279         sentry_cond = build_binary_op (EQ_EXPR,
3280                                        build_unary_op (PREDECREMENT_EXPR,
3281                                                        sentry,
3282                                                        /*noconvert=*/1),
3283                                        integer_zero_node);
3284
3285       cond = build_binary_op (TRUTH_ANDIF_EXPR, cond, sentry_cond);
3286     }
3287
3288   finish_if_stmt_cond (cond, sentry_if_stmt);
3289
3290   return sentry_if_stmt;
3291 }
3292
3293 /* We've just finished generating code to do an initialization or
3294    finalization.  SENTRY_IF_STMT is the if-statement we used to guard
3295    the initialization.  */
3296
3297 static void
3298 finish_static_initialization_or_destruction (sentry_if_stmt)
3299      tree sentry_if_stmt;
3300 {
3301   finish_then_clause (sentry_if_stmt);
3302   finish_if_stmt ();
3303
3304   /* Now that we're done with DECL we don't need to pretend to be a
3305      member of its class any longer.  */
3306   DECL_CONTEXT (current_function_decl) = NULL_TREE;
3307   DECL_STATIC_FUNCTION_P (current_function_decl) = 0;
3308 }
3309
3310 /* Generate code to do the static initialization of DECL.  The
3311    initialization is INIT.  If DECL may be initialized more than once
3312    in different object files, SENTRY is the guard variable to 
3313    check.  PRIORITY is the priority for the initialization.  */
3314
3315 static void
3316 do_static_initialization (decl, init)
3317      tree decl;
3318      tree init;
3319 {
3320   tree expr;
3321   tree sentry_if_stmt;
3322
3323   /* Set up for the initialization.  */
3324   sentry_if_stmt
3325     = start_static_initialization_or_destruction (decl,
3326                                                   /*initp=*/1);
3327   
3328   /* Do the initialization itself.  */
3329   if (IS_AGGR_TYPE (TREE_TYPE (decl))
3330       || TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
3331     expr = build_aggr_init (decl, init, 0);
3332   else if (TREE_CODE (init) == TREE_VEC)
3333     expr = build_vec_init (decl, TREE_VEC_ELT (init, 0),
3334                            TREE_VEC_ELT (init, 1),
3335                            TREE_VEC_ELT (init, 2), 0);
3336   else
3337     {
3338       expr = build (INIT_EXPR, TREE_TYPE (decl), decl, init);
3339       TREE_SIDE_EFFECTS (expr) = 1;
3340     }
3341   finish_expr_stmt (expr);
3342
3343   /* If we're using __cxa_atexit, register a a function that calls the
3344      destructor for the object.  */
3345   if (flag_use_cxa_atexit)
3346     register_dtor_fn (decl);
3347
3348   /* Finsh up.  */
3349   finish_static_initialization_or_destruction (sentry_if_stmt);
3350 }
3351
3352 /* Generate code to do the static destruction of DECL.  If DECL may be
3353    initialized more than once in different object files, SENTRY is the
3354    guard variable to check.  PRIORITY is the priority for the
3355    destruction.  */
3356
3357 static void
3358 do_static_destruction (decl)
3359      tree decl;
3360 {
3361   tree sentry_if_stmt;
3362
3363   /* If we're using __cxa_atexit, then destructors are registered
3364      immediately after objects are initialized.  */
3365   my_friendly_assert (!flag_use_cxa_atexit, 20000121);
3366
3367   /* If we don't need a destructor, there's nothing to do.  */
3368   if (TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (decl)))
3369     return;
3370
3371   /* Actually do the destruction.  */
3372   sentry_if_stmt = start_static_initialization_or_destruction (decl,
3373                                                                /*initp=*/0);
3374   finish_expr_stmt (build_cleanup (decl));
3375   finish_static_initialization_or_destruction (sentry_if_stmt);
3376 }
3377
3378 /* VARS is a list of variables with static storage duration which may
3379    need initialization and/or finalization.  Remove those variables
3380    that don't really need to be initialized or finalized, and return
3381    the resulting list.  The order in which the variables appear in
3382    VARS is in reverse order of the order in which they should actually
3383    be initialized.  The list we return is in the unreversed order;
3384    i.e., the first variable should be initialized first.  */
3385
3386 static tree
3387 prune_vars_needing_no_initialization (vars)
3388      tree vars;
3389 {
3390   tree var;
3391   tree result;
3392
3393   for (var = vars, result = NULL_TREE;
3394        var;
3395        var = TREE_CHAIN (var))
3396     {
3397       tree decl = TREE_VALUE (var);
3398       tree init = TREE_PURPOSE (var);
3399
3400       /* Deal gracefully with error.  */
3401       if (decl == error_mark_node)
3402         continue;
3403
3404       /* The only things that can be initialized are variables.  */
3405       my_friendly_assert (TREE_CODE (decl) == VAR_DECL, 19990420);
3406
3407       /* If this object is not defined, we don't need to do anything
3408          here.  */
3409       if (DECL_EXTERNAL (decl))
3410         continue;
3411
3412       /* Also, if the initializer already contains errors, we can bail
3413          out now.  */
3414       if (init && TREE_CODE (init) == TREE_LIST 
3415           && value_member (error_mark_node, init))
3416         continue;
3417
3418       /* This variable is going to need initialization and/or
3419          finalization, so we add it to the list.  */
3420       result = tree_cons (init, decl, result);
3421     }
3422
3423   return result;
3424 }
3425
3426 /* Make sure we have told the back end about all the variables in
3427    VARS.  */
3428
3429 static void
3430 write_out_vars (vars)
3431      tree vars;
3432 {
3433   tree v;
3434
3435   for (v = vars; v; v = TREE_CHAIN (v))
3436     if (! TREE_ASM_WRITTEN (TREE_VALUE (v)))
3437       rest_of_decl_compilation (TREE_VALUE (v), 0, 1, 1);
3438 }
3439
3440 /* Generate a static constructor (if CONSTRUCTOR_P) or destructor
3441    (otherwise) that will initialize all gobal objects with static
3442    storage duration having the indicated PRIORITY.  */
3443
3444 static void
3445 generate_ctor_or_dtor_function (constructor_p, priority)
3446      int constructor_p;
3447      int priority;
3448 {
3449   char function_key;
3450   tree arguments;
3451   tree body;
3452   size_t i;
3453
3454   /* We use `I' to indicate initialization and `D' to indicate
3455      destruction.  */
3456   if (constructor_p)
3457     function_key = 'I';
3458   else
3459     function_key = 'D';
3460
3461   /* Begin the function.  */
3462   body = start_objects (function_key, priority);
3463
3464   /* Call the static storage duration function with appropriate
3465      arguments.  */
3466   for (i = 0; i < ssdf_decls->elements_used; ++i) 
3467     {
3468       arguments = tree_cons (NULL_TREE, build_int_2 (priority, 0), 
3469                              NULL_TREE);
3470       arguments = tree_cons (NULL_TREE, build_int_2 (constructor_p, 0),
3471                              arguments);
3472       finish_expr_stmt (build_function_call (VARRAY_TREE (ssdf_decls, i),
3473                                              arguments));
3474     }
3475
3476   /* If we're generating code for the DEFAULT_INIT_PRIORITY, throw in
3477      calls to any functions marked with attributes indicating that
3478      they should be called at initialization- or destruction-time.  */
3479   if (priority == DEFAULT_INIT_PRIORITY)
3480     {
3481       tree fns;
3482       
3483       for (fns = constructor_p ? static_ctors : static_dtors; 
3484            fns;
3485            fns = TREE_CHAIN (fns))
3486         finish_expr_stmt (build_function_call (TREE_VALUE (fns), NULL_TREE));
3487     }
3488
3489   /* Close out the function.  */
3490   finish_objects (function_key, priority, body);
3491 }
3492
3493 /* Generate constructor and destructor functions for the priority
3494    indicated by N.  */
3495
3496 static int
3497 generate_ctor_and_dtor_functions_for_priority (n, data)
3498      splay_tree_node n;
3499      void *data ATTRIBUTE_UNUSED;
3500 {
3501   int priority = (int) n->key;
3502   priority_info pi = (priority_info) n->value;
3503
3504   /* Generate the functions themselves, but only if they are really
3505      needed.  */
3506   if (pi->initializations_p
3507       || (priority == DEFAULT_INIT_PRIORITY && static_ctors))
3508     generate_ctor_or_dtor_function (/*constructor_p=*/1,
3509                                     priority);
3510   if (pi->destructions_p
3511       || (priority == DEFAULT_INIT_PRIORITY && static_dtors))
3512     generate_ctor_or_dtor_function (/*constructor_p=*/0,
3513                                     priority);
3514
3515   /* Keep iterating.  */
3516   return 0;
3517 }
3518
3519 /* This routine is called from the last rule in yyparse ().
3520    Its job is to create all the code needed to initialize and
3521    destroy the global aggregates.  We do the destruction
3522    first, since that way we only need to reverse the decls once.  */
3523
3524 void
3525 finish_file ()
3526 {
3527   tree vars;
3528   int reconsider;
3529   size_t i;
3530
3531   at_eof = 1;
3532
3533   /* Bad parse errors.  Just forget about it.  */
3534   if (! global_bindings_p () || current_class_type || decl_namespace_list)
3535     return;
3536
3537   /* Otherwise, GDB can get confused, because in only knows
3538      about source for LINENO-1 lines.  */
3539   lineno -= 1;
3540
3541   interface_unknown = 1;
3542   interface_only = 0;
3543
3544   /* We now have to write out all the stuff we put off writing out.
3545      These include:
3546
3547        o Template specializations that we have not yet instantiated,
3548          but which are needed.
3549        o Initialization and destruction for non-local objects with
3550          static storage duration.  (Local objects with static storage
3551          duration are initialized when their scope is first entered,
3552          and are cleaned up via atexit.)
3553        o Virtual function tables.  
3554
3555      All of these may cause others to be needed.  For example,
3556      instantiating one function may cause another to be needed, and
3557      generating the intiailzer for an object may cause templates to be
3558      instantiated, etc., etc.  */
3559
3560   timevar_push (TV_VARCONST);
3561
3562   if (new_abi_rtti_p ())
3563     emit_support_tinfos ();
3564   
3565   do 
3566     {
3567       reconsider = 0;
3568
3569       /* If there are templates that we've put off instantiating, do
3570          them now.  */
3571       instantiate_pending_templates ();
3572
3573       /* Write out virtual tables as required.  Note that writing out
3574          the virtual table for a template class may cause the
3575          instantiation of members of that class.  */
3576       if (walk_globals (vtable_decl_p,
3577                         finish_vtable_vardecl,
3578                         /*data=*/0))
3579         reconsider = 1;
3580       
3581       /* Write out needed type info variables. Writing out one variable
3582          might cause others to be needed.  */
3583       if (new_abi_rtti_p ()
3584           && walk_globals (tinfo_decl_p, emit_tinfo_decl, /*data=*/0))
3585         reconsider = 1;
3586
3587       /* The list of objects with static storage duration is built up
3588          in reverse order.  We clear STATIC_AGGREGATES so that any new
3589          aggregates added during the initialization of these will be
3590          initialized in the correct order when we next come around the
3591          loop.  */
3592       vars = prune_vars_needing_no_initialization (static_aggregates);
3593       static_aggregates = NULL_TREE;
3594
3595       if (vars)
3596         {
3597           tree v;
3598
3599           /* We need to start a new initialization function each time
3600              through the loop.  That's because we need to know which
3601              vtables have been referenced, and TREE_SYMBOL_REFERENCED
3602              isn't computed until a function is finished, and written
3603              out.  That's a deficiency in the back-end.  When this is
3604              fixed, these initialization functions could all become
3605              inline, with resulting performance improvements.  */
3606           tree ssdf_body = start_static_storage_duration_function ();
3607
3608           /* Make sure the back end knows about all the variables.  */
3609           write_out_vars (vars);
3610
3611           /* First generate code to do all the initializations.  */
3612           for (v = vars; v; v = TREE_CHAIN (v))
3613             do_static_initialization (TREE_VALUE (v),
3614                                       TREE_PURPOSE (v));
3615
3616           /* Then, generate code to do all the destructions.  Do these
3617              in reverse order so that the most recently constructed
3618              variable is the first destroyed.  If we're using
3619              __cxa_atexit, then we don't need to do this; functions
3620              were registered at initialization time to destroy the
3621              local statics.  */
3622           if (!flag_use_cxa_atexit)
3623             {
3624               vars = nreverse (vars);
3625               for (v = vars; v; v = TREE_CHAIN (v))
3626                 do_static_destruction (TREE_VALUE (v));
3627             }
3628           else
3629             vars = NULL_TREE;
3630
3631           /* Finish up the static storage duration function for this
3632              round.  */
3633           finish_static_storage_duration_function (ssdf_body);
3634
3635           /* All those initializations and finalizations might cause
3636              us to need more inline functions, more template
3637              instantiations, etc.  */
3638           reconsider = 1;
3639         }
3640       
3641       /* Go through the various inline functions, and see if any need
3642          synthesizing.  */
3643       for (i = 0; i < deferred_fns_used; ++i)
3644         {
3645           tree decl = VARRAY_TREE (deferred_fns, i);
3646           import_export_decl (decl);
3647           if (DECL_ARTIFICIAL (decl) && ! DECL_INITIAL (decl)
3648               && TREE_USED (decl)
3649               && (! DECL_REALLY_EXTERN (decl) || DECL_INLINE (decl)))
3650             {
3651               /* Even though we're already at the top-level, we push
3652                  there again.  That way, when we pop back a few lines
3653                  hence, all of our state is restored.  Otherwise,
3654                  finish_function doesn't clean things up, and we end
3655                  up with CURRENT_FUNCTION_DECL set.  */
3656               push_to_top_level ();
3657               if (DECL_TINFO_FN_P (decl))
3658                 synthesize_tinfo_fn (decl);
3659               else
3660                 synthesize_method (decl);
3661               pop_from_top_level ();
3662               reconsider = 1;
3663             }
3664         }
3665
3666       /* Mark all functions that might deal with exception-handling as
3667          referenced.  */
3668       mark_all_runtime_matches ();
3669
3670       /* We lie to the back-end, pretending that some functions are
3671          not defined when they really are.  This keeps these functions
3672          from being put out unnecessarily.  But, we must stop lying
3673          when the functions are referenced, or if they are not comdat
3674          since they need to be put out now.  */
3675       for (i = 0; i < deferred_fns_used; ++i)
3676         {
3677           tree decl = VARRAY_TREE (deferred_fns, i);
3678       
3679           if (DECL_NOT_REALLY_EXTERN (decl)
3680               && DECL_INITIAL (decl)
3681               && DECL_NEEDED_P (decl))
3682             DECL_EXTERNAL (decl) = 0;
3683
3684           /* If we're going to need to write this function out, and
3685              there's already a body for it, create RTL for it now.
3686              (There might be no body if this is a method we haven't
3687              gotten around to synthesizing yet.)  */
3688           if (!DECL_EXTERNAL (decl)
3689               && DECL_NEEDED_P (decl)
3690               && DECL_SAVED_TREE (decl)
3691               && !DECL_SAVED_INSNS (decl)
3692               && !TREE_ASM_WRITTEN (decl))
3693             {
3694               int saved_not_really_extern;
3695
3696               /* When we call finish_function in expand_body, it will
3697                  try to reset DECL_NOT_REALLY_EXTERN so we save and
3698                  restore it here.  */
3699               saved_not_really_extern = DECL_NOT_REALLY_EXTERN (decl);
3700               /* Generate RTL for this function now that we know we
3701                  need it.  */
3702               expand_body (decl);
3703               /* Undo the damage done by finish_function.  */
3704               DECL_EXTERNAL (decl) = 0;
3705               DECL_NOT_REALLY_EXTERN (decl) = saved_not_really_extern;
3706               /* If we're compiling -fsyntax-only pretend that this
3707                  function has been written out so that we don't try to
3708                  expand it again.  */
3709               if (flag_syntax_only)
3710                 TREE_ASM_WRITTEN (decl) = 1;
3711               reconsider = 1;
3712             }
3713         }
3714
3715       if (deferred_fns_used
3716           && wrapup_global_declarations (&VARRAY_TREE (deferred_fns, 0),
3717                                          deferred_fns_used))
3718         reconsider = 1;
3719       if (walk_namespaces (wrapup_globals_for_namespace, /*data=*/0))
3720         reconsider = 1;
3721
3722       /* Static data members are just like namespace-scope globals.  */
3723       for (i = 0; i < pending_statics_used; ++i) 
3724         {
3725           tree decl = VARRAY_TREE (pending_statics, i);
3726           if (TREE_ASM_WRITTEN (decl))
3727             continue;
3728           import_export_decl (decl);
3729           if (DECL_NOT_REALLY_EXTERN (decl) && ! DECL_IN_AGGR_P (decl))
3730             DECL_EXTERNAL (decl) = 0;
3731         }
3732       if (pending_statics
3733           && wrapup_global_declarations (&VARRAY_TREE (pending_statics, 0),
3734                                          pending_statics_used))
3735         reconsider = 1;
3736     } 
3737   while (reconsider);
3738
3739   /* We give C linkage to static constructors and destructors.  */
3740   push_lang_context (lang_name_c);
3741
3742   /* Generate initialization and destruction functions for all
3743      priorities for which they are required.  */
3744   if (priority_info_map)
3745     splay_tree_foreach (priority_info_map, 
3746                         generate_ctor_and_dtor_functions_for_priority,
3747                         /*data=*/0);
3748
3749   /* We're done with the splay-tree now.  */
3750   if (priority_info_map)
3751     splay_tree_delete (priority_info_map);
3752
3753   /* We're done with static constructors, so we can go back to "C++"
3754      linkage now.  */
3755   pop_lang_context ();
3756
3757   /* Now delete from the chain of variables all virtual function tables.
3758      We output them all ourselves, because each will be treated
3759      specially.  We don't do this if we're just doing semantic
3760      analysis, and not code-generation.  */
3761   if (!flag_syntax_only)
3762     walk_globals (vtable_decl_p, prune_vtable_vardecl, /*data=*/0);
3763
3764   /* Now, issue warnings about static, but not defined, functions,
3765      etc., and emit debugging information.  */
3766   walk_namespaces (wrapup_globals_for_namespace, /*data=*/&reconsider);
3767   if (pending_statics)
3768     check_global_declarations (&VARRAY_TREE (pending_statics, 0),
3769                                pending_statics_used);
3770
3771   finish_repo ();
3772
3773   /* The entire file is now complete.  If requested, dump everything
3774      to a file.   */
3775   if (flag_dump_translation_unit)
3776     dump_node_to_file (global_namespace, flag_dump_translation_unit);
3777
3778   /* If there's some tool that wants to examine the entire translation
3779      unit, let it do so now.  */
3780   if (back_end_hook)
3781     (*back_end_hook) (global_namespace);
3782
3783   timevar_pop (TV_VARCONST);
3784
3785   if (flag_detailed_statistics)
3786     {
3787       dump_tree_statistics ();
3788       dump_time_statistics ();
3789     }
3790 }
3791
3792 /* This is something of the form 'A()()()()()+1' that has turned out to be an
3793    expr.  Since it was parsed like a type, we need to wade through and fix
3794    that.  Unfortunately, since operator() is left-associative, we can't use
3795    tail recursion.  In the above example, TYPE is `A', and DECL is
3796    `()()()()()'.
3797
3798    Maybe this shouldn't be recursive, but how often will it actually be
3799    used?  (jason) */
3800
3801 tree
3802 reparse_absdcl_as_expr (type, decl)
3803      tree type, decl;
3804 {
3805   /* do build_functional_cast (type, NULL_TREE) at bottom */
3806   if (TREE_OPERAND (decl, 0) == NULL_TREE)
3807     return build_functional_cast (type, NULL_TREE);
3808
3809   /* recurse */
3810   decl = reparse_absdcl_as_expr (type, TREE_OPERAND (decl, 0));
3811
3812   decl = build_x_function_call (decl, NULL_TREE, current_class_ref);
3813
3814   if (TREE_CODE (decl) == CALL_EXPR
3815       && (! TREE_TYPE (decl)
3816           || TREE_CODE (TREE_TYPE (decl)) != VOID_TYPE))
3817     decl = require_complete_type (decl);
3818
3819   return decl;
3820 }
3821
3822 /* This is something of the form `int ((int)(int)(int)1)' that has turned
3823    out to be an expr.  Since it was parsed like a type, we need to wade
3824    through and fix that.  Since casts are right-associative, we are
3825    reversing the order, so we don't have to recurse.
3826
3827    In the above example, DECL is the `(int)(int)(int)', and EXPR is the
3828    `1'.  */
3829
3830 tree
3831 reparse_absdcl_as_casts (decl, expr)
3832      tree decl, expr;
3833 {
3834   tree type;
3835   
3836   if (TREE_CODE (expr) == CONSTRUCTOR
3837       && TREE_TYPE (expr) == 0)
3838     {
3839       type = groktypename (TREE_VALUE (CALL_DECLARATOR_PARMS (decl)));
3840       decl = TREE_OPERAND (decl, 0);
3841
3842       expr = digest_init (type, expr, (tree *) 0);
3843       if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type))
3844         {
3845           int failure = complete_array_type (type, expr, 1);
3846           if (failure)
3847             my_friendly_abort (78);
3848         }
3849     }
3850
3851   while (decl)
3852     {
3853       type = groktypename (TREE_VALUE (CALL_DECLARATOR_PARMS (decl)));
3854       decl = TREE_OPERAND (decl, 0);
3855       expr = build_c_cast (type, expr);
3856     }
3857
3858   if (warn_old_style_cast && ! in_system_header
3859       && current_lang_name != lang_name_c)
3860     warning ("use of old-style cast");
3861
3862   return expr;
3863 }
3864
3865 /* Given plain tree nodes for an expression, build up the full semantics.  */
3866
3867 tree
3868 build_expr_from_tree (t)
3869      tree t;
3870 {
3871   if (t == NULL_TREE || t == error_mark_node)
3872     return t;
3873
3874   switch (TREE_CODE (t))
3875     {
3876     case IDENTIFIER_NODE:
3877       return do_identifier (t, 0, NULL_TREE);
3878
3879     case LOOKUP_EXPR:
3880       if (LOOKUP_EXPR_GLOBAL (t))
3881         return do_scoped_id (TREE_OPERAND (t, 0), 0);
3882       else
3883         return do_identifier (TREE_OPERAND (t, 0), 0, NULL_TREE);
3884
3885     case TEMPLATE_ID_EXPR:
3886       return (lookup_template_function
3887               (build_expr_from_tree (TREE_OPERAND (t, 0)),
3888                build_expr_from_tree (TREE_OPERAND (t, 1))));
3889
3890     case INDIRECT_REF:
3891       return build_x_indirect_ref
3892         (build_expr_from_tree (TREE_OPERAND (t, 0)), "unary *");
3893
3894     case CAST_EXPR:
3895       return build_functional_cast
3896         (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3897
3898     case REINTERPRET_CAST_EXPR:
3899       return build_reinterpret_cast
3900         (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3901
3902     case CONST_CAST_EXPR:
3903       return build_const_cast
3904         (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3905
3906     case DYNAMIC_CAST_EXPR:
3907       return build_dynamic_cast
3908         (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3909
3910     case STATIC_CAST_EXPR:
3911       return build_static_cast
3912         (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3913
3914     case PREDECREMENT_EXPR:
3915     case PREINCREMENT_EXPR:
3916     case POSTDECREMENT_EXPR:
3917     case POSTINCREMENT_EXPR:
3918     case NEGATE_EXPR:
3919     case BIT_NOT_EXPR:
3920     case ABS_EXPR:
3921     case TRUTH_NOT_EXPR:
3922     case ADDR_EXPR:
3923     case CONVERT_EXPR:      /* Unary + */
3924     case REALPART_EXPR:
3925     case IMAGPART_EXPR:
3926       if (TREE_TYPE (t))
3927         return t;
3928       return build_x_unary_op (TREE_CODE (t),
3929                                build_expr_from_tree (TREE_OPERAND (t, 0)));
3930
3931     case PLUS_EXPR:
3932     case MINUS_EXPR:
3933     case MULT_EXPR:
3934     case TRUNC_DIV_EXPR:
3935     case CEIL_DIV_EXPR:
3936     case FLOOR_DIV_EXPR:
3937     case ROUND_DIV_EXPR:
3938     case EXACT_DIV_EXPR:
3939     case BIT_AND_EXPR:
3940     case BIT_ANDTC_EXPR:
3941     case BIT_IOR_EXPR:
3942     case BIT_XOR_EXPR:
3943     case TRUNC_MOD_EXPR:
3944     case FLOOR_MOD_EXPR:
3945     case TRUTH_ANDIF_EXPR:
3946     case TRUTH_ORIF_EXPR:
3947     case TRUTH_AND_EXPR:
3948     case TRUTH_OR_EXPR:
3949     case RSHIFT_EXPR:
3950     case LSHIFT_EXPR:
3951     case RROTATE_EXPR:
3952     case LROTATE_EXPR:
3953     case EQ_EXPR:
3954     case NE_EXPR:
3955     case MAX_EXPR:
3956     case MIN_EXPR:
3957     case LE_EXPR:
3958     case GE_EXPR:
3959     case LT_EXPR:
3960     case GT_EXPR:
3961     case MEMBER_REF:
3962       return build_x_binary_op
3963         (TREE_CODE (t), 
3964          build_expr_from_tree (TREE_OPERAND (t, 0)),
3965          build_expr_from_tree (TREE_OPERAND (t, 1)));
3966
3967     case DOTSTAR_EXPR:
3968       return build_m_component_ref
3969         (build_expr_from_tree (TREE_OPERAND (t, 0)),
3970          build_expr_from_tree (TREE_OPERAND (t, 1)));
3971
3972     case SCOPE_REF:
3973       return build_offset_ref (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1));
3974
3975     case ARRAY_REF:
3976       if (TREE_OPERAND (t, 0) == NULL_TREE)
3977         /* new-type-id */
3978         return build_parse_node (ARRAY_REF, NULL_TREE,
3979                                  build_expr_from_tree (TREE_OPERAND (t, 1)));
3980       return grok_array_decl (build_expr_from_tree (TREE_OPERAND (t, 0)),
3981                               build_expr_from_tree (TREE_OPERAND (t, 1)));
3982
3983     case SIZEOF_EXPR:
3984     case ALIGNOF_EXPR:
3985       {
3986         tree r = build_expr_from_tree (TREE_OPERAND (t, 0));
3987         if (!TYPE_P (r))
3988           r = TREE_TYPE (r);
3989         return TREE_CODE (t) == SIZEOF_EXPR ? c_sizeof (r) : c_alignof (r);
3990       }
3991
3992     case MODOP_EXPR:
3993       return build_x_modify_expr
3994         (build_expr_from_tree (TREE_OPERAND (t, 0)),
3995          TREE_CODE (TREE_OPERAND (t, 1)),
3996          build_expr_from_tree (TREE_OPERAND (t, 2)));
3997
3998     case ARROW_EXPR:
3999       return build_x_arrow
4000         (build_expr_from_tree (TREE_OPERAND (t, 0)));
4001
4002     case NEW_EXPR:
4003       return build_new
4004         (build_expr_from_tree (TREE_OPERAND (t, 0)),
4005          build_expr_from_tree (TREE_OPERAND (t, 1)),
4006          build_expr_from_tree (TREE_OPERAND (t, 2)),
4007          NEW_EXPR_USE_GLOBAL (t));
4008
4009     case DELETE_EXPR:
4010       return delete_sanity
4011         (build_expr_from_tree (TREE_OPERAND (t, 0)),
4012          build_expr_from_tree (TREE_OPERAND (t, 1)),
4013          DELETE_EXPR_USE_VEC (t), DELETE_EXPR_USE_GLOBAL (t));
4014
4015     case COMPOUND_EXPR:
4016       if (TREE_OPERAND (t, 1) == NULL_TREE)
4017         return build_x_compound_expr
4018           (build_expr_from_tree (TREE_OPERAND (t, 0)));
4019       else
4020         my_friendly_abort (42);
4021
4022     case METHOD_CALL_EXPR:
4023       if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF)
4024         {
4025           tree ref = TREE_OPERAND (t, 0);
4026           return build_scoped_method_call
4027             (build_expr_from_tree (TREE_OPERAND (t, 1)),
4028              build_expr_from_tree (TREE_OPERAND (ref, 0)),
4029              TREE_OPERAND (ref, 1),
4030              build_expr_from_tree (TREE_OPERAND (t, 2)));
4031         }
4032       else 
4033         {
4034           tree fn = TREE_OPERAND (t, 0);
4035
4036           /* We can get a TEMPLATE_ID_EXPR here on code like:
4037
4038                x->f<2>();
4039               
4040              so we must resolve that.  However, we can also get things
4041              like a BIT_NOT_EXPR here, when referring to a destructor,
4042              and things like that are not correctly resolved by
4043              build_expr_from_tree.  So, just use build_expr_from_tree
4044              when we really need it.  */
4045           if (TREE_CODE (fn) == TEMPLATE_ID_EXPR)
4046             fn = lookup_template_function
4047               (TREE_OPERAND (fn, 0),
4048                build_expr_from_tree (TREE_OPERAND (fn, 1)));
4049
4050           return build_method_call
4051             (build_expr_from_tree (TREE_OPERAND (t, 1)),
4052              fn,
4053              build_expr_from_tree (TREE_OPERAND (t, 2)),
4054              NULL_TREE, LOOKUP_NORMAL);
4055         }
4056
4057     case CALL_EXPR:
4058       if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF)
4059         {
4060           tree ref = TREE_OPERAND (t, 0);
4061           return build_member_call
4062             (build_expr_from_tree (TREE_OPERAND (ref, 0)),
4063              TREE_OPERAND (ref, 1),
4064              build_expr_from_tree (TREE_OPERAND (t, 1)));
4065         }
4066       else
4067         {
4068           tree name = TREE_OPERAND (t, 0);
4069           tree id;
4070           tree args = build_expr_from_tree (TREE_OPERAND (t, 1));
4071           if (args != NULL_TREE && TREE_CODE (name) == LOOKUP_EXPR
4072               && !LOOKUP_EXPR_GLOBAL (name)
4073               && TREE_CODE ((id = TREE_OPERAND (name, 0))) == IDENTIFIER_NODE
4074               && (!current_class_type
4075                   || !lookup_member (current_class_type, id, 0, 0)))
4076             {
4077               /* Do Koenig lookup if there are no class members. */
4078               name = do_identifier (id, 0, args);
4079             }
4080           else if (TREE_CODE (name) == TEMPLATE_ID_EXPR
4081               || ! really_overloaded_fn (name))
4082             name = build_expr_from_tree (name);
4083           return build_x_function_call (name, args, current_class_ref);
4084         }
4085
4086     case COND_EXPR:
4087       return build_x_conditional_expr
4088         (build_expr_from_tree (TREE_OPERAND (t, 0)),
4089          build_expr_from_tree (TREE_OPERAND (t, 1)),
4090          build_expr_from_tree (TREE_OPERAND (t, 2)));
4091
4092     case PSEUDO_DTOR_EXPR:
4093       return (finish_pseudo_destructor_call_expr 
4094               (build_expr_from_tree (TREE_OPERAND (t, 0)),
4095                build_expr_from_tree (TREE_OPERAND (t, 1)),
4096                build_expr_from_tree (TREE_OPERAND (t, 2))));
4097
4098     case TREE_LIST:
4099       {
4100         tree purpose, value, chain;
4101
4102         if (t == void_list_node)
4103           return t;
4104
4105         purpose = TREE_PURPOSE (t);
4106         if (purpose)
4107           purpose = build_expr_from_tree (purpose);
4108         value = TREE_VALUE (t);
4109         if (value)
4110           value = build_expr_from_tree (value);
4111         chain = TREE_CHAIN (t);
4112         if (chain && chain != void_type_node)
4113           chain = build_expr_from_tree (chain);
4114         return tree_cons (purpose, value, chain);
4115       }
4116
4117     case COMPONENT_REF:
4118       {
4119         tree object = build_expr_from_tree (TREE_OPERAND (t, 0));
4120         tree field = TREE_OPERAND (t, 1);
4121         
4122         /* We use a COMPONENT_REF to indicate things of the form `x.b'
4123            and `x.A::b'.  We must distinguish between those cases
4124            here.  */
4125         if (TREE_CODE (field) == SCOPE_REF)
4126           return build_object_ref (object, 
4127                                    TREE_OPERAND (field, 0),
4128                                    TREE_OPERAND (field, 1));
4129         else
4130           return build_x_component_ref (object, field,
4131                                         NULL_TREE, 1);
4132       }
4133
4134     case THROW_EXPR:
4135       return build_throw (build_expr_from_tree (TREE_OPERAND (t, 0)));
4136
4137     case CONSTRUCTOR:
4138       {
4139         tree r;
4140
4141         /* digest_init will do the wrong thing if we let it.  */
4142         if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
4143           return t;
4144
4145         r = build_nt (CONSTRUCTOR, NULL_TREE,
4146                       build_expr_from_tree (CONSTRUCTOR_ELTS (t)));
4147         TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t);
4148
4149         if (TREE_TYPE (t))
4150           return digest_init (TREE_TYPE (t), r, 0);
4151         return r;
4152       }
4153
4154     case TYPEID_EXPR:
4155       if (TYPE_P (TREE_OPERAND (t, 0)))
4156         return get_typeid (TREE_OPERAND (t, 0));
4157       return build_typeid (build_expr_from_tree (TREE_OPERAND (t, 0)));
4158
4159     case VAR_DECL:
4160       return convert_from_reference (t);
4161
4162     case VA_ARG_EXPR:
4163       return build_va_arg (build_expr_from_tree (TREE_OPERAND (t, 0)),
4164                            TREE_TYPE (t));
4165
4166     default:
4167       return t;
4168     }
4169 }
4170
4171 /* This is something of the form `int (*a)++' that has turned out to be an
4172    expr.  It was only converted into parse nodes, so we need to go through
4173    and build up the semantics.  Most of the work is done by
4174    build_expr_from_tree, above.
4175
4176    In the above example, TYPE is `int' and DECL is `*a'.  */
4177
4178 tree
4179 reparse_decl_as_expr (type, decl)
4180      tree type, decl;
4181 {
4182   decl = build_expr_from_tree (decl);
4183   if (type)
4184     return build_functional_cast (type, build_tree_list (NULL_TREE, decl));
4185   else
4186     return decl;
4187 }
4188
4189 /* This is something of the form `int (*a)' that has turned out to be a
4190    decl.  It was only converted into parse nodes, so we need to do the
4191    checking that make_{pointer,reference}_declarator do.  */
4192
4193 tree
4194 finish_decl_parsing (decl)
4195      tree decl;
4196 {
4197   extern int current_class_depth;
4198   
4199   switch (TREE_CODE (decl))
4200     {
4201     case IDENTIFIER_NODE:
4202       return decl;
4203     case INDIRECT_REF:
4204       return make_pointer_declarator
4205         (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0)));
4206     case ADDR_EXPR:
4207       return make_reference_declarator
4208         (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0)));
4209     case BIT_NOT_EXPR:
4210       TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0));
4211       return decl;
4212     case SCOPE_REF:
4213       push_nested_class (TREE_TYPE (TREE_OPERAND (decl, 0)), 3);
4214       TREE_COMPLEXITY (decl) = current_class_depth;
4215       return decl;
4216     case ARRAY_REF:
4217       TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0));
4218       return decl;
4219     case TREE_LIST:
4220       /* For attribute handling.  */
4221       TREE_VALUE (decl) = finish_decl_parsing (TREE_VALUE (decl));
4222       return decl;
4223     default:
4224       my_friendly_abort (5);
4225       return NULL_TREE;
4226     }
4227 }
4228
4229 tree
4230 check_cp_case_value (value)
4231      tree value;
4232 {
4233   if (value == NULL_TREE)
4234     return value;
4235
4236   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
4237   STRIP_TYPE_NOPS (value);
4238   value = decl_constant_value (value);
4239   STRIP_TYPE_NOPS (value);
4240   value = fold (value);
4241
4242   if (TREE_CODE (value) != INTEGER_CST
4243       && value != error_mark_node)
4244     {
4245       cp_error ("case label `%E' does not reduce to an integer constant",
4246                 value);
4247       value = error_mark_node;
4248     }
4249   else
4250     /* Promote char or short to int.  */
4251     value = default_conversion (value);
4252
4253   constant_expression_warning (value);
4254
4255   return value;
4256 }
4257
4258 /* Return 1 if root encloses child. */
4259
4260 static int
4261 is_namespace_ancestor (root, child)
4262      tree root, child;
4263 {
4264   if (root == child)
4265     return 1;
4266   if (root == global_namespace)
4267     return 1;
4268   if (child == global_namespace)
4269     return 0;
4270   return is_namespace_ancestor (root, CP_DECL_CONTEXT (child));
4271 }
4272   
4273
4274 /* Return the namespace that is the common ancestor 
4275    of two given namespaces. */
4276
4277 tree
4278 namespace_ancestor (ns1, ns2)
4279      tree ns1, ns2;
4280 {
4281   if (is_namespace_ancestor (ns1, ns2))
4282     return ns1;
4283   return namespace_ancestor (CP_DECL_CONTEXT (ns1), ns2);
4284 }
4285
4286 /* Insert used into the using list of user. Set indirect_flag if this
4287    directive is not directly from the source. Also find the common
4288    ancestor and let our users know about the new namespace */
4289 static void 
4290 add_using_namespace (user, used, indirect)
4291      tree user;
4292      tree used;
4293      int indirect;
4294 {
4295   tree t;
4296   /* Using oneself is a no-op. */
4297   if (user == used)
4298     return;
4299   my_friendly_assert (TREE_CODE (user) == NAMESPACE_DECL, 380);
4300   my_friendly_assert (TREE_CODE (used) == NAMESPACE_DECL, 380);
4301   /* Check if we already have this. */
4302   t = purpose_member (used, DECL_NAMESPACE_USING (user));
4303   if (t != NULL_TREE)
4304     {
4305       if (!indirect)
4306         /* Promote to direct usage. */
4307         TREE_INDIRECT_USING (t) = 0;
4308       return;
4309     }
4310
4311   /* Add used to the user's using list. */
4312   DECL_NAMESPACE_USING (user) 
4313     = tree_cons (used, namespace_ancestor (user, used), 
4314                  DECL_NAMESPACE_USING (user));
4315
4316   TREE_INDIRECT_USING (DECL_NAMESPACE_USING (user)) = indirect;
4317
4318   /* Add user to the used's users list. */
4319   DECL_NAMESPACE_USERS (used)
4320     = tree_cons (user, 0, DECL_NAMESPACE_USERS (used));
4321
4322   /* Recursively add all namespaces used. */
4323   for (t = DECL_NAMESPACE_USING (used); t; t = TREE_CHAIN (t))
4324     /* indirect usage */
4325     add_using_namespace (user, TREE_PURPOSE (t), 1);
4326
4327   /* Tell everyone using us about the new used namespaces. */
4328   for (t = DECL_NAMESPACE_USERS (user); t; t = TREE_CHAIN (t))
4329     add_using_namespace (TREE_PURPOSE (t), used, 1);
4330 }
4331
4332 /* Combines two sets of overloaded functions into an OVERLOAD chain, removing
4333    duplicates.  The first list becomes the tail of the result.
4334
4335    The algorithm is O(n^2).  We could get this down to O(n log n) by
4336    doing a sort on the addresses of the functions, if that becomes
4337    necessary.  */
4338
4339 static tree
4340 merge_functions (s1, s2)
4341      tree s1;
4342      tree s2;
4343 {
4344   for (; s2; s2 = OVL_NEXT (s2))
4345     {
4346       tree fn = OVL_CURRENT (s2);
4347       if (! ovl_member (fn, s1))
4348         s1 = build_overload (fn, s1);
4349     }
4350   return s1;
4351 }
4352
4353 /* This should return an error not all definitions define functions.
4354    It is not an error if we find two functions with exactly the
4355    same signature, only if these are selected in overload resolution.
4356    old is the current set of bindings, new the freshly-found binding.
4357    XXX Do we want to give *all* candidates in case of ambiguity?
4358    XXX In what way should I treat extern declarations?
4359    XXX I don't want to repeat the entire duplicate_decls here */
4360
4361 static tree
4362 ambiguous_decl (name, old, new, flags)
4363      tree name;
4364      tree old;
4365      tree new;
4366      int flags;
4367 {
4368   tree val, type;
4369   my_friendly_assert (old != NULL_TREE, 393);
4370   /* Copy the value. */
4371   val = BINDING_VALUE (new);
4372   if (val)
4373     switch (TREE_CODE (val))
4374       {
4375       case TEMPLATE_DECL:
4376         /* If we expect types or namespaces, and not templates,
4377            or this is not a template class. */
4378         if (LOOKUP_QUALIFIERS_ONLY (flags)
4379             && !DECL_CLASS_TEMPLATE_P (val))
4380           val = NULL_TREE;
4381         break;
4382       case TYPE_DECL:
4383         if (LOOKUP_NAMESPACES_ONLY (flags))
4384           val = NULL_TREE;
4385         break;
4386       case NAMESPACE_DECL:
4387         if (LOOKUP_TYPES_ONLY (flags))
4388           val = NULL_TREE;
4389         break;
4390       default:
4391         if (LOOKUP_QUALIFIERS_ONLY (flags))
4392           val = NULL_TREE;
4393       }
4394         
4395   if (!BINDING_VALUE (old))
4396     BINDING_VALUE (old) = val;
4397   else if (val && val != BINDING_VALUE (old))
4398     {
4399       if (is_overloaded_fn (BINDING_VALUE (old)) 
4400           && is_overloaded_fn (val))
4401         {
4402           BINDING_VALUE (old) = merge_functions (BINDING_VALUE (old),
4403                                                  val);
4404         }
4405       else
4406         {
4407           /* Some declarations are functions, some are not. */
4408           if (flags & LOOKUP_COMPLAIN)
4409             {
4410               /* If we've already given this error for this lookup,
4411                  BINDING_VALUE (old) is error_mark_node, so let's not
4412                  repeat ourselves.  */
4413               if (BINDING_VALUE (old) != error_mark_node)
4414                 {
4415                   cp_error ("use of `%D' is ambiguous", name);
4416                   cp_error_at ("  first declared as `%#D' here",
4417                                BINDING_VALUE (old));
4418                 }
4419               cp_error_at ("  also declared as `%#D' here", val);
4420             }
4421           BINDING_VALUE (old) = error_mark_node;
4422         }
4423     }
4424   /* ... and copy the type. */
4425   type = BINDING_TYPE (new);
4426   if (LOOKUP_NAMESPACES_ONLY (flags))
4427     type = NULL_TREE;
4428   if (!BINDING_TYPE (old))
4429     BINDING_TYPE (old) = type;
4430   else if (type && BINDING_TYPE (old) != type)
4431     {
4432       if (flags & LOOKUP_COMPLAIN)
4433         {
4434           cp_error ("`%D' denotes an ambiguous type",name);
4435           cp_error_at ("  first type here", BINDING_TYPE (old));
4436           cp_error_at ("  other type here", type);
4437         }
4438     }
4439   return old;
4440 }
4441
4442 /* Subroutine of unualified_namespace_lookup:
4443    Add the bindings of NAME in used namespaces to VAL.
4444    We are currently looking for names in namespace SCOPE, so we
4445    look through USINGS for using-directives of namespaces
4446    which have SCOPE as a common ancestor with the current scope.
4447    Returns zero on errors. */
4448
4449 int
4450 lookup_using_namespace (name, val, usings, scope, flags, spacesp)
4451      tree name, val, usings, scope;
4452      int flags;
4453      tree *spacesp;
4454 {
4455   tree iter;
4456   tree val1;
4457   /* Iterate over all used namespaces in current, searching for using
4458      directives of scope. */
4459   for (iter = usings; iter; iter = TREE_CHAIN (iter))
4460     if (TREE_VALUE (iter) == scope)
4461       {
4462         if (spacesp)
4463           *spacesp = tree_cons (TREE_PURPOSE (iter), NULL_TREE,
4464                                 *spacesp);
4465         val1 = binding_for_name (name, TREE_PURPOSE (iter));
4466         /* Resolve ambiguities. */
4467         val = ambiguous_decl (name, val, val1, flags);
4468       }
4469   return BINDING_VALUE (val) != error_mark_node;
4470 }
4471
4472 /* [namespace.qual]
4473    Accepts the NAME to lookup and its qualifying SCOPE.
4474    Returns the name/type pair found into the CPLUS_BINDING RESULT,
4475    or 0 on error. */
4476
4477 int
4478 qualified_lookup_using_namespace (name, scope, result, flags)
4479      tree name;
4480      tree scope;
4481      tree result;
4482      int flags;
4483 {
4484   /* Maintain a list of namespaces visited... */
4485   tree seen = NULL_TREE;
4486   /* ... and a list of namespace yet to see. */
4487   tree todo = NULL_TREE;
4488   tree usings;
4489   /* Look through namespace aliases.  */
4490   scope = ORIGINAL_NAMESPACE (scope);
4491   while (scope && (result != error_mark_node))
4492     {
4493       seen = tree_cons (scope, NULL_TREE, seen);
4494       result = ambiguous_decl (name, result,
4495                                binding_for_name (name, scope), flags);
4496       if (!BINDING_VALUE (result) && !BINDING_TYPE (result))
4497         /* Consider using directives. */
4498         for (usings = DECL_NAMESPACE_USING (scope); usings;
4499              usings = TREE_CHAIN (usings))
4500           /* If this was a real directive, and we have not seen it. */
4501           if (!TREE_INDIRECT_USING (usings)
4502               && !purpose_member (TREE_PURPOSE (usings), seen))
4503             todo = tree_cons (TREE_PURPOSE (usings), NULL_TREE, todo);
4504       if (todo)
4505         {
4506           scope = TREE_PURPOSE (todo);
4507           todo = TREE_CHAIN (todo);
4508         }
4509       else
4510         scope = NULL_TREE; /* If there never was a todo list. */
4511     }
4512   return result != error_mark_node;
4513 }
4514
4515 /* [namespace.memdef]/2 */
4516
4517 /* Set the context of a declaration to scope. Complain if we are not
4518    outside scope. */
4519
4520 void
4521 set_decl_namespace (decl, scope, friendp)
4522      tree decl;
4523      tree scope;
4524      int friendp;
4525 {
4526   tree old;
4527   if (scope == std_node)
4528     scope = global_namespace;
4529   /* Get rid of namespace aliases. */
4530   scope = ORIGINAL_NAMESPACE (scope);
4531   
4532   /* It is ok for friends to be qualified in parallel space.  */
4533   if (!friendp && !is_namespace_ancestor (current_namespace, scope))
4534     cp_error ("declaration of `%D' not in a namespace surrounding `%D'",
4535               decl, scope);
4536   DECL_CONTEXT (decl) = FROB_CONTEXT (scope);
4537   if (scope != current_namespace)
4538     {
4539       /* See whether this has been declared in the namespace. */
4540       old = namespace_binding (DECL_NAME (decl), scope);
4541       if (!old)
4542         /* No old declaration at all. */
4543         goto complain;
4544       if (!is_overloaded_fn (decl))
4545         /* Don't compare non-function decls with decls_match here,
4546            since it can't check for the correct constness at this
4547            point. pushdecl will find those errors later.  */
4548         return;
4549       /* Since decl is a function, old should contain a function decl. */
4550       if (!is_overloaded_fn (old))
4551         goto complain;
4552       if (processing_template_decl || processing_specialization)
4553         /* We have not yet called push_template_decl to turn the
4554            FUNCTION_DECL into a TEMPLATE_DECL, so the declarations
4555            won't match.  But, we'll check later, when we construct the
4556            template.  */
4557         return;
4558       for (; old; old = OVL_NEXT (old))
4559         if (decls_match (decl, OVL_CURRENT (old)))
4560           return;
4561     }
4562   else
4563     return;
4564  complain:
4565   cp_error ("`%D' should have been declared inside `%D'",
4566             decl, scope);
4567
4568
4569 /* Compute the namespace where a declaration is defined. */
4570
4571 static tree
4572 decl_namespace (decl)
4573      tree decl;
4574 {
4575   if (TYPE_P (decl))
4576     decl = TYPE_STUB_DECL (decl);
4577   while (DECL_CONTEXT (decl))
4578     {
4579       decl = DECL_CONTEXT (decl);
4580       if (TREE_CODE (decl) == NAMESPACE_DECL)
4581         return decl;
4582       if (TYPE_P (decl))
4583         decl = TYPE_STUB_DECL (decl);
4584       my_friendly_assert (DECL_P (decl), 390);
4585     }
4586
4587   return global_namespace;
4588 }
4589
4590 /* Return the namespace where the current declaration is declared. */
4591
4592 tree
4593 current_decl_namespace ()
4594 {
4595   tree result;
4596   /* If we have been pushed into a different namespace, use it. */
4597   if (decl_namespace_list)
4598     return TREE_PURPOSE (decl_namespace_list);
4599
4600   if (current_class_type)
4601     result = decl_namespace (TYPE_STUB_DECL (current_class_type));
4602   else if (current_function_decl)
4603     result = decl_namespace (current_function_decl);
4604   else 
4605     result = current_namespace;
4606   return result;
4607 }
4608
4609 /* Temporarily set the namespace for the current declaration. */
4610
4611 void
4612 push_decl_namespace (decl)
4613      tree decl;
4614 {
4615   if (TREE_CODE (decl) != NAMESPACE_DECL)
4616     decl = decl_namespace (decl);
4617   decl_namespace_list = tree_cons (decl, NULL_TREE, decl_namespace_list);
4618 }
4619
4620 void
4621 pop_decl_namespace ()
4622 {
4623   decl_namespace_list = TREE_CHAIN (decl_namespace_list);
4624 }
4625
4626 /* Enter a class or namespace scope. */
4627
4628 void
4629 push_scope (t)
4630      tree t;
4631 {
4632   if (TREE_CODE (t) == NAMESPACE_DECL)
4633     push_decl_namespace (t);
4634   else
4635     pushclass (t, 2);
4636 }
4637
4638 /* Leave scope pushed by push_scope. */
4639
4640 void
4641 pop_scope (t)
4642      tree t;
4643 {
4644   if (TREE_CODE (t) == NAMESPACE_DECL)
4645     pop_decl_namespace ();
4646   else
4647     popclass ();
4648 }
4649
4650 /* [basic.lookup.koenig] */
4651 /* A non-zero return value in the functions below indicates an error.
4652    All nodes allocated in the procedure are on the scratch obstack. */
4653
4654 struct arg_lookup
4655 {
4656   tree name;
4657   tree namespaces;
4658   tree classes;
4659   tree functions;
4660 };
4661
4662 static int arg_assoc         PARAMS ((struct arg_lookup*, tree));
4663 static int arg_assoc_args    PARAMS ((struct arg_lookup*, tree));
4664 static int arg_assoc_type    PARAMS ((struct arg_lookup*, tree));
4665 static int add_function      PARAMS ((struct arg_lookup *, tree));
4666 static int arg_assoc_namespace PARAMS ((struct arg_lookup *, tree));
4667 static int arg_assoc_class   PARAMS ((struct arg_lookup *, tree));
4668 static int arg_assoc_template_arg PARAMS ((struct arg_lookup*, tree));
4669
4670 /* Add a function to the lookup structure.
4671    Returns 1 on error.  */
4672
4673 static int
4674 add_function (k, fn)
4675      struct arg_lookup *k;
4676      tree fn;
4677 {
4678   /* We used to check here to see if the function was already in the list,
4679      but that's O(n^2), which is just too expensive for function lookup.
4680      Now we deal with the occasional duplicate in joust.  In doing this, we
4681      assume that the number of duplicates will be small compared to the
4682      total number of functions being compared, which should usually be the
4683      case.  */
4684
4685   /* We must find only functions, or exactly one non-function. */
4686   if (k->functions && is_overloaded_fn (k->functions)
4687       && is_overloaded_fn (fn))
4688     k->functions = build_overload (fn, k->functions);
4689   else if (k->functions)
4690     {
4691       tree f1 = OVL_CURRENT (k->functions);
4692       tree f2 = fn;
4693       if (is_overloaded_fn (f1))
4694         {
4695           fn = f1; f1 = f2; f2 = fn;
4696         }
4697       cp_error_at ("`%D' is not a function,", f1);
4698       cp_error_at ("  conflict with `%D'", f2);
4699       cp_error ("  in call to `%D'", k->name);
4700       return 1;
4701     }
4702   else
4703     k->functions = fn;
4704   return 0;
4705 }
4706
4707 /* Add functions of a namespace to the lookup structure.
4708    Returns 1 on error.  */
4709
4710 static int
4711 arg_assoc_namespace (k, scope)
4712      struct arg_lookup *k;
4713      tree scope;
4714 {
4715   tree value;
4716
4717   if (purpose_member (scope, k->namespaces))
4718     return 0;
4719   k->namespaces = tree_cons (scope, NULL_TREE, k->namespaces);
4720   
4721   value = namespace_binding (k->name, scope);
4722   if (!value)
4723     return 0;
4724
4725   for (; value; value = OVL_NEXT (value))
4726     if (add_function (k, OVL_CURRENT (value)))
4727       return 1;
4728   
4729   return 0;
4730 }
4731
4732 /* Adds everything associated with a template argument to the lookup
4733    structure.  Returns 1 on error.  */
4734
4735 static int
4736 arg_assoc_template_arg (k, arg)
4737      struct arg_lookup* k;
4738      tree arg;
4739 {
4740   /* [basic.lookup.koenig]
4741
4742      If T is a template-id, its associated namespaces and classes are
4743      ... the namespaces and classes associated with the types of the
4744      template arguments provided for template type parameters
4745      (excluding template template parameters); the namespaces in which
4746      any template template arguments are defined; and the classes in
4747      which any member templates used as template template arguments
4748      are defined.  [Note: non-type template arguments do not
4749      contribute to the set of associated namespaces.  ]  */
4750
4751   /* Consider first template template arguments.  */
4752   if (TREE_CODE (arg) == TEMPLATE_DECL)
4753     {
4754       tree ctx = CP_DECL_CONTEXT (arg);
4755
4756       /* It's not a member template.  */
4757       if (TREE_CODE (ctx) == NAMESPACE_DECL)
4758         return arg_assoc_namespace (k, ctx);
4759       /* Otherwise, it must be member template.  */
4760       else 
4761         return arg_assoc_class (k, ctx);
4762     }
4763   /* It's not a template template argument, but it is a type template
4764      argument.  */
4765   else if (TYPE_P (arg))
4766     return arg_assoc_type (k, arg);
4767   /* It's a non-type template argument.  */
4768   else
4769     return 0;
4770 }
4771
4772 /* Adds everything associated with class to the lookup structure.
4773    Returns 1 on error.  */
4774
4775 static int
4776 arg_assoc_class (k, type)
4777      struct arg_lookup* k;
4778      tree type;
4779 {
4780   tree list, friends, context;
4781   int i;
4782   
4783   /* Backend build structures, such as __builtin_va_list, aren't
4784      affected by all this.  */
4785   if (!CLASS_TYPE_P (type))
4786     return 0;
4787
4788   if (purpose_member (type, k->classes))
4789     return 0;
4790   k->classes = tree_cons (type, NULL_TREE, k->classes);
4791   
4792   context = decl_namespace (TYPE_MAIN_DECL (type));
4793   if (arg_assoc_namespace (k, context))
4794     return 1;
4795   
4796   /* Process baseclasses. */
4797   for (i = 0; i < CLASSTYPE_N_BASECLASSES (type); i++)
4798     if (arg_assoc_class (k, TYPE_BINFO_BASETYPE (type, i)))
4799       return 1;
4800   
4801   /* Process friends. */
4802   for (list = DECL_FRIENDLIST (TYPE_MAIN_DECL (type)); list; 
4803        list = TREE_CHAIN (list))
4804     if (k->name == TREE_PURPOSE (list))
4805       for (friends = TREE_VALUE (list); friends; 
4806            friends = TREE_CHAIN (friends))
4807         /* Only interested in global functions with potentially hidden
4808            (i.e. unqualified) declarations. */
4809         if (TREE_PURPOSE (list) == error_mark_node && TREE_VALUE (list)
4810             && decl_namespace (TREE_VALUE (list)) == context)
4811           if (add_function (k, TREE_VALUE (list)))
4812             return 1;
4813
4814   /* Process template arguments.  */
4815   if (CLASSTYPE_TEMPLATE_INFO (type))
4816     {
4817       list = INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (type));
4818       for (i = 0; i < TREE_VEC_LENGTH (list); ++i) 
4819         arg_assoc_template_arg (k, TREE_VEC_ELT (list, i));
4820     }
4821
4822   return 0;
4823 }
4824
4825 /* Adds everything associated with a given type.
4826    Returns 1 on error.  */
4827
4828 static int
4829 arg_assoc_type (k, type)
4830      struct arg_lookup *k;
4831      tree type;
4832 {
4833   switch (TREE_CODE (type))
4834     {
4835     case VOID_TYPE:
4836     case INTEGER_TYPE:
4837     case REAL_TYPE:
4838     case COMPLEX_TYPE:
4839     case CHAR_TYPE:
4840     case BOOLEAN_TYPE:
4841       return 0;
4842     case RECORD_TYPE:
4843       if (TYPE_PTRMEMFUNC_P (type))
4844         return arg_assoc_type (k, TYPE_PTRMEMFUNC_FN_TYPE (type));
4845       return arg_assoc_class (k, type);
4846     case POINTER_TYPE:
4847     case REFERENCE_TYPE:
4848     case ARRAY_TYPE:
4849       return arg_assoc_type (k, TREE_TYPE (type));
4850     case UNION_TYPE:
4851     case ENUMERAL_TYPE:
4852       return arg_assoc_namespace (k, decl_namespace (TYPE_MAIN_DECL (type)));
4853     case OFFSET_TYPE:
4854       /* Pointer to member: associate class type and value type. */
4855       if (arg_assoc_type (k, TYPE_OFFSET_BASETYPE (type)))
4856         return 1;
4857       return arg_assoc_type (k, TREE_TYPE (type));
4858     case METHOD_TYPE:
4859       /* The basetype is referenced in the first arg type, so just
4860          fall through.  */
4861     case FUNCTION_TYPE:
4862       /* Associate the parameter types. */
4863       if (arg_assoc_args (k, TYPE_ARG_TYPES (type)))
4864         return 1;
4865       /* Associate the return type. */
4866       return arg_assoc_type (k, TREE_TYPE (type));
4867     case TEMPLATE_TYPE_PARM:
4868     case TEMPLATE_TEMPLATE_PARM:
4869       return 0;
4870     case LANG_TYPE:
4871       if (type == unknown_type_node)
4872         return 0;
4873       /* else fall through */
4874     default:
4875       my_friendly_abort (390);
4876     }
4877   return 0;
4878 }
4879
4880 /* Adds everything associated with arguments.  Returns 1 on error.  */
4881
4882 static int
4883 arg_assoc_args (k, args)
4884      struct arg_lookup* k;
4885      tree args;
4886 {
4887   for (; args; args = TREE_CHAIN (args))
4888     if (arg_assoc (k, TREE_VALUE (args)))
4889       return 1;
4890   return 0;
4891 }
4892
4893 /* Adds everything associated with a given tree_node.  Returns 1 on error.  */
4894
4895 static int
4896 arg_assoc (k, n)
4897      struct arg_lookup* k;
4898      tree n;
4899 {
4900   if (n == error_mark_node)
4901     return 0;
4902
4903   if (TYPE_P (n))
4904     return arg_assoc_type (k, n);
4905
4906   if (! type_unknown_p (n))
4907     return arg_assoc_type (k, TREE_TYPE (n));
4908
4909   if (TREE_CODE (n) == ADDR_EXPR)
4910     n = TREE_OPERAND (n, 0);
4911   if (TREE_CODE (n) == COMPONENT_REF)
4912     n = TREE_OPERAND (n, 1);
4913   if (TREE_CODE (n) == OFFSET_REF)
4914     n = TREE_OPERAND (n, 1);
4915   while (TREE_CODE (n) == TREE_LIST)
4916     n = TREE_VALUE (n);
4917
4918   if (TREE_CODE (n) == FUNCTION_DECL)
4919     return arg_assoc_type (k, TREE_TYPE (n));
4920   if (TREE_CODE (n) == TEMPLATE_ID_EXPR)
4921     {
4922       /* [basic.lookup.koenig]
4923
4924          If T is a template-id, its associated namespaces and classes
4925          are the namespace in which the template is defined; for
4926          member templates, the member template's class...  */
4927       tree template = TREE_OPERAND (n, 0);
4928       tree args = TREE_OPERAND (n, 1);
4929       tree ctx;
4930       tree arg;
4931
4932       /* First, the template.  There may actually be more than one if
4933          this is an overloaded function template.  But, in that case,
4934          we only need the first; all the functions will be in the same
4935          namespace.  */
4936       template = OVL_CURRENT (template);
4937
4938       ctx = CP_DECL_CONTEXT (template);
4939        
4940       if (TREE_CODE (ctx) == NAMESPACE_DECL)
4941         {
4942           if (arg_assoc_namespace (k, ctx) == 1)
4943             return 1;
4944         }
4945       /* It must be a member template.  */
4946       else if (arg_assoc_class (k, ctx) == 1)
4947         return 1;
4948
4949       /* Now the arguments.  */
4950       for (arg = args; arg != NULL_TREE; arg = TREE_CHAIN (arg))
4951         if (arg_assoc_template_arg (k, TREE_VALUE (arg)) == 1)
4952           return 1;
4953     }
4954   else
4955     {
4956       my_friendly_assert (TREE_CODE (n) == OVERLOAD, 980715);
4957       
4958       for (; n; n = OVL_CHAIN (n))
4959         if (arg_assoc_type (k, TREE_TYPE (OVL_FUNCTION (n))))
4960           return 1;
4961     }
4962
4963   return 0;
4964 }
4965
4966 /* Performs Koenig lookup depending on arguments, where fns
4967    are the functions found in normal lookup. */
4968
4969 tree
4970 lookup_arg_dependent (name, fns, args)
4971      tree name;
4972      tree fns;
4973      tree args;
4974 {
4975   struct arg_lookup k;
4976   tree fn = NULL_TREE;
4977
4978   k.name = name;
4979   k.functions = fns;
4980   k.classes = NULL_TREE;
4981
4982   /* Note that we've already looked at some namespaces during normal
4983      unqualified lookup, unless we found a decl in function scope.  */
4984   if (fns)
4985     fn = OVL_CURRENT (fns);
4986   if (fn && TREE_CODE (fn) == FUNCTION_DECL && DECL_LOCAL_FUNCTION_P (fn))
4987     k.namespaces = NULL_TREE;
4988   else
4989     unqualified_namespace_lookup (name, 0, &k.namespaces);
4990
4991   arg_assoc_args (&k, args);
4992   return k.functions;
4993 }
4994
4995 /* Process a namespace-alias declaration. */
4996
4997 void
4998 do_namespace_alias (alias, namespace)
4999      tree alias, namespace;
5000 {
5001   if (TREE_CODE (namespace) != NAMESPACE_DECL)
5002     {
5003       /* The parser did not find it, so it's not there. */
5004       cp_error ("unknown namespace `%D'", namespace);
5005       return;
5006     }
5007
5008   namespace = ORIGINAL_NAMESPACE (namespace);
5009
5010   /* Build the alias. */
5011   alias = build_lang_decl (NAMESPACE_DECL, alias, void_type_node);     
5012   DECL_NAMESPACE_ALIAS (alias) = namespace;
5013   pushdecl (alias);
5014 }
5015
5016 /* Check a non-member using-declaration. Return the name and scope
5017    being used, and the USING_DECL, or NULL_TREE on failure. */
5018
5019 static tree
5020 validate_nonmember_using_decl (decl, scope, name)
5021      tree decl;
5022      tree *scope;
5023      tree *name;
5024 {
5025   if (TREE_CODE (decl) == SCOPE_REF
5026       && TREE_OPERAND (decl, 0) == std_node)
5027     {
5028       if (namespace_bindings_p ()
5029           && current_namespace == global_namespace)
5030         /* There's no need for a using declaration at all, here,
5031            since `std' is the same as `::'.  We can't just pass this
5032            on because we'll complain later about declaring something
5033            in the same scope as a using declaration with the same
5034            name.  We return NULL_TREE which indicates to the caller
5035            that there's no need to do any further processing.  */
5036         return NULL_TREE;
5037
5038       *scope = global_namespace;
5039       *name = TREE_OPERAND (decl, 1);
5040     }
5041   else if (TREE_CODE (decl) == SCOPE_REF)
5042     {
5043       *scope = TREE_OPERAND (decl, 0);
5044       *name = TREE_OPERAND (decl, 1);
5045
5046       /* [namespace.udecl]
5047
5048          A using-declaration for a class member shall be a
5049          member-declaration.  */
5050       if (TREE_CODE (*scope) != NAMESPACE_DECL)
5051         {
5052           if (TYPE_P (*scope))
5053             cp_error ("`%T' is not a namespace", *scope);
5054           else
5055             cp_error ("`%D' is not a namespace", *scope);
5056           return NULL_TREE;
5057         }
5058     }
5059   else if (TREE_CODE (decl) == IDENTIFIER_NODE
5060            || TREE_CODE (decl) == TYPE_DECL
5061            || TREE_CODE (decl) == TEMPLATE_DECL)
5062     {
5063       *scope = global_namespace;
5064       *name = decl;
5065     }
5066   else
5067     my_friendly_abort (382);
5068   if (DECL_P (*name))
5069     *name = DECL_NAME (*name);
5070   /* Make a USING_DECL. */
5071   return push_using_decl (*scope, *name);
5072 }
5073
5074 /* Process local and global using-declarations. */
5075
5076 static void
5077 do_nonmember_using_decl (scope, name, oldval, oldtype, newval, newtype)
5078      tree scope, name;
5079      tree oldval, oldtype;
5080      tree *newval, *newtype;
5081 {
5082   tree decls;
5083
5084   *newval = *newtype = NULL_TREE;
5085   decls = make_node (CPLUS_BINDING);
5086   if (!qualified_lookup_using_namespace (name, scope, decls, 0))
5087     /* Lookup error */
5088     return;
5089
5090   if (!BINDING_VALUE (decls) && !BINDING_TYPE (decls))
5091     {
5092       cp_error ("`%D' not declared", name);
5093       return;
5094     }
5095
5096   /* Check for using functions. */
5097   if (BINDING_VALUE (decls) && is_overloaded_fn (BINDING_VALUE (decls)))
5098     {
5099       tree tmp, tmp1;
5100
5101       if (oldval && !is_overloaded_fn (oldval))
5102         {
5103           duplicate_decls (OVL_CURRENT (BINDING_VALUE (decls)), oldval);
5104           oldval = NULL_TREE;
5105         }
5106
5107       *newval = oldval;
5108       for (tmp = BINDING_VALUE (decls); tmp; tmp = OVL_NEXT (tmp))
5109         {
5110           tree new_fn = OVL_CURRENT (tmp);
5111
5112           /* [namespace.udecl]
5113
5114              If a function declaration in namespace scope or block
5115              scope has the same name and the same parameter types as a
5116              function introduced by a using declaration the program is
5117              ill-formed.  */
5118           for (tmp1 = oldval; tmp1; tmp1 = OVL_NEXT (tmp1))
5119             {
5120               tree old_fn = OVL_CURRENT (tmp1);
5121
5122               if (!OVL_USED (tmp1)
5123                   && compparms (TYPE_ARG_TYPES (TREE_TYPE (new_fn)),
5124                                 TYPE_ARG_TYPES (TREE_TYPE (old_fn))))
5125                 {
5126                   /* There was already a non-using declaration in
5127                      this scope with the same parameter types.  */
5128                   cp_error ("`%D' is already declared in this scope",
5129                             name);
5130                   break;
5131                 }
5132               else if (duplicate_decls (new_fn, old_fn))
5133                 /* We're re-using something we already used 
5134                    before.  We don't need to add it again.  */ 
5135                 break;
5136             }
5137
5138           /* If we broke out of the loop, there's no reason to add
5139              this function to the using declarations for this
5140              scope.  */
5141           if (tmp1)
5142             continue;
5143             
5144           *newval = build_overload (OVL_CURRENT (tmp), *newval);
5145           if (TREE_CODE (*newval) != OVERLOAD)
5146             *newval = ovl_cons (*newval, NULL_TREE);
5147           OVL_USED (*newval) = 1;
5148         }
5149     }
5150   else 
5151     {
5152       *newval = BINDING_VALUE (decls);
5153       if (oldval)
5154         duplicate_decls (*newval, oldval);
5155     } 
5156
5157   *newtype = BINDING_TYPE (decls);
5158   if (oldtype && *newtype && oldtype != *newtype)
5159     {
5160       cp_error ("using directive `%D' introduced ambiguous type `%T'",
5161                 name, oldtype);
5162       return;
5163     }
5164 }
5165
5166 /* Process a using-declaration not appearing in class or local scope. */
5167
5168 void
5169 do_toplevel_using_decl (decl)
5170      tree decl;
5171 {
5172   tree scope, name, binding;
5173   tree oldval, oldtype, newval, newtype;
5174
5175   decl = validate_nonmember_using_decl (decl, &scope, &name);
5176   if (decl == NULL_TREE)
5177     return;
5178   
5179   binding = binding_for_name (name, current_namespace);
5180
5181   oldval = BINDING_VALUE (binding);
5182   oldtype = BINDING_TYPE (binding);
5183
5184   do_nonmember_using_decl (scope, name, oldval, oldtype, &newval, &newtype);
5185
5186   /* Copy declarations found. */
5187   if (newval)
5188     BINDING_VALUE (binding) = newval;
5189   if (newtype)
5190     BINDING_TYPE (binding) = newtype;
5191   return;
5192 }
5193
5194 /* Process a using-declaration at function scope.  */
5195
5196 void
5197 do_local_using_decl (decl)
5198      tree decl;
5199 {
5200   tree scope, name;
5201   tree oldval, oldtype, newval, newtype;
5202
5203   decl = validate_nonmember_using_decl (decl, &scope, &name);
5204   if (decl == NULL_TREE)
5205     return;
5206
5207   oldval = lookup_name_current_level (name);
5208   oldtype = lookup_type_current_level (name);
5209
5210   do_nonmember_using_decl (scope, name, oldval, oldtype, &newval, &newtype);
5211
5212   if (newval)
5213     {
5214       if (is_overloaded_fn (newval))
5215         {
5216           tree fn, term;
5217
5218           /* We only need to push declarations for those functions
5219              that were not already bound in the current level.
5220              The old value might be NULL_TREE, it might be a single
5221              function, or an OVERLOAD.  */
5222           if (oldval && TREE_CODE (oldval) == OVERLOAD)
5223             term = OVL_FUNCTION (oldval);
5224           else
5225             term = oldval;
5226           for (fn = newval; fn && OVL_CURRENT (fn) != term; 
5227                fn = OVL_NEXT (fn))
5228             push_overloaded_decl (OVL_CURRENT (fn), 
5229                                   PUSH_LOCAL | PUSH_USING);
5230         }
5231       else
5232         push_local_binding (name, newval, PUSH_USING);
5233     }
5234   if (newtype)
5235     set_identifier_type_value (name, newtype);
5236 }
5237
5238 tree
5239 do_class_using_decl (decl)
5240      tree decl;
5241 {
5242   tree name, value;
5243
5244   if (TREE_CODE (decl) != SCOPE_REF
5245       || !TYPE_P (TREE_OPERAND (decl, 0)))
5246     {
5247       cp_error ("using-declaration for non-member at class scope");
5248       return NULL_TREE;
5249     }
5250   name = TREE_OPERAND (decl, 1);
5251   if (TREE_CODE (name) == BIT_NOT_EXPR)
5252     {
5253       cp_error ("using-declaration for destructor");
5254       return NULL_TREE;
5255     }
5256   if (TREE_CODE (name) == TYPE_DECL)
5257     name = DECL_NAME (name);
5258
5259   my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 980716);
5260
5261   value = build_lang_decl (USING_DECL, name, void_type_node);
5262   DECL_INITIAL (value) = TREE_OPERAND (decl, 0);
5263   return value;
5264 }
5265
5266 /* Process a using-directive. */
5267
5268 void
5269 do_using_directive (namespace)
5270      tree namespace;
5271 {
5272   if (namespace == std_node)
5273     return;
5274   /* using namespace A::B::C; */
5275   if (TREE_CODE (namespace) == SCOPE_REF)
5276       namespace = TREE_OPERAND (namespace, 1);
5277   if (TREE_CODE (namespace) == IDENTIFIER_NODE)
5278     {
5279       /* Lookup in lexer did not find a namespace. */
5280       cp_error ("namespace `%T' undeclared", namespace);
5281       return;
5282     }
5283   if (TREE_CODE (namespace) != NAMESPACE_DECL)
5284     {
5285       cp_error ("`%T' is not a namespace", namespace);
5286       return;
5287     }
5288   namespace = ORIGINAL_NAMESPACE (namespace);
5289   if (!toplevel_bindings_p ())
5290     push_using_directive (namespace);
5291   else
5292     /* direct usage */
5293     add_using_namespace (current_namespace, namespace, 0);
5294 }
5295
5296 void
5297 check_default_args (x)
5298      tree x;
5299 {
5300   tree arg = TYPE_ARG_TYPES (TREE_TYPE (x));
5301   int saw_def = 0, i = 0 - (TREE_CODE (TREE_TYPE (x)) == METHOD_TYPE);
5302   for (; arg && arg != void_list_node; arg = TREE_CHAIN (arg), ++i)
5303     {
5304       if (TREE_PURPOSE (arg))
5305         saw_def = 1;
5306       else if (saw_def)
5307         {
5308           cp_error_at ("default argument missing for parameter %P of `%+#D'",
5309                        i, x);
5310           break;
5311         }
5312     }
5313 }
5314
5315 void
5316 mark_used (decl)
5317      tree decl;
5318 {
5319   TREE_USED (decl) = 1;
5320   if (processing_template_decl)
5321     return;
5322   assemble_external (decl);
5323
5324   /* Is it a synthesized method that needs to be synthesized?  */
5325   if (TREE_CODE (decl) == FUNCTION_DECL
5326       && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
5327       && DECL_ARTIFICIAL (decl) 
5328       && ! DECL_INITIAL (decl)
5329       /* Kludge: don't synthesize for default args.  */
5330       && current_function_decl)
5331     {
5332       synthesize_method (decl);
5333       /* If we've already synthesized the method we don't need to
5334          instantiate it, so we can return right away.  */
5335       return;
5336     }
5337
5338   /* If this is a function or variable that is an instance of some
5339      template, we now know that we will need to actually do the
5340      instantiation. We check that DECL is not an explicit
5341      instantiation because that is not checked in instantiate_decl.  */
5342   if ((DECL_NON_THUNK_FUNCTION_P (decl) || TREE_CODE (decl) == VAR_DECL)
5343       && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)
5344       && (!DECL_EXPLICIT_INSTANTIATION (decl)
5345           || (TREE_CODE (decl) == FUNCTION_DECL && DECL_INLINE (decl))))
5346     instantiate_decl (decl, /*defer_ok=*/1);
5347 }
5348
5349 /* Helper function for named_class_head_sans_basetype nonterminal.  We
5350    have just seen something of the form `AGGR SCOPE::ID'.  Return a
5351    TYPE_DECL for the type declared by ID in SCOPE.  */
5352
5353 tree
5354 handle_class_head (aggr, scope, id)
5355      tree aggr, scope, id;
5356 {
5357   tree decl;
5358
5359   if (TREE_CODE (id) == TYPE_DECL)
5360     decl = id;
5361   else if (DECL_CLASS_TEMPLATE_P (id))
5362     decl = DECL_TEMPLATE_RESULT (id);
5363   else 
5364     {
5365       tree current = current_scope();
5366   
5367       if (current == NULL_TREE)
5368         current = current_namespace;
5369       if (scope == std_node)
5370         scope = global_namespace;
5371       if (scope == NULL_TREE)
5372         scope = global_namespace;
5373       if (scope == current)
5374         {
5375           /* We've been given AGGR SCOPE::ID, when we're already inside SCOPE.
5376              Be nice about it.  */
5377           if (pedantic)
5378             cp_pedwarn ("extra qualification `%T::' on member `%D' ignored",
5379                         FROB_CONTEXT (scope), id);
5380         }
5381       else if (scope != global_namespace)
5382         cp_error ("`%T' does not have a nested type named `%D'", scope, id);
5383       else
5384         cp_error ("no file-scope type named `%D'", id);
5385       
5386       /* Inject it at the current scope.  */
5387       decl = TYPE_MAIN_DECL (xref_tag (aggr, id, 1));
5388     }
5389  
5390   /* Enter the SCOPE.  If this turns out not to be a definition, the
5391      parser must leave the scope.  */
5392   push_scope (CP_DECL_CONTEXT (decl));
5393
5394   /* If we see something like:
5395
5396        template <typename T> struct S::I ....
5397        
5398      we must create a TEMPLATE_DECL for the nested type.  */
5399   if (PROCESSING_REAL_TEMPLATE_DECL_P ())
5400     decl = push_template_decl (decl);
5401
5402   return decl;
5403 }
5404
5405 /* Initialize decl2.c.  */
5406
5407 void
5408 init_decl2 ()
5409 {
5410   ggc_add_tree_root (&decl_namespace_list, 1);
5411   ggc_add_tree_varray_root (&deferred_fns, 1);
5412   ggc_add_tree_varray_root (&pending_statics, 1);
5413   ggc_add_tree_varray_root (&ssdf_decls, 1);
5414   ggc_add_tree_root (&ssdf_decl, 1);
5415   ggc_add_tree_root (&priority_decl, 1);
5416   ggc_add_tree_root (&initialize_p_decl, 1);
5417   ggc_add_tree_root (&pending_vtables, 1);
5418 }