OSDN Git Service

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