OSDN Git Service

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