OSDN Git Service

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