Will bring over with next merge.
[platform/upstream/gcc.git] / gcc / cp / decl.c
1 /* Process declarations and variables for C compiler.
2    Copyright (C) 1988, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
3    Hacked by Michael Tiemann (tiemann@cygnus.com)
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22
23 /* Process declarations and symbol lookup for C front end.
24    Also constructs types; the standard scalar types at initialization,
25    and structure, union, array and enum types when they are declared.  */
26
27 /* ??? not all decl nodes are given the most useful possible
28    line numbers.  For example, the CONST_DECLs for enum values.  */
29
30 #include <stdio.h>
31 #include "config.h"
32 #include "tree.h"
33 #include "rtl.h"
34 #include "flags.h"
35 #include "cp-tree.h"
36 #include "decl.h"
37 #include "lex.h"
38 #include <sys/types.h>
39 #include <signal.h>
40 #include "obstack.h"
41
42 #define obstack_chunk_alloc xmalloc
43 #define obstack_chunk_free free
44
45 extern tree builtin_return_address_fndecl;
46
47 extern struct obstack permanent_obstack;
48
49 extern int current_class_depth;
50
51 extern tree cleanups_this_call;
52
53 extern tree static_ctors, static_dtors;
54
55 /* Stack of places to restore the search obstack back to.  */
56    
57 /* Obstack used for remembering local class declarations (like
58    enums and static (const) members.  */
59 #include "stack.h"
60 static struct obstack decl_obstack;
61 static struct stack_level *decl_stack;
62
63 #ifndef CHAR_TYPE_SIZE
64 #define CHAR_TYPE_SIZE BITS_PER_UNIT
65 #endif
66
67 #ifndef SHORT_TYPE_SIZE
68 #define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2))
69 #endif
70
71 #ifndef INT_TYPE_SIZE
72 #define INT_TYPE_SIZE BITS_PER_WORD
73 #endif
74
75 #ifndef LONG_TYPE_SIZE
76 #define LONG_TYPE_SIZE BITS_PER_WORD
77 #endif
78
79 #ifndef LONG_LONG_TYPE_SIZE
80 #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
81 #endif
82
83 #ifndef WCHAR_UNSIGNED
84 #define WCHAR_UNSIGNED 0
85 #endif
86
87 #ifndef FLOAT_TYPE_SIZE
88 #define FLOAT_TYPE_SIZE BITS_PER_WORD
89 #endif
90
91 #ifndef DOUBLE_TYPE_SIZE
92 #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
93 #endif
94
95 #ifndef LONG_DOUBLE_TYPE_SIZE
96 #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
97 #endif
98
99 #ifndef BOOL_TYPE_SIZE
100 #ifdef SLOW_BYTE_ACCESS
101 #define BOOL_TYPE_SIZE BITS_PER_WORD
102 #else
103 #define BOOL_TYPE_SIZE BITS_PER_UNIT
104 #endif
105 #endif
106
107 /* We let tm.h override the types used here, to handle trivial differences
108    such as the choice of unsigned int or long unsigned int for size_t.
109    When machines start needing nontrivial differences in the size type,
110    it would be best to do something here to figure out automatically
111    from other information what type to use.  */
112
113 #ifndef SIZE_TYPE
114 #define SIZE_TYPE "long unsigned int"
115 #endif
116
117 #ifndef PTRDIFF_TYPE
118 #define PTRDIFF_TYPE "long int"
119 #endif
120
121 #ifndef WCHAR_TYPE
122 #define WCHAR_TYPE "int"
123 #endif
124
125 static tree grokparms                           PROTO((tree, int));
126 static tree lookup_nested_type                  PROTO((tree, tree));
127 static char *redeclaration_error_message        PROTO((tree, tree));
128 static void grok_op_properties                  PROTO((tree, int, int));
129
130 tree define_function            
131         PROTO((char *, tree, enum built_in_function, void (*)(), char *));
132
133 /* a node which has tree code ERROR_MARK, and whose type is itself.
134    All erroneous expressions are replaced with this node.  All functions
135    that accept nodes as arguments should avoid generating error messages
136    if this node is one of the arguments, since it is undesirable to get
137    multiple error messages from one error in the input.  */
138
139 tree error_mark_node;
140
141 /* Erroneous argument lists can use this *IFF* they do not modify it.  */
142 tree error_mark_list;
143
144 /* INTEGER_TYPE and REAL_TYPE nodes for the standard data types */
145
146 tree short_integer_type_node;
147 tree integer_type_node;
148 tree long_integer_type_node;
149 tree long_long_integer_type_node;
150
151 tree short_unsigned_type_node;
152 tree unsigned_type_node;
153 tree long_unsigned_type_node;
154 tree long_long_unsigned_type_node;
155
156 tree ptrdiff_type_node;
157
158 tree unsigned_char_type_node;
159 tree signed_char_type_node;
160 tree char_type_node;
161 tree wchar_type_node;
162 tree signed_wchar_type_node;
163 tree unsigned_wchar_type_node;
164
165 tree wchar_decl_node;
166
167 tree float_type_node;
168 tree double_type_node;
169 tree long_double_type_node;
170
171 tree intQI_type_node;
172 tree intHI_type_node;
173 tree intSI_type_node;
174 tree intDI_type_node;
175
176 tree unsigned_intQI_type_node;
177 tree unsigned_intHI_type_node;
178 tree unsigned_intSI_type_node;
179 tree unsigned_intDI_type_node;
180
181 /* a VOID_TYPE node, and the same, packaged in a TREE_LIST.  */
182
183 tree void_type_node, void_list_node;
184 tree void_zero_node;
185
186 /* Nodes for types `void *' and `const void *'.  */
187
188 tree ptr_type_node, const_ptr_type_node;
189
190 /* Nodes for types `char *' and `const char *'.  */
191
192 tree string_type_node, const_string_type_node;
193
194 /* Type `char[256]' or something like it.
195    Used when an array of char is needed and the size is irrelevant.  */
196
197 tree char_array_type_node;
198
199 /* Type `int[256]' or something like it.
200    Used when an array of int needed and the size is irrelevant.  */
201
202 tree int_array_type_node;
203
204 /* Type `wchar_t[256]' or something like it.
205    Used when a wide string literal is created.  */
206
207 tree wchar_array_type_node;
208
209 /* The bool data type, and constants */
210 tree boolean_type_node, boolean_true_node, boolean_false_node;
211
212 /* type `int ()' -- used for implicit declaration of functions.  */
213
214 tree default_function_type;
215
216 /* function types `double (double)' and `double (double, double)', etc.  */
217
218 tree double_ftype_double, double_ftype_double_double;
219 tree int_ftype_int, long_ftype_long;
220
221 /* Function type `void (void *, void *, int)' and similar ones.  */
222
223 tree void_ftype_ptr_ptr_int, int_ftype_ptr_ptr_int, void_ftype_ptr_int_int;
224
225 /* Function type `char *(char *, char *)' and similar ones */
226 tree string_ftype_ptr_ptr, int_ftype_string_string;
227
228 /* Function type `size_t (const char *)' */
229 tree sizet_ftype_string;
230
231 /* Function type `int (const void *, const void *, size_t)' */
232 tree int_ftype_cptr_cptr_sizet;
233
234 /* C++ extensions */
235 tree vtable_entry_type;
236 tree delta_type_node;
237 #if 0
238 /* Old rtti stuff. */
239 tree __baselist_desc_type_node;
240 tree __i_desc_type_node, __m_desc_type_node;
241 tree __t_desc_array_type, __i_desc_array_type, __m_desc_array_type;
242 #endif
243 tree __t_desc_type_node, __tp_desc_type_node;
244 tree __access_mode_type_node;
245 tree __bltn_desc_type_node, __user_desc_type_node, __class_desc_type_node;
246 tree __ptr_desc_type_node, __attr_desc_type_node, __func_desc_type_node;
247 tree __ptmf_desc_type_node, __ptmd_desc_type_node;
248 #if 0
249 /* Not needed yet?  May be needed one day?  */
250 tree __bltn_desc_array_type, __user_desc_array_type, __class_desc_array_type;
251 tree __ptr_desc_array_type, __attr_dec_array_type, __func_desc_array_type;
252 tree __ptmf_desc_array_type, __ptmd_desc_array_type;
253 #endif
254
255 tree class_star_type_node;
256 tree class_type_node, record_type_node, union_type_node, enum_type_node;
257 tree unknown_type_node;
258 tree opaque_type_node, signature_type_node;
259 tree sigtable_entry_type;
260 tree maybe_gc_cleanup;
261
262 /* Array type `vtable_entry_type[]' */
263 tree vtbl_type_node;
264
265 /* In a destructor, the point at which all derived class destroying
266    has been done, just before any base class destroying will be done.  */
267
268 tree dtor_label;
269
270 /* In a constructor, the point at which we are ready to return
271    the pointer to the initialized object.  */
272
273 tree ctor_label;
274
275 /* A FUNCTION_DECL which can call `abort'.  Not necessarily the
276    one that the user will declare, but sufficient to be called
277    by routines that want to abort the program.  */
278
279 tree abort_fndecl;
280
281 extern rtx cleanup_label, return_label;
282
283 /* If original DECL_RESULT of current function was a register,
284    but due to being an addressable named return value, would up
285    on the stack, this variable holds the named return value's
286    original location.  */
287 rtx original_result_rtx;
288
289 /* Sequence of insns which represents base initialization.  */
290 tree base_init_expr;
291
292 /* C++: Keep these around to reduce calls to `get_identifier'.
293    Identifiers for `this' in member functions and the auto-delete
294    parameter for destructors.  */
295 tree this_identifier, in_charge_identifier;
296 /* Used in pointer to member functions, and in vtables. */
297 tree pfn_identifier, index_identifier, delta_identifier, delta2_identifier;
298 tree pfn_or_delta2_identifier;
299
300 /* A list (chain of TREE_LIST nodes) of named label uses.
301    The TREE_PURPOSE field is the list of variables defined
302    the the label's scope defined at the point of use.
303    The TREE_VALUE field is the LABEL_DECL used.
304    The TREE_TYPE field holds `current_binding_level' at the
305    point of the label's use.
306
307    Used only for jumps to as-yet undefined labels, since
308    jumps to defined labels can have their validity checked
309    by stmt.c.  */
310
311 static tree named_label_uses;
312
313 /* A list of objects which have constructors or destructors
314    which reside in the global scope.  The decl is stored in
315    the TREE_VALUE slot and the initializer is stored
316    in the TREE_PURPOSE slot.  */
317 tree static_aggregates;
318
319 /* -- end of C++ */
320
321 /* Two expressions that are constants with value zero.
322    The first is of type `int', the second of type `void *'.  */
323
324 tree integer_zero_node;
325 tree null_pointer_node;
326
327 /* A node for the integer constants 1, 2, and 3.  */
328
329 tree integer_one_node, integer_two_node, integer_three_node;
330
331 /* Nonzero if we have seen an invalid cross reference
332    to a struct, union, or enum, but not yet printed the message.  */
333
334 tree pending_invalid_xref;
335 /* File and line to appear in the eventual error message.  */
336 char *pending_invalid_xref_file;
337 int pending_invalid_xref_line;
338
339 /* While defining an enum type, this is 1 plus the last enumerator
340    constant value.  */
341
342 static tree enum_next_value;
343
344 /* Nonzero means that there was overflow computing enum_next_value.  */
345
346 static int enum_overflow;
347
348 /* Parsing a function declarator leaves a list of parameter names
349    or a chain or parameter decls here.  */
350
351 tree last_function_parms;
352
353 /* Parsing a function declarator leaves here a chain of structure
354    and enum types declared in the parmlist.  */
355
356 static tree last_function_parm_tags;
357
358 /* After parsing the declarator that starts a function definition,
359    `start_function' puts here the list of parameter names or chain of decls.
360    `store_parm_decls' finds it here.  */
361
362 static tree current_function_parms;
363
364 /* Similar, for last_function_parm_tags.  */
365 static tree current_function_parm_tags;
366
367 /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
368    that have names.  Here so we can clear out their names' definitions
369    at the end of the function.  */
370
371 static tree named_labels;
372
373 /* A list of LABEL_DECLs from outer contexts that are currently shadowed.  */
374
375 static tree shadowed_labels;
376
377 #if 0 /* Not needed by C++ */
378 /* Nonzero when store_parm_decls is called indicates a varargs function.
379    Value not meaningful after store_parm_decls.  */
380
381 static int c_function_varargs;
382 #endif
383
384 /* The FUNCTION_DECL for the function currently being compiled,
385    or 0 if between functions.  */
386 tree current_function_decl;
387
388 /* Set to 0 at beginning of a function definition, set to 1 if
389    a return statement that specifies a return value is seen.  */
390
391 int current_function_returns_value;
392
393 /* Set to 0 at beginning of a function definition, set to 1 if
394    a return statement with no argument is seen.  */
395
396 int current_function_returns_null;
397
398 /* Set to 0 at beginning of a function definition, and whenever
399    a label (case or named) is defined.  Set to value of expression
400    returned from function when that value can be transformed into
401    a named return value.  */
402
403 tree current_function_return_value;
404
405 /* Set to nonzero by `grokdeclarator' for a function
406    whose return type is defaulted, if warnings for this are desired.  */
407
408 static int warn_about_return_type;
409
410 /* Nonzero means give `double' the same size as `float'.  */
411
412 extern int flag_short_double;
413
414 /* Nonzero means don't recognize any builtin functions.  */
415
416 extern int flag_no_builtin;
417
418 /* Nonzero means don't recognize the non-ANSI builtin functions.
419    -ansi sets this.  */
420
421 extern int flag_no_nonansi_builtin;
422
423 /* Nonzero means enable obscure ANSI features and disable GNU extensions
424    that might cause ANSI-compliant code to be miscompiled.  */
425
426 extern int flag_ansi;
427
428 /* Nonzero if we want to support huge (> 2^(sizeof(short)*8-1) bytes)
429    objects. */
430 extern int flag_huge_objects;
431
432 /* Nonzero if we want to conserve space in the .o files.  We do this
433    by putting uninitialized data and runtime initialized data into
434    .common instead of .data at the expense of not flagging multiple
435    definitions.  */
436 extern int flag_conserve_space;
437
438 /* Pointers to the base and current top of the language name stack.  */
439
440 extern tree *current_lang_base, *current_lang_stack;
441 \f
442 /* C and C++ flags are in decl2.c.  */
443
444 /* Set to 0 at beginning of a constructor, set to 1
445    if that function does an allocation before referencing its
446    instance variable.  */
447 int current_function_assigns_this;
448 int current_function_just_assigned_this;
449
450 /* Set to 0 at beginning of a function.  Set non-zero when
451    store_parm_decls is called.  Don't call store_parm_decls
452    if this flag is non-zero!  */
453 int current_function_parms_stored;
454
455 /* Current end of entries in the gc obstack for stack pointer variables.  */
456
457 int current_function_obstack_index;
458
459 /* Flag saying whether we have used the obstack in this function or not.  */
460
461 int current_function_obstack_usage;
462
463 /* Flag used when debugging spew.c */
464
465 extern int spew_debug;
466
467 /* This is a copy of the class_shadowed list of the previous class binding
468    contour when at global scope.  It's used to reset IDENTIFIER_CLASS_VALUEs
469    when entering another class scope (i.e. a cache miss).  */
470 extern tree previous_class_values;
471
472 \f
473 /* Allocate a level of searching.  */
474 struct stack_level *
475 push_decl_level (stack, obstack)
476      struct stack_level *stack;
477      struct obstack *obstack;
478 {
479   struct stack_level tem;
480   tem.prev = stack;
481
482   return push_stack_level (obstack, (char *)&tem, sizeof (tem));
483 }
484 \f
485 /* For each binding contour we allocate a binding_level structure
486  * which records the names defined in that contour.
487  * Contours include:
488  *  0) the global one
489  *  1) one for each function definition,
490  *     where internal declarations of the parameters appear.
491  *  2) one for each compound statement,
492  *     to record its declarations.
493  *
494  * The current meaning of a name can be found by searching the levels from
495  * the current one out to the global one.
496  *
497  * Off to the side, may be the class_binding_level.  This exists
498  * only to catch class-local declarations.  It is otherwise
499  * nonexistent.
500  * 
501  * Also there may be binding levels that catch cleanups that
502  * must be run when exceptions occur.
503  */
504
505 /* Note that the information in the `names' component of the global contour
506    is duplicated in the IDENTIFIER_GLOBAL_VALUEs of all identifiers.  */
507
508 struct binding_level
509   {
510     /* A chain of _DECL nodes for all variables, constants, functions,
511      * and typedef types.  These are in the reverse of the order supplied.
512      */
513     tree names;
514
515     /* A list of structure, union and enum definitions,
516      * for looking up tag names.
517      * It is a chain of TREE_LIST nodes, each of whose TREE_PURPOSE is a name,
518      * or NULL_TREE; and whose TREE_VALUE is a RECORD_TYPE, UNION_TYPE,
519      * or ENUMERAL_TYPE node.
520      *
521      * C++: the TREE_VALUE nodes can be simple types for component_bindings.
522      *
523      */
524     tree tags;
525
526     /* For each level, a list of shadowed outer-level local definitions
527        to be restored when this level is popped.
528        Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and
529        whose TREE_VALUE is its old definition (a kind of ..._DECL node).  */
530     tree shadowed;
531
532     /* Same, for IDENTIFIER_CLASS_VALUE.  */
533     tree class_shadowed;
534
535     /* Same, for IDENTIFIER_TYPE_VALUE.  */
536     tree type_shadowed;
537
538     /* For each level (except not the global one),
539        a chain of BLOCK nodes for all the levels
540        that were entered and exited one level down.  */
541     tree blocks;
542
543     /* The BLOCK node for this level, if one has been preallocated.
544        If 0, the BLOCK is allocated (if needed) when the level is popped.  */
545     tree this_block;
546
547     /* The binding level which this one is contained in (inherits from).  */
548     struct binding_level *level_chain;
549
550     /* Number of decls in `names' that have incomplete 
551        structure or union types.  */
552     unsigned int n_incomplete;
553
554     /* 1 for the level that holds the parameters of a function.
555        2 for the level that holds a class declaration.
556        3 for levels that hold parameter declarations.  */
557     unsigned parm_flag : 4;
558
559     /* 1 means make a BLOCK for this level regardless of all else.
560        2 for temporary binding contours created by the compiler.  */
561     unsigned keep : 3;
562
563     /* Nonzero if this level "doesn't exist" for tags.  */
564     unsigned tag_transparent : 1;
565
566     /* Nonzero if this level can safely have additional
567        cleanup-needing variables added to it.  */
568     unsigned more_cleanups_ok : 1;
569     unsigned have_cleanups : 1;
570
571     /* Nonzero if we should accept any name as an identifier in
572        this scope.  This happens in some template definitions.  */
573     unsigned accept_any : 1;
574
575     /* Nonzero if this level is for completing a template class definition
576        inside a binding level that temporarily binds the parameters.  This
577        means that definitions here should not be popped off when unwinding
578        this binding level.  (Not actually implemented this way,
579        unfortunately.)  */
580     unsigned pseudo_global : 1;
581
582     /* This is set for a namespace binding level.  */
583     unsigned namespace_p : 1;
584
585     /* One bit left for this word.  */
586
587 #if defined(DEBUG_CP_BINDING_LEVELS)
588     /* Binding depth at which this level began.  */
589     unsigned binding_depth;
590 #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
591   };
592
593 #define NULL_BINDING_LEVEL ((struct binding_level *) NULL)
594   
595 /* The (non-class) binding level currently in effect.  */
596
597 static struct binding_level *current_binding_level;
598
599 /* The binding level of the current class, if any.  */
600
601 static struct binding_level *class_binding_level;
602
603 /* The current (class or non-class) binding level currently in effect.  */
604
605 #define inner_binding_level \
606   (class_binding_level ? class_binding_level : current_binding_level)
607
608 /* A chain of binding_level structures awaiting reuse.  */
609
610 static struct binding_level *free_binding_level;
611
612 /* The outermost binding level, for names of file scope.
613    This is created when the compiler is started and exists
614    through the entire run.  */
615
616 static struct binding_level *global_binding_level;
617
618 /* Binding level structures are initialized by copying this one.  */
619
620 static struct binding_level clear_binding_level;
621
622 /* Nonzero means unconditionally make a BLOCK for the next level pushed.  */
623
624 static int keep_next_level_flag;
625
626 #if defined(DEBUG_CP_BINDING_LEVELS)
627 static int binding_depth = 0;
628 static int is_class_level = 0;
629
630 static void
631 indent ()
632 {
633   register unsigned i;
634
635   for (i = 0; i < binding_depth*2; i++)
636     putc (' ', stderr);
637 }
638 #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
639
640 static tree pushdecl_with_scope PROTO((tree, struct binding_level *));
641
642 static void
643 push_binding_level (newlevel, tag_transparent, keep)
644      struct binding_level *newlevel;
645      int tag_transparent, keep;
646 {
647   /* Add this level to the front of the chain (stack) of levels that
648      are active.  */
649   *newlevel = clear_binding_level;
650   if (class_binding_level)
651     {
652       newlevel->level_chain = class_binding_level;
653       class_binding_level = (struct binding_level *)0;
654     }
655   else
656     {
657       newlevel->level_chain = current_binding_level;
658     }
659   current_binding_level = newlevel;
660   newlevel->tag_transparent = tag_transparent;
661   newlevel->more_cleanups_ok = 1;
662   newlevel->keep = keep;
663 #if defined(DEBUG_CP_BINDING_LEVELS)
664   newlevel->binding_depth = binding_depth;
665   indent ();
666   fprintf (stderr, "push %s level 0x%08x line %d\n",
667            (is_class_level) ? "class" : "block", newlevel, lineno);
668   is_class_level = 0;
669   binding_depth++;
670 #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
671 }
672
673 static void
674 pop_binding_level ()
675 {
676   if (class_binding_level)
677     current_binding_level = class_binding_level;
678
679   if (global_binding_level)
680     {
681       /* cannot pop a level, if there are none left to pop. */
682       if (current_binding_level == global_binding_level)
683         my_friendly_abort (123);
684     }
685   /* Pop the current level, and free the structure for reuse.  */
686 #if defined(DEBUG_CP_BINDING_LEVELS)
687   binding_depth--;
688   indent ();
689   fprintf (stderr, "pop  %s level 0x%08x line %d\n",
690           (is_class_level) ? "class" : "block",
691           current_binding_level, lineno);
692   if (is_class_level != (current_binding_level == class_binding_level))
693 #if 0 /* XXX Don't abort when we're watching how things are being managed.  */
694     abort ();
695 #else
696   {
697     indent ();
698     fprintf (stderr, "XXX is_class_level != (current_binding_level == class_binding_level)\n");
699   }
700 #endif
701   is_class_level = 0;
702 #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
703   {
704     register struct binding_level *level = current_binding_level;
705     current_binding_level = current_binding_level->level_chain;
706     level->level_chain = free_binding_level;
707 #if 0 /* defined(DEBUG_CP_BINDING_LEVELS) */
708     if (level->binding_depth != binding_depth)
709       abort ();
710 #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
711       free_binding_level = level;
712
713     class_binding_level = current_binding_level;
714     if (class_binding_level->parm_flag != 2)
715       class_binding_level = 0;
716     while (current_binding_level->parm_flag == 2)
717       current_binding_level = current_binding_level->level_chain;
718   }
719 }
720
721 static void
722 suspend_binding_level ()
723 {
724   if (class_binding_level)
725     current_binding_level = class_binding_level;
726
727   if (global_binding_level)
728     {
729       /* cannot suspend a level, if there are none left to suspend. */
730       if (current_binding_level == global_binding_level)
731         my_friendly_abort (123);
732     }
733   /* Suspend the current level.  */
734 #if defined(DEBUG_CP_BINDING_LEVELS)
735   binding_depth--;
736   indent ();
737   fprintf (stderr, "suspend  %s level 0x%08x line %d\n",
738           (is_class_level) ? "class" : "block",
739           current_binding_level, lineno);
740   if (is_class_level != (current_binding_level == class_binding_level))
741 #if 0 /* XXX Don't abort when we're watching how things are being managed.  */
742     abort ();
743 #else
744   {
745     indent ();
746     fprintf (stderr, "XXX is_class_level != (current_binding_level == class_binding_level)\n");
747   }
748 #endif
749   is_class_level = 0;
750 #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
751   {
752     register struct binding_level *level = current_binding_level;
753     current_binding_level = current_binding_level->level_chain;
754 #if 0 /* defined(DEBUG_CP_BINDING_LEVELS) */
755     if (level->binding_depth != binding_depth)
756       abort ();
757 #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
758
759     class_binding_level = current_binding_level;
760     if (class_binding_level->parm_flag != 2)
761       class_binding_level = 0;
762     while (current_binding_level->parm_flag == 2)
763       current_binding_level = current_binding_level->level_chain;
764   }
765 }
766
767 void
768 resume_binding_level (b)
769      struct binding_level *b;
770 {
771   if (class_binding_level)
772     {
773 #if 1
774       /* These are here because we cannot deal with shadows yet. */
775       sorry ("cannot resume a namespace inside class");
776       return;
777 #else
778       b->level_chain = class_binding_level;
779       class_binding_level = (struct binding_level *)0;
780 #endif
781     }
782   else
783     {
784 #if 1
785       /* These are here because we cannot deal with shadows yet. */
786       if (b->level_chain != current_binding_level)
787         {
788           sorry ("cannot resume a namespace inside a different namespace");
789           return;
790         }
791 #endif
792       b->level_chain = current_binding_level;
793     }
794   current_binding_level = b;
795 #if defined(DEBUG_CP_BINDING_LEVELS)
796   b->binding_depth = binding_depth;
797   indent ();
798   fprintf (stderr, "resume %s level 0x%08x line %d\n",
799            (is_class_level) ? "class" : "block", b, lineno);
800   is_class_level = 0;
801   binding_depth++;
802 #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
803 }
804 \f
805 /* Nonzero if we are currently in the global binding level.  */
806
807 int
808 global_bindings_p ()
809 {
810   return current_binding_level == global_binding_level;
811 }
812
813 /* Nonzero if we are currently in a toplevel binding level.  This
814    means either the global binding level or a namespace in a toplevel
815    binding level.  */
816
817 int
818 toplevel_bindings_p ()
819 {
820   struct binding_level *b = current_binding_level;
821
822   while (1)
823     {
824       if (b == global_binding_level)
825         return 1;
826       if (! b->namespace_p)
827         return 0;
828       b=b->level_chain;
829     }
830 }
831
832 /* Nonzero if this is a namespace scope.  */
833
834 int
835 namespace_bindings_p ()
836 {
837   return current_binding_level->namespace_p;
838 }
839
840 void
841 keep_next_level ()
842 {
843   keep_next_level_flag = 1;
844 }
845
846 /* Nonzero if the current level needs to have a BLOCK made.  */
847
848 int
849 kept_level_p ()
850 {
851   return (current_binding_level->blocks != NULL_TREE
852           || current_binding_level->keep
853           || current_binding_level->names != NULL_TREE
854           || (current_binding_level->tags != NULL_TREE
855               && !current_binding_level->tag_transparent));
856 }
857
858 /* Identify this binding level as a level of parameters.  */
859
860 void
861 declare_parm_level ()
862 {
863   current_binding_level->parm_flag = 1;
864 }
865
866 void
867 declare_uninstantiated_type_level ()
868 {
869   current_binding_level->accept_any = 1;
870 }
871
872 int
873 uninstantiated_type_level_p ()
874 {
875   return current_binding_level->accept_any;
876 }
877
878 void
879 declare_pseudo_global_level ()
880 {
881   current_binding_level->pseudo_global = 1;
882 }
883
884 void
885 declare_namespace_level ()
886 {
887   current_binding_level->namespace_p = 1;
888 }
889
890 int
891 pseudo_global_level_p ()
892 {
893   return current_binding_level->pseudo_global;
894 }
895
896 void
897 set_class_shadows (shadows)
898      tree shadows;
899 {
900   class_binding_level->class_shadowed = shadows;
901 }
902
903 /* Enter a new binding level.
904    If TAG_TRANSPARENT is nonzero, do so only for the name space of variables,
905    not for that of tags.  */
906
907 void
908 pushlevel (tag_transparent)
909      int tag_transparent;
910 {
911   register struct binding_level *newlevel = NULL_BINDING_LEVEL;
912
913   /* If this is the top level of a function,
914      just make sure that NAMED_LABELS is 0.
915      They should have been set to 0 at the end of the previous function.  */
916
917   if (current_binding_level == global_binding_level)
918     my_friendly_assert (named_labels == NULL_TREE, 134);
919
920   /* Reuse or create a struct for this binding level.  */
921
922 #if defined(DEBUG_CP_BINDING_LEVELS)
923   if (0)
924 #else /* !defined(DEBUG_CP_BINDING_LEVELS) */
925   if (free_binding_level)
926 #endif /* !defined(DEBUG_CP_BINDING_LEVELS) */
927     {
928       newlevel = free_binding_level;
929       free_binding_level = free_binding_level->level_chain;
930     }
931   else
932     {
933       /* Create a new `struct binding_level'.  */
934       newlevel = (struct binding_level *) xmalloc (sizeof (struct binding_level));
935     }
936   push_binding_level (newlevel, tag_transparent, keep_next_level_flag);
937   GNU_xref_start_scope ((HOST_WIDE_INT) newlevel);
938   keep_next_level_flag = 0;
939 }
940
941 void
942 pushlevel_temporary (tag_transparent)
943      int tag_transparent;
944 {
945   pushlevel (tag_transparent);
946   current_binding_level->keep = 2;
947   clear_last_expr ();
948
949   /* Note we don't call push_momentary() here.  Otherwise, it would cause
950      cleanups to be allocated on the momentary obstack, and they will be
951      overwritten by the next statement.  */
952
953   expand_start_bindings (0);
954 }
955
956 /* Exit a binding level.
957    Pop the level off, and restore the state of the identifier-decl mappings
958    that were in effect when this level was entered.
959
960    If KEEP == 1, this level had explicit declarations, so
961    and create a "block" (a BLOCK node) for the level
962    to record its declarations and subblocks for symbol table output.
963
964    If KEEP == 2, this level's subblocks go to the front,
965    not the back of the current binding level.  This happens,
966    for instance, when code for constructors and destructors
967    need to generate code at the end of a function which must
968    be moved up to the front of the function.
969
970    If FUNCTIONBODY is nonzero, this level is the body of a function,
971    so create a block as if KEEP were set and also clear out all
972    label names.
973
974    If REVERSE is nonzero, reverse the order of decls before putting
975    them into the BLOCK.  */
976
977 tree
978 poplevel (keep, reverse, functionbody)
979      int keep;
980      int reverse;
981      int functionbody;
982 {
983   register tree link;
984   /* The chain of decls was accumulated in reverse order.
985      Put it into forward order, just for cleanliness.  */
986   tree decls;
987   int tmp = functionbody;
988   int implicit_try_block = current_binding_level->parm_flag == 3;
989   int real_functionbody = current_binding_level->keep == 2
990     ? ((functionbody = 0), tmp) : functionbody;
991   tree tags = functionbody >= 0 ? current_binding_level->tags : 0;
992   tree subblocks = functionbody >= 0 ? current_binding_level->blocks : 0;
993   tree block = NULL_TREE;
994   tree decl;
995   int block_previously_created;
996
997   GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level,
998                       (HOST_WIDE_INT) current_binding_level->level_chain,
999                       current_binding_level->parm_flag,
1000                       current_binding_level->keep,
1001                       current_binding_level->tag_transparent);
1002
1003   if (current_binding_level->keep == 1)
1004     keep = 1;
1005
1006   /* This warning is turned off because it causes warnings for
1007      declarations like `extern struct foo *x'.  */
1008 #if 0
1009   /* Warn about incomplete structure types in this level.  */
1010   for (link = tags; link; link = TREE_CHAIN (link))
1011     if (TYPE_SIZE (TREE_VALUE (link)) == NULL_TREE)
1012       {
1013         tree type = TREE_VALUE (link);
1014         char *errmsg;
1015         switch (TREE_CODE (type))
1016           {
1017           case RECORD_TYPE:
1018             errmsg = "`struct %s' incomplete in scope ending here";
1019             break;
1020           case UNION_TYPE:
1021             errmsg = "`union %s' incomplete in scope ending here";
1022             break;
1023           case ENUMERAL_TYPE:
1024             errmsg = "`enum %s' incomplete in scope ending here";
1025             break;
1026           }
1027         if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
1028           error (errmsg, IDENTIFIER_POINTER (TYPE_NAME (type)));
1029         else
1030           /* If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL.  */
1031           error (errmsg, TYPE_NAME_STRING (type));
1032       }
1033 #endif /* 0 */
1034
1035   /* Get the decls in the order they were written.
1036      Usually current_binding_level->names is in reverse order.
1037      But parameter decls were previously put in forward order.  */
1038
1039   if (reverse)
1040     current_binding_level->names
1041       = decls = nreverse (current_binding_level->names);
1042   else
1043     decls = current_binding_level->names;
1044
1045   /* Output any nested inline functions within this block
1046      if they weren't already output.  */
1047
1048   for (decl = decls; decl; decl = TREE_CHAIN (decl))
1049     if (TREE_CODE (decl) == FUNCTION_DECL
1050         && ! TREE_ASM_WRITTEN (decl)
1051         && DECL_INITIAL (decl) != NULL_TREE
1052         && TREE_ADDRESSABLE (decl)
1053         && decl_function_context (decl) == current_function_decl)
1054       {
1055         /* If this decl was copied from a file-scope decl
1056            on account of a block-scope extern decl,
1057            propagate TREE_ADDRESSABLE to the file-scope decl.  */
1058         if (DECL_ABSTRACT_ORIGIN (decl) != NULL_TREE)
1059           TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
1060         else
1061           {
1062             push_function_context ();
1063             output_inline_function (decl);
1064             pop_function_context ();
1065           }
1066       }
1067
1068   /* If there were any declarations or structure tags in that level,
1069      or if this level is a function body,
1070      create a BLOCK to record them for the life of this function.  */
1071
1072   block = NULL_TREE;
1073   block_previously_created = (current_binding_level->this_block != NULL_TREE);
1074   if (block_previously_created)
1075     block = current_binding_level->this_block;
1076   else if (keep == 1 || functionbody)
1077     block = make_node (BLOCK);
1078   if (block != NULL_TREE)
1079     {
1080       BLOCK_VARS (block) = decls;
1081       BLOCK_TYPE_TAGS (block) = tags;
1082       BLOCK_SUBBLOCKS (block) = subblocks;
1083       /* If we created the block earlier on, and we are just diddling it now,
1084          then it already should have a proper BLOCK_END_NOTE value associated
1085          with it, so avoid trashing that.  Otherwise, for a new block, install
1086          a new BLOCK_END_NOTE value.  */
1087       if (! block_previously_created)
1088         remember_end_note (block);
1089     }
1090
1091   /* In each subblock, record that this is its superior.  */
1092
1093   if (keep >= 0)
1094     for (link = subblocks; link; link = TREE_CHAIN (link))
1095       BLOCK_SUPERCONTEXT (link) = block;
1096
1097   /* Clear out the meanings of the local variables of this level.  */
1098
1099   for (link = decls; link; link = TREE_CHAIN (link))
1100     {
1101       if (DECL_NAME (link) != NULL_TREE)
1102         {
1103           /* If the ident. was used or addressed via a local extern decl,
1104              don't forget that fact.  */
1105           if (DECL_EXTERNAL (link))
1106             {
1107               if (TREE_USED (link))
1108                 TREE_USED (DECL_ASSEMBLER_NAME (link)) = 1;
1109               if (TREE_ADDRESSABLE (link))
1110                 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
1111             }
1112           IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = NULL_TREE;
1113         }
1114     }
1115
1116   /* Restore all name-meanings of the outer levels
1117      that were shadowed by this level.  */
1118
1119   for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
1120     IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1121   for (link = current_binding_level->class_shadowed;
1122        link; link = TREE_CHAIN (link))
1123     IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1124   for (link = current_binding_level->type_shadowed;
1125        link; link = TREE_CHAIN (link))
1126     IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1127
1128   /* If the level being exited is the top level of a function,
1129      check over all the labels.  */
1130
1131   if (functionbody)
1132     {
1133       /* If this is the top level block of a function,
1134          the vars are the function's parameters.
1135          Don't leave them in the BLOCK because they are
1136          found in the FUNCTION_DECL instead.  */
1137
1138       BLOCK_VARS (block) = 0;
1139
1140       /* Clear out the definitions of all label names,
1141          since their scopes end here.  */
1142
1143       for (link = named_labels; link; link = TREE_CHAIN (link))
1144         {
1145           register tree label = TREE_VALUE (link);
1146
1147           if (DECL_INITIAL (label) == NULL_TREE)
1148             {
1149               cp_error_at ("label `%D' used but not defined", label);
1150               /* Avoid crashing later.  */
1151               define_label (input_filename, 1, DECL_NAME (label));
1152             }
1153           else if (warn_unused && !TREE_USED (label))
1154             cp_warning_at ("label `%D' defined but not used", label);
1155           SET_IDENTIFIER_LABEL_VALUE (DECL_NAME (label), NULL_TREE);
1156
1157           /* Put the labels into the "variables" of the
1158              top-level block, so debugger can see them.  */
1159           TREE_CHAIN (label) = BLOCK_VARS (block);
1160           BLOCK_VARS (block) = label;
1161         }
1162
1163       named_labels = NULL_TREE;
1164     }
1165
1166   /* Any uses of undefined labels now operate under constraints
1167      of next binding contour.  */
1168   {
1169     struct binding_level *level_chain;
1170     level_chain = current_binding_level->level_chain;
1171     if (level_chain)
1172       {
1173         tree labels;
1174         for (labels = named_label_uses; labels; labels = TREE_CHAIN (labels))
1175           if (TREE_TYPE (labels) == (tree)current_binding_level)
1176             {
1177               TREE_TYPE (labels) = (tree)level_chain;
1178               TREE_PURPOSE (labels) = level_chain->names;
1179             }
1180       }
1181   }
1182
1183   tmp = current_binding_level->keep;
1184
1185   pop_binding_level ();
1186   if (functionbody)
1187     DECL_INITIAL (current_function_decl) = block;
1188   else if (block)
1189     {
1190       if (!block_previously_created)
1191         current_binding_level->blocks
1192           = chainon (current_binding_level->blocks, block);
1193     }
1194   /* If we did not make a block for the level just exited,
1195      any blocks made for inner levels
1196      (since they cannot be recorded as subblocks in that level)
1197      must be carried forward so they will later become subblocks
1198      of something else.  */
1199   else if (subblocks)
1200     {
1201       if (keep == 2)
1202         current_binding_level->blocks
1203           = chainon (subblocks, current_binding_level->blocks);
1204       else
1205         current_binding_level->blocks
1206           = chainon (current_binding_level->blocks, subblocks);
1207     }
1208
1209   /* Take care of compiler's internal binding structures.  */
1210   if (tmp == 2)
1211     {
1212 #if 0
1213       /* We did not call push_momentary for this
1214          binding contour, so there is nothing to pop.  */
1215       pop_momentary ();
1216 #endif
1217       expand_end_bindings (getdecls (), keep, 1);
1218       /* Each and every BLOCK node created here in `poplevel' is important
1219          (e.g. for proper debugging information) so if we created one
1220          earlier, mark it as "used".  */
1221       if (block)
1222         TREE_USED (block) = 1;
1223       block = poplevel (keep, reverse, real_functionbody);
1224     }
1225
1226   /* Each and every BLOCK node created here in `poplevel' is important
1227      (e.g. for proper debugging information) so if we created one
1228      earlier, mark it as "used".  */
1229   if (block)
1230     TREE_USED (block) = 1;
1231   return block;
1232 }
1233
1234 /* Resume a binding level for a namespace.  */
1235 void
1236 resume_level (b)
1237      struct binding_level *b;
1238 {
1239   tree decls, link;
1240
1241   resume_binding_level (b);
1242
1243   /* Resume the variable caches.  */
1244   decls = current_binding_level->names;
1245
1246   /* Restore the meanings of the local variables of this level.  */
1247
1248   for (link = decls; link; link = TREE_CHAIN (link))
1249     {
1250       if (DECL_NAME (link) != NULL_TREE)
1251         IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = link;
1252
1253       /* If this is a TYPE_DECL, push it into the type value slot.  */
1254       if (TREE_CODE (link) == TYPE_DECL)
1255         SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (link), TREE_TYPE (link));
1256     }
1257 }
1258
1259 /* Delete the node BLOCK from the current binding level.
1260    This is used for the block inside a stmt expr ({...})
1261    so that the block can be reinserted where appropriate.  */
1262
1263 void
1264 delete_block (block)
1265      tree block;
1266 {
1267   tree t;
1268   if (current_binding_level->blocks == block)
1269     current_binding_level->blocks = TREE_CHAIN (block);
1270   for (t = current_binding_level->blocks; t;)
1271     {
1272       if (TREE_CHAIN (t) == block)
1273         TREE_CHAIN (t) = TREE_CHAIN (block);
1274       else
1275         t = TREE_CHAIN (t);
1276     }
1277   TREE_CHAIN (block) = NULL_TREE;
1278   /* Clear TREE_USED which is always set by poplevel.
1279      The flag is set again if insert_block is called.  */
1280   TREE_USED (block) = 0;
1281 }
1282
1283 /* Insert BLOCK at the end of the list of subblocks of the
1284    current binding level.  This is used when a BIND_EXPR is expanded,
1285    to handle the BLOCK node inside the BIND_EXPR.  */
1286
1287 void
1288 insert_block (block)
1289      tree block;
1290 {
1291   TREE_USED (block) = 1;
1292   current_binding_level->blocks
1293     = chainon (current_binding_level->blocks, block);
1294 }
1295
1296 /* Add BLOCK to the current list of blocks for this binding contour.  */
1297 void
1298 add_block_current_level (block)
1299      tree block;
1300 {
1301   current_binding_level->blocks
1302     = chainon (current_binding_level->blocks, block);
1303 }
1304
1305 /* Set the BLOCK node for the innermost scope
1306    (the one we are currently in).  */
1307
1308 void
1309 set_block (block)
1310     register tree block;
1311 {
1312   current_binding_level->this_block = block;
1313 }
1314
1315 /* Do a pushlevel for class declarations.  */
1316 void
1317 pushlevel_class ()
1318 {
1319   register struct binding_level *newlevel;
1320
1321   /* Reuse or create a struct for this binding level.  */
1322 #if defined(DEBUG_CP_BINDING_LEVELS)
1323   if (0)
1324 #else /* !defined(DEBUG_CP_BINDING_LEVELS) */
1325   if (free_binding_level)
1326 #endif /* !defined(DEBUG_CP_BINDING_LEVELS) */
1327     {
1328       newlevel = free_binding_level;
1329       free_binding_level = free_binding_level->level_chain;
1330     }
1331   else
1332     {
1333       /* Create a new `struct binding_level'.  */
1334       newlevel = (struct binding_level *) xmalloc (sizeof (struct binding_level));
1335     }
1336
1337 #if defined(DEBUG_CP_BINDING_LEVELS)
1338   is_class_level = 1;
1339 #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
1340
1341   push_binding_level (newlevel, 0, 0);
1342
1343   decl_stack = push_decl_level (decl_stack, &decl_obstack);
1344   class_binding_level = current_binding_level;
1345   class_binding_level->parm_flag = 2;
1346   /* We have just pushed into a new binding level.  Now, fake out the rest
1347      of the compiler.  Set the `current_binding_level' back to point to
1348      the most closely containing non-class binding level.  */
1349   do
1350     {
1351       current_binding_level = current_binding_level->level_chain;
1352     }
1353   while (current_binding_level->parm_flag == 2);
1354 }
1355
1356 /* ...and a poplevel for class declarations.  FORCE is used to force
1357    clearing out of CLASS_VALUEs after a class definition.  */
1358 tree
1359 poplevel_class (force)
1360      int force;
1361 {
1362   register struct binding_level *level = class_binding_level;
1363   tree block = NULL_TREE;
1364   tree shadowed;
1365
1366   my_friendly_assert (level != 0, 354);
1367   
1368   decl_stack = pop_stack_level (decl_stack);
1369   for (shadowed = level->shadowed; shadowed; shadowed = TREE_CHAIN (shadowed))
1370     IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed);
1371   /* If we're leaving a toplevel class, don't bother to do the setting
1372      of IDENTIFIER_CLASS_VALUE to NULL_TREE, since first of all this slot
1373      shouldn't even be used when current_class_type isn't set, and second,
1374      if we don't touch it here, we're able to use the cache effect if the
1375      next time we're entering a class scope, it is the same class.  */
1376   if (current_class_depth != 1 || force)
1377     for (shadowed = level->class_shadowed;
1378          shadowed;
1379          shadowed = TREE_CHAIN (shadowed))
1380       IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed);
1381   else
1382     /* Remember to save what IDENTIFIER's were bound in this scope so we
1383        can recover from cache misses.  */
1384     previous_class_values = class_binding_level->class_shadowed;
1385   for (shadowed = level->type_shadowed;
1386        shadowed;
1387        shadowed = TREE_CHAIN (shadowed))
1388     IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed);
1389
1390   GNU_xref_end_scope ((HOST_WIDE_INT) class_binding_level,
1391                       (HOST_WIDE_INT) class_binding_level->level_chain,
1392                       class_binding_level->parm_flag,
1393                       class_binding_level->keep,
1394                       class_binding_level->tag_transparent);
1395
1396   if (class_binding_level->parm_flag != 2)
1397     class_binding_level = (struct binding_level *)0;
1398
1399   /* Now, pop out of the the binding level which we created up in the
1400      `pushlevel_class' routine.  */
1401 #if defined(DEBUG_CP_BINDING_LEVELS)
1402   is_class_level = 1;
1403 #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
1404
1405   pop_binding_level ();
1406
1407   return block;
1408 }
1409 \f
1410 /* For debugging.  */
1411 int no_print_functions = 0;
1412 int no_print_builtins = 0;
1413
1414 void
1415 print_binding_level (lvl)
1416      struct binding_level *lvl;
1417 {
1418   tree t;
1419   int i = 0, len;
1420   fprintf (stderr, " blocks=");
1421   fprintf (stderr, HOST_PTR_PRINTF, lvl->blocks);
1422   fprintf (stderr, " n_incomplete=%d parm_flag=%d keep=%d",
1423            lvl->n_incomplete, lvl->parm_flag, lvl->keep);
1424   if (lvl->tag_transparent)
1425     fprintf (stderr, " tag-transparent");
1426   if (lvl->more_cleanups_ok)
1427     fprintf (stderr, " more-cleanups-ok");
1428   if (lvl->have_cleanups)
1429     fprintf (stderr, " have-cleanups");
1430   fprintf (stderr, "\n");
1431   if (lvl->names)
1432     {
1433       fprintf (stderr, " names:\t");
1434       /* We can probably fit 3 names to a line?  */
1435       for (t = lvl->names; t; t = TREE_CHAIN (t))
1436         {
1437           if (no_print_functions && (TREE_CODE(t) == FUNCTION_DECL)) 
1438             continue;
1439           if (no_print_builtins
1440               && (TREE_CODE(t) == TYPE_DECL)
1441               && (!strcmp(DECL_SOURCE_FILE(t),"<built-in>")))
1442             continue;
1443
1444           /* Function decls tend to have longer names.  */
1445           if (TREE_CODE (t) == FUNCTION_DECL)
1446             len = 3;
1447           else
1448             len = 2;
1449           i += len;
1450           if (i > 6)
1451             {
1452               fprintf (stderr, "\n\t");
1453               i = len;
1454             }
1455           print_node_brief (stderr, "", t, 0);
1456           if (TREE_CODE (t) == ERROR_MARK)
1457             break;
1458         }
1459       if (i)
1460         fprintf (stderr, "\n");
1461     }
1462   if (lvl->tags)
1463     {
1464       fprintf (stderr, " tags:\t");
1465       i = 0;
1466       for (t = lvl->tags; t; t = TREE_CHAIN (t))
1467         {
1468           if (TREE_PURPOSE (t) == NULL_TREE)
1469             len = 3;
1470           else if (TREE_PURPOSE (t) == TYPE_IDENTIFIER (TREE_VALUE (t)))
1471             len = 2;
1472           else
1473             len = 4;
1474           i += len;
1475           if (i > 5)
1476             {
1477               fprintf (stderr, "\n\t");
1478               i = len;
1479             }
1480           if (TREE_PURPOSE (t) == NULL_TREE)
1481             {
1482               print_node_brief (stderr, "<unnamed-typedef", TREE_VALUE (t), 0);
1483               fprintf (stderr, ">");
1484             }
1485           else if (TREE_PURPOSE (t) == TYPE_IDENTIFIER (TREE_VALUE (t)))
1486             print_node_brief (stderr, "", TREE_VALUE (t), 0);
1487           else
1488             {
1489               print_node_brief (stderr, "<typedef", TREE_PURPOSE (t), 0);
1490               print_node_brief (stderr, "", TREE_VALUE (t), 0);
1491               fprintf (stderr, ">");
1492             }
1493         }
1494       if (i)
1495         fprintf (stderr, "\n");
1496     }
1497   if (lvl->shadowed)
1498     {
1499       fprintf (stderr, " shadowed:");
1500       for (t = lvl->shadowed; t; t = TREE_CHAIN (t))
1501         {
1502           fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t)));
1503         }
1504       fprintf (stderr, "\n");
1505     }
1506   if (lvl->class_shadowed)
1507     {
1508       fprintf (stderr, " class-shadowed:");
1509       for (t = lvl->class_shadowed; t; t = TREE_CHAIN (t))
1510         {
1511           fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t)));
1512         }
1513       fprintf (stderr, "\n");
1514     }
1515   if (lvl->type_shadowed)
1516     {
1517       fprintf (stderr, " type-shadowed:");
1518       for (t = lvl->type_shadowed; t; t = TREE_CHAIN (t))
1519         {
1520 #if 0
1521           fprintf (stderr, "\n\t");
1522           print_node_brief (stderr, "<", TREE_PURPOSE (t), 0);
1523           if (TREE_VALUE (t))
1524             print_node_brief (stderr, " ", TREE_VALUE (t), 0);
1525           else
1526             fprintf (stderr, " (none)");
1527           fprintf (stderr, ">");
1528 #else
1529           fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t)));
1530 #endif
1531         }
1532       fprintf (stderr, "\n");
1533     }
1534 }
1535
1536 void
1537 print_other_binding_stack (stack)
1538      struct binding_level *stack;
1539 {
1540   struct binding_level *level;
1541   for (level = stack; level != global_binding_level; level = level->level_chain)
1542     {
1543       fprintf (stderr, "binding level ");
1544       fprintf (stderr, HOST_PTR_PRINTF, level);
1545       fprintf (stderr, "\n");
1546       print_binding_level (level);
1547     }
1548 }
1549
1550 void
1551 print_binding_stack ()
1552 {
1553   struct binding_level *b;
1554   fprintf (stderr, "current_binding_level=");
1555   fprintf (stderr, HOST_PTR_PRINTF, current_binding_level);
1556   fprintf (stderr, "\nclass_binding_level=");
1557   fprintf (stderr, HOST_PTR_PRINTF, class_binding_level);
1558   fprintf (stderr, "\nglobal_binding_level=");
1559   fprintf (stderr, HOST_PTR_PRINTF, global_binding_level);
1560   fprintf (stderr, "\n");
1561   if (class_binding_level)
1562     {
1563       for (b = class_binding_level; b; b = b->level_chain)
1564         if (b == current_binding_level)
1565           break;
1566       if (b)
1567         b = class_binding_level;
1568       else
1569         b = current_binding_level;
1570     }
1571   else
1572     b = current_binding_level;
1573   print_other_binding_stack (b);
1574   fprintf (stderr, "global:\n");
1575   print_binding_level (global_binding_level);
1576 }
1577
1578 /* Push into the scope of the NAME namespace.  */
1579 void
1580 push_namespace (name)
1581      tree name;
1582 {
1583   extern tree current_namespace;
1584   tree old_id = get_namespace_id ();
1585   char *buf;
1586   tree d = make_node (NAMESPACE_DECL);
1587
1588   DECL_NAME (d) = name;
1589   DECL_ASSEMBLER_NAME (d) = name;
1590   /* pushdecl wants to check the size of it to see if it is incomplete... */
1591   TREE_TYPE (d) = void_type_node;
1592   /* Mark them as external, so redeclaration_error_message doesn't think
1593      they are duplicates. */
1594   DECL_EXTERNAL (d) = 1;
1595   d = pushdecl (d);
1596
1597   if (NAMESPACE_LEVEL (d) == 0)
1598     {
1599       /* This is new for this compilation unit.  */
1600       pushlevel (0);
1601       declare_namespace_level ();
1602       NAMESPACE_LEVEL (d) = (tree)current_binding_level;
1603     }
1604   else
1605     {
1606       resume_level ((struct binding_level*)NAMESPACE_LEVEL (d));
1607     }
1608
1609   /* This code is just is bit old now... */ 
1610   current_namespace = tree_cons (NULL_TREE, name, current_namespace);
1611   buf = (char *) alloca (4 + (old_id ? IDENTIFIER_LENGTH (old_id) : 0)
1612                          + IDENTIFIER_LENGTH (name));
1613   sprintf (buf, "%s%s", old_id ? IDENTIFIER_POINTER (old_id) : "",
1614            IDENTIFIER_POINTER (name));
1615   TREE_PURPOSE (current_namespace) = get_identifier (buf);
1616 }
1617
1618 /* Pop from the scope of the current namespace.  */
1619 void
1620 pop_namespace ()
1621 {
1622   extern tree current_namespace;
1623   tree decls, link;
1624   current_namespace = TREE_CHAIN (current_namespace);
1625
1626   /* Just in case we get out of sync. */
1627   if (! namespace_bindings_p ())
1628     poplevel (0, 0, 0);
1629
1630   decls = current_binding_level->names;
1631
1632   /* Clear out the meanings of the local variables of this level.  */
1633
1634   for (link = decls; link; link = TREE_CHAIN (link))
1635     {
1636       if (DECL_NAME (link) != NULL_TREE)
1637         {
1638           /* If the ident. was used or addressed via a local extern decl,
1639              don't forget that fact.  */
1640           if (DECL_EXTERNAL (link))
1641             {
1642               if (TREE_USED (link))
1643                 TREE_USED (DECL_ASSEMBLER_NAME (link)) = 1;
1644               if (TREE_ADDRESSABLE (link))
1645                 TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
1646             }
1647           IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = NULL_TREE;
1648         }
1649     }
1650
1651   /* Restore all name-meanings of the outer levels
1652      that were shadowed by this level.  */
1653
1654   for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
1655     IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1656   for (link = current_binding_level->class_shadowed;
1657        link; link = TREE_CHAIN (link))
1658     IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1659   for (link = current_binding_level->type_shadowed;
1660        link; link = TREE_CHAIN (link))
1661     IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
1662
1663   /* suspend a level.  */
1664   suspend_binding_level ();
1665 }
1666 \f
1667 /* Subroutines for reverting temporarily to top-level for instantiation
1668    of templates and such.  We actually need to clear out the class- and
1669    local-value slots of all identifiers, so that only the global values
1670    are at all visible.  Simply setting current_binding_level to the global
1671    scope isn't enough, because more binding levels may be pushed.  */
1672 struct saved_scope {
1673   struct binding_level *old_binding_level;
1674   tree old_bindings;
1675   struct saved_scope *prev;
1676   tree class_name, class_type, function_decl;
1677   tree base_init_list, member_init_list;
1678   struct binding_level *class_bindings;
1679   tree previous_class_type;
1680   tree *lang_base, *lang_stack, lang_name;
1681   int lang_stacksize;
1682   tree named_labels;
1683 };
1684 static struct saved_scope *current_saved_scope;
1685 extern tree prev_class_type;
1686
1687 void
1688 push_to_top_level ()
1689 {
1690   extern int current_lang_stacksize;
1691   struct saved_scope *s =
1692     (struct saved_scope *) xmalloc (sizeof (struct saved_scope));
1693   struct binding_level *b = current_binding_level;
1694   tree old_bindings = NULL_TREE;
1695
1696   /* Have to include global_binding_level, because class-level decls
1697      aren't listed anywhere useful.  */
1698   for (; b; b = b->level_chain)
1699     {
1700       tree t;
1701
1702       if (b == global_binding_level)
1703         continue;
1704       
1705       for (t = b->names; t; t = TREE_CHAIN (t))
1706         {
1707           tree binding, t1, t2 = t;
1708           tree id = DECL_ASSEMBLER_NAME (t2);
1709
1710           if (!id
1711               || (!IDENTIFIER_LOCAL_VALUE (id)
1712                   && !IDENTIFIER_CLASS_VALUE (id)))
1713             continue;
1714
1715           for (t1 = old_bindings; t1; t1 = TREE_CHAIN (t1))
1716             if (TREE_VEC_ELT (t1, 0) == id)
1717               goto skip_it;
1718             
1719           binding = make_tree_vec (4);
1720           if (id)
1721             {
1722               my_friendly_assert (TREE_CODE (id) == IDENTIFIER_NODE, 135);
1723               TREE_VEC_ELT (binding, 0) = id;
1724               TREE_VEC_ELT (binding, 1) = IDENTIFIER_TYPE_VALUE (id);
1725               TREE_VEC_ELT (binding, 2) = IDENTIFIER_LOCAL_VALUE (id);
1726               TREE_VEC_ELT (binding, 3) = IDENTIFIER_CLASS_VALUE (id);
1727               IDENTIFIER_LOCAL_VALUE (id) = NULL_TREE;
1728               IDENTIFIER_CLASS_VALUE (id) = NULL_TREE;
1729             }
1730           TREE_CHAIN (binding) = old_bindings;
1731           old_bindings = binding;
1732         skip_it:
1733           ;
1734         }
1735       /* Unwind type-value slots back to top level.  */
1736       for (t = b->type_shadowed; t; t = TREE_CHAIN (t))
1737         SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (t), TREE_VALUE (t));
1738     }
1739   /* Clear out class-level bindings cache.  */
1740   if (current_binding_level == global_binding_level
1741       && previous_class_type != NULL_TREE)
1742     {
1743       popclass (-1);
1744       previous_class_type = NULL_TREE;
1745     }
1746
1747   s->old_binding_level = current_binding_level;
1748   current_binding_level = global_binding_level;
1749
1750   s->class_name = current_class_name;
1751   s->class_type = current_class_type;
1752   s->function_decl = current_function_decl;
1753   s->base_init_list = current_base_init_list;
1754   s->member_init_list = current_member_init_list;
1755   s->class_bindings = class_binding_level;
1756   s->previous_class_type = previous_class_type;
1757   s->lang_stack = current_lang_stack;
1758   s->lang_base = current_lang_base;
1759   s->lang_stacksize = current_lang_stacksize;
1760   s->lang_name = current_lang_name;
1761   s->named_labels = named_labels;
1762   current_class_name = current_class_type = NULL_TREE;
1763   current_function_decl = NULL_TREE;
1764   class_binding_level = (struct binding_level *)0;
1765   previous_class_type = NULL_TREE;
1766   current_lang_stacksize = 10;
1767   current_lang_stack = current_lang_base
1768     = (tree *) xmalloc (current_lang_stacksize * sizeof (tree));
1769   current_lang_name = lang_name_cplusplus;
1770   strict_prototype = strict_prototypes_lang_cplusplus;
1771   named_labels = NULL_TREE;
1772
1773   s->prev = current_saved_scope;
1774   s->old_bindings = old_bindings;
1775   current_saved_scope = s;
1776 }
1777
1778 void
1779 pop_from_top_level ()
1780 {
1781   extern int current_lang_stacksize;
1782   struct saved_scope *s = current_saved_scope;
1783   tree t;
1784
1785   if (previous_class_type)
1786     previous_class_type = NULL_TREE;
1787
1788   current_binding_level = s->old_binding_level;
1789   current_saved_scope = s->prev;
1790   for (t = s->old_bindings; t; t = TREE_CHAIN (t))
1791     {
1792       tree id = TREE_VEC_ELT (t, 0);
1793       if (id)
1794         {
1795           IDENTIFIER_TYPE_VALUE (id) = TREE_VEC_ELT (t, 1);
1796           IDENTIFIER_LOCAL_VALUE (id) = TREE_VEC_ELT (t, 2);
1797           IDENTIFIER_CLASS_VALUE (id) = TREE_VEC_ELT (t, 3);
1798         }
1799     }
1800   current_class_name = s->class_name;
1801   current_class_type = s->class_type;
1802   current_base_init_list = s->base_init_list;
1803   current_member_init_list = s->member_init_list;
1804   current_function_decl = s->function_decl;
1805   class_binding_level = s->class_bindings;
1806   previous_class_type = s->previous_class_type;
1807   free (current_lang_base);
1808   current_lang_base = s->lang_base;
1809   current_lang_stack = s->lang_stack;
1810   current_lang_name = s->lang_name;
1811   current_lang_stacksize = s->lang_stacksize;
1812   if (current_lang_name == lang_name_cplusplus)
1813     strict_prototype = strict_prototypes_lang_cplusplus;
1814   else if (current_lang_name == lang_name_c)
1815     strict_prototype = strict_prototypes_lang_c;
1816   named_labels = s->named_labels;
1817
1818   free (s);
1819 }
1820 \f
1821 /* Push a definition of struct, union or enum tag "name".
1822    into binding_level "b".   "type" should be the type node, 
1823    We assume that the tag "name" is not already defined.
1824
1825    Note that the definition may really be just a forward reference.
1826    In that case, the TYPE_SIZE will be a NULL_TREE.
1827
1828    C++ gratuitously puts all these tags in the name space. */
1829
1830 /* When setting the IDENTIFIER_TYPE_VALUE field of an identifier ID,
1831    record the shadowed value for this binding contour.  TYPE is
1832    the type that ID maps to.  */
1833
1834 static void
1835 set_identifier_type_value_with_scope (id, type, b)
1836      tree id;
1837      tree type;
1838      struct binding_level *b;
1839 {
1840   if (b != global_binding_level)
1841     {
1842       tree old_type_value = IDENTIFIER_TYPE_VALUE (id);
1843       b->type_shadowed
1844         = tree_cons (id, old_type_value, b->type_shadowed);
1845     }
1846   SET_IDENTIFIER_TYPE_VALUE (id, type);
1847 }
1848
1849 /* As set_identifier_type_value_with_scope, but using inner_binding_level. */
1850
1851 void
1852 set_identifier_type_value (id, type)
1853      tree id;
1854      tree type;
1855 {
1856   set_identifier_type_value_with_scope (id, type, inner_binding_level);
1857 }
1858
1859 /* Subroutine "set_nested_typename" builds the nested-typename of
1860    the type decl in question.  (Argument CLASSNAME can actually be
1861    a function as well, if that's the smallest containing scope.)  */
1862
1863 static void
1864 set_nested_typename (decl, classname, name, type)
1865      tree decl, classname, name, type;
1866 {
1867   char *buf;
1868   my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 136);
1869
1870   /* No need to do this for anonymous names, since they're unique.  */
1871   if (ANON_AGGRNAME_P (name))
1872     {
1873       DECL_NESTED_TYPENAME (decl) = name;
1874       return;
1875     }
1876
1877   if (classname == NULL_TREE)
1878     classname = get_identifier ("");
1879
1880   my_friendly_assert (TREE_CODE (classname) == IDENTIFIER_NODE, 137);
1881   my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 138);
1882   buf = (char *) alloca (4 + IDENTIFIER_LENGTH (classname)
1883                          + IDENTIFIER_LENGTH (name));
1884   sprintf (buf, "%s::%s", IDENTIFIER_POINTER (classname),
1885            IDENTIFIER_POINTER (name));
1886   DECL_NESTED_TYPENAME (decl) = get_identifier (buf);
1887   TREE_MANGLED (DECL_NESTED_TYPENAME (decl)) = 1;
1888
1889   /* Create an extra decl so that the nested name will have a type value
1890      where appropriate.  */
1891   {
1892     tree nested, type_decl;
1893     nested = DECL_NESTED_TYPENAME (decl);
1894     type_decl = build_decl (TYPE_DECL, nested, type);
1895     DECL_NESTED_TYPENAME (type_decl) = nested;
1896     SET_DECL_ARTIFICIAL (type_decl);
1897     /* Mark the TYPE_DECL node created just above as a gratuitous one so that
1898        dwarfout.c will know not to generate a TAG_typedef DIE for it, and
1899        sdbout.c won't try to output a .def for "::foo".  */
1900     DECL_IGNORED_P (type_decl) = 1;
1901
1902     /* Remove this when local classes are fixed.  */
1903     SET_IDENTIFIER_TYPE_VALUE (nested, type);
1904
1905     pushdecl_nonclass_level (type_decl);
1906   }
1907 }
1908
1909 /* Pop off extraneous binding levels left over due to syntax errors.
1910
1911    We don't pop past namespaces, as they might be valid.  */
1912 void
1913 pop_everything ()
1914 {
1915 #ifdef DEBUG_CP_BINDING_LEVELS
1916   fprintf (stderr, "XXX entering pop_everything ()\n");
1917 #endif
1918   while (! toplevel_bindings_p () && ! pseudo_global_level_p ())
1919     {
1920       if (class_binding_level)
1921         pop_nested_class (1);
1922       else
1923         poplevel (0, 0, 0);
1924     }
1925 #ifdef DEBUG_CP_BINDING_LEVELS
1926   fprintf (stderr, "XXX leaving pop_everything ()\n");
1927 #endif
1928 }
1929
1930 #if 0 /* not yet, should get fixed properly later */
1931 /* Create a TYPE_DECL node with the correct DECL_ASSEMBLER_NAME.
1932    Other routines shouldn't use build_decl directly; they'll produce
1933    incorrect results with `-g' unless they duplicate this code.
1934
1935    This is currently needed mainly for dbxout.c, but we can make
1936    use of it in method.c later as well.  */
1937 tree
1938 make_type_decl (name, type)
1939      tree name, type;
1940 {
1941   tree decl, id;
1942   decl = build_decl (TYPE_DECL, name, type);
1943   if (TYPE_NAME (type) == name)
1944     /* Class/union/enum definition, or a redundant typedef for same.  */
1945     {
1946       id = get_identifier (build_overload_name (type, 1, 1));
1947       DECL_ASSEMBLER_NAME (decl) = id;
1948     }
1949   else if (TYPE_NAME (type) != NULL_TREE)
1950     /* Explicit typedef, or implicit typedef for template expansion.  */
1951     DECL_ASSEMBLER_NAME (decl) = DECL_ASSEMBLER_NAME (TYPE_NAME (type));
1952   else
1953     {
1954       /* XXX: Typedef for unnamed struct; some other situations.
1955          TYPE_NAME is null; what's right here?  */
1956     }
1957   return decl;
1958 }
1959 #endif
1960
1961 /* Push a tag name NAME for struct/class/union/enum type TYPE.
1962    Normally put into into the inner-most non-tag-transparent scope,
1963    but if GLOBALIZE is true, put it in the inner-most non-class scope.
1964    The latter is needed for implicit declarations. */
1965
1966 void
1967 pushtag (name, type, globalize)
1968      tree name, type;
1969      int globalize;
1970 {
1971   register struct binding_level *b;
1972   tree context = 0;
1973   tree c_decl = 0;
1974
1975   b = inner_binding_level;
1976   while (b->tag_transparent
1977          || (globalize && b->parm_flag == 2))
1978     b = b->level_chain;
1979
1980   if (toplevel_bindings_p ())
1981     b->tags = perm_tree_cons (name, type, b->tags);
1982   else
1983     b->tags = saveable_tree_cons (name, type, b->tags);
1984
1985   if (name)
1986     {
1987       context = type ? TYPE_CONTEXT (type) : NULL_TREE;
1988       if (! context && ! globalize)
1989         context = current_scope ();
1990       if (context)
1991         c_decl = TREE_CODE (context) == FUNCTION_DECL
1992           ? context : TYPE_MAIN_DECL (context);
1993
1994 #if 0
1995       /* Record the identifier as the type's name if it has none.  */
1996       if (TYPE_NAME (type) == NULL_TREE)
1997         TYPE_NAME (type) = name;
1998 #endif
1999       
2000       /* Do C++ gratuitous typedefing.  */
2001       if (IDENTIFIER_TYPE_VALUE (name) != type)
2002         {
2003           register tree d;
2004           int newdecl = 0;
2005           
2006           if (b->parm_flag != 2
2007               || TYPE_SIZE (current_class_type) != NULL_TREE)
2008             {
2009               d = lookup_nested_type (type, c_decl);
2010
2011               if (d == NULL_TREE)
2012                 {
2013                   newdecl = 1;
2014 #if 0 /* not yet, should get fixed properly later */
2015                   d = make_type_decl (name, type);
2016 #else
2017                   d = build_decl (TYPE_DECL, name, type);
2018 #endif
2019                   SET_DECL_ARTIFICIAL (d);
2020 #ifdef DWARF_DEBUGGING_INFO
2021                   if (write_symbols == DWARF_DEBUG)
2022                     {
2023                       /* Mark the TYPE_DECL node we created just above as an
2024                          gratuitous one.  We need to do this so that dwarfout.c
2025                          will understand that it is not supposed to output a
2026                          TAG_typedef DIE  for it. */
2027                       DECL_IGNORED_P (d) = 1;
2028                     }
2029 #endif /* DWARF_DEBUGGING_INFO */
2030                   set_identifier_type_value_with_scope (name, type, b);
2031                 }
2032               else
2033                 d = TYPE_NAME (d);
2034
2035               TYPE_NAME (type) = d;
2036
2037               /* If it is anonymous, then we are called from pushdecl,
2038                  and we don't want to infinitely recurse.  */
2039               if (! ANON_AGGRNAME_P (name))
2040                 {
2041                   if (b->parm_flag == 2)
2042                     d = pushdecl_class_level (d);
2043                   else
2044                     d = pushdecl_with_scope (d, b);
2045                 }
2046             }
2047           else
2048             {
2049               /* Make nested declarations go into class-level scope.  */
2050               newdecl = 1;
2051               d = build_decl (TYPE_DECL, name, type);
2052               SET_DECL_ARTIFICIAL (d);
2053 #ifdef DWARF_DEBUGGING_INFO
2054               if (write_symbols == DWARF_DEBUG)
2055                 {
2056                   /* Mark the TYPE_DECL node we created just above as an
2057                      gratuitous one.  We need to do this so that dwarfout.c
2058                      will understand that it is not supposed to output a
2059                      TAG_typedef DIE  for it. */
2060                   DECL_IGNORED_P (d) = 1;
2061                 }
2062 #endif /* DWARF_DEBUGGING_INFO */
2063
2064               TYPE_MAIN_DECL (type) = d;
2065
2066               /* Make sure we're in this type's scope when we push the
2067                  decl for a template, otherwise class_binding_level will
2068                  be NULL and we'll end up dying inside of
2069                  push_class_level_binding.  */
2070               if (TREE_CODE (type) == UNINSTANTIATED_P_TYPE)
2071                 pushclass (type, 0);
2072               d = pushdecl_class_level (d);
2073               if (TREE_CODE (type) == UNINSTANTIATED_P_TYPE)
2074                 popclass (0);
2075             }
2076           if (newdecl)
2077             {
2078               if (write_symbols != DWARF_DEBUG)
2079                 {
2080                   if (ANON_AGGRNAME_P (name))
2081                     DECL_IGNORED_P (d) = 1;
2082                 }
2083
2084               if (context == NULL_TREE)
2085                 /* Non-nested class.  */
2086                 set_nested_typename (d, NULL_TREE, name, type);
2087               else if (context && TREE_CODE (context) == FUNCTION_DECL)
2088                 /* Function-nested class.  */
2089                 set_nested_typename (d, DECL_ASSEMBLER_NAME (c_decl),
2090                                      name, type);
2091               else /* if (context && IS_AGGR_TYPE (context)) */
2092                 /* Class-nested class.  */
2093                 set_nested_typename (d, DECL_NESTED_TYPENAME (c_decl),
2094                                      name, type);
2095
2096               DECL_CONTEXT (d) = context;
2097               TYPE_CONTEXT (type) = DECL_CONTEXT (d);
2098               DECL_ASSEMBLER_NAME (d)
2099                 = get_identifier (build_overload_name (type, 1, 1));
2100             }
2101         }
2102       if (b->parm_flag == 2)
2103         {
2104           TREE_NONLOCAL_FLAG (type) = 1;
2105           if (TYPE_SIZE (current_class_type) == NULL_TREE)
2106             CLASSTYPE_TAGS (current_class_type) = b->tags;
2107         }
2108     }
2109
2110   if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
2111     /* Use the canonical TYPE_DECL for this node.  */
2112     TYPE_STUB_DECL (type) = TYPE_NAME (type);
2113   else
2114     {
2115       /* Create a fake NULL-named TYPE_DECL node whose TREE_TYPE
2116          will be the tagged type we just added to the current
2117          binding level.  This fake NULL-named TYPE_DECL node helps
2118          dwarfout.c to know when it needs to output a
2119          representation of a tagged type, and it also gives us a
2120          convenient place to record the "scope start" address for
2121          the tagged type.  */
2122
2123 #if 0 /* not yet, should get fixed properly later */
2124       tree d = make_type_decl (NULL_TREE, type);
2125 #else
2126       tree d = build_decl (TYPE_DECL, NULL_TREE, type);
2127 #endif
2128       TYPE_STUB_DECL (type) = pushdecl_with_scope (d, b);
2129     }
2130 }
2131
2132 /* Counter used to create anonymous type names.  */
2133 static int anon_cnt = 0;
2134
2135 /* Return an IDENTIFIER which can be used as a name for
2136    anonymous structs and unions.  */
2137 tree
2138 make_anon_name ()
2139 {
2140   char buf[32];
2141
2142   sprintf (buf, ANON_AGGRNAME_FORMAT, anon_cnt++);
2143   return get_identifier (buf);
2144 }
2145
2146 /* Clear the TREE_PURPOSE slot of tags which have anonymous typenames.
2147    This keeps dbxout from getting confused.  */
2148 void
2149 clear_anon_tags ()
2150 {
2151   register struct binding_level *b;
2152   register tree tags;
2153   static int last_cnt = 0;
2154
2155   /* Fast out if no new anon names were declared.  */
2156   if (last_cnt == anon_cnt)
2157     return;
2158
2159   b = current_binding_level;
2160   while (b->tag_transparent)
2161     b = b->level_chain;
2162   tags = b->tags;
2163   while (tags)
2164     {
2165       /* A NULL purpose means we have already processed all tags
2166          from here to the end of the list.  */
2167       if (TREE_PURPOSE (tags) == NULL_TREE)
2168         break;
2169       if (ANON_AGGRNAME_P (TREE_PURPOSE (tags)))
2170         TREE_PURPOSE (tags) = NULL_TREE;
2171       tags = TREE_CHAIN (tags);
2172     }
2173   last_cnt = anon_cnt;
2174 }
2175 \f
2176 /* Subroutine of duplicate_decls: return truthvalue of whether
2177    or not types of these decls match.
2178
2179    For C++, we must compare the parameter list so that `int' can match
2180    `int&' in a parameter position, but `int&' is not confused with
2181    `const int&'.  */
2182 int
2183 decls_match (newdecl, olddecl)
2184      tree newdecl, olddecl;
2185 {
2186   int types_match;
2187
2188   if (TREE_CODE (newdecl) == FUNCTION_DECL
2189       && TREE_CODE (olddecl) == FUNCTION_DECL)
2190     {
2191       tree f1 = TREE_TYPE (newdecl);
2192       tree f2 = TREE_TYPE (olddecl);
2193       tree p1 = TYPE_ARG_TYPES (f1);
2194       tree p2 = TYPE_ARG_TYPES (f2);
2195
2196       /* When we parse a static member function definition,
2197          we put together a FUNCTION_DECL which thinks its type
2198          is METHOD_TYPE.  Change that to FUNCTION_TYPE, and
2199          proceed.  */
2200       if (TREE_CODE (f1) == METHOD_TYPE && DECL_STATIC_FUNCTION_P (olddecl))
2201         revert_static_member_fn (&newdecl, &f1, &p1);
2202       else if (TREE_CODE (f2) == METHOD_TYPE
2203                && DECL_STATIC_FUNCTION_P (newdecl))
2204         revert_static_member_fn (&olddecl, &f2, &p2);
2205
2206       /* Here we must take care of the case where new default
2207          parameters are specified.  Also, warn if an old
2208          declaration becomes ambiguous because default
2209          parameters may cause the two to be ambiguous.  */
2210       if (TREE_CODE (f1) != TREE_CODE (f2))
2211         {
2212           if (TREE_CODE (f1) == OFFSET_TYPE)
2213             cp_compiler_error ("`%D' redeclared as member function", newdecl);
2214           else
2215             cp_compiler_error ("`%D' redeclared as non-member function", newdecl);
2216           return 0;
2217         }
2218
2219       if (comptypes (TREE_TYPE (f1), TREE_TYPE (f2), 1))
2220         {
2221           if (! strict_prototypes_lang_c && DECL_LANGUAGE (olddecl) == lang_c
2222               && p2 == NULL_TREE)
2223             {
2224               types_match = self_promoting_args_p (p1);
2225               if (p1 == void_list_node)
2226                 TREE_TYPE (newdecl) = TREE_TYPE (olddecl);
2227             }
2228           else if (!strict_prototypes_lang_c && DECL_LANGUAGE (olddecl)==lang_c
2229                    && DECL_LANGUAGE (newdecl) == lang_c && p1 == NULL_TREE)
2230             {
2231               types_match = self_promoting_args_p (p2);
2232               TREE_TYPE (newdecl) = TREE_TYPE (olddecl);
2233             }
2234           else
2235             types_match = compparms (p1, p2, 3);
2236         }
2237       else
2238         types_match = 0;
2239     }
2240   else if (TREE_CODE (newdecl) == TEMPLATE_DECL
2241            && TREE_CODE (olddecl) == TEMPLATE_DECL)
2242     {
2243         tree newargs = DECL_TEMPLATE_PARMS (newdecl);
2244         tree oldargs = DECL_TEMPLATE_PARMS (olddecl);
2245         int i, len = TREE_VEC_LENGTH (newargs);
2246
2247         if (TREE_VEC_LENGTH (oldargs) != len)
2248           return 0;
2249         
2250         for (i = 0; i < len; i++)
2251           {
2252             tree newarg = TREE_VALUE (TREE_VEC_ELT (newargs, i));
2253             tree oldarg = TREE_VALUE (TREE_VEC_ELT (oldargs, i));
2254             if (TREE_CODE (newarg) != TREE_CODE (oldarg))
2255               return 0;
2256             else if (TREE_CODE (newarg) == TYPE_DECL)
2257               /* continue */;
2258             else if (! comptypes (TREE_TYPE (newarg), TREE_TYPE (oldarg), 1))
2259               return 0;
2260           }
2261
2262         if (DECL_TEMPLATE_IS_CLASS (newdecl)
2263             != DECL_TEMPLATE_IS_CLASS (olddecl))
2264           types_match = 0;
2265         else if (DECL_TEMPLATE_IS_CLASS (newdecl))
2266           types_match = 1;
2267         else
2268           types_match = decls_match (DECL_TEMPLATE_RESULT (olddecl),
2269                                      DECL_TEMPLATE_RESULT (newdecl));
2270     }
2271   else
2272     {
2273       if (TREE_TYPE (newdecl) == error_mark_node)
2274         types_match = TREE_TYPE (olddecl) == error_mark_node;
2275       else if (TREE_TYPE (olddecl) == NULL_TREE)
2276         types_match = TREE_TYPE (newdecl) == NULL_TREE;
2277       else if (TREE_TYPE (newdecl) == NULL_TREE)
2278         types_match = 0;
2279       else
2280         types_match = comptypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl), 1);
2281     }
2282
2283   return types_match;
2284 }
2285
2286 /* If NEWDECL is `static' and an `extern' was seen previously,
2287    warn about it.  (OLDDECL may be NULL_TREE; NAME contains
2288    information about previous usage as an `extern'.)
2289
2290    Note that this does not apply to the C++ case of declaring
2291    a variable `extern const' and then later `const'.
2292
2293    Don't complain if -traditional, since traditional compilers
2294    don't complain.
2295
2296    Don't complain about built-in functions, since they are beyond
2297    the user's control.  */
2298
2299 static void
2300 warn_extern_redeclared_static (newdecl, olddecl)
2301      tree newdecl, olddecl;
2302 {
2303   tree name;
2304
2305   static char *explicit_extern_static_warning
2306     = "`%D' was declared `extern' and later `static'";
2307   static char *implicit_extern_static_warning
2308     = "`%D' was declared implicitly `extern' and later `static'";
2309
2310   if (flag_traditional
2311       || TREE_CODE (newdecl) == TYPE_DECL)
2312     return;
2313
2314   name = DECL_ASSEMBLER_NAME (newdecl);
2315   if (TREE_PUBLIC (name) && DECL_THIS_STATIC (newdecl))
2316     {
2317       /* It's okay to redeclare an ANSI built-in function as static,
2318          or to declare a non-ANSI built-in function as anything.  */
2319       if (! (TREE_CODE (newdecl) == FUNCTION_DECL
2320              && olddecl != NULL_TREE
2321              && TREE_CODE (olddecl) == FUNCTION_DECL
2322              && (DECL_BUILT_IN (olddecl)
2323                  || DECL_BUILT_IN_NONANSI (olddecl))))
2324         {
2325           cp_pedwarn (IDENTIFIER_IMPLICIT_DECL (name)
2326                       ? implicit_extern_static_warning
2327                       : explicit_extern_static_warning, newdecl);
2328           if (olddecl != NULL_TREE)
2329             cp_pedwarn_at ("previous declaration of `%D'", olddecl);
2330         }
2331     }
2332 }
2333
2334 /* Handle when a new declaration NEWDECL has the same name as an old
2335    one OLDDECL in the same binding contour.  Prints an error message
2336    if appropriate.
2337
2338    If safely possible, alter OLDDECL to look like NEWDECL, and return 1.
2339    Otherwise, return 0.  */
2340
2341 int
2342 duplicate_decls (newdecl, olddecl)
2343      register tree newdecl, olddecl;
2344 {
2345   extern struct obstack permanent_obstack;
2346   unsigned olddecl_uid = DECL_UID (olddecl);
2347   int olddecl_friend = 0, types_match = 0;
2348   int new_defines_function;
2349   tree previous_c_decl = NULL_TREE;
2350
2351   if (TREE_CODE_CLASS (TREE_CODE (olddecl)) == 'd')
2352     DECL_MACHINE_ATTRIBUTES (newdecl) = DECL_MACHINE_ATTRIBUTES (olddecl);
2353
2354   types_match = decls_match (newdecl, olddecl);
2355
2356   if (TREE_CODE (olddecl) != TREE_LIST)
2357     olddecl_friend = DECL_LANG_SPECIFIC (olddecl) && DECL_FRIEND_P (olddecl);
2358
2359   /* If either the type of the new decl or the type of the old decl is an
2360      error_mark_node, then that implies that we have already issued an
2361      error (earlier) for some bogus type specification, and in that case,
2362      it is rather pointless to harass the user with yet more error message
2363      about the same declaration, so well just pretent the types match here.  */
2364   if ((TREE_TYPE (newdecl)
2365        && TREE_CODE (TREE_TYPE (newdecl)) == ERROR_MARK)
2366       || (TREE_TYPE (olddecl)
2367           && TREE_CODE (TREE_TYPE (olddecl)) == ERROR_MARK))
2368     types_match = 1;
2369
2370   if (flag_traditional && TREE_CODE (newdecl) == FUNCTION_DECL
2371       && IDENTIFIER_IMPLICIT_DECL (DECL_ASSEMBLER_NAME (newdecl)) == olddecl)
2372     /* If -traditional, avoid error for redeclaring fcn
2373        after implicit decl.  */
2374     ;
2375   else if (TREE_CODE (olddecl) == FUNCTION_DECL
2376            && DECL_ARTIFICIAL (olddecl)
2377            && (DECL_BUILT_IN (olddecl) || DECL_BUILT_IN_NONANSI (olddecl)))
2378     {
2379       /* If you declare a built-in or predefined function name as static,
2380          the old definition is overridden, but optionally warn this was a
2381          bad choice of name.  Ditto for overloads.  */
2382       if (! DECL_PUBLIC (newdecl)
2383           || (TREE_CODE (newdecl) == FUNCTION_DECL
2384               && DECL_LANGUAGE (newdecl) != DECL_LANGUAGE (olddecl)))
2385         {
2386           if (warn_shadow)
2387             cp_warning ("shadowing %s function `%#D'",
2388                         DECL_BUILT_IN (olddecl) ? "built-in" : "library",
2389                         olddecl);
2390           /* Discard the old built-in function.  */
2391           return 0;
2392         }
2393       else if (! types_match)
2394         {
2395           if (TREE_CODE (newdecl) != FUNCTION_DECL)
2396             {
2397               /* If the built-in is not ansi, then programs can override
2398                  it even globally without an error.  */
2399               if (! DECL_BUILT_IN (olddecl))
2400                 cp_warning ("library function `%#D' redeclared as non-function `%#D'",
2401                             olddecl, newdecl);
2402               else
2403                 {
2404                   cp_error ("declaration of `%#D'", newdecl);
2405                   cp_error ("conflicts with built-in declaration `%#D'",
2406                             olddecl);
2407                 }
2408               return 0;
2409             }
2410
2411           cp_warning ("declaration of `%#D'", newdecl);
2412           cp_warning ("conflicts with built-in declaration `%#D'",
2413                       olddecl);
2414         }
2415     }
2416   else if (TREE_CODE (olddecl) != TREE_CODE (newdecl))
2417     {
2418       if ((TREE_CODE (newdecl) == FUNCTION_DECL
2419            && TREE_CODE (olddecl) == TEMPLATE_DECL
2420            && ! DECL_TEMPLATE_IS_CLASS (olddecl))
2421           || (TREE_CODE (olddecl) == FUNCTION_DECL
2422               && TREE_CODE (newdecl) == TEMPLATE_DECL
2423               && ! DECL_TEMPLATE_IS_CLASS (newdecl)))
2424         return 0;
2425       
2426       cp_error ("`%#D' redeclared as different kind of symbol", newdecl);
2427       if (TREE_CODE (olddecl) == TREE_LIST)
2428         olddecl = TREE_VALUE (olddecl);
2429       cp_error_at ("previous declaration of `%#D'", olddecl);
2430
2431       /* New decl is completely inconsistent with the old one =>
2432          tell caller to replace the old one.  */
2433
2434       return 0;
2435     }
2436   else if (!types_match)
2437     {
2438       if (TREE_CODE (newdecl) == TEMPLATE_DECL)
2439         {
2440           /* The name of a class template may not be declared to refer to
2441              any other template, class, function, object, namespace, value,
2442              or type in the same scope. */
2443           if (DECL_TEMPLATE_IS_CLASS (olddecl)
2444               || DECL_TEMPLATE_IS_CLASS (newdecl))
2445             {
2446               cp_error ("declaration of template `%#D'", newdecl);
2447               cp_error_at ("conflicts with previous declaration `%#D'",
2448                            olddecl);
2449             }
2450           return 0;
2451         }
2452       if (TREE_CODE (newdecl) == FUNCTION_DECL)
2453         {
2454           if (DECL_LANGUAGE (newdecl) == lang_c
2455               && DECL_LANGUAGE (olddecl) == lang_c)
2456             {
2457               cp_error ("declaration of C function `%#D' conflicts with",
2458                         newdecl);
2459               cp_error_at ("previous declaration `%#D' here", olddecl);
2460             }
2461           else if (compparms (TYPE_ARG_TYPES (TREE_TYPE (newdecl)),
2462                               TYPE_ARG_TYPES (TREE_TYPE (olddecl)), 3))
2463             {
2464               cp_error ("new declaration `%#D'", newdecl);
2465               cp_error_at ("ambiguates old declaration `%#D'", olddecl);
2466             }
2467           else
2468             return 0;
2469         }
2470
2471       /* Already complained about this, so don't do so again.  */
2472       else if (current_class_type == NULL_TREE
2473           || IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl)) != current_class_type)
2474         {
2475           cp_error ("conflicting types for `%#D'", newdecl);
2476           cp_error_at ("previous declaration as `%#D'", olddecl);
2477         }
2478     }
2479   else
2480     {
2481       char *errmsg = redeclaration_error_message (newdecl, olddecl);
2482       if (errmsg)
2483         {
2484           cp_error (errmsg, newdecl);
2485           if (DECL_NAME (olddecl) != NULL_TREE)
2486             cp_error_at ((DECL_INITIAL (olddecl)
2487                           && current_binding_level == global_binding_level)
2488                          ? "`%#D' previously defined here"
2489                          : "`%#D' previously declared here", olddecl);
2490         }
2491       else if (TREE_CODE (olddecl) == FUNCTION_DECL
2492                && DECL_INITIAL (olddecl) != NULL_TREE
2493                && TYPE_ARG_TYPES (TREE_TYPE (olddecl)) == NULL_TREE
2494                && TYPE_ARG_TYPES (TREE_TYPE (newdecl)) != NULL_TREE)
2495         {
2496           /* Prototype decl follows defn w/o prototype.  */
2497           cp_warning_at ("prototype for `%#D'", newdecl);
2498           cp_warning_at ("follows non-prototype definition here", olddecl);
2499         }
2500       else if (TREE_CODE (olddecl) == FUNCTION_DECL
2501                && DECL_LANGUAGE (newdecl) != DECL_LANGUAGE (olddecl))
2502         {
2503           /* extern "C" int foo ();
2504              int foo () { bar (); }
2505              is OK.  */
2506           if (current_lang_stack == current_lang_base)
2507             DECL_LANGUAGE (newdecl) = DECL_LANGUAGE (olddecl);
2508           else
2509             {
2510               cp_error_at ("previous declaration of `%#D' with %L linkage",
2511                            olddecl, DECL_LANGUAGE (olddecl));
2512               cp_error ("conflicts with new declaration with %L linkage",
2513                         DECL_LANGUAGE (newdecl));
2514             }
2515         }
2516
2517       if (TREE_CODE (olddecl) == FUNCTION_DECL)
2518         {
2519           tree t1 = TYPE_ARG_TYPES (TREE_TYPE (olddecl));
2520           tree t2 = TYPE_ARG_TYPES (TREE_TYPE (newdecl));
2521           int i = 1;
2522
2523           if (TREE_CODE (TREE_TYPE (newdecl)) == METHOD_TYPE)
2524             t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2);
2525         
2526           for (; t1 && t1 != void_list_node;
2527                t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2), i++)
2528             if (TREE_PURPOSE (t1) && TREE_PURPOSE (t2))
2529               {
2530                 if (1 == simple_cst_equal (TREE_PURPOSE (t1),
2531                                            TREE_PURPOSE (t2)))
2532                   {
2533                     if (pedantic)
2534                       {
2535                         cp_pedwarn ("default argument given for parameter %d of `%#D'",
2536                                     i, newdecl);
2537                         cp_pedwarn_at ("after previous specification in `%#D'",
2538                                        olddecl);
2539                       }
2540                   }
2541                 else
2542                   {
2543                     cp_error ("default argument given for parameter %d of `%#D'",
2544                               i, newdecl);
2545                     cp_error_at ("conflicts with previous specification in `%#D'",
2546                                  olddecl);
2547                   }
2548               }
2549
2550           if (DECL_THIS_INLINE (newdecl) && ! DECL_THIS_INLINE (olddecl)
2551               && TREE_ADDRESSABLE (olddecl))
2552             cp_pedwarn ("`%#D' was used before it was declared inline",
2553                         newdecl);
2554         }
2555       /* These bits are logically part of the type for non-functions.  */
2556       else if (TREE_READONLY (newdecl) != TREE_READONLY (olddecl)
2557                || TREE_THIS_VOLATILE (newdecl) != TREE_THIS_VOLATILE (olddecl))
2558         {
2559           cp_pedwarn ("type qualifiers for `%#D'", newdecl);
2560           cp_pedwarn_at ("conflict with previous decl `%#D'", olddecl);
2561         }
2562     }
2563
2564   /* If new decl is `static' and an `extern' was seen previously,
2565      warn about it.  */
2566   warn_extern_redeclared_static (newdecl, olddecl);
2567
2568   /* We have committed to returning 1 at this point. */
2569   if (TREE_CODE (newdecl) == FUNCTION_DECL)
2570     {
2571       /* Now that functions must hold information normally held
2572          by field decls, there is extra work to do so that
2573          declaration information does not get destroyed during
2574          definition.  */
2575       if (DECL_VINDEX (olddecl))
2576         DECL_VINDEX (newdecl) = DECL_VINDEX (olddecl);
2577       if (DECL_CONTEXT (olddecl))
2578         DECL_CONTEXT (newdecl) = DECL_CONTEXT (olddecl);
2579       if (DECL_CLASS_CONTEXT (olddecl))
2580         DECL_CLASS_CONTEXT (newdecl) = DECL_CLASS_CONTEXT (olddecl);
2581       if (DECL_CHAIN (newdecl) == NULL_TREE)
2582         DECL_CHAIN (newdecl) = DECL_CHAIN (olddecl);
2583       if (DECL_NEXT_METHOD (newdecl) == NULL_TREE)
2584         DECL_NEXT_METHOD (newdecl) = DECL_NEXT_METHOD (olddecl);
2585       if (DECL_PENDING_INLINE_INFO (newdecl) == (struct pending_inline *)0)
2586         DECL_PENDING_INLINE_INFO (newdecl) = DECL_PENDING_INLINE_INFO (olddecl);
2587       DECL_STATIC_CONSTRUCTOR (newdecl) |= DECL_STATIC_CONSTRUCTOR (olddecl);
2588       DECL_STATIC_DESTRUCTOR (newdecl) |= DECL_STATIC_DESTRUCTOR (olddecl);
2589       DECL_ABSTRACT_VIRTUAL_P (newdecl) |= DECL_ABSTRACT_VIRTUAL_P (olddecl);
2590     }
2591
2592   /* Deal with C++: must preserve virtual function table size.  */
2593   if (TREE_CODE (olddecl) == TYPE_DECL)
2594     {
2595       register tree newtype = TREE_TYPE (newdecl);
2596       register tree oldtype = TREE_TYPE (olddecl);
2597
2598       DECL_NESTED_TYPENAME (newdecl) = DECL_NESTED_TYPENAME (olddecl);
2599
2600       if (newtype != error_mark_node && oldtype != error_mark_node
2601           && TYPE_LANG_SPECIFIC (newtype) && TYPE_LANG_SPECIFIC (oldtype))
2602         {
2603           CLASSTYPE_VSIZE (newtype) = CLASSTYPE_VSIZE (oldtype);
2604           CLASSTYPE_FRIEND_CLASSES (newtype)
2605             = CLASSTYPE_FRIEND_CLASSES (oldtype);
2606         }
2607 #if 0
2608       /* why assert here?  Just because debugging information is
2609          messed up? (mrs) */
2610       /* it happens on something like:
2611                 typedef struct Thing {
2612                         Thing();
2613                         int     x;
2614                 } Thing;
2615       */
2616       my_friendly_assert (DECL_IGNORED_P (olddecl) == DECL_IGNORED_P (newdecl),
2617                           139);
2618 #endif
2619     }
2620
2621   /* Special handling ensues if new decl is a function definition.  */
2622   new_defines_function = (TREE_CODE (newdecl) == FUNCTION_DECL
2623                           && DECL_INITIAL (newdecl) != NULL_TREE);
2624
2625   /* Optionally warn about more than one declaration for the same name,
2626      but don't warn about a function declaration followed by a definition.  */
2627   if (warn_redundant_decls
2628       && ! DECL_ARTIFICIAL (olddecl)
2629       && !(new_defines_function && DECL_INITIAL (olddecl) == NULL_TREE)
2630       /* Don't warn about extern decl followed by (tentative) definition.  */
2631       && !(DECL_EXTERNAL (olddecl) && ! DECL_EXTERNAL (newdecl)))
2632     {
2633       cp_warning ("redundant redeclaration of `%D' in same scope", newdecl);
2634       cp_warning_at ("previous declaration of `%D'", olddecl);
2635     }
2636
2637   /* Copy all the DECL_... slots specified in the new decl
2638      except for any that we copy here from the old type.  */
2639
2640   if (types_match)
2641     {
2642       /* Automatically handles default parameters.  */
2643       tree oldtype = TREE_TYPE (olddecl);
2644       tree newtype;
2645
2646       /* Make sure we put the new type in the same obstack as the old one.  */
2647       if (oldtype)
2648         push_obstacks (TYPE_OBSTACK (oldtype), TYPE_OBSTACK (oldtype));
2649       else
2650         {
2651           push_obstacks_nochange ();
2652           end_temporary_allocation ();
2653         }
2654
2655       /* Merge the data types specified in the two decls.  */
2656       newtype = common_type (TREE_TYPE (newdecl), TREE_TYPE (olddecl));
2657
2658       if (TREE_CODE (newdecl) == VAR_DECL)
2659         DECL_THIS_EXTERN (newdecl) |= DECL_THIS_EXTERN (olddecl);
2660       /* Do this after calling `common_type' so that default
2661          parameters don't confuse us.  */
2662       else if (TREE_CODE (newdecl) == FUNCTION_DECL
2663           && (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl))
2664               != TYPE_RAISES_EXCEPTIONS (TREE_TYPE (olddecl))))
2665         {
2666           tree ctype = NULL_TREE;
2667           ctype = DECL_CLASS_CONTEXT (newdecl);
2668           TREE_TYPE (newdecl) = build_exception_variant (ctype, newtype,
2669                                                          TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl)));
2670           TREE_TYPE (olddecl) = build_exception_variant (ctype, newtype,
2671                                                          TYPE_RAISES_EXCEPTIONS (oldtype));
2672
2673           if (! compexcepttypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl), 0))
2674             {
2675               cp_error ("declaration of `%D' throws different exceptions...",
2676                         newdecl);
2677               cp_error_at ("...from previous declaration here", olddecl);
2678             }
2679         }
2680       TREE_TYPE (newdecl) = TREE_TYPE (olddecl) = newtype;
2681
2682       /* Lay the type out, unless already done.  */
2683       if (oldtype != TREE_TYPE (newdecl)
2684           && TREE_TYPE (newdecl) != error_mark_node)
2685         layout_type (TREE_TYPE (newdecl));
2686
2687       if (TREE_CODE (newdecl) == VAR_DECL
2688           || TREE_CODE (newdecl) == PARM_DECL
2689           || TREE_CODE (newdecl) == RESULT_DECL
2690           || TREE_CODE (newdecl) == FIELD_DECL
2691           || TREE_CODE (newdecl) == TYPE_DECL)
2692         layout_decl (newdecl, 0);
2693
2694       /* Merge the type qualifiers.  */
2695       if (TREE_READONLY (newdecl))
2696         TREE_READONLY (olddecl) = 1;
2697       if (TREE_THIS_VOLATILE (newdecl))
2698         TREE_THIS_VOLATILE (olddecl) = 1;
2699
2700       /* Merge the initialization information.  */
2701       if (DECL_INITIAL (newdecl) == NULL_TREE
2702           && DECL_INITIAL (olddecl) != NULL_TREE)
2703         {
2704           DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
2705           DECL_SOURCE_FILE (newdecl) = DECL_SOURCE_FILE (olddecl);
2706           DECL_SOURCE_LINE (newdecl) = DECL_SOURCE_LINE (olddecl);
2707         }
2708
2709       /* Merge the section attribute.
2710          We want to issue an error if the sections conflict but that must be
2711          done later in decl_attributes since we are called before attributes
2712          are assigned.  */
2713       if (DECL_SECTION_NAME (newdecl) == NULL_TREE)
2714         DECL_SECTION_NAME (newdecl) = DECL_SECTION_NAME (olddecl);
2715
2716       /* Keep the old rtl since we can safely use it, unless it's the
2717          call to abort() used for abstract virtuals.  */
2718       if ((DECL_LANG_SPECIFIC (olddecl)
2719            && !DECL_ABSTRACT_VIRTUAL_P (olddecl))
2720           || DECL_RTL (olddecl) != DECL_RTL (abort_fndecl))
2721         DECL_RTL (newdecl) = DECL_RTL (olddecl);
2722
2723       pop_obstacks ();
2724     }
2725   /* If cannot merge, then use the new type and qualifiers,
2726      and don't preserve the old rtl.  */
2727   else
2728     {
2729       /* Clean out any memory we had of the old declaration.  */
2730       tree oldstatic = value_member (olddecl, static_aggregates);
2731       if (oldstatic)
2732         TREE_VALUE (oldstatic) = error_mark_node;
2733
2734       TREE_TYPE (olddecl) = TREE_TYPE (newdecl);
2735       TREE_READONLY (olddecl) = TREE_READONLY (newdecl);
2736       TREE_THIS_VOLATILE (olddecl) = TREE_THIS_VOLATILE (newdecl);
2737       TREE_SIDE_EFFECTS (olddecl) = TREE_SIDE_EFFECTS (newdecl);
2738     }
2739
2740   /* Merge the storage class information.  */
2741   DECL_WEAK (newdecl) |= DECL_WEAK (olddecl);
2742   TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl);
2743   TREE_STATIC (olddecl) = TREE_STATIC (newdecl) |= TREE_STATIC (olddecl);
2744   if (! DECL_EXTERNAL (olddecl))
2745     DECL_EXTERNAL (newdecl) = 0;
2746
2747   if (TREE_CODE (newdecl) == FUNCTION_DECL)
2748     {
2749       DECL_C_STATIC (newdecl) = DECL_C_STATIC (olddecl);
2750       DECL_INTERFACE_KNOWN (newdecl) |= DECL_INTERFACE_KNOWN (olddecl);
2751       DECL_NOT_REALLY_EXTERN (newdecl) |= DECL_NOT_REALLY_EXTERN (olddecl);
2752     }
2753
2754   if (TREE_CODE (newdecl) == FUNCTION_DECL)
2755     {
2756       DECL_THIS_INLINE (newdecl) |= DECL_THIS_INLINE (olddecl);
2757
2758       /* If either decl says `inline', this fn is inline, unless its
2759          definition was passed already.  */
2760       if (DECL_INLINE (newdecl) && DECL_INITIAL (olddecl) == NULL_TREE)
2761         DECL_INLINE (olddecl) = 1;
2762       DECL_INLINE (newdecl) = DECL_INLINE (olddecl);
2763
2764       if (! types_match)
2765         {
2766           DECL_LANGUAGE (olddecl) = DECL_LANGUAGE (newdecl);
2767           DECL_ASSEMBLER_NAME (olddecl) = DECL_ASSEMBLER_NAME (newdecl);
2768           DECL_ARGUMENTS (olddecl) = DECL_ARGUMENTS (newdecl);
2769           DECL_RESULT (olddecl) = DECL_RESULT (newdecl);
2770           DECL_RTL (olddecl) = DECL_RTL (newdecl);
2771         }
2772       if (new_defines_function)
2773         /* If defining a function declared with other language
2774            linkage, use the previously declared language linkage.  */
2775         DECL_LANGUAGE (newdecl) = DECL_LANGUAGE (olddecl);
2776       else
2777         {
2778           /* If redeclaring a builtin function, and not a definition,
2779              it stays built in.  */
2780           if (DECL_BUILT_IN (olddecl))
2781             {
2782               DECL_BUILT_IN (newdecl) = 1;
2783               DECL_FUNCTION_CODE (newdecl) = DECL_FUNCTION_CODE (olddecl);
2784               /* If we're keeping the built-in definition, keep the rtl,
2785                  regardless of declaration matches.  */
2786               DECL_RTL (newdecl) = DECL_RTL (olddecl);
2787             }
2788           else
2789             DECL_FRAME_SIZE (newdecl) = DECL_FRAME_SIZE (olddecl);
2790
2791           DECL_RESULT (newdecl) = DECL_RESULT (olddecl);
2792           if ((DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl)))
2793             /* Previously saved insns go together with
2794                the function's previous definition.  */
2795             DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
2796           /* Don't clear out the arguments if we're redefining a function.  */
2797           if (DECL_ARGUMENTS (olddecl))
2798             DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl);
2799         }
2800       if (DECL_LANG_SPECIFIC (olddecl))
2801         DECL_MAIN_VARIANT (newdecl) = DECL_MAIN_VARIANT (olddecl);
2802     }
2803
2804   if (TREE_CODE (newdecl) == NAMESPACE_DECL)
2805     {
2806       NAMESPACE_LEVEL (newdecl) = NAMESPACE_LEVEL (olddecl);
2807     }
2808
2809   if (TREE_CODE (newdecl) == TEMPLATE_DECL)
2810     {
2811       if (DECL_TEMPLATE_INFO (olddecl)->length)
2812         DECL_TEMPLATE_INFO (newdecl) = DECL_TEMPLATE_INFO (olddecl);
2813       DECL_TEMPLATE_MEMBERS (newdecl) = DECL_TEMPLATE_MEMBERS (olddecl);
2814       DECL_TEMPLATE_INSTANTIATIONS (newdecl)
2815         = DECL_TEMPLATE_INSTANTIATIONS (olddecl);
2816       if (DECL_CHAIN (newdecl) == NULL_TREE)
2817         DECL_CHAIN (newdecl) = DECL_CHAIN (olddecl);
2818     }
2819   
2820   /* Now preserve various other info from the definition.  */
2821   TREE_ADDRESSABLE (newdecl) = TREE_ADDRESSABLE (olddecl);
2822   TREE_ASM_WRITTEN (newdecl) = TREE_ASM_WRITTEN (olddecl);
2823   DECL_COMMON (newdecl) = DECL_COMMON (olddecl);
2824   DECL_ASSEMBLER_NAME (newdecl) = DECL_ASSEMBLER_NAME (olddecl);
2825
2826   /* Don't really know how much of the language-specific
2827      values we should copy from old to new.  */
2828   if (DECL_LANG_SPECIFIC (olddecl))
2829     {
2830       DECL_IN_AGGR_P (newdecl) = DECL_IN_AGGR_P (olddecl);
2831       DECL_ACCESS (newdecl) = DECL_ACCESS (olddecl);
2832       DECL_NONCONVERTING_P (newdecl) = DECL_NONCONVERTING_P (olddecl);
2833     }
2834
2835   if (TREE_CODE (newdecl) == FUNCTION_DECL)
2836     {
2837       int function_size;
2838       struct lang_decl *ol = DECL_LANG_SPECIFIC (olddecl);
2839       struct lang_decl *nl = DECL_LANG_SPECIFIC (newdecl);
2840
2841       function_size = sizeof (struct tree_decl);
2842
2843       bcopy ((char *) newdecl + sizeof (struct tree_common),
2844              (char *) olddecl + sizeof (struct tree_common),
2845              function_size - sizeof (struct tree_common));
2846
2847       /* Can we safely free the storage used by newdecl?  */
2848
2849 #define ROUND(x) ((x + obstack_alignment_mask (&permanent_obstack)) \
2850                   & ~ obstack_alignment_mask (&permanent_obstack))
2851
2852       if ((char *)newdecl + ROUND (function_size)
2853           + ROUND (sizeof (struct lang_decl))
2854           == obstack_next_free (&permanent_obstack))
2855         {
2856           DECL_MAIN_VARIANT (newdecl) = olddecl;
2857           DECL_LANG_SPECIFIC (olddecl) = ol;
2858           bcopy ((char *)nl, (char *)ol, sizeof (struct lang_decl));
2859
2860           obstack_free (&permanent_obstack, newdecl);
2861         }
2862       else if (LANG_DECL_PERMANENT (ol))
2863         {
2864           if (DECL_MAIN_VARIANT (olddecl) == olddecl)
2865             {
2866               /* Save these lang_decls that would otherwise be lost.  */
2867               extern tree free_lang_decl_chain;
2868               tree free_lang_decl = (tree) ol;
2869               TREE_CHAIN (free_lang_decl) = free_lang_decl_chain;
2870               free_lang_decl_chain = free_lang_decl;
2871             }
2872           else
2873             {
2874               /* Storage leak.  */
2875             }
2876         }
2877     }
2878   else
2879     {
2880       bcopy ((char *) newdecl + sizeof (struct tree_common),
2881              (char *) olddecl + sizeof (struct tree_common),
2882              sizeof (struct tree_decl) - sizeof (struct tree_common)
2883              + tree_code_length [(int)TREE_CODE (newdecl)] * sizeof (char *));
2884     }
2885
2886   DECL_UID (olddecl) = olddecl_uid;
2887   if (olddecl_friend)
2888     DECL_FRIEND_P (olddecl) = 1;
2889
2890   return 1;
2891 }
2892
2893 /* Record a decl-node X as belonging to the current lexical scope.
2894    Check for errors (such as an incompatible declaration for the same
2895    name already seen in the same scope).
2896
2897    Returns either X or an old decl for the same name.
2898    If an old decl is returned, it may have been smashed
2899    to agree with what X says.  */
2900
2901 tree
2902 pushdecl (x)
2903      tree x;
2904 {
2905   register tree t;
2906 #if 0 /* not yet, should get fixed properly later */
2907   register tree name;
2908 #else
2909   register tree name = DECL_ASSEMBLER_NAME (x);
2910 #endif
2911   register struct binding_level *b = current_binding_level;
2912
2913 #if 0
2914   static int nglobals; int len;
2915
2916   len = list_length (global_binding_level->names);
2917   if (len < nglobals)
2918     my_friendly_abort (8);
2919   else if (len > nglobals)
2920     nglobals = len;
2921 #endif
2922
2923   if (x != current_function_decl
2924       /* Don't change DECL_CONTEXT of virtual methods.  */
2925       && (TREE_CODE (x) != FUNCTION_DECL || !DECL_VIRTUAL_P (x))
2926       && ! DECL_CONTEXT (x))
2927     DECL_CONTEXT (x) = current_function_decl;
2928   /* A local declaration for a function doesn't constitute nesting.  */
2929   if (TREE_CODE (x) == FUNCTION_DECL && DECL_INITIAL (x) == 0)
2930     DECL_CONTEXT (x) = 0;
2931
2932 #if 0 /* not yet, should get fixed properly later */
2933   /* For functions and class static data, we currently look up the encoded
2934      form of the name.  For types, we want the real name.  The former will
2935      probably be changed soon, according to MDT.  */
2936   if (TREE_CODE (x) == FUNCTION_DECL || TREE_CODE (x) == VAR_DECL)
2937     name = DECL_ASSEMBLER_NAME (x);
2938   else
2939     name = DECL_NAME (x);
2940 #else
2941   /* Type are looked up using the DECL_NAME, as that is what the rest of the
2942      compiler wants to use. */
2943   if (TREE_CODE (x) == TYPE_DECL || TREE_CODE (x) == VAR_DECL
2944       || TREE_CODE (x) == NAMESPACE_DECL)
2945     name = DECL_NAME (x);
2946 #endif
2947
2948   if (name)
2949     {
2950       char *file;
2951       int line;
2952
2953       t = lookup_name_current_level (name);
2954       if (t == error_mark_node)
2955         {
2956           /* error_mark_node is 0 for a while during initialization!  */
2957           t = NULL_TREE;
2958           cp_error_at ("`%#D' used prior to declaration", x);
2959         }
2960
2961       else if (t != NULL_TREE)
2962         {
2963           if (TREE_CODE (t) == PARM_DECL)
2964             {
2965               if (DECL_CONTEXT (t) == NULL_TREE)
2966                 fatal ("parse errors have confused me too much");
2967             }
2968           file = DECL_SOURCE_FILE (t);
2969           line = DECL_SOURCE_LINE (t);
2970
2971           if (((TREE_CODE (x) == FUNCTION_DECL && DECL_LANGUAGE (x) == lang_c)
2972                || (TREE_CODE (x) == TEMPLATE_DECL
2973                    && ! DECL_TEMPLATE_IS_CLASS (x)))
2974               && is_overloaded_fn (t))
2975             /* don't do anything just yet */;
2976           else if (t == wchar_decl_node)
2977             {
2978               if (pedantic && ! DECL_IN_SYSTEM_HEADER (x))
2979                 cp_pedwarn ("redeclaration of wchar_t as `%T'", TREE_TYPE (x));
2980
2981               /* Throw away the redeclaration.  */
2982               return t;
2983             }
2984           else if (TREE_CODE (t) != TREE_CODE (x))
2985             {
2986               if ((TREE_CODE (t) == TYPE_DECL && DECL_ARTIFICIAL (t))
2987                   || (TREE_CODE (x) == TYPE_DECL && DECL_ARTIFICIAL (x)))
2988                 {
2989                   /* We do nothing special here, because C++ does such nasty
2990                      things with TYPE_DECLs.  Instead, just let the TYPE_DECL
2991                      get shadowed, and know that if we need to find a TYPE_DECL
2992                      for a given name, we can look in the IDENTIFIER_TYPE_VALUE
2993                      slot of the identifier.  */
2994                   ;
2995                 }
2996               else if (duplicate_decls (x, t))
2997                 return t;
2998             }
2999           else if (duplicate_decls (x, t))
3000             {
3001 #if 0
3002               /* This is turned off until I have time to do it right (bpk).  */
3003
3004               /* Also warn if they did a prototype with `static' on it, but
3005                  then later left the `static' off.  */
3006               if (! TREE_PUBLIC (name) && TREE_PUBLIC (x))
3007                 {
3008                   if (DECL_LANG_SPECIFIC (t) && DECL_FRIEND_P (t))
3009                     return t;
3010
3011                   if (extra_warnings)
3012                     {
3013                       cp_warning ("`static' missing from declaration of `%D'",
3014                                   t);
3015                       warning_with_file_and_line (file, line,
3016                                                   "previous declaration of `%s'",
3017                                                   decl_as_string (t, 0));
3018                     }
3019
3020                   /* Now fix things so it'll do what they expect.  */
3021                   if (current_function_decl)
3022                     TREE_PUBLIC (current_function_decl) = 0;
3023                 }
3024               /* Due to interference in memory reclamation (X may be
3025                  obstack-deallocated at this point), we must guard against
3026                  one really special case.  [jason: This should be handled
3027                  by start_function]  */
3028               if (current_function_decl == x)
3029                 current_function_decl = t;
3030 #endif
3031               if (TREE_CODE (t) == TYPE_DECL)
3032                 SET_IDENTIFIER_TYPE_VALUE (name, TREE_TYPE (t));
3033
3034               return t;
3035             }
3036         }
3037
3038       if (TREE_CODE (x) == FUNCTION_DECL && ! DECL_FUNCTION_MEMBER_P (x))
3039         {
3040           t = push_overloaded_decl (x, 1);
3041           if (t != x || DECL_LANGUAGE (x) == lang_c)
3042             return t;
3043         }
3044       else if (TREE_CODE (x) == TEMPLATE_DECL && ! DECL_TEMPLATE_IS_CLASS (x))
3045         return push_overloaded_decl (x, 0);
3046
3047       /* If declaring a type as a typedef, and the type has no known
3048          typedef name, install this TYPE_DECL as its typedef name.  */
3049       if (TREE_CODE (x) == TYPE_DECL)
3050         {
3051           tree type = TREE_TYPE (x);
3052           tree name = (type != error_mark_node) ? TYPE_NAME (type) : x;
3053
3054           if (name == NULL_TREE || TREE_CODE (name) != TYPE_DECL)
3055             {
3056               /* If these are different names, and we're at the global
3057                  binding level, make two equivalent definitions.  */
3058               name = x;
3059               if (global_bindings_p ())
3060                 TYPE_NAME (type) = x;
3061             }
3062           else
3063             {
3064               tree tname = DECL_NAME (name);
3065
3066               /* This is a disgusting kludge for dealing with UPTs.  */
3067               if (global_bindings_p () && ANON_AGGRNAME_P (tname))
3068                 {
3069                   /* do gratuitous C++ typedefing, and make sure that
3070                      we access this type either through TREE_TYPE field
3071                      or via the tags list.  */
3072                   TYPE_NAME (TREE_TYPE (x)) = x;
3073                   pushtag (tname, TREE_TYPE (x), 0);
3074                 }
3075             }
3076           my_friendly_assert (TREE_CODE (name) == TYPE_DECL, 140);
3077
3078           /* Don't set nested_typename on template type parms, for instance.
3079              Any artificial decls that need DECL_NESTED_TYPENAME will have it
3080              set in pushtag.  */
3081           if (! DECL_NESTED_TYPENAME (x) && ! DECL_ARTIFICIAL (x))
3082             set_nested_typename (x, current_class_name, DECL_NAME (x), type);
3083
3084           if (type != error_mark_node
3085               && TYPE_NAME (type)
3086               && TYPE_IDENTIFIER (type))
3087             set_identifier_type_value_with_scope (DECL_NAME (x), type, b);
3088         }
3089
3090       /* Multiple external decls of the same identifier ought to match.
3091
3092          We get warnings about inline functions where they are defined.
3093          We get warnings about other functions from push_overloaded_decl.
3094          
3095          Avoid duplicate warnings where they are used.  */
3096       if (TREE_PUBLIC (x) && TREE_CODE (x) != FUNCTION_DECL)
3097         {
3098           tree decl;
3099
3100           if (IDENTIFIER_GLOBAL_VALUE (name) != NULL_TREE
3101               && (DECL_EXTERNAL (IDENTIFIER_GLOBAL_VALUE (name))
3102                   || TREE_PUBLIC (IDENTIFIER_GLOBAL_VALUE (name))))
3103             decl = IDENTIFIER_GLOBAL_VALUE (name);
3104           else
3105             decl = NULL_TREE;
3106
3107           if (decl
3108               /* If different sort of thing, we already gave an error.  */
3109               && TREE_CODE (decl) == TREE_CODE (x)
3110               && ! comptypes (TREE_TYPE (x), TREE_TYPE (decl), 1))
3111             {
3112               cp_pedwarn ("type mismatch with previous external decl", x);
3113               cp_pedwarn_at ("previous external decl of `%#D'", decl);
3114             }
3115         }
3116
3117       /* In PCC-compatibility mode, extern decls of vars with no current decl
3118          take effect at top level no matter where they are.  */
3119       if (flag_traditional && DECL_EXTERNAL (x)
3120           && lookup_name (name, 0) == NULL_TREE)
3121         b = global_binding_level;
3122
3123       /* This name is new in its binding level.
3124          Install the new declaration and return it.  */
3125       if (b == global_binding_level)
3126         {
3127           /* Install a global value.  */
3128
3129           /* If the first global decl has external linkage,
3130              warn if we later see static one.  */
3131           if (IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE && DECL_PUBLIC (x))
3132             TREE_PUBLIC (name) = 1;
3133
3134           /* Don't install an artificial TYPE_DECL if we already have
3135              another _DECL with that name.  */
3136           if (TREE_CODE (x) != TYPE_DECL
3137               || t == NULL_TREE
3138               || ! DECL_ARTIFICIAL (x))
3139             IDENTIFIER_GLOBAL_VALUE (name) = x;
3140
3141           /* Don't forget if the function was used via an implicit decl.  */
3142           if (IDENTIFIER_IMPLICIT_DECL (name)
3143               && TREE_USED (IDENTIFIER_IMPLICIT_DECL (name)))
3144             TREE_USED (x) = 1;
3145
3146           /* Don't forget if its address was taken in that way.  */
3147           if (IDENTIFIER_IMPLICIT_DECL (name)
3148               && TREE_ADDRESSABLE (IDENTIFIER_IMPLICIT_DECL (name)))
3149             TREE_ADDRESSABLE (x) = 1;
3150
3151           /* Warn about mismatches against previous implicit decl.  */
3152           if (IDENTIFIER_IMPLICIT_DECL (name) != NULL_TREE
3153               /* If this real decl matches the implicit, don't complain.  */
3154               && ! (TREE_CODE (x) == FUNCTION_DECL
3155                     && TREE_TYPE (TREE_TYPE (x)) == integer_type_node))
3156             cp_warning
3157               ("`%D' was previously implicitly declared to return `int'", x);
3158
3159           /* If new decl is `static' and an `extern' was seen previously,
3160              warn about it.  */
3161           if (x != NULL_TREE && t != NULL_TREE && decls_match (x, t))
3162             warn_extern_redeclared_static (x, t);
3163         }
3164       else
3165         {
3166           /* Here to install a non-global value.  */
3167           tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
3168           tree oldglobal = IDENTIFIER_GLOBAL_VALUE (name);
3169
3170           /* Don't install an artificial TYPE_DECL if we already have
3171              another _DECL with that name.  */
3172           if (TREE_CODE (x) != TYPE_DECL
3173               || t == NULL_TREE
3174               || ! DECL_ARTIFICIAL (x))
3175             {
3176               b->shadowed = tree_cons (name, oldlocal, b->shadowed);
3177               IDENTIFIER_LOCAL_VALUE (name) = x;
3178             }
3179
3180           /* If this is a TYPE_DECL, push it into the type value slot.  */
3181           if (TREE_CODE (x) == TYPE_DECL)
3182             set_identifier_type_value_with_scope (name, TREE_TYPE (x), b);
3183
3184           /* Clear out any TYPE_DECL shadowed by a namespace so that
3185              we won't think this is a type.  The C struct hack doesn't
3186              go through namespaces.  */
3187           if (TREE_CODE (x) == NAMESPACE_DECL)
3188             set_identifier_type_value_with_scope (name, NULL_TREE, b);
3189
3190           /* If this is an extern function declaration, see if we
3191              have a global definition or declaration for the function.  */
3192           if (oldlocal == NULL_TREE
3193               && DECL_EXTERNAL (x)
3194               && oldglobal != NULL_TREE
3195               && TREE_CODE (x) == FUNCTION_DECL
3196               && TREE_CODE (oldglobal) == FUNCTION_DECL)
3197             {
3198               /* We have one.  Their types must agree.  */
3199               if (decls_match (x, oldglobal))
3200                 /* OK */;
3201               else
3202                 {
3203                   cp_warning ("extern declaration of `%#D' doesn't match", x);
3204                   cp_warning_at ("global declaration `%#D'", oldglobal);
3205                 }
3206             }
3207           /* If we have a local external declaration,
3208              and no file-scope declaration has yet been seen,
3209              then if we later have a file-scope decl it must not be static.  */
3210           if (oldlocal == NULL_TREE
3211               && oldglobal == NULL_TREE
3212               && DECL_EXTERNAL (x)
3213               && TREE_PUBLIC (x))
3214             {
3215               TREE_PUBLIC (name) = 1;
3216             }
3217
3218           if (DECL_FROM_INLINE (x))
3219             /* Inline decls shadow nothing.  */;
3220
3221           /* Warn if shadowing an argument at the top level of the body.  */
3222           else if (oldlocal != NULL_TREE && !DECL_EXTERNAL (x)
3223               && TREE_CODE (oldlocal) == PARM_DECL
3224               && TREE_CODE (x) != PARM_DECL)
3225             {
3226               /* Go to where the parms should be and see if we
3227                  find them there.  */
3228               struct binding_level *b = current_binding_level->level_chain;
3229
3230               if (cleanup_label)
3231                 b = b->level_chain;
3232
3233               /* ARM $8.3 */
3234               if (b->parm_flag == 1)
3235                 cp_error ("declaration of `%#D' shadows a parameter", name);
3236             }
3237           /* Maybe warn if shadowing something else.  */
3238           else if (warn_shadow && !DECL_EXTERNAL (x)
3239                    /* No shadow warnings for internally generated vars.  */
3240                    && ! DECL_ARTIFICIAL (x)
3241                    /* No shadow warnings for vars made for inlining.  */
3242                    && ! DECL_FROM_INLINE (x))
3243             {
3244               char *warnstring = NULL;
3245
3246               if (oldlocal != NULL_TREE && TREE_CODE (oldlocal) == PARM_DECL)
3247                 warnstring = "declaration of `%s' shadows a parameter";
3248               else if (IDENTIFIER_CLASS_VALUE (name) != NULL_TREE
3249                        && !TREE_STATIC (name))
3250                 warnstring = "declaration of `%s' shadows a member of `this'";
3251               else if (oldlocal != NULL_TREE)
3252                 warnstring = "declaration of `%s' shadows previous local";
3253               else if (oldglobal != NULL_TREE)
3254                 warnstring = "declaration of `%s' shadows global declaration";
3255
3256               if (warnstring)
3257                 warning (warnstring, IDENTIFIER_POINTER (name));
3258             }
3259         }
3260
3261       if (TREE_CODE (x) == FUNCTION_DECL)
3262         {
3263           /* This is probably the wrong place to check this, but it has to
3264              come after the call to duplicate_decls.  */
3265           tree arg = TYPE_ARG_TYPES (TREE_TYPE (x));
3266           int saw_def = 0, i = 1;
3267           for (; arg && arg != void_list_node; arg = TREE_CHAIN (arg), ++i)
3268             {
3269               if (TREE_PURPOSE (arg))
3270                 saw_def = 1;
3271               else if (saw_def)
3272                 {
3273                   cp_error ("default argument missing for parameter %d of `%#D'",
3274                             i, x);
3275                   break;
3276                 }
3277             }
3278         }
3279
3280       /* Keep count of variables in this level with incomplete type.  */
3281       if (TREE_CODE (x) != TEMPLATE_DECL
3282           && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE
3283           && PROMOTES_TO_AGGR_TYPE (TREE_TYPE (x), ARRAY_TYPE))
3284         {
3285           if (++b->n_incomplete == 0)
3286             error ("too many incomplete variables at this point");
3287         }
3288
3289       /* Keep count of variables in this level with incomplete type.  */
3290       /* RTTI TD entries are created while defining the type_info.  */
3291       if (TREE_CODE (x) == VAR_DECL
3292           && TREE_TYPE (x) != error_mark_node
3293           && TYPE_LANG_SPECIFIC (TREE_TYPE (x))
3294           && TYPE_BEING_DEFINED (TREE_TYPE (x)))
3295         {
3296           if (++b->n_incomplete == 0)
3297             error ("too many incomplete variables at this point");
3298         }
3299     }
3300
3301   /* Put decls on list in reverse order.
3302      We will reverse them later if necessary.  */
3303   TREE_CHAIN (x) = b->names;
3304   b->names = x;
3305   if (! (b != global_binding_level || TREE_PERMANENT (x)))
3306     my_friendly_abort (124);
3307
3308   return x;
3309 }
3310
3311 /* Same as pushdecl, but define X in binding-level LEVEL. */
3312
3313 static tree
3314 pushdecl_with_scope (x, level)
3315      tree x;
3316      struct binding_level *level;
3317 {
3318   register struct binding_level *b = current_binding_level;
3319
3320   current_binding_level = level;
3321   x = pushdecl (x);
3322   current_binding_level = b;
3323   return x;
3324 }
3325
3326 /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL,
3327    if appropriate.  */
3328 tree
3329 pushdecl_top_level (x)
3330      tree x;
3331 {
3332   register struct binding_level *b = inner_binding_level;
3333   register tree t = pushdecl_with_scope (x, global_binding_level);
3334
3335   /* Now, the type_shadowed stack may screw us.  Munge it so it does
3336      what we want.  */
3337   if (TREE_CODE (x) == TYPE_DECL)
3338     {
3339       tree name = DECL_NAME (x);
3340       tree newval;
3341       tree *ptr = (tree *)0;
3342       for (; b != global_binding_level; b = b->level_chain)
3343         {
3344           tree shadowed = b->type_shadowed;
3345           for (; shadowed; shadowed = TREE_CHAIN (shadowed))
3346             if (TREE_PURPOSE (shadowed) == name)
3347               {
3348                 ptr = &TREE_VALUE (shadowed);
3349                 /* Can't break out of the loop here because sometimes
3350                    a binding level will have duplicate bindings for
3351                    PT names.  It's gross, but I haven't time to fix it.  */
3352               }
3353         }
3354       newval = TREE_TYPE (x);
3355       if (ptr == (tree *)0)
3356         {
3357           /* @@ This shouldn't be needed.  My test case "zstring.cc" trips
3358              up here if this is changed to an assertion.  --KR  */
3359           SET_IDENTIFIER_TYPE_VALUE (name, newval);
3360         }
3361       else
3362         {
3363 #if 0
3364           /* Disabled this 11/10/92, since there are many cases which
3365              behave just fine when *ptr doesn't satisfy either of these.
3366              For example, nested classes declared as friends of their enclosing
3367              class will not meet this criteria.  (bpk) */
3368           my_friendly_assert (*ptr == NULL_TREE || *ptr == newval, 141);
3369 #endif
3370           *ptr = newval;
3371         }
3372     }
3373   return t;
3374 }
3375
3376 /* Like push_overloaded_decl, only it places X in GLOBAL_BINDING_LEVEL,
3377    if appropriate.  */
3378 void
3379 push_overloaded_decl_top_level (x, forget)
3380      tree x;
3381      int forget;
3382 {
3383   struct binding_level *b = current_binding_level;
3384
3385   current_binding_level = global_binding_level;
3386   push_overloaded_decl (x, forget);
3387   current_binding_level = b;
3388 }
3389
3390 /* Make the declaration of X appear in CLASS scope.  */
3391 tree
3392 pushdecl_class_level (x)
3393      tree x;
3394 {
3395   /* Don't use DECL_ASSEMBLER_NAME here!  Everything that looks in class
3396      scope looks for the pre-mangled name.  */
3397   register tree name = DECL_NAME (x);
3398
3399   if (name)
3400     {
3401       if (TYPE_BEING_DEFINED (current_class_type))
3402         {
3403           /* Check for inconsistent use of this name in the class body.
3404              Types, enums, and static vars are checked here; other
3405              members are checked in finish_struct.  */
3406           tree icv = IDENTIFIER_CLASS_VALUE (name);
3407
3408           if (icv
3409               /* Don't complain about inherited names.  */
3410               && id_in_current_class (name)
3411               /* Or shadowed tags.  */
3412               && !(TREE_CODE (icv) == TYPE_DECL
3413                    && DECL_CONTEXT (icv) == current_class_type))
3414             {
3415               cp_error ("declaration of identifier `%D' as `%#D'", name, x);
3416               cp_error_at ("conflicts with previous use in class as `%#D'",
3417                            icv);
3418             }
3419         }
3420
3421       push_class_level_binding (name, x);
3422       if (TREE_CODE (x) == TYPE_DECL)
3423         {
3424           set_identifier_type_value (name, TREE_TYPE (x));
3425
3426           /* Don't set nested_typename on template type parms, for instance.
3427              Any artificial decls that need DECL_NESTED_TYPENAME will have it
3428              set in pushtag.  */
3429           if (! DECL_NESTED_TYPENAME (x) && ! DECL_ARTIFICIAL (x))
3430             set_nested_typename (x, current_class_name, name, TREE_TYPE (x));
3431         }
3432     }
3433   return x;
3434 }
3435
3436 /* This function is used to push the mangled decls for nested types into
3437    the appropriate scope.  Previously pushdecl_top_level was used, but that
3438    is incorrect for members of local classes.  */
3439 tree
3440 pushdecl_nonclass_level (x)
3441      tree x;
3442 {
3443   struct binding_level *b = current_binding_level;
3444
3445 #if 0
3446   /* Get out of class scope -- this isn't necessary, because class scope
3447      doesn't make it into current_binding_level.  */
3448   while (b->parm_flag == 2)
3449     b = b->level_chain;
3450 #else
3451   my_friendly_assert (b->parm_flag != 2, 180);
3452 #endif
3453
3454   /* Get out of template binding levels */
3455   while (b->pseudo_global)
3456     b = b->level_chain;
3457
3458   pushdecl_with_scope (x, b);
3459 }
3460
3461 /* Make the declaration(s) of X appear in CLASS scope
3462    under the name NAME.  */
3463 void
3464 push_class_level_binding (name, x)
3465      tree name;
3466      tree x;
3467 {
3468   if (TREE_CODE (x) == TYPE_DECL && DECL_ARTIFICIAL (x)
3469       && purpose_member (name, class_binding_level->class_shadowed))
3470     return;
3471
3472   maybe_push_cache_obstack ();
3473   class_binding_level->class_shadowed
3474       = tree_cons (name, IDENTIFIER_CLASS_VALUE (name),
3475                    class_binding_level->class_shadowed);
3476   pop_obstacks ();
3477   IDENTIFIER_CLASS_VALUE (name) = x;
3478   obstack_ptr_grow (&decl_obstack, x);
3479 }
3480
3481 /* Tell caller how to interpret a TREE_LIST which contains
3482    chains of FUNCTION_DECLS.  */
3483 int
3484 overloaded_globals_p (list)
3485      tree list;
3486 {
3487   my_friendly_assert (TREE_CODE (list) == TREE_LIST, 142);
3488
3489   /* Don't commit caller to seeing them as globals.  */
3490   if (TREE_NONLOCAL_FLAG (list))
3491     return -1;
3492   /* Do commit caller to seeing them as globals.  */
3493   if (TREE_CODE (TREE_PURPOSE (list)) == IDENTIFIER_NODE)
3494     return 1;
3495   /* Do commit caller to not seeing them as globals.  */
3496   return 0;
3497 }
3498
3499 /* DECL is a FUNCTION_DECL which may have other definitions already in
3500    place.  We get around this by making the value of the identifier point
3501    to a list of all the things that want to be referenced by that name.  It
3502    is then up to the users of that name to decide what to do with that
3503    list.
3504
3505    DECL may also be a TEMPLATE_DECL, with a FUNCTION_DECL in its DECL_RESULT
3506    slot.  It is dealt with the same way.
3507
3508    The value returned may be a previous declaration if we guessed wrong
3509    about what language DECL should belong to (C or C++).  Otherwise,
3510    it's always DECL (and never something that's not a _DECL).  */
3511 tree
3512 push_overloaded_decl (decl, forgettable)
3513      tree decl;
3514      int forgettable;
3515 {
3516   tree orig_name = DECL_NAME (decl);
3517   tree old;
3518   int doing_global = (global_bindings_p () || ! forgettable
3519                       || flag_traditional || pseudo_global_level_p ());
3520
3521   if (doing_global)
3522     {
3523       old = IDENTIFIER_GLOBAL_VALUE (orig_name);
3524       if (old && TREE_CODE (old) == FUNCTION_DECL
3525           && DECL_ARTIFICIAL (old)
3526           && (DECL_BUILT_IN (old) || DECL_BUILT_IN_NONANSI (old)))
3527         {
3528           if (duplicate_decls (decl, old))
3529             return old;
3530           old = NULL_TREE;
3531         }
3532     }
3533   else
3534     {
3535       old = IDENTIFIER_LOCAL_VALUE (orig_name);
3536
3537       if (! purpose_member (orig_name, current_binding_level->shadowed))
3538         {
3539           current_binding_level->shadowed
3540             = tree_cons (orig_name, old, current_binding_level->shadowed);
3541           old = NULL_TREE;
3542         }
3543     }
3544
3545   if (old)
3546     {
3547 #if 0
3548       /* We cache the value of builtin functions as ADDR_EXPRs
3549          in the name space.  Convert it to some kind of _DECL after
3550          remembering what to forget.  */
3551       if (TREE_CODE (old) == ADDR_EXPR)
3552         old = TREE_OPERAND (old, 0);
3553       else
3554 #endif
3555       if (TREE_CODE (old) == TYPE_DECL && DECL_ARTIFICIAL (old))
3556         {
3557           tree t = TREE_TYPE (old);
3558           if (IS_AGGR_TYPE (t) && warn_shadow)
3559             cp_warning ("`%#D' hides constructor for `%#T'", decl, t);
3560           old = NULL_TREE;
3561         }
3562       else if (is_overloaded_fn (old))
3563         {
3564           tree tmp;
3565           
3566           for (tmp = get_first_fn (old); tmp; tmp = DECL_CHAIN (tmp))
3567             if (decl == tmp || duplicate_decls (decl, tmp))
3568               return tmp;
3569         }
3570       else
3571         {
3572           cp_error_at ("previous non-function declaration `%#D'", old);
3573           cp_error ("conflicts with function declaration `%#D'", decl);
3574           return decl;
3575         }
3576     }
3577
3578   if (old || TREE_CODE (decl) == TEMPLATE_DECL)
3579     {
3580       if (old && is_overloaded_fn (old))
3581         DECL_CHAIN (decl) = get_first_fn (old);
3582       else
3583         DECL_CHAIN (decl) = NULL_TREE;
3584       old = tree_cons (orig_name, decl, NULL_TREE);
3585       TREE_TYPE (old) = unknown_type_node;
3586     }
3587   else
3588     /* orig_name is not ambiguous.  */
3589     old = decl;
3590
3591   if (doing_global)
3592     IDENTIFIER_GLOBAL_VALUE (orig_name) = old;
3593   else
3594     IDENTIFIER_LOCAL_VALUE (orig_name) = old;
3595
3596   return decl;
3597 }
3598 \f
3599 /* Generate an implicit declaration for identifier FUNCTIONID
3600    as a function of type int ().  Print a warning if appropriate.  */
3601
3602 tree
3603 implicitly_declare (functionid)
3604      tree functionid;
3605 {
3606   register tree decl;
3607   int temp = allocation_temporary_p ();
3608
3609   push_obstacks_nochange ();
3610
3611   /* Save the decl permanently so we can warn if definition follows.
3612      In ANSI C, warn_implicit is usually false, so the saves little space.
3613      But in C++, it's usually true, hence the extra code.  */
3614   if (temp && (flag_traditional || !warn_implicit || toplevel_bindings_p ()))
3615     end_temporary_allocation ();
3616
3617   /* We used to reuse an old implicit decl here,
3618      but this loses with inline functions because it can clobber
3619      the saved decl chains.  */
3620   decl = build_lang_decl (FUNCTION_DECL, functionid, default_function_type);
3621
3622   DECL_EXTERNAL (decl) = 1;
3623   TREE_PUBLIC (decl) = 1;
3624
3625   /* ANSI standard says implicit declarations are in the innermost block.
3626      So we record the decl in the standard fashion.
3627      If flag_traditional is set, pushdecl does it top-level.  */
3628   pushdecl (decl);
3629   rest_of_decl_compilation (decl, NULL_PTR, 0, 0);
3630
3631   if (warn_implicit
3632       /* Only one warning per identifier.  */
3633       && IDENTIFIER_IMPLICIT_DECL (functionid) == NULL_TREE)
3634     {
3635       cp_pedwarn ("implicit declaration of function `%#D'", decl);
3636     }
3637
3638   SET_IDENTIFIER_IMPLICIT_DECL (functionid, decl);
3639
3640   pop_obstacks ();
3641
3642   return decl;
3643 }
3644
3645 /* Return zero if the declaration NEWDECL is valid
3646    when the declaration OLDDECL (assumed to be for the same name)
3647    has already been seen.
3648    Otherwise return an error message format string with a %s
3649    where the identifier should go.  */
3650
3651 static char *
3652 redeclaration_error_message (newdecl, olddecl)
3653      tree newdecl, olddecl;
3654 {
3655   if (TREE_CODE (newdecl) == TYPE_DECL)
3656     {
3657       /* Because C++ can put things into name space for free,
3658          constructs like "typedef struct foo { ... } foo"
3659          would look like an erroneous redeclaration.  */
3660       if (comptypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl), 0))
3661         return 0;
3662       else
3663         return "redefinition of `%#D'";
3664     }
3665   else if (TREE_CODE (newdecl) == FUNCTION_DECL)
3666     {
3667       /* If this is a pure function, its olddecl will actually be
3668          the original initialization to `0' (which we force to call
3669          abort()).  Don't complain about redefinition in this case.  */
3670       if (DECL_LANG_SPECIFIC (olddecl) && DECL_ABSTRACT_VIRTUAL_P (olddecl))
3671         return 0;
3672
3673       /* We'll complain about linkage mismatches in
3674          warn_extern_redeclared_static.  */
3675
3676       /* defining the same name twice is no good.  */
3677       if (DECL_INITIAL (olddecl) != NULL_TREE
3678           && DECL_INITIAL (newdecl) != NULL_TREE)
3679         {
3680           if (DECL_NAME (olddecl) == NULL_TREE)
3681             return "`%#D' not declared in class";
3682           else
3683             return "redefinition of `%#D'";
3684         }
3685       return 0;
3686     }
3687   else if (TREE_CODE (newdecl) == TEMPLATE_DECL)
3688     {
3689       if (DECL_INITIAL (olddecl) && DECL_INITIAL (newdecl))
3690         return "redefinition of `%#D'";
3691       return 0;
3692     }
3693   else if (current_binding_level == global_binding_level)
3694     {
3695       /* Objects declared at top level:  */
3696       /* If at least one is a reference, it's ok.  */
3697       if (DECL_EXTERNAL (newdecl) || DECL_EXTERNAL (olddecl))
3698         return 0;
3699       /* Reject two definitions.  */
3700       return "redefinition of `%#D'";
3701     }
3702   else
3703     {
3704       /* Objects declared with block scope:  */
3705       /* Reject two definitions, and reject a definition
3706          together with an external reference.  */
3707       if (!(DECL_EXTERNAL (newdecl) && DECL_EXTERNAL (olddecl)))
3708         return "redeclaration of `%#D'";
3709       return 0;
3710     }
3711 }
3712 \f
3713 /* Get the LABEL_DECL corresponding to identifier ID as a label.
3714    Create one if none exists so far for the current function.
3715    This function is called for both label definitions and label references.  */
3716
3717 tree
3718 lookup_label (id)
3719      tree id;
3720 {
3721   register tree decl = IDENTIFIER_LABEL_VALUE (id);
3722
3723   if (current_function_decl == NULL_TREE)
3724     {
3725       error ("label `%s' referenced outside of any function",
3726              IDENTIFIER_POINTER (id));
3727       return NULL_TREE;
3728     }
3729
3730   if ((decl == NULL_TREE
3731       || DECL_SOURCE_LINE (decl) == 0)
3732       && (named_label_uses == NULL_TREE
3733           || TREE_PURPOSE (named_label_uses) != current_binding_level->names
3734           || TREE_VALUE (named_label_uses) != decl))
3735     {
3736       named_label_uses
3737         = tree_cons (current_binding_level->names, decl, named_label_uses);
3738       TREE_TYPE (named_label_uses) = (tree)current_binding_level;
3739     }
3740
3741   /* Use a label already defined or ref'd with this name.  */
3742   if (decl != NULL_TREE)
3743     {
3744       /* But not if it is inherited and wasn't declared to be inheritable.  */
3745       if (DECL_CONTEXT (decl) != current_function_decl
3746           && ! C_DECLARED_LABEL_FLAG (decl))
3747         return shadow_label (id);
3748       return decl;
3749     }
3750
3751   decl = build_decl (LABEL_DECL, id, void_type_node);
3752
3753   /* A label not explicitly declared must be local to where it's ref'd.  */
3754   DECL_CONTEXT (decl) = current_function_decl;
3755
3756   DECL_MODE (decl) = VOIDmode;
3757
3758   /* Say where one reference is to the label,
3759      for the sake of the error if it is not defined.  */
3760   DECL_SOURCE_LINE (decl) = lineno;
3761   DECL_SOURCE_FILE (decl) = input_filename;
3762
3763   SET_IDENTIFIER_LABEL_VALUE (id, decl);
3764
3765   named_labels = tree_cons (NULL_TREE, decl, named_labels);
3766   TREE_VALUE (named_label_uses) = decl;
3767
3768   return decl;
3769 }
3770
3771 /* Make a label named NAME in the current function,
3772    shadowing silently any that may be inherited from containing functions
3773    or containing scopes.
3774
3775    Note that valid use, if the label being shadowed
3776    comes from another scope in the same function,
3777    requires calling declare_nonlocal_label right away.  */
3778
3779 tree
3780 shadow_label (name)
3781      tree name;
3782 {
3783   register tree decl = IDENTIFIER_LABEL_VALUE (name);
3784
3785   if (decl != NULL_TREE)
3786     {
3787       shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels);
3788       SET_IDENTIFIER_LABEL_VALUE (name, NULL_TREE);
3789       SET_IDENTIFIER_LABEL_VALUE (decl, NULL_TREE);
3790     }
3791
3792   return lookup_label (name);
3793 }
3794
3795 /* Define a label, specifying the location in the source file.
3796    Return the LABEL_DECL node for the label, if the definition is valid.
3797    Otherwise return 0.  */
3798
3799 tree
3800 define_label (filename, line, name)
3801      char *filename;
3802      int line;
3803      tree name;
3804 {
3805   tree decl = lookup_label (name);
3806
3807   /* After labels, make any new cleanups go into their
3808      own new (temporary) binding contour.  */
3809   current_binding_level->more_cleanups_ok = 0;
3810
3811   /* If label with this name is known from an outer context, shadow it.  */
3812   if (decl != NULL_TREE && DECL_CONTEXT (decl) != current_function_decl)
3813     {
3814       shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels);
3815       SET_IDENTIFIER_LABEL_VALUE (name, NULL_TREE);
3816       decl = lookup_label (name);
3817     }
3818
3819   if (name == get_identifier ("wchar_t"))
3820     cp_pedwarn ("label named wchar_t");
3821
3822   if (DECL_INITIAL (decl) != NULL_TREE)
3823     {
3824       cp_error ("duplicate label `%D'", decl);
3825       return 0;
3826     }
3827   else
3828     {
3829       tree uses, prev;
3830       int identified = 0;
3831
3832       /* Mark label as having been defined.  */
3833       DECL_INITIAL (decl) = error_mark_node;
3834       /* Say where in the source.  */
3835       DECL_SOURCE_FILE (decl) = filename;
3836       DECL_SOURCE_LINE (decl) = line;
3837
3838       for (prev = NULL_TREE, uses = named_label_uses;
3839            uses;
3840            prev = uses, uses = TREE_CHAIN (uses))
3841         if (TREE_VALUE (uses) == decl)
3842           {
3843             struct binding_level *b = current_binding_level;
3844             while (b)
3845               {
3846                 tree new_decls = b->names;
3847                 tree old_decls = ((tree)b == TREE_TYPE (uses)
3848                                   ? TREE_PURPOSE (uses) : NULL_TREE);
3849                 while (new_decls != old_decls)
3850                   {
3851                     if (TREE_CODE (new_decls) == VAR_DECL
3852                         /* Don't complain about crossing initialization
3853                            of internal entities.  They can't be accessed,
3854                            and they should be cleaned up
3855                            by the time we get to the label.  */
3856                         && ! DECL_ARTIFICIAL (new_decls)
3857                         && ((DECL_INITIAL (new_decls) != NULL_TREE
3858                              && DECL_INITIAL (new_decls) != error_mark_node)
3859                             || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (new_decls))))
3860                       {
3861                         if (! identified)
3862                           cp_error ("jump to label `%D'", decl);
3863                         identified = 1;
3864                         cp_error_at ("  crosses initialization of `%#D'",
3865                                      new_decls);
3866                       }
3867                     new_decls = TREE_CHAIN (new_decls);
3868                   }
3869                 if ((tree)b == TREE_TYPE (uses))
3870                   break;
3871                 b = b->level_chain;
3872               }
3873
3874             if (prev)
3875               TREE_CHAIN (prev) = TREE_CHAIN (uses);
3876             else
3877               named_label_uses = TREE_CHAIN (uses);
3878           }
3879       current_function_return_value = NULL_TREE;
3880       return decl;
3881     }
3882 }
3883
3884 struct cp_switch
3885 {
3886   struct binding_level *level;
3887   struct cp_switch *next;
3888 };
3889
3890 static struct cp_switch *switch_stack;
3891
3892 void
3893 push_switch ()
3894 {
3895   struct cp_switch *p
3896     = (struct cp_switch *) oballoc (sizeof (struct cp_switch));
3897   p->level = current_binding_level;
3898   p->next = switch_stack;
3899   switch_stack = p;
3900 }
3901
3902 void
3903 pop_switch ()
3904 {
3905   switch_stack = switch_stack->next;
3906 }
3907
3908 /* Same, but for CASE labels.  If DECL is NULL_TREE, it's the default.  */
3909 /* XXX Note decl is never actually used. (bpk) */
3910 void
3911 define_case_label (decl)
3912      tree decl;
3913 {
3914   tree cleanup = last_cleanup_this_contour ();
3915   struct binding_level *b = current_binding_level;
3916   int identified = 0;
3917
3918   if (cleanup)
3919     {
3920       static int explained = 0;
3921       cp_warning_at ("destructor needed for `%#D'", TREE_PURPOSE (cleanup));
3922       warning ("where case label appears here");
3923       if (!explained)
3924         {
3925           warning ("(enclose actions of previous case statements requiring");
3926           warning ("destructors in their own binding contours.)");
3927           explained = 1;
3928         }
3929     }
3930
3931   for (; b && b != switch_stack->level; b = b->level_chain)
3932     {
3933       tree new_decls = b->names;
3934       for (; new_decls; new_decls = TREE_CHAIN (new_decls))
3935         {
3936           if (TREE_CODE (new_decls) == VAR_DECL
3937               /* Don't complain about crossing initialization
3938                  of internal entities.  They can't be accessed,
3939                  and they should be cleaned up
3940                  by the time we get to the label.  */
3941               && ! DECL_ARTIFICIAL (new_decls)
3942               && ((DECL_INITIAL (new_decls) != NULL_TREE
3943                    && DECL_INITIAL (new_decls) != error_mark_node)
3944                   || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (new_decls))))
3945             {
3946               if (! identified)
3947                 error ("jump to case label");
3948               identified = 1;
3949               cp_error_at ("  crosses initialization of `%#D'",
3950                            new_decls);
3951             }
3952         }
3953     }
3954
3955   /* After labels, make any new cleanups go into their
3956      own new (temporary) binding contour.  */
3957
3958   current_binding_level->more_cleanups_ok = 0;
3959   current_function_return_value = NULL_TREE;
3960 }
3961 \f
3962 /* Return the list of declarations of the current level.
3963    Note that this list is in reverse order unless/until
3964    you nreverse it; and when you do nreverse it, you must
3965    store the result back using `storedecls' or you will lose.  */
3966
3967 tree
3968 getdecls ()
3969 {
3970   return current_binding_level->names;
3971 }
3972
3973 /* Return the list of type-tags (for structs, etc) of the current level.  */
3974
3975 tree
3976 gettags ()
3977 {
3978   return current_binding_level->tags;
3979 }
3980
3981 /* Store the list of declarations of the current level.
3982    This is done for the parameter declarations of a function being defined,
3983    after they are modified in the light of any missing parameters.  */
3984
3985 static void
3986 storedecls (decls)
3987      tree decls;
3988 {
3989   current_binding_level->names = decls;
3990 }
3991
3992 /* Similarly, store the list of tags of the current level.  */
3993
3994 static void
3995 storetags (tags)
3996      tree tags;
3997 {
3998   current_binding_level->tags = tags;
3999 }
4000 \f
4001 /* Given NAME, an IDENTIFIER_NODE,
4002    return the structure (or union or enum) definition for that name.
4003    Searches binding levels from BINDING_LEVEL up to the global level.
4004    If THISLEVEL_ONLY is nonzero, searches only the specified context
4005    (but skips any tag-transparent contexts to find one that is
4006    meaningful for tags).
4007    FORM says which kind of type the caller wants;
4008    it is RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE.
4009    If the wrong kind of type is found, and it's not a template, an error is
4010    reported.  */
4011
4012 static tree
4013 lookup_tag (form, name, binding_level, thislevel_only)
4014      enum tree_code form;
4015      struct binding_level *binding_level;
4016      tree name;
4017      int thislevel_only;
4018 {
4019   register struct binding_level *level;
4020
4021   for (level = binding_level; level; level = level->level_chain)
4022     {
4023       register tree tail;
4024       if (ANON_AGGRNAME_P (name))
4025         for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
4026           {
4027             /* There's no need for error checking here, because
4028                anon names are unique throughout the compilation.  */
4029             if (TYPE_IDENTIFIER (TREE_VALUE (tail)) == name)
4030               return TREE_VALUE (tail);
4031           }
4032       else
4033         for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
4034           {
4035             if (TREE_PURPOSE (tail) == name)
4036               {
4037                 enum tree_code code = TREE_CODE (TREE_VALUE (tail));
4038                 /* Should tighten this up; it'll probably permit
4039                    UNION_TYPE and a struct template, for example.  */
4040                 if (code != form
4041                     && !(form != ENUMERAL_TYPE
4042                          && (code == TEMPLATE_DECL
4043                              || code == UNINSTANTIATED_P_TYPE)))
4044                            
4045                   {
4046                     /* Definition isn't the kind we were looking for.  */
4047                     cp_error ("`%#D' redeclared as %C", TREE_VALUE (tail),
4048                               form);
4049                   }
4050                 return TREE_VALUE (tail);
4051               }
4052           }
4053       if (thislevel_only && ! level->tag_transparent)
4054         return NULL_TREE;
4055       if (current_class_type && level->level_chain == global_binding_level)
4056         {
4057           /* Try looking in this class's tags before heading into
4058              global binding level.  */
4059           tree context = current_class_type;
4060           while (context)
4061             {
4062               switch (TREE_CODE_CLASS (TREE_CODE (context)))
4063                 {
4064                 tree these_tags;
4065                 case 't':
4066                     these_tags = CLASSTYPE_TAGS (context);
4067                     if (ANON_AGGRNAME_P (name))
4068                       while (these_tags)
4069                         {
4070                           if (TYPE_IDENTIFIER (TREE_VALUE (these_tags))
4071                               == name)
4072                             return TREE_VALUE (tail);
4073                           these_tags = TREE_CHAIN (these_tags);
4074                         }
4075                     else
4076                       while (these_tags)
4077                         {
4078                           if (TREE_PURPOSE (these_tags) == name)
4079                             {
4080                               if (TREE_CODE (TREE_VALUE (these_tags)) != form)
4081                                 {
4082                                   cp_error ("`%#D' redeclared as %C in class scope",
4083                                             TREE_VALUE (tail), form);
4084                                 }
4085                               return TREE_VALUE (tail);
4086                             }
4087                           these_tags = TREE_CHAIN (these_tags);
4088                         }
4089                     /* If this type is not yet complete, then don't
4090                        look at its context.  */
4091                     if (TYPE_SIZE (context) == NULL_TREE)
4092                       goto no_context;
4093                     /* Go to next enclosing type, if any.  */
4094                     context = DECL_CONTEXT (TYPE_NAME (context));
4095                     break;
4096                 case 'd':
4097                     context = DECL_CONTEXT (context);
4098                     break;
4099                 default:
4100                     my_friendly_abort (10);
4101                 }
4102               continue;
4103               no_context:
4104               break;
4105             }
4106         }
4107     }
4108   return NULL_TREE;
4109 }
4110
4111 void
4112 set_current_level_tags_transparency (tags_transparent)
4113      int tags_transparent;
4114 {
4115   current_binding_level->tag_transparent = tags_transparent;
4116 }
4117
4118 /* Given a type, find the tag that was defined for it and return the tag name.
4119    Otherwise return 0.  However, the value can never be 0
4120    in the cases in which this is used.
4121
4122    C++: If NAME is non-zero, this is the new name to install.  This is
4123    done when replacing anonymous tags with real tag names.  */
4124
4125 static tree
4126 lookup_tag_reverse (type, name)
4127      tree type;
4128      tree name;
4129 {
4130   register struct binding_level *level;
4131
4132   for (level = current_binding_level; level; level = level->level_chain)
4133     {
4134       register tree tail;
4135       for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
4136         {
4137           if (TREE_VALUE (tail) == type)
4138             {
4139               if (name)
4140                 TREE_PURPOSE (tail) = name;
4141               return TREE_PURPOSE (tail);
4142             }
4143         }
4144     }
4145   return NULL_TREE;
4146 }
4147
4148 /* Given type TYPE which was not declared in C++ language context,
4149    attempt to find a name by which it is referred.  */
4150 tree
4151 typedecl_for_tag (tag)
4152      tree tag;
4153 {
4154   struct binding_level *b = current_binding_level;
4155
4156   if (TREE_CODE (TYPE_NAME (tag)) == TYPE_DECL)
4157     return TYPE_NAME (tag);
4158
4159   while (b)
4160     {
4161       tree decls = b->names;
4162       while (decls)
4163         {
4164           if (TREE_CODE (decls) == TYPE_DECL && TREE_TYPE (decls) == tag)
4165             break;
4166           decls = TREE_CHAIN (decls);
4167         }
4168       if (decls)
4169         return decls;
4170       b = b->level_chain;
4171     }
4172   return NULL_TREE;
4173 }
4174 \f
4175 /* Lookup TYPE in CONTEXT (a chain of nested types or a FUNCTION_DECL).
4176    Return the type value, or NULL_TREE if not found.  */
4177 static tree
4178 lookup_nested_type (type, context)
4179      tree type;
4180      tree context;
4181 {
4182   if (context == NULL_TREE)
4183     return NULL_TREE;
4184   while (context)
4185     {
4186       switch (TREE_CODE (context))
4187         {
4188         case TYPE_DECL:
4189           {
4190             tree ctype = TREE_TYPE (context);
4191             tree match = value_member (type, CLASSTYPE_TAGS (ctype));
4192             if (match)
4193               return TREE_VALUE (match);
4194             context = DECL_CONTEXT (context);
4195
4196             /* When we have a nested class whose member functions have
4197                local types (e.g., a set of enums), we'll arrive here
4198                with the DECL_CONTEXT as the actual RECORD_TYPE node for
4199                the enclosing class.  Instead, we want to make sure we
4200                come back in here with the TYPE_DECL, not the RECORD_TYPE.  */
4201             if (context && TREE_CODE (context) == RECORD_TYPE)
4202               context = TREE_CHAIN (context);
4203           }
4204           break;
4205         case FUNCTION_DECL:
4206           if (TYPE_NAME (type) && TYPE_IDENTIFIER (type))
4207             return lookup_name (TYPE_IDENTIFIER (type), 1);
4208           return NULL_TREE;
4209         default:
4210           my_friendly_abort (12);
4211         }
4212     }
4213   return NULL_TREE;
4214 }
4215
4216 /* Look up NAME in the NAMESPACE.  */
4217 tree
4218 lookup_namespace_name (namespace, name)
4219      tree namespace, name;
4220 {
4221   struct binding_level *b = (struct binding_level *)NAMESPACE_LEVEL (namespace);
4222   tree x;
4223
4224   for (x = NULL_TREE; b && !x; b = b->level_chain)
4225     {
4226       for (x = b->names; x; x = TREE_CHAIN (x))
4227         if (DECL_NAME (x) == name || DECL_ASSEMBLER_NAME (x) == name)
4228           break;
4229       /* Must find directly in the namespace.  */
4230       break;
4231     }
4232   return x;
4233 }
4234
4235 /* Look up NAME in the current binding level and its superiors in the
4236    namespace of variables, functions and typedefs.  Return a ..._DECL
4237    node of some kind representing its definition if there is only one
4238    such declaration, or return a TREE_LIST with all the overloaded
4239    definitions if there are many, or return 0 if it is undefined.
4240
4241    If PREFER_TYPE is > 0, we prefer TYPE_DECLs.
4242    If PREFER_TYPE is -2, we're being called from yylex(). (UGLY)
4243    Otherwise we prefer non-TYPE_DECLs.  */
4244
4245 tree
4246 lookup_name_real (name, prefer_type, nonclass)
4247      tree name;
4248      int prefer_type, nonclass;
4249 {
4250   register tree val;
4251   int yylex = 0;
4252   tree from_obj = NULL_TREE;
4253
4254   if (prefer_type == -2)
4255     {
4256       extern int looking_for_typename;
4257       tree type;
4258
4259       yylex = 1;
4260       prefer_type = looking_for_typename;
4261
4262       if (got_scope)
4263         type = got_scope;
4264       else
4265         type = got_object;
4266       
4267       if (type)
4268         {
4269           if (type == error_mark_node)
4270             return error_mark_node;
4271           else if (type == void_type_node)
4272             val = IDENTIFIER_GLOBAL_VALUE (name);
4273           else if (TREE_CODE (type) == TEMPLATE_TYPE_PARM
4274                    /* TFIXME -- don't do this for UPTs in new model.  */
4275                    || TREE_CODE (type) == UNINSTANTIATED_P_TYPE)
4276             {
4277               if (prefer_type > 0)
4278                 val = create_nested_upt (type, name);
4279               else
4280                 val = NULL_TREE;
4281             }
4282           else if (TREE_CODE (type) == NAMESPACE_DECL)
4283             {
4284               val = lookup_namespace_name (type, name);
4285             }
4286           else if (! IS_AGGR_TYPE (type))
4287             /* Someone else will give an error about this if needed. */
4288             val = NULL_TREE;
4289           else if (TYPE_BEING_DEFINED (type))
4290             {
4291               val = IDENTIFIER_CLASS_VALUE (name);
4292               if (val && DECL_CONTEXT (val) != type)
4293                 {
4294                   struct binding_level *b = class_binding_level;
4295                   for (val = NULL_TREE; b; b = b->level_chain)
4296                     {
4297                       tree t = purpose_member (name, b->class_shadowed);
4298                       if (t && TREE_VALUE (t)
4299                           && DECL_CONTEXT (TREE_VALUE (t)) == type)
4300                         {
4301                           val = TREE_VALUE (t);
4302                           break;
4303                         }
4304                     }
4305                 }
4306               if (val == NULL_TREE
4307                   && CLASSTYPE_LOCAL_TYPEDECLS (type))
4308                 val = lookup_field (type, name, 0, 1);
4309             }
4310           else if (type == current_class_type)
4311             val = IDENTIFIER_CLASS_VALUE (name);
4312           else
4313             val = lookup_field (type, name, 0, prefer_type);
4314         }
4315       else
4316         val = NULL_TREE;
4317
4318       if (got_scope)
4319         goto done;
4320
4321       /* This special lookup only applies to types.  */
4322       else if (got_object && val && TREE_CODE (val) == TYPE_DECL)
4323         from_obj = val;
4324     }
4325     
4326   if (current_binding_level != global_binding_level
4327       && IDENTIFIER_LOCAL_VALUE (name))
4328     val = IDENTIFIER_LOCAL_VALUE (name);
4329   /* In C++ class fields are between local and global scope,
4330      just before the global scope.  */
4331   else if (current_class_type && ! nonclass)
4332     {
4333       val = IDENTIFIER_CLASS_VALUE (name);
4334       if (val == NULL_TREE
4335           && TYPE_BEING_DEFINED (current_class_type)
4336           && CLASSTYPE_LOCAL_TYPEDECLS (current_class_type))
4337         /* Try to find values from base classes if we are presently
4338            defining a type.  We are presently only interested in
4339            TYPE_DECLs.  */
4340         val = lookup_field (current_class_type, name, 0, 1);
4341
4342       /* yylex() calls this with -2, since we should never start digging for
4343          the nested name at the point where we haven't even, for example,
4344          created the COMPONENT_REF or anything like that.  */
4345       if (val == NULL_TREE)
4346         val = lookup_nested_field (name, ! yylex);
4347
4348       if (val == NULL_TREE)
4349         val = IDENTIFIER_GLOBAL_VALUE (name);
4350     }
4351   else
4352     val = IDENTIFIER_GLOBAL_VALUE (name);
4353
4354  done:
4355   if (val)
4356     {
4357       if (from_obj && from_obj != val)
4358         cp_error ("lookup in the scope of `%#T' does not match lookup in the current scope",
4359                   got_object);
4360
4361       if ((TREE_CODE (val) == TEMPLATE_DECL && looking_for_template)
4362           || TREE_CODE (val) == TYPE_DECL || prefer_type <= 0)
4363         ;
4364       else if (IDENTIFIER_HAS_TYPE_VALUE (name))
4365         val = TYPE_NAME (IDENTIFIER_TYPE_VALUE (name));
4366       else if (TREE_TYPE (val) == error_mark_node)
4367         val = error_mark_node;
4368     }
4369   else if (from_obj)
4370     val = from_obj;
4371
4372   return val;
4373 }
4374
4375 tree
4376 lookup_name_nonclass (name)
4377      tree name;
4378 {
4379   return lookup_name_real (name, 0, 1);
4380 }
4381
4382 tree
4383 lookup_name (name, prefer_type)
4384      tree name;
4385      int prefer_type;
4386 {
4387   return lookup_name_real (name, prefer_type, 0);
4388 }
4389
4390 /* Similar to `lookup_name' but look only at current binding level.  */
4391
4392 tree
4393 lookup_name_current_level (name)
4394      tree name;
4395 {
4396   register tree t = NULL_TREE;
4397
4398   if (current_binding_level == global_binding_level)
4399     {
4400       t = IDENTIFIER_GLOBAL_VALUE (name);
4401
4402       /* extern "C" function() */
4403       if (t != NULL_TREE && TREE_CODE (t) == TREE_LIST)
4404         t = TREE_VALUE (t);
4405     }
4406   else if (IDENTIFIER_LOCAL_VALUE (name) != NULL_TREE)
4407     {
4408       struct binding_level *b = current_binding_level;
4409       while (1)
4410         {
4411           for (t = b->names; t; t = TREE_CHAIN (t))
4412             if (DECL_NAME (t) == name || DECL_ASSEMBLER_NAME (t) == name)
4413               goto out;
4414           if (b->keep == 2)
4415             b = b->level_chain;
4416           else
4417             break;
4418         }
4419     out:
4420       ;
4421     }
4422
4423   return t;
4424 }
4425 \f
4426 /* Arrange for the user to get a source line number, even when the
4427    compiler is going down in flames, so that she at least has a
4428    chance of working around problems in the compiler.  We used to
4429    call error(), but that let the segmentation fault continue
4430    through; now, it's much more passive by asking them to send the
4431    maintainers mail about the problem.  */
4432
4433 static void
4434 signal_catch (sig)
4435      int sig;
4436 {
4437   signal (SIGSEGV, SIG_DFL);
4438 #ifdef SIGIOT
4439   signal (SIGIOT, SIG_DFL);
4440 #endif
4441 #ifdef SIGILL
4442   signal (SIGILL, SIG_DFL);
4443 #endif
4444 #ifdef SIGABRT
4445   signal (SIGABRT, SIG_DFL);
4446 #endif
4447 #ifdef SIGBUS
4448   signal (SIGBUS, SIG_DFL);
4449 #endif
4450   my_friendly_abort (0);
4451 }
4452
4453 /* Array for holding types considered "built-in".  These types
4454    are output in the module in which `main' is defined.  */
4455 static tree *builtin_type_tdescs_arr;
4456 static int builtin_type_tdescs_len, builtin_type_tdescs_max;
4457
4458 /* Push the declarations of builtin types into the namespace.
4459    RID_INDEX, if < RID_MAX is the index of the builtin type
4460    in the array RID_POINTERS.  NAME is the name used when looking
4461    up the builtin type.  TYPE is the _TYPE node for the builtin type.  */
4462
4463 static void
4464 record_builtin_type (rid_index, name, type)
4465      enum rid rid_index;
4466      char *name;
4467      tree type;
4468 {
4469   tree rname = NULL_TREE, tname = NULL_TREE;
4470   tree tdecl;
4471
4472   if ((int) rid_index < (int) RID_MAX)
4473     rname = ridpointers[(int) rid_index];
4474   if (name)
4475     tname = get_identifier (name);
4476
4477   TYPE_BUILT_IN (type) = 1;
4478   
4479   if (tname)
4480     {
4481 #if 0 /* not yet, should get fixed properly later */
4482       tdecl = pushdecl (make_type_decl (tname, type));
4483 #else
4484       tdecl = pushdecl (build_decl (TYPE_DECL, tname, type));
4485 #endif
4486       set_identifier_type_value (tname, NULL_TREE);
4487       if ((int) rid_index < (int) RID_MAX)
4488         IDENTIFIER_GLOBAL_VALUE (tname) = tdecl;
4489     }
4490   if (rname != NULL_TREE)
4491     {
4492       if (tname != NULL_TREE)
4493         {
4494           set_identifier_type_value (rname, NULL_TREE);
4495           IDENTIFIER_GLOBAL_VALUE (rname) = tdecl;
4496         }
4497       else
4498         {
4499 #if 0 /* not yet, should get fixed properly later */
4500           tdecl = pushdecl (make_type_decl (rname, type));
4501 #else
4502           tdecl = pushdecl (build_decl (TYPE_DECL, rname, type));
4503 #endif
4504           set_identifier_type_value (rname, NULL_TREE);
4505         }
4506     }
4507
4508   if (flag_rtti)
4509     {
4510       if (builtin_type_tdescs_len+5 >= builtin_type_tdescs_max)
4511         {
4512           builtin_type_tdescs_max *= 2;
4513           builtin_type_tdescs_arr
4514             = (tree *)xrealloc (builtin_type_tdescs_arr,
4515                                 builtin_type_tdescs_max * sizeof (tree));
4516         }
4517       builtin_type_tdescs_arr[builtin_type_tdescs_len++] = type;
4518       if (TREE_CODE (type) != POINTER_TYPE)
4519         {
4520           builtin_type_tdescs_arr[builtin_type_tdescs_len++]
4521             = build_pointer_type (type);
4522           builtin_type_tdescs_arr[builtin_type_tdescs_len++]
4523             = build_pointer_type (build_type_variant (type, 1, 0));
4524         }
4525       if (TREE_CODE (type) != VOID_TYPE)
4526         {
4527           builtin_type_tdescs_arr[builtin_type_tdescs_len++]
4528             = build_reference_type (type);
4529           builtin_type_tdescs_arr[builtin_type_tdescs_len++]
4530             = build_reference_type (build_type_variant (type, 1, 0));
4531         }
4532     }
4533 }
4534
4535 static void
4536 output_builtin_tdesc_entries ()
4537 {
4538   extern struct obstack permanent_obstack;
4539
4540   /* If there's more than one main in this file, don't crash.  */
4541   if (builtin_type_tdescs_arr == 0)
4542     return;
4543
4544   push_obstacks (&permanent_obstack, &permanent_obstack);
4545   while (builtin_type_tdescs_len > 0)
4546     {
4547       tree type = builtin_type_tdescs_arr[--builtin_type_tdescs_len];
4548       tree tdesc = build_t_desc (type, 0);
4549       TREE_ASM_WRITTEN (tdesc) = 0;
4550       build_t_desc (type, 2);
4551     }
4552   free (builtin_type_tdescs_arr);
4553   builtin_type_tdescs_arr = 0;
4554   pop_obstacks ();
4555 }
4556
4557 /* Push overloaded decl, in global scope, with one argument so it
4558    can be used as a callback from define_function.  */
4559 static void
4560 push_overloaded_decl_1 (x)
4561      tree x;
4562 {
4563   push_overloaded_decl (x, 0);
4564 }
4565
4566 #define builtin_function(NAME, TYPE, CODE, LIBNAME) \
4567   define_function (NAME, TYPE, CODE, (void (*)())pushdecl, LIBNAME)
4568
4569 #ifdef __GNUC__
4570 __inline
4571 #endif
4572 tree auto_function (name, type, code)
4573      tree name, type;
4574      enum built_in_function code;
4575 {
4576   return define_function
4577     (IDENTIFIER_POINTER (name), type, code, (void (*)())push_overloaded_decl_1,
4578      IDENTIFIER_POINTER (build_decl_overload (name, TYPE_ARG_TYPES (type),
4579                                               0)));
4580 }
4581
4582 /* Create the predefined scalar types of C,
4583    and some nodes representing standard constants (0, 1, (void *)0).
4584    Initialize the global binding level.
4585    Make definitions for built-in primitive functions.  */
4586
4587 void
4588 init_decl_processing ()
4589 {
4590   tree decl;
4591   register tree endlink, int_endlink, double_endlink, ptr_endlink;
4592   tree fields[20];
4593   /* Either char* or void*.  */
4594   tree traditional_ptr_type_node;
4595   /* Data type of memcpy.  */
4596   tree memcpy_ftype;
4597 #if 0 /* Not yet.  */
4598   /* Data type of strncpy.  */
4599   tree strncpy_ftype;
4600 #endif
4601   int wchar_type_size;
4602   tree temp;
4603   tree array_domain_type;
4604   extern int flag_strict_prototype;
4605
4606   /* Have to make these distinct before we try using them.  */
4607   lang_name_cplusplus = get_identifier ("C++");
4608   lang_name_c = get_identifier ("C");
4609
4610   if (flag_strict_prototype == 2)
4611     {
4612       if (pedantic)
4613         strict_prototypes_lang_c = strict_prototypes_lang_cplusplus;
4614     }
4615   else
4616     strict_prototypes_lang_c = flag_strict_prototype;
4617
4618   /* Initially, C.  */
4619   current_lang_name = lang_name_c;
4620
4621   current_function_decl = NULL_TREE;
4622   named_labels = NULL_TREE;
4623   named_label_uses = NULL_TREE;
4624   current_binding_level = NULL_BINDING_LEVEL;
4625   free_binding_level = NULL_BINDING_LEVEL;
4626
4627   /* Because most segmentation signals can be traced back into user
4628      code, catch them and at least give the user a chance of working
4629      around compiler bugs. */
4630   signal (SIGSEGV, signal_catch);
4631
4632   /* We will also catch aborts in the back-end through signal_catch and
4633      give the user a chance to see where the error might be, and to defeat
4634      aborts in the back-end when there have been errors previously in their
4635      code. */
4636 #ifdef SIGIOT
4637   signal (SIGIOT, signal_catch);
4638 #endif
4639 #ifdef SIGILL
4640   signal (SIGILL, signal_catch);
4641 #endif
4642 #ifdef SIGABRT
4643   signal (SIGABRT, signal_catch);
4644 #endif
4645 #ifdef SIGBUS
4646   signal (SIGBUS, signal_catch);
4647 #endif
4648
4649   gcc_obstack_init (&decl_obstack);
4650   if (flag_rtti)
4651     {
4652       builtin_type_tdescs_max = 100;
4653       builtin_type_tdescs_arr = (tree *)xmalloc (100 * sizeof (tree));
4654     }
4655
4656   /* Must lay these out before anything else gets laid out.  */
4657   error_mark_node = make_node (ERROR_MARK);
4658   TREE_PERMANENT (error_mark_node) = 1;
4659   TREE_TYPE (error_mark_node) = error_mark_node;
4660   error_mark_list = build_tree_list (error_mark_node, error_mark_node);
4661   TREE_TYPE (error_mark_list) = error_mark_node;
4662
4663   /* Make the binding_level structure for global names.  */
4664   pushlevel (0);
4665   global_binding_level = current_binding_level;
4666
4667   this_identifier = get_identifier (THIS_NAME);
4668   in_charge_identifier = get_identifier (IN_CHARGE_NAME);
4669   pfn_identifier = get_identifier (VTABLE_PFN_NAME);
4670   index_identifier = get_identifier (VTABLE_INDEX_NAME);
4671   delta_identifier = get_identifier (VTABLE_DELTA_NAME);
4672   delta2_identifier = get_identifier (VTABLE_DELTA2_NAME);
4673   pfn_or_delta2_identifier = get_identifier ("__pfn_or_delta2");
4674
4675   /* Define `int' and `char' first so that dbx will output them first.  */
4676
4677   integer_type_node = make_signed_type (INT_TYPE_SIZE);
4678   record_builtin_type (RID_INT, NULL_PTR, integer_type_node);
4679
4680   /* Define `char', which is like either `signed char' or `unsigned char'
4681      but not the same as either.  */
4682
4683   char_type_node =
4684     (flag_signed_char
4685      ? make_signed_type (CHAR_TYPE_SIZE)
4686      : make_unsigned_type (CHAR_TYPE_SIZE));
4687   record_builtin_type (RID_CHAR, "char", char_type_node);
4688
4689   long_integer_type_node = make_signed_type (LONG_TYPE_SIZE);
4690   record_builtin_type (RID_LONG, "long int", long_integer_type_node);
4691
4692   unsigned_type_node = make_unsigned_type (INT_TYPE_SIZE);
4693   record_builtin_type (RID_UNSIGNED, "unsigned int", unsigned_type_node);
4694
4695   long_unsigned_type_node = make_unsigned_type (LONG_TYPE_SIZE);
4696   record_builtin_type (RID_MAX, "long unsigned int", long_unsigned_type_node);
4697   record_builtin_type (RID_MAX, "unsigned long", long_unsigned_type_node);
4698
4699   long_long_integer_type_node = make_signed_type (LONG_LONG_TYPE_SIZE);
4700   record_builtin_type (RID_MAX, "long long int", long_long_integer_type_node);
4701
4702   long_long_unsigned_type_node = make_unsigned_type (LONG_LONG_TYPE_SIZE);
4703   record_builtin_type (RID_MAX, "long long unsigned int",
4704                        long_long_unsigned_type_node);
4705   record_builtin_type (RID_MAX, "long long unsigned",
4706                        long_long_unsigned_type_node);
4707
4708   /* `unsigned long' is the standard type for sizeof.
4709      Traditionally, use a signed type.
4710      Note that stddef.h uses `unsigned long',
4711      and this must agree, even of long and int are the same size.  */
4712   sizetype
4713     = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (SIZE_TYPE)));
4714   if (flag_traditional && TREE_UNSIGNED (sizetype))
4715     sizetype = signed_type (sizetype);
4716
4717   ptrdiff_type_node
4718     = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (PTRDIFF_TYPE)));
4719
4720   TREE_TYPE (TYPE_SIZE (integer_type_node)) = sizetype;
4721   TREE_TYPE (TYPE_SIZE (char_type_node)) = sizetype;
4722   TREE_TYPE (TYPE_SIZE (unsigned_type_node)) = sizetype;
4723   TREE_TYPE (TYPE_SIZE (long_unsigned_type_node)) = sizetype;
4724   TREE_TYPE (TYPE_SIZE (long_integer_type_node)) = sizetype;
4725   TREE_TYPE (TYPE_SIZE (long_long_integer_type_node)) = sizetype;
4726   TREE_TYPE (TYPE_SIZE (long_long_unsigned_type_node)) = sizetype;
4727
4728   short_integer_type_node = make_signed_type (SHORT_TYPE_SIZE);
4729   record_builtin_type (RID_SHORT, "short int", short_integer_type_node);
4730   short_unsigned_type_node = make_unsigned_type (SHORT_TYPE_SIZE);
4731   record_builtin_type (RID_MAX, "short unsigned int", short_unsigned_type_node);
4732   record_builtin_type (RID_MAX, "unsigned short", short_unsigned_type_node);
4733
4734   /* Define both `signed char' and `unsigned char'.  */
4735   signed_char_type_node = make_signed_type (CHAR_TYPE_SIZE);
4736   record_builtin_type (RID_MAX, "signed char", signed_char_type_node);
4737   unsigned_char_type_node = make_unsigned_type (CHAR_TYPE_SIZE);
4738   record_builtin_type (RID_MAX, "unsigned char", unsigned_char_type_node);
4739
4740   /* These are types that type_for_size and type_for_mode use.  */
4741   intQI_type_node = make_signed_type (GET_MODE_BITSIZE (QImode));
4742   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intQI_type_node));
4743   intHI_type_node = make_signed_type (GET_MODE_BITSIZE (HImode));
4744   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intHI_type_node));
4745   intSI_type_node = make_signed_type (GET_MODE_BITSIZE (SImode));
4746   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intSI_type_node));
4747   intDI_type_node = make_signed_type (GET_MODE_BITSIZE (DImode));
4748   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intDI_type_node));
4749   unsigned_intQI_type_node = make_unsigned_type (GET_MODE_BITSIZE (QImode));
4750   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intQI_type_node));
4751   unsigned_intHI_type_node = make_unsigned_type (GET_MODE_BITSIZE (HImode));
4752   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intHI_type_node));
4753   unsigned_intSI_type_node = make_unsigned_type (GET_MODE_BITSIZE (SImode));
4754   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intSI_type_node));
4755   unsigned_intDI_type_node = make_unsigned_type (GET_MODE_BITSIZE (DImode));
4756   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intDI_type_node));
4757
4758   float_type_node = make_node (REAL_TYPE);
4759   TYPE_PRECISION (float_type_node) = FLOAT_TYPE_SIZE;
4760   record_builtin_type (RID_FLOAT, NULL_PTR, float_type_node);
4761   layout_type (float_type_node);
4762
4763   double_type_node = make_node (REAL_TYPE);
4764   if (flag_short_double)
4765     TYPE_PRECISION (double_type_node) = FLOAT_TYPE_SIZE;
4766   else
4767     TYPE_PRECISION (double_type_node) = DOUBLE_TYPE_SIZE;
4768   record_builtin_type (RID_DOUBLE, NULL_PTR, double_type_node);
4769   layout_type (double_type_node);
4770
4771   long_double_type_node = make_node (REAL_TYPE);
4772   TYPE_PRECISION (long_double_type_node) = LONG_DOUBLE_TYPE_SIZE;
4773   record_builtin_type (RID_MAX, "long double", long_double_type_node);
4774   layout_type (long_double_type_node);
4775
4776   integer_zero_node = build_int_2 (0, 0);
4777   TREE_TYPE (integer_zero_node) = integer_type_node;
4778   integer_one_node = build_int_2 (1, 0);
4779   TREE_TYPE (integer_one_node) = integer_type_node;
4780   integer_two_node = build_int_2 (2, 0);
4781   TREE_TYPE (integer_two_node) = integer_type_node;
4782   integer_three_node = build_int_2 (3, 0);
4783   TREE_TYPE (integer_three_node) = integer_type_node;
4784
4785   boolean_type_node = make_unsigned_type (BOOL_TYPE_SIZE);
4786   TREE_SET_CODE (boolean_type_node, BOOLEAN_TYPE);
4787   record_builtin_type (RID_BOOL, "bool", boolean_type_node);
4788   boolean_false_node = build_int_2 (0, 0);
4789   TREE_TYPE (boolean_false_node) = boolean_type_node;
4790   boolean_true_node = build_int_2 (1, 0);
4791   TREE_TYPE (boolean_true_node) = boolean_type_node;
4792
4793   /* These are needed by stor-layout.c.  */
4794   size_zero_node = size_int (0);
4795   size_one_node = size_int (1);
4796
4797   void_type_node = make_node (VOID_TYPE);
4798   record_builtin_type (RID_VOID, NULL_PTR, void_type_node);
4799   layout_type (void_type_node); /* Uses integer_zero_node.  */
4800   void_list_node = build_tree_list (NULL_TREE, void_type_node);
4801   TREE_PARMLIST (void_list_node) = 1;
4802
4803   null_pointer_node = build_int_2 (0, 0);
4804   TREE_TYPE (null_pointer_node) = build_pointer_type (void_type_node);
4805   layout_type (TREE_TYPE (null_pointer_node));
4806
4807   /* Used for expressions that do nothing, but are not errors.  */
4808   void_zero_node = build_int_2 (0, 0);
4809   TREE_TYPE (void_zero_node) = void_type_node;
4810
4811   string_type_node = build_pointer_type (char_type_node);
4812   const_string_type_node =
4813     build_pointer_type (build_type_variant (char_type_node, 1, 0));
4814   record_builtin_type (RID_MAX, NULL_PTR, string_type_node);
4815
4816   /* Make a type to be the domain of a few array types
4817      whose domains don't really matter.
4818      200 is small enough that it always fits in size_t
4819      and large enough that it can hold most function names for the
4820      initializations of __FUNCTION__ and __PRETTY_FUNCTION__.  */
4821   array_domain_type = build_index_type (build_int_2 (200, 0));
4822
4823   /* make a type for arrays of characters.
4824      With luck nothing will ever really depend on the length of this
4825      array type.  */
4826   char_array_type_node
4827     = build_array_type (char_type_node, array_domain_type);
4828   /* Likewise for arrays of ints.  */
4829   int_array_type_node
4830     = build_array_type (integer_type_node, array_domain_type);
4831
4832   /* This is just some anonymous class type.  Nobody should ever
4833      need to look inside this envelope.  */
4834   class_star_type_node = build_pointer_type (make_lang_type (RECORD_TYPE));
4835
4836   default_function_type
4837     = build_function_type (integer_type_node, NULL_TREE);
4838   build_pointer_type (default_function_type);
4839
4840   ptr_type_node = build_pointer_type (void_type_node);
4841   const_ptr_type_node =
4842     build_pointer_type (build_type_variant (void_type_node, 1, 0));
4843   record_builtin_type (RID_MAX, NULL_PTR, ptr_type_node);
4844   endlink = void_list_node;
4845   int_endlink = tree_cons (NULL_TREE, integer_type_node, endlink);
4846   double_endlink = tree_cons (NULL_TREE, double_type_node, endlink);
4847   ptr_endlink = tree_cons (NULL_TREE, ptr_type_node, endlink);
4848
4849   double_ftype_double
4850     = build_function_type (double_type_node, double_endlink);
4851
4852   double_ftype_double_double
4853     = build_function_type (double_type_node,
4854                            tree_cons (NULL_TREE, double_type_node,
4855                                       double_endlink));
4856
4857   int_ftype_int
4858     = build_function_type (integer_type_node, int_endlink);
4859
4860   long_ftype_long
4861     = build_function_type (long_integer_type_node,
4862                            tree_cons (NULL_TREE, long_integer_type_node,
4863                                       endlink));
4864
4865   void_ftype_ptr_ptr_int
4866     = build_function_type (void_type_node,
4867                            tree_cons (NULL_TREE, ptr_type_node,
4868                                       tree_cons (NULL_TREE, ptr_type_node,
4869                                                  int_endlink)));
4870
4871   int_ftype_cptr_cptr_sizet
4872     = build_function_type (integer_type_node,
4873                            tree_cons (NULL_TREE, const_ptr_type_node,
4874                                       tree_cons (NULL_TREE, const_ptr_type_node,
4875                                                  tree_cons (NULL_TREE,
4876                                                             sizetype,
4877                                                             endlink))));
4878
4879   void_ftype_ptr_int_int
4880     = build_function_type (void_type_node,
4881                            tree_cons (NULL_TREE, ptr_type_node,
4882                                       tree_cons (NULL_TREE, integer_type_node,
4883                                                  int_endlink)));
4884
4885   string_ftype_ptr_ptr          /* strcpy prototype */
4886     = build_function_type (string_type_node,
4887                            tree_cons (NULL_TREE, string_type_node,
4888                                       tree_cons (NULL_TREE,
4889                                                  const_string_type_node,
4890                                                  endlink)));
4891
4892 #if 0
4893   /* Not yet.  */
4894   strncpy_ftype                 /* strncpy prototype */
4895     = build_function_type (string_type_node,
4896                            tree_cons (NULL_TREE, string_type_node,
4897                                       tree_cons (NULL_TREE, const_string_type_node,
4898                                                  tree_cons (NULL_TREE,
4899                                                             sizetype,
4900                                                             endlink))));
4901 #endif
4902
4903   int_ftype_string_string       /* strcmp prototype */
4904     = build_function_type (integer_type_node,
4905                            tree_cons (NULL_TREE, const_string_type_node,
4906                                       tree_cons (NULL_TREE,
4907                                                  const_string_type_node,
4908                                                  endlink)));
4909
4910   sizet_ftype_string            /* strlen prototype */
4911     = build_function_type (sizetype,
4912                            tree_cons (NULL_TREE, const_string_type_node,
4913                                       endlink));
4914
4915   traditional_ptr_type_node
4916     = (flag_traditional ? string_type_node : ptr_type_node);
4917
4918   memcpy_ftype  /* memcpy prototype */
4919     = build_function_type (traditional_ptr_type_node,
4920                            tree_cons (NULL_TREE, ptr_type_node,
4921                                       tree_cons (NULL_TREE, const_ptr_type_node,
4922                                                  tree_cons (NULL_TREE,
4923                                                             sizetype,
4924                                                             endlink))));
4925
4926   if (flag_huge_objects)
4927     delta_type_node = long_integer_type_node;
4928   else
4929     delta_type_node = short_integer_type_node;
4930
4931   builtin_function ("__builtin_constant_p", int_ftype_int,
4932                     BUILT_IN_CONSTANT_P, NULL_PTR);
4933
4934   builtin_return_address_fndecl =
4935   builtin_function ("__builtin_return_address",
4936                     build_function_type (ptr_type_node, 
4937                                          tree_cons (NULL_TREE,
4938                                                     unsigned_type_node,
4939                                                     endlink)),
4940                     BUILT_IN_RETURN_ADDRESS, NULL_PTR);
4941
4942   builtin_function ("__builtin_frame_address",
4943                     build_function_type (ptr_type_node, 
4944                                          tree_cons (NULL_TREE,
4945                                                     unsigned_type_node,
4946                                                     endlink)),
4947                     BUILT_IN_FRAME_ADDRESS, NULL_PTR);
4948
4949
4950   builtin_function ("__builtin_alloca",
4951                     build_function_type (ptr_type_node,
4952                                          tree_cons (NULL_TREE,
4953                                                     sizetype,
4954                                                     endlink)),
4955                     BUILT_IN_ALLOCA, "alloca");
4956   /* Define alloca, ffs as builtins.
4957      Declare _exit just to mark it as volatile.  */
4958   if (! flag_no_builtin && !flag_no_nonansi_builtin)
4959     {
4960       temp = builtin_function ("alloca",
4961                                build_function_type (ptr_type_node,
4962                                                     tree_cons (NULL_TREE,
4963                                                                sizetype,
4964                                                                endlink)),
4965                                BUILT_IN_ALLOCA, NULL_PTR);
4966       /* Suppress error if redefined as a non-function.  */
4967       DECL_BUILT_IN_NONANSI (temp) = 1;
4968       temp = builtin_function ("ffs", int_ftype_int, BUILT_IN_FFS, NULL_PTR);
4969       /* Suppress error if redefined as a non-function.  */
4970       DECL_BUILT_IN_NONANSI (temp) = 1;
4971       temp = builtin_function ("_exit", build_function_type (void_type_node,
4972                                                              int_endlink),
4973                                NOT_BUILT_IN, NULL_PTR);
4974       TREE_THIS_VOLATILE (temp) = 1;
4975       TREE_SIDE_EFFECTS (temp) = 1;
4976       /* Suppress error if redefined as a non-function.  */
4977       DECL_BUILT_IN_NONANSI (temp) = 1;
4978     }
4979
4980   builtin_function ("__builtin_abs", int_ftype_int,
4981                     BUILT_IN_ABS, NULL_PTR);
4982   builtin_function ("__builtin_fabs", double_ftype_double,
4983                     BUILT_IN_FABS, NULL_PTR);
4984   builtin_function ("__builtin_labs", long_ftype_long,
4985                     BUILT_IN_LABS, NULL_PTR);
4986   builtin_function ("__builtin_ffs", int_ftype_int,
4987                     BUILT_IN_FFS, NULL_PTR);
4988   builtin_function ("__builtin_fsqrt", double_ftype_double,
4989                     BUILT_IN_FSQRT, NULL_PTR);
4990   builtin_function ("__builtin_sin", double_ftype_double, 
4991                     BUILT_IN_SIN, "sin");
4992   builtin_function ("__builtin_cos", double_ftype_double, 
4993                     BUILT_IN_COS, "cos");
4994   builtin_function ("__builtin_saveregs",
4995                     build_function_type (ptr_type_node, NULL_TREE),
4996                     BUILT_IN_SAVEREGS, NULL_PTR);
4997 /* EXPAND_BUILTIN_VARARGS is obsolete.  */
4998 #if 0
4999   builtin_function ("__builtin_varargs",
5000                     build_function_type (ptr_type_node,
5001                                          tree_cons (NULL_TREE,
5002                                                     integer_type_node,
5003                                                     endlink)),
5004                     BUILT_IN_VARARGS, NULL_PTR);
5005 #endif
5006   builtin_function ("__builtin_classify_type", default_function_type,
5007                     BUILT_IN_CLASSIFY_TYPE, NULL_PTR);
5008   builtin_function ("__builtin_next_arg",
5009                     build_function_type (ptr_type_node, NULL_TREE),
5010                     BUILT_IN_NEXT_ARG, NULL_PTR);
5011   builtin_function ("__builtin_args_info",
5012                     build_function_type (integer_type_node,
5013                                          tree_cons (NULL_TREE,
5014                                                     integer_type_node,
5015                                                     endlink)),
5016                     BUILT_IN_ARGS_INFO, NULL_PTR);
5017
5018   /* Untyped call and return.  */
5019   builtin_function ("__builtin_apply_args",
5020                     build_function_type (ptr_type_node, NULL_TREE),
5021                     BUILT_IN_APPLY_ARGS, NULL_PTR);
5022
5023   temp = tree_cons (NULL_TREE,
5024                     build_pointer_type (build_function_type (void_type_node,
5025                                                              NULL_TREE)),
5026                     tree_cons (NULL_TREE,
5027                                ptr_type_node,
5028                                tree_cons (NULL_TREE,
5029                                           sizetype,
5030                                           endlink)));
5031   builtin_function ("__builtin_apply",
5032                     build_function_type (ptr_type_node, temp),
5033                     BUILT_IN_APPLY, NULL_PTR);
5034   builtin_function ("__builtin_return",
5035                     build_function_type (void_type_node,
5036                                          tree_cons (NULL_TREE,
5037                                                     ptr_type_node,
5038                                                     endlink)),
5039                     BUILT_IN_RETURN, NULL_PTR);
5040
5041   /* Currently under experimentation.  */
5042   builtin_function ("__builtin_memcpy", memcpy_ftype,
5043                     BUILT_IN_MEMCPY, "memcpy");
5044   builtin_function ("__builtin_memcmp", int_ftype_cptr_cptr_sizet,
5045                     BUILT_IN_MEMCMP, "memcmp");
5046   builtin_function ("__builtin_strcmp", int_ftype_string_string,
5047                     BUILT_IN_STRCMP, "strcmp");
5048   builtin_function ("__builtin_strcpy", string_ftype_ptr_ptr,
5049                     BUILT_IN_STRCPY, "strcpy");
5050 #if 0
5051   /* Not yet.  */
5052   builtin_function ("__builtin_strncpy", strncpy_ftype,
5053                     BUILT_IN_STRNCPY, "strncpy");
5054 #endif
5055   builtin_function ("__builtin_strlen", sizet_ftype_string,
5056                     BUILT_IN_STRLEN, "strlen");
5057
5058   if (!flag_no_builtin)
5059     {
5060 #if 0 /* These do not work well with libg++.  */
5061       builtin_function ("abs", int_ftype_int, BUILT_IN_ABS, NULL_PTR);
5062       builtin_function ("fabs", double_ftype_double, BUILT_IN_FABS, NULL_PTR);
5063       builtin_function ("labs", long_ftype_long, BUILT_IN_LABS, NULL_PTR);
5064 #endif
5065       builtin_function ("memcpy", memcpy_ftype, BUILT_IN_MEMCPY, NULL_PTR);
5066       builtin_function ("memcmp", int_ftype_cptr_cptr_sizet, BUILT_IN_MEMCMP,
5067                         NULL_PTR);
5068       builtin_function ("strcmp", int_ftype_string_string, BUILT_IN_STRCMP, NULL_PTR);
5069       builtin_function ("strcpy", string_ftype_ptr_ptr, BUILT_IN_STRCPY,
5070                         NULL_PTR);
5071 #if 0
5072       /* Not yet.  */
5073       builtin_function ("strncpy", strncpy_ftype, BUILT_IN_STRNCPY, NULL_PTR);
5074 #endif
5075       builtin_function ("strlen", sizet_ftype_string, BUILT_IN_STRLEN, NULL_PTR);
5076       builtin_function ("sin", double_ftype_double, BUILT_IN_SIN, NULL_PTR);
5077       builtin_function ("cos", double_ftype_double, BUILT_IN_COS, NULL_PTR);
5078
5079       /* Declare these functions volatile
5080          to avoid spurious "control drops through" warnings.  */
5081       temp = builtin_function ("abort",
5082                                build_function_type (void_type_node, endlink),
5083                                NOT_BUILT_IN, NULL_PTR);
5084       TREE_THIS_VOLATILE (temp) = 1;
5085       TREE_SIDE_EFFECTS (temp) = 1;
5086       /* Well, these are actually ANSI, but we can't set DECL_BUILT_IN on
5087          them...  */
5088       DECL_BUILT_IN_NONANSI (temp) = 1;
5089       temp = builtin_function ("exit", build_function_type (void_type_node,
5090                                                             int_endlink),
5091                                NOT_BUILT_IN, NULL_PTR);
5092       TREE_THIS_VOLATILE (temp) = 1;
5093       TREE_SIDE_EFFECTS (temp) = 1;
5094       DECL_BUILT_IN_NONANSI (temp) = 1;
5095     }
5096
5097 #if 0
5098   /* Support for these has not been written in either expand_builtin
5099      or build_function_call.  */
5100   builtin_function ("__builtin_div", default_ftype, BUILT_IN_DIV, 0);
5101   builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV, 0);
5102   builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR,
5103                     0);
5104   builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL, 0);
5105   builtin_function ("__builtin_fmod", double_ftype_double_double,
5106                     BUILT_IN_FMOD, 0);
5107   builtin_function ("__builtin_frem", double_ftype_double_double,
5108                     BUILT_IN_FREM, 0);
5109   builtin_function ("__builtin_memset", ptr_ftype_ptr_int_int, BUILT_IN_MEMSET,
5110                     0);
5111   builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP,
5112                     0);
5113   builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN,
5114                     0);
5115 #endif
5116
5117   /* C++ extensions */
5118
5119   unknown_type_node = make_node (UNKNOWN_TYPE);
5120 #if 0 /* not yet, should get fixed properly later */
5121   pushdecl (make_type_decl (get_identifier ("unknown type"),
5122                        unknown_type_node));
5123 #else
5124   decl = pushdecl (build_decl (TYPE_DECL, get_identifier ("unknown type"),
5125                         unknown_type_node));
5126   /* Make sure the "unknown type" typedecl gets ignored for debug info.  */
5127   DECL_IGNORED_P (decl) = 1;
5128   TYPE_DECL_SUPPRESS_DEBUG (decl) = 1;
5129 #endif
5130   TYPE_SIZE (unknown_type_node) = TYPE_SIZE (void_type_node);
5131   TYPE_ALIGN (unknown_type_node) = 1;
5132   TYPE_MODE (unknown_type_node) = TYPE_MODE (void_type_node);
5133   /* Indirecting an UNKNOWN_TYPE node yields an UNKNOWN_TYPE node.  */
5134   TREE_TYPE (unknown_type_node) = unknown_type_node;
5135   /* Looking up TYPE_POINTER_TO and TYPE_REFERENCE_TO yield the same result. */
5136   TYPE_POINTER_TO (unknown_type_node) = unknown_type_node;
5137   TYPE_REFERENCE_TO (unknown_type_node) = unknown_type_node;
5138
5139   /* This is for handling opaque types in signatures.  */
5140   opaque_type_node = copy_node (ptr_type_node);
5141   TYPE_MAIN_VARIANT (opaque_type_node) = opaque_type_node;
5142   record_builtin_type (RID_MAX, 0, opaque_type_node);
5143
5144   /* This is special for C++ so functions can be overloaded. */
5145   wchar_type_node
5146     = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (WCHAR_TYPE)));
5147   wchar_type_size = TYPE_PRECISION (wchar_type_node);
5148   signed_wchar_type_node = make_signed_type (wchar_type_size);
5149   unsigned_wchar_type_node = make_unsigned_type (wchar_type_size);
5150   wchar_type_node
5151     = TREE_UNSIGNED (wchar_type_node)
5152       ? unsigned_wchar_type_node
5153       : signed_wchar_type_node;
5154   record_builtin_type (RID_WCHAR, "__wchar_t", wchar_type_node);
5155
5156   /* Artificial declaration of wchar_t -- can be bashed */
5157   wchar_decl_node = build_decl (TYPE_DECL, get_identifier ("wchar_t"),
5158                                 wchar_type_node);
5159   pushdecl (wchar_decl_node);
5160
5161   /* This is for wide string constants.  */
5162   wchar_array_type_node
5163     = build_array_type (wchar_type_node, array_domain_type);
5164
5165   /* This is a hack that should go away when we deliver the
5166      real gc code.  */
5167   if (flag_gc)
5168     {
5169       builtin_function ("__gc_main", default_function_type, NOT_BUILT_IN, 0);
5170       pushdecl (lookup_name (get_identifier ("__gc_main"), 0));
5171     }
5172
5173   if (flag_vtable_thunks)
5174     {
5175       /* Make sure we get a unique function type, so we can give
5176          its pointer type a name.  (This wins for gdb.) */
5177       tree vfunc_type = make_node (FUNCTION_TYPE);
5178       TREE_TYPE (vfunc_type) = integer_type_node;
5179       TYPE_ARG_TYPES (vfunc_type) = NULL_TREE;
5180       layout_type (vfunc_type);
5181
5182       vtable_entry_type = build_pointer_type (vfunc_type);
5183     }
5184   else
5185     {
5186       vtable_entry_type = make_lang_type (RECORD_TYPE);
5187       fields[0] = build_lang_field_decl (FIELD_DECL, delta_identifier,
5188                                          delta_type_node);
5189       fields[1] = build_lang_field_decl (FIELD_DECL, index_identifier,
5190                                          delta_type_node);
5191       fields[2] = build_lang_field_decl (FIELD_DECL, pfn_identifier,
5192                                          ptr_type_node);
5193       finish_builtin_type (vtable_entry_type, VTBL_PTR_TYPE, fields, 2,
5194                            double_type_node);
5195
5196       /* Make this part of an invisible union.  */
5197       fields[3] = copy_node (fields[2]);
5198       TREE_TYPE (fields[3]) = delta_type_node;
5199       DECL_NAME (fields[3]) = delta2_identifier;
5200       DECL_MODE (fields[3]) = TYPE_MODE (delta_type_node);
5201       DECL_SIZE (fields[3]) = TYPE_SIZE (delta_type_node);
5202       TREE_UNSIGNED (fields[3]) = 0;
5203       TREE_CHAIN (fields[2]) = fields[3];
5204       vtable_entry_type = build_type_variant (vtable_entry_type, 1, 0);
5205     }
5206   record_builtin_type (RID_MAX, VTBL_PTR_TYPE, vtable_entry_type);
5207
5208   vtbl_type_node
5209     = build_array_type (vtable_entry_type, NULL_TREE);
5210   layout_type (vtbl_type_node);
5211   vtbl_type_node = cp_build_type_variant (vtbl_type_node, 1, 0);
5212   record_builtin_type (RID_MAX, NULL_PTR, vtbl_type_node);
5213
5214   /* Simplify life by making a "sigtable_entry_type".  Give its
5215      fields names so that the debugger can use them.  */
5216
5217   if (flag_handle_signatures)
5218     {
5219       sigtable_entry_type = make_lang_type (RECORD_TYPE);
5220       fields[0] = build_lang_field_decl (FIELD_DECL,
5221                                          get_identifier (SIGTABLE_CODE_NAME),
5222                                          short_integer_type_node);
5223       fields[1] = build_lang_field_decl (FIELD_DECL,
5224                                          get_identifier (SIGTABLE_OFFSET_NAME),
5225                                          short_integer_type_node);
5226       fields[2] = build_lang_field_decl (FIELD_DECL,
5227                                          get_identifier (SIGTABLE_PFN_NAME),
5228                                          ptr_type_node);
5229       finish_builtin_type (sigtable_entry_type, SIGTABLE_PTR_TYPE, fields, 2,
5230                            double_type_node);
5231       sigtable_entry_type = build_type_variant (sigtable_entry_type, 1, 0);
5232       record_builtin_type (RID_MAX, SIGTABLE_PTR_TYPE, sigtable_entry_type);
5233     }
5234
5235 #if 0
5236   if (flag_rtti)
5237     {
5238       /* Must build __t_desc type.  Currently, type descriptors look like this:
5239
5240          struct __t_desc
5241          {
5242            const char *name;
5243            int size;
5244            int bits;
5245            struct __t_desc *points_to;
5246            int ivars_count, meths_count;
5247            struct __i_desc *ivars[];
5248            struct __m_desc *meths[];
5249            struct __t_desc *parents[];
5250            struct __t_desc *vbases[];
5251            int offsets[];
5252          };
5253
5254          ...as per Linton's paper.  */
5255
5256       __t_desc_type_node = make_lang_type (RECORD_TYPE);
5257       __i_desc_type_node = make_lang_type (RECORD_TYPE);
5258       __m_desc_type_node = make_lang_type (RECORD_TYPE);
5259       __t_desc_array_type =
5260         build_array_type (TYPE_POINTER_TO (__t_desc_type_node), NULL_TREE);
5261       __i_desc_array_type =
5262         build_array_type (TYPE_POINTER_TO (__i_desc_type_node), NULL_TREE);
5263       __m_desc_array_type =
5264         build_array_type (TYPE_POINTER_TO (__m_desc_type_node), NULL_TREE);
5265
5266       fields[0] = build_lang_field_decl (FIELD_DECL, get_identifier ("name"),
5267                                          string_type_node);
5268       fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier ("size"),
5269                                          unsigned_type_node);
5270       fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier ("bits"),
5271                                          unsigned_type_node);
5272       fields[3] = build_lang_field_decl (FIELD_DECL,
5273                                          get_identifier ("points_to"),
5274                                          TYPE_POINTER_TO (__t_desc_type_node));
5275       fields[4] = build_lang_field_decl (FIELD_DECL,
5276                                          get_identifier ("ivars_count"),
5277                                          integer_type_node);
5278       fields[5] = build_lang_field_decl (FIELD_DECL,
5279                                          get_identifier ("meths_count"),
5280                                          integer_type_node);
5281       fields[6] = build_lang_field_decl (FIELD_DECL, get_identifier ("ivars"),
5282                                          build_pointer_type (__i_desc_array_type));
5283       fields[7] = build_lang_field_decl (FIELD_DECL, get_identifier ("meths"),
5284                                          build_pointer_type (__m_desc_array_type));
5285       fields[8] = build_lang_field_decl (FIELD_DECL, get_identifier ("parents"),
5286                                          build_pointer_type (__t_desc_array_type));
5287       fields[9] = build_lang_field_decl (FIELD_DECL, get_identifier ("vbases"),
5288                                          build_pointer_type (__t_desc_array_type));
5289       fields[10] = build_lang_field_decl (FIELD_DECL, get_identifier ("offsets"),
5290                                          build_pointer_type (integer_type_node));
5291       finish_builtin_type (__t_desc_type_node, "__t_desc", fields, 10, integer_type_node);
5292
5293       /* ivar descriptors look like this:
5294
5295          struct __i_desc
5296          {
5297            const char *name;
5298            int offset;
5299            struct __t_desc *type;
5300          };
5301       */
5302
5303       fields[0] = build_lang_field_decl (FIELD_DECL, get_identifier ("name"),
5304                                          string_type_node);
5305       fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier ("offset"),
5306                                          integer_type_node);
5307       fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier ("type"),
5308                                          TYPE_POINTER_TO (__t_desc_type_node));
5309       finish_builtin_type (__i_desc_type_node, "__i_desc", fields, 2,
5310                            integer_type_node);
5311
5312       /* method descriptors look like this:
5313
5314          struct __m_desc
5315          {
5316            const char *name;
5317            int vindex;
5318            struct __t_desc *vcontext;
5319            struct __t_desc *return_type;
5320            void (*address)();
5321            short parm_count;
5322            short required_parms;
5323            struct __t_desc *parm_types[];
5324          };
5325       */
5326
5327       fields[0] = build_lang_field_decl (FIELD_DECL, get_identifier ("name"),
5328                                          string_type_node);
5329       fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier ("vindex"),
5330                                          integer_type_node);
5331       fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier ("vcontext"),
5332                                          TYPE_POINTER_TO (__t_desc_type_node));
5333       fields[3] = build_lang_field_decl (FIELD_DECL, get_identifier ("return_type"),
5334                                          TYPE_POINTER_TO (__t_desc_type_node));
5335       fields[4] = build_lang_field_decl (FIELD_DECL, get_identifier ("address"),
5336                                          build_pointer_type (default_function_type));
5337       fields[5] = build_lang_field_decl (FIELD_DECL, get_identifier ("parm_count"),
5338                                          short_integer_type_node);
5339       fields[6] = build_lang_field_decl (FIELD_DECL, get_identifier ("required_parms"),
5340                                          short_integer_type_node);
5341       fields[7] = build_lang_field_decl (FIELD_DECL, get_identifier ("parm_types"),
5342                                          build_pointer_type (build_array_type (TYPE_POINTER_TO (__t_desc_type_node), NULL_TREE)));
5343       finish_builtin_type (__m_desc_type_node, "__m_desc", fields, 7,
5344                            integer_type_node);
5345     }
5346
5347   if (flag_rtti)
5348     {
5349       int i = builtin_type_tdescs_len;
5350       while (i > 0)
5351         {
5352           tree tdesc = build_t_desc (builtin_type_tdescs_arr[--i], 0);
5353           TREE_ASM_WRITTEN (tdesc) = 1;
5354           TREE_PUBLIC (TREE_OPERAND (tdesc, 0)) = 1;
5355         }
5356     }
5357 #endif /*flag_rtti*/
5358
5359   /* Now, C++.  */
5360   current_lang_name = lang_name_cplusplus;
5361
5362   auto_function (ansi_opname[(int) NEW_EXPR],
5363                  build_function_type (ptr_type_node,
5364                                       tree_cons (NULL_TREE, sizetype,
5365                                                  void_list_node)),
5366                  NOT_BUILT_IN);
5367   auto_function (ansi_opname[(int) VEC_NEW_EXPR],
5368                  build_function_type (ptr_type_node,
5369                                       tree_cons (NULL_TREE, sizetype,
5370                                                  void_list_node)),
5371                  NOT_BUILT_IN);
5372   auto_function (ansi_opname[(int) DELETE_EXPR],
5373                  build_function_type (void_type_node,
5374                                       tree_cons (NULL_TREE, ptr_type_node,
5375                                                  void_list_node)),
5376                  NOT_BUILT_IN);
5377   auto_function (ansi_opname[(int) VEC_DELETE_EXPR],
5378                  build_function_type (void_type_node,
5379                                       tree_cons (NULL_TREE, ptr_type_node,
5380                                                  void_list_node)),
5381                  NOT_BUILT_IN);
5382
5383   abort_fndecl
5384     = define_function ("__pure_virtual",
5385                        build_function_type (void_type_node, void_list_node),
5386                        NOT_BUILT_IN, 0, 0);
5387
5388   /* Perform other language dependent initializations.  */
5389   init_class_processing ();
5390   init_init_processing ();
5391   init_search_processing ();
5392
5393   if (flag_handle_exceptions)
5394     init_exception_processing ();
5395   if (flag_gc)
5396     init_gc_processing ();
5397   if (flag_no_inline)
5398     {
5399       flag_inline_functions = 0;
5400 #if 0
5401       /* This causes unnecessary emission of inline functions.  */
5402       flag_default_inline = 0;
5403 #endif
5404     }
5405   if (flag_cadillac)
5406     init_cadillac ();
5407
5408   /* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__.  */
5409   declare_function_name ();
5410
5411   /* Prepare to check format strings against argument lists.  */
5412   init_function_format_info ();
5413 }
5414
5415 /* initialize type descriptor type node of various rtti type. */
5416
5417 int
5418 init_type_desc()
5419 {
5420   tree tdecl;
5421
5422   tdecl = lookup_name (get_identifier ("type_info"), 0);
5423   if (tdecl == NULL_TREE)
5424     return 0;
5425   __t_desc_type_node = TREE_TYPE(tdecl);
5426   __tp_desc_type_node = build_pointer_type (__t_desc_type_node);
5427
5428 #if 0
5429   tdecl = lookup_name (get_identifier ("__baselist_type_info"), 0);
5430   if (tdecl == NULL_TREE)
5431     return 0;
5432   __baselist_desc_type_node = TREE_TYPE (tdecl);
5433 #endif
5434
5435   tdecl = lookup_name (get_identifier ("__builtin_type_info"), 0);
5436   if (tdecl == NULL_TREE)
5437     return 0;
5438   __bltn_desc_type_node = TREE_TYPE (tdecl);
5439
5440   tdecl = lookup_name (get_identifier ("__user_type_info"), 0);
5441   if (tdecl == NULL_TREE)
5442     return 0;
5443   __user_desc_type_node = TREE_TYPE (tdecl);
5444
5445   tdecl = lookup_name (get_identifier ("__class_type_info"), 0);
5446   if (tdecl == NULL_TREE)
5447     return 0;
5448   __class_desc_type_node = TREE_TYPE (tdecl);
5449
5450   tdecl = lookup_field (__class_desc_type_node, 
5451         get_identifier ("access_mode"), 0, 0);
5452   if (tdecl == NULL_TREE)
5453     return 0;
5454   __access_mode_type_node = TREE_TYPE (tdecl);
5455
5456   tdecl = lookup_name (get_identifier ("__attr_type_info"), 0);
5457   if (tdecl == NULL_TREE)
5458     return 0;
5459   __attr_desc_type_node = TREE_TYPE (tdecl);
5460
5461   tdecl = lookup_name (get_identifier ("__pointer_type_info"), 0);
5462   if (tdecl == NULL_TREE)
5463     return 0;
5464   __ptr_desc_type_node = TREE_TYPE (tdecl);
5465
5466   tdecl = lookup_name (get_identifier ("__func_type_info"), 0);
5467   if (tdecl == NULL_TREE)
5468     return 0;
5469   __func_desc_type_node = TREE_TYPE (tdecl);
5470
5471   tdecl = lookup_name (get_identifier ("__ptmf_type_info"), 0);
5472   if (tdecl == NULL_TREE)
5473     return 0;
5474   __ptmf_desc_type_node = TREE_TYPE (tdecl);
5475
5476   tdecl = lookup_name (get_identifier ("__ptmd_type_info"), 0);
5477   if (tdecl == NULL_TREE)
5478     return 0;
5479   __ptmd_desc_type_node = TREE_TYPE (tdecl);
5480
5481   return 1;
5482 }
5483 /* Make a definition for a builtin function named NAME and whose data type
5484    is TYPE.  TYPE should be a function type with argument types.
5485    FUNCTION_CODE tells later passes how to compile calls to this function.
5486    See tree.h for its possible values.
5487
5488    If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
5489    the name to be called if we can't opencode the function.  */
5490
5491 tree
5492 define_function (name, type, function_code, pfn, library_name)
5493      char *name;
5494      tree type;
5495      enum built_in_function function_code;
5496      void (*pfn)();
5497      char *library_name;
5498 {
5499   tree decl = build_lang_decl (FUNCTION_DECL, get_identifier (name), type);
5500   DECL_EXTERNAL (decl) = 1;
5501   TREE_PUBLIC (decl) = 1;
5502   DECL_ARTIFICIAL (decl) = 1;
5503
5504   /* Since `pushdecl' relies on DECL_ASSEMBLER_NAME instead of DECL_NAME,
5505      we cannot change DECL_ASSEMBLER_NAME until we have installed this
5506      function in the namespace.  */
5507   if (pfn) (*pfn) (decl);
5508   if (library_name)
5509     DECL_ASSEMBLER_NAME (decl) = get_identifier (library_name);
5510   make_function_rtl (decl);
5511   if (function_code != NOT_BUILT_IN)
5512     {
5513       DECL_BUILT_IN (decl) = 1;
5514       DECL_FUNCTION_CODE (decl) = function_code;
5515     }
5516   return decl;
5517 }
5518 \f
5519 /* Called when a declaration is seen that contains no names to declare.
5520    If its type is a reference to a structure, union or enum inherited
5521    from a containing scope, shadow that tag name for the current scope
5522    with a forward reference.
5523    If its type defines a new named structure or union
5524    or defines an enum, it is valid but we need not do anything here.
5525    Otherwise, it is an error.
5526
5527    C++: may have to grok the declspecs to learn about static,
5528    complain for anonymous unions.  */
5529
5530 void
5531 shadow_tag (declspecs)
5532      tree declspecs;
5533 {
5534   int found_tag = 0;
5535   tree ob_modifier = NULL_TREE;
5536   register tree link;
5537   register enum tree_code code, ok_code = ERROR_MARK;
5538   register tree t = NULL_TREE;
5539
5540   for (link = declspecs; link; link = TREE_CHAIN (link))
5541     {
5542       register tree value = TREE_VALUE (link);
5543
5544       code = TREE_CODE (value);
5545       if (IS_AGGR_TYPE_CODE (code) || code == ENUMERAL_TYPE)
5546         {
5547           my_friendly_assert (TYPE_NAME (value) != NULL_TREE, 261);
5548
5549           if (code == ENUMERAL_TYPE && TYPE_SIZE (value) == 0)
5550             cp_error ("forward declaration of `%#T'", value);
5551
5552           t = value;
5553           ok_code = code;
5554           found_tag++;
5555         }
5556       else if (value == ridpointers[(int) RID_STATIC]
5557                || value == ridpointers[(int) RID_EXTERN]
5558                || value == ridpointers[(int) RID_AUTO]
5559                || value == ridpointers[(int) RID_REGISTER]
5560                || value == ridpointers[(int) RID_INLINE]
5561                || value == ridpointers[(int) RID_VIRTUAL]
5562                || value == ridpointers[(int) RID_EXPLICIT])
5563         ob_modifier = value;
5564     }
5565
5566   /* This is where the variables in an anonymous union are
5567      declared.  An anonymous union declaration looks like:
5568      union { ... } ;
5569      because there is no declarator after the union, the parser
5570      sends that declaration here.  */
5571   if (ok_code == UNION_TYPE
5572       && t != NULL_TREE
5573       && ((TREE_CODE (TYPE_NAME (t)) == IDENTIFIER_NODE
5574            && ANON_AGGRNAME_P (TYPE_NAME (t)))
5575           || (TREE_CODE (TYPE_NAME (t)) == TYPE_DECL
5576               && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t)))))
5577     {
5578       /* ANSI C++ June 5 1992 WP 9.5.3.  Anonymous unions may not have
5579          function members.  */
5580       if (TYPE_FIELDS (t))
5581         {
5582           tree decl = grokdeclarator (NULL_TREE, declspecs, NORMAL, 0,
5583                                       NULL_TREE);
5584           finish_anon_union (decl);
5585         }
5586       else
5587         error ("anonymous union cannot have a function member");
5588     }
5589   else
5590     {
5591       /* Anonymous unions are objects, that's why we only check for
5592          inappropriate specifiers in this branch.  */
5593
5594       if (ob_modifier)
5595         {
5596           if (ob_modifier == ridpointers[(int) RID_INLINE]
5597               || ob_modifier == ridpointers[(int) RID_VIRTUAL])
5598             cp_error ("`%D' can only be specified for functions", ob_modifier);
5599           else if (ob_modifier == ridpointers[(int) RID_EXPLICIT])
5600             cp_error ("`%D' can only be specified for constructors",
5601                       ob_modifier);
5602           else
5603             cp_error ("`%D' can only be specified for objects and functions",
5604                       ob_modifier);
5605         }
5606
5607       if (found_tag == 0)
5608         pedwarn ("abstract declarator used as declaration");
5609       else if (found_tag > 1)
5610         pedwarn ("multiple types in one declaration");
5611     }
5612 }
5613 \f
5614 /* Decode a "typename", such as "int **", returning a ..._TYPE node.  */
5615
5616 tree
5617 groktypename (typename)
5618      tree typename;
5619 {
5620   if (TREE_CODE (typename) != TREE_LIST)
5621     return typename;
5622   return grokdeclarator (TREE_VALUE (typename),
5623                          TREE_PURPOSE (typename),
5624                          TYPENAME, 0, NULL_TREE);
5625 }
5626
5627 /* Decode a declarator in an ordinary declaration or data definition.
5628    This is called as soon as the type information and variable name
5629    have been parsed, before parsing the initializer if any.
5630    Here we create the ..._DECL node, fill in its type,
5631    and put it on the list of decls for the current context.
5632    The ..._DECL node is returned as the value.
5633
5634    Exception: for arrays where the length is not specified,
5635    the type is left null, to be filled in by `cp_finish_decl'.
5636
5637    Function definitions do not come here; they go to start_function
5638    instead.  However, external and forward declarations of functions
5639    do go through here.  Structure field declarations are done by
5640    grokfield and not through here.  */
5641
5642 /* Set this to zero to debug not using the temporary obstack
5643    to parse initializers.  */
5644 int debug_temp_inits = 1;
5645
5646 tree
5647 start_decl (declarator, declspecs, initialized, raises)
5648      tree declarator, declspecs;
5649      int initialized;
5650      tree raises;
5651 {
5652   register tree decl;
5653   register tree type, tem;
5654   tree context;
5655   extern int have_extern_spec;
5656   extern int used_extern_spec;
5657
5658   int init_written = initialized;
5659
5660   /* This should only be done once on the top most decl. */
5661   if (have_extern_spec && !used_extern_spec)
5662     {
5663       declspecs = decl_tree_cons (NULL_TREE, get_identifier ("extern"),
5664                                   declspecs);
5665       used_extern_spec = 1;
5666     }
5667
5668   decl = grokdeclarator (declarator, declspecs, NORMAL, initialized, raises);
5669   if (decl == NULL_TREE || decl == void_type_node)
5670     return NULL_TREE;
5671
5672   type = TREE_TYPE (decl);
5673
5674   /* Don't lose if destructors must be executed at file-level.  */
5675   if (TREE_STATIC (decl)
5676       && TYPE_NEEDS_DESTRUCTOR (type)
5677       && !TREE_PERMANENT (decl))
5678     {
5679       push_obstacks (&permanent_obstack, &permanent_obstack);
5680       decl = copy_node (decl);
5681       if (TREE_CODE (type) == ARRAY_TYPE)
5682         {
5683           tree itype = TYPE_DOMAIN (type);
5684           if (itype && ! TREE_PERMANENT (itype))
5685             {
5686               itype = build_index_type (copy_to_permanent (TYPE_MAX_VALUE (itype)));
5687               type = build_cplus_array_type (TREE_TYPE (type), itype);
5688               TREE_TYPE (decl) = type;
5689             }
5690         }
5691       pop_obstacks ();
5692     }
5693
5694   /* Corresponding pop_obstacks is done in `cp_finish_decl'.  */
5695   push_obstacks_nochange ();
5696
5697   context
5698     = (TREE_CODE (decl) == FUNCTION_DECL && DECL_VIRTUAL_P (decl))
5699       ? DECL_CLASS_CONTEXT (decl)
5700       : DECL_CONTEXT (decl);
5701
5702   if (processing_template_decl)
5703     {
5704       tree d;
5705       if (TREE_CODE (decl) == FUNCTION_DECL)
5706         {
5707           /* Declarator is a call_expr; extract arguments from it, since
5708              grokdeclarator didn't do it.  */
5709           tree args;
5710           args = copy_to_permanent (last_function_parms);
5711           if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
5712             {
5713               tree t = TREE_TYPE (decl);
5714               
5715               t = TYPE_METHOD_BASETYPE (t); /* type method belongs to */
5716               if (TREE_CODE (t) != UNINSTANTIATED_P_TYPE)
5717                 {
5718                   t = build_pointer_type (t); /* base type of `this' */
5719 #if 1
5720                   /* I suspect this is wrong. */
5721                   t = build_type_variant (t, flag_this_is_variable <= 0,
5722                                           0); /* type of `this' */
5723 #else
5724                   t = build_type_variant (t, 0, 0); /* type of `this' */
5725 #endif
5726                   t = build (PARM_DECL, t, this_identifier);
5727                   TREE_CHAIN (t) = args;
5728                   args = t;
5729                 }
5730             }
5731           DECL_ARGUMENTS (decl) = args;
5732         }
5733       d = build_lang_decl (TEMPLATE_DECL, DECL_NAME (decl), TREE_TYPE (decl));
5734       TREE_PUBLIC (d) = TREE_PUBLIC (decl);
5735       TREE_STATIC (d) = TREE_STATIC (decl);
5736       DECL_EXTERNAL (d) = (DECL_EXTERNAL (decl)
5737                            && !(context && !DECL_THIS_EXTERN (decl)));
5738       DECL_TEMPLATE_RESULT (d) = decl;
5739       decl = d;
5740     }
5741
5742   /* If this type of object needs a cleanup, and control may
5743      jump past it, make a new binding level so that it is cleaned
5744      up only when it is initialized first.  */
5745   if (TYPE_NEEDS_DESTRUCTOR (type)
5746       && current_binding_level->more_cleanups_ok == 0)
5747     pushlevel_temporary (1);
5748
5749   if (initialized)
5750     /* Is it valid for this decl to have an initializer at all?
5751        If not, set INITIALIZED to zero, which will indirectly
5752        tell `cp_finish_decl' to ignore the initializer once it is parsed.  */
5753     switch (TREE_CODE (decl))
5754       {
5755       case TYPE_DECL:
5756         /* typedef foo = bar  means give foo the same type as bar.
5757            We haven't parsed bar yet, so `cp_finish_decl' will fix that up.
5758            Any other case of an initialization in a TYPE_DECL is an error.  */
5759         if (pedantic || list_length (declspecs) > 1)
5760           {
5761             cp_error ("typedef `%D' is initialized", decl);
5762             initialized = 0;
5763           }
5764         break;
5765
5766       case FUNCTION_DECL:
5767         cp_error ("function `%#D' is initialized like a variable", decl);
5768         initialized = 0;
5769         break;
5770
5771       default:
5772         /* Don't allow initializations for incomplete types except for
5773            arrays which might be completed by the initialization.  */
5774         if (type == error_mark_node)
5775           ;                     /* Don't complain again.  */
5776         else if (TYPE_SIZE (type) != NULL_TREE)
5777           ;                     /* A complete type is ok.  */
5778         else if (TREE_CODE (type) != ARRAY_TYPE)
5779           {
5780             cp_error ("variable `%#D' has initializer but incomplete type",
5781                       decl);
5782             initialized = 0;
5783           }
5784         else if (TYPE_SIZE (TREE_TYPE (type)) == NULL_TREE)
5785           {
5786             cp_error ("elements of array `%#D' have incomplete type", decl);
5787             initialized = 0;
5788           }
5789       }
5790
5791   if (!initialized
5792       && TREE_CODE (decl) != TYPE_DECL
5793       && TREE_CODE (decl) != TEMPLATE_DECL
5794       && IS_AGGR_TYPE (type) && ! DECL_EXTERNAL (decl))
5795     {
5796       if (TYPE_SIZE (type) == NULL_TREE)
5797         {
5798           cp_error ("aggregate `%#D' has incomplete type and cannot be initialized",
5799                  decl);
5800           /* Change the type so that assemble_variable will give
5801              DECL an rtl we can live with: (mem (const_int 0)).  */
5802           TREE_TYPE (decl) = error_mark_node;
5803           type = error_mark_node;
5804         }
5805       else
5806         {
5807           /* If any base type in the hierarchy of TYPE needs a constructor,
5808              then we set initialized to 1.  This way any nodes which are
5809              created for the purposes of initializing this aggregate
5810              will live as long as it does.  This is necessary for global
5811              aggregates which do not have their initializers processed until
5812              the end of the file.  */
5813           initialized = TYPE_NEEDS_CONSTRUCTING (type);
5814         }
5815     }
5816
5817   if (initialized)
5818     {
5819       if (! toplevel_bindings_p ()
5820           && DECL_EXTERNAL (decl))
5821         cp_warning ("declaration of `%#D' has `extern' and is initialized",
5822                     decl);
5823       DECL_EXTERNAL (decl) = 0;
5824       if ( toplevel_bindings_p ())
5825         TREE_STATIC (decl) = 1;
5826
5827       /* Tell `pushdecl' this is an initialized decl
5828          even though we don't yet have the initializer expression.
5829          Also tell `cp_finish_decl' it may store the real initializer.  */
5830       DECL_INITIAL (decl) = error_mark_node;
5831     }
5832
5833   if (context && TYPE_SIZE (context) != NULL_TREE)
5834     {
5835       if (TREE_CODE (decl) == VAR_DECL)
5836         {
5837           tree field = lookup_field (context, DECL_NAME (decl), 0, 0);
5838           if (field == NULL_TREE || TREE_CODE (field) != VAR_DECL)
5839             cp_error ("`%#D' is not a static member of `%#T'", decl, context);
5840           else if (duplicate_decls (decl, field))
5841             decl = field;
5842         }
5843       
5844       /* If it was not explicitly declared `extern',
5845          revoke any previous claims of DECL_EXTERNAL.  */
5846       if (DECL_THIS_EXTERN (decl) == 0)
5847         DECL_EXTERNAL (decl) = 0;
5848       if (DECL_LANG_SPECIFIC (decl))
5849         DECL_IN_AGGR_P (decl) = 0;
5850       pushclass (context, 2);
5851     }
5852
5853   /* Add this decl to the current binding level, but not if it
5854      comes from another scope, e.g. a static member variable.
5855      TEM may equal DECL or it may be a previous decl of the same name.  */
5856   
5857   if ((TREE_CODE (decl) != PARM_DECL && DECL_CONTEXT (decl) != NULL_TREE)
5858       || (TREE_CODE (decl) == TEMPLATE_DECL && !global_bindings_p ())
5859       || TREE_CODE (type) == LANG_TYPE)
5860     tem = decl;
5861   else
5862     tem = pushdecl (decl);
5863              
5864   /* Tell the back-end to use or not use .common as appropriate.  If we say
5865      -fconserve-space, we want this to save space, at the expense of wrong
5866      semantics.  If we say -fno-conserve-space, we want this to produce
5867      errors about redefs; to do this we force variables into the data
5868      segment.  Common storage is okay for non-public uninitialized data;
5869      the linker can't match it with storage from other files, and we may
5870      save some disk space.  */
5871   DECL_COMMON (tem) = flag_conserve_space || ! TREE_PUBLIC (tem);
5872
5873 #if 0
5874   /* We don't do this yet for GNU C++.  */
5875   /* For a local variable, define the RTL now.  */
5876   if (! toplevel_bindings_p ()
5877       /* But not if this is a duplicate decl
5878          and we preserved the rtl from the previous one
5879          (which may or may not happen).  */
5880       && DECL_RTL (tem) == NULL_RTX)
5881     {
5882       if (TYPE_SIZE (TREE_TYPE (tem)) != NULL_TREE)
5883         expand_decl (tem);
5884       else if (TREE_CODE (TREE_TYPE (tem)) == ARRAY_TYPE
5885                && DECL_INITIAL (tem) != NULL_TREE)
5886         expand_decl (tem);
5887     }
5888 #endif
5889
5890   if (TREE_CODE (decl) == TEMPLATE_DECL)
5891     {
5892       tree result = DECL_TEMPLATE_RESULT (decl);
5893       if (DECL_CONTEXT (result) != NULL_TREE)
5894         {
5895           tree type;
5896           type = DECL_CONTEXT (result);
5897
5898           if (TREE_CODE (type) != UNINSTANTIATED_P_TYPE)
5899             {
5900               cp_error ("declaration of `%D' in non-template type `%T'",
5901                         decl, type);
5902               return NULL_TREE;
5903             }
5904
5905           if (TREE_CODE (result) == FUNCTION_DECL)
5906             return tem;
5907           else if (TREE_CODE (result) == VAR_DECL)
5908             {
5909 #if 0
5910               tree tmpl = UPT_TEMPLATE (type);
5911               
5912               fprintf (stderr, "%s:%d: adding ", __FILE__, __LINE__);
5913               print_node_brief (stderr, "", DECL_NAME (tem), 0);
5914               fprintf (stderr, " to class %s\n",
5915                        IDENTIFIER_POINTER (DECL_NAME (tmpl)));
5916               DECL_TEMPLATE_MEMBERS (tmpl)
5917                 = perm_tree_cons (DECL_NAME (tem), tem,
5918                                   DECL_TEMPLATE_MEMBERS (tmpl));
5919               return tem;
5920 #else
5921               sorry ("static data member templates");
5922               return NULL_TREE;
5923 #endif
5924             }
5925           else
5926             my_friendly_abort (13);
5927         }
5928       else if (TREE_CODE (result) == FUNCTION_DECL)
5929         /*tem = push_overloaded_decl (tem, 0)*/;
5930       else if (TREE_CODE (result) == VAR_DECL)
5931         {
5932           cp_error ("data template `%#D' must be member of a class template",
5933                     result);
5934           return NULL_TREE;
5935         }
5936       else if (TREE_CODE (result) == TYPE_DECL)
5937         {
5938           cp_error ("invalid template `%#D'", result);
5939           return NULL_TREE;
5940         }
5941       else
5942         my_friendly_abort (14);
5943     }
5944
5945   if (init_written
5946       && ! (TREE_CODE (tem) == PARM_DECL
5947             || (TREE_READONLY (tem)
5948                 && (TREE_CODE (tem) == VAR_DECL
5949                     || TREE_CODE (tem) == FIELD_DECL))))
5950     {
5951       /* When parsing and digesting the initializer,
5952          use temporary storage.  Do this even if we will ignore the value.  */
5953       if (toplevel_bindings_p () && debug_temp_inits)
5954         {
5955           if (TYPE_NEEDS_CONSTRUCTING (type)
5956               || TREE_CODE (type) == REFERENCE_TYPE)
5957             /* In this case, the initializer must lay down in permanent
5958                storage, since it will be saved until `finish_file' is run.   */
5959             ;
5960           else
5961             temporary_allocation ();
5962         }
5963     }
5964
5965   if (flag_cadillac)
5966     cadillac_start_decl (tem);
5967
5968   return tem;
5969 }
5970
5971 #if 0                           /* unused */
5972 static void
5973 make_temporary_for_reference (decl, ctor_call, init, cleanupp)
5974      tree decl, ctor_call, init;
5975      tree *cleanupp;
5976 {
5977   tree type = TREE_TYPE (decl);
5978   tree target_type = TREE_TYPE (type);
5979   tree tmp, tmp_addr;
5980
5981   if (ctor_call)
5982     {
5983       tmp_addr = TREE_VALUE (TREE_OPERAND (ctor_call, 1));
5984       if (TREE_CODE (tmp_addr) == NOP_EXPR)
5985         tmp_addr = TREE_OPERAND (tmp_addr, 0);
5986       my_friendly_assert (TREE_CODE (tmp_addr) == ADDR_EXPR, 146);
5987       tmp = TREE_OPERAND (tmp_addr, 0);
5988     }
5989   else
5990     {
5991       tmp = get_temp_name (target_type, toplevel_bindings_p ());
5992       tmp_addr = build_unary_op (ADDR_EXPR, tmp, 0);
5993     }
5994
5995   TREE_TYPE (tmp_addr) = build_pointer_type (target_type);
5996   DECL_INITIAL (decl) = convert (TYPE_POINTER_TO (target_type), tmp_addr);
5997   TREE_TYPE (DECL_INITIAL (decl)) = type;
5998   if (TYPE_NEEDS_CONSTRUCTING (target_type))
5999     {
6000       if (toplevel_bindings_p ())
6001         {
6002           /* lay this variable out now.  Otherwise `output_addressed_constants'
6003              gets confused by its initializer.  */
6004           make_decl_rtl (tmp, NULL_PTR, 1);
6005           static_aggregates = perm_tree_cons (init, tmp, static_aggregates);
6006         }
6007       else
6008         {
6009           if (ctor_call != NULL_TREE)
6010             init = ctor_call;
6011           else
6012             init = build_method_call (tmp, constructor_name_full (target_type),
6013                                       build_tree_list (NULL_TREE, init),
6014                                       NULL_TREE, LOOKUP_NORMAL);
6015           DECL_INITIAL (decl) = build (COMPOUND_EXPR, type, init,
6016                                        DECL_INITIAL (decl));
6017           *cleanupp = maybe_build_cleanup (tmp);
6018         }
6019     }
6020   else
6021     {
6022       DECL_INITIAL (tmp) = init;
6023       TREE_STATIC (tmp) = toplevel_bindings_p ();
6024       cp_finish_decl (tmp, init, NULL_TREE, 0, LOOKUP_ONLYCONVERTING);
6025     }
6026   if (TREE_STATIC (tmp))
6027     preserve_initializer ();
6028 }
6029 #endif
6030
6031 /* Handle initialization of references.
6032    These three arguments from from `cp_finish_decl', and have the
6033    same meaning here that they do there.  */
6034 /* quotes on semantics can be found in ARM 8.4.3. */
6035 static void
6036 grok_reference_init (decl, type, init, cleanupp)
6037      tree decl, type, init;
6038      tree *cleanupp;
6039 {
6040   tree tmp;
6041
6042   if (init == NULL_TREE)
6043     {
6044       if ((DECL_LANG_SPECIFIC (decl) == 0
6045            || DECL_IN_AGGR_P (decl) == 0)
6046           && ! DECL_THIS_EXTERN (decl))
6047         {
6048           cp_error ("`%D' declared as reference but not initialized", decl);
6049           if (TREE_CODE (decl) == VAR_DECL)
6050             SET_DECL_REFERENCE_SLOT (decl, error_mark_node);
6051         }
6052       return;
6053     }
6054
6055   if (init == error_mark_node)
6056     return;
6057
6058   if (TREE_CODE (type) == REFERENCE_TYPE
6059       && TREE_CODE (init) == CONSTRUCTOR)
6060     {
6061       cp_error ("ANSI C++ forbids use of initializer list to initialize reference `%D'", decl);
6062       return;
6063     }
6064
6065   if (TREE_CODE (init) == TREE_LIST)
6066     init = build_compound_expr (init);
6067
6068   if (TREE_CODE (TREE_TYPE (init)) == REFERENCE_TYPE)
6069     init = convert_from_reference (init);
6070
6071   if (TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE
6072       && TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE)
6073     {
6074       /* Note: default conversion is only called in very special cases.  */
6075       init = default_conversion (init);
6076     }
6077
6078   tmp = convert_to_reference
6079     (type, init, CONV_IMPLICIT, LOOKUP_SPECULATIVELY|LOOKUP_NORMAL, decl);
6080
6081   if (tmp == error_mark_node)
6082     goto fail;
6083   else if (tmp != NULL_TREE)
6084     {
6085       tree subtype = TREE_TYPE (type);
6086       init = tmp;
6087
6088       /* Associate the cleanup with the reference so that we
6089          don't get burned by "aggressive" cleanup policy.  */
6090       if (TYPE_NEEDS_DESTRUCTOR (subtype))
6091         {
6092           if (TREE_CODE (init) == WITH_CLEANUP_EXPR)
6093             {
6094               *cleanupp = TREE_OPERAND (init, 2);
6095               TREE_OPERAND (init, 2) = error_mark_node;
6096             }
6097           else
6098             {
6099               if (TREE_CODE (tmp) == ADDR_EXPR)
6100                 tmp = TREE_OPERAND (tmp, 0);
6101               if (TREE_CODE (tmp) == TARGET_EXPR)
6102                 {
6103                   *cleanupp = build_delete
6104                     (TYPE_POINTER_TO (subtype),
6105                      build_unary_op (ADDR_EXPR, TREE_OPERAND (tmp, 0), 0),
6106                      integer_two_node, LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0);
6107                   TREE_OPERAND (tmp, 2) = error_mark_node;
6108                 }
6109             }
6110         }
6111
6112       DECL_INITIAL (decl) = save_expr (init);
6113     }
6114   else
6115     {
6116       cp_error ("cannot initialize `%T' from `%T'", type, TREE_TYPE (init));
6117       goto fail;
6118     }
6119
6120   /* ?? Can this be optimized in some cases to
6121      hand back the DECL_INITIAL slot??  */
6122   if (TYPE_SIZE (TREE_TYPE (type)))
6123     {
6124       init = convert_from_reference (decl);
6125       if (TREE_PERMANENT (decl))
6126         init = copy_to_permanent (init);
6127       SET_DECL_REFERENCE_SLOT (decl, init);
6128     }
6129
6130   if (TREE_STATIC (decl) && ! TREE_CONSTANT (DECL_INITIAL (decl)))
6131     {
6132       expand_static_init (decl, DECL_INITIAL (decl));
6133       DECL_INITIAL (decl) = NULL_TREE;
6134     }
6135   return;
6136
6137  fail:
6138   if (TREE_CODE (decl) == VAR_DECL)
6139     SET_DECL_REFERENCE_SLOT (decl, error_mark_node);
6140   return;
6141 }
6142
6143 /* Fill in DECL_INITIAL with some magical value to prevent expand_decl from
6144    mucking with forces it does not comprehend (i.e. initialization with a
6145    constructor).  If we are at global scope and won't go into COMMON, fill
6146    it in with a dummy CONSTRUCTOR to force the variable into .data;
6147    otherwise we can use error_mark_node.  */
6148
6149 static tree
6150 obscure_complex_init (decl, init)
6151      tree decl, init;
6152 {
6153   if (! flag_no_inline && TREE_STATIC (decl))
6154     {
6155       if (extract_init (decl, init))
6156         return NULL_TREE;
6157     }
6158
6159   if (toplevel_bindings_p () && ! DECL_COMMON (decl))
6160     DECL_INITIAL (decl) = build (CONSTRUCTOR, TREE_TYPE (decl), NULL_TREE,
6161                                  NULL_TREE);
6162   else
6163     DECL_INITIAL (decl) = error_mark_node;
6164
6165   return init;
6166 }
6167
6168 /* Finish processing of a declaration;
6169    install its line number and initial value.
6170    If the length of an array type is not known before,
6171    it must be determined now, from the initial value, or it is an error.
6172
6173    Call `pop_obstacks' iff NEED_POP is nonzero.
6174
6175    For C++, `cp_finish_decl' must be fairly evasive:  it must keep initializers
6176    for aggregates that have constructors alive on the permanent obstack,
6177    so that the global initializing functions can be written at the end.
6178
6179    INIT0 holds the value of an initializer that should be allowed to escape
6180    the normal rules.
6181
6182    FLAGS is LOOKUP_ONLYCONVERTING is the = init syntax was used, else 0
6183    if the (init) syntax was used.
6184
6185    For functions that take default parameters, DECL points to its
6186    "maximal" instantiation.  `cp_finish_decl' must then also declared its
6187    subsequently lower and lower forms of instantiation, checking for
6188    ambiguity as it goes.  This can be sped up later.  */
6189
6190 void
6191 cp_finish_decl (decl, init, asmspec_tree, need_pop, flags)
6192      tree decl, init;
6193      tree asmspec_tree;
6194      int need_pop;
6195      int flags;
6196 {
6197   register tree type;
6198   tree cleanup = NULL_TREE, ttype;
6199   int was_incomplete;
6200   int temporary = allocation_temporary_p ();
6201   char *asmspec = NULL;
6202   int was_readonly = 0;
6203
6204   /* If this is 0, then we did not change obstacks.  */
6205   if (! decl)
6206     {
6207       if (init)
6208         error ("assignment (not initialization) in declaration");
6209       return;
6210     }
6211
6212   /* If a name was specified, get the string.  */
6213   if (asmspec_tree)
6214       asmspec = TREE_STRING_POINTER (asmspec_tree);
6215
6216   /* If the type of the thing we are declaring either has
6217      a constructor, or has a virtual function table pointer,
6218      AND its initialization was accepted by `start_decl',
6219      then we stayed on the permanent obstack through the
6220      declaration, otherwise, changed obstacks as GCC would.  */
6221
6222   type = TREE_TYPE (decl);
6223
6224   if (type == error_mark_node)
6225     {
6226       if (toplevel_bindings_p () && temporary)
6227         end_temporary_allocation ();
6228
6229       return;
6230     }
6231
6232   was_incomplete = (DECL_SIZE (decl) == NULL_TREE);
6233
6234   /* Take care of TYPE_DECLs up front.  */
6235   if (TREE_CODE (decl) == TYPE_DECL)
6236     {
6237       if (init && DECL_INITIAL (decl))
6238         {
6239           /* typedef foo = bar; store the type of bar as the type of foo.  */
6240           TREE_TYPE (decl) = type = TREE_TYPE (init);
6241           DECL_INITIAL (decl) = init = NULL_TREE;
6242         }
6243       if (type != error_mark_node
6244           && IS_AGGR_TYPE (type) && DECL_NAME (decl))
6245         {
6246           if (TREE_TYPE (DECL_NAME (decl)) && TREE_TYPE (decl) != type)
6247             cp_warning ("shadowing previous type declaration of `%#D'", decl);
6248           set_identifier_type_value (DECL_NAME (decl), type);
6249           CLASSTYPE_GOT_SEMICOLON (type) = 1;
6250         }
6251       GNU_xref_decl (current_function_decl, decl);
6252       rest_of_decl_compilation (decl, NULL_PTR,
6253                                 DECL_CONTEXT (decl) == NULL_TREE, 0);
6254       goto finish_end;
6255     }
6256   if (TREE_CODE (decl) != FUNCTION_DECL)
6257     {
6258       ttype = target_type (type);
6259 #if 0 /* WTF?  -KR
6260          Leave this out until we can figure out why it was
6261          needed/desirable in the first place.  Then put a comment
6262          here explaining why.  Or just delete the code if no ill
6263          effects arise.  */
6264       if (TYPE_NAME (ttype)
6265           && TREE_CODE (TYPE_NAME (ttype)) == TYPE_DECL
6266           && ANON_AGGRNAME_P (TYPE_IDENTIFIER (ttype)))
6267         {
6268           tree old_id = TYPE_IDENTIFIER (ttype);
6269           char *newname = (char *)alloca (IDENTIFIER_LENGTH (old_id) + 2);
6270           /* Need to preserve template data for UPT nodes.  */
6271           tree old_template = IDENTIFIER_TEMPLATE (old_id);
6272           newname[0] = '_';
6273           bcopy (IDENTIFIER_POINTER (old_id), newname + 1,
6274                  IDENTIFIER_LENGTH (old_id) + 1);
6275           old_id = get_identifier (newname);
6276           lookup_tag_reverse (ttype, old_id);
6277           TYPE_IDENTIFIER (ttype) = old_id;
6278           IDENTIFIER_TEMPLATE (old_id) = old_template;
6279         }
6280 #endif
6281     }
6282
6283   if (! DECL_EXTERNAL (decl) && TREE_READONLY (decl)
6284       && TYPE_NEEDS_CONSTRUCTING (type))
6285     {
6286
6287       /* Currently, GNU C++ puts constants in text space, making them
6288          impossible to initialize.  In the future, one would hope for
6289          an operating system which understood the difference between
6290          initialization and the running of a program.  */
6291       was_readonly = 1;
6292       TREE_READONLY (decl) = 0;
6293     }
6294
6295   if (TREE_CODE (decl) == FIELD_DECL)
6296     {
6297       if (init && init != error_mark_node)
6298         my_friendly_assert (TREE_PERMANENT (init), 147);
6299
6300       if (asmspec)
6301         {
6302           /* This must override the asm specifier which was placed
6303              by grokclassfn.  Lay this out fresh.  */
6304           DECL_RTL (TREE_TYPE (decl)) = NULL_RTX;
6305           DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
6306           make_decl_rtl (decl, asmspec, 0);
6307         }
6308     }
6309   /* If `start_decl' didn't like having an initialization, ignore it now.  */
6310   else if (init != NULL_TREE && DECL_INITIAL (decl) == NULL_TREE)
6311     init = NULL_TREE;
6312   else if (DECL_EXTERNAL (decl))
6313     ;
6314   else if (TREE_CODE (type) == REFERENCE_TYPE
6315            || (TYPE_LANG_SPECIFIC (type) && IS_SIGNATURE_REFERENCE (type)))
6316     {
6317       if (TREE_STATIC (decl))
6318         make_decl_rtl (decl, NULL_PTR,
6319                        toplevel_bindings_p ()
6320                        || pseudo_global_level_p ());
6321       grok_reference_init (decl, type, init, &cleanup);
6322       init = NULL_TREE;
6323     }
6324
6325   GNU_xref_decl (current_function_decl, decl);
6326
6327   if (TREE_CODE (decl) == FIELD_DECL)
6328     ;
6329   else if (TREE_CODE (decl) == CONST_DECL)
6330     {
6331       my_friendly_assert (TREE_CODE (decl) != REFERENCE_TYPE, 148);
6332
6333       DECL_INITIAL (decl) = init;
6334
6335       /* This will keep us from needing to worry about our obstacks.  */
6336       my_friendly_assert (init != NULL_TREE, 149);
6337       init = NULL_TREE;
6338     }
6339   else if (init)
6340     {
6341       if (TYPE_HAS_CONSTRUCTOR (type) || TYPE_NEEDS_CONSTRUCTING (type))
6342         {
6343           if (TREE_CODE (type) == ARRAY_TYPE)
6344             init = digest_init (type, init, (tree *) 0);
6345           else if (TREE_CODE (init) == CONSTRUCTOR)
6346             {
6347               if (TYPE_NEEDS_CONSTRUCTING (type))
6348                 {
6349                   cp_error ("`%D' must be initialized by constructor, not by `{...}'",
6350                             decl);
6351                   init = error_mark_node;
6352                 }
6353               else
6354                 goto dont_use_constructor;
6355             }
6356 #if 0
6357           /* fix this in `build_functional_cast' instead.
6358              Here's the trigger code:
6359
6360                 struct ostream
6361                 {
6362                   ostream ();
6363                   ostream (int, char *);
6364                   ostream (char *);
6365                   operator char *();
6366                   ostream (void *);
6367                   operator void *();
6368                   operator << (int);
6369                 };
6370                 int buf_size = 1024;
6371                 static char buf[buf_size];
6372                 const char *debug(int i) {
6373                   char *b = &buf[0];
6374                   ostream o = ostream(buf_size, b);
6375                   o << i;
6376                   return buf;
6377                 }
6378                 */
6379
6380           else if (TREE_CODE (init) == TARGET_EXPR
6381                    && TREE_CODE (TREE_OPERAND (init, 1) == NEW_EXPR))
6382             {
6383               /* User wrote something like `foo x = foo (args)'  */
6384               my_friendly_assert (TREE_CODE (TREE_OPERAND (init, 0)) == VAR_DECL, 150);
6385               my_friendly_assert (DECL_NAME (TREE_OPERAND (init, 0)) == NULL_TREE, 151);
6386
6387               /* User wrote exactly `foo x = foo (args)'  */
6388               if (TYPE_MAIN_VARIANT (type) == TREE_TYPE (init))
6389                 {
6390                   init = build (CALL_EXPR, TREE_TYPE (init),
6391                                 TREE_OPERAND (TREE_OPERAND (init, 1), 0),
6392                                 TREE_OPERAND (TREE_OPERAND (init, 1), 1), 0);
6393                   TREE_SIDE_EFFECTS (init) = 1;
6394                 }
6395             }
6396 #endif
6397         }
6398       else
6399         {
6400         dont_use_constructor:
6401           if (TREE_CODE (init) != TREE_VEC)
6402             init = store_init_value (decl, init);
6403         }
6404
6405       if (init)
6406         /* We must hide the initializer so that expand_decl
6407            won't try to do something it does not understand.  */
6408         init = obscure_complex_init (decl, init);
6409     }
6410   else if (DECL_EXTERNAL (decl))
6411     ;
6412   else if (TREE_CODE_CLASS (TREE_CODE (type)) == 't'
6413            && (IS_AGGR_TYPE (type) || TYPE_NEEDS_CONSTRUCTING (type)))
6414     {
6415       tree ctype = type;
6416       while (TREE_CODE (ctype) == ARRAY_TYPE)
6417         ctype = TREE_TYPE (ctype);
6418       if (! TYPE_NEEDS_CONSTRUCTING (ctype))
6419         {
6420           if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (ctype))
6421             cp_error ("structure `%D' with uninitialized const members", decl);
6422           if (CLASSTYPE_REF_FIELDS_NEED_INIT (ctype))
6423             cp_error ("structure `%D' with uninitialized reference members",
6424                       decl);
6425         }
6426
6427       if (TREE_CODE (decl) == VAR_DECL
6428           && !DECL_INITIAL (decl)
6429           && !TYPE_NEEDS_CONSTRUCTING (type)
6430           && (TYPE_READONLY (type) || TREE_READONLY (decl)))
6431         cp_error ("uninitialized const `%D'", decl);
6432
6433       if (TYPE_SIZE (type) != NULL_TREE
6434           && TYPE_NEEDS_CONSTRUCTING (type))
6435         init = obscure_complex_init (decl, NULL_TREE);
6436     }
6437   else if (TREE_CODE (decl) == VAR_DECL
6438            && TREE_CODE (type) != REFERENCE_TYPE
6439            && (TYPE_READONLY (type) || TREE_READONLY (decl)))
6440     {
6441       /* ``Unless explicitly declared extern, a const object does not have
6442          external linkage and must be initialized. ($8.4; $12.1)'' ARM 7.1.6
6443          However, if it's `const int foo = 1; const int foo;', don't complain
6444          about the second decl, since it does have an initializer before.
6445          We deliberately don't complain about arrays, because they're
6446          supposed to be initialized by a constructor.  */
6447       if (! DECL_INITIAL (decl)
6448           && TREE_CODE (type) != ARRAY_TYPE
6449           && (!pedantic || !current_class_type))
6450         cp_error ("uninitialized const `%#D'", decl);
6451     }
6452
6453   /* For top-level declaration, the initial value was read in
6454      the temporary obstack.  MAXINDEX, rtl, etc. to be made below
6455      must go in the permanent obstack; but don't discard the
6456      temporary data yet.  */
6457
6458   if (toplevel_bindings_p () && temporary)
6459     end_temporary_allocation ();
6460
6461   /* Deduce size of array from initialization, if not already known.  */
6462
6463   if (TREE_CODE (type) == ARRAY_TYPE
6464       && TYPE_DOMAIN (type) == NULL_TREE
6465       && TREE_CODE (decl) != TYPE_DECL)
6466     {
6467       int do_default
6468         = (TREE_STATIC (decl)
6469            /* Even if pedantic, an external linkage array
6470               may have incomplete type at first.  */
6471            ? pedantic && ! DECL_EXTERNAL (decl)
6472            : !DECL_EXTERNAL (decl));
6473       tree initializer = init ? init : DECL_INITIAL (decl);
6474       int failure = complete_array_type (type, initializer, do_default);
6475
6476       if (failure == 1)
6477         cp_error ("initializer fails to determine size of `%D'", decl);
6478
6479       if (failure == 2)
6480         {
6481           if (do_default)
6482             cp_error ("array size missing in `%D'", decl);
6483           /* If a `static' var's size isn't known, make it extern as
6484              well as static, so it does not get allocated.  If it's not
6485              `static', then don't mark it extern; finish_incomplete_decl
6486              will give it a default size and it will get allocated.  */
6487           else if (!pedantic && TREE_STATIC (decl) && !TREE_PUBLIC (decl))
6488             DECL_EXTERNAL (decl) = 1;
6489         }
6490
6491       if (pedantic && TYPE_DOMAIN (type) != NULL_TREE
6492           && tree_int_cst_lt (TYPE_MAX_VALUE (TYPE_DOMAIN (type)),
6493                               integer_zero_node))
6494         cp_error ("zero-size array `%D'", decl);
6495
6496       layout_decl (decl, 0);
6497     }
6498
6499   if (TREE_CODE (decl) == VAR_DECL)
6500     {
6501       if (DECL_SIZE (decl) == NULL_TREE
6502           && TYPE_SIZE (TREE_TYPE (decl)) != NULL_TREE)
6503         layout_decl (decl, 0);
6504
6505       if (TREE_STATIC (decl) && DECL_SIZE (decl) == NULL_TREE)
6506         {
6507           /* A static variable with an incomplete type:
6508              that is an error if it is initialized.
6509              Otherwise, let it through, but if it is not `extern'
6510              then it may cause an error message later.  */
6511           if (DECL_INITIAL (decl) != NULL_TREE)
6512             cp_error ("storage size of `%D' isn't known", decl);
6513           init = NULL_TREE;
6514         }
6515       else if (!DECL_EXTERNAL (decl) && DECL_SIZE (decl) == NULL_TREE)
6516         {
6517           /* An automatic variable with an incomplete type: that is an error.
6518              Don't talk about array types here, since we took care of that
6519              message in grokdeclarator.  */
6520           cp_error ("storage size of `%D' isn't known", decl);
6521           TREE_TYPE (decl) = error_mark_node;
6522         }
6523       else if (!DECL_EXTERNAL (decl) && IS_AGGR_TYPE (ttype))
6524         /* Let debugger know it should output info for this type.  */
6525         note_debug_info_needed (ttype);
6526
6527       if (TREE_STATIC (decl) && DECL_CONTEXT (decl)
6528           && TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (decl))) == 't')
6529         note_debug_info_needed (DECL_CONTEXT (decl));
6530
6531       if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl))
6532           && DECL_SIZE (decl) != NULL_TREE
6533           && ! TREE_CONSTANT (DECL_SIZE (decl)))
6534         {
6535           if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST)
6536             constant_expression_warning (DECL_SIZE (decl));
6537           else
6538             cp_error ("storage size of `%D' isn't constant", decl);
6539         }
6540
6541       if (!DECL_EXTERNAL (decl) && TYPE_NEEDS_DESTRUCTOR (type))
6542         {
6543           int yes = suspend_momentary ();
6544
6545           /* If INIT comes from a functional cast, use the cleanup
6546              we built for that.  Otherwise, make our own cleanup.  */
6547           if (init && TREE_CODE (init) == WITH_CLEANUP_EXPR
6548               && comptypes (TREE_TYPE (decl), TREE_TYPE (init), 1))
6549             {
6550               cleanup = TREE_OPERAND (init, 2);
6551               init = TREE_OPERAND (init, 0);
6552               current_binding_level->have_cleanups = 1;
6553             }
6554           else
6555             cleanup = maybe_build_cleanup (decl);
6556           resume_momentary (yes);
6557         }
6558     }
6559   /* PARM_DECLs get cleanups, too.  */
6560   else if (TREE_CODE (decl) == PARM_DECL && TYPE_NEEDS_DESTRUCTOR (type))
6561     {
6562       if (temporary)
6563         end_temporary_allocation ();
6564       cleanup = maybe_build_cleanup (decl);
6565       if (temporary)
6566         resume_temporary_allocation ();
6567     }
6568
6569   /* Output the assembler code and/or RTL code for variables and functions,
6570      unless the type is an undefined structure or union.
6571      If not, it will get done when the type is completed.  */
6572
6573   if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL
6574       || TREE_CODE (decl) == RESULT_DECL)
6575     {
6576       /* ??? FIXME: What about nested classes?  */
6577       int toplev = toplevel_bindings_p () || pseudo_global_level_p ();
6578       int was_temp
6579         = ((flag_traditional
6580             || (TREE_STATIC (decl) && TYPE_NEEDS_DESTRUCTOR (type)))
6581            && allocation_temporary_p ());
6582
6583       if (was_temp)
6584         end_temporary_allocation ();
6585
6586       if (TREE_CODE (decl) == VAR_DECL
6587           && ! toplevel_bindings_p ()
6588           && ! TREE_STATIC (decl)
6589           && type_needs_gc_entry (type))
6590         DECL_GC_OFFSET (decl) = size_int (++current_function_obstack_index);
6591
6592       if (TREE_CODE (decl) == VAR_DECL && DECL_VIRTUAL_P (decl))
6593         make_decl_rtl (decl, NULL_PTR, toplev);
6594       else if (TREE_CODE (decl) == VAR_DECL
6595                && TREE_READONLY (decl)
6596                && DECL_INITIAL (decl) != NULL_TREE
6597                && DECL_INITIAL (decl) != error_mark_node
6598                && ! EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl)))
6599         {
6600           DECL_INITIAL (decl) = save_expr (DECL_INITIAL (decl));
6601
6602           if (asmspec)
6603             DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
6604
6605           if (! toplev
6606               && TREE_STATIC (decl)
6607               && ! TREE_SIDE_EFFECTS (decl)
6608               && ! TREE_PUBLIC (decl)
6609               && ! DECL_EXTERNAL (decl)
6610               && ! TYPE_NEEDS_DESTRUCTOR (type)
6611               && DECL_MODE (decl) != BLKmode)
6612             {
6613               /* If this variable is really a constant, then fill its DECL_RTL
6614                  slot with something which won't take up storage.
6615                  If something later should take its address, we can always give
6616                  it legitimate RTL at that time.  */
6617               DECL_RTL (decl) = gen_reg_rtx (DECL_MODE (decl));
6618               store_expr (DECL_INITIAL (decl), DECL_RTL (decl), 0);
6619               TREE_ASM_WRITTEN (decl) = 1;
6620             }
6621           else if (toplev && ! TREE_PUBLIC (decl))
6622             {
6623               /* If this is a static const, change its apparent linkage
6624                  if it belongs to a #pragma interface.  */
6625               if (!interface_unknown)
6626                 {
6627                   TREE_PUBLIC (decl) = 1;
6628                   DECL_EXTERNAL (decl) = interface_only;
6629                 }
6630               make_decl_rtl (decl, asmspec, toplev);
6631             }
6632           else
6633             rest_of_decl_compilation (decl, asmspec, toplev, 0);
6634         }
6635       else if (TREE_CODE (decl) == VAR_DECL
6636                && DECL_LANG_SPECIFIC (decl)
6637                && DECL_IN_AGGR_P (decl))
6638         {
6639           if (TREE_STATIC (decl))
6640             {
6641               if (init == NULL_TREE
6642 #ifdef DEFAULT_STATIC_DEFS
6643                   /* If this code is dead, then users must
6644                      explicitly declare static member variables
6645                      outside the class def'n as well.  */
6646                   && TYPE_NEEDS_CONSTRUCTING (type)
6647 #endif
6648                   )
6649                 {
6650                   DECL_EXTERNAL (decl) = 1;
6651                   make_decl_rtl (decl, asmspec, 1);
6652                 }
6653               else
6654                 rest_of_decl_compilation (decl, asmspec, toplev, 0);
6655             }
6656           else
6657             /* Just a constant field.  Should not need any rtl.  */
6658             goto finish_end0;
6659         }
6660       else
6661         rest_of_decl_compilation (decl, asmspec, toplev, 0);
6662
6663       if (was_temp)
6664         resume_temporary_allocation ();
6665
6666       if (type != error_mark_node
6667           && TYPE_LANG_SPECIFIC (type)
6668           && CLASSTYPE_ABSTRACT_VIRTUALS (type))
6669         abstract_virtuals_error (decl, type);
6670       else if ((TREE_CODE (type) == FUNCTION_TYPE
6671                 || TREE_CODE (type) == METHOD_TYPE)
6672                && TYPE_LANG_SPECIFIC (TREE_TYPE (type))
6673                && CLASSTYPE_ABSTRACT_VIRTUALS (TREE_TYPE (type)))
6674         abstract_virtuals_error (decl, TREE_TYPE (type));
6675
6676       if (TYPE_LANG_SPECIFIC (type) && IS_SIGNATURE (type))
6677         signature_error (decl, type);
6678       else if ((TREE_CODE (type) == FUNCTION_TYPE
6679                 || TREE_CODE (type) == METHOD_TYPE)
6680                && TYPE_LANG_SPECIFIC (TREE_TYPE (type))
6681                && IS_SIGNATURE (TREE_TYPE (type)))
6682         signature_error (decl, TREE_TYPE (type));
6683
6684       if (TREE_CODE (decl) == FUNCTION_DECL)
6685         ;
6686       else if (DECL_EXTERNAL (decl))
6687         ;
6688       else if (TREE_STATIC (decl) && type != error_mark_node)
6689         {
6690           /* Cleanups for static variables are handled by `finish_file'.  */
6691           if (TYPE_NEEDS_CONSTRUCTING (type) || init != NULL_TREE)
6692             expand_static_init (decl, init);
6693           else if (TYPE_NEEDS_DESTRUCTOR (type))
6694             static_aggregates = perm_tree_cons (NULL_TREE, decl,
6695                                                 static_aggregates);
6696
6697           /* Make entry in appropriate vector.  */
6698           if (flag_gc && type_needs_gc_entry (type))
6699             build_static_gc_entry (decl, type);
6700         }
6701       else if (! toplev)
6702         {
6703           tree old_cleanups = cleanups_this_call;
6704           /* This is a declared decl which must live until the
6705              end of the binding contour.  It may need a cleanup.  */
6706
6707           /* Recompute the RTL of a local array now
6708              if it used to be an incomplete type.  */
6709           if (was_incomplete && ! TREE_STATIC (decl))
6710             {
6711               /* If we used it already as memory, it must stay in memory.  */
6712               TREE_ADDRESSABLE (decl) = TREE_USED (decl);
6713               /* If it's still incomplete now, no init will save it.  */
6714               if (DECL_SIZE (decl) == NULL_TREE)
6715                 DECL_INITIAL (decl) = NULL_TREE;
6716               expand_decl (decl);
6717             }
6718           else if (! TREE_ASM_WRITTEN (decl)
6719                    && (TYPE_SIZE (type) != NULL_TREE
6720                        || TREE_CODE (type) == ARRAY_TYPE))
6721             {
6722               /* Do this here, because we did not expand this decl's
6723                  rtl in start_decl.  */
6724               if (DECL_RTL (decl) == NULL_RTX)
6725                 expand_decl (decl);
6726               else if (cleanup)
6727                 {
6728                   /* XXX: Why don't we use decl here?  */
6729                   /* Ans: Because it was already expanded? */
6730                   if (! expand_decl_cleanup (NULL_TREE, cleanup))
6731                     cp_error ("parser lost in parsing declaration of `%D'",
6732                               decl);
6733                   /* Cleanup used up here.  */
6734                   cleanup = NULL_TREE;
6735                 }
6736             }
6737
6738           if (DECL_SIZE (decl) && type != error_mark_node)
6739             {
6740               /* Compute and store the initial value.  */
6741               expand_decl_init (decl);
6742
6743               if (init || TYPE_NEEDS_CONSTRUCTING (type))
6744                 {
6745                   emit_line_note (DECL_SOURCE_FILE (decl),
6746                                   DECL_SOURCE_LINE (decl));
6747                   expand_aggr_init (decl, init, 0, flags);
6748                 }
6749
6750               /* Set this to 0 so we can tell whether an aggregate which
6751                  was initialized was ever used.  Don't do this if it has a
6752                  destructor, so we don't complain about the 'resource
6753                  allocation is initialization' idiom.  */
6754               if (TYPE_NEEDS_CONSTRUCTING (type) && cleanup == NULL_TREE)
6755                 TREE_USED (decl) = 0;
6756
6757               /* Store the cleanup, if there was one.  */
6758               if (cleanup)
6759                 {
6760                   if (! expand_decl_cleanup (decl, cleanup))
6761                     cp_error ("parser lost in parsing declaration of `%D'",
6762                               decl);
6763                 }
6764             }
6765           /* Cleanup any temporaries needed for the initial value.  */
6766           expand_cleanups_to (old_cleanups);
6767         }
6768     finish_end0:
6769
6770       /* Undo call to `pushclass' that was done in `start_decl'
6771          due to initialization of qualified member variable.
6772          I.e., Foo::x = 10;  */
6773       {
6774         tree context = DECL_CONTEXT (decl);
6775         if (context
6776             && TREE_CODE_CLASS (TREE_CODE (context)) == 't'
6777             && (TREE_CODE (decl) == VAR_DECL
6778                 /* We also have a pushclass done that we need to undo here
6779                    if we're at top level and declare a method.  */
6780                 || (TREE_CODE (decl) == FUNCTION_DECL
6781                     /* If size hasn't been set, we're still defining it,
6782                        and therefore inside the class body; don't pop
6783                        the binding level..  */
6784                     && TYPE_SIZE (context) != NULL_TREE
6785                     /* The binding level gets popped elsewhere for a
6786                        friend declaration inside another class.  */
6787                     /*
6788                     && TYPE_IDENTIFIER (context) == current_class_name
6789                     */
6790                     && context == current_class_type
6791                     )))
6792           popclass (1);
6793       }
6794     }
6795
6796  finish_end:
6797
6798   /* If requested, warn about definitions of large data objects.  */
6799
6800   if (warn_larger_than
6801       && (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL)
6802       && !DECL_EXTERNAL (decl))
6803     {
6804       register tree decl_size = DECL_SIZE (decl);
6805
6806       if (decl_size && TREE_CODE (decl_size) == INTEGER_CST)
6807         {
6808           unsigned units = TREE_INT_CST_LOW (decl_size) / BITS_PER_UNIT;
6809
6810           if (units > larger_than_size)
6811             warning_with_decl (decl, "size of `%s' is %u bytes", units);
6812         }
6813     }
6814
6815   if (need_pop)
6816     {
6817       /* Resume permanent allocation, if not within a function.  */
6818       /* The corresponding push_obstacks_nochange is in start_decl,
6819          start_method, groktypename, and in grokfield.  */
6820       pop_obstacks ();
6821     }
6822
6823   if (was_readonly)
6824     TREE_READONLY (decl) = 1;
6825
6826   if (flag_cadillac)
6827     cadillac_finish_decl (decl);
6828 }
6829
6830 /* This is here for a midend callback from c-common.c */
6831 void
6832 finish_decl (decl, init, asmspec_tree)
6833      tree decl, init;
6834      tree asmspec_tree;
6835 {
6836   cp_finish_decl (decl, init, asmspec_tree, 1, 0);
6837 }
6838
6839 void
6840 expand_static_init (decl, init)
6841      tree decl;
6842      tree init;
6843 {
6844   tree oldstatic = value_member (decl, static_aggregates);
6845   tree old_cleanups;
6846
6847   if (oldstatic)
6848     {
6849       if (TREE_PURPOSE (oldstatic) && init != NULL_TREE)
6850         cp_error ("multiple initializations given for `%D'", decl);
6851     }
6852   else if (! toplevel_bindings_p () && ! pseudo_global_level_p ())
6853     {
6854       /* Emit code to perform this initialization but once.  */
6855       tree temp;
6856
6857       /* Remember this information until end of file. */
6858       push_obstacks (&permanent_obstack, &permanent_obstack);
6859
6860       /* Emit code to perform this initialization but once.  */
6861       temp = get_temp_name (integer_type_node, 1);
6862       rest_of_decl_compilation (temp, NULL_PTR, 0, 0);
6863       expand_start_cond (build_binary_op (EQ_EXPR, temp,
6864                                           integer_zero_node, 1), 0);
6865       old_cleanups = cleanups_this_call;
6866       expand_assignment (temp, integer_one_node, 0, 0);
6867       if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))
6868           || TREE_CODE (init) == TREE_LIST)
6869         {
6870           expand_aggr_init (decl, init, 0, 0);
6871           do_pending_stack_adjust ();
6872         }
6873       else
6874         expand_assignment (decl, init, 0, 0);
6875       /* Cleanup any temporaries needed for the initial value.  */
6876       expand_cleanups_to (old_cleanups);
6877       expand_end_cond ();
6878       if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (decl)))
6879         {
6880           static_aggregates = perm_tree_cons (temp, decl, static_aggregates);
6881           TREE_STATIC (static_aggregates) = 1;
6882         }
6883
6884       /* Resume old (possibly temporary) allocation. */
6885       pop_obstacks ();
6886     }
6887   else
6888     {
6889       /* This code takes into account memory allocation
6890          policy of `start_decl'.  Namely, if TYPE_NEEDS_CONSTRUCTING
6891          does not hold for this object, then we must make permanent
6892          the storage currently in the temporary obstack.  */
6893       if (! TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
6894         preserve_initializer ();
6895       static_aggregates = perm_tree_cons (init, decl, static_aggregates);
6896     }
6897 }
6898 \f
6899 /* Make TYPE a complete type based on INITIAL_VALUE.
6900    Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered,
6901    2 if there was no information (in which case assume 1 if DO_DEFAULT).  */
6902
6903 int
6904 complete_array_type (type, initial_value, do_default)
6905      tree type, initial_value;
6906      int do_default;
6907 {
6908   register tree maxindex = NULL_TREE;
6909   int value = 0;
6910
6911   if (initial_value)
6912     {
6913       /* Note MAXINDEX  is really the maximum index,
6914          one less than the size.  */
6915       if (TREE_CODE (initial_value) == STRING_CST)
6916         {
6917           int eltsize
6918             = int_size_in_bytes (TREE_TYPE (TREE_TYPE (initial_value)));
6919           maxindex = build_int_2 ((TREE_STRING_LENGTH (initial_value)
6920                                    / eltsize) - 1, 0);
6921         }
6922       else if (TREE_CODE (initial_value) == CONSTRUCTOR)
6923         {
6924           tree elts = CONSTRUCTOR_ELTS (initial_value);
6925           maxindex = size_binop (MINUS_EXPR, integer_zero_node, size_one_node);
6926           for (; elts; elts = TREE_CHAIN (elts))
6927             {
6928               if (TREE_PURPOSE (elts))
6929                 maxindex = TREE_PURPOSE (elts);
6930               else
6931                 maxindex = size_binop (PLUS_EXPR, maxindex, size_one_node);
6932             }
6933           maxindex = copy_node (maxindex);
6934         }
6935       else
6936         {
6937           /* Make an error message unless that happened already.  */
6938           if (initial_value != error_mark_node)
6939             value = 1;
6940
6941           /* Prevent further error messages.  */
6942           maxindex = build_int_2 (0, 0);
6943         }
6944     }
6945
6946   if (!maxindex)
6947     {
6948       if (do_default)
6949         maxindex = build_int_2 (0, 0);
6950       value = 2;
6951     }
6952
6953   if (maxindex)
6954     {
6955       tree itype;
6956
6957       TYPE_DOMAIN (type) = build_index_type (maxindex);
6958       if (!TREE_TYPE (maxindex))
6959         TREE_TYPE (maxindex) = TYPE_DOMAIN (type);
6960       if (initial_value)
6961         itype = TREE_TYPE (initial_value);
6962       else
6963         itype = NULL;
6964       if (itype && !TYPE_DOMAIN (itype))
6965         TYPE_DOMAIN (itype) = TYPE_DOMAIN (type);
6966     }
6967
6968   /* Lay out the type now that we can get the real answer.  */
6969
6970   layout_type (type);
6971
6972   return value;
6973 }
6974 \f
6975 /* Return zero if something is declared to be a member of type
6976    CTYPE when in the context of CUR_TYPE.  STRING is the error
6977    message to print in that case.  Otherwise, quietly return 1.  */
6978 static int
6979 member_function_or_else (ctype, cur_type, string)
6980      tree ctype, cur_type;
6981      char *string;
6982 {
6983   if (ctype && ctype != cur_type)
6984     {
6985       error (string, TYPE_NAME_STRING (ctype));
6986       return 0;
6987     }
6988   return 1;
6989 }
6990 \f
6991 /* Subroutine of `grokdeclarator'.  */
6992
6993 /* Generate errors possibly applicable for a given set of specifiers.
6994    This is for ARM $7.1.2.  */
6995 static void
6996 bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises)
6997      tree object;
6998      char *type;
6999      int virtualp, quals, friendp, raises, inlinep;
7000 {
7001   if (virtualp)
7002     cp_error ("`%D' declared as a `virtual' %s", object, type);
7003   if (inlinep)
7004     cp_error ("`%D' declared as an `inline' %s", object, type);
7005   if (quals)
7006     cp_error ("`const' and `volatile' function specifiers on `%D' invalid in %s declaration",
7007               object, type);
7008   if (friendp)
7009     cp_error_at ("invalid friend declaration", object);
7010   if (raises)
7011     cp_error_at ("invalid exception specifications", object);
7012 }
7013
7014 /* CTYPE is class type, or null if non-class.
7015    TYPE is type this FUNCTION_DECL should have, either FUNCTION_TYPE
7016    or METHOD_TYPE.
7017    DECLARATOR is the function's name.
7018    VIRTUALP is truthvalue of whether the function is virtual or not.
7019    FLAGS are to be passed through to `grokclassfn'.
7020    QUALS are qualifiers indicating whether the function is `const'
7021    or `volatile'.
7022    RAISES is a list of exceptions that this function can raise.
7023    CHECK is 1 if we must find this method in CTYPE, 0 if we should
7024    not look, and -1 if we should not call `grokclassfn' at all.  */
7025 static tree
7026 grokfndecl (ctype, type, declarator, virtualp, flags, quals,
7027             raises, check, publicp, inlinep)
7028      tree ctype, type;
7029      tree declarator;
7030      int virtualp;
7031      enum overload_flags flags;
7032      tree quals, raises;
7033      int check, publicp, inlinep;
7034 {
7035   tree cname, decl;
7036   int staticp = ctype && TREE_CODE (type) == FUNCTION_TYPE;
7037
7038   if (ctype)
7039     cname = TREE_CODE (TYPE_NAME (ctype)) == TYPE_DECL
7040       ? TYPE_IDENTIFIER (ctype) : TYPE_NAME (ctype);
7041   else
7042     cname = NULL_TREE;
7043
7044   if (raises)
7045     {
7046       type = build_exception_variant (ctype, type, raises);
7047       raises = TYPE_RAISES_EXCEPTIONS (type);
7048     }
7049   decl = build_lang_decl (FUNCTION_DECL, declarator, type);
7050   /* propagate volatile out from type to decl */
7051   if (TYPE_VOLATILE (type))
7052       TREE_THIS_VOLATILE (decl) = 1;
7053
7054   /* Should probably propagate const out from type to decl I bet (mrs).  */
7055   if (staticp)
7056     {
7057       DECL_STATIC_FUNCTION_P (decl) = 1;
7058       DECL_CONTEXT (decl) = ctype;
7059       DECL_CLASS_CONTEXT (decl) = ctype;
7060     }
7061
7062   /* All function decls start out public; we'll fix their linkage later (at
7063      definition or EOF) if appropriate.  */
7064   TREE_PUBLIC (decl) = 1;
7065
7066   if (ctype == NULL_TREE && ! strcmp (IDENTIFIER_POINTER (declarator), "main"))
7067     {
7068       if (inlinep)
7069         error ("cannot declare `main' to be inline");
7070       else if (! publicp)
7071         error ("cannot declare `main' to be static");
7072       inlinep = 0;
7073       publicp = 1;
7074     }
7075           
7076   if (! publicp)
7077     DECL_C_STATIC (decl) = 1;
7078
7079   if (inlinep)
7080     DECL_THIS_INLINE (decl) = DECL_INLINE (decl) = 1;
7081
7082   DECL_EXTERNAL (decl) = 1;
7083   if (quals != NULL_TREE && TREE_CODE (type) == FUNCTION_TYPE)
7084     {
7085       cp_error ("%smember function `%D' cannot have `%T' method qualifier",
7086                 (ctype ? "static " : "non-"), decl, TREE_VALUE (quals));
7087       quals = NULL_TREE;
7088     }
7089
7090   if (IDENTIFIER_OPNAME_P (DECL_NAME (decl)))
7091     grok_op_properties (decl, virtualp, check < 0);
7092
7093   /* Caller will do the rest of this.  */
7094   if (check < 0)
7095     return decl;
7096
7097   if (flags == NO_SPECIAL && ctype && constructor_name (cname) == declarator)
7098     {
7099       tree tmp;
7100       /* Just handle constructors here.  We could do this
7101          inside the following if stmt, but I think
7102          that the code is more legible by breaking this
7103          case out.  See comments below for what each of
7104          the following calls is supposed to do.  */
7105       DECL_CONSTRUCTOR_P (decl) = 1;
7106
7107       grokclassfn (ctype, declarator, decl, flags, quals);
7108       if (check)
7109         check_classfn (ctype, declarator, decl);
7110       if (! grok_ctor_properties (ctype, decl))
7111         return NULL_TREE;
7112
7113       if (check == 0 && ! current_function_decl)
7114         {
7115           /* FIXME: this should only need to look at
7116              IDENTIFIER_GLOBAL_VALUE.  */
7117           tmp = lookup_name (DECL_ASSEMBLER_NAME (decl), 0);
7118           if (tmp == NULL_TREE)
7119             IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (decl)) = decl;
7120           else if (TREE_CODE (tmp) != TREE_CODE (decl))
7121             cp_error ("inconsistent declarations for `%D'", decl);
7122           else
7123             {
7124               duplicate_decls (decl, tmp);
7125               decl = tmp;
7126               /* avoid creating circularities.  */
7127               DECL_CHAIN (decl) = NULL_TREE;
7128             }
7129           make_decl_rtl (decl, NULL_PTR, 1);
7130         }
7131     }
7132   else
7133     {
7134       tree tmp;
7135
7136       /* Function gets the ugly name, field gets the nice one.
7137          This call may change the type of the function (because
7138          of default parameters)!  */
7139       if (ctype != NULL_TREE)
7140         grokclassfn (ctype, cname, decl, flags, quals);
7141
7142       if (ctype != NULL_TREE && check)
7143         check_classfn (ctype, cname, decl);
7144
7145       if (ctype == NULL_TREE || check)
7146         return decl;
7147
7148       /* Now install the declaration of this function so that others may
7149          find it (esp. its DECL_FRIENDLIST).  Don't do this for local class
7150          methods, though.  */
7151       if (! current_function_decl)
7152         {
7153           /* FIXME: this should only need to look at
7154              IDENTIFIER_GLOBAL_VALUE.  */
7155           tmp = lookup_name (DECL_ASSEMBLER_NAME (decl), 0);
7156           if (tmp == NULL_TREE)
7157             IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (decl)) = decl;
7158           else if (TREE_CODE (tmp) != TREE_CODE (decl))
7159             cp_error ("inconsistent declarations for `%D'", decl);
7160           else
7161             {
7162               duplicate_decls (decl, tmp);
7163               decl = tmp;
7164               /* avoid creating circularities.  */
7165               DECL_CHAIN (decl) = NULL_TREE;
7166             }
7167           make_decl_rtl (decl, NULL_PTR, 1);
7168         }
7169
7170       /* If this declaration supersedes the declaration of
7171          a method declared virtual in the base class, then
7172          mark this field as being virtual as well.  */
7173       {
7174         tree binfos = BINFO_BASETYPES (TYPE_BINFO (ctype));
7175         int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
7176
7177         for (i = 0; i < n_baselinks; i++)
7178           {
7179             tree base_binfo = TREE_VEC_ELT (binfos, i);
7180             if (TYPE_VIRTUAL_P (BINFO_TYPE (base_binfo))
7181                 || flag_all_virtual == 1)
7182               {
7183                 tmp = get_matching_virtual (base_binfo, decl,
7184                                             flags == DTOR_FLAG);
7185                 if (tmp)
7186                   {
7187                     /* If this function overrides some virtual in some base
7188                        class, then the function itself is also necessarily
7189                        virtual, even if the user didn't explicitly say so.  */
7190                     DECL_VIRTUAL_P (decl) = 1;
7191
7192                     /* The TMP we really want is the one from the deepest
7193                        baseclass on this path, taking care not to
7194                        duplicate if we have already found it (via another
7195                        path to its virtual baseclass.  */
7196                     if (staticp)
7197                       {
7198                         cp_error ("method `%D' may not be declared static",
7199                                   decl);
7200                         cp_error_at ("(since `%D' declared virtual in base class.)",
7201                                      tmp);
7202                         break;
7203                       }
7204                     virtualp = 1;
7205
7206                     {
7207                       /* The argument types may have changed... */
7208                       tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
7209                       tree base_variant = TREE_TYPE (TREE_VALUE (argtypes));
7210
7211                       argtypes = commonparms (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (tmp))),
7212                                               TREE_CHAIN (argtypes));
7213                       /* But the return type has not.  */
7214                       type = build_cplus_method_type (base_variant, TREE_TYPE (type), argtypes);
7215                       if (raises)
7216                         {
7217                           type = build_exception_variant (ctype, type, raises);
7218                           raises = TYPE_RAISES_EXCEPTIONS (type);
7219                         }
7220                       TREE_TYPE (decl) = type;
7221                       DECL_VINDEX (decl)
7222                         = tree_cons (NULL_TREE, tmp, DECL_VINDEX (decl));
7223                     }
7224                     break;
7225                   }
7226               }
7227           }
7228       }
7229       if (virtualp)
7230         {
7231           if (DECL_VINDEX (decl) == NULL_TREE)
7232             DECL_VINDEX (decl) = error_mark_node;
7233           IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)) = 1;
7234           if (ctype && CLASSTYPE_VTABLE_NEEDS_WRITING (ctype)
7235               /* If this function is derived from a template, don't
7236                  make it public.  This shouldn't be here, but there's
7237                  no good way to override the interface pragmas for one
7238                  function or class only.  Bletch.  */
7239               && IDENTIFIER_TEMPLATE (TYPE_IDENTIFIER (ctype)) == NULL_TREE
7240               && (write_virtuals == 2
7241                   || (write_virtuals == 3
7242                       && CLASSTYPE_INTERFACE_KNOWN (ctype))))
7243             TREE_PUBLIC (decl) = 1;
7244         }
7245     }
7246   return decl;
7247 }
7248
7249 static tree
7250 grokvardecl (type, declarator, specbits, initialized, constp)
7251      tree type;
7252      tree declarator;
7253      RID_BIT_TYPE specbits;
7254      int initialized;
7255      int constp;
7256 {
7257   tree decl;
7258
7259   if (TREE_CODE (type) == OFFSET_TYPE)
7260     {
7261       /* If you declare a static member so that it
7262          can be initialized, the code will reach here.  */
7263       tree basetype = TYPE_OFFSET_BASETYPE (type);
7264       type = TREE_TYPE (type);
7265       decl = build_lang_field_decl (VAR_DECL, declarator, type);
7266       DECL_CONTEXT (decl) = basetype;
7267       DECL_CLASS_CONTEXT (decl) = basetype;
7268       DECL_ASSEMBLER_NAME (decl) = build_static_name (basetype, declarator);
7269     }
7270   else
7271     decl = build_decl (VAR_DECL, declarator, type);
7272
7273   DECL_ASSEMBLER_NAME (decl) = current_namespace_id (DECL_ASSEMBLER_NAME (decl));
7274
7275   if (RIDBIT_SETP (RID_EXTERN, specbits))
7276     {
7277       DECL_THIS_EXTERN (decl) = 1;
7278       DECL_EXTERNAL (decl) = !initialized;
7279     }
7280
7281   /* In class context, static means one per class,
7282      public access, and static storage.  */
7283   if (DECL_FIELD_CONTEXT (decl) != NULL_TREE
7284       && IS_AGGR_TYPE (DECL_FIELD_CONTEXT (decl)))
7285     {
7286       TREE_PUBLIC (decl) = 1;
7287       TREE_STATIC (decl) = 1;
7288       DECL_EXTERNAL (decl) = 0;
7289     }
7290   /* At top level, either `static' or no s.c. makes a definition
7291      (perhaps tentative), and absence of `static' makes it public.  */
7292   else if (toplevel_bindings_p ())
7293     {
7294       TREE_PUBLIC (decl) = (RIDBIT_NOTSETP (RID_STATIC, specbits)
7295                             && (DECL_EXTERNAL (decl) || ! constp));
7296       TREE_STATIC (decl) = ! DECL_EXTERNAL (decl);
7297     }
7298   /* Not at top level, only `static' makes a static definition.  */
7299   else
7300     {
7301       TREE_STATIC (decl) = !! RIDBIT_SETP (RID_STATIC, specbits);
7302       TREE_PUBLIC (decl) = DECL_EXTERNAL (decl);
7303     }
7304   return decl;
7305 }
7306
7307 /* Create a canonical pointer to member function type. */
7308
7309 tree
7310 build_ptrmemfunc_type (type)
7311      tree type;
7312 {
7313   tree fields[4];
7314   tree t;
7315   tree u;
7316
7317   /* If a canonical type already exists for this type, use it.  We use
7318      this method instead of type_hash_canon, because it only does a
7319      simple equality check on the list of field members.  */
7320
7321   if ((t = TYPE_GET_PTRMEMFUNC_TYPE (type)))
7322     return t;
7323
7324   push_obstacks (TYPE_OBSTACK (type), TYPE_OBSTACK (type));
7325
7326   u = make_lang_type (UNION_TYPE);
7327   fields[0] = build_lang_field_decl (FIELD_DECL, pfn_identifier, type);
7328   fields[1] = build_lang_field_decl (FIELD_DECL, delta2_identifier,
7329                                      delta_type_node);
7330   finish_builtin_type (u, "__ptrmemfunc_type", fields, 1, ptr_type_node);
7331   TYPE_NAME (u) = NULL_TREE;
7332
7333   t = make_lang_type (RECORD_TYPE);
7334
7335   /* Let the front-end know this is a pointer to member function. */
7336   TYPE_PTRMEMFUNC_FLAG (t) = 1;
7337   /* and not really an aggregate.  */
7338   IS_AGGR_TYPE (t) = 0;
7339
7340   fields[0] = build_lang_field_decl (FIELD_DECL, delta_identifier,
7341                                      delta_type_node);
7342   fields[1] = build_lang_field_decl (FIELD_DECL, index_identifier,
7343                                      delta_type_node);
7344   fields[2] = build_lang_field_decl (FIELD_DECL, pfn_or_delta2_identifier, u);
7345   finish_builtin_type (t, "__ptrmemfunc_type", fields, 2, ptr_type_node);
7346
7347   pop_obstacks ();
7348
7349   /* Zap out the name so that the back-end will give us the debugging
7350      information for this anonymous RECORD_TYPE.  */
7351   TYPE_NAME (t) = NULL_TREE;
7352
7353   TYPE_SET_PTRMEMFUNC_TYPE (type, t);
7354
7355   /* Seems to be wanted. */
7356   CLASSTYPE_GOT_SEMICOLON (t) = 1;
7357   return t;
7358 }
7359
7360 /* Given declspecs and a declarator,
7361    determine the name and type of the object declared
7362    and construct a ..._DECL node for it.
7363    (In one case we can return a ..._TYPE node instead.
7364     For invalid input we sometimes return 0.)
7365
7366    DECLSPECS is a chain of tree_list nodes whose value fields
7367     are the storage classes and type specifiers.
7368
7369    DECL_CONTEXT says which syntactic context this declaration is in:
7370      NORMAL for most contexts.  Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL.
7371      FUNCDEF for a function definition.  Like NORMAL but a few different
7372       error messages in each case.  Return value may be zero meaning
7373       this definition is too screwy to try to parse.
7374      MEMFUNCDEF for a function definition.  Like FUNCDEF but prepares to
7375       handle member functions (which have FIELD context).
7376       Return value may be zero meaning this definition is too screwy to
7377       try to parse.
7378      PARM for a parameter declaration (either within a function prototype
7379       or before a function body).  Make a PARM_DECL, or return void_type_node.
7380      CATCHPARM for a parameter declaration before a catch clause.
7381      TYPENAME if for a typename (in a cast or sizeof).
7382       Don't make a DECL node; just return the ..._TYPE node.
7383      FIELD for a struct or union field; make a FIELD_DECL.
7384      BITFIELD for a field with specified width.
7385    INITIALIZED is 1 if the decl has an initializer.
7386
7387    In the TYPENAME case, DECLARATOR is really an absolute declarator.
7388    It may also be so in the PARM case, for a prototype where the
7389    argument type is specified but not the name.
7390
7391    This function is where the complicated C meanings of `static'
7392    and `extern' are interpreted.
7393
7394    For C++, if there is any monkey business to do, the function which
7395    calls this one must do it, i.e., prepending instance variables,
7396    renaming overloaded function names, etc.
7397
7398    Note that for this C++, it is an error to define a method within a class
7399    which does not belong to that class.
7400
7401    Except in the case where SCOPE_REFs are implicitly known (such as
7402    methods within a class being redundantly qualified),
7403    declarations which involve SCOPE_REFs are returned as SCOPE_REFs
7404    (class_name::decl_name).  The caller must also deal with this.
7405
7406    If a constructor or destructor is seen, and the context is FIELD,
7407    then the type gains the attribute TREE_HAS_x.  If such a declaration
7408    is erroneous, NULL_TREE is returned.
7409
7410    QUALS is used only for FUNCDEF and MEMFUNCDEF cases.  For a member
7411    function, these are the qualifiers to give to the `this' pointer.
7412
7413    May return void_type_node if the declarator turned out to be a friend.
7414    See grokfield for details.  */
7415
7416 enum return_types { return_normal, return_ctor, return_dtor, return_conversion };
7417
7418 tree
7419 grokdeclarator (declarator, declspecs, decl_context, initialized, raises)
7420      tree declspecs;
7421      tree declarator;
7422      enum decl_context decl_context;
7423      int initialized;
7424      tree raises;
7425 {
7426   RID_BIT_TYPE specbits;
7427   int nclasses = 0;
7428   tree spec;
7429   tree type = NULL_TREE;
7430   int longlong = 0;
7431   int constp;
7432   int volatilep;
7433   int virtualp, explicitp, friendp, inlinep, staticp;
7434   int explicit_int = 0;
7435   int explicit_char = 0;
7436   int opaque_typedef = 0;
7437   tree typedef_decl = NULL_TREE;
7438   char *name;
7439   tree typedef_type = NULL_TREE;
7440   int funcdef_flag = 0;
7441   enum tree_code innermost_code = ERROR_MARK;
7442   int bitfield = 0;
7443   int size_varies = 0;
7444   tree decl_machine_attr = NULL_TREE;
7445   /* Set this to error_mark_node for FIELD_DECLs we could not handle properly.
7446      All FIELD_DECLs we build here have `init' put into their DECL_INITIAL.  */
7447   tree init = NULL_TREE;
7448
7449   /* Keep track of what sort of function is being processed
7450      so that we can warn about default return values, or explicit
7451      return values which do not match prescribed defaults.  */
7452   enum return_types return_type = return_normal;
7453
7454   tree dname = NULL_TREE;
7455   tree ctype = current_class_type;
7456   tree ctor_return_type = NULL_TREE;
7457   enum overload_flags flags = NO_SPECIAL;
7458   tree quals = NULL_TREE;
7459
7460   RIDBIT_RESET_ALL (specbits);
7461   if (decl_context == FUNCDEF)
7462     funcdef_flag = 1, decl_context = NORMAL;
7463   else if (decl_context == MEMFUNCDEF)
7464     funcdef_flag = -1, decl_context = FIELD;
7465   else if (decl_context == BITFIELD)
7466     bitfield = 1, decl_context = FIELD;
7467
7468   if (flag_traditional && allocation_temporary_p ())
7469     end_temporary_allocation ();
7470
7471   /* Look inside a declarator for the name being declared
7472      and get it as a string, for an error message.  */
7473   {
7474     tree last = NULL_TREE;
7475     register tree decl = declarator;
7476     name = NULL;
7477
7478     while (decl)
7479       switch (TREE_CODE (decl))
7480         {
7481         case COND_EXPR:
7482           ctype = NULL_TREE;
7483           decl = TREE_OPERAND (decl, 0);
7484           break;
7485
7486         case BIT_NOT_EXPR:      /* for C++ destructors!  */
7487           {
7488             tree name = TREE_OPERAND (decl, 0);
7489             tree rename = NULL_TREE;
7490
7491             my_friendly_assert (flags == NO_SPECIAL, 152);
7492             flags = DTOR_FLAG;
7493             return_type = return_dtor;
7494             my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 153);
7495             if (ctype == NULL_TREE)
7496               {
7497                 if (current_class_type == NULL_TREE)
7498                   {
7499                     error ("destructors must be member functions");
7500                     flags = NO_SPECIAL;
7501                   }
7502                 else
7503                   {
7504                     tree t = constructor_name (current_class_name);
7505                     if (t != name)
7506                       rename = t;
7507                   }
7508               }
7509             else
7510               {
7511                 tree t = constructor_name (ctype);
7512                 if (t != name)
7513                   rename = t;
7514               }
7515
7516             if (rename)
7517               {
7518                 error ("destructor `%s' must match class name `%s'",
7519                        IDENTIFIER_POINTER (name),
7520                        IDENTIFIER_POINTER (rename));
7521                 TREE_OPERAND (decl, 0) = rename;
7522               }
7523             decl = name;
7524           }
7525           break;
7526
7527         case ADDR_EXPR:         /* C++ reference declaration */
7528           /* fall through */
7529         case ARRAY_REF:
7530         case INDIRECT_REF:
7531           ctype = NULL_TREE;
7532           innermost_code = TREE_CODE (decl);
7533           last = decl;
7534           decl = TREE_OPERAND (decl, 0);
7535           break;
7536
7537         case CALL_EXPR:
7538           if (parmlist_is_exprlist (TREE_OPERAND (decl, 1)))
7539             {
7540               /* This is actually a variable declaration using constructor
7541                  syntax.  We need to call start_decl and cp_finish_decl so we
7542                  can get the variable initialized...  */
7543
7544               if (last)
7545                 /* We need to insinuate ourselves into the declarator in place
7546                    of the CALL_EXPR.  */
7547                 TREE_OPERAND (last, 0) = TREE_OPERAND (decl, 0);
7548               else
7549                 declarator = TREE_OPERAND (decl, 0);
7550
7551               init = TREE_OPERAND (decl, 1);
7552
7553               decl = start_decl (declarator, declspecs, 1, NULL_TREE);
7554               finish_decl (decl, init, NULL_TREE);
7555               return 0;
7556             }
7557           innermost_code = TREE_CODE (decl);
7558           if (decl_context == FIELD && ctype == NULL_TREE)
7559             ctype = current_class_type;
7560           if (ctype
7561               && TREE_OPERAND (decl, 0) == constructor_name_full (ctype))
7562             TREE_OPERAND (decl, 0) = constructor_name (ctype);
7563           decl = TREE_OPERAND (decl, 0);
7564           if (ctype != NULL_TREE
7565               && decl != NULL_TREE && flags != DTOR_FLAG
7566               && decl == constructor_name (ctype))
7567             {
7568               return_type = return_ctor;
7569               ctor_return_type = ctype;
7570             }
7571           ctype = NULL_TREE;
7572           break;
7573
7574         case IDENTIFIER_NODE:
7575           dname = decl;
7576           decl = NULL_TREE;
7577
7578           if (! IDENTIFIER_OPNAME_P (dname)
7579               /* Linux headers use '__op'.  Arrgh.  */
7580               || IDENTIFIER_TYPENAME_P (dname) && ! TREE_TYPE (dname))
7581             name = IDENTIFIER_POINTER (dname);
7582           else
7583             {
7584               if (IDENTIFIER_TYPENAME_P (dname))
7585                 {
7586                   my_friendly_assert (flags == NO_SPECIAL, 154);
7587                   flags = TYPENAME_FLAG;
7588                   ctor_return_type = TREE_TYPE (dname);
7589                   return_type = return_conversion;
7590                 }
7591               name = operator_name_string (dname);
7592             }
7593           break;
7594
7595         case RECORD_TYPE:
7596         case UNION_TYPE:
7597         case ENUMERAL_TYPE:
7598           /* Parse error puts this typespec where
7599              a declarator should go.  */
7600           error ("declarator name missing");
7601           dname = TYPE_NAME (decl);
7602           if (dname && TREE_CODE (dname) == TYPE_DECL)
7603             dname = DECL_NAME (dname);
7604           name = dname ? IDENTIFIER_POINTER (dname) : "<nameless>";
7605           declspecs = temp_tree_cons (NULL_TREE, decl, declspecs);
7606           decl = NULL_TREE;
7607           break;
7608
7609           /* C++ extension */
7610         case SCOPE_REF:
7611           {
7612             /* Perform error checking, and convert class names to types.
7613                We may call grokdeclarator multiple times for the same
7614                tree structure, so only do the conversion once.  In this
7615                case, we have exactly what we want for `ctype'.  */
7616             tree cname = TREE_OPERAND (decl, 0);
7617             if (cname == NULL_TREE)
7618               ctype = NULL_TREE;
7619             /* Can't use IS_AGGR_TYPE because CNAME might not be a type.  */
7620             else if (IS_AGGR_TYPE_CODE (TREE_CODE (cname))
7621                      || TREE_CODE (cname) == UNINSTANTIATED_P_TYPE)
7622               ctype = cname;
7623             else if (! is_aggr_typedef (cname, 1))
7624               {
7625                 TREE_OPERAND (decl, 0) = NULL_TREE;
7626               }
7627             /* Must test TREE_OPERAND (decl, 1), in case user gives
7628                us `typedef (class::memfunc)(int); memfunc *memfuncptr;'  */
7629             else if (TREE_OPERAND (decl, 1)
7630                      && TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF)
7631               {
7632                 TREE_OPERAND (decl, 0) = IDENTIFIER_TYPE_VALUE (cname);
7633               }
7634             else if (ctype == NULL_TREE)
7635               {
7636                 ctype = IDENTIFIER_TYPE_VALUE (cname);
7637                 TREE_OPERAND (decl, 0) = ctype;
7638               }
7639             else if (TREE_COMPLEXITY (decl) == current_class_depth)
7640               TREE_OPERAND (decl, 0) = ctype;
7641             else
7642               {
7643                 if (! UNIQUELY_DERIVED_FROM_P (IDENTIFIER_TYPE_VALUE (cname),
7644                                                ctype))
7645                   {
7646                     cp_error ("type `%T' is not derived from type `%T'",
7647                               IDENTIFIER_TYPE_VALUE (cname), ctype);
7648                     TREE_OPERAND (decl, 0) = NULL_TREE;
7649                   }
7650                 else
7651                   {
7652                     ctype = IDENTIFIER_TYPE_VALUE (cname);
7653                     TREE_OPERAND (decl, 0) = ctype;
7654                   }
7655               }
7656
7657             if (ctype
7658                 && TREE_OPERAND (decl, 1) == constructor_name_full (ctype))
7659               TREE_OPERAND (decl, 1) = constructor_name (ctype);
7660             decl = TREE_OPERAND (decl, 1);
7661             if (ctype)
7662               {
7663                 if (TREE_CODE (decl) == IDENTIFIER_NODE
7664                     && constructor_name (ctype) == decl)
7665                   {
7666                     return_type = return_ctor;
7667                     ctor_return_type = ctype;
7668                   }
7669                 else if (TREE_CODE (decl) == BIT_NOT_EXPR
7670                          && TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE
7671                          && (constructor_name (ctype) == TREE_OPERAND (decl, 0)
7672                              || constructor_name_full (ctype) == TREE_OPERAND (decl, 0)))
7673                   {
7674                     return_type = return_dtor;
7675                     ctor_return_type = ctype;
7676                     flags = DTOR_FLAG;
7677                     decl = TREE_OPERAND (decl, 0) = constructor_name (ctype);
7678                   }
7679               }
7680           }
7681           break;
7682
7683         case ERROR_MARK:
7684           decl = NULL_TREE;
7685           break;
7686
7687         default:
7688           return 0; /* We used to do a 155 abort here.  */
7689         }
7690     if (name == NULL)
7691       name = "type name";
7692   }
7693
7694   /* A function definition's declarator must have the form of
7695      a function declarator.  */
7696
7697   if (funcdef_flag && innermost_code != CALL_EXPR)
7698     return 0;
7699
7700   if (((dname && IDENTIFIER_OPNAME_P (dname)) || flags == TYPENAME_FLAG)
7701       && innermost_code != CALL_EXPR
7702       && ! (ctype && declspecs == NULL_TREE))
7703     {
7704       cp_error ("declaration of `%D' as non-function", dname);
7705       return void_type_node;
7706     }
7707
7708   /* Anything declared one level down from the top level
7709      must be one of the parameters of a function
7710      (because the body is at least two levels down).  */
7711
7712   /* This heuristic cannot be applied to C++ nodes! Fixed, however,
7713      by not allowing C++ class definitions to specify their parameters
7714      with xdecls (must be spec.d in the parmlist).
7715
7716      Since we now wait to push a class scope until we are sure that
7717      we are in a legitimate method context, we must set oldcname
7718      explicitly (since current_class_name is not yet alive).
7719
7720      We also want to avoid calling this a PARM if it is in a namespace.  */
7721
7722   if (decl_context == NORMAL && ! namespace_bindings_p ())
7723     {
7724       struct binding_level *b = current_binding_level;
7725       current_binding_level = b->level_chain;
7726       if (current_binding_level != 0 && toplevel_bindings_p ())
7727         decl_context = PARM;
7728       current_binding_level = b;
7729     }
7730
7731   /* Look through the decl specs and record which ones appear.
7732      Some typespecs are defined as built-in typenames.
7733      Others, the ones that are modifiers of other types,
7734      are represented by bits in SPECBITS: set the bits for
7735      the modifiers that appear.  Storage class keywords are also in SPECBITS.
7736
7737      If there is a typedef name or a type, store the type in TYPE.
7738      This includes builtin typedefs such as `int'.
7739
7740      Set EXPLICIT_INT if the type is `int' or `char' and did not
7741      come from a user typedef.
7742
7743      Set LONGLONG if `long' is mentioned twice.
7744
7745      For C++, constructors and destructors have their own fast treatment.  */
7746
7747   for (spec = declspecs; spec; spec = TREE_CHAIN (spec))
7748     {
7749       register int i;
7750       register tree id;
7751
7752       /* Certain parse errors slip through.  For example,
7753          `int class;' is not caught by the parser. Try
7754          weakly to recover here.  */
7755       if (TREE_CODE (spec) != TREE_LIST)
7756         return 0;
7757
7758       id = TREE_VALUE (spec);
7759
7760       if (TREE_CODE (id) == IDENTIFIER_NODE)
7761         {
7762           if (id == ridpointers[(int) RID_INT]
7763               || id == ridpointers[(int) RID_CHAR]
7764               || id == ridpointers[(int) RID_BOOL]
7765               || id == ridpointers[(int) RID_WCHAR])
7766             {
7767               if (type)
7768                 {
7769                   if (id == ridpointers[(int) RID_BOOL])
7770                     error ("`bool' is now a keyword");
7771                   else
7772                     cp_error ("extraneous `%T' ignored", id);
7773                 }
7774               else
7775                 {
7776                   if (id == ridpointers[(int) RID_INT])
7777                     explicit_int = 1;
7778                   else if (id == ridpointers[(int) RID_CHAR])
7779                     explicit_char = 1;
7780                   type = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (id));
7781                 }
7782               goto found;
7783             }
7784           /* C++ aggregate types. */
7785           if (IDENTIFIER_HAS_TYPE_VALUE (id))
7786             {
7787               if (type)
7788                 cp_error ("multiple declarations `%T' and `%T'", type, id);
7789               else
7790                 type = IDENTIFIER_TYPE_VALUE (id);
7791               goto found;
7792             }
7793
7794           for (i = (int) RID_FIRST_MODIFIER; i <= (int) RID_LAST_MODIFIER; i++)
7795             {
7796               if (ridpointers[i] == id)
7797                 {
7798                   if (i == (int) RID_LONG && RIDBIT_SETP (i, specbits))
7799                     {
7800                       if (pedantic && ! in_system_header)
7801                         pedwarn ("ANSI C++ does not support `long long'");
7802                       else if (longlong)
7803                         error ("`long long long' is too long for GCC");
7804                       else
7805                         longlong = 1;
7806                     }
7807                   else if (RIDBIT_SETP (i, specbits))
7808                     pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id));
7809                   RIDBIT_SET (i, specbits);
7810                   goto found;
7811                 }
7812             }
7813         }
7814       if (type)
7815         error ("two or more data types in declaration of `%s'", name);
7816       else if (TREE_CODE (id) == IDENTIFIER_NODE)
7817         {
7818           register tree t = lookup_name (id, 1);
7819           if (!t || TREE_CODE (t) != TYPE_DECL)
7820             error ("`%s' fails to be a typedef or built in type",
7821                    IDENTIFIER_POINTER (id));
7822           else
7823             {
7824               type = TREE_TYPE (t);
7825               decl_machine_attr = DECL_MACHINE_ATTRIBUTES (id);
7826               typedef_decl = t;
7827             }
7828         }
7829       else if (TREE_CODE (id) != ERROR_MARK)
7830         /* Can't change CLASS nodes into RECORD nodes here!  */
7831         type = id;
7832
7833     found: ;
7834     }
7835
7836   typedef_type = type;
7837
7838   /* No type at all: default to `int', and set EXPLICIT_INT
7839      because it was not a user-defined typedef.
7840      Except when we have a `typedef' inside a signature, in
7841      which case the type defaults to `unknown type' and is
7842      instantiated when assigning to a signature pointer or ref.  */
7843
7844   if (type == NULL_TREE
7845       && (RIDBIT_SETP (RID_SIGNED, specbits)
7846           || RIDBIT_SETP (RID_UNSIGNED, specbits)
7847           || RIDBIT_SETP (RID_LONG, specbits)
7848           || RIDBIT_SETP (RID_SHORT, specbits)))
7849     {
7850       /* These imply 'int'.  */
7851       type = integer_type_node;
7852       explicit_int = 1;
7853     }
7854
7855   if (type == NULL_TREE)
7856     {
7857       explicit_int = -1;
7858       if (return_type == return_dtor)
7859         type = void_type_node;
7860       else if (return_type == return_ctor)
7861         type = TYPE_POINTER_TO (ctor_return_type);
7862       else if (return_type == return_conversion)
7863         type = ctor_return_type;
7864       else if (current_class_type
7865                && IS_SIGNATURE (current_class_type)
7866                && (RIDBIT_SETP (RID_TYPEDEF, specbits)
7867                    || SIGNATURE_GROKKING_TYPEDEF (current_class_type))
7868                && (decl_context == FIELD || decl_context == NORMAL))
7869         {
7870           explicit_int = 0;
7871           opaque_typedef = 1;
7872           type = copy_node (opaque_type_node);
7873         }
7874       /* access declaration */
7875       else if (decl_context == FIELD && declarator
7876                && TREE_CODE (declarator) == SCOPE_REF)
7877         type = void_type_node;
7878       else
7879         {
7880           if (funcdef_flag)
7881             {
7882               if (warn_return_type
7883                   && return_type == return_normal)
7884                 /* Save warning until we know what is really going on.  */
7885                 warn_about_return_type = 1;
7886             }
7887           else if (RIDBIT_SETP (RID_TYPEDEF, specbits))
7888             pedwarn ("ANSI C++ forbids typedef which does not specify a type");
7889           else if (declspecs == NULL_TREE &&
7890                    (innermost_code != CALL_EXPR || pedantic))
7891             cp_pedwarn ("ANSI C++ forbids declaration `%D' with no type or storage class",
7892                         dname);
7893           type = integer_type_node;
7894         }
7895     }
7896   else if (return_type == return_dtor)
7897     {
7898       error ("return type specification for destructor invalid");
7899       type = void_type_node;
7900     }
7901   else if (return_type == return_ctor)
7902     {
7903       error ("return type specification for constructor invalid");
7904       type = TYPE_POINTER_TO (ctor_return_type);
7905     }
7906   else if (return_type == return_conversion)
7907     {
7908       if (comptypes (type, ctor_return_type, 1) == 0)
7909         cp_error ("operator `%T' declared to return `%T'",
7910                   ctor_return_type, type);
7911       else
7912         cp_pedwarn ("return type specified for `operator %T'",
7913                     ctor_return_type);
7914
7915       type = ctor_return_type;
7916     }
7917   /* Catch typedefs that only specify a type, like 'typedef int;'.  */
7918   else if (RIDBIT_SETP (RID_TYPEDEF, specbits) && declarator == NULL_TREE)
7919     {
7920       /* Template "this is a type" syntax; just ignore for now.  */
7921       if (processing_template_defn)
7922         return void_type_node;
7923     }
7924
7925   ctype = NULL_TREE;
7926
7927   /* Now process the modifiers that were specified
7928      and check for invalid combinations.  */
7929
7930   /* Long double is a special combination.  */
7931
7932   if (RIDBIT_SETP (RID_LONG, specbits)
7933       && TYPE_MAIN_VARIANT (type) == double_type_node)
7934     {
7935       RIDBIT_RESET (RID_LONG, specbits);
7936       type = build_type_variant (long_double_type_node, TYPE_READONLY (type),
7937                                  TYPE_VOLATILE (type));
7938     }
7939
7940   /* Check all other uses of type modifiers.  */
7941
7942   if (RIDBIT_SETP (RID_UNSIGNED, specbits)
7943       || RIDBIT_SETP (RID_SIGNED, specbits)
7944       || RIDBIT_SETP (RID_LONG, specbits)
7945       || RIDBIT_SETP (RID_SHORT, specbits))
7946     {
7947       int ok = 0;
7948
7949       if (TREE_CODE (type) == REAL_TYPE)
7950         error ("short, signed or unsigned invalid for `%s'", name);
7951       else if (TREE_CODE (type) != INTEGER_TYPE)
7952         error ("long, short, signed or unsigned invalid for `%s'", name);
7953       else if (RIDBIT_SETP (RID_LONG, specbits)
7954                && RIDBIT_SETP (RID_SHORT, specbits))
7955         error ("long and short specified together for `%s'", name);
7956       else if ((RIDBIT_SETP (RID_LONG, specbits)
7957                 || RIDBIT_SETP (RID_SHORT, specbits))
7958                && explicit_char)
7959         error ("long or short specified with char for `%s'", name);
7960       else if ((RIDBIT_SETP (RID_LONG, specbits)
7961                 || RIDBIT_SETP (RID_SHORT, specbits))
7962                && TREE_CODE (type) == REAL_TYPE)
7963         error ("long or short specified with floating type for `%s'", name);
7964       else if (RIDBIT_SETP (RID_SIGNED, specbits)
7965                && RIDBIT_SETP (RID_UNSIGNED, specbits))
7966         error ("signed and unsigned given together for `%s'", name);
7967       else
7968         {
7969           ok = 1;
7970           if (!explicit_int && !explicit_char && pedantic)
7971             {
7972               pedwarn ("long, short, signed or unsigned used invalidly for `%s'",
7973                        name);
7974               if (flag_pedantic_errors)
7975                 ok = 0;
7976             }
7977         }
7978
7979       /* Discard the type modifiers if they are invalid.  */
7980       if (! ok)
7981         {
7982           RIDBIT_RESET (RID_UNSIGNED, specbits);
7983           RIDBIT_RESET (RID_SIGNED, specbits);
7984           RIDBIT_RESET (RID_LONG, specbits);
7985           RIDBIT_RESET (RID_SHORT, specbits);
7986           longlong = 0;
7987         }
7988     }
7989
7990   /* Decide whether an integer type is signed or not.
7991      Optionally treat bitfields as signed by default.  */
7992   if (RIDBIT_SETP (RID_UNSIGNED, specbits)
7993       /* Traditionally, all bitfields are unsigned.  */
7994       || (bitfield && flag_traditional)
7995       || (bitfield && ! flag_signed_bitfields
7996           && (explicit_int || explicit_char
7997               /* A typedef for plain `int' without `signed'
7998                  can be controlled just like plain `int'.  */
7999               || ! (typedef_decl != NULL_TREE
8000                     && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
8001           && TREE_CODE (type) != ENUMERAL_TYPE
8002           && RIDBIT_NOTSETP (RID_SIGNED, specbits)))
8003     {
8004       if (longlong)
8005         type = long_long_unsigned_type_node;
8006       else if (RIDBIT_SETP (RID_LONG, specbits))
8007         type = long_unsigned_type_node;
8008       else if (RIDBIT_SETP (RID_SHORT, specbits))
8009         type = short_unsigned_type_node;
8010       else if (type == char_type_node)
8011         type = unsigned_char_type_node;
8012       else if (typedef_decl)
8013         type = unsigned_type (type);
8014       else
8015         type = unsigned_type_node;
8016     }
8017   else if (RIDBIT_SETP (RID_SIGNED, specbits)
8018            && type == char_type_node)
8019     type = signed_char_type_node;
8020   else if (longlong)
8021     type = long_long_integer_type_node;
8022   else if (RIDBIT_SETP (RID_LONG, specbits))
8023     type = long_integer_type_node;
8024   else if (RIDBIT_SETP (RID_SHORT, specbits))
8025     type = short_integer_type_node;
8026
8027   /* Set CONSTP if this declaration is `const', whether by
8028      explicit specification or via a typedef.
8029      Likewise for VOLATILEP.  */
8030
8031   constp = !! RIDBIT_SETP (RID_CONST, specbits) + TYPE_READONLY (type);
8032   volatilep = !! RIDBIT_SETP (RID_VOLATILE, specbits) + TYPE_VOLATILE (type);
8033   staticp = 0;
8034   inlinep = !! RIDBIT_SETP (RID_INLINE, specbits);
8035 #if 0
8036   /* This sort of redundancy is blessed in a footnote to the Sep 94 WP.  */
8037   if (constp > 1)
8038     warning ("duplicate `const'");
8039   if (volatilep > 1)
8040     warning ("duplicate `volatile'");
8041 #endif
8042   virtualp = RIDBIT_SETP (RID_VIRTUAL, specbits);
8043   RIDBIT_RESET (RID_VIRTUAL, specbits);
8044   explicitp = RIDBIT_SETP (RID_EXPLICIT, specbits) != 0;
8045   RIDBIT_RESET (RID_EXPLICIT, specbits);
8046
8047   if (RIDBIT_SETP (RID_STATIC, specbits))
8048     staticp = 1 + (decl_context == FIELD);
8049
8050   if (virtualp && staticp == 2)
8051     {
8052       cp_error ("member `%D' cannot be declared both virtual and static",
8053                 dname);
8054       staticp = 0;
8055     }
8056   friendp = RIDBIT_SETP (RID_FRIEND, specbits);
8057   RIDBIT_RESET (RID_FRIEND, specbits);
8058
8059   if (RIDBIT_SETP (RID_MUTABLE, specbits))
8060     {
8061       if (decl_context == PARM)
8062         {
8063           error ("non-member `%s' cannot be declared `mutable'", name);
8064           RIDBIT_RESET (RID_MUTABLE, specbits);
8065         }
8066       else if (friendp || decl_context == TYPENAME)
8067         {
8068           error ("non-object member `%s' cannot be declared `mutable'", name);
8069           RIDBIT_RESET (RID_MUTABLE, specbits);
8070         }
8071       else if (constp)
8072         {
8073           error ("const `%s' cannot be declared `mutable'", name);
8074           RIDBIT_RESET (RID_MUTABLE, specbits);
8075         }
8076       else if (staticp)
8077         {
8078           error ("static `%s' cannot be declared `mutable'", name);
8079           RIDBIT_RESET (RID_MUTABLE, specbits);
8080         }
8081 #if 0
8082       if (RIDBIT_SETP (RID_TYPEDEF, specbits))
8083         {
8084           error ("non-object member `%s' cannot be declared `mutable'", name);
8085           RIDBIT_RESET (RID_MUTABLE, specbits);
8086         }
8087       /* Because local typedefs are parsed twice, we don't want this
8088          message here. */
8089       else if (decl_context != FIELD)
8090         {
8091           error ("non-member `%s' cannot be declared `mutable'", name);
8092           RIDBIT_RESET (RID_MUTABLE, specbits);
8093         }
8094 #endif
8095     }
8096
8097   /* Warn if two storage classes are given. Default to `auto'.  */
8098
8099   if (RIDBIT_ANY_SET (specbits))
8100     {
8101       if (RIDBIT_SETP (RID_STATIC, specbits)) nclasses++;
8102       if (RIDBIT_SETP (RID_EXTERN, specbits)) nclasses++;
8103       if (decl_context == PARM && nclasses > 0)
8104         error ("storage class specifiers invalid in parameter declarations");
8105       if (RIDBIT_SETP (RID_TYPEDEF, specbits))
8106         {
8107           if (decl_context == PARM)
8108             error ("typedef declaration invalid in parameter declaration");
8109           nclasses++;
8110         }
8111       if (RIDBIT_SETP (RID_AUTO, specbits)) nclasses++;
8112       if (RIDBIT_SETP (RID_REGISTER, specbits)) nclasses++;
8113     }
8114
8115   /* Give error if `virtual' is used outside of class declaration.  */
8116   if (virtualp
8117       && (current_class_name == NULL_TREE || decl_context != FIELD))
8118     {
8119       error ("virtual outside class declaration");
8120       virtualp = 0;
8121     }
8122   if (current_class_name == NULL_TREE && RIDBIT_SETP (RID_MUTABLE, specbits))
8123     {
8124       error ("only members can be declared mutable");
8125       RIDBIT_RESET (RID_MUTABLE, specbits);
8126     }
8127
8128   /* Static anonymous unions are dealt with here.  */
8129   if (staticp && decl_context == TYPENAME
8130       && TREE_CODE (declspecs) == TREE_LIST
8131       && TREE_CODE (TREE_VALUE (declspecs)) == UNION_TYPE
8132       && ANON_AGGRNAME_P (TYPE_IDENTIFIER (TREE_VALUE (declspecs))))
8133     decl_context = FIELD;
8134
8135   /* Give error if `const,' `volatile,' `inline,' `friend,' or `virtual'
8136      is used in a signature member function declaration.  */
8137   if (decl_context == FIELD
8138       && IS_SIGNATURE (current_class_type)
8139       && RIDBIT_NOTSETP(RID_TYPEDEF, specbits)
8140       && !SIGNATURE_GROKKING_TYPEDEF (current_class_type))
8141     {
8142       if (constp)
8143         {
8144           error ("`const' specified for signature member function `%s'", name);
8145           constp = 0;
8146         }
8147       if (volatilep)
8148         {
8149           error ("`volatile' specified for signature member function `%s'",
8150                  name);
8151           volatilep = 0;
8152         }
8153       if (inlinep)
8154         {
8155           error ("`inline' specified for signature member function `%s'", name);
8156           /* Later, we'll make signature member functions inline.  */
8157           inlinep = 0;
8158         }
8159       if (friendp)
8160         {
8161           error ("`friend' declaration in signature definition");
8162           friendp = 0;
8163         }
8164       if (virtualp)
8165         {
8166           error ("`virtual' specified for signature member function `%s'",
8167                  name);
8168           /* Later, we'll make signature member functions virtual.  */
8169           virtualp = 0;
8170         }
8171     }
8172
8173   /* Warn about storage classes that are invalid for certain
8174      kinds of declarations (parameters, typenames, etc.).  */
8175
8176   if (nclasses > 1)
8177     error ("multiple storage classes in declaration of `%s'", name);
8178   else if (decl_context != NORMAL && nclasses > 0)
8179     {
8180       if ((decl_context == PARM || decl_context == CATCHPARM)
8181           && (RIDBIT_SETP (RID_REGISTER, specbits)
8182               || RIDBIT_SETP (RID_AUTO, specbits)))
8183         ;
8184       else if (decl_context == FIELD
8185                && RIDBIT_SETP (RID_TYPEDEF, specbits))
8186         {
8187           /* Processing a typedef declaration nested within a class type
8188              definition.  */
8189           register tree scanner;
8190           register tree previous_declspec;
8191           tree loc_typedecl;
8192   
8193           if (initialized)
8194             error ("typedef declaration includes an initializer");
8195   
8196           /* To process a class-local typedef declaration, we descend down
8197              the chain of declspecs looking for the `typedef' spec.  When
8198              we find it, we replace it with `static', and then recursively
8199              call `grokdeclarator' with the original declarator and with
8200              the newly adjusted declspecs.  This call should return a
8201              FIELD_DECL node with the TREE_TYPE (and other parts) set
8202              appropriately.  We can then just change the TREE_CODE on that
8203              from FIELD_DECL to TYPE_DECL and we're done.  */
8204
8205           for (previous_declspec = NULL_TREE, scanner = declspecs;
8206                scanner;
8207                previous_declspec = scanner, scanner = TREE_CHAIN (scanner))
8208             {
8209               if (TREE_VALUE (scanner) == ridpointers[(int) RID_TYPEDEF])
8210                 break;
8211             }
8212
8213           if (previous_declspec)
8214             TREE_CHAIN (previous_declspec) = TREE_CHAIN (scanner);
8215           else
8216             declspecs = TREE_CHAIN (scanner);
8217
8218           declspecs = tree_cons (NULL_TREE, ridpointers[(int) RID_STATIC],
8219                                  declspecs);
8220
8221           /* In the recursive call to grokdeclarator we need to know
8222              whether we are working on a signature-local typedef.  */
8223           if (IS_SIGNATURE (current_class_type))
8224             SIGNATURE_GROKKING_TYPEDEF (current_class_type) = 1;
8225   
8226           loc_typedecl =
8227             grokdeclarator (declarator, declspecs, FIELD, 0, NULL_TREE);
8228
8229           if (previous_declspec)
8230             TREE_CHAIN (previous_declspec) = scanner;
8231   
8232           if (loc_typedecl != error_mark_node)
8233             {
8234               register int i = sizeof (struct lang_decl_flags) / sizeof (int);
8235               register int *pi;
8236   
8237               TREE_SET_CODE (loc_typedecl, TYPE_DECL);
8238               /* This is the same field as DECL_ARGUMENTS, which is set for
8239                  function typedefs by the above grokdeclarator.  */
8240               DECL_NESTED_TYPENAME (loc_typedecl) = 0;
8241   
8242               pi = (int *) permalloc (sizeof (struct lang_decl_flags));
8243               while (i > 0)
8244                 pi[--i] = 0;
8245               DECL_LANG_SPECIFIC (loc_typedecl) = (struct lang_decl *) pi;
8246             }
8247   
8248           if (IS_SIGNATURE (current_class_type))
8249             {
8250               SIGNATURE_GROKKING_TYPEDEF (current_class_type) = 0;
8251               if (loc_typedecl != error_mark_node && opaque_typedef)
8252                 SIGNATURE_HAS_OPAQUE_TYPEDECLS (current_class_type) = 1;
8253             }
8254
8255           return loc_typedecl;
8256         }
8257       else if (decl_context == FIELD
8258                && (! IS_SIGNATURE (current_class_type)
8259                    || SIGNATURE_GROKKING_TYPEDEF (current_class_type))
8260                /* C++ allows static class elements  */
8261                && RIDBIT_SETP (RID_STATIC, specbits))
8262         /* C++ also allows inlines and signed and unsigned elements,
8263            but in those cases we don't come in here.  */
8264         ;
8265       else
8266         {
8267           if (decl_context == FIELD)
8268             {
8269               tree tmp = NULL_TREE;
8270               register int op = 0;
8271
8272               if (declarator)
8273                 {
8274                   tmp = TREE_OPERAND (declarator, 0);
8275                   op = IDENTIFIER_OPNAME_P (tmp);
8276                 }
8277               error ("storage class specified for %s `%s'",
8278                      IS_SIGNATURE (current_class_type)
8279                      ? (op
8280                         ? "signature member operator"
8281                         : "signature member function")
8282                      : (op ? "member operator" : "field"),
8283                      op ? operator_name_string (tmp) : name);
8284             }
8285           else
8286             error (((decl_context == PARM || decl_context == CATCHPARM)
8287                     ? "storage class specified for parameter `%s'"
8288                     : "storage class specified for typename"), name);
8289           RIDBIT_RESET (RID_REGISTER, specbits);
8290           RIDBIT_RESET (RID_AUTO, specbits);
8291           RIDBIT_RESET (RID_EXTERN, specbits);
8292
8293           if (decl_context == FIELD && IS_SIGNATURE (current_class_type))
8294             {
8295               RIDBIT_RESET (RID_STATIC, specbits);
8296               staticp = 0;
8297             }
8298         }
8299     }
8300   else if (RIDBIT_SETP (RID_EXTERN, specbits) && initialized && !funcdef_flag)
8301     {
8302       if (toplevel_bindings_p ())
8303         {
8304           /* It's common practice (and completely valid) to have a const
8305              be initialized and declared extern.  */
8306           if (! constp)
8307             warning ("`%s' initialized and declared `extern'", name);
8308         }
8309       else
8310         error ("`%s' has both `extern' and initializer", name);
8311     }
8312   else if (RIDBIT_SETP (RID_EXTERN, specbits) && funcdef_flag
8313            && ! toplevel_bindings_p ())
8314     error ("nested function `%s' declared `extern'", name);
8315   else if (toplevel_bindings_p ())
8316     {
8317       if (RIDBIT_SETP (RID_AUTO, specbits))
8318         error ("top-level declaration of `%s' specifies `auto'", name);
8319 #if 0
8320       if (RIDBIT_SETP (RID_REGISTER, specbits))
8321         error ("top-level declaration of `%s' specifies `register'", name);
8322 #endif
8323 #if 0
8324       /* I'm not sure under what circumstances we should turn
8325          on the extern bit, and under what circumstances we should
8326          warn if other bits are turned on.  */
8327       if (decl_context == NORMAL
8328           && RIDBIT_NOSETP (RID_EXTERN, specbits)
8329           && ! root_lang_context_p ())
8330         {
8331           RIDBIT_SET (RID_EXTERN, specbits);
8332         }
8333 #endif
8334     }
8335
8336   /* Now figure out the structure of the declarator proper.
8337      Descend through it, creating more complex types, until we reach
8338      the declared identifier (or NULL_TREE, in an absolute declarator).  */
8339
8340   while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE)
8341     {
8342       /* Each level of DECLARATOR is either an ARRAY_REF (for ...[..]),
8343          an INDIRECT_REF (for *...),
8344          a CALL_EXPR (for ...(...)),
8345          an identifier (for the name being declared)
8346          or a null pointer (for the place in an absolute declarator
8347          where the name was omitted).
8348          For the last two cases, we have just exited the loop.
8349
8350          For C++ it could also be
8351          a SCOPE_REF (for class :: ...).  In this case, we have converted
8352          sensible names to types, and those are the values we use to
8353          qualify the member name.
8354          an ADDR_EXPR (for &...),
8355          a BIT_NOT_EXPR (for destructors)
8356
8357          At this point, TYPE is the type of elements of an array,
8358          or for a function to return, or for a pointer to point to.
8359          After this sequence of ifs, TYPE is the type of the
8360          array or function or pointer, and DECLARATOR has had its
8361          outermost layer removed.  */
8362
8363       if (TREE_CODE (type) == ERROR_MARK)
8364         {
8365           if (TREE_CODE (declarator) == SCOPE_REF)
8366             declarator = TREE_OPERAND (declarator, 1);
8367           else
8368             declarator = TREE_OPERAND (declarator, 0);
8369           continue;
8370         }
8371       if (quals != NULL_TREE
8372           && (declarator == NULL_TREE
8373               || TREE_CODE (declarator) != SCOPE_REF))
8374         {
8375           if (ctype == NULL_TREE && TREE_CODE (type) == METHOD_TYPE)
8376             ctype = TYPE_METHOD_BASETYPE (type);
8377           if (ctype != NULL_TREE)
8378             {
8379 #if 0 /* not yet, should get fixed properly later */
8380               tree dummy = make_type_decl (NULL_TREE, type);
8381 #else
8382               tree dummy = build_decl (TYPE_DECL, NULL_TREE, type);
8383 #endif
8384               ctype = grok_method_quals (ctype, dummy, quals);
8385               type = TREE_TYPE (dummy);
8386               quals = NULL_TREE;
8387             }
8388         }
8389       switch (TREE_CODE (declarator))
8390         {
8391         case ARRAY_REF:
8392           {
8393             register tree itype = NULL_TREE;
8394             register tree size = TREE_OPERAND (declarator, 1);
8395             /* The index is a signed object `sizetype' bits wide.  */
8396             tree index_type = signed_type (sizetype);
8397
8398             declarator = TREE_OPERAND (declarator, 0);
8399
8400             /* Check for some types that there cannot be arrays of.  */
8401
8402             if (TYPE_MAIN_VARIANT (type) == void_type_node)
8403               {
8404                 cp_error ("declaration of `%D' as array of voids", dname);
8405                 type = error_mark_node;
8406               }
8407
8408             if (TREE_CODE (type) == FUNCTION_TYPE)
8409               {
8410                 cp_error ("declaration of `%D' as array of functions", dname);
8411                 type = error_mark_node;
8412               }
8413
8414             /* ARM $8.4.3: Since you can't have a pointer to a reference,
8415                you can't have arrays of references.  If we allowed them,
8416                then we'd be saying x[i] is valid for an array x, but
8417                then you'd have to ask: what does `*(x + i)' mean?  */
8418             if (TREE_CODE (type) == REFERENCE_TYPE)
8419               {
8420                 if (decl_context == TYPENAME)
8421                   cp_error ("cannot make arrays of references");
8422                 else
8423                   cp_error ("declaration of `%D' as array of references",
8424                             dname);
8425                 type = error_mark_node;
8426               }
8427
8428             if (TREE_CODE (type) == OFFSET_TYPE)
8429               {
8430                   cp_error ("declaration of `%D' as array of data members",
8431                             dname);
8432                 type = error_mark_node;
8433               }
8434
8435             if (TREE_CODE (type) == METHOD_TYPE)
8436               {
8437                 cp_error ("declaration of `%D' as array of function members",
8438                           dname);
8439                 type = error_mark_node;
8440               }
8441
8442             if (size == error_mark_node)
8443               type = error_mark_node;
8444
8445             if (type == error_mark_node)
8446               continue;
8447
8448             if (size)
8449               {
8450                 /* Must suspend_momentary here because the index
8451                    type may need to live until the end of the function.
8452                    For example, it is used in the declaration of a
8453                    variable which requires destructing at the end of
8454                    the function; then build_vec_delete will need this
8455                    value.  */
8456                 int yes = suspend_momentary ();
8457                 /* might be a cast */
8458                 if (TREE_CODE (size) == NOP_EXPR
8459                     && TREE_TYPE (size) == TREE_TYPE (TREE_OPERAND (size, 0)))
8460                   size = TREE_OPERAND (size, 0);
8461
8462                 /* If this is a template parameter, it'll be constant, but
8463                    we don't know what the value is yet.  */
8464                 if (TREE_CODE (size) == TEMPLATE_CONST_PARM)
8465                   goto dont_grok_size;
8466
8467                 if (TREE_CODE (TREE_TYPE (size)) != INTEGER_TYPE
8468                     && TREE_CODE (TREE_TYPE (size)) != ENUMERAL_TYPE)
8469                   {
8470                     cp_error ("size of array `%D' has non-integer type",
8471                               dname);
8472                     size = integer_one_node;
8473                   }
8474                 if (TREE_READONLY_DECL_P (size))
8475                   size = decl_constant_value (size);
8476                 if (pedantic && integer_zerop (size))
8477                   cp_pedwarn ("ANSI C++ forbids zero-size array `%D'", dname);
8478                 if (TREE_CONSTANT (size))
8479                   {
8480                     constant_expression_warning (size);
8481                     if (INT_CST_LT (size, integer_zero_node))
8482                       {
8483                         cp_error ("size of array `%D' is negative", dname);
8484                         size = integer_one_node;
8485                       }
8486                   }
8487                 else
8488                   {
8489                     if (pedantic)
8490                       {
8491                         if (dname)
8492                           cp_pedwarn ("ANSI C++ forbids variable-size array `%D'",
8493                                       dname);
8494                         else
8495                           cp_pedwarn ("ANSI C++ forbids variable-size array");
8496                       }
8497                     /* Make sure the array size remains visibly nonconstant
8498                        even if it is (eg) a const variable with known value. */
8499                     size_varies = 1;
8500                   }
8501
8502               dont_grok_size:
8503                 itype =
8504                   fold (build_binary_op (MINUS_EXPR,
8505                                          convert (index_type, size),
8506                                          convert (index_type,
8507                                                   integer_one_node), 1));
8508                 if (! TREE_CONSTANT (itype))
8509                   itype = variable_size (itype);
8510                 itype = build_index_type (itype);
8511                 resume_momentary (yes);
8512               }
8513
8514           /* Build the array type itself, then merge any constancy or
8515              volatility into the target type.  We must do it in this order
8516              to ensure that the TYPE_MAIN_VARIANT field of the array type
8517              is set correctly.  */
8518
8519             type = build_cplus_array_type (type, itype);
8520             if (constp || volatilep)
8521               type = cp_build_type_variant (type, constp, volatilep);
8522
8523             ctype = NULL_TREE;
8524           }
8525           break;
8526
8527         case CALL_EXPR:
8528           {
8529             tree arg_types;
8530             int funcdecl_p;
8531             tree inner_parms = TREE_OPERAND (declarator, 1);
8532             tree inner_decl = TREE_OPERAND (declarator, 0);
8533
8534             /* Declaring a function type.
8535                Make sure we have a valid type for the function to return.  */
8536 #if 0
8537             /* Is this an error?  Should they be merged into TYPE here?  */
8538             if (pedantic && (constp || volatilep))
8539               pedwarn ("function declared to return const or volatile result");
8540 #else
8541             /* Merge any constancy or volatility into the function return
8542                type.  */
8543
8544             if (constp || volatilep)
8545               {
8546                 type = cp_build_type_variant (type, constp, volatilep);
8547                 if (IS_AGGR_TYPE (type))
8548                   build_pointer_type (type);
8549                 constp = 0;
8550                 volatilep = 0;
8551               }
8552 #endif
8553
8554             /* Warn about some types functions can't return.  */
8555
8556             if (TREE_CODE (type) == FUNCTION_TYPE)
8557               {
8558                 error ("`%s' declared as function returning a function", name);
8559                 type = integer_type_node;
8560               }
8561             if (TREE_CODE (type) == ARRAY_TYPE)
8562               {
8563                 error ("`%s' declared as function returning an array", name);
8564                 type = integer_type_node;
8565               }
8566
8567             if (inner_decl && TREE_CODE (inner_decl) == SCOPE_REF)
8568               inner_decl = TREE_OPERAND (inner_decl, 1);
8569
8570             /* Pick up type qualifiers which should be applied to `this'.  */
8571             quals = TREE_OPERAND (declarator, 2);
8572
8573             /* Say it's a definition only for the CALL_EXPR
8574                closest to the identifier.  */
8575             funcdecl_p =
8576               inner_decl && (TREE_CODE (inner_decl) == IDENTIFIER_NODE
8577                              || TREE_CODE (inner_decl) == BIT_NOT_EXPR);
8578
8579             if (ctype == NULL_TREE
8580                 && decl_context == FIELD
8581                 && funcdecl_p
8582                 && (friendp == 0 || dname == current_class_name))
8583               ctype = current_class_type;
8584
8585             if (ctype && return_type == return_conversion)
8586               TYPE_HAS_CONVERSION (ctype) = 1;
8587             if (ctype && constructor_name (ctype) == dname)
8588               {
8589                 /* We are within a class's scope. If our declarator name
8590                    is the same as the class name, and we are defining
8591                    a function, then it is a constructor/destructor, and
8592                    therefore returns a void type.  */
8593
8594                 if (flags == DTOR_FLAG)
8595                   {
8596                     /* ANSI C++ June 5 1992 WP 12.4.1.  A destructor may
8597                        not be declared const or volatile.  A destructor
8598                        may not be static.  */
8599                     if (staticp == 2)
8600                       error ("destructor cannot be static member function");
8601                     if (quals)
8602                       {
8603                         error ("destructors cannot be declared `const' or `volatile'");
8604                         return void_type_node;
8605                       }
8606                     if (decl_context == FIELD)
8607                       {
8608                         if (! member_function_or_else (ctype, current_class_type,
8609                                                        "destructor for alien class `%s' cannot be a member"))
8610                           return void_type_node;
8611                       }
8612                   }
8613                 else            /* it's a constructor. */
8614                   {
8615                     if (explicitp == 1)
8616                       explicitp = 2;
8617                     /* ANSI C++ June 5 1992 WP 12.1.2.  A constructor may
8618                        not be declared const or volatile.  A constructor may
8619                        not be virtual.  A constructor may not be static.  */
8620                     if (staticp == 2)
8621                       error ("constructor cannot be static member function");
8622                     if (virtualp)
8623                       {
8624                         pedwarn ("constructors cannot be declared virtual");
8625                         virtualp = 0;
8626                       }
8627                     if (quals)
8628                       {
8629                         error ("constructors cannot be declared `const' or `volatile'");
8630                         return void_type_node;
8631                       }
8632                     {
8633                       RID_BIT_TYPE tmp_bits;
8634                       bcopy ((void*)&specbits, (void*)&tmp_bits, sizeof(RID_BIT_TYPE));
8635                       RIDBIT_RESET (RID_INLINE, tmp_bits);
8636                       RIDBIT_RESET (RID_STATIC, tmp_bits);
8637                       if (RIDBIT_ANY_SET (tmp_bits))
8638                         error ("return value type specifier for constructor ignored");
8639                     }
8640                     type = TYPE_POINTER_TO (ctype);
8641                     if (decl_context == FIELD &&
8642                         IS_SIGNATURE (current_class_type))
8643                       {
8644                         error ("constructor not allowed in signature");
8645                         return void_type_node;
8646                       }                   
8647                     else if (decl_context == FIELD)
8648                       {
8649                         if (! member_function_or_else (ctype, current_class_type,
8650                                                        "constructor for alien class `%s' cannot be member"))
8651                           return void_type_node;
8652                         TYPE_HAS_CONSTRUCTOR (ctype) = 1;
8653                         if (return_type != return_ctor)
8654                           return NULL_TREE;
8655                       }
8656                   }
8657                 if (decl_context == FIELD)
8658                   staticp = 0;
8659               }
8660             else if (friendp)
8661               {
8662                 if (initialized)
8663                   error ("can't initialize friend function `%s'", name);
8664                 if (virtualp)
8665                   {
8666                     /* Cannot be both friend and virtual.  */
8667                     error ("virtual functions cannot be friends");
8668                     RIDBIT_RESET (RID_FRIEND, specbits);
8669                     friendp = 0;
8670                   }
8671                 if (decl_context == NORMAL)
8672                   error ("friend declaration not in class definition");
8673                 if (current_function_decl && funcdef_flag)
8674                   cp_error ("can't define friend function `%s' in a local class definition",
8675                             name);
8676               }
8677
8678             /* Traditionally, declaring return type float means double.  */
8679
8680             if (flag_traditional
8681                 && TYPE_MAIN_VARIANT (type) == float_type_node)
8682               {
8683                 type = build_type_variant (double_type_node,
8684                                            TYPE_READONLY (type),
8685                                            TYPE_VOLATILE (type));
8686               }
8687
8688             /* Construct the function type and go to the next
8689                inner layer of declarator.  */
8690
8691             declarator = TREE_OPERAND (declarator, 0);
8692
8693             /* FIXME: This is where default args should be fully
8694                processed.  */
8695
8696             arg_types = grokparms (inner_parms, funcdecl_p ? funcdef_flag : 0);
8697
8698             if (declarator)
8699               {
8700                 /* Get past destructors, etc.
8701                    We know we have one because FLAGS will be non-zero.
8702
8703                    Complain about improper parameter lists here.  */
8704                 if (TREE_CODE (declarator) == BIT_NOT_EXPR)
8705                   {
8706                     declarator = TREE_OPERAND (declarator, 0);
8707
8708                     if (strict_prototype == 0 && arg_types == NULL_TREE)
8709                       arg_types = void_list_node;
8710                     else if (arg_types == NULL_TREE
8711                              || arg_types != void_list_node)
8712                       {
8713                         error ("destructors cannot be specified with parameters");
8714                         arg_types = void_list_node;
8715                       }
8716                   }
8717               }
8718
8719             /* ANSI seems to say that `const int foo ();'
8720                does not make the function foo const.  */
8721             type = build_function_type (type,
8722                                         flag_traditional ? 0 : arg_types);
8723           }
8724           break;
8725
8726         case ADDR_EXPR:
8727         case INDIRECT_REF:
8728           /* Filter out pointers-to-references and references-to-references.
8729              We can get these if a TYPE_DECL is used.  */
8730
8731           if (TREE_CODE (type) == REFERENCE_TYPE)
8732             {
8733               error ("cannot declare %s to references",
8734                      TREE_CODE (declarator) == ADDR_EXPR
8735                      ? "references" : "pointers");
8736               declarator = TREE_OPERAND (declarator, 0);
8737               continue;
8738             }
8739
8740           if (TREE_CODE (type) == OFFSET_TYPE
8741               && (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE
8742                   || TREE_CODE (TREE_TYPE (type)) == REFERENCE_TYPE))
8743             {
8744               cp_error ("cannot declare pointer to `%#T' member",
8745                         TREE_TYPE (type));
8746               type = TREE_TYPE (type);
8747             }
8748
8749           /* Merge any constancy or volatility into the target type
8750              for the pointer.  */
8751
8752           if (constp || volatilep)
8753             {
8754               /* A const or volatile signature pointer/reference is
8755                  pointing to a const or volatile object, i.e., the
8756                  `optr' is const or volatile, respectively, not the
8757                  signature pointer/reference itself.  */
8758               if (! IS_SIGNATURE (type))
8759                 {
8760                   type = cp_build_type_variant (type, constp, volatilep);
8761                   if (IS_AGGR_TYPE (type))
8762                     build_pointer_type (type);
8763                   constp = 0;
8764                   volatilep = 0;
8765                 }
8766             }
8767
8768           if (IS_SIGNATURE (type))
8769             {
8770               if (TREE_CODE (declarator) == ADDR_EXPR)
8771                 {
8772                   if (CLASSTYPE_METHOD_VEC (type) == NULL_TREE
8773                       && TYPE_SIZE (type))
8774                     cp_warning ("empty signature `%T' used in signature reference declaration",
8775                                 type);
8776 #if 0
8777                   type = build_signature_reference_type (type,
8778                                                          constp, volatilep);
8779 #else
8780                   sorry ("signature reference");
8781                   return NULL_TREE;
8782 #endif
8783                 }
8784               else
8785                 {
8786                   if (CLASSTYPE_METHOD_VEC (type) == NULL_TREE
8787                       && TYPE_SIZE (type))
8788                     cp_warning ("empty signature `%T' used in signature pointer declaration",
8789                                 type);
8790                   type = build_signature_pointer_type (type,
8791                                                        constp, volatilep);
8792                 }
8793               constp = 0;
8794               volatilep = 0;
8795             }
8796           else if (TREE_CODE (declarator) == ADDR_EXPR)
8797             {
8798               if (TREE_CODE (type) == FUNCTION_TYPE)
8799                 {
8800                   error ("cannot declare references to functions; use pointer to function instead");
8801                   type = build_pointer_type (type);
8802                 }
8803               else
8804                 {
8805                   if (TYPE_MAIN_VARIANT (type) == void_type_node)
8806                     error ("invalid type: `void &'");
8807                   else
8808                     type = build_reference_type (type);
8809                 }
8810             }
8811           else if (TREE_CODE (type) == METHOD_TYPE)
8812             {
8813               type = build_ptrmemfunc_type (build_pointer_type (type));
8814             }
8815           else
8816             type = build_pointer_type (type);
8817
8818           /* Process a list of type modifier keywords (such as
8819              const or volatile) that were given inside the `*' or `&'.  */
8820
8821           if (TREE_TYPE (declarator))
8822             {
8823               register tree typemodlist;
8824               int erred = 0;
8825               for (typemodlist = TREE_TYPE (declarator); typemodlist;
8826                    typemodlist = TREE_CHAIN (typemodlist))
8827                 {
8828                   if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_CONST])
8829                     constp++;
8830                   else if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_VOLATILE])
8831                     volatilep++;
8832                   else if (!erred)
8833                     {
8834                       erred = 1;
8835                       error ("invalid type modifier within %s declarator",
8836                              TREE_CODE (declarator) == ADDR_EXPR
8837                              ? "reference" : "pointer");
8838                     }
8839                 }
8840               if (constp > 1)
8841                 pedwarn ("duplicate `const'");
8842               if (volatilep > 1)
8843                 pedwarn ("duplicate `volatile'");
8844               if (TREE_CODE (declarator) == ADDR_EXPR
8845                   && (constp || volatilep))
8846                 {
8847                   if (constp)
8848                     pedwarn ("discarding `const' applied to a reference");
8849                   if (volatilep)
8850                     pedwarn ("discarding `volatile' applied to a reference");
8851                   constp = volatilep = 0;
8852                 }
8853             }
8854           declarator = TREE_OPERAND (declarator, 0);
8855           ctype = NULL_TREE;
8856           break;
8857
8858         case SCOPE_REF:
8859           {
8860             /* We have converted type names to NULL_TREE if the
8861                name was bogus, or to a _TYPE node, if not.
8862
8863                The variable CTYPE holds the type we will ultimately
8864                resolve to.  The code here just needs to build
8865                up appropriate member types.  */
8866             tree sname = TREE_OPERAND (declarator, 1);
8867             /* Destructors can have their visibilities changed as well.  */
8868             if (TREE_CODE (sname) == BIT_NOT_EXPR)
8869               sname = TREE_OPERAND (sname, 0);
8870
8871             if (TREE_COMPLEXITY (declarator) == 0)
8872               /* This needs to be here, in case we are called
8873                  multiple times.  */ ;
8874             else if (friendp && (TREE_COMPLEXITY (declarator) < 2))
8875               /* don't fall out into global scope. Hides real bug? --eichin */ ;
8876             else if (TREE_COMPLEXITY (declarator) == current_class_depth)
8877               {
8878                 /* This pop_nested_class corresponds to the
8879                    push_nested_class used to push into class scope for
8880                    parsing the argument list of a function decl, in
8881                    qualified_id.  */
8882                 pop_nested_class (1);
8883                 TREE_COMPLEXITY (declarator) = current_class_depth;
8884               }
8885             else
8886               my_friendly_abort (16);
8887
8888             if (TREE_OPERAND (declarator, 0) == NULL_TREE)
8889               {
8890                 /* We had a reference to a global decl, or
8891                    perhaps we were given a non-aggregate typedef,
8892                    in which case we cleared this out, and should just
8893                    keep going as though it wasn't there.  */
8894                 declarator = sname;
8895                 continue;
8896               }
8897             ctype = TREE_OPERAND (declarator, 0);
8898
8899             if (sname == NULL_TREE)
8900               goto done_scoping;
8901
8902             if (TREE_CODE (sname) == IDENTIFIER_NODE)
8903               {
8904                 /* This is the `standard' use of the scoping operator:
8905                    basetype :: member .  */
8906
8907                 if (ctype == current_class_type)
8908                   {
8909                     /* class A {
8910                          void A::f ();
8911                        };
8912
8913                        Is this ill-formed?  */
8914
8915                     if (pedantic)
8916                       cp_pedwarn ("extra qualification `%T::' on member `%s' ignored",
8917                                   ctype, name);
8918                   }
8919                 else if (TREE_CODE (type) == FUNCTION_TYPE)
8920                   {
8921                     if (current_class_type == NULL_TREE
8922                         || friendp)
8923                       type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep),
8924                                                       TREE_TYPE (type), TYPE_ARG_TYPES (type));
8925                     else
8926                       {
8927                         cp_error ("cannot declare member function `%T::%s' within `%T'",
8928                                   ctype, name, current_class_type);
8929                         return void_type_node;
8930                       }
8931                   }
8932                 else if (TYPE_SIZE (ctype) != NULL_TREE
8933                          || (RIDBIT_SETP (RID_TYPEDEF, specbits)))
8934                   {
8935                     tree t;
8936                     /* have to move this code elsewhere in this function.
8937                        this code is used for i.e., typedef int A::M; M *pm;
8938
8939                        It is?  How? jason 10/2/94 */
8940
8941                     if (explicit_int == -1 && decl_context == FIELD
8942                         && funcdef_flag == 0)
8943                       {
8944                         /* The code in here should only be used to build
8945                            stuff that will be grokked as access decls.  */
8946                         t = lookup_field (ctype, sname, 0, 0);
8947                         if (t)
8948                           {
8949                             t = build_lang_field_decl (FIELD_DECL, build_nt (SCOPE_REF, ctype, t), type);
8950                             DECL_INITIAL (t) = init;
8951                             return t;
8952                           }
8953                         /* No such field, try member functions.  */
8954                         t = lookup_fnfields (TYPE_BINFO (ctype), sname, 0);
8955                         if (t)
8956                           {
8957                             if (flags == DTOR_FLAG)
8958                               t = TREE_VALUE (t);
8959                             else if (CLASSTYPE_METHOD_VEC (ctype)
8960                                      && TREE_VALUE (t) == TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (ctype), 0))
8961                               {
8962                                 /* Don't include destructor with constructors.  */
8963                                 t = DECL_CHAIN (TREE_VALUE (t));
8964                                 if (t == NULL_TREE)
8965                                   cp_error ("`%T' does not have any constructors",
8966                                             ctype);
8967                                 t = build_tree_list (NULL_TREE, t);
8968                               }
8969                             t = build_lang_field_decl (FIELD_DECL, build_nt (SCOPE_REF, ctype, t), type);
8970                             DECL_INITIAL (t) = init;
8971                             return t;
8972                           }
8973
8974                         cp_error
8975                           ("field `%D' is not a member of structure `%T'",
8976                            sname, ctype);
8977                       }
8978
8979                     if (current_class_type)
8980                       {
8981                         cp_error ("cannot declare member `%T::%s' within `%T'",
8982                                   ctype, name, current_class_type);
8983                         return void_type_node;
8984                       }
8985                     type = build_offset_type (ctype, type);
8986                   }
8987                 else if (uses_template_parms (ctype))
8988                   {
8989                     enum tree_code c;
8990                     if (TREE_CODE (type) == FUNCTION_TYPE)
8991                       {
8992                         type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep),
8993                                                         TREE_TYPE (type),
8994                                                         TYPE_ARG_TYPES (type));
8995                         c = FUNCTION_DECL;
8996                       }
8997                   }
8998                 else
8999                   {
9000                     cp_error ("structure `%T' not yet defined", ctype);
9001                     return error_mark_node;
9002                   }
9003
9004                 declarator = sname;
9005               }
9006             else if (TREE_CODE (sname) == SCOPE_REF)
9007               my_friendly_abort (17);
9008             else
9009               {
9010               done_scoping:
9011                 declarator = TREE_OPERAND (declarator, 1);
9012                 if (declarator && TREE_CODE (declarator) == CALL_EXPR)
9013                   /* In this case, we will deal with it later.  */
9014                   ;
9015                 else
9016                   {
9017                     if (TREE_CODE (type) == FUNCTION_TYPE)
9018                       type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep), TREE_TYPE (type), TYPE_ARG_TYPES (type));
9019                     else
9020                       type = build_offset_type (ctype, type);
9021                   }
9022               }
9023           }
9024           break;
9025
9026         case BIT_NOT_EXPR:
9027           declarator = TREE_OPERAND (declarator, 0);
9028           break;
9029
9030         case RECORD_TYPE:
9031         case UNION_TYPE:
9032         case ENUMERAL_TYPE:
9033           declarator = NULL_TREE;
9034           break;
9035
9036         case ERROR_MARK:
9037           declarator = NULL_TREE;
9038           break;
9039
9040         default:
9041           my_friendly_abort (158);
9042         }
9043     }
9044
9045   if (explicitp == 1)
9046     {
9047       error ("only constructors can be declared `explicit'");
9048       explicitp = 0;
9049     }
9050
9051   /* Now TYPE has the actual type.  */
9052
9053   /* If this is declaring a typedef name, return a TYPE_DECL.  */
9054
9055   if (RIDBIT_SETP (RID_TYPEDEF, specbits))
9056     {
9057       tree decl;
9058
9059       /* Note that the grammar rejects storage classes
9060          in typenames, fields or parameters.  */
9061       if (constp || volatilep)
9062         type = cp_build_type_variant (type, constp, volatilep);
9063
9064       /* If the user declares "struct {...} foo" then `foo' will have
9065          an anonymous name.  Fill that name in now.  Nothing can
9066          refer to it, so nothing needs know about the name change.
9067          The TYPE_NAME field was filled in by build_struct_xref.  */
9068       if (type != error_mark_node
9069           && TYPE_NAME (type)
9070           && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
9071           && ANON_AGGRNAME_P (TYPE_IDENTIFIER (type)))
9072         {
9073           /* replace the anonymous name with the real name everywhere.  */
9074           lookup_tag_reverse (type, declarator);
9075           TYPE_IDENTIFIER (type) = declarator;
9076
9077           if (TYPE_LANG_SPECIFIC (type))
9078             TYPE_WAS_ANONYMOUS (type) = 1;
9079
9080           {
9081             tree d = TYPE_NAME (type), c = DECL_CONTEXT (d);
9082
9083             if (!c)
9084               set_nested_typename (d, 0, declarator, type);
9085             else if (TREE_CODE (c) == FUNCTION_DECL)
9086               set_nested_typename (d, DECL_ASSEMBLER_NAME (c),
9087                                    declarator, type);
9088             else
9089               set_nested_typename (d, TYPE_NESTED_NAME (c), declarator, type);
9090
9091             DECL_ASSEMBLER_NAME (d) = DECL_NAME (d);
9092             DECL_ASSEMBLER_NAME (d)
9093               = get_identifier (build_overload_name (type, 1, 1));
9094           }
9095         }
9096
9097 #if 0 /* not yet, should get fixed properly later */
9098       decl = make_type_decl (declarator, type);
9099 #else
9100       decl = build_decl (TYPE_DECL, declarator, type);
9101 #endif
9102       if (TREE_CODE (type) == OFFSET_TYPE || TREE_CODE (type) == METHOD_TYPE)
9103         {
9104           cp_error_at ("typedef name may not be class-qualified", decl);
9105           return NULL_TREE;
9106         }
9107       else if (quals)
9108         {
9109           if (ctype == NULL_TREE)
9110             {
9111               if (TREE_CODE (type) != METHOD_TYPE)
9112                 cp_error_at ("invalid type qualifier for non-method type", decl);
9113               else
9114                 ctype = TYPE_METHOD_BASETYPE (type);
9115             }
9116           if (ctype != NULL_TREE)
9117             grok_method_quals (ctype, decl, quals);
9118         }
9119
9120       if (RIDBIT_SETP (RID_SIGNED, specbits)
9121           || (typedef_decl && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
9122         C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1;
9123
9124       if (RIDBIT_SETP (RID_MUTABLE, specbits))
9125         {
9126           error ("non-object member `%s' cannot be declared mutable", name);
9127         }
9128
9129       return decl;
9130     }
9131
9132   /* Detect the case of an array type of unspecified size
9133      which came, as such, direct from a typedef name.
9134      We must copy the type, so that each identifier gets
9135      a distinct type, so that each identifier's size can be
9136      controlled separately by its own initializer.  */
9137
9138   if (type == typedef_type && TREE_CODE (type) == ARRAY_TYPE
9139       && TYPE_DOMAIN (type) == NULL_TREE)
9140     {
9141       type = build_cplus_array_type (TREE_TYPE (type), TYPE_DOMAIN (type));
9142     }
9143
9144   /* If this is a type name (such as, in a cast or sizeof),
9145      compute the type and return it now.  */
9146
9147   if (decl_context == TYPENAME)
9148     {
9149       /* Note that the grammar rejects storage classes
9150          in typenames, fields or parameters.  */
9151       if (constp || volatilep)
9152         if (IS_SIGNATURE (type))
9153           error ("`const' or `volatile' specified with signature type");
9154         else  
9155           type = cp_build_type_variant (type, constp, volatilep);
9156
9157       /* Special case: "friend class foo" looks like a TYPENAME context.  */
9158       if (friendp)
9159         {
9160           if (volatilep)
9161             {
9162               cp_error ("`volatile' specified for friend class declaration");
9163               volatilep = 0;
9164             }
9165           if (inlinep)
9166             {
9167               cp_error ("`inline' specified for friend class declaration");
9168               inlinep = 0;
9169             }
9170
9171           /* Only try to do this stuff if we didn't already give up.  */
9172           if (type != integer_type_node)
9173             {
9174               /* A friendly class?  */
9175               if (current_class_type)
9176                 make_friend_class (current_class_type, TYPE_MAIN_VARIANT (type));
9177               else
9178                 error ("trying to make class `%s' a friend of global scope",
9179                        TYPE_NAME_STRING (type));
9180               type = void_type_node;
9181             }
9182         }
9183       else if (quals)
9184         {
9185 #if 0 /* not yet, should get fixed properly later */
9186           tree dummy = make_type_decl (declarator, type);
9187 #else
9188           tree dummy = build_decl (TYPE_DECL, declarator, type);
9189 #endif
9190           if (ctype == NULL_TREE)
9191             {
9192               my_friendly_assert (TREE_CODE (type) == METHOD_TYPE, 159);
9193               ctype = TYPE_METHOD_BASETYPE (type);
9194             }
9195           grok_method_quals (ctype, dummy, quals);
9196           type = TREE_TYPE (dummy);
9197         }
9198
9199       return type;
9200     }
9201   else if (declarator == NULL_TREE && decl_context != PARM
9202            && decl_context != CATCHPARM
9203            && TREE_CODE (type) != UNION_TYPE
9204            && ! bitfield)
9205     {
9206       cp_error ("abstract declarator `%T' used as declaration", type);
9207       declarator = make_anon_name ();
9208     }
9209
9210   /* `void' at top level (not within pointer)
9211      is allowed only in typedefs or type names.
9212      We don't complain about parms either, but that is because
9213      a better error message can be made later.  */
9214
9215   if (TYPE_MAIN_VARIANT (type) == void_type_node && decl_context != PARM)
9216     {
9217       if (! declarator)
9218         error ("unnamed variable or field declared void");
9219       else if (TREE_CODE (declarator) == IDENTIFIER_NODE)
9220         {
9221           if (IDENTIFIER_OPNAME_P (declarator))
9222 #if 0                           /* How could this happen? */
9223             error ("operator `%s' declared void",
9224                    operator_name_string (declarator));
9225 #else
9226             my_friendly_abort (356);
9227 #endif
9228           else
9229             error ("variable or field `%s' declared void", name);
9230         }
9231       else
9232         error ("variable or field declared void");
9233       type = integer_type_node;
9234     }
9235
9236   /* Now create the decl, which may be a VAR_DECL, a PARM_DECL
9237      or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE.  */
9238
9239   {
9240     register tree decl;
9241
9242     if (decl_context == PARM)
9243       {
9244         if (ctype)
9245           error ("cannot use `::' in parameter declaration");
9246
9247         /* A parameter declared as an array of T is really a pointer to T.
9248            One declared as a function is really a pointer to a function.
9249            One declared as a member is really a pointer to member.  */
9250
9251         if (TREE_CODE (type) == ARRAY_TYPE)
9252           {
9253             /* Transfer const-ness of array into that of type pointed to. */
9254             type = build_pointer_type
9255               (cp_build_type_variant (TREE_TYPE (type), constp, volatilep));
9256             volatilep = constp = 0;
9257           }
9258         else if (TREE_CODE (type) == FUNCTION_TYPE)
9259           type = build_pointer_type (type);
9260         else if (TREE_CODE (type) == OFFSET_TYPE)
9261           type = build_pointer_type (type);
9262         else if (type == void_type_node && declarator)
9263           {
9264             error ("declaration of `%s' as void", name);
9265             return NULL_TREE;
9266           }
9267
9268         decl = build_decl (PARM_DECL, declarator, type);
9269
9270         bad_specifiers (decl, "parameter", virtualp, quals != NULL_TREE,
9271                         inlinep, friendp, raises != NULL_TREE);
9272         if (current_class_type
9273             && IS_SIGNATURE (current_class_type))
9274           {
9275             if (inlinep)
9276               error ("parameter of signature member function declared `inline'");
9277             if (RIDBIT_SETP (RID_AUTO, specbits))
9278               error ("parameter of signature member function declared `auto'");
9279             if (RIDBIT_SETP (RID_REGISTER, specbits))
9280               error ("parameter of signature member function declared `register'");
9281           }
9282
9283         /* Compute the type actually passed in the parmlist,
9284            for the case where there is no prototype.
9285            (For example, shorts and chars are passed as ints.)
9286            When there is a prototype, this is overridden later.  */
9287
9288         DECL_ARG_TYPE (decl) = type_promotes_to (type);
9289       }
9290     else if (decl_context == FIELD)
9291       {
9292         if (type == error_mark_node)
9293           {
9294             /* Happens when declaring arrays of sizes which
9295                are error_mark_node, for example.  */
9296             decl = NULL_TREE;
9297           }
9298         else if (TREE_CODE (type) == FUNCTION_TYPE)
9299           {
9300             int publicp = 0;
9301
9302             if (friendp == 0)
9303               {
9304                 if (ctype == NULL_TREE)
9305                   ctype = current_class_type;
9306
9307                 if (ctype == NULL_TREE)
9308                   {
9309                     cp_error ("can't make `%D' into a method -- not in a class",
9310                               declarator);
9311                     return void_type_node;
9312                   }
9313
9314                 /* ``A union may [ ... ] not [ have ] virtual functions.''
9315                    ARM 9.5 */
9316                 if (virtualp && TREE_CODE (ctype) == UNION_TYPE)
9317                   {
9318                     cp_error ("function `%D' declared virtual inside a union",
9319                               declarator);
9320                     return void_type_node;
9321                   }
9322
9323                 if (declarator == ansi_opname[(int) NEW_EXPR]
9324                     || declarator == ansi_opname[(int) VEC_NEW_EXPR]
9325                     || declarator == ansi_opname[(int) DELETE_EXPR]
9326                     || declarator == ansi_opname[(int) VEC_DELETE_EXPR])
9327                   {
9328                     if (virtualp)
9329                       {
9330                         cp_error ("`%D' cannot be declared virtual, since it is always static",
9331                                   declarator);
9332                         virtualp = 0;
9333                       }
9334                   }
9335                 else if (staticp < 2)
9336                   type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep),
9337                                                   TREE_TYPE (type), TYPE_ARG_TYPES (type));
9338               }
9339
9340             /* Tell grokfndecl if it needs to set TREE_PUBLIC on the node.  */
9341             publicp = (! friendp
9342                        || RIDBIT_SETP (RID_EXTERN, specbits)
9343                        || ! (funcdef_flag < 0 || inlinep));
9344             decl = grokfndecl (ctype, type, declarator,
9345                                virtualp, flags, quals,
9346                                raises, friendp ? -1 : 0, publicp, inlinep);
9347             if (decl == NULL_TREE)
9348               return NULL_TREE;
9349             decl = build_decl_attribute_variant (decl, decl_machine_attr);
9350
9351             if (explicitp == 2)
9352               DECL_NONCONVERTING_P (decl) = 1;
9353           }
9354         else if (TREE_CODE (type) == METHOD_TYPE)
9355           {
9356             /* We only get here for friend declarations of
9357                members of other classes.  */
9358             /* All method decls are public, so tell grokfndecl to set
9359                TREE_PUBLIC, also.  */
9360             decl = grokfndecl (ctype, type, declarator,
9361                                virtualp, flags, quals,
9362                                raises, friendp ? -1 : 0, 1, 0);
9363             if (decl == NULL_TREE)
9364               return NULL_TREE;
9365           }
9366         else if (TYPE_SIZE (type) == NULL_TREE && !staticp
9367                  && (TREE_CODE (type) != ARRAY_TYPE || initialized == 0))
9368           {
9369             if (declarator)
9370               cp_error ("field `%D' has incomplete type", declarator);
9371             else
9372               cp_error ("name `%T' has incomplete type", type);
9373
9374             /* If we're instantiating a template, tell them which
9375                instantiation made the field's type be incomplete.  */
9376             if (current_class_type
9377                 && TYPE_NAME (current_class_type)
9378                 && IDENTIFIER_TEMPLATE (DECL_NAME (TYPE_NAME (current_class_type)))
9379                 && declspecs && TREE_VALUE (declspecs)
9380                 && TREE_TYPE (TREE_VALUE (declspecs)) == type)
9381               cp_error ("  in instantiation of template `%T'",
9382                         current_class_type);
9383
9384             type = error_mark_node;
9385             decl = NULL_TREE;
9386           }
9387         else
9388           {
9389             if (friendp)
9390               {
9391                 error ("`%s' is neither function nor method; cannot be declared friend",
9392                        IDENTIFIER_POINTER (declarator));
9393                 friendp = 0;
9394               }
9395             decl = NULL_TREE;
9396           }
9397
9398         if (friendp)
9399           {
9400             /* Friends are treated specially.  */
9401             if (ctype == current_class_type)
9402               warning ("member functions are implicitly friends of their class");
9403             else
9404               {
9405                 tree t = NULL_TREE;
9406                 if (decl && DECL_NAME (decl))
9407                   t = do_friend (ctype, declarator, decl,
9408                                  last_function_parms, flags, quals);
9409                 if (t && funcdef_flag)
9410                   return t;
9411                 
9412                 return void_type_node;
9413               }
9414           }
9415
9416         /* Structure field.  It may not be a function, except for C++ */
9417
9418         if (decl == NULL_TREE)
9419           {
9420             if (initialized)
9421               {
9422                 /* Motion 10 at San Diego: If a static const integral data
9423                    member is initialized with an integral constant
9424                    expression, the initializer may appear either in the
9425                    declaration (within the class), or in the definition,
9426                    but not both.  If it appears in the class, the member is
9427                    a member constant.  The file-scope definition is always
9428                    required.  */
9429                 if (staticp)
9430                   {
9431                     if (pedantic)
9432                       {
9433                         if (! constp)
9434                           cp_pedwarn ("ANSI C++ forbids in-class initialization of non-const static member `%D'",
9435                                       declarator);
9436
9437                         else if (! INTEGRAL_TYPE_P (type))
9438                           cp_pedwarn ("ANSI C++ forbids member constant `%D' of non-integral type `%T'", declarator, type);
9439                       }
9440                   }
9441
9442                 /* Note that initialization of const members is prohibited
9443                    by the draft ANSI standard, though it appears to be in
9444                    common practice.  12.6.2: The argument list is used to
9445                    initialize the named nonstatic member....  This (or an
9446                    initializer list) is the only way to initialize
9447                    nonstatic const and reference members.  */
9448                 else if (pedantic || ! constp)
9449                   cp_pedwarn ("ANSI C++ forbids initialization of %s `%D'",
9450                               constp ? "const member" : "member", declarator);
9451               }
9452
9453             if (staticp || (constp && initialized))
9454               {
9455                 /* C++ allows static class members.
9456                    All other work for this is done by grokfield.
9457                    This VAR_DECL is built by build_lang_field_decl.
9458                    All other VAR_DECLs are built by build_decl.  */
9459                 decl = build_lang_field_decl (VAR_DECL, declarator, type);
9460                 TREE_STATIC (decl) = 1;
9461                 /* In class context, 'static' means public access.  */
9462                 TREE_PUBLIC (decl) = DECL_EXTERNAL (decl) = !!staticp;
9463               }
9464             else
9465               {
9466                 decl = build_lang_field_decl (FIELD_DECL, declarator, type);
9467                 if (RIDBIT_SETP (RID_MUTABLE, specbits))
9468                   {
9469                     DECL_MUTABLE_P (decl) = 1;
9470                     RIDBIT_RESET (RID_MUTABLE, specbits);
9471                   }
9472               }
9473
9474             bad_specifiers (decl, "field", virtualp, quals != NULL_TREE,
9475                             inlinep, friendp, raises != NULL_TREE);
9476           }
9477       }
9478     else if (TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE)
9479       {
9480         tree original_name = declarator;
9481         int publicp = 0;
9482
9483         if (! declarator)
9484           return NULL_TREE;
9485
9486         if (RIDBIT_SETP (RID_AUTO, specbits))
9487           error ("storage class `auto' invalid for function `%s'", name);
9488         else if (RIDBIT_SETP (RID_REGISTER, specbits))
9489           error ("storage class `register' invalid for function `%s'", name);
9490
9491         /* Function declaration not at top level.
9492            Storage classes other than `extern' are not allowed
9493            and `extern' makes no difference.  */
9494         if (! toplevel_bindings_p ()
9495             && ! processing_template_decl
9496             && (RIDBIT_SETP (RID_STATIC, specbits)
9497                 || RIDBIT_SETP (RID_INLINE, specbits))
9498             && pedantic)
9499           {
9500             if (RIDBIT_SETP (RID_STATIC, specbits))
9501               pedwarn ("storage class `static' invalid for function `%s' declared out of global scope", name);
9502             else
9503               pedwarn ("storage class `inline' invalid for function `%s' declared out of global scope", name);
9504           }
9505         
9506         if (ctype == NULL_TREE)
9507           {
9508             if (virtualp)
9509               {
9510                 error ("virtual non-class function `%s'", name);
9511                 virtualp = 0;
9512               }
9513
9514             if (current_lang_name == lang_name_cplusplus
9515                 && ! (IDENTIFIER_LENGTH (original_name) == 4
9516                       && IDENTIFIER_POINTER (original_name)[0] == 'm'
9517                       && strcmp (IDENTIFIER_POINTER (original_name), "main") == 0)
9518                 && ! (IDENTIFIER_LENGTH (original_name) > 10
9519                       && IDENTIFIER_POINTER (original_name)[0] == '_'
9520                       && IDENTIFIER_POINTER (original_name)[1] == '_'
9521                       && strncmp (IDENTIFIER_POINTER (original_name)+2, "builtin_", 8) == 0))
9522               /* Plain overloading: will not be grok'd by grokclassfn.  */
9523               declarator = build_decl_overload (dname, TYPE_ARG_TYPES (type), 0);
9524           }
9525         else if (TREE_CODE (type) == FUNCTION_TYPE && staticp < 2)
9526           type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep),
9527                                           TREE_TYPE (type), TYPE_ARG_TYPES (type));
9528
9529         /* Record presence of `static'.  In C++, `inline' implies `static'.  */
9530         publicp = (ctype != NULL_TREE
9531                    || RIDBIT_SETP (RID_EXTERN, specbits)
9532                    || (!RIDBIT_SETP (RID_STATIC, specbits)
9533                        && !RIDBIT_SETP (RID_INLINE, specbits)));
9534
9535         decl = grokfndecl (ctype, type, original_name,
9536                            virtualp, flags, quals,
9537                            raises,
9538                            processing_template_decl ? 0 : friendp ? 2 : 1,
9539                            publicp, inlinep);
9540         if (decl == NULL_TREE)
9541           return NULL_TREE;
9542
9543         if (ctype == NULL_TREE && DECL_LANGUAGE (decl) != lang_c)
9544           DECL_ASSEMBLER_NAME (decl) = current_namespace_id (declarator);
9545
9546         if (staticp == 1)
9547           {
9548             int illegal_static = 0;
9549
9550             /* Don't allow a static member function in a class, and forbid
9551                declaring main to be static.  */
9552             if (TREE_CODE (type) == METHOD_TYPE)
9553               {
9554                 cp_pedwarn ("cannot declare member function `%D' to have static linkage", decl);
9555                 illegal_static = 1;
9556               }
9557             else if (current_function_decl)
9558               {
9559                 /* FIXME need arm citation */
9560                 error ("cannot declare static function inside another function");
9561                 illegal_static = 1;
9562               }
9563
9564             if (illegal_static)
9565               {
9566                 staticp = 0;
9567                 RIDBIT_RESET (RID_STATIC, specbits);
9568               }
9569           }
9570       }
9571     else
9572       {
9573         /* It's a variable.  */
9574
9575         if (decl_context == CATCHPARM)
9576           {
9577             if (ctype)
9578               {
9579                 ctype = NULL_TREE;
9580                 error ("cannot use `::' in parameter declaration");
9581               }
9582
9583             /* A parameter declared as an array of T is really a pointer to T.
9584                One declared as a function is really a pointer to a function.
9585                One declared as a member is really a pointer to member.  */
9586
9587             if (TREE_CODE (type) == ARRAY_TYPE)
9588               {
9589                 /* Transfer const-ness of array into that of type pointed to. */
9590                 type = build_pointer_type
9591                   (cp_build_type_variant (TREE_TYPE (type), constp, volatilep));
9592                 volatilep = constp = 0;
9593               }
9594             else if (TREE_CODE (type) == FUNCTION_TYPE)
9595               type = build_pointer_type (type);
9596             else if (TREE_CODE (type) == OFFSET_TYPE)
9597               type = build_pointer_type (type);
9598           }
9599
9600         /* An uninitialized decl with `extern' is a reference.  */
9601         decl = grokvardecl (type, declarator, specbits, initialized, constp);
9602         bad_specifiers (decl, "variable", virtualp, quals != NULL_TREE,
9603                         inlinep, friendp, raises != NULL_TREE);
9604
9605         if (ctype)
9606           {
9607             DECL_CONTEXT (decl) = ctype;
9608             if (staticp == 1)
9609               {
9610                 cp_error ("static member `%D' re-declared as static",
9611                           decl);
9612                 staticp = 0;
9613                 RIDBIT_RESET (RID_STATIC, specbits);
9614               }
9615             if (RIDBIT_SETP (RID_REGISTER, specbits) && TREE_STATIC (decl))
9616               {
9617                 cp_error ("static member `%D' declared `register'", decl);
9618                 RIDBIT_RESET (RID_REGISTER, specbits);
9619               }
9620             if (RIDBIT_SETP (RID_EXTERN, specbits))
9621               {
9622                 cp_error ("cannot explicitly declare member `%#D' to have extern linkage",
9623                           decl);
9624                 RIDBIT_RESET (RID_EXTERN, specbits);
9625               }
9626           }
9627       }
9628
9629     if (RIDBIT_SETP (RID_MUTABLE, specbits))
9630       {
9631         error ("`%s' cannot be declared mutable", name);
9632       }
9633
9634     /* Record `register' declaration for warnings on &
9635        and in case doing stupid register allocation.  */
9636
9637     if (RIDBIT_SETP (RID_REGISTER, specbits))
9638       DECL_REGISTER (decl) = 1;
9639
9640     if (RIDBIT_SETP (RID_EXTERN, specbits))
9641       DECL_THIS_EXTERN (decl) = 1;
9642
9643     if (RIDBIT_SETP (RID_STATIC, specbits))
9644       DECL_THIS_STATIC (decl) = 1;
9645
9646     /* Record constancy and volatility.  */
9647
9648     if (constp)
9649       TREE_READONLY (decl) = TREE_CODE (type) != REFERENCE_TYPE;
9650     if (volatilep)
9651       {
9652         TREE_SIDE_EFFECTS (decl) = 1;
9653         TREE_THIS_VOLATILE (decl) = 1;
9654       }
9655
9656     return decl;
9657   }
9658 }
9659 \f
9660 /* Tell if a parmlist/exprlist looks like an exprlist or a parmlist.
9661    An empty exprlist is a parmlist.  An exprlist which
9662    contains only identifiers at the global level
9663    is a parmlist.  Otherwise, it is an exprlist.  */
9664 int
9665 parmlist_is_exprlist (exprs)
9666      tree exprs;
9667 {
9668   if (exprs == NULL_TREE || TREE_PARMLIST (exprs))
9669     return 0;
9670
9671   if (toplevel_bindings_p ())
9672     {
9673       /* At the global level, if these are all identifiers,
9674          then it is a parmlist.  */
9675       while (exprs)
9676         {
9677           if (TREE_CODE (TREE_VALUE (exprs)) != IDENTIFIER_NODE)
9678             return 1;
9679           exprs = TREE_CHAIN (exprs);
9680         }
9681       return 0;
9682     }
9683   return 1;
9684 }
9685
9686 /* Subroutine of `grokparms'.  In a fcn definition, arg types must
9687    be complete.
9688
9689    C++: also subroutine of `start_function'.  */
9690 static void
9691 require_complete_types_for_parms (parms)
9692      tree parms;
9693 {
9694   while (parms)
9695     {
9696       tree type = TREE_TYPE (parms);
9697       if (TYPE_SIZE (type) == NULL_TREE)
9698         {
9699           if (DECL_NAME (parms))
9700             error ("parameter `%s' has incomplete type",
9701                    IDENTIFIER_POINTER (DECL_NAME (parms)));
9702           else
9703             error ("parameter has incomplete type");
9704           TREE_TYPE (parms) = error_mark_node;
9705         }
9706 #if 0
9707       /* If the arg types are incomplete in a declaration,
9708          they must include undefined tags.
9709          These tags can never be defined in the scope of the declaration,
9710          so the types can never be completed,
9711          and no call can be compiled successfully.  */
9712       /* This is not the right behavior for C++, but not having
9713          it is also probably wrong.  */
9714       else
9715         {
9716           /* Now warn if is a pointer to an incomplete type.  */
9717           while (TREE_CODE (type) == POINTER_TYPE
9718                  || TREE_CODE (type) == REFERENCE_TYPE)
9719             type = TREE_TYPE (type);
9720           type = TYPE_MAIN_VARIANT (type);
9721           if (TYPE_SIZE (type) == NULL_TREE)
9722             {
9723               if (DECL_NAME (parm) != NULL_TREE)
9724                 warning ("parameter `%s' points to incomplete type",
9725                          IDENTIFIER_POINTER (DECL_NAME (parm)));
9726               else
9727                 warning ("parameter points to incomplete type");
9728             }
9729         }
9730 #endif
9731       parms = TREE_CHAIN (parms);
9732     }
9733 }
9734
9735 /* Decode the list of parameter types for a function type.
9736    Given the list of things declared inside the parens,
9737    return a list of types.
9738
9739    The list we receive can have three kinds of elements:
9740    an IDENTIFIER_NODE for names given without types,
9741    a TREE_LIST node for arguments given as typespecs or names with typespecs,
9742    or void_type_node, to mark the end of an argument list
9743    when additional arguments are not permitted (... was not used).
9744
9745    FUNCDEF_FLAG is nonzero for a function definition, 0 for
9746    a mere declaration.  A nonempty identifier-list gets an error message
9747    when FUNCDEF_FLAG is zero.
9748    If FUNCDEF_FLAG is 1, then parameter types must be complete.
9749    If FUNCDEF_FLAG is -1, then parameter types may be incomplete.
9750
9751    If all elements of the input list contain types,
9752    we return a list of the types.
9753    If all elements contain no type (except perhaps a void_type_node
9754    at the end), we return a null list.
9755    If some have types and some do not, it is an error, and we
9756    return a null list.
9757
9758    Also set last_function_parms to either
9759    a list of names (IDENTIFIER_NODEs) or a chain of PARM_DECLs.
9760    A list of names is converted to a chain of PARM_DECLs
9761    by store_parm_decls so that ultimately it is always a chain of decls.
9762
9763    Note that in C++, parameters can take default values.  These default
9764    values are in the TREE_PURPOSE field of the TREE_LIST.  It is
9765    an error to specify default values which are followed by parameters
9766    that have no default values, or an ELLIPSES.  For simplicities sake,
9767    only parameters which are specified with their types can take on
9768    default values.  */
9769
9770 static tree
9771 grokparms (first_parm, funcdef_flag)
9772      tree first_parm;
9773      int funcdef_flag;
9774 {
9775   tree result = NULL_TREE;
9776   tree decls = NULL_TREE;
9777
9778   if (first_parm != NULL_TREE
9779       && TREE_CODE (TREE_VALUE (first_parm)) == IDENTIFIER_NODE)
9780     {
9781       if (! funcdef_flag)
9782         pedwarn ("parameter names (without types) in function declaration");
9783       last_function_parms = first_parm;
9784       return NULL_TREE;
9785     }
9786   else if (first_parm != NULL_TREE
9787            && TREE_CODE (TREE_VALUE (first_parm)) != TREE_LIST
9788            && TREE_VALUE (first_parm) != void_type_node)
9789     my_friendly_abort (145);
9790   else
9791     {
9792       /* Types were specified.  This is a list of declarators
9793          each represented as a TREE_LIST node.  */
9794       register tree parm, chain;
9795       int any_init = 0, any_error = 0, saw_void = 0;
9796
9797       if (first_parm != NULL_TREE)
9798         {
9799           tree last_result = NULL_TREE;
9800           tree last_decl = NULL_TREE;
9801
9802           for (parm = first_parm; parm != NULL_TREE; parm = chain)
9803             {
9804               tree type, list_node = parm;
9805               register tree decl = TREE_VALUE (parm);
9806               tree init = TREE_PURPOSE (parm);
9807
9808               chain = TREE_CHAIN (parm);
9809               /* @@ weak defense against parse errors.  */
9810               if (decl != void_type_node && TREE_CODE (decl) != TREE_LIST)
9811                 {
9812                   /* Give various messages as the need arises.  */
9813                   if (TREE_CODE (decl) == STRING_CST)
9814                     error ("invalid string constant `%s'",
9815                            TREE_STRING_POINTER (decl));
9816                   else if (TREE_CODE (decl) == INTEGER_CST)
9817                     error ("invalid integer constant in parameter list, did you forget to give parameter name?");
9818                   continue;
9819                 }
9820
9821               if (decl != void_type_node)
9822                 {
9823                   /* @@ May need to fetch out a `raises' here.  */
9824                   decl = grokdeclarator (TREE_VALUE (decl),
9825                                          TREE_PURPOSE (decl),
9826                                          PARM, init != NULL_TREE, NULL_TREE);
9827                   if (! decl)
9828                     continue;
9829                   type = TREE_TYPE (decl);
9830                   if (TYPE_MAIN_VARIANT (type) == void_type_node)
9831                     decl = void_type_node;
9832                   else if (TREE_CODE (type) == METHOD_TYPE)
9833                     {
9834                       if (DECL_NAME (decl))
9835                         /* Cannot use `error_with_decl' here because
9836                            we don't have DECL_CONTEXT set up yet.  */
9837                         error ("parameter `%s' invalidly declared method type",
9838                                IDENTIFIER_POINTER (DECL_NAME (decl)));
9839                       else
9840                         error ("parameter invalidly declared method type");
9841                       type = build_pointer_type (type);
9842                       TREE_TYPE (decl) = type;
9843                     }
9844                   else if (TREE_CODE (type) == OFFSET_TYPE)
9845                     {
9846                       if (DECL_NAME (decl))
9847                         error ("parameter `%s' invalidly declared offset type",
9848                                IDENTIFIER_POINTER (DECL_NAME (decl)));
9849                       else
9850                         error ("parameter invalidly declared offset type");
9851                       type = build_pointer_type (type);
9852                       TREE_TYPE (decl) = type;
9853                     }
9854                   else if (TREE_CODE (type) == RECORD_TYPE
9855                            && TYPE_LANG_SPECIFIC (type)
9856                            && CLASSTYPE_ABSTRACT_VIRTUALS (type))
9857                     {
9858                       abstract_virtuals_error (decl, type);
9859                       any_error = 1;  /* seems like a good idea */
9860                     }
9861                   else if (TREE_CODE (type) == RECORD_TYPE
9862                            && TYPE_LANG_SPECIFIC (type)
9863                            && IS_SIGNATURE (type))
9864                     {
9865                       signature_error (decl, type);
9866                       any_error = 1;  /* seems like a good idea */
9867                     }
9868                 }
9869
9870               if (decl == void_type_node)
9871                 {
9872                   if (result == NULL_TREE)
9873                     {
9874                       result = void_list_node;
9875                       last_result = result;
9876                     }
9877                   else
9878                     {
9879                       TREE_CHAIN (last_result) = void_list_node;
9880                       last_result = void_list_node;
9881                     }
9882                   saw_void = 1;
9883                   if (chain
9884                       && (chain != void_list_node || TREE_CHAIN (chain)))
9885                     error ("`void' in parameter list must be entire list");
9886                   break;
9887                 }
9888
9889               /* Since there is a prototype, args are passed in their own types.  */
9890               DECL_ARG_TYPE (decl) = TREE_TYPE (decl);
9891 #ifdef PROMOTE_PROTOTYPES
9892               if ((TREE_CODE (type) == INTEGER_TYPE
9893                    || TREE_CODE (type) == ENUMERAL_TYPE)
9894                   && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
9895                 DECL_ARG_TYPE (decl) = integer_type_node;
9896 #endif
9897               if (!any_error)
9898                 {
9899                   if (init)
9900                     {
9901                       any_init++;
9902                       if (TREE_CODE (init) == SAVE_EXPR)
9903                         PARM_DECL_EXPR (init) = 1;
9904                       else if (TREE_CODE (init) == VAR_DECL
9905                                || TREE_CODE (init) == PARM_DECL)
9906                         {
9907                           if (IDENTIFIER_LOCAL_VALUE (DECL_NAME (init)))
9908                             {
9909                               /* ``Local variables may not be used in default
9910                                  argument expressions.'' dpANSI C++ 8.2.6 */
9911                               /* If extern int i; within a function is not
9912                                  considered a local variable, then this code is
9913                                  wrong. */
9914                               cp_error ("local variable `%D' may not be used as a default argument", init);
9915                               any_error = 1;
9916                             }
9917                           else if (TREE_READONLY_DECL_P (init))
9918                             init = decl_constant_value (init);
9919                         }
9920                       else
9921                         init = require_instantiated_type (type, init, integer_zero_node);
9922             }
9923 #if 0 /* This is too early to check; trailing parms might be merged in by
9924          duplicate_decls.  */
9925                   else if (any_init)
9926                     {
9927                       error ("all trailing parameters must have default arguments");
9928                       any_error = 1;
9929                     }
9930 #endif
9931                 }
9932               else
9933                 init = NULL_TREE;
9934
9935               if (decls == NULL_TREE)
9936                 {
9937                   decls = decl;
9938                   last_decl = decls;
9939                 }
9940               else
9941                 {
9942                   TREE_CHAIN (last_decl) = decl;
9943                   last_decl = decl;
9944                 }
9945               if (TREE_PERMANENT (list_node))
9946                 {
9947                   TREE_PURPOSE (list_node) = init;
9948                   TREE_VALUE (list_node) = type;
9949                   TREE_CHAIN (list_node) = NULL_TREE;
9950                 }
9951               else
9952                 list_node = saveable_tree_cons (init, type, NULL_TREE);
9953               if (result == NULL_TREE)
9954                 {
9955                   result = list_node;
9956                   last_result = result;
9957                 }
9958               else
9959                 {
9960                   TREE_CHAIN (last_result) = list_node;
9961                   last_result = list_node;
9962                 }
9963             }
9964           if (last_result)
9965             TREE_CHAIN (last_result) = NULL_TREE;
9966           /* If there are no parameters, and the function does not end
9967              with `...', then last_decl will be NULL_TREE.  */
9968           if (last_decl != NULL_TREE)
9969             TREE_CHAIN (last_decl) = NULL_TREE;
9970         }
9971     }
9972
9973   last_function_parms = decls;
9974
9975   /* In a fcn definition, arg types must be complete.  */
9976   if (funcdef_flag > 0)
9977     require_complete_types_for_parms (last_function_parms);
9978
9979   return result;
9980 }
9981 \f
9982 /* These memoizing functions keep track of special properties which
9983    a class may have.  `grok_ctor_properties' notices whether a class
9984    has a constructor of the form X(X&), and also complains
9985    if the class has a constructor of the form X(X).
9986    `grok_op_properties' takes notice of the various forms of
9987    operator= which are defined, as well as what sorts of type conversion
9988    may apply.  Both functions take a FUNCTION_DECL as an argument.  */
9989 int
9990 grok_ctor_properties (ctype, decl)
9991      tree ctype, decl;
9992 {
9993   tree parmtypes = FUNCTION_ARG_CHAIN (decl);
9994   tree parmtype = parmtypes ? TREE_VALUE (parmtypes) : void_type_node;
9995
9996   /* When a type has virtual baseclasses, a magical first int argument is
9997      added to any ctor so we can tell if the class has been initialized
9998      yet.  This could screw things up in this function, so we deliberately
9999      ignore the leading int if we're in that situation.  */
10000   if (parmtypes
10001       && TREE_VALUE (parmtypes) == integer_type_node
10002       && TYPE_USES_VIRTUAL_BASECLASSES (ctype))
10003     {
10004       parmtypes = TREE_CHAIN (parmtypes);
10005       parmtype = TREE_VALUE (parmtypes);
10006     }
10007
10008   if (TREE_CODE (parmtype) == REFERENCE_TYPE
10009       && TYPE_MAIN_VARIANT (TREE_TYPE (parmtype)) == ctype)
10010     {
10011       if (TREE_CHAIN (parmtypes) == NULL_TREE
10012           || TREE_CHAIN (parmtypes) == void_list_node
10013           || TREE_PURPOSE (TREE_CHAIN (parmtypes)))
10014         {
10015           TYPE_HAS_INIT_REF (ctype) = 1;
10016           if (TYPE_READONLY (TREE_TYPE (parmtype)))
10017             TYPE_HAS_CONST_INIT_REF (ctype) = 1;
10018         }
10019       else
10020         TYPE_GETS_INIT_AGGR (ctype) = 1;
10021     }
10022   else if (TYPE_MAIN_VARIANT (parmtype) == ctype)
10023     {
10024       if (TREE_CHAIN (parmtypes) != NULL_TREE
10025           && TREE_CHAIN (parmtypes) == void_list_node)
10026         {
10027           cp_error ("invalid constructor; you probably meant `%T (%T&)'",
10028                     ctype, ctype);
10029           SET_IDENTIFIER_ERROR_LOCUS (DECL_NAME (decl), ctype);
10030
10031           return 0;
10032         }
10033       else
10034         TYPE_GETS_INIT_AGGR (ctype) = 1;
10035     }
10036   else if (TREE_CODE (parmtype) == VOID_TYPE
10037            || TREE_PURPOSE (parmtypes) != NULL_TREE)
10038     TYPE_HAS_DEFAULT_CONSTRUCTOR (ctype) = 1;
10039
10040   return 1;
10041 }
10042
10043 /* An operator with this name can be either unary or binary.  */
10044 static int
10045 ambi_op_p (name)
10046      tree name;
10047 {
10048   return (name == ansi_opname [(int) INDIRECT_REF]
10049           || name == ansi_opname [(int) ADDR_EXPR]
10050           || name == ansi_opname [(int) NEGATE_EXPR]
10051           || name == ansi_opname[(int) POSTINCREMENT_EXPR]
10052           || name == ansi_opname[(int) POSTDECREMENT_EXPR]
10053           || name == ansi_opname [(int) CONVERT_EXPR]);
10054 }
10055
10056 /* An operator with this name can only be unary.  */
10057 static int
10058 unary_op_p (name)
10059      tree name;
10060 {
10061   return (name == ansi_opname [(int) TRUTH_NOT_EXPR]
10062           || name == ansi_opname [(int) BIT_NOT_EXPR]
10063           || name == ansi_opname [(int) COMPONENT_REF]
10064           || OPERATOR_TYPENAME_P (name));
10065 }
10066
10067 /* Do a little sanity-checking on how they declared their operator.  */
10068 static void
10069 grok_op_properties (decl, virtualp, friendp)
10070      tree decl;
10071      int virtualp, friendp;
10072 {
10073   tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
10074   int methodp = (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE);
10075   tree name = DECL_NAME (decl);
10076
10077   if (current_class_type == NULL_TREE)
10078     friendp = 1;
10079
10080   if (! friendp)
10081     {
10082       if (name == ansi_opname[(int) MODIFY_EXPR])
10083         TYPE_HAS_ASSIGNMENT (current_class_type) = 1;
10084       else if (name == ansi_opname[(int) CALL_EXPR])
10085         TYPE_OVERLOADS_CALL_EXPR (current_class_type) = 1;
10086       else if (name == ansi_opname[(int) ARRAY_REF])
10087         TYPE_OVERLOADS_ARRAY_REF (current_class_type) = 1;
10088       else if (name == ansi_opname[(int) COMPONENT_REF]
10089                || name == ansi_opname[(int) MEMBER_REF])
10090         TYPE_OVERLOADS_ARROW (current_class_type) = 1;
10091       else if (name == ansi_opname[(int) NEW_EXPR])
10092         TYPE_GETS_NEW (current_class_type) |= 1;
10093       else if (name == ansi_opname[(int) DELETE_EXPR])
10094         TYPE_GETS_DELETE (current_class_type) |= 1;
10095       else if (name == ansi_opname[(int) VEC_NEW_EXPR])
10096         TYPE_GETS_NEW (current_class_type) |= 2;
10097       else if (name == ansi_opname[(int) VEC_DELETE_EXPR])
10098         TYPE_GETS_DELETE (current_class_type) |= 2;
10099     }
10100
10101   if (name == ansi_opname[(int) NEW_EXPR]
10102       || name == ansi_opname[(int) VEC_NEW_EXPR])
10103     {
10104       /* When the compiler encounters the definition of A::operator new, it
10105          doesn't look at the class declaration to find out if it's static.  */
10106       if (methodp)
10107         revert_static_member_fn (&decl, NULL, NULL);
10108      
10109       /* Take care of function decl if we had syntax errors.  */
10110       if (argtypes == NULL_TREE)
10111         TREE_TYPE (decl) =
10112           build_function_type (ptr_type_node,
10113                                hash_tree_chain (integer_type_node,
10114                                                 void_list_node));
10115       else
10116         TREE_TYPE (decl) = coerce_new_type (TREE_TYPE (decl));
10117     }
10118   else if (name == ansi_opname[(int) DELETE_EXPR]
10119            || name == ansi_opname[(int) VEC_DELETE_EXPR])
10120     {
10121       if (methodp)
10122         revert_static_member_fn (&decl, NULL, NULL);
10123      
10124       if (argtypes == NULL_TREE)
10125         TREE_TYPE (decl) =
10126           build_function_type (void_type_node,
10127                                hash_tree_chain (ptr_type_node,
10128                                                 void_list_node));
10129       else
10130         {
10131           TREE_TYPE (decl) = coerce_delete_type (TREE_TYPE (decl));
10132
10133           if (! friendp && name == ansi_opname[(int) VEC_DELETE_EXPR]
10134               && (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl)))
10135                   != void_list_node))
10136             TYPE_VEC_DELETE_TAKES_SIZE (current_class_type) = 1;
10137         }
10138     }
10139   else
10140     {
10141       /* An operator function must either be a non-static member function
10142          or have at least one parameter of a class, a reference to a class,
10143          an enumeration, or a reference to an enumeration.  13.4.0.6 */
10144       if (! methodp || DECL_STATIC_FUNCTION_P (decl))
10145         {
10146           if (OPERATOR_TYPENAME_P (name)
10147               || name == ansi_opname[(int) CALL_EXPR]
10148               || name == ansi_opname[(int) MODIFY_EXPR]
10149               || name == ansi_opname[(int) COMPONENT_REF]
10150               || name == ansi_opname[(int) ARRAY_REF])
10151             cp_error ("`%D' must be a nonstatic member function", decl);
10152           else
10153             {
10154               tree p = argtypes;
10155
10156               if (DECL_STATIC_FUNCTION_P (decl))
10157                 cp_error ("`%D' must be either a non-static member function or a non-member function", decl);
10158
10159               if (p)
10160                 for (; TREE_VALUE (p) != void_type_node ; p = TREE_CHAIN (p))
10161                   {
10162                     tree arg = TREE_VALUE (p);
10163                     if (TREE_CODE (arg) == REFERENCE_TYPE)
10164                       arg = TREE_TYPE (arg);
10165
10166                     /* This lets bad template code slip through.  */
10167                     if (IS_AGGR_TYPE (arg)
10168                         || TREE_CODE (arg) == ENUMERAL_TYPE
10169                         || TREE_CODE (arg) == TEMPLATE_TYPE_PARM)
10170                       goto foundaggr;
10171                   }
10172               cp_error
10173                 ("`%D' must have an argument of class or enumerated type",
10174                  decl);
10175             foundaggr:
10176               ;
10177             }
10178         }
10179       
10180       if (name == ansi_opname[(int) CALL_EXPR]
10181           || name == ansi_opname[(int) METHOD_CALL_EXPR])
10182         return;                 /* no restrictions on args */
10183
10184       if (IDENTIFIER_TYPENAME_P (name))
10185         {
10186           tree t = TREE_TYPE (name);
10187           if (TREE_CODE (t) == VOID_TYPE)
10188             pedwarn ("void is not a valid type conversion operator");
10189           else if (! friendp)
10190             {
10191               int ref = (TREE_CODE (t) == REFERENCE_TYPE);
10192               char *what = 0;
10193               if (ref)
10194                 t = TYPE_MAIN_VARIANT (TREE_TYPE (t));
10195
10196               if (t == current_class_type)
10197                 what = "the same type";
10198               else if (IS_AGGR_TYPE (t)
10199                        && DERIVED_FROM_P (t, current_class_type))
10200                 what = "a base class";
10201
10202               if (what)
10203                 warning ("conversion to %s%s will never use a type conversion operator",
10204                          ref ? "a reference to " : "", what);
10205             }
10206         }
10207
10208       if (name == ansi_opname[(int) MODIFY_EXPR])
10209         {
10210           tree parmtype;
10211
10212           if (list_length (argtypes) != 3 && methodp)
10213             {
10214               cp_error ("`%D' must take exactly one argument", decl);
10215               return;
10216             }
10217           parmtype = TREE_VALUE (TREE_CHAIN (argtypes));
10218
10219           if (copy_assignment_arg_p (parmtype, virtualp)
10220               && ! friendp)
10221             {
10222               TYPE_HAS_ASSIGN_REF (current_class_type) = 1;
10223               if (TREE_CODE (parmtype) != REFERENCE_TYPE
10224                   || TYPE_READONLY (TREE_TYPE (parmtype)))
10225                 TYPE_HAS_CONST_ASSIGN_REF (current_class_type) = 1;
10226 #if 0 /* Too soon; done in grok_function_init */
10227               if (DECL_ABSTRACT_VIRTUAL_P (decl))
10228                 TYPE_HAS_ABSTRACT_ASSIGN_REF (current_class_type) = 1;
10229 #endif
10230             }
10231         }
10232       else if (name == ansi_opname[(int) COND_EXPR])
10233         {
10234           /* 13.4.0.3 */
10235           pedwarn ("ANSI C++ prohibits overloading operator ?:");
10236           if (list_length (argtypes) != 4)
10237             cp_error ("`%D' must take exactly three arguments", decl);
10238         }         
10239       else if (ambi_op_p (name))
10240         {
10241           if (list_length (argtypes) == 2)
10242             /* prefix */;
10243           else if (list_length (argtypes) == 3)
10244             {
10245               if ((name == ansi_opname[(int) POSTINCREMENT_EXPR]
10246                    || name == ansi_opname[(int) POSTDECREMENT_EXPR])
10247                   && TREE_VALUE (TREE_CHAIN (argtypes)) != integer_type_node)
10248                 {
10249                   if (methodp)
10250                     cp_error ("postfix `%D' must take `int' as its argument",
10251                               decl);
10252                   else
10253                     cp_error
10254                       ("postfix `%D' must take `int' as its second argument",
10255                        decl);
10256                 }
10257             }
10258           else
10259             {
10260               if (methodp)
10261                 cp_error ("`%D' must take either zero or one argument", decl);
10262               else
10263                 cp_error ("`%D' must take either one or two arguments", decl);
10264             }
10265         }
10266       else if (unary_op_p (name))
10267         {
10268           if (list_length (argtypes) != 2)
10269             {
10270               if (methodp)
10271                 cp_error ("`%D' must take `void'", decl);
10272               else
10273                 cp_error ("`%D' must take exactly one argument", decl);
10274             }
10275         }
10276       else /* if (binary_op_p (name)) */
10277         {
10278           if (list_length (argtypes) != 3)
10279             {
10280               if (methodp)
10281                 cp_error ("`%D' must take exactly one argument", decl);
10282               else
10283                 cp_error ("`%D' must take exactly two arguments", decl);
10284             }
10285         }
10286
10287       /* 13.4.0.8 */
10288       if (argtypes)
10289         for (; argtypes != void_list_node ; argtypes = TREE_CHAIN (argtypes))
10290           if (TREE_PURPOSE (argtypes))
10291             {
10292               TREE_PURPOSE (argtypes) = NULL_TREE;
10293               if (name == ansi_opname[(int) POSTINCREMENT_EXPR]
10294                   || name == ansi_opname[(int) POSTDECREMENT_EXPR])
10295                 {
10296                   if (pedantic)
10297                     cp_pedwarn ("`%D' cannot have default arguments", decl);
10298                 }
10299               else
10300                 cp_error ("`%D' cannot have default arguments", decl);
10301             }
10302     }
10303 }
10304 \f
10305 /* Get the struct, enum or union (CODE says which) with tag NAME.
10306    Define the tag as a forward-reference if it is not defined.
10307
10308    C++: If a class derivation is given, process it here, and report
10309    an error if multiple derivation declarations are not identical.
10310
10311    If this is a definition, come in through xref_tag and only look in
10312    the current frame for the name (since C++ allows new names in any
10313    scope.)  */
10314
10315 tree
10316 xref_tag (code_type_node, name, binfo, globalize)
10317      tree code_type_node;
10318      tree name, binfo;
10319      int globalize;
10320 {
10321   enum tag_types tag_code;
10322   enum tree_code code;
10323   int temp = 0;
10324   int i;
10325   register tree ref, t;
10326   struct binding_level *b = inner_binding_level;
10327
10328   tag_code = (enum tag_types) TREE_INT_CST_LOW (code_type_node);
10329   switch (tag_code)
10330     {
10331     case record_type:
10332     case class_type:
10333     case signature_type:
10334       code = RECORD_TYPE;
10335       break;
10336     case union_type:
10337       code = UNION_TYPE;
10338       break;
10339     case enum_type:
10340       code = ENUMERAL_TYPE;
10341       break;
10342     default:
10343       my_friendly_abort (18);
10344     }
10345
10346   /* If a cross reference is requested, look up the type
10347      already defined for this tag and return it.  */
10348   t = IDENTIFIER_TYPE_VALUE (name);
10349   if (t && TREE_CODE (t) != code)
10350     t = NULL_TREE;
10351
10352   if (! globalize)
10353     {
10354       /* If we know we are defining this tag, only look it up in this scope
10355        * and don't try to find it as a type. */
10356       if (t && TYPE_CONTEXT(t) && TREE_MANGLED (name))
10357         ref = t;
10358       else
10359         ref = lookup_tag (code, name, b, 1);
10360     }
10361   else
10362     {
10363       if (t)
10364         ref = t;
10365       else
10366         ref = lookup_tag (code, name, b, 0);
10367
10368       if (! ref)
10369         {
10370           /* Try finding it as a type declaration.  If that wins, use it.  */
10371           ref = lookup_name (name, 1);
10372           if (ref && TREE_CODE (ref) == TYPE_DECL
10373               && TREE_CODE (TREE_TYPE (ref)) == code)
10374             ref = TREE_TYPE (ref);
10375           else
10376             ref = NULL_TREE;
10377         }
10378     }
10379
10380   push_obstacks_nochange ();
10381
10382   if (! ref)
10383     {
10384       /* If no such tag is yet defined, create a forward-reference node
10385          and record it as the "definition".
10386          When a real declaration of this type is found,
10387          the forward-reference will be altered into a real type.  */
10388
10389       /* In C++, since these migrate into the global scope, we must
10390          build them on the permanent obstack.  */
10391
10392       temp = allocation_temporary_p ();
10393       if (temp)
10394         end_temporary_allocation ();
10395
10396       if (code == ENUMERAL_TYPE)
10397         {
10398           ref = make_node (ENUMERAL_TYPE);
10399
10400           /* Give the type a default layout like unsigned int
10401              to avoid crashing if it does not get defined.  */
10402           TYPE_MODE (ref) = TYPE_MODE (unsigned_type_node);
10403           TYPE_ALIGN (ref) = TYPE_ALIGN (unsigned_type_node);
10404           TREE_UNSIGNED (ref) = 1;
10405           TYPE_PRECISION (ref) = TYPE_PRECISION (unsigned_type_node);
10406           TYPE_MIN_VALUE (ref) = TYPE_MIN_VALUE (unsigned_type_node);
10407           TYPE_MAX_VALUE (ref) = TYPE_MAX_VALUE (unsigned_type_node);
10408
10409           /* Enable us to recognize when a type is created in class context.
10410              To do nested classes correctly, this should probably be cleared
10411              out when we leave this classes scope.  Currently this in only
10412              done in `start_enum'.  */
10413
10414           pushtag (name, ref, globalize);
10415           if (flag_cadillac)
10416             cadillac_start_enum (ref);
10417         }
10418       else
10419         {
10420           struct binding_level *old_b = class_binding_level;
10421
10422           ref = make_lang_type (code);
10423
10424           if (tag_code == signature_type)
10425             {
10426               SET_SIGNATURE (ref);
10427               /* Since a signature type will be turned into the type
10428                  of signature tables, it's not only an interface.  */
10429               CLASSTYPE_INTERFACE_ONLY (ref) = 0;
10430               SET_CLASSTYPE_INTERFACE_KNOWN (ref);
10431               /* A signature doesn't have a vtable.  */
10432               CLASSTYPE_VTABLE_NEEDS_WRITING (ref) = 0;
10433             }
10434
10435 #ifdef NONNESTED_CLASSES
10436           /* Class types don't nest the way enums do.  */
10437           class_binding_level = (struct binding_level *)0;
10438 #endif
10439           pushtag (name, ref, globalize);
10440           class_binding_level = old_b;
10441
10442           if (flag_cadillac)
10443             cadillac_start_struct (ref);
10444         }
10445     }
10446   else
10447     {
10448       /* If it no longer looks like a nested type, make sure it's
10449          in global scope.  */
10450       if (b == global_binding_level && !class_binding_level
10451           && IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE)
10452         IDENTIFIER_GLOBAL_VALUE (name) = TYPE_NAME (ref);
10453
10454 #if 0
10455       if (binfo)
10456         {
10457           tree tt1 = binfo;
10458           tree tt2 = TYPE_BINFO_BASETYPES (ref);
10459
10460           if (TYPE_BINFO_BASETYPES (ref))
10461             for (i = 0; tt1; i++, tt1 = TREE_CHAIN (tt1))
10462               if (TREE_VALUE (tt1) != TYPE_IDENTIFIER (BINFO_TYPE (TREE_VEC_ELT (tt2, i))))
10463                 {
10464                   cp_error ("redeclaration of derivation chain of type `%#T'",
10465                             ref);
10466                   break;
10467                 }
10468
10469           if (tt1 == NULL_TREE)
10470             /* The user told us something we already knew.  */
10471             goto just_return;
10472
10473           /* In C++, since these migrate into the global scope, we must
10474              build them on the permanent obstack.  */
10475           end_temporary_allocation ();
10476         }
10477 #endif
10478     }
10479
10480   if (binfo)
10481     xref_basetypes (code_type_node, name, ref, binfo);
10482
10483  just_return:
10484
10485   /* Until the type is defined, tentatively accept whatever
10486      structure tag the user hands us.  */
10487   if (TYPE_SIZE (ref) == NULL_TREE
10488       && ref != current_class_type
10489       /* Have to check this, in case we have contradictory tag info.  */
10490       && IS_AGGR_TYPE_CODE (TREE_CODE (ref)))
10491     {
10492       if (tag_code == class_type)
10493         CLASSTYPE_DECLARED_CLASS (ref) = 1;
10494       else if (tag_code == record_type || tag_code == signature_type)
10495         CLASSTYPE_DECLARED_CLASS (ref) = 0;
10496     }
10497
10498   pop_obstacks ();
10499
10500   return ref;
10501 }
10502
10503 void
10504 xref_basetypes (code_type_node, name, ref, binfo)
10505      tree code_type_node;
10506      tree name, ref;
10507      tree binfo;
10508 {
10509   /* In the declaration `A : X, Y, ... Z' we mark all the types
10510      (A, X, Y, ..., Z) so we can check for duplicates.  */
10511   tree binfos;
10512   int i, len;
10513   enum tag_types tag_code = (enum tag_types) TREE_INT_CST_LOW (code_type_node);
10514
10515   if (tag_code == union_type)
10516     {
10517       cp_error ("derived union `%T' invalid", ref);
10518       return;
10519     }
10520
10521   len = list_length (binfo);
10522   push_obstacks (TYPE_OBSTACK (ref), TYPE_OBSTACK (ref));
10523
10524   SET_CLASSTYPE_MARKED (ref);
10525   BINFO_BASETYPES (TYPE_BINFO (ref)) = binfos = make_tree_vec (len);
10526
10527   for (i = 0; binfo; binfo = TREE_CHAIN (binfo))
10528     {
10529       /* The base of a derived struct is public by default.  */
10530       int via_public
10531         = (TREE_PURPOSE (binfo) == (tree)access_public
10532            || TREE_PURPOSE (binfo) == (tree)access_public_virtual
10533            || (tag_code != class_type
10534                && (TREE_PURPOSE (binfo) == (tree)access_default
10535                    || TREE_PURPOSE (binfo) == (tree)access_default_virtual)));
10536       int via_protected = TREE_PURPOSE (binfo) == (tree)access_protected;
10537       int via_virtual
10538         = (TREE_PURPOSE (binfo) == (tree)access_private_virtual
10539            || TREE_PURPOSE (binfo) == (tree)access_public_virtual
10540            || TREE_PURPOSE (binfo) == (tree)access_default_virtual);
10541       tree basetype = TREE_TYPE (TREE_VALUE (binfo));
10542       tree base_binfo;
10543
10544       GNU_xref_hier (IDENTIFIER_POINTER (name),
10545                      IDENTIFIER_POINTER (TREE_VALUE (binfo)),
10546                      via_public, via_virtual, 0);
10547
10548       if (basetype && TREE_CODE (basetype) == TYPE_DECL)
10549         basetype = TREE_TYPE (basetype);
10550       if (!basetype || TREE_CODE (basetype) != RECORD_TYPE)
10551         {
10552           cp_error ("base type `%T' fails to be a struct or class type",
10553                     TREE_VALUE (binfo));
10554           continue;
10555         }
10556 #if 1
10557       /* This code replaces similar code in layout_basetypes.  */
10558       else if (TYPE_INCOMPLETE (basetype))
10559         {
10560           cp_error ("base class `%T' has incomplete type", basetype);
10561           continue;
10562         }
10563 #endif
10564       else
10565         {
10566           if (CLASSTYPE_MARKED (basetype))
10567             {
10568               if (basetype == ref)
10569                 cp_error ("recursive type `%T' undefined", basetype);
10570               else
10571                 cp_error ("duplicate base type `%T' invalid", basetype);
10572               continue;
10573             }
10574
10575           /* Note that the BINFO records which describe individual
10576              inheritances are *not* shared in the lattice!  They
10577              cannot be shared because a given baseclass may be
10578              inherited with different `accessibility' by different
10579              derived classes.  (Each BINFO record describing an
10580              individual inheritance contains flags which say what
10581              the `accessibility' of that particular inheritance is.)  */
10582   
10583           base_binfo = make_binfo (integer_zero_node, basetype,
10584                                    TYPE_BINFO_VTABLE (basetype),
10585                                    TYPE_BINFO_VIRTUALS (basetype), NULL_TREE);
10586  
10587           TREE_VEC_ELT (binfos, i) = base_binfo;
10588           TREE_VIA_PUBLIC (base_binfo) = via_public;
10589           TREE_VIA_PROTECTED (base_binfo) = via_protected;
10590           TREE_VIA_VIRTUAL (base_binfo) = via_virtual;
10591           BINFO_INHERITANCE_CHAIN (base_binfo) = TYPE_BINFO (ref);
10592
10593           SET_CLASSTYPE_MARKED (basetype);
10594 #if 0
10595           /* XYZZY TEST VIRTUAL BASECLASSES */
10596           if (CLASSTYPE_N_BASECLASSES (basetype) == NULL_TREE
10597               && TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype)
10598               && via_virtual == 0)
10599             {
10600               warning ("making type `%s' a virtual baseclass",
10601                        TYPE_NAME_STRING (basetype));
10602               via_virtual = 1;
10603             }
10604 #endif
10605           /* We are free to modify these bits because they are meaningless
10606              at top level, and BASETYPE is a top-level type.  */
10607           if (via_virtual || TYPE_USES_VIRTUAL_BASECLASSES (basetype))
10608             {
10609               TYPE_USES_VIRTUAL_BASECLASSES (ref) = 1;
10610               TYPE_USES_COMPLEX_INHERITANCE (ref) = 1;
10611             }
10612
10613           TYPE_OVERLOADS_METHOD_CALL_EXPR (ref) |= TYPE_OVERLOADS_METHOD_CALL_EXPR (basetype);
10614           TYPE_GETS_NEW (ref) |= TYPE_GETS_NEW (basetype);
10615           TYPE_GETS_DELETE (ref) |= TYPE_GETS_DELETE (basetype);
10616           CLASSTYPE_LOCAL_TYPEDECLS (ref) |= CLASSTYPE_LOCAL_TYPEDECLS (basetype);
10617           i += 1;
10618         }
10619     }
10620   if (i)
10621     TREE_VEC_LENGTH (binfos) = i;
10622   else
10623     BINFO_BASETYPES (TYPE_BINFO (ref)) = NULL_TREE;
10624
10625   if (i > 1)
10626     TYPE_USES_MULTIPLE_INHERITANCE (ref) = 1;
10627   else if (i == 1)
10628     TYPE_USES_MULTIPLE_INHERITANCE (ref)
10629       = TYPE_USES_MULTIPLE_INHERITANCE (BINFO_TYPE (TREE_VEC_ELT (binfos, 0)));
10630   if (TYPE_USES_MULTIPLE_INHERITANCE (ref))
10631     TYPE_USES_COMPLEX_INHERITANCE (ref) = 1;
10632
10633   /* Unmark all the types.  */
10634   while (--i >= 0)
10635     CLEAR_CLASSTYPE_MARKED (BINFO_TYPE (TREE_VEC_ELT (binfos, i)));
10636   CLEAR_CLASSTYPE_MARKED (ref);
10637
10638   pop_obstacks ();
10639 }
10640   
10641 \f
10642 static tree current_local_enum = NULL_TREE;
10643
10644 /* Begin compiling the definition of an enumeration type.
10645    NAME is its name (or null if anonymous).
10646    Returns the type object, as yet incomplete.
10647    Also records info about it so that build_enumerator
10648    may be used to declare the individual values as they are read.  */
10649
10650 tree
10651 start_enum (name)
10652      tree name;
10653 {
10654   register tree enumtype = NULL_TREE;
10655   struct binding_level *b = inner_binding_level;
10656
10657   /* If this is the real definition for a previous forward reference,
10658      fill in the contents in the same object that used to be the
10659      forward reference.  */
10660
10661   if (name != NULL_TREE)
10662     enumtype = lookup_tag (ENUMERAL_TYPE, name, b, 1);
10663
10664   if (enumtype != NULL_TREE && TREE_CODE (enumtype) == ENUMERAL_TYPE)
10665     cp_error ("multiple definition of enum `%T'", enumtype);
10666   else
10667     {
10668       enumtype = make_node (ENUMERAL_TYPE);
10669       pushtag (name, enumtype, 0);
10670     }
10671
10672   if (current_class_type)
10673     TREE_ADDRESSABLE (b->tags) = 1;
10674   current_local_enum = NULL_TREE;
10675
10676 #if 0 /* This stuff gets cleared in finish_enum anyway.  */
10677   if (TYPE_VALUES (enumtype) != NULL_TREE)
10678     /* Completely replace its old definition.
10679        The old enumerators remain defined, however.  */
10680     TYPE_VALUES (enumtype) = NULL_TREE;
10681
10682   /* Initially, set up this enum as like `int'
10683      so that we can create the enumerators' declarations and values.
10684      Later on, the precision of the type may be changed and
10685      it may be laid out again.  */
10686
10687   TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node);
10688   TYPE_SIZE (enumtype) = NULL_TREE;
10689   fixup_signed_type (enumtype);
10690 #endif
10691
10692   /* We copy this value because enumerated type constants
10693      are really of the type of the enumerator, not integer_type_node.  */
10694   enum_next_value = copy_node (integer_zero_node);
10695   enum_overflow = 0;
10696
10697   GNU_xref_decl (current_function_decl, enumtype);
10698   return enumtype;
10699 }
10700
10701 /* After processing and defining all the values of an enumeration type,
10702    install their decls in the enumeration type and finish it off.
10703    ENUMTYPE is the type object and VALUES a list of name-value pairs.
10704    Returns ENUMTYPE.  */
10705
10706 tree
10707 finish_enum (enumtype, values)
10708      register tree enumtype, values;
10709 {
10710   register tree minnode, maxnode;
10711   /* Calculate the maximum value of any enumerator in this type.  */
10712
10713   if (values)
10714     {
10715       register tree pair;
10716       register tree value = DECL_INITIAL (TREE_VALUE (values));
10717       
10718       /* Speed up the main loop by performing some precalculations */
10719       TREE_TYPE (TREE_VALUE (values)) = enumtype;
10720       TREE_TYPE (value) = enumtype;
10721       TREE_VALUE (values) = value;
10722       minnode = maxnode = value;
10723       
10724       for (pair = TREE_CHAIN (values); pair; pair = TREE_CHAIN (pair))
10725         {
10726           value = DECL_INITIAL (TREE_VALUE (pair));
10727           TREE_TYPE (TREE_VALUE (pair)) = enumtype;
10728           TREE_TYPE (value) = enumtype;
10729           TREE_VALUE (pair) = value;
10730           if (tree_int_cst_lt (maxnode, value))
10731             maxnode = value;
10732           else if (tree_int_cst_lt (value, minnode))
10733             minnode = value;
10734         }
10735     }
10736   else
10737     maxnode = minnode = integer_zero_node;
10738
10739   TYPE_VALUES (enumtype) = values;
10740
10741   {
10742     int unsignedp = tree_int_cst_sgn (minnode) >= 0;
10743     int lowprec = min_precision (minnode, unsignedp);
10744     int highprec = min_precision (maxnode, unsignedp);
10745     int precision = MAX (lowprec, highprec);
10746
10747     TYPE_SIZE (enumtype) = NULL_TREE;
10748
10749     /* Set TYPE_MIN_VALUE and TYPE_MAX_VALUE according to `precision'.  */
10750
10751     TYPE_PRECISION (enumtype) = precision;
10752     if (unsignedp)
10753       fixup_unsigned_type (enumtype);
10754     else
10755       fixup_signed_type (enumtype);
10756
10757     if (flag_short_enums || precision > TYPE_PRECISION (integer_type_node))
10758       /* Use the width of the narrowest normal C type which is wide enough.  */
10759       TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size
10760                                                   (precision, 1));
10761     else
10762       TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node);
10763
10764     TYPE_SIZE (enumtype) = 0;
10765     layout_type (enumtype);
10766   }
10767
10768   if (flag_cadillac)
10769     cadillac_finish_enum (enumtype);
10770
10771   {
10772     register tree tem;
10773     
10774     /* Fix up all variant types of this enum type.  */
10775     for (tem = TYPE_MAIN_VARIANT (enumtype); tem;
10776          tem = TYPE_NEXT_VARIANT (tem))
10777       {
10778         TYPE_VALUES (tem) = TYPE_VALUES (enumtype);
10779         TYPE_MIN_VALUE (tem) = TYPE_MIN_VALUE (enumtype);
10780         TYPE_MAX_VALUE (tem) = TYPE_MAX_VALUE (enumtype);
10781         TYPE_SIZE (tem) = TYPE_SIZE (enumtype);
10782         TYPE_MODE (tem) = TYPE_MODE (enumtype);
10783         TYPE_PRECISION (tem) = TYPE_PRECISION (enumtype);
10784         TYPE_ALIGN (tem) = TYPE_ALIGN (enumtype);
10785         TREE_UNSIGNED (tem) = TREE_UNSIGNED (enumtype);
10786       }
10787   }
10788
10789   /* Finish debugging output for this type.  */
10790 #if 0
10791   /* @@ Do we ever generate generate ENUMERAL_TYPE nodes for which debugging
10792      information should *not* be generated?  I think not.  */
10793   if (! DECL_IGNORED_P (TYPE_NAME (enumtype)))
10794 #endif
10795     rest_of_type_compilation (enumtype, global_bindings_p ());
10796
10797   return enumtype;
10798 }
10799
10800 /* Build and install a CONST_DECL for one value of the
10801    current enumeration type (one that was begun with start_enum).
10802    Return a tree-list containing the name and its value.
10803    Assignment of sequential values by default is handled here.  */
10804
10805 tree
10806 build_enumerator (name, value)
10807      tree name, value;
10808 {
10809   tree decl, result;
10810   /* Change this to zero if we find VALUE is not shareable.  */
10811   int shareable = 1;
10812
10813   /* Remove no-op casts from the value.  */
10814   if (value)
10815     STRIP_TYPE_NOPS (value);
10816
10817   /* Validate and default VALUE.  */
10818   if (value != NULL_TREE)
10819     {
10820       if (TREE_READONLY_DECL_P (value))
10821         {
10822           value = decl_constant_value (value);
10823           shareable = 0;
10824         }
10825
10826       if (TREE_CODE (value) == INTEGER_CST)
10827         {
10828           value = default_conversion (value);
10829           constant_expression_warning (value);
10830         }
10831       else
10832         {
10833           cp_error ("enumerator value for `%D' not integer constant", name);
10834           value = NULL_TREE;
10835         }
10836     }
10837
10838   /* The order of things is reversed here so that we
10839      can check for possible sharing of enum values,
10840      to keep that from happening.  */
10841   /* Default based on previous value.  */
10842   if (value == NULL_TREE)
10843     {
10844       value = enum_next_value;
10845       if (enum_overflow)
10846         cp_error ("overflow in enumeration values at `%D'", name);
10847     }
10848
10849   /* Remove no-op casts from the value.  */
10850   if (value)
10851     STRIP_TYPE_NOPS (value);
10852
10853   /* Make up for hacks in lex.c.  */
10854   if (value == integer_zero_node)
10855     value = build_int_2 (0, 0);
10856   else if (value == integer_one_node)
10857     value = build_int_2 (1, 0);
10858   else if (TREE_CODE (value) == INTEGER_CST
10859            && (shareable == 0
10860                || TREE_CODE (TREE_TYPE (value)) == ENUMERAL_TYPE))
10861     {
10862       value = copy_node (value);
10863       TREE_TYPE (value) = integer_type_node;
10864     }
10865
10866   /* C++ associates enums with global, function, or class declarations.  */
10867
10868   decl = current_scope ();
10869   if (decl && decl == current_class_type)
10870     {
10871       /* This enum declaration is local to the class, so we must put
10872          it in that class's list of decls.  */
10873       decl = build_lang_field_decl (CONST_DECL, name, integer_type_node);
10874       DECL_INITIAL (decl) = value;
10875       TREE_READONLY (decl) = 1;
10876       pushdecl_class_level (decl);
10877       TREE_CHAIN (decl) = current_local_enum;
10878       current_local_enum = decl;
10879     }
10880   else
10881     {
10882       /* It's a global enum, or it's local to a function.  (Note local to
10883          a function could mean local to a class method.  */
10884       decl = build_decl (CONST_DECL, name, integer_type_node);
10885       DECL_INITIAL (decl) = value;
10886
10887       pushdecl (decl);
10888       GNU_xref_decl (current_function_decl, decl);
10889     }
10890
10891   /* Set basis for default for next value.  */
10892   enum_next_value = build_binary_op_nodefault (PLUS_EXPR, value,
10893                                                integer_one_node, PLUS_EXPR);
10894   enum_overflow = tree_int_cst_lt (enum_next_value, value);
10895   
10896   if (enum_next_value == integer_one_node)
10897     enum_next_value = copy_node (enum_next_value);
10898
10899   result = saveable_tree_cons (name, decl, NULL_TREE);
10900   return result;
10901 }
10902
10903 tree
10904 grok_enum_decls (type, decl)
10905      tree type, decl;
10906 {
10907   tree d = current_local_enum;
10908   
10909   if (d == NULL_TREE)
10910     return decl;
10911   
10912   while (1)
10913     {
10914       TREE_TYPE (d) = type;
10915       if (TREE_CHAIN (d) == NULL_TREE)
10916         {
10917           TREE_CHAIN (d) = decl;
10918           break;
10919         }
10920       d = TREE_CHAIN (d);
10921     }
10922
10923   decl = current_local_enum;
10924   current_local_enum = NULL_TREE;
10925   
10926   return decl;
10927 }
10928 \f
10929 /* Create the FUNCTION_DECL for a function definition.
10930    DECLSPECS and DECLARATOR are the parts of the declaration;
10931    they describe the function's name and the type it returns,
10932    but twisted together in a fashion that parallels the syntax of C.
10933
10934    This function creates a binding context for the function body
10935    as well as setting up the FUNCTION_DECL in current_function_decl.
10936
10937    Returns 1 on success.  If the DECLARATOR is not suitable for a function
10938    (it defines a datum instead), we return 0, which tells
10939    yyparse to report a parse error.
10940
10941    For C++, we must first check whether that datum makes any sense.
10942    For example, "class A local_a(1,2);" means that variable local_a
10943    is an aggregate of type A, which should have a constructor
10944    applied to it with the argument list [1, 2].
10945
10946    @@ There is currently no way to retrieve the storage
10947    @@ allocated to FUNCTION (or all of its parms) if we return
10948    @@ something we had previously.  */
10949
10950 int
10951 start_function (declspecs, declarator, raises, pre_parsed_p)
10952      tree declarator, declspecs, raises;
10953      int pre_parsed_p;
10954 {
10955   tree decl1, olddecl;
10956   tree ctype = NULL_TREE;
10957   tree fntype;
10958   tree restype;
10959   extern int have_extern_spec;
10960   extern int used_extern_spec;
10961   int doing_friend = 0;
10962
10963   /* Sanity check.  */
10964   my_friendly_assert (TREE_VALUE (void_list_node) == void_type_node, 160);
10965   my_friendly_assert (TREE_CHAIN (void_list_node) == NULL_TREE, 161);
10966
10967   /* Assume, until we see it does. */
10968   current_function_returns_value = 0;
10969   current_function_returns_null = 0;
10970   warn_about_return_type = 0;
10971   named_labels = 0;
10972   shadowed_labels = 0;
10973   current_function_assigns_this = 0;
10974   current_function_just_assigned_this = 0;
10975   current_function_parms_stored = 0;
10976   original_result_rtx = NULL_RTX;
10977   current_function_obstack_index = 0;
10978   current_function_obstack_usage = 0;
10979   base_init_expr = NULL_TREE;
10980   protect_list = NULL_TREE;
10981   current_base_init_list = NULL_TREE;
10982   current_member_init_list = NULL_TREE;
10983
10984   clear_temp_name ();
10985
10986   /* This should only be done once on the top most decl. */
10987   if (have_extern_spec && !used_extern_spec)
10988     {
10989       declspecs = decl_tree_cons (NULL_TREE, get_identifier ("extern"), declspecs);
10990       used_extern_spec = 1;
10991     }
10992
10993   if (pre_parsed_p)
10994     {
10995       decl1 = declarator;
10996
10997       if (! DECL_ARGUMENTS (decl1)
10998           && !DECL_STATIC_FUNCTION_P (decl1)
10999           && DECL_CONTEXT (decl1)
11000           && DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl1)))
11001           && IDENTIFIER_TEMPLATE (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl1)))))
11002         {
11003           cp_error ("redeclaration of `%#D'", decl1);
11004           if (IDENTIFIER_CLASS_VALUE (DECL_NAME (decl1)))
11005             cp_error_at ("previous declaration here", IDENTIFIER_CLASS_VALUE (DECL_NAME (decl1)));
11006           else if (IDENTIFIER_GLOBAL_VALUE (DECL_NAME (decl1)))
11007             cp_error_at ("previous declaration here", IDENTIFIER_GLOBAL_VALUE (DECL_NAME (decl1)));
11008         }
11009
11010       last_function_parms = DECL_ARGUMENTS (decl1);
11011       last_function_parm_tags = NULL_TREE;
11012       fntype = TREE_TYPE (decl1);
11013       if (TREE_CODE (fntype) == METHOD_TYPE)
11014         ctype = TYPE_METHOD_BASETYPE (fntype);
11015
11016       /* ANSI C++ June 5 1992 WP 11.4.5.  A friend function defined in a
11017          class is in the (lexical) scope of the class in which it is
11018          defined.  */
11019       if (!ctype && DECL_FRIEND_P (decl1))
11020         {
11021           ctype = DECL_CLASS_CONTEXT (decl1);
11022
11023           /* CTYPE could be null here if we're dealing with a template;
11024              for example, `inline friend float foo()' inside a template
11025              will have no CTYPE set.  */
11026           if (ctype && TREE_CODE (ctype) != RECORD_TYPE)
11027             ctype = NULL_TREE;
11028           else
11029             doing_friend = 1;
11030         }
11031
11032       raises = TYPE_RAISES_EXCEPTIONS (fntype);
11033
11034       /* In a fcn definition, arg types must be complete.  */
11035       require_complete_types_for_parms (last_function_parms);
11036     }
11037   else
11038     {
11039       decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1, raises);
11040       /* If the declarator is not suitable for a function definition,
11041          cause a syntax error.  */
11042       if (decl1 == NULL_TREE || TREE_CODE (decl1) != FUNCTION_DECL) return 0;
11043
11044       fntype = TREE_TYPE (decl1);
11045
11046       restype = TREE_TYPE (fntype);
11047       if (IS_AGGR_TYPE (restype) && ! TYPE_PTRMEMFUNC_P (restype)
11048           && ! CLASSTYPE_GOT_SEMICOLON (restype))
11049         {
11050           cp_error ("semicolon missing after declaration of `%#T'", restype);
11051           shadow_tag (build_tree_list (NULL_TREE, restype));
11052           CLASSTYPE_GOT_SEMICOLON (restype) = 1;
11053           if (TREE_CODE (fntype) == FUNCTION_TYPE)
11054             fntype = build_function_type (integer_type_node,
11055                                           TYPE_ARG_TYPES (fntype));
11056           else
11057             fntype = build_cplus_method_type (build_type_variant (TYPE_METHOD_BASETYPE (fntype), TREE_READONLY (decl1), TREE_SIDE_EFFECTS (decl1)),
11058                                               integer_type_node,
11059                                               TYPE_ARG_TYPES (fntype));
11060           TREE_TYPE (decl1) = fntype;
11061         }
11062
11063       if (TREE_CODE (fntype) == METHOD_TYPE)
11064         ctype = TYPE_METHOD_BASETYPE (fntype);
11065       else if (IDENTIFIER_LENGTH (DECL_NAME (decl1)) == 4
11066                && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (decl1)), "main")
11067                && DECL_CONTEXT (decl1) == NULL_TREE)
11068         {
11069           /* If this doesn't return integer_type, complain.  */
11070           if (TREE_TYPE (TREE_TYPE (decl1)) != integer_type_node)
11071             {
11072               if (pedantic || warn_return_type)
11073                 pedwarn ("return type for `main' changed to integer type");
11074               TREE_TYPE (decl1) = fntype = default_function_type;
11075             }
11076           warn_about_return_type = 0;
11077         }
11078     }
11079
11080   /* Warn if function was previously implicitly declared
11081      (but not if we warned then).  */
11082   if (! warn_implicit
11083       && IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)) != NULL_TREE)
11084     cp_warning_at ("`%D' implicitly declared before its definition", IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)));
11085
11086   current_function_decl = decl1;
11087
11088   if (flag_cadillac)
11089     cadillac_start_function (decl1);
11090   else
11091     announce_function (decl1);
11092
11093   if (TYPE_SIZE (TREE_TYPE (fntype)) == NULL_TREE)
11094     {
11095       if (IS_AGGR_TYPE (TREE_TYPE (fntype)))
11096         error_with_aggr_type (TREE_TYPE (fntype),
11097                               "return-type `%s' is an incomplete type");
11098       else
11099         error ("return-type is an incomplete type");
11100
11101       /* Make it return void instead, but don't change the
11102          type of the DECL_RESULT, in case we have a named return value.  */
11103       if (ctype)
11104         TREE_TYPE (decl1)
11105           = build_cplus_method_type (build_type_variant (ctype,
11106                                                          TREE_READONLY (decl1),
11107                                                          TREE_SIDE_EFFECTS (decl1)),
11108                                      void_type_node,
11109                                      FUNCTION_ARG_CHAIN (decl1));
11110       else
11111         TREE_TYPE (decl1)
11112           = build_function_type (void_type_node,
11113                                  TYPE_ARG_TYPES (TREE_TYPE (decl1)));
11114       DECL_RESULT (decl1) = build_decl (RESULT_DECL, 0, TREE_TYPE (fntype));
11115     }
11116
11117   if (TYPE_LANG_SPECIFIC (TREE_TYPE (fntype))
11118       && CLASSTYPE_ABSTRACT_VIRTUALS (TREE_TYPE (fntype)))
11119     abstract_virtuals_error (decl1, TREE_TYPE (fntype));
11120
11121   if (warn_about_return_type)
11122     warning ("return-type defaults to `int'");
11123
11124   /* Make the init_value nonzero so pushdecl knows this is not tentative.
11125      error_mark_node is replaced below (in poplevel) with the BLOCK.  */
11126   DECL_INITIAL (decl1) = error_mark_node;
11127
11128   /* Didn't get anything from C.  */
11129   olddecl = NULL_TREE;
11130
11131   /* This function exists in static storage.
11132      (This does not mean `static' in the C sense!)  */
11133   TREE_STATIC (decl1) = 1;
11134
11135   /* Record the decl so that the function name is defined.
11136      If we already have a decl for this name, and it is a FUNCTION_DECL,
11137      use the old decl.  */
11138
11139   if (pre_parsed_p == 0)
11140     {
11141       current_function_decl = decl1 = pushdecl (decl1);
11142       DECL_MAIN_VARIANT (decl1) = decl1;
11143       fntype = TREE_TYPE (decl1);
11144     }
11145   else
11146     current_function_decl = decl1;
11147
11148   if (DECL_INTERFACE_KNOWN (decl1))
11149     {
11150       if (DECL_NOT_REALLY_EXTERN (decl1))
11151         DECL_EXTERNAL (decl1) = 0;
11152     }
11153   /* If this function belongs to an interface, it is public.
11154      If it belongs to someone else's interface, it is also external.
11155      It doesn't matter whether it's inline or not.  */
11156   else if (interface_unknown == 0)
11157     {
11158       if (DECL_THIS_INLINE (decl1) || DECL_TEMPLATE_INSTANTIATION (decl1))
11159         DECL_EXTERNAL (decl1)
11160           = (interface_only
11161              || (DECL_THIS_INLINE (decl1) && ! flag_implement_inlines));
11162       else
11163         DECL_EXTERNAL (decl1) = 0;
11164       DECL_NOT_REALLY_EXTERN (decl1) = 0;
11165       DECL_INTERFACE_KNOWN (decl1) = 1;
11166     }
11167   else
11168     {
11169       /* This is a definition, not a reference.
11170          So clear DECL_EXTERNAL.  */
11171       DECL_EXTERNAL (decl1) = 0;
11172
11173       if (DECL_THIS_INLINE (decl1) && ! DECL_INTERFACE_KNOWN (decl1))
11174         DECL_DEFER_OUTPUT (decl1) = 1;
11175       else
11176         {
11177           DECL_INTERFACE_KNOWN (decl1) = 1;
11178           if (DECL_C_STATIC (decl1))
11179             TREE_PUBLIC (decl1) = 0;
11180         }
11181     }
11182
11183   if (ctype != NULL_TREE && DECL_STATIC_FUNCTION_P (decl1))
11184     {
11185       if (TREE_CODE (fntype) == METHOD_TYPE)
11186         TREE_TYPE (decl1) = fntype
11187           = build_function_type (TREE_TYPE (fntype),
11188                                  TREE_CHAIN (TYPE_ARG_TYPES (fntype)));
11189       last_function_parms = TREE_CHAIN (last_function_parms);
11190       DECL_ARGUMENTS (decl1) = last_function_parms;
11191       ctype = NULL_TREE;
11192     }
11193   restype = TREE_TYPE (fntype);
11194
11195   if (ctype)
11196     {
11197       push_nested_class (ctype, 1);
11198
11199       /* If we're compiling a friend function, neither of the variables
11200          current_class_decl nor current_class_type will have values.  */
11201       if (! doing_friend)
11202         {
11203           /* We know that this was set up by `grokclassfn'.
11204              We do not wait until `store_parm_decls', since evil
11205              parse errors may never get us to that point.  Here
11206              we keep the consistency between `current_class_type'
11207              and `current_class_decl'.  */
11208           tree t = last_function_parms;
11209           int i = suspend_momentary ();
11210
11211           my_friendly_assert (t != NULL_TREE
11212                               && TREE_CODE (t) == PARM_DECL, 162);
11213
11214           /* Fool build_indirect_ref.  */
11215           current_class_decl = NULL_TREE;
11216           C_C_D = build_indirect_ref (t, NULL_PTR);
11217           current_class_decl = t;
11218           resume_momentary (i);
11219         }
11220     }
11221   else
11222     {
11223       if (DECL_STATIC_FUNCTION_P (decl1))
11224         push_nested_class (DECL_CONTEXT (decl1), 2);
11225       else
11226         push_memoized_context (0, 1);
11227       current_class_decl = C_C_D = NULL_TREE;
11228     }
11229
11230   pushlevel (0);
11231   current_binding_level->parm_flag = 1;
11232
11233   /* Save the parm names or decls from this function's declarator
11234      where store_parm_decls will find them.  */
11235   current_function_parms = last_function_parms;
11236   current_function_parm_tags = last_function_parm_tags;
11237
11238   GNU_xref_function (decl1, current_function_parms);
11239
11240   make_function_rtl (decl1);
11241
11242   /* Allocate further tree nodes temporarily during compilation
11243      of this function only.  Tiemann moved up here from bottom of fn.  */
11244   temporary_allocation ();
11245
11246   /* Promote the value to int before returning it.  */
11247   if (C_PROMOTING_INTEGER_TYPE_P (restype))
11248     {
11249       /* It retains unsignedness if traditional or if it isn't
11250          really getting wider.  */
11251       if (TREE_UNSIGNED (restype)
11252           && (flag_traditional
11253               || TYPE_PRECISION (restype)
11254                    == TYPE_PRECISION (integer_type_node)))
11255         restype = unsigned_type_node;
11256       else
11257         restype = integer_type_node;
11258     }
11259   if (DECL_RESULT (decl1) == NULL_TREE)
11260     DECL_RESULT (decl1) = build_decl (RESULT_DECL, 0, restype);
11261
11262   if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl1)))
11263     {
11264       dtor_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
11265       ctor_label = NULL_TREE;
11266     }
11267   else
11268     {
11269       dtor_label = NULL_TREE;
11270       if (DECL_CONSTRUCTOR_P (decl1))
11271         ctor_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
11272     }
11273
11274   /* If this fcn was already referenced via a block-scope `extern' decl
11275      (or an implicit decl), propagate certain information about the usage.  */
11276   if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (decl1)))
11277     TREE_ADDRESSABLE (decl1) = 1;
11278
11279   return 1;
11280 }
11281 \f
11282 /* Store the parameter declarations into the current function declaration.
11283    This is called after parsing the parameter declarations, before
11284    digesting the body of the function.
11285
11286    Also install to binding contour return value identifier, if any.  */
11287
11288 void
11289 store_parm_decls ()
11290 {
11291   register tree fndecl = current_function_decl;
11292   register tree parm;
11293   int parms_have_cleanups = 0;
11294
11295   /* This is either a chain of PARM_DECLs (when a prototype is used).  */
11296   tree specparms = current_function_parms;
11297
11298   /* This is a list of types declared among parms in a prototype.  */
11299   tree parmtags = current_function_parm_tags;
11300
11301   /* This is a chain of any other decls that came in among the parm
11302      declarations.  If a parm is declared with  enum {foo, bar} x;
11303      then CONST_DECLs for foo and bar are put here.  */
11304   tree nonparms = NULL_TREE;
11305
11306   if (toplevel_bindings_p ())
11307     fatal ("parse errors have confused me too much");
11308
11309   /* Initialize RTL machinery.  */
11310   init_function_start (fndecl, input_filename, lineno);
11311
11312   /* Declare __FUNCTION__ and __PRETTY_FUNCTION__ for this function.  */
11313   declare_function_name ();
11314
11315   /* Create a binding level for the parms.  */
11316   expand_start_bindings (0);
11317
11318   if (specparms != NULL_TREE)
11319     {
11320       /* This case is when the function was defined with an ANSI prototype.
11321          The parms already have decls, so we need not do anything here
11322          except record them as in effect
11323          and complain if any redundant old-style parm decls were written.  */
11324
11325       register tree next;
11326
11327       /* Must clear this because it might contain TYPE_DECLs declared
11328          at class level.  */
11329       storedecls (NULL_TREE);
11330       for (parm = nreverse (specparms); parm; parm = next)
11331         {
11332           next = TREE_CHAIN (parm);
11333           if (TREE_CODE (parm) == PARM_DECL)
11334             {
11335               tree cleanup = maybe_build_cleanup (parm);
11336               if (DECL_NAME (parm) == NULL_TREE)
11337                 {
11338 #if 0
11339                   cp_error_at ("parameter name omitted", parm);
11340 #else
11341                   /* for C++, this is not an error.  */
11342                   pushdecl (parm);
11343 #endif
11344                 }
11345               else if (TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == void_type_node)
11346                 cp_error ("parameter `%D' declared void", parm);
11347               else
11348                 {
11349                   /* Now fill in DECL_REFERENCE_SLOT for any of the parm decls.
11350                      A parameter is assumed not to have any side effects.
11351                      If this should change for any reason, then this
11352                      will have to wrap the bashed reference type in a save_expr.
11353                      
11354                      Also, if the parameter type is declared to be an X
11355                      and there is an X(X&) constructor, we cannot lay it
11356                      into the stack (any more), so we make this parameter
11357                      look like it is really of reference type.  Functions
11358                      which pass parameters to this function will know to
11359                      create a temporary in their frame, and pass a reference
11360                      to that.  */
11361
11362                   if (TREE_CODE (TREE_TYPE (parm)) == REFERENCE_TYPE
11363                       && TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm))))
11364                     SET_DECL_REFERENCE_SLOT (parm, convert_from_reference (parm));
11365
11366                   pushdecl (parm);
11367                 }
11368               if (cleanup)
11369                 {
11370                   expand_decl (parm);
11371                   if (! expand_decl_cleanup (parm, cleanup))
11372                     cp_error ("parser lost in parsing declaration of `%D'",
11373                               parm);
11374                   parms_have_cleanups = 1;
11375                 }
11376             }
11377           else
11378             {
11379               /* If we find an enum constant or a type tag,
11380                  put it aside for the moment.  */
11381               TREE_CHAIN (parm) = NULL_TREE;
11382               nonparms = chainon (nonparms, parm);
11383             }
11384         }
11385
11386       /* Get the decls in their original chain order
11387          and record in the function.  This is all and only the
11388          PARM_DECLs that were pushed into scope by the loop above.  */
11389       DECL_ARGUMENTS (fndecl) = getdecls ();
11390
11391       storetags (chainon (parmtags, gettags ()));
11392     }
11393   else
11394     DECL_ARGUMENTS (fndecl) = NULL_TREE;
11395
11396   /* Now store the final chain of decls for the arguments
11397      as the decl-chain of the current lexical scope.
11398      Put the enumerators in as well, at the front so that
11399      DECL_ARGUMENTS is not modified.  */
11400
11401   storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl)));
11402
11403   /* Initialize the RTL code for the function.  */
11404   DECL_SAVED_INSNS (fndecl) = NULL_RTX;
11405   expand_function_start (fndecl, parms_have_cleanups);
11406
11407   /* Create a binding contour which can be used to catch
11408      cleanup-generated temporaries.  Also, if the return value needs or
11409      has initialization, deal with that now.  */
11410   if (parms_have_cleanups)
11411     {
11412       pushlevel (0);
11413       expand_start_bindings (0);
11414     }
11415
11416   current_function_parms_stored = 1;
11417
11418   if (flag_gc)
11419     {
11420       maybe_gc_cleanup = build_tree_list (NULL_TREE, error_mark_node);
11421       if (! expand_decl_cleanup (NULL_TREE, maybe_gc_cleanup))
11422         cp_error ("parser lost in parsing declaration of `%D'", fndecl);
11423     }
11424
11425   /* If this function is `main', emit a call to `__main'
11426      to run global initializers, etc.  */
11427   if (DECL_NAME (fndecl)
11428       && IDENTIFIER_LENGTH (DECL_NAME (fndecl)) == 4
11429       && strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "main") == 0
11430       && DECL_CONTEXT (fndecl) == NULL_TREE)
11431     {
11432       expand_main_function ();
11433
11434       if (flag_gc)
11435         expand_expr (build_function_call (lookup_name (get_identifier ("__gc_main"), 0), NULL_TREE),
11436                      0, VOIDmode, 0);
11437 #if 0
11438       /* done at a different time */
11439       if (flag_rtti)
11440         output_builtin_tdesc_entries ();
11441 #endif
11442     }
11443 }
11444
11445 /* Bind a name and initialization to the return value of
11446    the current function.  */
11447 void
11448 store_return_init (return_id, init)
11449      tree return_id, init;
11450 {
11451   tree decl = DECL_RESULT (current_function_decl);
11452
11453   if (pedantic)
11454     /* Give this error as many times as there are occurrences,
11455        so that users can use Emacs compilation buffers to find
11456        and fix all such places.  */
11457     pedwarn ("ANSI C++ does not permit named return values");
11458
11459   if (return_id != NULL_TREE)
11460     {
11461       if (DECL_NAME (decl) == NULL_TREE)
11462         {
11463           DECL_NAME (decl) = return_id;
11464           DECL_ASSEMBLER_NAME (decl) = return_id;
11465         }
11466       else
11467         error ("return identifier `%s' already in place",
11468                IDENTIFIER_POINTER (DECL_NAME (decl)));
11469     }
11470
11471   /* Can't let this happen for constructors.  */
11472   if (DECL_CONSTRUCTOR_P (current_function_decl))
11473     {
11474       error ("can't redefine default return value for constructors");
11475       return;
11476     }
11477
11478   /* If we have a named return value, put that in our scope as well.  */
11479   if (DECL_NAME (decl) != NULL_TREE)
11480     {
11481       /* If this named return value comes in a register,
11482          put it in a pseudo-register.  */
11483       if (DECL_REGISTER (decl))
11484         {
11485           original_result_rtx = DECL_RTL (decl);
11486           DECL_RTL (decl) = gen_reg_rtx (DECL_MODE (decl));
11487         }
11488
11489       /* Let `cp_finish_decl' know that this initializer is ok.  */
11490       DECL_INITIAL (decl) = init;
11491       pushdecl (decl);
11492       cp_finish_decl (decl, init, NULL_TREE, 0, LOOKUP_ONLYCONVERTING);
11493     }
11494 }
11495
11496 \f
11497 /* Finish up a function declaration and compile that function
11498    all the way to assembler language output.  The free the storage
11499    for the function definition.
11500
11501    This is called after parsing the body of the function definition.
11502    LINENO is the current line number.
11503
11504    C++: CALL_POPLEVEL is non-zero if an extra call to poplevel
11505    (and expand_end_bindings) must be made to take care of the binding
11506    contour for the base initializers.  This is only relevant for
11507    constructors.  */
11508
11509 void
11510 finish_function (lineno, call_poplevel, nested)
11511      int lineno;
11512      int call_poplevel;
11513      int nested;
11514 {
11515   register tree fndecl = current_function_decl;
11516   tree fntype, ctype = NULL_TREE;
11517   rtx head, last_parm_insn, mark;
11518   /* Label to use if this function is supposed to return a value.  */
11519   tree no_return_label = NULL_TREE;
11520   tree decls = NULL_TREE;
11521
11522   /* When we get some parse errors, we can end up without a
11523      current_function_decl, so cope.  */
11524   if (fndecl == NULL_TREE)
11525     return;
11526
11527   fntype = TREE_TYPE (fndecl);
11528
11529 /*  TREE_READONLY (fndecl) = 1;
11530     This caused &foo to be of type ptr-to-const-function
11531     which then got a warning when stored in a ptr-to-function variable.  */
11532
11533   /* This happens on strange parse errors.  */
11534   if (! current_function_parms_stored)
11535     {
11536       call_poplevel = 0;
11537       store_parm_decls ();
11538     }
11539
11540   if (write_symbols != NO_DEBUG /*&& TREE_CODE (fntype) != METHOD_TYPE*/)
11541     {
11542       tree ttype = target_type (fntype);
11543       tree parmdecl;
11544
11545       if (IS_AGGR_TYPE (ttype))
11546         /* Let debugger know it should output info for this type.  */
11547         note_debug_info_needed (ttype);
11548
11549       for (parmdecl = DECL_ARGUMENTS (fndecl); parmdecl; parmdecl = TREE_CHAIN (parmdecl))
11550         {
11551           ttype = target_type (TREE_TYPE (parmdecl));
11552           if (IS_AGGR_TYPE (ttype))
11553             /* Let debugger know it should output info for this type.  */
11554             note_debug_info_needed (ttype);
11555         }
11556     }
11557
11558   /* Clean house because we will need to reorder insns here.  */
11559   do_pending_stack_adjust ();
11560
11561   if (dtor_label)
11562     {
11563       tree binfo = TYPE_BINFO (current_class_type);
11564       tree cond = integer_one_node;
11565       tree exprstmt, vfields;
11566       tree in_charge_node = lookup_name (in_charge_identifier, 0);
11567       tree virtual_size;
11568       int ok_to_optimize_dtor = 0;
11569
11570       if (current_function_assigns_this)
11571         cond = build (NE_EXPR, boolean_type_node,
11572                       current_class_decl, integer_zero_node);
11573       else
11574         {
11575           int n_baseclasses = CLASSTYPE_N_BASECLASSES (current_class_type);
11576
11577           /* If this destructor is empty, then we don't need to check
11578              whether `this' is NULL in some cases.  */
11579           mark = get_last_insn ();
11580           last_parm_insn = get_first_nonparm_insn ();
11581
11582           if ((flag_this_is_variable & 1) == 0)
11583             ok_to_optimize_dtor = 1;
11584           else if (mark == last_parm_insn)
11585             ok_to_optimize_dtor
11586               = (n_baseclasses == 0
11587                  || (n_baseclasses == 1
11588                      && TYPE_HAS_DESTRUCTOR (TYPE_BINFO_BASETYPE (current_class_type, 0))));
11589         }
11590
11591       /* These initializations might go inline.  Protect
11592          the binding level of the parms.  */
11593       pushlevel (0);
11594       expand_start_bindings (0);
11595
11596       if (current_function_assigns_this)
11597         {
11598           current_function_assigns_this = 0;
11599           current_function_just_assigned_this = 0;
11600         }
11601
11602       /* Generate the code to call destructor on base class.
11603          If this destructor belongs to a class with virtual
11604          functions, then set the virtual function table
11605          pointer to represent the type of our base class.  */
11606
11607       /* This side-effect makes call to `build_delete' generate the
11608          code we have to have at the end of this destructor.  */
11609       TYPE_HAS_DESTRUCTOR (current_class_type) = 0;
11610
11611       /* These are two cases where we cannot delegate deletion.  */
11612       if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)
11613           || TYPE_GETS_REG_DELETE (current_class_type))
11614         exprstmt = build_delete (current_class_type, C_C_D, integer_zero_node,
11615                                  LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
11616       else
11617         exprstmt = build_delete (current_class_type, C_C_D, in_charge_node,
11618                                  LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
11619
11620       /* If we did not assign to this, then `this' is non-zero at
11621          the end of a destructor.  As a special optimization, don't
11622          emit test if this is an empty destructor.  If it does nothing,
11623          it does nothing.  If it calls a base destructor, the base
11624          destructor will perform the test.  */
11625
11626       if (exprstmt != error_mark_node
11627           && (TREE_CODE (exprstmt) != NOP_EXPR
11628               || TREE_OPERAND (exprstmt, 0) != integer_zero_node
11629               || TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)))
11630         {
11631           expand_label (dtor_label);
11632           if (cond != integer_one_node)
11633             expand_start_cond (cond, 0);
11634           if (exprstmt != void_zero_node)
11635             /* Don't call `expand_expr_stmt' if we're not going to do
11636                anything, since -Wall will give a diagnostic.  */
11637             expand_expr_stmt (exprstmt);
11638
11639           /* Run destructor on all virtual baseclasses.  */
11640           if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
11641             {
11642               tree vbases = nreverse (copy_list (CLASSTYPE_VBASECLASSES (current_class_type)));
11643               expand_start_cond (build (BIT_AND_EXPR, integer_type_node,
11644                                         in_charge_node, integer_two_node), 0);
11645               while (vbases)
11646                 {
11647                   if (TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (vbases)))
11648                     {
11649                       tree ptr = convert_pointer_to_vbase (vbases, current_class_decl);
11650                       expand_expr_stmt (build_delete (TYPE_POINTER_TO (BINFO_TYPE (vbases)),
11651                                                       ptr, integer_zero_node,
11652                                                       LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_HAS_IN_CHARGE, 0));
11653                     }
11654                   vbases = TREE_CHAIN (vbases);
11655                 }
11656               expand_end_cond ();
11657             }
11658
11659           do_pending_stack_adjust ();
11660           if (cond != integer_one_node)
11661             expand_end_cond ();
11662         }
11663
11664       TYPE_HAS_DESTRUCTOR (current_class_type) = 1;
11665
11666       virtual_size = c_sizeof (current_class_type);
11667
11668       /* At the end, call delete if that's what's requested.  */
11669       if (TYPE_GETS_REG_DELETE (current_class_type))
11670         /* This NOP_EXPR means we are in a static call context.  */
11671         exprstmt =
11672           build_method_call
11673             (build_indirect_ref
11674              (build1 (NOP_EXPR, TYPE_POINTER_TO (current_class_type),
11675                       error_mark_node),
11676               NULL_PTR),
11677              ansi_opname[(int) DELETE_EXPR],
11678              tree_cons (NULL_TREE, current_class_decl,
11679                         build_tree_list (NULL_TREE, virtual_size)),
11680              NULL_TREE, LOOKUP_NORMAL);
11681       else if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
11682         exprstmt = build_x_delete (ptr_type_node, current_class_decl, 0,
11683                                    virtual_size);
11684       else
11685         exprstmt = NULL_TREE;
11686
11687       if (exprstmt)
11688         {
11689           cond = build (BIT_AND_EXPR, integer_type_node,
11690                         in_charge_node, integer_one_node);
11691           expand_start_cond (cond, 0);
11692           expand_expr_stmt (exprstmt);
11693           expand_end_cond ();
11694         }
11695
11696       /* End of destructor.  */
11697       expand_end_bindings (NULL_TREE, getdecls() != NULL_TREE, 0);
11698       poplevel (2, 0, 0); /* XXX change to 1 */
11699
11700       /* Back to the top of destructor.  */
11701       /* Dont execute destructor code if `this' is NULL.  */
11702       mark = get_last_insn ();
11703       last_parm_insn = get_first_nonparm_insn ();
11704       if (last_parm_insn == NULL_RTX)
11705         last_parm_insn = mark;
11706       else
11707         last_parm_insn = previous_insn (last_parm_insn);
11708
11709       /* Make all virtual function table pointers in non-virtual base
11710          classes point to CURRENT_CLASS_TYPE's virtual function
11711          tables.  */
11712       expand_direct_vtbls_init (binfo, binfo, 1, 0, current_class_decl);
11713       if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
11714         expand_indirect_vtbls_init (binfo, C_C_D, current_class_decl, 0);
11715       if (! ok_to_optimize_dtor)
11716         {
11717           cond = build_binary_op (NE_EXPR,
11718                                   current_class_decl, integer_zero_node, 1);
11719           expand_start_cond (cond, 0);
11720         }
11721       if (mark != get_last_insn ())
11722         reorder_insns (next_insn (mark), get_last_insn (), last_parm_insn);
11723       if (! ok_to_optimize_dtor)
11724         expand_end_cond ();
11725     }
11726   else if (current_function_assigns_this)
11727     {
11728       /* Does not need to call emit_base_init, because
11729          that is done (if needed) just after assignment to this
11730          is seen.  */
11731
11732       if (DECL_CONSTRUCTOR_P (current_function_decl))
11733         {
11734           end_protect_partials ();
11735           expand_label (ctor_label);
11736           ctor_label = NULL_TREE;
11737
11738           if (call_poplevel)
11739             {
11740               decls = getdecls ();
11741               expand_end_bindings (decls, decls != NULL_TREE, 0);
11742               poplevel (decls != NULL_TREE, 0, 0);
11743             }
11744           c_expand_return (current_class_decl);
11745         }
11746       else if (TYPE_MAIN_VARIANT (TREE_TYPE (
11747                         DECL_RESULT (current_function_decl))) != void_type_node
11748                && return_label != NULL_RTX)
11749         no_return_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
11750
11751       current_function_assigns_this = 0;
11752       current_function_just_assigned_this = 0;
11753       base_init_expr = NULL_TREE;
11754     }
11755   else if (DECL_CONSTRUCTOR_P (fndecl))
11756     {
11757       tree allocated_this;
11758       tree cond, thenclause;
11759       /* Allow constructor for a type to get a new instance of the object
11760          using `build_new'.  */
11761       tree abstract_virtuals = CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type);
11762       CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type) = NULL_TREE;
11763
11764       DECL_RETURNS_FIRST_ARG (fndecl) = 1;
11765
11766       if (flag_this_is_variable > 0)
11767         {
11768           cond = build_binary_op (EQ_EXPR,
11769                                   current_class_decl, integer_zero_node, 1);
11770           thenclause = build_modify_expr (current_class_decl, NOP_EXPR,
11771                                           build_new (NULL_TREE, current_class_type, void_type_node, 0));
11772         }
11773
11774       CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type) = abstract_virtuals;
11775
11776       /* must keep the first insn safe.  */
11777       head = get_insns ();
11778
11779       /* this note will come up to the top with us.  */
11780       mark = get_last_insn ();
11781
11782       if (flag_this_is_variable > 0)
11783         {
11784           expand_start_cond (cond, 0);
11785           expand_expr_stmt (thenclause);
11786           expand_end_cond ();
11787         }
11788
11789 #if 0
11790       if (DECL_NAME (fndecl) == NULL_TREE
11791           && TREE_CHAIN (DECL_ARGUMENTS (fndecl)) != NULL_TREE)
11792         build_default_constructor (fndecl);
11793 #endif
11794
11795       /* Emit insns from `emit_base_init' which sets up virtual
11796          function table pointer(s).  */
11797       if (base_init_expr)
11798         {
11799           expand_expr_stmt (base_init_expr);
11800           base_init_expr = NULL_TREE;
11801         }
11802
11803       /* This is where the body of the constructor begins.
11804          If there were no insns in this function body, then the
11805          last_parm_insn is also the last insn.
11806
11807          If optimization is enabled, last_parm_insn may move, so
11808          we don't hold on to it (across emit_base_init).  */
11809       last_parm_insn = get_first_nonparm_insn ();
11810       if (last_parm_insn == NULL_RTX)
11811         last_parm_insn = mark;
11812       else
11813         last_parm_insn = previous_insn (last_parm_insn);
11814
11815       if (mark != get_last_insn ())
11816         reorder_insns (next_insn (mark), get_last_insn (), last_parm_insn);
11817
11818       end_protect_partials ();
11819
11820       /* This is where the body of the constructor ends.  */
11821       expand_label (ctor_label);
11822       ctor_label = NULL_TREE;
11823
11824       if (call_poplevel)
11825         {
11826           decls = getdecls ();
11827           expand_end_bindings (decls, decls != NULL_TREE, 0);
11828           poplevel (decls != NULL_TREE, 1, 0);
11829         }
11830
11831       c_expand_return (current_class_decl);
11832
11833       current_function_assigns_this = 0;
11834       current_function_just_assigned_this = 0;
11835     }
11836   else if (IDENTIFIER_LENGTH (DECL_NAME (fndecl)) == 4
11837            && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "main")
11838            && DECL_CONTEXT (fndecl) == NULL_TREE)
11839     {
11840       /* Make it so that `main' always returns 0 by default.  */
11841 #ifdef VMS
11842       c_expand_return (integer_one_node);
11843 #else
11844       c_expand_return (integer_zero_node);
11845 #endif
11846     }
11847   else if (return_label != NULL_RTX
11848            && current_function_return_value == NULL_TREE
11849            && ! DECL_NAME (DECL_RESULT (current_function_decl)))
11850     no_return_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
11851
11852   if (flag_gc)
11853     expand_gc_prologue_and_epilogue ();
11854
11855   /* If this function is supposed to return a value, ensure that
11856      we do not fall into the cleanups by mistake.  The end of our
11857      function will look like this:
11858
11859         user code (may have return stmt somewhere)
11860         goto no_return_label
11861         cleanup_label:
11862         cleanups
11863         goto return_label
11864         no_return_label:
11865         NOTE_INSN_FUNCTION_END
11866         return_label:
11867         things for return
11868
11869      If the user omits a return stmt in the USER CODE section, we
11870      will have a control path which reaches NOTE_INSN_FUNCTION_END.
11871      Otherwise, we won't.  */
11872   if (no_return_label)
11873     {
11874       DECL_CONTEXT (no_return_label) = fndecl;
11875       DECL_INITIAL (no_return_label) = error_mark_node;
11876       DECL_SOURCE_FILE (no_return_label) = input_filename;
11877       DECL_SOURCE_LINE (no_return_label) = lineno;
11878       expand_goto (no_return_label);
11879     }
11880
11881   if (cleanup_label)
11882     {
11883       /* remove the binding contour which is used
11884          to catch cleanup-generated temporaries.  */
11885       expand_end_bindings (0, 0, 0);
11886       poplevel (0, 0, 0);
11887     }
11888
11889   if (cleanup_label)
11890     /* Emit label at beginning of cleanup code for parameters.  */
11891     emit_label (cleanup_label);
11892
11893   /* Get return value into register if that's where it's supposed to be.  */
11894   if (original_result_rtx)
11895     fixup_result_decl (DECL_RESULT (fndecl), original_result_rtx);
11896
11897   /* Finish building code that will trigger warnings if users forget
11898      to make their functions return values.  */
11899   if (no_return_label || cleanup_label)
11900     emit_jump (return_label);
11901   if (no_return_label)
11902     {
11903       /* We don't need to call `expand_*_return' here because we
11904          don't need any cleanups here--this path of code is only
11905          for error checking purposes.  */
11906       expand_label (no_return_label);
11907     }
11908
11909   /* Generate rtl for function exit.  */
11910   expand_function_end (input_filename, lineno, 1);
11911
11912   if (flag_handle_exceptions)
11913     expand_exception_blocks();
11914
11915   /* This must come after expand_function_end because cleanups might
11916      have declarations (from inline functions) that need to go into
11917      this function's blocks.  */
11918   if (current_binding_level->parm_flag != 1)
11919     my_friendly_abort (122);
11920   poplevel (1, 0, 1);
11921
11922   /* reset scope for C++: if we were in the scope of a class,
11923      then when we finish this function, we are not longer so.
11924      This cannot be done until we know for sure that no more
11925      class members will ever be referenced in this function
11926      (i.e., calls to destructors).  */
11927   if (current_class_name)
11928     {
11929       ctype = current_class_type;
11930       pop_nested_class (1);
11931     }
11932   else
11933     pop_memoized_context (1);
11934
11935   /* Must mark the RESULT_DECL as being in this function.  */
11936   DECL_CONTEXT (DECL_RESULT (fndecl)) = DECL_INITIAL (fndecl);
11937
11938   /* Obey `register' declarations if `setjmp' is called in this fn.  */
11939   if (flag_traditional && current_function_calls_setjmp)
11940     setjmp_protect (DECL_INITIAL (fndecl));
11941
11942   /* Set the BLOCK_SUPERCONTEXT of the outermost function scope to point
11943      to the FUNCTION_DECL node itself.  */
11944   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
11945
11946   /* So we can tell if jump_optimize sets it to 1.  */
11947   can_reach_end = 0;
11948
11949   /* Run the optimizers and output the assembler code for this function.  */
11950   rest_of_compilation (fndecl);
11951
11952   if (DECL_SAVED_INSNS (fndecl) && ! TREE_ASM_WRITTEN (fndecl))
11953     {
11954       /* Set DECL_EXTERNAL so that assemble_external will be called as
11955          necessary.  We'll clear it again in finish_file.  */
11956       if (! DECL_EXTERNAL (fndecl))
11957         DECL_NOT_REALLY_EXTERN (fndecl) = 1;
11958       DECL_EXTERNAL (fndecl) = 1;
11959       mark_inline_for_output (fndecl);
11960     }
11961
11962   if (ctype && TREE_ASM_WRITTEN (fndecl))
11963     note_debug_info_needed (ctype);
11964
11965   current_function_returns_null |= can_reach_end;
11966
11967   /* Since we don't normally go through c_expand_return for constructors,
11968      this normally gets the wrong value.
11969      Also, named return values have their return codes emitted after
11970      NOTE_INSN_FUNCTION_END, confusing jump.c.  */
11971   if (DECL_CONSTRUCTOR_P (fndecl)
11972       || DECL_NAME (DECL_RESULT (fndecl)) != NULL_TREE)
11973     current_function_returns_null = 0;
11974
11975   if (TREE_THIS_VOLATILE (fndecl) && current_function_returns_null)
11976     cp_warning ("`noreturn' function `%D' does return", fndecl);
11977   else if ((warn_return_type || pedantic)
11978            && current_function_returns_null
11979            && TYPE_MAIN_VARIANT (TREE_TYPE (fntype)) != void_type_node)
11980     {
11981       /* If this function returns non-void and control can drop through,
11982          complain.  */
11983       cp_pedwarn ("control reaches end of non-void function `%D'", fndecl);
11984     }
11985   /* With just -W, complain only if function returns both with
11986      and without a value.  */
11987   else if (extra_warnings
11988            && current_function_returns_value && current_function_returns_null)
11989     warning ("this function may return with or without a value");
11990
11991   /* Free all the tree nodes making up this function.  */
11992   /* Switch back to allocating nodes permanently
11993      until we start another function.  */
11994   if (! nested)
11995     permanent_allocation (1);
11996
11997   if (flag_cadillac)
11998     cadillac_finish_function (fndecl);
11999
12000   if (DECL_SAVED_INSNS (fndecl) == NULL_RTX)
12001     {
12002       /* Stop pointing to the local nodes about to be freed.  */
12003       /* But DECL_INITIAL must remain nonzero so we know this
12004          was an actual function definition.  */
12005       DECL_INITIAL (fndecl) = error_mark_node;
12006       if (! DECL_CONSTRUCTOR_P (fndecl)
12007           || !TYPE_USES_VIRTUAL_BASECLASSES (TYPE_METHOD_BASETYPE (fntype)))
12008         DECL_ARGUMENTS (fndecl) = NULL_TREE;
12009     }
12010
12011   if (DECL_STATIC_CONSTRUCTOR (fndecl))
12012     static_ctors = perm_tree_cons (NULL_TREE, fndecl, static_ctors);
12013   if (DECL_STATIC_DESTRUCTOR (fndecl))
12014     static_dtors = perm_tree_cons (NULL_TREE, fndecl, static_dtors);
12015
12016   if (! nested)
12017     {
12018       /* Let the error reporting routines know that we're outside a
12019          function.  For a nested function, this value is used in
12020          pop_cp_function_context and then reset via pop_function_context.  */
12021       current_function_decl = NULL_TREE;
12022     }
12023
12024   named_label_uses = NULL_TREE;
12025 }
12026 \f
12027 /* Create the FUNCTION_DECL for a function definition.
12028    LINE1 is the line number that the definition absolutely begins on.
12029    LINE2 is the line number that the name of the function appears on.
12030    DECLSPECS and DECLARATOR are the parts of the declaration;
12031    they describe the return type and the name of the function,
12032    but twisted together in a fashion that parallels the syntax of C.
12033
12034    This function creates a binding context for the function body
12035    as well as setting up the FUNCTION_DECL in current_function_decl.
12036
12037    Returns a FUNCTION_DECL on success.
12038
12039    If the DECLARATOR is not suitable for a function (it defines a datum
12040    instead), we return 0, which tells yyparse to report a parse error.
12041
12042    May return void_type_node indicating that this method is actually
12043    a friend.  See grokfield for more details.
12044
12045    Came here with a `.pushlevel' .
12046
12047    DO NOT MAKE ANY CHANGES TO THIS CODE WITHOUT MAKING CORRESPONDING
12048    CHANGES TO CODE IN `grokfield'.  */
12049 tree
12050 start_method (declspecs, declarator, raises)
12051      tree declarator, declspecs, raises;
12052 {
12053   tree fndecl = grokdeclarator (declarator, declspecs, MEMFUNCDEF, 0, raises);
12054
12055   /* Something too ugly to handle.  */
12056   if (fndecl == NULL_TREE)
12057     return NULL_TREE;
12058
12059   /* Pass friends other than inline friend functions back.  */
12060   if (TYPE_MAIN_VARIANT (fndecl) == void_type_node)
12061     return fndecl;
12062
12063   if (TREE_CODE (fndecl) != FUNCTION_DECL)
12064     /* Not a function, tell parser to report parse error.  */
12065     return NULL_TREE;
12066
12067   if (IS_SIGNATURE (current_class_type))
12068     {
12069       IS_DEFAULT_IMPLEMENTATION (fndecl) = 1;
12070       /* In case we need this info later.  */
12071       HAS_DEFAULT_IMPLEMENTATION (current_class_type) = 1;
12072     }
12073
12074   if (DECL_IN_AGGR_P (fndecl))
12075     {
12076       if (IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (fndecl)) != current_class_type)
12077         {
12078           if (DECL_CONTEXT (fndecl))
12079             cp_error ("`%D' is already defined in class %s", fndecl,
12080                              TYPE_NAME_STRING (DECL_CONTEXT (fndecl)));
12081         }
12082       return void_type_node;
12083     }
12084
12085   DECL_THIS_INLINE (fndecl) = 1;
12086
12087   if (flag_default_inline)
12088     DECL_INLINE (fndecl) = 1;
12089
12090   if (processing_template_defn)
12091     {
12092       SET_DECL_IMPLICIT_INSTANTIATION (fndecl);
12093       repo_template_used (fndecl);
12094     }
12095
12096   /* We read in the parameters on the maybepermanent_obstack,
12097      but we won't be getting back to them until after we
12098      may have clobbered them.  So the call to preserve_data
12099      will keep them safe.  */
12100   preserve_data ();
12101
12102   if (! DECL_FRIEND_P (fndecl))
12103     {
12104       if (DECL_CHAIN (fndecl) != NULL_TREE)
12105         {
12106           /* Need a fresh node here so that we don't get circularity
12107              when we link these together.  If FNDECL was a friend, then
12108              `pushdecl' does the right thing, which is nothing wrt its
12109              current value of DECL_CHAIN.  */
12110           fndecl = copy_node (fndecl);
12111         }
12112       if (TREE_CHAIN (fndecl))
12113         {
12114           fndecl = copy_node (fndecl);
12115           TREE_CHAIN (fndecl) = NULL_TREE;
12116         }
12117
12118       if (DECL_CONSTRUCTOR_P (fndecl))
12119         {
12120           if (! grok_ctor_properties (current_class_type, fndecl))
12121             return void_type_node;
12122         }
12123       else if (IDENTIFIER_OPNAME_P (DECL_NAME (fndecl)))
12124         grok_op_properties (fndecl, DECL_VIRTUAL_P (fndecl), 0);
12125     }
12126
12127   cp_finish_decl (fndecl, NULL_TREE, NULL_TREE, 0, 0);
12128
12129   /* Make a place for the parms */
12130   pushlevel (0);
12131   current_binding_level->parm_flag = 1;
12132   
12133   DECL_IN_AGGR_P (fndecl) = 1;
12134   return fndecl;
12135 }
12136
12137 /* Go through the motions of finishing a function definition.
12138    We don't compile this method until after the whole class has
12139    been processed.
12140
12141    FINISH_METHOD must return something that looks as though it
12142    came from GROKFIELD (since we are defining a method, after all).
12143
12144    This is called after parsing the body of the function definition.
12145    STMTS is the chain of statements that makes up the function body.
12146
12147    DECL is the ..._DECL that `start_method' provided.  */
12148
12149 tree
12150 finish_method (decl)
12151      tree decl;
12152 {
12153   register tree fndecl = decl;
12154   tree old_initial;
12155
12156   register tree link;
12157
12158   if (TYPE_MAIN_VARIANT (decl) == void_type_node)
12159     return decl;
12160
12161   old_initial = DECL_INITIAL (fndecl);
12162
12163   /* Undo the level for the parms (from start_method).
12164      This is like poplevel, but it causes nothing to be
12165      saved.  Saving information here confuses symbol-table
12166      output routines.  Besides, this information will
12167      be correctly output when this method is actually
12168      compiled.  */
12169
12170   /* Clear out the meanings of the local variables of this level;
12171      also record in each decl which block it belongs to.  */
12172
12173   for (link = current_binding_level->names; link; link = TREE_CHAIN (link))
12174     {
12175       if (DECL_NAME (link) != NULL_TREE)
12176         IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = 0;
12177       my_friendly_assert (TREE_CODE (link) != FUNCTION_DECL, 163);
12178       DECL_CONTEXT (link) = NULL_TREE;
12179     }
12180
12181   /* Restore all name-meanings of the outer levels
12182      that were shadowed by this level.  */
12183
12184   for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
12185       IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
12186   for (link = current_binding_level->class_shadowed;
12187        link; link = TREE_CHAIN (link))
12188     IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
12189   for (link = current_binding_level->type_shadowed;
12190        link; link = TREE_CHAIN (link))
12191     IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
12192
12193   GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level,
12194                       (HOST_WIDE_INT) current_binding_level->level_chain,
12195                       current_binding_level->parm_flag,
12196                       current_binding_level->keep,
12197                       current_binding_level->tag_transparent);
12198
12199   poplevel (0, 0, 0);
12200
12201   DECL_INITIAL (fndecl) = old_initial;
12202
12203   /* We used to check if the context of FNDECL was different from
12204      current_class_type as another way to get inside here.  This didn't work
12205      for String.cc in libg++.  */
12206   if (DECL_FRIEND_P (fndecl))
12207     {
12208       CLASSTYPE_INLINE_FRIENDS (current_class_type)
12209         = tree_cons (NULL_TREE, fndecl, CLASSTYPE_INLINE_FRIENDS (current_class_type));
12210       decl = void_type_node;
12211     }
12212
12213   return decl;
12214 }
12215 \f
12216 /* Called when a new struct TYPE is defined.
12217    If this structure or union completes the type of any previous
12218    variable declaration, lay it out and output its rtl.  */
12219
12220 void
12221 hack_incomplete_structures (type)
12222      tree type;
12223 {
12224   tree decl;
12225
12226   if (current_binding_level->n_incomplete == 0)
12227     return;
12228
12229   if (!type) /* Don't do this for class templates.  */
12230     return;
12231
12232   for (decl = current_binding_level->names; decl; decl = TREE_CHAIN (decl))
12233     if (TREE_TYPE (decl) == type
12234         || (TREE_TYPE (decl)
12235             && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
12236             && TREE_TYPE (TREE_TYPE (decl)) == type))
12237       {
12238         if (TREE_CODE (decl) == TYPE_DECL)
12239           layout_type (TREE_TYPE (decl));
12240         else
12241           {
12242             int toplevel = toplevel_bindings_p ();
12243             if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
12244                 && TREE_TYPE (TREE_TYPE (decl)) == type)
12245               layout_type (TREE_TYPE (decl));
12246             layout_decl (decl, 0);
12247             rest_of_decl_compilation (decl, NULL_PTR, toplevel, 0);
12248             if (! toplevel)
12249               {
12250                 tree cleanup;
12251                 expand_decl (decl);
12252                 cleanup = maybe_build_cleanup (decl);
12253                 expand_decl_init (decl);
12254                 if (! expand_decl_cleanup (decl, cleanup))
12255                   cp_error ("parser lost in parsing declaration of `%D'",
12256                             decl);
12257               }
12258           }
12259         /*
12260         my_friendly_assert (current_binding_level->n_incomplete > 0, 164);
12261         */
12262         --current_binding_level->n_incomplete;
12263       }
12264 }
12265
12266 /* Nonzero if presently building a cleanup.  Needed because
12267    SAVE_EXPRs are not the right things to use inside of cleanups.
12268    They are only ever evaluated once, where the cleanup
12269    might be evaluated several times.  In this case, a later evaluation
12270    of the cleanup might fill in the SAVE_EXPR_RTL, and it will
12271    not be valid for an earlier cleanup.  */
12272
12273 int building_cleanup;
12274
12275 /* If DECL is of a type which needs a cleanup, build that cleanup here.
12276    We don't build cleanups if just going for syntax checking, since
12277    fixup_cleanups does not know how to not handle them.
12278
12279    Don't build these on the momentary obstack; they must live
12280    the life of the binding contour.  */
12281 tree
12282 maybe_build_cleanup (decl)
12283      tree decl;
12284 {
12285   tree type = TREE_TYPE (decl);
12286   if (TYPE_NEEDS_DESTRUCTOR (type))
12287     {
12288       int temp = 0, flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR;
12289       tree rval;
12290       int old_building_cleanup = building_cleanup;
12291       building_cleanup = 1;
12292
12293       if (TREE_CODE (decl) != PARM_DECL)
12294         temp = suspend_momentary ();
12295
12296       if (TREE_CODE (type) == ARRAY_TYPE)
12297         rval = decl;
12298       else
12299         {
12300           mark_addressable (decl);
12301           rval = build_unary_op (ADDR_EXPR, decl, 0);
12302         }
12303
12304       /* Optimize for space over speed here.  */
12305       if (! TYPE_USES_VIRTUAL_BASECLASSES (type)
12306           || flag_expensive_optimizations)
12307         flags |= LOOKUP_NONVIRTUAL;
12308
12309       rval = build_delete (TREE_TYPE (rval), rval, integer_two_node, flags, 0);
12310
12311       if (TYPE_USES_VIRTUAL_BASECLASSES (type)
12312           && ! TYPE_HAS_DESTRUCTOR (type))
12313         rval = build_compound_expr (tree_cons (NULL_TREE, rval,
12314                                                build_tree_list (NULL_TREE, build_vbase_delete (type, decl))));
12315
12316       if (TREE_CODE (decl) != PARM_DECL)
12317         resume_momentary (temp);
12318
12319       building_cleanup = old_building_cleanup;
12320
12321       return rval;
12322     }
12323   return 0;
12324 }
12325 \f
12326 /* Expand a C++ expression at the statement level.
12327    This is needed to ferret out nodes which have UNKNOWN_TYPE.
12328    The C++ type checker should get all of these out when
12329    expressions are combined with other, type-providing, expressions,
12330    leaving only orphan expressions, such as:
12331
12332    &class::bar;         / / takes its address, but does nothing with it.
12333
12334    */
12335 void
12336 cplus_expand_expr_stmt (exp)
12337      tree exp;
12338 {
12339   if (TREE_TYPE (exp) == unknown_type_node)
12340     {
12341       if (TREE_CODE (exp) == ADDR_EXPR || TREE_CODE (exp) == TREE_LIST)
12342         error ("address of overloaded function with no contextual type information");
12343       else if (TREE_CODE (exp) == COMPONENT_REF)
12344         warning ("useless reference to a member function name, did you forget the ()?");
12345     }
12346   else
12347     {
12348       int remove_implicit_immediately = 0;
12349
12350       if (TREE_CODE (exp) == FUNCTION_DECL)
12351         {
12352           cp_warning ("reference, not call, to function `%D'", exp);
12353           warning ("at this point in file");
12354         }
12355
12356 #if 0
12357       /* We should do this eventually, but right now this causes regex.o from
12358          libg++ to miscompile, and tString to core dump.  */
12359       exp = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (exp), exp);
12360 #endif
12361       expand_expr_stmt (break_out_cleanups (exp));
12362     }
12363
12364   /* Clean up any pending cleanups.  This happens when a function call
12365      returns a cleanup-needing value that nobody uses.  */
12366   expand_cleanups_to (NULL_TREE);
12367 }
12368
12369 /* When a stmt has been parsed, this function is called.
12370
12371    Currently, this function only does something within a
12372    constructor's scope: if a stmt has just assigned to this,
12373    and we are in a derived class, we call `emit_base_init'.  */
12374
12375 void
12376 finish_stmt ()
12377 {
12378   extern struct nesting *cond_stack, *loop_stack, *case_stack;
12379
12380   
12381   if (current_function_assigns_this
12382       || ! current_function_just_assigned_this)
12383     return;
12384   if (DECL_CONSTRUCTOR_P (current_function_decl))
12385     {
12386       /* Constructors must wait until we are out of control
12387          zones before calling base constructors.  */
12388       if (cond_stack || loop_stack || case_stack)
12389         return;
12390       expand_expr_stmt (base_init_expr);
12391       check_base_init (current_class_type);
12392     }
12393   current_function_assigns_this = 1;
12394
12395   if (flag_cadillac)
12396     cadillac_finish_stmt ();
12397 }
12398
12399 /* Change a static member function definition into a FUNCTION_TYPE, instead
12400    of the METHOD_TYPE that we create when it's originally parsed.
12401
12402    WARNING: DO NOT pass &TREE_TYPE (decl) to FN or &TYPE_ARG_TYPES
12403    (TREE_TYPE (decl)) to ARGTYPES, as doing so will corrupt the types of
12404    other decls.  Either pass the addresses of local variables or NULL.  */
12405
12406 void
12407 revert_static_member_fn (decl, fn, argtypes)
12408      tree *decl, *fn, *argtypes;
12409 {
12410   tree tmp;
12411   tree function = fn ? *fn : TREE_TYPE (*decl);
12412   tree args = argtypes ? *argtypes : TYPE_ARG_TYPES (function);
12413
12414   args = TREE_CHAIN (args);
12415   tmp = build_function_type (TREE_TYPE (function), args);
12416   tmp = build_type_variant (tmp, TYPE_READONLY (function),
12417                             TYPE_VOLATILE (function));
12418   tmp = build_exception_variant (TYPE_METHOD_BASETYPE (function), tmp,
12419                                  TYPE_RAISES_EXCEPTIONS (function));
12420   TREE_TYPE (*decl) = tmp;
12421   DECL_STATIC_FUNCTION_P (*decl) = 1;
12422   if (fn)
12423     *fn = tmp;
12424   if (argtypes)
12425     *argtypes = args;
12426 }
12427
12428 int
12429 id_in_current_class (id)
12430      tree id;
12431 {
12432   return !!purpose_member (id, class_binding_level->class_shadowed);
12433 }
12434
12435 struct cp_function
12436 {
12437   int returns_value;
12438   int returns_null;
12439   int warn_about_return_type;
12440   int assigns_this;
12441   int just_assigned_this;
12442   int parms_stored;
12443   int temp_name_counter;
12444   tree named_labels;
12445   tree shadowed_labels;
12446   tree ctor_label;
12447   tree dtor_label;
12448   tree protect_list;
12449   tree base_init_list;
12450   tree member_init_list;
12451   tree base_init_expr;
12452   tree class_decl;
12453   tree C_C_D;
12454   rtx result_rtx;
12455   struct cp_function *next;
12456   struct binding_level *binding_level;
12457 };
12458
12459 struct cp_function *cp_function_chain;
12460
12461 extern int temp_name_counter;
12462
12463 /* Save and reinitialize the variables
12464    used during compilation of a C++ function.  */
12465
12466 void
12467 push_cp_function_context (context)
12468      tree context;
12469 {
12470   struct cp_function *p
12471     = (struct cp_function *) xmalloc (sizeof (struct cp_function));
12472
12473   push_function_context_to (context);
12474
12475   p->next = cp_function_chain;
12476   cp_function_chain = p;
12477
12478   p->named_labels = named_labels;
12479   p->shadowed_labels = shadowed_labels;
12480   p->returns_value = current_function_returns_value;
12481   p->returns_null = current_function_returns_null;
12482   p->warn_about_return_type = warn_about_return_type;
12483   p->binding_level = current_binding_level;
12484   p->ctor_label = ctor_label;
12485   p->dtor_label = dtor_label;
12486   p->assigns_this = current_function_assigns_this;
12487   p->just_assigned_this = current_function_just_assigned_this;
12488   p->parms_stored = current_function_parms_stored;
12489   p->result_rtx = original_result_rtx;
12490   p->base_init_expr = base_init_expr;
12491   p->protect_list = protect_list;
12492   p->temp_name_counter = temp_name_counter;
12493   p->base_init_list = current_base_init_list;
12494   p->member_init_list = current_member_init_list;
12495   p->class_decl = current_class_decl;
12496   p->C_C_D = C_C_D;
12497 }
12498
12499 /* Restore the variables used during compilation of a C++ function.  */
12500
12501 void
12502 pop_cp_function_context (context)
12503      tree context;
12504 {
12505   struct cp_function *p = cp_function_chain;
12506   tree link;
12507
12508   /* Bring back all the labels that were shadowed.  */
12509   for (link = shadowed_labels; link; link = TREE_CHAIN (link))
12510     if (DECL_NAME (TREE_VALUE (link)) != 0)
12511       SET_IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link)),
12512                                   TREE_VALUE (link));
12513
12514 #if 0
12515   if (DECL_SAVED_INSNS (current_function_decl) == 0)
12516     {
12517       /* Stop pointing to the local nodes about to be freed.  */
12518       /* But DECL_INITIAL must remain nonzero so we know this
12519          was an actual function definition.  */
12520       DECL_INITIAL (current_function_decl) = error_mark_node;
12521       DECL_ARGUMENTS (current_function_decl) = 0;
12522     }
12523 #endif
12524
12525   pop_function_context_from (context);
12526
12527   cp_function_chain = p->next;
12528
12529   named_labels = p->named_labels;
12530   shadowed_labels = p->shadowed_labels;
12531   current_function_returns_value = p->returns_value;
12532   current_function_returns_null = p->returns_null;
12533   warn_about_return_type = p->warn_about_return_type;
12534   current_binding_level = p->binding_level;
12535   ctor_label = p->ctor_label;
12536   dtor_label = p->dtor_label;
12537   protect_list = p->protect_list;
12538   current_function_assigns_this = p->assigns_this;
12539   current_function_just_assigned_this = p->just_assigned_this;
12540   current_function_parms_stored = p->parms_stored;
12541   original_result_rtx = p->result_rtx;
12542   base_init_expr = p->base_init_expr;
12543   temp_name_counter = p->temp_name_counter;
12544   current_base_init_list = p->base_init_list;
12545   current_member_init_list = p->member_init_list;
12546   current_class_decl = p->class_decl;
12547   C_C_D = p->C_C_D;
12548
12549   free (p);
12550 }