OSDN Git Service

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