OSDN Git Service

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