OSDN Git Service

* decl2.c (import_export_class): Never export/import vtables
[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, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4    Hacked by Michael Tiemann (tiemann@cygnus.com)
5
6 This file is part of GCC.
7
8 GCC 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 GCC 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 GCC; 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 "coretypes.h"
34 #include "tm.h"
35 #include "tree.h"
36 #include "rtl.h"
37 #include "expr.h"
38 #include "flags.h"
39 #include "cp-tree.h"
40 #include "decl.h"
41 #include "output.h"
42 #include "except.h"
43 #include "toplev.h"
44 #include "timevar.h"
45 #include "cpplib.h"
46 #include "target.h"
47 #include "c-common.h"
48 #include "tree-mudflap.h"
49 #include "cgraph.h"
50 #include "tree-inline.h"
51
52 extern cpp_reader *parse_in;
53
54 /* This structure contains information about the initializations
55    and/or destructions required for a particular priority level.  */
56 typedef struct priority_info_s {
57   /* Nonzero if there have been any initializations at this priority
58      throughout the translation unit.  */
59   int initializations_p;
60   /* Nonzero if there have been any destructions at this priority
61      throughout the translation unit.  */
62   int destructions_p;
63 } *priority_info;
64
65 static void mark_vtable_entries (tree);
66 static void grok_function_init (tree, tree);
67 static bool maybe_emit_vtables (tree);
68 static tree build_anon_union_vars (tree);
69 static bool acceptable_java_type (tree);
70 static tree start_objects (int, int);
71 static void finish_objects (int, int, tree);
72 static tree start_static_storage_duration_function (unsigned);
73 static void finish_static_storage_duration_function (tree);
74 static priority_info get_priority_info (int);
75 static void do_static_initialization (tree, tree);
76 static void do_static_destruction (tree);
77 static tree start_static_initialization_or_destruction (tree, int);
78 static void finish_static_initialization_or_destruction (tree);
79 static void generate_ctor_or_dtor_function (bool, int, location_t *);
80 static int generate_ctor_and_dtor_functions_for_priority (splay_tree_node,
81                                                           void *);
82 static tree prune_vars_needing_no_initialization (tree *);
83 static void write_out_vars (tree);
84 static void import_export_class (tree);
85 static tree get_guard_bits (tree);
86
87 /* A list of static class variables.  This is needed, because a
88    static class variable can be declared inside the class without
89    an initializer, and then initialized, statically, outside the class.  */
90 static GTY(()) varray_type pending_statics;
91 #define pending_statics_used \
92   (pending_statics ? pending_statics->elements_used : 0)
93
94 /* A list of functions which were declared inline, but which we
95    may need to emit outline anyway.  */
96 static GTY(()) varray_type deferred_fns;
97 #define deferred_fns_used \
98   (deferred_fns ? deferred_fns->elements_used : 0)
99
100 /* Flag used when debugging spew.c */
101
102 extern int spew_debug;
103
104 /* Nonzero if we're done parsing and into end-of-file activities.  */
105
106 int at_eof;
107
108 /* Functions called along with real static constructors and destructors.  */
109
110 tree static_ctors;
111 tree static_dtors;
112
113 \f
114 /* Incorporate `const' and `volatile' qualifiers for member functions.
115    FUNCTION is a TYPE_DECL or a FUNCTION_DECL.
116    QUALS is a list of qualifiers.  Returns any explicit
117    top-level qualifiers of the method's this pointer, anything other than
118    TYPE_UNQUALIFIED will be an extension.  */
119
120 int
121 grok_method_quals (tree ctype, tree function, cp_cv_quals quals)
122 {
123   tree fntype = TREE_TYPE (function);
124   tree raises = TYPE_RAISES_EXCEPTIONS (fntype);
125   int type_quals = TYPE_UNQUALIFIED;
126   int this_quals = TYPE_UNQUALIFIED;
127
128   type_quals = quals & ~TYPE_QUAL_RESTRICT;
129   this_quals = quals & TYPE_QUAL_RESTRICT;
130
131   ctype = cp_build_qualified_type (ctype, type_quals);
132   fntype = build_method_type_directly (ctype, TREE_TYPE (fntype),
133                                        (TREE_CODE (fntype) == METHOD_TYPE
134                                         ? TREE_CHAIN (TYPE_ARG_TYPES (fntype))
135                                         : TYPE_ARG_TYPES (fntype)));
136   if (raises)
137     fntype = build_exception_variant (fntype, raises);
138
139   TREE_TYPE (function) = fntype;
140   return this_quals;
141 }
142
143 /* Build a PARM_DECL with NAME and TYPE, and set DECL_ARG_TYPE
144    appropriately.  */
145
146 tree
147 cp_build_parm_decl (tree name, tree type)
148 {
149   tree parm = build_decl (PARM_DECL, name, type);
150   /* DECL_ARG_TYPE is only used by the back end and the back end never
151      sees templates.  */
152   if (!processing_template_decl)
153     DECL_ARG_TYPE (parm) = type_passed_as (type);
154   return parm;
155 }
156
157 /* Returns a PARM_DECL for a parameter of the indicated TYPE, with the
158    indicated NAME.  */
159
160 tree
161 build_artificial_parm (tree name, tree type)
162 {
163   tree parm = cp_build_parm_decl (name, type);
164   DECL_ARTIFICIAL (parm) = 1;
165   /* All our artificial parms are implicitly `const'; they cannot be
166      assigned to.  */
167   TREE_READONLY (parm) = 1;
168   return parm;
169 }
170
171 /* Constructors for types with virtual baseclasses need an "in-charge" flag
172    saying whether this constructor is responsible for initialization of
173    virtual baseclasses or not.  All destructors also need this "in-charge"
174    flag, which additionally determines whether or not the destructor should
175    free the memory for the object.
176
177    This function adds the "in-charge" flag to member function FN if
178    appropriate.  It is called from grokclassfn and tsubst.
179    FN must be either a constructor or destructor.
180
181    The in-charge flag follows the 'this' parameter, and is followed by the
182    VTT parm (if any), then the user-written parms.  */
183
184 void
185 maybe_retrofit_in_chrg (tree fn)
186 {
187   tree basetype, arg_types, parms, parm, fntype;
188
189   /* If we've already add the in-charge parameter don't do it again.  */
190   if (DECL_HAS_IN_CHARGE_PARM_P (fn))
191     return;
192
193   /* When processing templates we can't know, in general, whether or
194      not we're going to have virtual baseclasses.  */
195   if (processing_template_decl)
196     return;
197
198   /* We don't need an in-charge parameter for constructors that don't
199      have virtual bases.  */
200   if (DECL_CONSTRUCTOR_P (fn)
201       && !TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (fn)))
202     return;
203
204   arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn));
205   basetype = TREE_TYPE (TREE_VALUE (arg_types));
206   arg_types = TREE_CHAIN (arg_types);
207
208   parms = TREE_CHAIN (DECL_ARGUMENTS (fn));
209
210   /* If this is a subobject constructor or destructor, our caller will
211      pass us a pointer to our VTT.  */
212   if (TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (fn)))
213     {
214       parm = build_artificial_parm (vtt_parm_identifier, vtt_parm_type);
215
216       /* First add it to DECL_ARGUMENTS between 'this' and the real args...  */
217       TREE_CHAIN (parm) = parms;
218       parms = parm;
219
220       /* ...and then to TYPE_ARG_TYPES.  */
221       arg_types = hash_tree_chain (vtt_parm_type, arg_types);
222
223       DECL_HAS_VTT_PARM_P (fn) = 1;
224     }
225
226   /* Then add the in-charge parm (before the VTT parm).  */
227   parm = build_artificial_parm (in_charge_identifier, integer_type_node);
228   TREE_CHAIN (parm) = parms;
229   parms = parm;
230   arg_types = hash_tree_chain (integer_type_node, arg_types);
231
232   /* Insert our new parameter(s) into the list.  */
233   TREE_CHAIN (DECL_ARGUMENTS (fn)) = parms;
234
235   /* And rebuild the function type.  */
236   fntype = build_method_type_directly (basetype, TREE_TYPE (TREE_TYPE (fn)),
237                                        arg_types);
238   if (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn)))
239     fntype = build_exception_variant (fntype,
240                                       TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn)));
241   TREE_TYPE (fn) = fntype;
242
243   /* Now we've got the in-charge parameter.  */
244   DECL_HAS_IN_CHARGE_PARM_P (fn) = 1;
245 }
246
247 /* Classes overload their constituent function names automatically.
248    When a function name is declared in a record structure,
249    its name is changed to it overloaded name.  Since names for
250    constructors and destructors can conflict, we place a leading
251    '$' for destructors.
252
253    CNAME is the name of the class we are grokking for.
254
255    FUNCTION is a FUNCTION_DECL.  It was created by `grokdeclarator'.
256
257    FLAGS contains bits saying what's special about today's
258    arguments.  1 == DESTRUCTOR.  2 == OPERATOR.
259
260    If FUNCTION is a destructor, then we must add the `auto-delete' field
261    as a second parameter.  There is some hair associated with the fact
262    that we must "declare" this variable in the manner consistent with the
263    way the rest of the arguments were declared.
264
265    QUALS are the qualifiers for the this pointer.  */
266
267 void
268 grokclassfn (tree ctype, tree function, enum overload_flags flags, 
269              cp_cv_quals quals)
270 {
271   tree fn_name = DECL_NAME (function);
272   cp_cv_quals this_quals = TYPE_UNQUALIFIED;
273
274   /* Even within an `extern "C"' block, members get C++ linkage.  See
275      [dcl.link] for details.  */
276   SET_DECL_LANGUAGE (function, lang_cplusplus);
277
278   if (fn_name == NULL_TREE)
279     {
280       error ("name missing for member function");
281       fn_name = get_identifier ("<anonymous>");
282       DECL_NAME (function) = fn_name;
283     }
284
285   if (quals)
286     this_quals = grok_method_quals (ctype, function, quals);
287
288   if (TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE)
289     {
290       /* Must add the class instance variable up front.  */
291       /* Right now we just make this a pointer.  But later
292          we may wish to make it special.  */
293       tree type = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (function)));
294       tree qual_type;
295       tree parm;
296
297       /* The `this' parameter is implicitly `const'; it cannot be
298          assigned to.  */
299       this_quals |= TYPE_QUAL_CONST;
300       qual_type = cp_build_qualified_type (type, this_quals);
301       parm = build_artificial_parm (this_identifier, qual_type);
302       c_apply_type_quals_to_decl (this_quals, parm);
303       TREE_CHAIN (parm) = DECL_ARGUMENTS (function);
304       DECL_ARGUMENTS (function) = parm;
305     }
306
307   DECL_CONTEXT (function) = ctype;
308
309   if (flags == DTOR_FLAG)
310     DECL_DESTRUCTOR_P (function) = 1;
311
312   if (flags == DTOR_FLAG || DECL_CONSTRUCTOR_P (function))
313     maybe_retrofit_in_chrg (function);
314 }
315
316 /* Create an ARRAY_REF, checking for the user doing things backwards
317    along the way.  */
318
319 tree
320 grok_array_decl (tree array_expr, tree index_exp)
321 {
322   tree type;
323   tree expr;
324   tree orig_array_expr = array_expr;
325   tree orig_index_exp = index_exp;
326
327   if (error_operand_p (array_expr) || error_operand_p (index_exp))
328     return error_mark_node;
329
330   if (processing_template_decl)
331     {
332       if (type_dependent_expression_p (array_expr)
333           || type_dependent_expression_p (index_exp))
334         return build_min_nt (ARRAY_REF, array_expr, index_exp,
335                              NULL_TREE, NULL_TREE);
336       array_expr = build_non_dependent_expr (array_expr);
337       index_exp = build_non_dependent_expr (index_exp);
338     }
339
340   type = TREE_TYPE (array_expr);
341   my_friendly_assert (type, 20030626);
342   type = non_reference (type);
343
344   /* If they have an `operator[]', use that.  */
345   if (IS_AGGR_TYPE (type) || IS_AGGR_TYPE (TREE_TYPE (index_exp)))
346     expr = build_new_op (ARRAY_REF, LOOKUP_NORMAL,
347                          array_expr, index_exp, NULL_TREE,
348                          /*overloaded_p=*/NULL);
349   else
350     {
351       tree p1, p2, i1, i2;
352
353       /* Otherwise, create an ARRAY_REF for a pointer or array type.
354          It is a little-known fact that, if `a' is an array and `i' is
355          an int, you can write `i[a]', which means the same thing as
356          `a[i]'.  */
357       if (TREE_CODE (type) == ARRAY_TYPE)
358         p1 = array_expr;
359       else
360         p1 = build_expr_type_conversion (WANT_POINTER, array_expr, false);
361
362       if (TREE_CODE (TREE_TYPE (index_exp)) == ARRAY_TYPE)
363         p2 = index_exp;
364       else
365         p2 = build_expr_type_conversion (WANT_POINTER, index_exp, false);
366
367       i1 = build_expr_type_conversion (WANT_INT | WANT_ENUM, array_expr, 
368                                        false);
369       i2 = build_expr_type_conversion (WANT_INT | WANT_ENUM, index_exp, 
370                                        false);
371
372       if ((p1 && i2) && (i1 && p2))
373         error ("ambiguous conversion for array subscript");
374
375       if (p1 && i2)
376         array_expr = p1, index_exp = i2;
377       else if (i1 && p2)
378         array_expr = p2, index_exp = i1;
379       else
380         {
381           error ("invalid types `%T[%T]' for array subscript",
382                     type, TREE_TYPE (index_exp));
383           return error_mark_node;
384         }
385
386       if (array_expr == error_mark_node || index_exp == error_mark_node)
387         error ("ambiguous conversion for array subscript");
388
389       expr = build_array_ref (array_expr, index_exp);
390     }
391   if (processing_template_decl && expr != error_mark_node)
392     return build_min_non_dep (ARRAY_REF, expr, orig_array_expr, orig_index_exp,
393                               NULL_TREE, NULL_TREE);
394   return expr;
395 }
396
397 /* Given the cast expression EXP, checking out its validity.   Either return
398    an error_mark_node if there was an unavoidable error, return a cast to
399    void for trying to delete a pointer w/ the value 0, or return the
400    call to delete.  If DOING_VEC is true, we handle things differently
401    for doing an array delete.
402    Implements ARM $5.3.4.  This is called from the parser.  */
403
404 tree
405 delete_sanity (tree exp, tree size, bool doing_vec, int use_global_delete)
406 {
407   tree t, type;
408
409   if (exp == error_mark_node)
410     return exp;
411
412   if (processing_template_decl)
413     {
414       t = build_min (DELETE_EXPR, void_type_node, exp, size);
415       DELETE_EXPR_USE_GLOBAL (t) = use_global_delete;
416       DELETE_EXPR_USE_VEC (t) = doing_vec;
417       TREE_SIDE_EFFECTS (t) = 1;
418       return t;
419     }
420
421   exp = convert_from_reference (exp);
422
423   /* An array can't have been allocated by new, so complain.  */
424   if (TREE_CODE (exp) == VAR_DECL
425       && TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
426     warning ("deleting array `%#D'", exp);
427
428   t = build_expr_type_conversion (WANT_POINTER, exp, true);
429
430   if (t == NULL_TREE || t == error_mark_node)
431     {
432       error ("type `%#T' argument given to `delete', expected pointer",
433                 TREE_TYPE (exp));
434       return error_mark_node;
435     }
436
437   type = TREE_TYPE (t);
438
439   /* As of Valley Forge, you can delete a pointer to const.  */
440
441   /* You can't delete functions.  */
442   if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
443     {
444       error ("cannot delete a function.  Only pointer-to-objects are valid arguments to `delete'");
445       return error_mark_node;
446     }
447
448   /* Deleting ptr to void is undefined behavior [expr.delete/3].  */
449   if (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE)
450     {
451       warning ("deleting `%T' is undefined", type);
452       doing_vec = 0;
453     }
454
455   /* Deleting a pointer with the value zero is valid and has no effect.  */
456   if (integer_zerop (t))
457     return build1 (NOP_EXPR, void_type_node, t);
458
459   if (doing_vec)
460     return build_vec_delete (t, /*maxindex=*/NULL_TREE, 
461                              sfk_deleting_destructor,
462                              use_global_delete);
463   else
464     return build_delete (type, t, sfk_deleting_destructor,
465                          LOOKUP_NORMAL, use_global_delete);
466 }
467
468 /* Report an error if the indicated template declaration is not the
469    sort of thing that should be a member template.  */
470
471 void
472 check_member_template (tree tmpl)
473 {
474   tree decl;
475
476   my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 0);
477   decl = DECL_TEMPLATE_RESULT (tmpl);
478
479   if (TREE_CODE (decl) == FUNCTION_DECL
480       || (TREE_CODE (decl) == TYPE_DECL
481           && IS_AGGR_TYPE (TREE_TYPE (decl))))
482     {
483       if (current_function_decl)
484         /* 14.5.2.2 [temp.mem]
485            
486            A local class shall not have member templates.  */
487         error ("invalid declaration of member template `%#D' in local class",
488                   decl);
489       
490       if (TREE_CODE (decl) == FUNCTION_DECL && DECL_VIRTUAL_P (decl))
491         {
492           /* 14.5.2.3 [temp.mem]
493
494              A member function template shall not be virtual.  */
495           error 
496             ("invalid use of `virtual' in template declaration of `%#D'",
497              decl);
498           DECL_VIRTUAL_P (decl) = 0;
499         }
500
501       /* The debug-information generating code doesn't know what to do
502          with member templates.  */ 
503       DECL_IGNORED_P (tmpl) = 1;
504     } 
505   else
506     error ("template declaration of `%#D'", decl);
507 }
508
509 /* Return true iff TYPE is a valid Java parameter or return type.  */
510
511 static bool
512 acceptable_java_type (tree type)
513 {
514   if (TREE_CODE (type) == VOID_TYPE || TYPE_FOR_JAVA (type))
515     return 1;
516   if (TREE_CODE (type) == POINTER_TYPE || TREE_CODE (type) == REFERENCE_TYPE)
517     {
518       type = TREE_TYPE (type);
519       if (TREE_CODE (type) == RECORD_TYPE)
520         {
521           tree args;  int i;
522           if (! TYPE_FOR_JAVA (type))
523             return false;
524           if (! CLASSTYPE_TEMPLATE_INFO (type))
525             return true;
526           args = CLASSTYPE_TI_ARGS (type);
527           i = TREE_VEC_LENGTH (args);
528           while (--i >= 0)
529             {
530               type = TREE_VEC_ELT (args, i);
531               if (TREE_CODE (type) == POINTER_TYPE)
532                 type = TREE_TYPE (type);
533               if (! TYPE_FOR_JAVA (type))
534                 return false;
535             }
536           return true;
537         }
538     }
539   return false;
540 }
541
542 /* For a METHOD in a Java class CTYPE, return true if
543    the parameter and return types are valid Java types.
544    Otherwise, print appropriate error messages, and return false.  */
545
546 bool
547 check_java_method (tree method)
548 {
549   bool jerr = false;
550   tree arg_types = TYPE_ARG_TYPES (TREE_TYPE (method));
551   tree ret_type = TREE_TYPE (TREE_TYPE (method));
552
553   if (!acceptable_java_type (ret_type))
554     {
555       error ("Java method '%D' has non-Java return type `%T'",
556                 method, ret_type);
557       jerr = true;
558     }
559
560   arg_types = TREE_CHAIN (arg_types);
561   if (DECL_HAS_IN_CHARGE_PARM_P (method))
562     arg_types = TREE_CHAIN (arg_types);
563   if (DECL_HAS_VTT_PARM_P (method))
564     arg_types = TREE_CHAIN (arg_types);
565   
566   for (; arg_types != NULL_TREE; arg_types = TREE_CHAIN (arg_types))
567     {
568       tree type = TREE_VALUE (arg_types);
569       if (!acceptable_java_type (type))
570         {
571           error ("Java method '%D' has non-Java parameter type `%T'",
572                     method, type);
573           jerr = true;
574         }
575     }
576   return !jerr;
577 }
578
579 /* Sanity check: report error if this function FUNCTION is not
580    really a member of the class (CTYPE) it is supposed to belong to.
581    TEMPLATE_PARMS is used to specifiy the template parameters of a member
582    template passed as FUNCTION_DECL. If the member template is passed as a 
583    TEMPLATE_DECL, it can be NULL since the parameters can be extracted
584    from the declaration. If the function is not a function template, it
585    must be NULL.
586    It returns the original declaration for the function, or NULL_TREE
587    if no declaration was found (and an error was emitted).  */
588
589 tree
590 check_classfn (tree ctype, tree function, tree template_parms)
591 {
592   int ix;
593   bool is_template;
594   
595   if (DECL_USE_TEMPLATE (function)
596       && !(TREE_CODE (function) == TEMPLATE_DECL
597            && DECL_TEMPLATE_SPECIALIZATION (function))
598       && is_member_template (DECL_TI_TEMPLATE (function)))
599     /* Since this is a specialization of a member template,
600        we're not going to find the declaration in the class.
601        For example, in:
602        
603          struct S { template <typename T> void f(T); };
604          template <> void S::f(int);
605        
606        we're not going to find `S::f(int)', but there's no
607        reason we should, either.  We let our callers know we didn't
608        find the method, but we don't complain.  */
609     return NULL_TREE;
610
611   /* Basic sanity check: for a template function, the template parameters
612      either were not passed, or they are the same of DECL_TEMPLATE_PARMS.  */
613   if (TREE_CODE (function) == TEMPLATE_DECL)
614     {
615       my_friendly_assert (!template_parms 
616                           || comp_template_parms 
617                               (template_parms, 
618                                DECL_TEMPLATE_PARMS (function)),
619                           20040303);
620       template_parms = DECL_TEMPLATE_PARMS (function);
621     }
622
623   /* OK, is this a definition of a member template?  */
624   is_template = (template_parms != NULL_TREE);
625
626   ix = lookup_fnfields_1 (complete_type (ctype),
627                           DECL_CONSTRUCTOR_P (function) ? ctor_identifier :
628                           DECL_DESTRUCTOR_P (function) ? dtor_identifier :
629                           DECL_NAME (function));
630
631   if (ix >= 0)
632     {
633       tree methods = CLASSTYPE_METHOD_VEC (ctype);
634       tree fndecls, fndecl = 0;
635       bool is_conv_op;
636       bool pop_p;
637       const char *format = NULL;
638       
639       pop_p = push_scope (ctype);
640       for (fndecls = TREE_VEC_ELT (methods, ix);
641            fndecls; fndecls = OVL_NEXT (fndecls))
642         {
643           tree p1, p2;
644           
645           fndecl = OVL_CURRENT (fndecls);
646           p1 = TYPE_ARG_TYPES (TREE_TYPE (function));
647           p2 = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
648
649           /* We cannot simply call decls_match because this doesn't
650              work for static member functions that are pretending to
651              be methods, and because the name may have been changed by
652              asm("new_name").  */ 
653               
654            /* Get rid of the this parameter on functions that become
655               static.  */
656           if (DECL_STATIC_FUNCTION_P (fndecl)
657               && TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE)
658             p1 = TREE_CHAIN (p1);
659
660           /* A member template definition only matches a member template
661              declaration.  */
662           if (is_template != (TREE_CODE (fndecl) == TEMPLATE_DECL))
663             continue;
664               
665           if (same_type_p (TREE_TYPE (TREE_TYPE (function)),
666                            TREE_TYPE (TREE_TYPE (fndecl)))
667               && compparms (p1, p2)
668               && (!is_template
669                   || comp_template_parms (template_parms, 
670                                           DECL_TEMPLATE_PARMS (fndecl)))
671               && (DECL_TEMPLATE_SPECIALIZATION (function)
672                   == DECL_TEMPLATE_SPECIALIZATION (fndecl))
673               && (!DECL_TEMPLATE_SPECIALIZATION (function)
674                   || (DECL_TI_TEMPLATE (function) 
675                       == DECL_TI_TEMPLATE (fndecl))))
676             break;
677         }
678       if (pop_p)
679         pop_scope (ctype);
680       if (fndecls)
681         return OVL_CURRENT (fndecls);
682       error ("prototype for `%#D' does not match any in class `%T'",
683              function, ctype);
684       is_conv_op = DECL_CONV_FN_P (fndecl);
685
686       if (is_conv_op)
687         ix = CLASSTYPE_FIRST_CONVERSION_SLOT;
688       fndecls = TREE_VEC_ELT (methods, ix);
689       while (fndecls)
690         {
691           fndecl = OVL_CURRENT (fndecls);
692           fndecls = OVL_NEXT (fndecls);
693
694           if (!fndecls && is_conv_op)
695             {
696               if (TREE_VEC_LENGTH (methods) > ix)
697                 {
698                   ix++;
699                   fndecls = TREE_VEC_ELT (methods, ix);
700                   if (!DECL_CONV_FN_P (OVL_CURRENT (fndecls)))
701                     {
702                       fndecls = NULL_TREE;
703                       is_conv_op = false;
704                     }
705                 }
706               else
707                 is_conv_op = false;
708             }
709           if (format)
710             format = "                %#D";
711           else if (fndecls)
712             format = "candidates are: %#D";
713           else
714             format = "candidate is: %#D";
715           cp_error_at (format, fndecl);
716         }
717     }
718   else if (!COMPLETE_TYPE_P (ctype))
719     cxx_incomplete_type_error (function, ctype);
720   else
721     error ("no `%#D' member function declared in class `%T'",
722            function, ctype);
723
724   /* If we did not find the method in the class, add it to avoid
725      spurious errors (unless the CTYPE is not yet defined, in which
726      case we'll only confuse ourselves when the function is declared
727      properly within the class.  */
728   if (COMPLETE_TYPE_P (ctype))
729     add_method (ctype, function, /*error_p=*/1);
730   return NULL_TREE;
731 }
732
733 /* We have just processed the DECL, which is a static data member.
734    Its initializer, if present, is INIT.  The ASMSPEC_TREE, if
735    present, is the assembly-language name for the data member.
736    FLAGS is as for cp_finish_decl.  */
737
738 void
739 finish_static_data_member_decl (tree decl, tree init, tree asmspec_tree,
740                                 int flags)
741 {
742   my_friendly_assert (TREE_PUBLIC (decl), 0);
743
744   DECL_CONTEXT (decl) = current_class_type;
745
746   /* We cannot call pushdecl here, because that would fill in the
747      TREE_CHAIN of our decl.  Instead, we modify cp_finish_decl to do
748      the right thing, namely, to put this decl out straight away.  */
749   /* current_class_type can be NULL_TREE in case of error.  */
750   if (!asmspec_tree && current_class_type)
751     DECL_INITIAL (decl) = error_mark_node;
752
753   if (! processing_template_decl)
754     {
755       if (!pending_statics)
756         VARRAY_TREE_INIT (pending_statics, 32, "pending_statics");
757       VARRAY_PUSH_TREE (pending_statics, decl);
758     }
759
760   if (LOCAL_CLASS_P (current_class_type))
761     pedwarn ("local class `%#T' shall not have static data member `%#D'",
762              current_class_type, decl);
763
764   /* Static consts need not be initialized in the class definition.  */
765   if (init != NULL_TREE && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
766     {
767       static int explained = 0;
768           
769       error ("initializer invalid for static member with constructor");
770       if (!explained)
771         {
772           error ("(an out of class initialization is required)");
773           explained = 1;
774         }
775       init = NULL_TREE;
776     }
777   /* Force the compiler to know when an uninitialized static const
778      member is being used.  */
779   if (CP_TYPE_CONST_P (TREE_TYPE (decl)) && init == 0)
780     TREE_USED (decl) = 1;
781   DECL_INITIAL (decl) = init;
782   DECL_IN_AGGR_P (decl) = 1;
783
784   cp_finish_decl (decl, init, asmspec_tree, flags);
785 }
786
787 /* Process the specs, declarator (NULL if omitted) and width (NULL if omitted)
788    of a structure component, returning a _DECL node.
789    QUALS is a list of type qualifiers for this decl (such as for declaring
790    const member functions).
791
792    This is done during the parsing of the struct declaration.
793    The _DECL nodes are chained together and the lot of them
794    are ultimately passed to `build_struct' to make the RECORD_TYPE node.
795
796    If class A defines that certain functions in class B are friends, then
797    the way I have set things up, it is B who is interested in permission
798    granted by A.  However, it is in A's context that these declarations
799    are parsed.  By returning a void_type_node, class A does not attempt
800    to incorporate the declarations of the friends within its structure.
801
802    DO NOT MAKE ANY CHANGES TO THIS CODE WITHOUT MAKING CORRESPONDING
803    CHANGES TO CODE IN `start_method'.  */
804
805 tree
806 grokfield (const cp_declarator *declarator, 
807            cp_decl_specifier_seq *declspecs, 
808            tree init, tree asmspec_tree,
809            tree attrlist)
810 {
811   tree value;
812   const char *asmspec = 0;
813   int flags = LOOKUP_ONLYCONVERTING;
814
815   if (!declspecs->any_specifiers_p
816       && declarator->kind == cdk_id
817       && TREE_CODE (declarator->u.id.name) == SCOPE_REF
818       && (TREE_CODE (TREE_OPERAND (declarator->u.id.name, 1)) 
819           == IDENTIFIER_NODE))
820     {
821       /* Access declaration */
822       if (! IS_AGGR_TYPE_CODE (TREE_CODE 
823                                (TREE_OPERAND (declarator->u.id.name, 0))))
824         ;
825       else if (TREE_COMPLEXITY (declarator->u.id.name) == current_class_depth)
826         pop_nested_class ();
827       return do_class_using_decl (declarator->u.id.name);
828     }
829
830   if (init
831       && TREE_CODE (init) == TREE_LIST
832       && TREE_VALUE (init) == error_mark_node
833       && TREE_CHAIN (init) == NULL_TREE)
834     init = NULL_TREE;
835
836   value = grokdeclarator (declarator, declspecs, FIELD, init != 0, &attrlist);
837   if (! value || error_operand_p (value))
838     /* friend or constructor went bad.  */
839     return error_mark_node;
840
841   if (TREE_CODE (value) == TYPE_DECL && init)
842     {
843       error ("typedef `%D' is initialized (use __typeof__ instead)", value);
844       init = NULL_TREE;
845     }
846
847   /* Pass friendly classes back.  */
848   if (value == void_type_node)
849     return value;
850
851   /* Pass friend decls back.  */
852   if ((TREE_CODE (value) == FUNCTION_DECL
853        || TREE_CODE (value) == TEMPLATE_DECL)
854       && DECL_CONTEXT (value) != current_class_type)
855     return value;
856
857   if (DECL_NAME (value) != NULL_TREE
858       && IDENTIFIER_POINTER (DECL_NAME (value))[0] == '_'
859       && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (value)), "_vptr"))
860     error ("member `%D' conflicts with virtual function table field name",
861               value);
862
863   /* Stash away type declarations.  */
864   if (TREE_CODE (value) == TYPE_DECL)
865     {
866       DECL_NONLOCAL (value) = 1;
867       DECL_CONTEXT (value) = current_class_type;
868
869       if (processing_template_decl)
870         value = push_template_decl (value);
871
872       return value;
873     }
874
875   if (DECL_IN_AGGR_P (value))
876     {
877       error ("`%D' is already defined in `%T'", value,
878                 DECL_CONTEXT (value));
879       return void_type_node;
880     }
881
882   if (asmspec_tree)
883     asmspec = TREE_STRING_POINTER (asmspec_tree);
884
885   if (init)
886     {
887       if (TREE_CODE (value) == FUNCTION_DECL)
888         {
889           grok_function_init (value, init);
890           init = NULL_TREE;
891         }
892       else if (pedantic && TREE_CODE (value) != VAR_DECL)
893         /* Already complained in grokdeclarator.  */
894         init = NULL_TREE;
895       else
896         {
897           /* We allow initializers to become parameters to base
898              initializers.  */
899           if (TREE_CODE (init) == TREE_LIST)
900             {
901               if (TREE_CHAIN (init) == NULL_TREE)
902                 init = TREE_VALUE (init);
903               else
904                 init = digest_init (TREE_TYPE (value), init, (tree *)0);
905             }
906
907           if (!processing_template_decl)
908             {
909               if (TREE_CODE (init) == CONST_DECL)
910                 init = DECL_INITIAL (init);
911               else if (TREE_READONLY_DECL_P (init))
912                 init = decl_constant_value (init);
913               else if (TREE_CODE (init) == CONSTRUCTOR)
914                 init = digest_init (TREE_TYPE (value), init, (tree *)0);
915               if (init != error_mark_node && ! TREE_CONSTANT (init))
916                 {
917                   /* We can allow references to things that are effectively
918                      static, since references are initialized with the
919                      address.  */
920                   if (TREE_CODE (TREE_TYPE (value)) != REFERENCE_TYPE
921                       || (TREE_STATIC (init) == 0
922                           && (!DECL_P (init) || DECL_EXTERNAL (init) == 0)))
923                     {
924                       error ("field initializer is not constant");
925                       init = error_mark_node;
926                     }
927                 }
928             }
929         }
930     }
931
932   if (processing_template_decl
933       && (TREE_CODE (value) == VAR_DECL || TREE_CODE (value) == FUNCTION_DECL))
934     {
935       value = push_template_decl (value);
936       if (error_operand_p (value))
937         return error_mark_node;
938     }
939
940   if (attrlist)
941     cplus_decl_attributes (&value, attrlist, 0);
942
943   if (TREE_CODE (value) == VAR_DECL)
944     {
945       finish_static_data_member_decl (value, init, asmspec_tree, 
946                                       flags);
947       return value;
948     }
949   if (TREE_CODE (value) == FIELD_DECL)
950     {
951       if (asmspec)
952         error ("`asm' specifiers are not permitted on non-static data members");
953       if (DECL_INITIAL (value) == error_mark_node)
954         init = error_mark_node;
955       cp_finish_decl (value, init, NULL_TREE, flags);
956       DECL_INITIAL (value) = init;
957       DECL_IN_AGGR_P (value) = 1;
958       return value;
959     }
960   if (TREE_CODE (value) == FUNCTION_DECL)
961     {
962       if (asmspec)
963         {
964           /* This must override the asm specifier which was placed
965              by grokclassfn.  Lay this out fresh.  */
966           SET_DECL_RTL (value, NULL_RTX);
967           change_decl_assembler_name (value, get_identifier (asmspec));
968         }
969       if (!DECL_FRIEND_P (value))
970         grok_special_member_properties (value);
971       
972       cp_finish_decl (value, init, asmspec_tree, flags);
973
974       /* Pass friends back this way.  */
975       if (DECL_FRIEND_P (value))
976         return void_type_node;
977
978       DECL_IN_AGGR_P (value) = 1;
979       return value;
980     }
981   abort ();
982   /* NOTREACHED */
983   return NULL_TREE;
984 }
985
986 /* Like `grokfield', but for bitfields.
987    WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node.  */
988
989 tree
990 grokbitfield (const cp_declarator *declarator, 
991               cp_decl_specifier_seq *declspecs, tree width)
992 {
993   tree value = grokdeclarator (declarator, declspecs, BITFIELD, 0, NULL);
994
995   if (! value) return NULL_TREE; /* friends went bad.  */
996
997   /* Pass friendly classes back.  */
998   if (TREE_CODE (value) == VOID_TYPE)
999     return void_type_node;
1000
1001   if (TREE_CODE (value) == TYPE_DECL)
1002     {
1003       error ("cannot declare `%D' to be a bit-field type", value);
1004       return NULL_TREE;
1005     }
1006
1007   /* Usually, finish_struct_1 catches bitfields with invalid types.
1008      But, in the case of bitfields with function type, we confuse
1009      ourselves into thinking they are member functions, so we must
1010      check here.  */
1011   if (TREE_CODE (value) == FUNCTION_DECL)
1012     {
1013       error ("cannot declare bit-field `%D' with function type",
1014              DECL_NAME (value));
1015       return NULL_TREE;
1016     }
1017
1018   if (DECL_IN_AGGR_P (value))
1019     {
1020       error ("`%D' is already defined in the class %T", value,
1021                   DECL_CONTEXT (value));
1022       return void_type_node;
1023     }
1024
1025   if (TREE_STATIC (value))
1026     {
1027       error ("static member `%D' cannot be a bit-field", value);
1028       return NULL_TREE;
1029     }
1030   cp_finish_decl (value, NULL_TREE, NULL_TREE, 0);
1031
1032   if (width != error_mark_node)
1033     {
1034       constant_expression_warning (width);
1035       DECL_INITIAL (value) = width;
1036       SET_DECL_C_BIT_FIELD (value);
1037     }
1038
1039   DECL_IN_AGGR_P (value) = 1;
1040   return value;
1041 }
1042
1043 /* When a function is declared with an initializer,
1044    do the right thing.  Currently, there are two possibilities:
1045
1046    class B
1047    {
1048     public:
1049      // initialization possibility #1.
1050      virtual void f () = 0;
1051      int g ();
1052    };
1053    
1054    class D1 : B
1055    {
1056     public:
1057      int d1;
1058      // error, no f ();
1059    };
1060    
1061    class D2 : B
1062    {
1063     public:
1064      int d2;
1065      void f ();
1066    };
1067    
1068    class D3 : B
1069    {
1070     public:
1071      int d3;
1072      // initialization possibility #2
1073      void f () = B::f;
1074    };
1075
1076 */
1077
1078 static void
1079 grok_function_init (tree decl, tree init)
1080 {
1081   /* An initializer for a function tells how this function should
1082      be inherited.  */
1083   tree type = TREE_TYPE (decl);
1084
1085   if (TREE_CODE (type) == FUNCTION_TYPE)
1086     error ("initializer specified for non-member function `%D'", decl);
1087   else if (integer_zerop (init))
1088     DECL_PURE_VIRTUAL_P (decl) = 1;
1089   else
1090     error ("invalid initializer for virtual method `%D'", decl);
1091 }
1092 \f
1093 void
1094 cplus_decl_attributes (tree *decl, tree attributes, int flags)
1095 {
1096   if (*decl == NULL_TREE || *decl == void_type_node)
1097     return;
1098
1099   if (TREE_CODE (*decl) == TEMPLATE_DECL)
1100     decl = &DECL_TEMPLATE_RESULT (*decl);
1101
1102   decl_attributes (decl, attributes, flags);
1103
1104   if (TREE_CODE (*decl) == TYPE_DECL)
1105     SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (*decl), TREE_TYPE (*decl));
1106 }
1107 \f
1108 /* Walks through the namespace- or function-scope anonymous union OBJECT,
1109    building appropriate ALIAS_DECLs.  Returns one of the fields for use in
1110    the mangled name.  */
1111
1112 static tree
1113 build_anon_union_vars (tree object)
1114 {
1115   tree type = TREE_TYPE (object);
1116   tree main_decl = NULL_TREE;
1117   tree field;
1118
1119   /* Rather than write the code to handle the non-union case,
1120      just give an error.  */
1121   if (TREE_CODE (type) != UNION_TYPE)
1122     error ("anonymous struct not inside named type");
1123
1124   for (field = TYPE_FIELDS (type); 
1125        field != NULL_TREE; 
1126        field = TREE_CHAIN (field))
1127     {
1128       tree decl;
1129       tree ref;
1130
1131       if (DECL_ARTIFICIAL (field))
1132         continue;
1133       if (TREE_CODE (field) != FIELD_DECL)
1134         {
1135           cp_pedwarn_at ("\
1136 `%#D' invalid; an anonymous union can only have non-static data members",
1137                          field);
1138           continue;
1139         }
1140
1141       if (TREE_PRIVATE (field))
1142         cp_pedwarn_at ("private member `%#D' in anonymous union", field);
1143       else if (TREE_PROTECTED (field))
1144         cp_pedwarn_at ("protected member `%#D' in anonymous union", field);
1145
1146       if (processing_template_decl)
1147         ref = build_min_nt (COMPONENT_REF, object,
1148                             DECL_NAME (field), NULL_TREE);
1149       else
1150         ref = build_class_member_access_expr (object, field, NULL_TREE,
1151                                               false);
1152
1153       if (DECL_NAME (field))
1154         {
1155           decl = build_decl (ALIAS_DECL, DECL_NAME (field), TREE_TYPE (field));
1156           DECL_INITIAL (decl) = ref;        
1157           TREE_PUBLIC (decl) = 0;
1158           TREE_STATIC (decl) = 0;
1159           DECL_EXTERNAL (decl) = 1;
1160           decl = pushdecl (decl);
1161         }
1162       else if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))
1163         decl = build_anon_union_vars (ref);
1164       else
1165         decl = 0;
1166
1167       if (main_decl == NULL_TREE)
1168         main_decl = decl;
1169     }
1170
1171   return main_decl;
1172 }
1173
1174 /* Finish off the processing of a UNION_TYPE structure.  If the union is an
1175    anonymous union, then all members must be laid out together.  PUBLIC_P
1176    is nonzero if this union is not declared static.  */
1177
1178 void
1179 finish_anon_union (tree anon_union_decl)
1180 {
1181   tree type = TREE_TYPE (anon_union_decl);
1182   tree main_decl;
1183   bool public_p = TREE_PUBLIC (anon_union_decl);
1184
1185   /* The VAR_DECL's context is the same as the TYPE's context.  */
1186   DECL_CONTEXT (anon_union_decl) = DECL_CONTEXT (TYPE_NAME (type));
1187   
1188   if (TYPE_FIELDS (type) == NULL_TREE)
1189     return;
1190
1191   if (public_p)
1192     {
1193       error ("namespace-scope anonymous aggregates must be static");
1194       return;
1195     }
1196
1197   main_decl = build_anon_union_vars (anon_union_decl);
1198   if (main_decl == NULL_TREE)
1199     {
1200       warning ("anonymous union with no members");
1201       return;
1202     }
1203
1204   if (!processing_template_decl)
1205     {
1206       /* Use main_decl to set the mangled name.  */
1207       DECL_NAME (anon_union_decl) = DECL_NAME (main_decl);
1208       mangle_decl (anon_union_decl);
1209       DECL_NAME (anon_union_decl) = NULL_TREE;
1210     }
1211
1212   pushdecl (anon_union_decl);
1213   if (building_stmt_tree ()
1214       && at_function_scope_p ())
1215     add_decl_expr (anon_union_decl);
1216   else if (!processing_template_decl)
1217     rest_of_decl_compilation (anon_union_decl, NULL,
1218                               toplevel_bindings_p (), at_eof);
1219 }
1220 \f
1221 /* Auxiliary functions to make type signatures for
1222    `operator new' and `operator delete' correspond to
1223    what compiler will be expecting.  */
1224
1225 tree
1226 coerce_new_type (tree type)
1227 {
1228   int e = 0;
1229   tree args = TYPE_ARG_TYPES (type);
1230
1231   my_friendly_assert (TREE_CODE (type) == FUNCTION_TYPE, 20001107);
1232   
1233   if (!same_type_p (TREE_TYPE (type), ptr_type_node))
1234     e = 1, error ("`operator new' must return type `%T'", ptr_type_node);
1235
1236   if (!args || args == void_list_node
1237       || !same_type_p (TREE_VALUE (args), size_type_node))
1238     {
1239       e = 2;
1240       if (args && args != void_list_node)
1241         args = TREE_CHAIN (args);
1242       pedwarn ("`operator new' takes type `size_t' (`%T') as first parameter", size_type_node);
1243     }
1244   switch (e)
1245   {
1246     case 2:
1247       args = tree_cons (NULL_TREE, size_type_node, args);
1248       /* Fall through.  */
1249     case 1:
1250       type = build_exception_variant
1251               (build_function_type (ptr_type_node, args),
1252                TYPE_RAISES_EXCEPTIONS (type));
1253       /* Fall through.  */
1254     default:;
1255   }
1256   return type;
1257 }
1258
1259 tree
1260 coerce_delete_type (tree type)
1261 {
1262   int e = 0;
1263   tree args = TYPE_ARG_TYPES (type);
1264   
1265   my_friendly_assert (TREE_CODE (type) == FUNCTION_TYPE, 20001107);
1266
1267   if (!same_type_p (TREE_TYPE (type), void_type_node))
1268     e = 1, error ("`operator delete' must return type `%T'", void_type_node);
1269
1270   if (!args || args == void_list_node
1271       || !same_type_p (TREE_VALUE (args), ptr_type_node))
1272     {
1273       e = 2;
1274       if (args && args != void_list_node)
1275         args = TREE_CHAIN (args);
1276       error ("`operator delete' takes type `%T' as first parameter", ptr_type_node);
1277     }
1278   switch (e)
1279   {
1280     case 2:
1281       args = tree_cons (NULL_TREE, ptr_type_node, args);
1282       /* Fall through.  */
1283     case 1:
1284       type = build_exception_variant
1285               (build_function_type (void_type_node, args),
1286                TYPE_RAISES_EXCEPTIONS (type));
1287       /* Fall through.  */
1288     default:;
1289   }
1290
1291   return type;
1292 }
1293 \f
1294 static void
1295 mark_vtable_entries (tree decl)
1296 {
1297   tree entries = CONSTRUCTOR_ELTS (DECL_INITIAL (decl));
1298
1299   for (; entries; entries = TREE_CHAIN (entries))
1300     {
1301       tree fnaddr = TREE_VALUE (entries);
1302       tree fn;
1303
1304       STRIP_NOPS (fnaddr);
1305
1306       if (TREE_CODE (fnaddr) != ADDR_EXPR
1307           && TREE_CODE (fnaddr) != FDESC_EXPR)
1308         /* This entry is an offset: a virtual base class offset, a
1309            virtual call offset, an RTTI offset, etc.  */
1310         continue;
1311
1312       fn = TREE_OPERAND (fnaddr, 0);
1313       TREE_ADDRESSABLE (fn) = 1;
1314       /* When we don't have vcall offsets, we output thunks whenever
1315          we output the vtables that contain them.  With vcall offsets,
1316          we know all the thunks we'll need when we emit a virtual
1317          function, so we emit the thunks there instead.  */
1318       if (DECL_THUNK_P (fn)) 
1319         use_thunk (fn, /*emit_p=*/0);
1320       mark_used (fn);
1321     }
1322 }
1323
1324 /* Set DECL up to have the closest approximation of "initialized common"
1325    linkage available.  */
1326
1327 void
1328 comdat_linkage (tree decl)
1329 {
1330   if (flag_weak)
1331     make_decl_one_only (decl);
1332   else if (TREE_CODE (decl) == FUNCTION_DECL 
1333            || (TREE_CODE (decl) == VAR_DECL && DECL_ARTIFICIAL (decl)))
1334     /* We can just emit function and compiler-generated variables
1335        statically; having multiple copies is (for the most part) only
1336        a waste of space.  
1337
1338        There are two correctness issues, however: the address of a
1339        template instantiation with external linkage should be the
1340        same, independent of what translation unit asks for the
1341        address, and this will not hold when we emit multiple copies of
1342        the function.  However, there's little else we can do.  
1343
1344        Also, by default, the typeinfo implementation assumes that
1345        there will be only one copy of the string used as the name for
1346        each type.  Therefore, if weak symbols are unavailable, the
1347        run-time library should perform a more conservative check; it
1348        should perform a string comparison, rather than an address
1349        comparison.  */
1350     TREE_PUBLIC (decl) = 0;
1351   else
1352     {
1353       /* Static data member template instantiations, however, cannot
1354          have multiple copies.  */
1355       if (DECL_INITIAL (decl) == 0
1356           || DECL_INITIAL (decl) == error_mark_node)
1357         DECL_COMMON (decl) = 1;
1358       else if (EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl)))
1359         {
1360           DECL_COMMON (decl) = 1;
1361           DECL_INITIAL (decl) = error_mark_node;
1362         }
1363       else if (!DECL_EXPLICIT_INSTANTIATION (decl))
1364         {
1365           /* We can't do anything useful; leave vars for explicit
1366              instantiation.  */
1367           DECL_EXTERNAL (decl) = 1;
1368           DECL_NOT_REALLY_EXTERN (decl) = 0;
1369         }
1370     }
1371
1372   if (DECL_LANG_SPECIFIC (decl))
1373     DECL_COMDAT (decl) = 1;
1374 }
1375
1376 /* For win32 we also want to put explicit instantiations in
1377    linkonce sections, so that they will be merged with implicit
1378    instantiations; otherwise we get duplicate symbol errors.  
1379    For Darwin we do not want explicit instantiations to be 
1380    linkonce.  */
1381
1382 void
1383 maybe_make_one_only (tree decl)
1384 {
1385   /* We used to say that this was not necessary on targets that support weak
1386      symbols, because the implicit instantiations will defer to the explicit
1387      one.  However, that's not actually the case in SVR4; a strong definition
1388      after a weak one is an error.  Also, not making explicit
1389      instantiations one_only means that we can end up with two copies of
1390      some template instantiations.  */
1391   if (! flag_weak)
1392     return;
1393
1394   /* We can't set DECL_COMDAT on functions, or finish_file will think
1395      we can get away with not emitting them if they aren't used.  We need
1396      to for variables so that cp_finish_decl will update their linkage,
1397      because their DECL_INITIAL may not have been set properly yet.  */
1398
1399   if (!TARGET_WEAK_NOT_IN_ARCHIVE_TOC
1400       || (! DECL_EXPLICIT_INSTANTIATION (decl)
1401           && ! DECL_TEMPLATE_SPECIALIZATION (decl)))
1402     {
1403       make_decl_one_only (decl);
1404
1405       if (TREE_CODE (decl) == VAR_DECL)
1406         {
1407           DECL_COMDAT (decl) = 1;
1408           /* Mark it needed so we don't forget to emit it.  */
1409           mark_decl_referenced (decl);
1410         }
1411     }
1412 }
1413
1414 /* Set TREE_PUBLIC and/or DECL_EXTERN on the vtable DECL,
1415    based on TYPE and other static flags.
1416
1417    Note that anything public is tagged TREE_PUBLIC, whether
1418    it's public in this file or in another one.  */
1419
1420 void
1421 import_export_vtable (tree decl, tree type, int final)
1422 {
1423   if (DECL_INTERFACE_KNOWN (decl))
1424     return;
1425
1426   if (TYPE_FOR_JAVA (type))
1427     {
1428       TREE_PUBLIC (decl) = 1;
1429       DECL_EXTERNAL (decl) = 1;
1430       DECL_INTERFACE_KNOWN (decl) = 1;
1431     }
1432   else if (CLASSTYPE_INTERFACE_KNOWN (type))
1433     {
1434       TREE_PUBLIC (decl) = 1;
1435       DECL_EXTERNAL (decl) = CLASSTYPE_INTERFACE_ONLY (type);
1436       DECL_INTERFACE_KNOWN (decl) = 1;
1437     }
1438   else
1439     {
1440       /* We can only wait to decide if we have real non-inline virtual
1441          functions in our class, or if we come from a template.  */
1442
1443       int found = (CLASSTYPE_TEMPLATE_INSTANTIATION (type)
1444                    || CLASSTYPE_KEY_METHOD (type) != NULL_TREE);
1445
1446       if (final || ! found)
1447         {
1448           comdat_linkage (decl);
1449           DECL_EXTERNAL (decl) = 0;
1450         }
1451       else
1452         {
1453           TREE_PUBLIC (decl) = 1;
1454           DECL_EXTERNAL (decl) = 1;
1455         }
1456     }
1457 }
1458
1459 /* Determine whether or not we want to specifically import or export CTYPE,
1460    using various heuristics.  */
1461
1462 static void
1463 import_export_class (tree ctype)
1464 {
1465   /* -1 for imported, 1 for exported.  */
1466   int import_export = 0;
1467
1468   /* It only makes sense to call this function at EOF.  The reason is
1469      that this function looks at whether or not the first non-inline
1470      non-abstract virtual member function has been defined in this
1471      translation unit.  But, we can't possibly know that until we've
1472      seen the entire translation unit.  */
1473   my_friendly_assert (at_eof, 20000226);
1474
1475   if (CLASSTYPE_INTERFACE_KNOWN (ctype))
1476     return;
1477
1478   /* If MULTIPLE_SYMBOL_SPACES is defined and we saw a #pragma interface,
1479      we will have CLASSTYPE_INTERFACE_ONLY set but not
1480      CLASSTYPE_INTERFACE_KNOWN.  In that case, we don't want to use this
1481      heuristic because someone will supply a #pragma implementation
1482      elsewhere, and deducing it here would produce a conflict.  */
1483   if (CLASSTYPE_INTERFACE_ONLY (ctype))
1484     return;
1485
1486   if (lookup_attribute ("dllimport", TYPE_ATTRIBUTES (ctype)))
1487     import_export = -1;
1488   else if (lookup_attribute ("dllexport", TYPE_ATTRIBUTES (ctype)))
1489     import_export = 1;
1490
1491   /* If we got -fno-implicit-templates, we import template classes that
1492      weren't explicitly instantiated.  */
1493   if (import_export == 0
1494       && CLASSTYPE_IMPLICIT_INSTANTIATION (ctype)
1495       && ! flag_implicit_templates)
1496     import_export = -1;
1497
1498   /* Base our import/export status on that of the first non-inline,
1499      non-pure virtual function, if any.  */
1500   if (import_export == 0
1501       && TYPE_POLYMORPHIC_P (ctype))
1502     {
1503       tree method = CLASSTYPE_KEY_METHOD (ctype);
1504
1505       /* If weak symbol support is not available, then we must be
1506          careful not to emit the vtable when the key function is
1507          inline.  An inline function can be defined in multiple
1508          translation units.  If we were to emit the vtable in each
1509          translation unit containing a definition, we would get
1510          multiple definition errors at link-time.  */
1511       if (method && (flag_weak || ! DECL_DECLARED_INLINE_P (method)))
1512         import_export = (DECL_REALLY_EXTERN (method) ? -1 : 1);
1513     }
1514
1515 #ifdef MULTIPLE_SYMBOL_SPACES
1516   if (import_export == -1)
1517     import_export = 0;
1518 #endif
1519
1520   /* Allow backends the chance to overrule the decision.  */
1521   if (targetm.cxx.import_export_class)
1522     import_export = targetm.cxx.import_export_class (ctype, import_export);
1523
1524   if (import_export)
1525     {
1526       SET_CLASSTYPE_INTERFACE_KNOWN (ctype);
1527       CLASSTYPE_INTERFACE_ONLY (ctype) = (import_export < 0);
1528     }
1529 }
1530
1531 /* Return true if VAR has already been provided to the back end; in that
1532    case VAR should not be modified further by the front end.  */
1533 static bool
1534 var_finalized_p (tree var)
1535 {
1536   if (flag_unit_at_a_time)
1537     return cgraph_varpool_node (var)->finalized;
1538   else
1539     return TREE_ASM_WRITTEN (var);
1540 }
1541
1542 /* If necessary, write out the vtables for the dynamic class CTYPE.
1543    Returns true if any vtables were emitted.  */
1544
1545 static bool
1546 maybe_emit_vtables (tree ctype)
1547 {
1548   tree vtbl;
1549   tree primary_vtbl;
1550   bool needed = false;
1551   bool weaken_vtables;
1552
1553   /* If the vtables for this class have already been emitted there is
1554      nothing more to do.  */
1555   primary_vtbl = CLASSTYPE_VTABLES (ctype);
1556   if (var_finalized_p (primary_vtbl))
1557     return false;
1558   /* Ignore dummy vtables made by get_vtable_decl.  */
1559   if (TREE_TYPE (primary_vtbl) == void_type_node)
1560     return false;
1561
1562   import_export_class (ctype);
1563
1564   /* See if any of the vtables are needed.  */
1565   for (vtbl = CLASSTYPE_VTABLES (ctype); vtbl; vtbl = TREE_CHAIN (vtbl))
1566     {
1567       import_export_vtable (vtbl, ctype, 1);
1568       if (!DECL_EXTERNAL (vtbl) && DECL_NEEDED_P (vtbl))
1569         break;
1570     }
1571   if (!vtbl)
1572     {
1573       /* If the references to this class' vtables are optimized away,
1574          still emit the appropriate debugging information.  See
1575          dfs_debug_mark.  */
1576       if (DECL_COMDAT (primary_vtbl) 
1577           && CLASSTYPE_DEBUG_REQUESTED (ctype))
1578         note_debug_info_needed (ctype);
1579       return false;
1580     }
1581   else if (TREE_PUBLIC (vtbl) && !DECL_COMDAT (vtbl))
1582     needed = true;
1583   
1584   /* Determine whether to make vtables weak.  The ABI requires that we
1585       do so.  There are two cases in which we have to violate the ABI
1586       specification: targets where we don't have weak symbols
1587       (obviously), and targets where weak symbols don't appear in
1588       static archives' tables of contents.  On such targets, avoiding
1589       undefined symbol link errors requires that we only make a symbol
1590       weak if we know that it will be emitted everywhere it's needed.
1591       So on such targets we don't make vtables weak in the common case
1592       where we're emitting a vtable of a nontemplate class in the 
1593       translation unit containing the definition of a noninline key
1594       method. */
1595   if (flag_weak && !TARGET_WEAK_NOT_IN_ARCHIVE_TOC)
1596     weaken_vtables = true;
1597   else if (flag_weak)
1598     {
1599       if (CLASSTYPE_USE_TEMPLATE (ctype))
1600         weaken_vtables = CLASSTYPE_IMPLICIT_INSTANTIATION (ctype);
1601       else
1602         weaken_vtables = !CLASSTYPE_KEY_METHOD (ctype)
1603           || DECL_DECLARED_INLINE_P (CLASSTYPE_KEY_METHOD (ctype));
1604     }
1605   else
1606     weaken_vtables = false;
1607
1608   /* The ABI requires that we emit all of the vtables if we emit any
1609      of them.  */
1610   for (vtbl = CLASSTYPE_VTABLES (ctype); vtbl; vtbl = TREE_CHAIN (vtbl))
1611     {
1612       /* Write it out.  */
1613       import_export_vtable (vtbl, ctype, 1);
1614       mark_vtable_entries (vtbl);
1615
1616       /* If we know that DECL is needed, mark it as such for the varpool.  */
1617       if (needed)
1618         cgraph_varpool_mark_needed_node (cgraph_varpool_node (vtbl));
1619
1620       if (TREE_TYPE (DECL_INITIAL (vtbl)) == 0)
1621         {
1622           /* It had better be all done at compile-time.  */
1623           if (store_init_value (vtbl, DECL_INITIAL (vtbl)))
1624             abort ();
1625         }
1626
1627       if (write_symbols == DWARF_DEBUG || write_symbols == DWARF2_DEBUG)
1628         {
1629           /* Mark the VAR_DECL node representing the vtable itself as a
1630              "gratuitous" one, thereby forcing dwarfout.c to ignore it.
1631              It is rather important that such things be ignored because
1632              any effort to actually generate DWARF for them will run
1633              into trouble when/if we encounter code like:
1634
1635                 #pragma interface
1636                 struct S { virtual void member (); };
1637
1638               because the artificial declaration of the vtable itself (as
1639               manufactured by the g++ front end) will say that the vtable
1640               is a static member of `S' but only *after* the debug output
1641               for the definition of `S' has already been output.  This causes
1642               grief because the DWARF entry for the definition of the vtable
1643               will try to refer back to an earlier *declaration* of the
1644               vtable as a static member of `S' and there won't be one.
1645               We might be able to arrange to have the "vtable static member"
1646               attached to the member list for `S' before the debug info for
1647               `S' get written (which would solve the problem) but that would
1648               require more intrusive changes to the g++ front end.  */
1649
1650           DECL_IGNORED_P (vtbl) = 1;
1651         }
1652
1653       /* Always make vtables weak.  Or at least almost always; see above. */
1654       if (weaken_vtables)
1655         comdat_linkage (vtbl);
1656
1657       rest_of_decl_compilation (vtbl, NULL, 1, 1);
1658
1659       /* Because we're only doing syntax-checking, we'll never end up
1660          actually marking the variable as written.  */
1661       if (flag_syntax_only)
1662         TREE_ASM_WRITTEN (vtbl) = 1;
1663     }
1664
1665   /* Since we're writing out the vtable here, also write the debug
1666      info.  */
1667   note_debug_info_needed (ctype);
1668
1669   return true;
1670 }
1671
1672 /* Determines the proper settings of TREE_PUBLIC and DECL_EXTERNAL for an
1673    inline function or template instantiation at end-of-file.  */
1674
1675 void
1676 import_export_decl (tree decl)
1677 {
1678   if (DECL_INTERFACE_KNOWN (decl))
1679     return;
1680
1681   if (DECL_TEMPLATE_INSTANTIATION (decl)
1682       || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl))
1683     {
1684       DECL_NOT_REALLY_EXTERN (decl) = 1;
1685       if ((DECL_IMPLICIT_INSTANTIATION (decl)
1686            || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl))
1687           && (flag_implicit_templates
1688               || (flag_implicit_inline_templates
1689                   && TREE_CODE (decl) == FUNCTION_DECL 
1690                   && DECL_DECLARED_INLINE_P (decl))))
1691         {
1692           if (!TREE_PUBLIC (decl))
1693             /* Templates are allowed to have internal linkage.  See 
1694                [basic.link].  */
1695             ;
1696           else
1697             comdat_linkage (decl);
1698         }
1699       else
1700         {
1701           DECL_EXTERNAL (decl) = 1;
1702           DECL_NOT_REALLY_EXTERN (decl) = 0;
1703         }
1704     }
1705   else if (DECL_FUNCTION_MEMBER_P (decl))
1706     {
1707       if (!DECL_DECLARED_INLINE_P (decl))
1708         {
1709           tree ctype = DECL_CONTEXT (decl);
1710           import_export_class (ctype);
1711           if (CLASSTYPE_INTERFACE_KNOWN (ctype))
1712             {
1713               DECL_NOT_REALLY_EXTERN (decl)
1714                 = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
1715                      || (DECL_DECLARED_INLINE_P (decl) 
1716                          && ! flag_implement_inlines
1717                          && !DECL_VINDEX (decl)));
1718
1719               if (!DECL_NOT_REALLY_EXTERN (decl))
1720                 DECL_EXTERNAL (decl) = 1;
1721
1722               /* Always make artificials weak.  */
1723               if (DECL_ARTIFICIAL (decl) && flag_weak)
1724                 comdat_linkage (decl);
1725               else
1726                 maybe_make_one_only (decl);
1727             }
1728         }
1729       else
1730         comdat_linkage (decl);
1731     }
1732   else
1733     comdat_linkage (decl);
1734
1735   DECL_INTERFACE_KNOWN (decl) = 1;
1736 }
1737
1738 /* Here, we only decide whether or not the tinfo node should be
1739    emitted with the vtable.  IS_IN_LIBRARY is nonzero iff the
1740    typeinfo for TYPE should be in the runtime library.  */
1741
1742 void
1743 import_export_tinfo (tree decl, tree type, bool is_in_library)
1744 {
1745   if (DECL_INTERFACE_KNOWN (decl))
1746     return;
1747   
1748   if (IS_AGGR_TYPE (type))
1749     import_export_class (type);
1750       
1751   if (IS_AGGR_TYPE (type) && CLASSTYPE_INTERFACE_KNOWN (type)
1752       && TYPE_POLYMORPHIC_P (type)
1753       /* If -fno-rtti, we're not necessarily emitting this stuff with
1754          the class, so go ahead and emit it now.  This can happen when
1755          a class is used in exception handling.  */
1756       && flag_rtti)
1757     {
1758       DECL_NOT_REALLY_EXTERN (decl) = !CLASSTYPE_INTERFACE_ONLY (type);
1759       DECL_COMDAT (decl) = 0;
1760     }
1761   else
1762     {
1763       DECL_NOT_REALLY_EXTERN (decl) = 1;
1764       DECL_COMDAT (decl) = 1;
1765     }
1766
1767   /* Now override some cases.  */
1768   if (flag_weak)
1769     DECL_COMDAT (decl) = 1;
1770   else if (is_in_library)
1771     DECL_COMDAT (decl) = 0;
1772   
1773   DECL_INTERFACE_KNOWN (decl) = 1;
1774 }
1775
1776 /* Return an expression that performs the destruction of DECL, which
1777    must be a VAR_DECL whose type has a non-trivial destructor, or is
1778    an array whose (innermost) elements have a non-trivial destructor.  */
1779
1780 tree
1781 build_cleanup (tree decl)
1782 {
1783   tree temp;
1784   tree type = TREE_TYPE (decl);
1785
1786   /* This function should only be called for declarations that really
1787      require cleanups.  */
1788   my_friendly_assert (!TYPE_HAS_TRIVIAL_DESTRUCTOR (type), 20030106);
1789
1790   /* Treat all objects with destructors as used; the destructor may do
1791      something substantive.  */
1792   mark_used (decl);
1793
1794   if (TREE_CODE (type) == ARRAY_TYPE)
1795     temp = decl;
1796   else
1797     {
1798       cxx_mark_addressable (decl);
1799       temp = build1 (ADDR_EXPR, build_pointer_type (type), decl);
1800     }
1801   temp = build_delete (TREE_TYPE (temp), temp,
1802                        sfk_complete_destructor,
1803                        LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
1804   return temp;
1805 }
1806
1807 /* Returns the initialization guard variable for the variable DECL,
1808    which has static storage duration.  */
1809
1810 tree
1811 get_guard (tree decl)
1812 {
1813   tree sname;
1814   tree guard;
1815
1816   sname = mangle_guard_variable (decl);
1817   guard = IDENTIFIER_GLOBAL_VALUE (sname);
1818   if (! guard)
1819     {
1820       tree guard_type;
1821
1822       /* We use a type that is big enough to contain a mutex as well
1823          as an integer counter.  */
1824       guard_type = targetm.cxx.guard_type ();
1825       guard = build_decl (VAR_DECL, sname, guard_type);
1826       
1827       /* The guard should have the same linkage as what it guards.  */
1828       TREE_PUBLIC (guard) = TREE_PUBLIC (decl);
1829       TREE_STATIC (guard) = TREE_STATIC (decl);
1830       DECL_COMMON (guard) = DECL_COMMON (decl);
1831       DECL_ONE_ONLY (guard) = DECL_ONE_ONLY (decl);
1832       if (TREE_PUBLIC (decl))
1833         DECL_WEAK (guard) = DECL_WEAK (decl);
1834       
1835       DECL_ARTIFICIAL (guard) = 1;
1836       TREE_USED (guard) = 1;
1837       pushdecl_top_level_and_finish (guard, NULL_TREE);
1838     }
1839   return guard;
1840 }
1841
1842 /* Return those bits of the GUARD variable that should be set when the
1843    guarded entity is actually initialized.  */
1844
1845 static tree
1846 get_guard_bits (tree guard)
1847 {
1848   if (!targetm.cxx.guard_mask_bit ())
1849     {
1850       /* We only set the first byte of the guard, in order to leave room
1851          for a mutex in the high-order bits.  */
1852       guard = build1 (ADDR_EXPR, 
1853                       build_pointer_type (TREE_TYPE (guard)),
1854                       guard);
1855       guard = build1 (NOP_EXPR, 
1856                       build_pointer_type (char_type_node), 
1857                       guard);
1858       guard = build1 (INDIRECT_REF, char_type_node, guard);
1859     }
1860
1861   return guard;
1862 }
1863
1864 /* Return an expression which determines whether or not the GUARD
1865    variable has already been initialized.  */
1866
1867 tree
1868 get_guard_cond (tree guard)
1869 {
1870   tree guard_value;
1871
1872   /* Check to see if the GUARD is zero.  */
1873   guard = get_guard_bits (guard);
1874
1875   /* Mask off all but the low bit.  */
1876   if (targetm.cxx.guard_mask_bit ())
1877     {
1878       guard_value = integer_one_node;
1879       if (!same_type_p (TREE_TYPE (guard_value), TREE_TYPE (guard)))
1880         guard_value = convert (TREE_TYPE (guard), guard_value);
1881         guard = cp_build_binary_op (BIT_AND_EXPR, guard, guard_value);
1882     }
1883
1884   guard_value = integer_zero_node;
1885   if (!same_type_p (TREE_TYPE (guard_value), TREE_TYPE (guard)))
1886     guard_value = convert (TREE_TYPE (guard), guard_value);
1887   return cp_build_binary_op (EQ_EXPR, guard, guard_value);
1888 }
1889
1890 /* Return an expression which sets the GUARD variable, indicating that
1891    the variable being guarded has been initialized.  */
1892
1893 tree
1894 set_guard (tree guard)
1895 {
1896   tree guard_init;
1897
1898   /* Set the GUARD to one.  */
1899   guard = get_guard_bits (guard);
1900   guard_init = integer_one_node;
1901   if (!same_type_p (TREE_TYPE (guard_init), TREE_TYPE (guard)))
1902     guard_init = convert (TREE_TYPE (guard), guard_init);
1903   return build_modify_expr (guard, NOP_EXPR, guard_init);
1904 }
1905
1906 /* Start the process of running a particular set of global constructors
1907    or destructors.  Subroutine of do_[cd]tors.  */
1908
1909 static tree
1910 start_objects (int method_type, int initp)
1911 {
1912   tree body;
1913   tree fndecl;
1914   char type[10];
1915
1916   /* Make ctor or dtor function.  METHOD_TYPE may be 'I' or 'D'.  */
1917
1918   if (initp != DEFAULT_INIT_PRIORITY)
1919     {
1920       char joiner;
1921
1922 #ifdef JOINER
1923       joiner = JOINER;
1924 #else
1925       joiner = '_';
1926 #endif
1927
1928       sprintf (type, "%c%c%.5u", method_type, joiner, initp);
1929     }
1930   else
1931     sprintf (type, "%c", method_type);
1932
1933   fndecl = build_lang_decl (FUNCTION_DECL, 
1934                             get_file_function_name_long (type),
1935                             build_function_type (void_type_node,
1936                                                  void_list_node));
1937   start_preparsed_function (fndecl, /*attrs=*/NULL_TREE, SF_PRE_PARSED);
1938
1939   /* It can be a static function as long as collect2 does not have
1940      to scan the object file to find its ctor/dtor routine.  */
1941   TREE_PUBLIC (current_function_decl) = ! targetm.have_ctors_dtors;
1942
1943   /* Mark this declaration as used to avoid spurious warnings.  */
1944   TREE_USED (current_function_decl) = 1;
1945
1946   /* Mark this function as a global constructor or destructor.  */
1947   if (method_type == 'I')
1948     DECL_GLOBAL_CTOR_P (current_function_decl) = 1;
1949   else
1950     DECL_GLOBAL_DTOR_P (current_function_decl) = 1;
1951   DECL_LANG_SPECIFIC (current_function_decl)->decl_flags.u2sel = 1;
1952
1953   body = begin_compound_stmt (BCS_FN_BODY);
1954
1955   /* We cannot allow these functions to be elided, even if they do not
1956      have external linkage.  And, there's no point in deferring
1957      compilation of thes functions; they're all going to have to be
1958      out anyhow.  */
1959   DECL_INLINE (current_function_decl) = 0;
1960   DECL_UNINLINABLE (current_function_decl) = 1;
1961
1962   return body;
1963 }
1964
1965 /* Finish the process of running a particular set of global constructors
1966    or destructors.  Subroutine of do_[cd]tors.  */
1967
1968 static void
1969 finish_objects (int method_type, int initp, tree body)
1970 {
1971   tree fn;
1972
1973   /* Finish up.  */
1974   finish_compound_stmt (body);
1975   fn = finish_function (0);
1976   expand_or_defer_fn (fn);
1977
1978   /* When only doing semantic analysis, and no RTL generation, we
1979      can't call functions that directly emit assembly code; there is
1980      no assembly file in which to put the code.  */
1981   if (flag_syntax_only)
1982     return;
1983
1984   if (targetm.have_ctors_dtors)
1985     {
1986       rtx fnsym = XEXP (DECL_RTL (fn), 0);
1987       if (method_type == 'I')
1988         (* targetm.asm_out.constructor) (fnsym, initp);
1989       else
1990         (* targetm.asm_out.destructor) (fnsym, initp);
1991     }
1992 }
1993
1994 /* The names of the parameters to the function created to handle
1995    initializations and destructions for objects with static storage
1996    duration.  */
1997 #define INITIALIZE_P_IDENTIFIER "__initialize_p"
1998 #define PRIORITY_IDENTIFIER "__priority"
1999
2000 /* The name of the function we create to handle initializations and
2001    destructions for objects with static storage duration.  */
2002 #define SSDF_IDENTIFIER "__static_initialization_and_destruction"
2003
2004 /* The declaration for the __INITIALIZE_P argument.  */
2005 static GTY(()) tree initialize_p_decl;
2006
2007 /* The declaration for the __PRIORITY argument.  */
2008 static GTY(()) tree priority_decl;
2009
2010 /* The declaration for the static storage duration function.  */
2011 static GTY(()) tree ssdf_decl;
2012
2013 /* All the static storage duration functions created in this
2014    translation unit.  */
2015 static GTY(()) varray_type ssdf_decls;
2016
2017 /* A map from priority levels to information about that priority
2018    level.  There may be many such levels, so efficient lookup is
2019    important.  */
2020 static splay_tree priority_info_map;
2021
2022 /* Begins the generation of the function that will handle all
2023    initialization and destruction of objects with static storage
2024    duration.  The function generated takes two parameters of type
2025    `int': __INITIALIZE_P and __PRIORITY.  If __INITIALIZE_P is
2026    nonzero, it performs initializations.  Otherwise, it performs
2027    destructions.  It only performs those initializations or
2028    destructions with the indicated __PRIORITY.  The generated function
2029    returns no value.  
2030
2031    It is assumed that this function will only be called once per
2032    translation unit.  */
2033
2034 static tree
2035 start_static_storage_duration_function (unsigned count)
2036 {
2037   tree parm_types;
2038   tree type;
2039   tree body;
2040   char id[sizeof (SSDF_IDENTIFIER) + 1 /* '\0' */ + 32];
2041
2042   /* Create the identifier for this function.  It will be of the form
2043      SSDF_IDENTIFIER_<number>.  */
2044   sprintf (id, "%s_%u", SSDF_IDENTIFIER, count);
2045
2046   /* Create the parameters.  */
2047   parm_types = void_list_node;
2048   parm_types = tree_cons (NULL_TREE, integer_type_node, parm_types);
2049   parm_types = tree_cons (NULL_TREE, integer_type_node, parm_types);
2050   type = build_function_type (void_type_node, parm_types);
2051
2052   /* Create the FUNCTION_DECL itself.  */
2053   ssdf_decl = build_lang_decl (FUNCTION_DECL, 
2054                                get_identifier (id),
2055                                type);
2056   TREE_PUBLIC (ssdf_decl) = 0;
2057   DECL_ARTIFICIAL (ssdf_decl) = 1;
2058
2059   /* Put this function in the list of functions to be called from the
2060      static constructors and destructors.  */
2061   if (!ssdf_decls)
2062     {
2063       VARRAY_TREE_INIT (ssdf_decls, 32, "ssdf_decls");
2064
2065       /* Take this opportunity to initialize the map from priority
2066          numbers to information about that priority level.  */
2067       priority_info_map = splay_tree_new (splay_tree_compare_ints,
2068                                           /*delete_key_fn=*/0,
2069                                           /*delete_value_fn=*/
2070                                           (splay_tree_delete_value_fn) &free);
2071
2072       /* We always need to generate functions for the
2073          DEFAULT_INIT_PRIORITY so enter it now.  That way when we walk
2074          priorities later, we'll be sure to find the
2075          DEFAULT_INIT_PRIORITY.  */
2076       get_priority_info (DEFAULT_INIT_PRIORITY);
2077     }
2078
2079   VARRAY_PUSH_TREE (ssdf_decls, ssdf_decl);
2080
2081   /* Create the argument list.  */
2082   initialize_p_decl = cp_build_parm_decl
2083     (get_identifier (INITIALIZE_P_IDENTIFIER), integer_type_node);
2084   DECL_CONTEXT (initialize_p_decl) = ssdf_decl;
2085   TREE_USED (initialize_p_decl) = 1;
2086   priority_decl = cp_build_parm_decl
2087     (get_identifier (PRIORITY_IDENTIFIER), integer_type_node);
2088   DECL_CONTEXT (priority_decl) = ssdf_decl;
2089   TREE_USED (priority_decl) = 1;
2090
2091   TREE_CHAIN (initialize_p_decl) = priority_decl;
2092   DECL_ARGUMENTS (ssdf_decl) = initialize_p_decl;
2093
2094   /* Put the function in the global scope.  */
2095   pushdecl (ssdf_decl);
2096
2097   /* Start the function itself.  This is equivalent to declaring the
2098      function as:
2099
2100        static void __ssdf (int __initialize_p, init __priority_p);
2101        
2102      It is static because we only need to call this function from the
2103      various constructor and destructor functions for this module.  */
2104   start_preparsed_function (ssdf_decl,
2105                             /*attrs=*/NULL_TREE,
2106                             SF_PRE_PARSED);
2107
2108   /* Set up the scope of the outermost block in the function.  */
2109   body = begin_compound_stmt (BCS_FN_BODY);
2110
2111   /* This function must not be deferred because we are depending on
2112      its compilation to tell us what is TREE_SYMBOL_REFERENCED.  */
2113   DECL_INLINE (ssdf_decl) = 0;
2114   DECL_UNINLINABLE (ssdf_decl) = 1;
2115
2116   return body;
2117 }
2118
2119 /* Finish the generation of the function which performs initialization
2120    and destruction of objects with static storage duration.  After
2121    this point, no more such objects can be created.  */
2122
2123 static void
2124 finish_static_storage_duration_function (tree body)
2125 {
2126   /* Close out the function.  */
2127   finish_compound_stmt (body);
2128   expand_or_defer_fn (finish_function (0));
2129 }
2130
2131 /* Return the information about the indicated PRIORITY level.  If no
2132    code to handle this level has yet been generated, generate the
2133    appropriate prologue.  */
2134
2135 static priority_info
2136 get_priority_info (int priority)
2137 {
2138   priority_info pi;
2139   splay_tree_node n;
2140
2141   n = splay_tree_lookup (priority_info_map, 
2142                          (splay_tree_key) priority);
2143   if (!n)
2144     {
2145       /* Create a new priority information structure, and insert it
2146          into the map.  */
2147       pi = xmalloc (sizeof (struct priority_info_s));
2148       pi->initializations_p = 0;
2149       pi->destructions_p = 0;
2150       splay_tree_insert (priority_info_map,
2151                          (splay_tree_key) priority,
2152                          (splay_tree_value) pi);
2153     }
2154   else
2155     pi = (priority_info) n->value;
2156
2157   return pi;
2158 }
2159
2160 /* Set up to handle the initialization or destruction of DECL.  If
2161    INITP is nonzero, we are initializing the variable.  Otherwise, we
2162    are destroying it.  */
2163
2164 static tree
2165 start_static_initialization_or_destruction (tree decl, int initp)
2166 {
2167   tree guard_if_stmt = NULL_TREE;
2168   int priority;
2169   tree cond;
2170   tree guard;
2171   tree init_cond;
2172   priority_info pi;
2173
2174   /* Figure out the priority for this declaration.  */
2175   priority = DECL_INIT_PRIORITY (decl);
2176   if (!priority)
2177     priority = DEFAULT_INIT_PRIORITY;
2178
2179   /* Remember that we had an initialization or finalization at this
2180      priority.  */
2181   pi = get_priority_info (priority);
2182   if (initp)
2183     pi->initializations_p = 1;
2184   else
2185     pi->destructions_p = 1;
2186
2187   /* Trick the compiler into thinking we are at the file and line
2188      where DECL was declared so that error-messages make sense, and so
2189      that the debugger will show somewhat sensible file and line
2190      information.  */
2191   input_location = DECL_SOURCE_LOCATION (decl);
2192
2193   /* Because of:
2194
2195        [class.access.spec]
2196
2197        Access control for implicit calls to the constructors,
2198        the conversion functions, or the destructor called to
2199        create and destroy a static data member is performed as
2200        if these calls appeared in the scope of the member's
2201        class.  
2202
2203      we pretend we are in a static member function of the class of
2204      which the DECL is a member.  */
2205   if (member_p (decl))
2206     {
2207       DECL_CONTEXT (current_function_decl) = DECL_CONTEXT (decl);
2208       DECL_STATIC_FUNCTION_P (current_function_decl) = 1;
2209     }
2210   
2211   /* Conditionalize this initialization on being in the right priority
2212      and being initializing/finalizing appropriately.  */
2213   guard_if_stmt = begin_if_stmt ();
2214   cond = cp_build_binary_op (EQ_EXPR,
2215                              priority_decl,
2216                              build_int_2 (priority, 0));
2217   init_cond = initp ? integer_one_node : integer_zero_node;
2218   init_cond = cp_build_binary_op (EQ_EXPR,
2219                                   initialize_p_decl,
2220                                   init_cond);
2221   cond = cp_build_binary_op (TRUTH_ANDIF_EXPR, cond, init_cond);
2222
2223   /* Assume we don't need a guard.  */
2224   guard = NULL_TREE;
2225   /* We need a guard if this is an object with external linkage that
2226      might be initialized in more than one place.  (For example, a
2227      static data member of a template, when the data member requires
2228      construction.)  */
2229   if (TREE_PUBLIC (decl) && (DECL_COMMON (decl) 
2230                              || DECL_ONE_ONLY (decl)
2231                              || DECL_WEAK (decl)))
2232     {
2233       tree guard_cond;
2234
2235       guard = get_guard (decl);
2236
2237       /* When using __cxa_atexit, we just check the GUARD as we would
2238          for a local static.  */
2239       if (flag_use_cxa_atexit)
2240         {
2241           /* When using __cxa_atexit, we never try to destroy
2242              anything from a static destructor.  */
2243           my_friendly_assert (initp, 20000629);
2244           guard_cond = get_guard_cond (guard);
2245         }
2246       /* If we don't have __cxa_atexit, then we will be running
2247          destructors from .fini sections, or their equivalents.  So,
2248          we need to know how many times we've tried to initialize this
2249          object.  We do initializations only if the GUARD is zero,
2250          i.e., if we are the first to initialize the variable.  We do
2251          destructions only if the GUARD is one, i.e., if we are the
2252          last to destroy the variable.  */
2253       else if (initp)
2254         guard_cond 
2255           = cp_build_binary_op (EQ_EXPR,
2256                                 build_unary_op (PREINCREMENT_EXPR,
2257                                                 guard,
2258                                                 /*noconvert=*/1),
2259                                 integer_one_node);
2260       else
2261         guard_cond 
2262           = cp_build_binary_op (EQ_EXPR,
2263                                 build_unary_op (PREDECREMENT_EXPR,
2264                                                 guard,
2265                                                 /*noconvert=*/1),
2266                                 integer_zero_node);
2267
2268       cond = cp_build_binary_op (TRUTH_ANDIF_EXPR, cond, guard_cond);
2269     }
2270
2271   finish_if_stmt_cond (cond, guard_if_stmt);
2272
2273   /* If we're using __cxa_atexit, we have not already set the GUARD,
2274      so we must do so now.  */
2275   if (guard && initp && flag_use_cxa_atexit)
2276     finish_expr_stmt (set_guard (guard));
2277
2278   return guard_if_stmt;
2279 }
2280
2281 /* We've just finished generating code to do an initialization or
2282    finalization.  GUARD_IF_STMT is the if-statement we used to guard
2283    the initialization.  */
2284
2285 static void
2286 finish_static_initialization_or_destruction (tree guard_if_stmt)
2287 {
2288   finish_then_clause (guard_if_stmt);
2289   finish_if_stmt (guard_if_stmt);
2290
2291   /* Now that we're done with DECL we don't need to pretend to be a
2292      member of its class any longer.  */
2293   DECL_CONTEXT (current_function_decl) = NULL_TREE;
2294   DECL_STATIC_FUNCTION_P (current_function_decl) = 0;
2295 }
2296
2297 /* Generate code to do the initialization of DECL, a VAR_DECL with
2298    static storage duration.  The initialization is INIT.  */
2299
2300 static void
2301 do_static_initialization (tree decl, tree init)
2302 {
2303   tree guard_if_stmt;
2304
2305   /* Set up for the initialization.  */
2306   guard_if_stmt
2307     = start_static_initialization_or_destruction (decl,
2308                                                   /*initp=*/1);
2309
2310   /* Perform the initialization.  */
2311   if (init)
2312     finish_expr_stmt (init);
2313
2314   /* If we're using __cxa_atexit, register a a function that calls the
2315      destructor for the object.  */
2316   if (flag_use_cxa_atexit)
2317     register_dtor_fn (decl);
2318
2319   /* Finish up.  */
2320   finish_static_initialization_or_destruction (guard_if_stmt);
2321 }
2322
2323 /* Generate code to do the static destruction of DECL.  If DECL may be
2324    initialized more than once in different object files, GUARD is the
2325    guard variable to check.  PRIORITY is the priority for the
2326    destruction.  */
2327
2328 static void
2329 do_static_destruction (tree decl)
2330 {
2331   tree guard_if_stmt;
2332
2333   /* If we're using __cxa_atexit, then destructors are registered
2334      immediately after objects are initialized.  */
2335   my_friendly_assert (!flag_use_cxa_atexit, 20000121);
2336
2337   /* If we don't need a destructor, there's nothing to do.  */
2338   if (TYPE_HAS_TRIVIAL_DESTRUCTOR (TREE_TYPE (decl)))
2339     return;
2340
2341   /* Actually do the destruction.  */
2342   guard_if_stmt = start_static_initialization_or_destruction (decl,
2343                                                               /*initp=*/0);
2344   finish_expr_stmt (build_cleanup (decl));
2345   finish_static_initialization_or_destruction (guard_if_stmt);
2346 }
2347
2348 /* VARS is a list of variables with static storage duration which may
2349    need initialization and/or finalization.  Remove those variables
2350    that don't really need to be initialized or finalized, and return
2351    the resulting list.  The order in which the variables appear in
2352    VARS is in reverse order of the order in which they should actually
2353    be initialized.  The list we return is in the unreversed order;
2354    i.e., the first variable should be initialized first.  */
2355
2356 static tree
2357 prune_vars_needing_no_initialization (tree *vars)
2358 {
2359   tree *var = vars;
2360   tree result = NULL_TREE;
2361
2362   while (*var)
2363     {
2364       tree t = *var;
2365       tree decl = TREE_VALUE (t);
2366       tree init = TREE_PURPOSE (t);
2367
2368       /* Deal gracefully with error.  */
2369       if (decl == error_mark_node)
2370         {
2371           var = &TREE_CHAIN (t);
2372           continue;
2373         }
2374
2375       /* The only things that can be initialized are variables.  */
2376       my_friendly_assert (TREE_CODE (decl) == VAR_DECL, 19990420);
2377
2378       /* If this object is not defined, we don't need to do anything
2379          here.  */
2380       if (DECL_EXTERNAL (decl))
2381         {
2382           var = &TREE_CHAIN (t);
2383           continue;
2384         }
2385
2386       /* Also, if the initializer already contains errors, we can bail
2387          out now.  */
2388       if (init && TREE_CODE (init) == TREE_LIST 
2389           && value_member (error_mark_node, init))
2390         {
2391           var = &TREE_CHAIN (t);
2392           continue;
2393         }
2394
2395       /* This variable is going to need initialization and/or
2396          finalization, so we add it to the list.  */
2397       *var = TREE_CHAIN (t);
2398       TREE_CHAIN (t) = result;
2399       result = t;
2400     }
2401
2402   return result;
2403 }
2404
2405 /* Make sure we have told the back end about all the variables in
2406    VARS.  */
2407
2408 static void
2409 write_out_vars (tree vars)
2410 {
2411   tree v;
2412
2413   for (v = vars; v; v = TREE_CHAIN (v))
2414     if (!var_finalized_p (TREE_VALUE (v)))
2415       rest_of_decl_compilation (TREE_VALUE (v), 0, 1, 1);
2416 }
2417
2418 /* Generate a static constructor (if CONSTRUCTOR_P) or destructor
2419    (otherwise) that will initialize all gobal objects with static
2420    storage duration having the indicated PRIORITY.  */
2421
2422 static void
2423 generate_ctor_or_dtor_function (bool constructor_p, int priority,
2424                                 location_t *locus)
2425 {
2426   char function_key;
2427   tree arguments;
2428   tree fndecl;
2429   tree body;
2430   size_t i;
2431
2432   input_location = *locus;
2433 #ifdef USE_MAPPED_LOCATION
2434   /* ??? */
2435 #else
2436   locus->line++;
2437 #endif
2438   
2439   /* We use `I' to indicate initialization and `D' to indicate
2440      destruction.  */
2441   function_key = constructor_p ? 'I' : 'D';
2442
2443   /* We emit the function lazily, to avoid generating empty
2444      global constructors and destructors.  */
2445   body = NULL_TREE;
2446
2447   /* Call the static storage duration function with appropriate
2448      arguments.  */
2449   if (ssdf_decls)
2450     for (i = 0; i < ssdf_decls->elements_used; ++i) 
2451       {
2452         fndecl = VARRAY_TREE (ssdf_decls, i);
2453
2454         /* Calls to pure or const functions will expand to nothing.  */
2455         if (! (flags_from_decl_or_type (fndecl) & (ECF_CONST | ECF_PURE)))
2456           {
2457             if (! body)
2458               body = start_objects (function_key, priority);
2459
2460             arguments = tree_cons (NULL_TREE, build_int_2 (priority, 0), 
2461                                    NULL_TREE);
2462             arguments = tree_cons (NULL_TREE, build_int_2 (constructor_p, 0),
2463                                    arguments);
2464             finish_expr_stmt (build_function_call (fndecl, arguments));
2465           }
2466       }
2467
2468   /* If we're generating code for the DEFAULT_INIT_PRIORITY, throw in
2469      calls to any functions marked with attributes indicating that
2470      they should be called at initialization- or destruction-time.  */
2471   if (priority == DEFAULT_INIT_PRIORITY)
2472     {
2473       tree fns;
2474
2475       for (fns = constructor_p ? static_ctors : static_dtors; 
2476            fns;
2477            fns = TREE_CHAIN (fns))
2478         {
2479           fndecl = TREE_VALUE (fns);
2480
2481           /* Calls to pure/const functions will expand to nothing.  */
2482           if (! (flags_from_decl_or_type (fndecl) & (ECF_CONST | ECF_PURE)))
2483             {
2484               if (! body)
2485                 body = start_objects (function_key, priority);
2486               finish_expr_stmt (build_function_call (fndecl, NULL_TREE));
2487             }
2488         }
2489     }
2490
2491   /* Close out the function.  */
2492   if (body)
2493     finish_objects (function_key, priority, body);
2494 }
2495
2496 /* Generate constructor and destructor functions for the priority
2497    indicated by N.  */
2498
2499 static int
2500 generate_ctor_and_dtor_functions_for_priority (splay_tree_node n, void * data)
2501 {
2502   location_t *locus = data;
2503   int priority = (int) n->key;
2504   priority_info pi = (priority_info) n->value;
2505
2506   /* Generate the functions themselves, but only if they are really
2507      needed.  */
2508   if (pi->initializations_p
2509       || (priority == DEFAULT_INIT_PRIORITY && static_ctors))
2510     generate_ctor_or_dtor_function (/*constructor_p=*/true, priority, locus);
2511   if (pi->destructions_p
2512       || (priority == DEFAULT_INIT_PRIORITY && static_dtors))
2513     generate_ctor_or_dtor_function (/*constructor_p=*/false, priority, locus);
2514
2515   /* Keep iterating.  */
2516   return 0;
2517 }
2518
2519 /* Called via LANGHOOK_CALLGRAPH_ANALYZE_EXPR.  It is supposed to mark
2520    decls referenced from frontend specific constructs; it will be called
2521    only for language-specific tree nodes.
2522
2523    Here we must deal with member pointers.  */
2524
2525 tree
2526 cxx_callgraph_analyze_expr (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
2527                             tree from ATTRIBUTE_UNUSED)
2528 {
2529   tree t = *tp;
2530
2531   if (flag_unit_at_a_time)
2532     switch (TREE_CODE (t))
2533       {
2534       case PTRMEM_CST:
2535         if (TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
2536           cgraph_mark_needed_node (cgraph_node (PTRMEM_CST_MEMBER (t)));
2537         break;
2538       case BASELINK:
2539         if (TREE_CODE (BASELINK_FUNCTIONS (t)) == FUNCTION_DECL)
2540           cgraph_mark_needed_node (cgraph_node (BASELINK_FUNCTIONS (t)));
2541         break;
2542
2543       default:
2544         break;
2545       }
2546
2547   return NULL;
2548 }
2549
2550 /* This routine is called from the last rule in yyparse ().
2551    Its job is to create all the code needed to initialize and
2552    destroy the global aggregates.  We do the destruction
2553    first, since that way we only need to reverse the decls once.  */
2554
2555 void
2556 finish_file (void)
2557 {
2558   tree vars;
2559   bool reconsider;
2560   size_t i;
2561   location_t locus;
2562   unsigned ssdf_count = 0;
2563
2564   locus = input_location;
2565   at_eof = 1;
2566
2567   /* Bad parse errors.  Just forget about it.  */
2568   if (! global_bindings_p () || current_class_type || decl_namespace_list)
2569     return;
2570
2571   if (pch_file)
2572     c_common_write_pch ();
2573
2574 #ifdef USE_MAPPED_LOCATION
2575   /* FIXME - huh? */
2576 #else
2577   /* Otherwise, GDB can get confused, because in only knows
2578      about source for LINENO-1 lines.  */
2579   input_line -= 1;
2580 #endif
2581
2582   interface_unknown = 1;
2583   interface_only = 0;
2584
2585   /* We now have to write out all the stuff we put off writing out.
2586      These include:
2587
2588        o Template specializations that we have not yet instantiated,
2589          but which are needed.
2590        o Initialization and destruction for non-local objects with
2591          static storage duration.  (Local objects with static storage
2592          duration are initialized when their scope is first entered,
2593          and are cleaned up via atexit.)
2594        o Virtual function tables.  
2595
2596      All of these may cause others to be needed.  For example,
2597      instantiating one function may cause another to be needed, and
2598      generating the initializer for an object may cause templates to be
2599      instantiated, etc., etc.  */
2600
2601   timevar_push (TV_VARCONST);
2602
2603   emit_support_tinfos ();
2604
2605   do 
2606     {
2607       tree t;
2608       size_t n_old, n_new;
2609
2610       reconsider = false;
2611
2612       /* If there are templates that we've put off instantiating, do
2613          them now.  */
2614       instantiate_pending_templates ();
2615       ggc_collect ();
2616
2617       /* Write out virtual tables as required.  Note that writing out
2618          the virtual table for a template class may cause the
2619          instantiation of members of that class.  If we write out
2620          vtables then we remove the class from our list so we don't
2621          have to look at it again.  */
2622  
2623       while (keyed_classes != NULL_TREE
2624              && maybe_emit_vtables (TREE_VALUE (keyed_classes)))
2625         {
2626           reconsider = true;
2627           keyed_classes = TREE_CHAIN (keyed_classes);
2628         }
2629  
2630       t = keyed_classes;
2631       if (t != NULL_TREE)
2632         {
2633           tree next = TREE_CHAIN (t);
2634  
2635           while (next)
2636             {
2637               if (maybe_emit_vtables (TREE_VALUE (next)))
2638                 {
2639                   reconsider = true;
2640                   TREE_CHAIN (t) = TREE_CHAIN (next);
2641                 }
2642               else
2643                 t = next;
2644  
2645               next = TREE_CHAIN (t);
2646             }
2647         }
2648        
2649       /* Write out needed type info variables.  We have to be careful
2650          looping through unemitted decls, because emit_tinfo_decl may
2651          cause other variables to be needed.  We stick new elements
2652          (and old elements that we may need to reconsider) at the end
2653          of the array, then shift them back to the beginning once we're
2654          done.  */
2655   
2656       n_old = VARRAY_ACTIVE_SIZE (unemitted_tinfo_decls);
2657       for (i = 0; i < n_old; ++i)
2658         {
2659           tree tinfo_decl = VARRAY_TREE (unemitted_tinfo_decls, i);
2660           if (emit_tinfo_decl (tinfo_decl))
2661             reconsider = true;
2662           else
2663             VARRAY_PUSH_TREE (unemitted_tinfo_decls, tinfo_decl);
2664         }
2665   
2666       /* The only elements we want to keep are the new ones.  Copy
2667          them to the beginning of the array, then get rid of the
2668          leftovers.  */
2669       n_new = VARRAY_ACTIVE_SIZE (unemitted_tinfo_decls) - n_old;
2670       if (n_new)
2671         memmove (&VARRAY_TREE (unemitted_tinfo_decls, 0),
2672                  &VARRAY_TREE (unemitted_tinfo_decls, n_old),
2673                  n_new * sizeof (tree));
2674       memset (&VARRAY_TREE (unemitted_tinfo_decls, n_new),
2675               0, n_old * sizeof (tree));
2676       VARRAY_ACTIVE_SIZE (unemitted_tinfo_decls) = n_new;
2677
2678       /* The list of objects with static storage duration is built up
2679          in reverse order.  We clear STATIC_AGGREGATES so that any new
2680          aggregates added during the initialization of these will be
2681          initialized in the correct order when we next come around the
2682          loop.  */
2683       vars = prune_vars_needing_no_initialization (&static_aggregates);
2684
2685       if (vars)
2686         {
2687           tree v;
2688
2689           /* We need to start a new initialization function each time
2690              through the loop.  That's because we need to know which
2691              vtables have been referenced, and TREE_SYMBOL_REFERENCED
2692              isn't computed until a function is finished, and written
2693              out.  That's a deficiency in the back-end.  When this is
2694              fixed, these initialization functions could all become
2695              inline, with resulting performance improvements.  */
2696           tree ssdf_body;
2697
2698           /* Set the line and file, so that it is obviously not from
2699              the source file.  */
2700           input_location = locus;
2701           ssdf_body = start_static_storage_duration_function (ssdf_count);
2702
2703           /* Make sure the back end knows about all the variables.  */
2704           write_out_vars (vars);
2705
2706           /* First generate code to do all the initializations.  */
2707           for (v = vars; v; v = TREE_CHAIN (v))
2708             do_static_initialization (TREE_VALUE (v),
2709                                       TREE_PURPOSE (v));
2710
2711           /* Then, generate code to do all the destructions.  Do these
2712              in reverse order so that the most recently constructed
2713              variable is the first destroyed.  If we're using
2714              __cxa_atexit, then we don't need to do this; functions
2715              were registered at initialization time to destroy the
2716              local statics.  */
2717           if (!flag_use_cxa_atexit)
2718             {
2719               vars = nreverse (vars);
2720               for (v = vars; v; v = TREE_CHAIN (v))
2721                 do_static_destruction (TREE_VALUE (v));
2722             }
2723           else
2724             vars = NULL_TREE;
2725
2726           /* Finish up the static storage duration function for this
2727              round.  */
2728           input_location = locus;
2729           finish_static_storage_duration_function (ssdf_body);
2730
2731           /* All those initializations and finalizations might cause
2732              us to need more inline functions, more template
2733              instantiations, etc.  */
2734           reconsider = true;
2735           ssdf_count++;
2736 #ifdef USE_MAPPED_LOCATION
2737           /* ??? */
2738 #else
2739           locus.line++;
2740 #endif
2741         }
2742       
2743       for (i = 0; i < deferred_fns_used; ++i)
2744         {
2745           tree decl = VARRAY_TREE (deferred_fns, i);
2746
2747           if (! DECL_DECLARED_INLINE_P (decl) || ! TREE_USED (decl))
2748             abort ();
2749
2750           /* Does it need synthesizing?  */
2751           if (DECL_ARTIFICIAL (decl) && ! DECL_INITIAL (decl)
2752               && TREE_USED (decl)
2753               && (! DECL_REALLY_EXTERN (decl) || DECL_INLINE (decl)))
2754             {
2755               /* Even though we're already at the top-level, we push
2756                  there again.  That way, when we pop back a few lines
2757                  hence, all of our state is restored.  Otherwise,
2758                  finish_function doesn't clean things up, and we end
2759                  up with CURRENT_FUNCTION_DECL set.  */
2760               push_to_top_level ();
2761               synthesize_method (decl);
2762               pop_from_top_level ();
2763               reconsider = true;
2764             }
2765
2766           if (!DECL_SAVED_TREE (decl))
2767             continue;
2768
2769           import_export_decl (decl);
2770
2771           /* We lie to the back-end, pretending that some functions
2772              are not defined when they really are.  This keeps these
2773              functions from being put out unnecessarily.  But, we must
2774              stop lying when the functions are referenced, or if they
2775              are not comdat since they need to be put out now.  This
2776              is done in a separate for cycle, because if some deferred
2777              function is contained in another deferred function later
2778              in deferred_fns varray, rest_of_compilation would skip
2779              this function and we really cannot expand the same
2780              function twice.  */
2781           if (DECL_NOT_REALLY_EXTERN (decl)
2782               && DECL_INITIAL (decl)
2783               && DECL_NEEDED_P (decl))
2784             DECL_EXTERNAL (decl) = 0;
2785
2786           /* If we're going to need to write this function out, and
2787              there's already a body for it, create RTL for it now.
2788              (There might be no body if this is a method we haven't
2789              gotten around to synthesizing yet.)  */
2790           if (!DECL_EXTERNAL (decl)
2791               && DECL_NEEDED_P (decl)
2792               && !TREE_ASM_WRITTEN (decl)
2793               && (!flag_unit_at_a_time 
2794                   || !cgraph_node (decl)->local.finalized))
2795             {
2796               /* We will output the function; no longer consider it in this
2797                  loop.  */
2798               DECL_DEFER_OUTPUT (decl) = 0;
2799               /* Generate RTL for this function now that we know we
2800                  need it.  */
2801               expand_or_defer_fn (decl);
2802               /* If we're compiling -fsyntax-only pretend that this
2803                  function has been written out so that we don't try to
2804                  expand it again.  */
2805               if (flag_syntax_only)
2806                 TREE_ASM_WRITTEN (decl) = 1;
2807               reconsider = true;
2808             }
2809         }
2810
2811       if (walk_namespaces (wrapup_globals_for_namespace, /*data=*/0))
2812         reconsider = true;
2813
2814       /* Static data members are just like namespace-scope globals.  */
2815       for (i = 0; i < pending_statics_used; ++i) 
2816         {
2817           tree decl = VARRAY_TREE (pending_statics, i);
2818           if (var_finalized_p (decl))
2819             continue;
2820           import_export_decl (decl);
2821           if (DECL_NOT_REALLY_EXTERN (decl) && ! DECL_IN_AGGR_P (decl))
2822             DECL_EXTERNAL (decl) = 0;
2823         }
2824       if (pending_statics
2825           && wrapup_global_declarations (&VARRAY_TREE (pending_statics, 0),
2826                                          pending_statics_used))
2827         reconsider = true;
2828
2829       if (cgraph_assemble_pending_functions ())
2830         reconsider = true;
2831     } 
2832   while (reconsider);
2833
2834   /* All used inline functions must have a definition at this point.  */
2835   for (i = 0; i < deferred_fns_used; ++i)
2836     {
2837       tree decl = VARRAY_TREE (deferred_fns, i);
2838
2839       if (!TREE_ASM_WRITTEN (decl) && !DECL_SAVED_TREE (decl)
2840           /* An explicit instantiation can be used to specify
2841              that the body is in another unit. It will have
2842              already verified there was a definition.  */
2843           && !DECL_EXPLICIT_INSTANTIATION (decl))
2844         {
2845           cp_warning_at ("inline function `%D' used but never defined", decl);
2846           /* This symbol is effectively an "extern" declaration now.
2847              This is not strictly necessary, but removes a duplicate
2848              warning.  */
2849           TREE_PUBLIC (decl) = 1;
2850         }
2851       
2852     }
2853   
2854   /* We give C linkage to static constructors and destructors.  */
2855   push_lang_context (lang_name_c);
2856
2857   /* Generate initialization and destruction functions for all
2858      priorities for which they are required.  */
2859   if (priority_info_map)
2860     splay_tree_foreach (priority_info_map, 
2861                         generate_ctor_and_dtor_functions_for_priority,
2862                         /*data=*/&locus);
2863   else
2864     {
2865       
2866       if (static_ctors)
2867         generate_ctor_or_dtor_function (/*constructor_p=*/true,
2868                                         DEFAULT_INIT_PRIORITY, &locus);
2869       if (static_dtors)
2870         generate_ctor_or_dtor_function (/*constructor_p=*/false,
2871                                         DEFAULT_INIT_PRIORITY, &locus);
2872     }
2873
2874   /* We're done with the splay-tree now.  */
2875   if (priority_info_map)
2876     splay_tree_delete (priority_info_map);
2877
2878   /* We're done with static constructors, so we can go back to "C++"
2879      linkage now.  */
2880   pop_lang_context ();
2881
2882   if (flag_unit_at_a_time)
2883     {
2884       cgraph_finalize_compilation_unit ();
2885       cgraph_optimize ();
2886     }
2887
2888   /* Emit mudflap static registration function.  This must be done
2889      after all the user functions have been expanded.  */
2890   if (flag_mudflap)
2891     mudflap_finish_file ();
2892
2893   /* Now, issue warnings about static, but not defined, functions,
2894      etc., and emit debugging information.  */
2895   walk_namespaces (wrapup_globals_for_namespace, /*data=*/&reconsider);
2896   if (pending_statics)
2897     check_global_declarations (&VARRAY_TREE (pending_statics, 0),
2898                                pending_statics_used);
2899
2900   finish_repo ();
2901
2902   /* The entire file is now complete.  If requested, dump everything
2903      to a file.  */
2904   {
2905     int flags;
2906     FILE *stream = dump_begin (TDI_tu, &flags);
2907
2908     if (stream)
2909       {
2910         dump_node (global_namespace, flags & ~TDF_SLIM, stream);
2911         dump_end (TDI_tu, stream);
2912       }
2913   }
2914   
2915   timevar_pop (TV_VARCONST);
2916
2917   if (flag_detailed_statistics)
2918     {
2919       dump_tree_statistics ();
2920       dump_time_statistics ();
2921     }
2922   input_location = locus;
2923
2924 #ifdef ENABLE_CHECKING
2925   validate_conversion_obstack ();
2926 #endif /* ENABLE_CHECKING */
2927 }
2928
2929 /* FN is an OFFSET_REF, DOTSTAR_EXPR or MEMBER_REF indicating the
2930    function to call in parse-tree form; it has not yet been
2931    semantically analyzed.  ARGS are the arguments to the function.
2932    They have already been semantically analyzed.  */
2933
2934 tree
2935 build_offset_ref_call_from_tree (tree fn, tree args)
2936 {
2937   tree orig_fn;
2938   tree orig_args;
2939   tree expr;
2940   tree object;
2941
2942   orig_fn = fn;
2943   orig_args = args;
2944   object = TREE_OPERAND (fn, 0);
2945
2946   if (processing_template_decl)
2947     {
2948       my_friendly_assert (TREE_CODE (fn) == DOTSTAR_EXPR
2949                           || TREE_CODE (fn) == MEMBER_REF,
2950                           20030708);
2951       if (type_dependent_expression_p (fn)
2952           || any_type_dependent_arguments_p (args))
2953         return build_min_nt (CALL_EXPR, fn, args, NULL_TREE);
2954
2955       /* Transform the arguments and add the implicit "this"
2956          parameter.  That must be done before the FN is transformed
2957          because we depend on the form of FN.  */
2958       args = build_non_dependent_args (args);
2959       if (TREE_CODE (fn) == DOTSTAR_EXPR)
2960         object = build_unary_op (ADDR_EXPR, object, 0);
2961       object = build_non_dependent_expr (object);
2962       args = tree_cons (NULL_TREE, object, args);
2963       /* Now that the arguments are done, transform FN.  */
2964       fn = build_non_dependent_expr (fn);
2965     }
2966
2967   /* A qualified name corresponding to a bound pointer-to-member is
2968      represented as an OFFSET_REF:
2969
2970         struct B { void g(); };
2971         void (B::*p)();
2972         void B::g() { (this->*p)(); }  */
2973   if (TREE_CODE (fn) == OFFSET_REF)
2974     {
2975       tree object_addr = build_unary_op (ADDR_EXPR, object, 0);
2976       fn = TREE_OPERAND (fn, 1);
2977       fn = get_member_function_from_ptrfunc (&object_addr, fn);
2978       args = tree_cons (NULL_TREE, object_addr, args);
2979     }
2980
2981   expr = build_function_call (fn, args);
2982   if (processing_template_decl && expr != error_mark_node)
2983     return build_min_non_dep (CALL_EXPR, expr, orig_fn, orig_args, NULL_TREE);
2984   return expr;
2985 }
2986   
2987
2988 void
2989 check_default_args (tree x)
2990 {
2991   tree arg = TYPE_ARG_TYPES (TREE_TYPE (x));
2992   bool saw_def = false;
2993   int i = 0 - (TREE_CODE (TREE_TYPE (x)) == METHOD_TYPE);
2994   for (; arg && arg != void_list_node; arg = TREE_CHAIN (arg), ++i)
2995     {
2996       if (TREE_PURPOSE (arg))
2997         saw_def = true;
2998       else if (saw_def)
2999         {
3000           cp_error_at ("default argument missing for parameter %P of `%+#D'",
3001                        i, x);
3002           break;
3003         }
3004     }
3005 }
3006
3007 void
3008 mark_used (tree decl)
3009 {
3010   TREE_USED (decl) = 1;
3011   if (processing_template_decl || skip_evaluation)
3012     return;
3013
3014   if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)
3015       && !TREE_ASM_WRITTEN (decl))
3016     /* Remember it, so we can check it was defined.  */
3017     {
3018       if (DECL_DEFERRED_FN (decl))
3019         return;
3020       DECL_DEFERRED_FN (decl) = 1;
3021       DECL_DEFER_OUTPUT (decl) = 1;
3022       if (!deferred_fns)
3023         VARRAY_TREE_INIT (deferred_fns, 32, "deferred_fns");
3024       
3025       VARRAY_PUSH_TREE (deferred_fns, decl);
3026     }
3027   
3028   assemble_external (decl);
3029
3030   /* Is it a synthesized method that needs to be synthesized?  */
3031   if (TREE_CODE (decl) == FUNCTION_DECL
3032       && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
3033       && DECL_ARTIFICIAL (decl) 
3034       && !DECL_THUNK_P (decl)
3035       && ! DECL_INITIAL (decl)
3036       /* Kludge: don't synthesize for default args.  */
3037       && current_function_decl)
3038     {
3039       synthesize_method (decl);
3040       /* If we've already synthesized the method we don't need to
3041          instantiate it, so we can return right away.  */
3042       return;
3043     }
3044
3045   /* If this is a function or variable that is an instance of some
3046      template, we now know that we will need to actually do the
3047      instantiation. We check that DECL is not an explicit
3048      instantiation because that is not checked in instantiate_decl.  */
3049   if ((DECL_NON_THUNK_FUNCTION_P (decl) || TREE_CODE (decl) == VAR_DECL)
3050       && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)
3051       && (!DECL_EXPLICIT_INSTANTIATION (decl)
3052           || (TREE_CODE (decl) == FUNCTION_DECL 
3053               && DECL_INLINE (DECL_TEMPLATE_RESULT 
3054                               (template_for_substitution (decl))))))
3055     {
3056       bool defer;
3057
3058       /* Normally, we put off instantiating functions in order to
3059          improve compile times.  Maintaining a stack of active
3060          functions is expensive, and the inliner knows to
3061          instantiate any functions it might need.
3062
3063          However, if instantiating this function might help us mark
3064          the current function TREE_NOTHROW, we go ahead and
3065          instantiate it now.  
3066          
3067          This is not needed for unit-at-a-time since we reorder the functions
3068          in topological order anyway.
3069          */
3070       defer = (!flag_exceptions
3071                || flag_unit_at_a_time
3072                || !optimize
3073                || TREE_CODE (decl) != FUNCTION_DECL
3074                /* If the called function can't throw, we don't need to
3075                   generate its body to find that out.  */
3076                || TREE_NOTHROW (decl)
3077                || !cfun
3078                || !current_function_decl
3079                /* If we already know the current function can't throw,
3080                   then we don't need to work hard to prove it.  */
3081                || TREE_NOTHROW (current_function_decl)
3082                /* If we already know that the current function *can*
3083                   throw, there's no point in gathering more
3084                   information.  */
3085                || cp_function_chain->can_throw);
3086
3087       instantiate_decl (decl, defer, /*undefined_ok=*/0);
3088     }
3089 }
3090
3091 #include "gt-cp-decl2.h"