OSDN Git Service

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