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