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