Annotation of GNUtools/cc/cp-decl.c, revision 1.1

1.1     ! root        1: /* Process declarations and variables for C compiler.
        !             2:    Copyright (C) 1988, 1992, 1993 Free Software Foundation, Inc.
        !             3:    Hacked by Michael Tiemann ([email protected])
        !             4: 
        !             5: This file is part of GNU CC.
        !             6: 
        !             7: GNU CC is free software; you can redistribute it and/or modify
        !             8: it under the terms of the GNU General Public License as published by
        !             9: the Free Software Foundation; either version 2, or (at your option)
        !            10: any later version.
        !            11: 
        !            12: GNU CC is distributed in the hope that it will be useful,
        !            13: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            15: GNU General Public License for more details.
        !            16: 
        !            17: You should have received a copy of the GNU General Public License
        !            18: along with GNU CC; see the file COPYING.  If not, write to
        !            19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            20: 
        !            21: 
        !            22: /* Process declarations and symbol lookup for C front end.
        !            23:    Also constructs types; the standard scalar types at initialization,
        !            24:    and structure, union, array and enum types when they are declared.  */
        !            25: 
        !            26: /* ??? not all decl nodes are given the most useful possible
        !            27:    line numbers.  For example, the CONST_DECLs for enum values.  */
        !            28: 
        !            29: #include <stdio.h>
        !            30: #include "config.h"
        !            31: #include "tree.h"
        !            32: #include "rtl.h"
        !            33: #include "flags.h"
        !            34: #include "cp-tree.h"
        !            35: #include "cp-decl.h"
        !            36: #include "cp-lex.h"
        !            37: #include <sys/types.h>
        !            38: #include <signal.h>
        !            39: #include "obstack.h"
        !            40: 
        !            41: #define obstack_chunk_alloc xmalloc
        !            42: #define obstack_chunk_free free
        !            43: 
        !            44: #ifndef OBJCPLUS
        !            45: /* Define this if C structs should have gratuitous typedefing
        !            46:    done just like C++ structs do.  */
        !            47: #define BREAK_C_TAGS
        !            48: #endif /* not OBJCPLUS */
        !            49: extern struct obstack permanent_obstack;
        !            50: 
        !            51: #ifdef OBJCPLUS
        !            52: #define DECL_HAS_C_LINKAGE(DECL) \
        !            53:   (DECL_LANGUAGE (DECL)==lang_c || DECL_LANGUAGE (DECL)==lang_objc)
        !            54: #else
        !            55: #define DECL_HAS_C_LINKAGE(DECL)        (DECL_LANGUAGE (DECL)==lang_c)
        !            56: #endif
        !            57: #define DECL_LINKAGE(DECL) \
        !            58:    (DECL_HAS_C_LINKAGE(DECL) ? lang_c : \
        !            59:     DECL_HAS_CPLUSPLUS_LINKAGE(DECL) ? lang_cplusplus : 0)
        !            60: 
        !            61: #define DECL_HAS_CPLUSPLUS_LINKAGE(DECL) (DECL_LANGUAGE (DECL)==lang_cplusplus)
        !            62: 
        !            63: #define DECLS_SAME_LINKAGE(DECL1, DECL2)                                       \
        !            64:   (DECL_LINKAGE(DECL1) == DECL_LINKAGE(DECL2))
        !            65: 
        !            66: extern int current_class_depth;
        !            67: 
        !            68: /* Stack of places to restore the search obstack back to.  */
        !            69:    
        !            70: /* Obstack used for remembering local class declarations (like
        !            71:    enums and static (const) members.  */
        !            72: #include "stack.h"
        !            73: static struct obstack decl_obstack;
        !            74: static struct stack_level *decl_stack;
        !            75: 
        !            76: #ifndef CHAR_TYPE_SIZE
        !            77: #define CHAR_TYPE_SIZE BITS_PER_UNIT
        !            78: #endif
        !            79: 
        !            80: #ifndef SHORT_TYPE_SIZE
        !            81: #define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2))
        !            82: #endif
        !            83: 
        !            84: #ifndef INT_TYPE_SIZE
        !            85: #define INT_TYPE_SIZE BITS_PER_WORD
        !            86: #endif
        !            87: 
        !            88: #ifndef LONG_TYPE_SIZE
        !            89: #define LONG_TYPE_SIZE BITS_PER_WORD
        !            90: #endif
        !            91: 
        !            92: #ifndef LONG_LONG_TYPE_SIZE
        !            93: #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
        !            94: #endif
        !            95: 
        !            96: #ifndef WCHAR_UNSIGNED
        !            97: #define WCHAR_UNSIGNED 0
        !            98: #endif
        !            99: 
        !           100: #ifndef FLOAT_TYPE_SIZE
        !           101: #define FLOAT_TYPE_SIZE BITS_PER_WORD
        !           102: #endif
        !           103: 
        !           104: #ifndef DOUBLE_TYPE_SIZE
        !           105: #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
        !           106: #endif
        !           107: 
        !           108: #ifndef LONG_DOUBLE_TYPE_SIZE
        !           109: #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
        !           110: #endif
        !           111: 
        !           112: /* We let tm.h override the types used here, to handle trivial differences
        !           113:    such as the choice of unsigned int or long unsigned int for size_t.
        !           114:    When machines start needing nontrivial differences in the size type,
        !           115:    it would be best to do something here to figure out automatically
        !           116:    from other information what type to use.  */
        !           117: 
        !           118: #ifndef SIZE_TYPE
        !           119: #define SIZE_TYPE "long unsigned int"
        !           120: #endif
        !           121: 
        !           122: #ifndef PTRDIFF_TYPE
        !           123: #define PTRDIFF_TYPE "long int"
        !           124: #endif
        !           125: 
        !           126: #ifndef WCHAR_TYPE
        !           127: #define WCHAR_TYPE "int"
        !           128: #endif
        !           129: 
        !           130: #define builtin_function(NAME, TYPE, CODE, LIBNAME) \
        !           131:   define_function (NAME, TYPE, CODE, (void (*)())pushdecl, LIBNAME)
        !           132: #define auto_function(NAME, TYPE, CODE) \
        !           133:   do {                                 \
        !           134:     tree __name = NAME;                \
        !           135:     tree __type = TYPE;                        \
        !           136:     define_function (IDENTIFIER_POINTER (__name), __type, CODE,        \
        !           137:                     (void (*)())push_overloaded_decl_1,        \
        !           138:                     IDENTIFIER_POINTER (build_decl_overload (__name, TYPE_ARG_TYPES (__type), 0)));\
        !           139:   } while (0)
        !           140: 
        !           141:        tree grokparms                          PROTO((tree, int));
        !           142: static tree lookup_nested_type                 PROTO((tree, tree));
        !           143: static char *redeclaration_error_message       PROTO((tree, tree));
        !           144: static int parmlist_is_random                  PROTO((tree));
        !           145: static void grok_op_properties                 PROTO((tree, int));
        !           146: static void expand_static_init                 PROTO((tree, tree));
        !           147: static void deactivate_exception_cleanups      PROTO((void));
        !           148: 
        !           149: tree define_function                           PROTO((char *, tree, enum built_in_function, void (*)(), char *));
        !           150: 
        !           151: /* a node which has tree code ERROR_MARK, and whose type is itself.
        !           152:    All erroneous expressions are replaced with this node.  All functions
        !           153:    that accept nodes as arguments should avoid generating error messages
        !           154:    if this node is one of the arguments, since it is undesirable to get
        !           155:    multiple error messages from one error in the input.  */
        !           156: 
        !           157: tree error_mark_node;
        !           158: 
        !           159: /* Erroneous argument lists can use this *IFF* they do not modify it.  */
        !           160: tree error_mark_list;
        !           161: 
        !           162: /* INTEGER_TYPE and REAL_TYPE nodes for the standard data types */
        !           163: 
        !           164: tree short_integer_type_node;
        !           165: tree integer_type_node;
        !           166: tree long_integer_type_node;
        !           167: tree long_long_integer_type_node;
        !           168: 
        !           169: tree short_unsigned_type_node;
        !           170: tree unsigned_type_node;
        !           171: tree long_unsigned_type_node;
        !           172: tree long_long_unsigned_type_node;
        !           173: 
        !           174: tree ptrdiff_type_node;
        !           175: 
        !           176: tree unsigned_char_type_node;
        !           177: tree signed_char_type_node;
        !           178: tree char_type_node;
        !           179: tree wchar_type_node;
        !           180: tree signed_wchar_type_node;
        !           181: tree unsigned_wchar_type_node;
        !           182: 
        !           183: tree float_type_node;
        !           184: tree double_type_node;
        !           185: tree long_double_type_node;
        !           186: 
        !           187: tree intQI_type_node;
        !           188: tree intHI_type_node;
        !           189: tree intSI_type_node;
        !           190: tree intDI_type_node;
        !           191: 
        !           192: tree unsigned_intQI_type_node;
        !           193: tree unsigned_intHI_type_node;
        !           194: tree unsigned_intSI_type_node;
        !           195: tree unsigned_intDI_type_node;
        !           196: 
        !           197: /* a VOID_TYPE node, and the same, packaged in a TREE_LIST.  */
        !           198: 
        !           199: tree void_type_node, void_list_node;
        !           200: tree void_zero_node;
        !           201: 
        !           202: /* Nodes for types `void *' and `const void *'.  */
        !           203: 
        !           204: tree ptr_type_node, const_ptr_type_node;
        !           205: 
        !           206: /* Nodes for types `char *' and `const char *'.  */
        !           207: 
        !           208: tree string_type_node, const_string_type_node;
        !           209: 
        !           210: /* Type `char[256]' or something like it.
        !           211:    Used when an array of char is needed and the size is irrelevant.  */
        !           212: 
        !           213: tree char_array_type_node;
        !           214: 
        !           215: /* Type `int[256]' or something like it.
        !           216:    Used when an array of int needed and the size is irrelevant.  */
        !           217: 
        !           218: tree int_array_type_node;
        !           219: 
        !           220: /* Type `wchar_t[256]' or something like it.
        !           221:    Used when a wide string literal is created.  */
        !           222: 
        !           223: tree wchar_array_type_node;
        !           224: 
        !           225: /* type `int ()' -- used for implicit declaration of functions.  */
        !           226: 
        !           227: tree default_function_type;
        !           228: 
        !           229: /* function types `double (double)' and `double (double, double)', etc.  */
        !           230: 
        !           231: tree double_ftype_double, double_ftype_double_double;
        !           232: tree int_ftype_int, long_ftype_long;
        !           233: 
        !           234: /* Function type `void (void *, void *, int)' and similar ones.  */
        !           235: 
        !           236: tree void_ftype_ptr_ptr_int, int_ftype_ptr_ptr_int, void_ftype_ptr_int_int;
        !           237: 
        !           238: /* Function type `char *(char *, char *)' and similar ones */
        !           239: tree string_ftype_ptr_ptr, int_ftype_string_string;
        !           240: 
        !           241: /* Function type `size_t (const char *)' */
        !           242: tree sizet_ftype_string;
        !           243: 
        !           244: /* Function type `int (const void *, const void *, size_t)' */
        !           245: tree int_ftype_cptr_cptr_sizet;
        !           246: 
        !           247: /* C++ extensions */
        !           248: tree vtable_entry_type;
        !           249: tree __t_desc_type_node, __i_desc_type_node, __m_desc_type_node;
        !           250: tree __t_desc_array_type, __i_desc_array_type, __m_desc_array_type;
        !           251: tree class_star_type_node;
        !           252: tree class_type_node, record_type_node, union_type_node, enum_type_node;
        !           253: tree exception_type_node, unknown_type_node;
        !           254: tree maybe_gc_cleanup;
        !           255: 
        !           256: /* Used for virtual function tables.  */
        !           257: tree vtbl_mask;
        !           258: 
        !           259: /* Array type `(void *)[]' */
        !           260: tree vtbl_type_node;
        !           261: 
        !           262: /* Static decls which do not have static initializers have no
        !           263:    initializers as far as GNU C is concerned.  EMPTY_INIT_NODE
        !           264:    is a static initializer which makes varasm code place the decl
        !           265:    in data rather than in bss space.  Such gymnastics are necessary
        !           266:    to avoid the problem that the linker will not include a library
        !           267:    file if all the library appears to contribute are bss variables.  */
        !           268: 
        !           269: tree empty_init_node;
        !           270: 
        !           271: /* In a destructor, the point at which all derived class destroying
        !           272:    has been done, just before any base class destroying will be done.  */
        !           273: 
        !           274: tree dtor_label;
        !           275: 
        !           276: /* In a constructor, the point at which we are ready to return
        !           277:    the pointer to the initialized object.  */
        !           278: 
        !           279: tree ctor_label;
        !           280: 
        !           281: /* A FUNCTION_DECL which can call `unhandled_exception'.
        !           282:    Not necessarily the one that the user will declare,
        !           283:    but sufficient to be called by routines that want to abort the program.  */
        !           284: 
        !           285: tree unhandled_exception_fndecl;
        !           286: 
        !           287: /* A FUNCTION_DECL which can call `abort'.  Not necessarily the
        !           288:    one that the user will declare, but sufficient to be called
        !           289:    by routines that want to abort the program.  */
        !           290: 
        !           291: tree abort_fndecl;
        !           292: 
        !           293: extern rtx cleanup_label, return_label;
        !           294: 
        !           295: /* If original DECL_RESULT of current function was a register,
        !           296:    but due to being an addressable named return value, would up
        !           297:    on the stack, this variable holds the named return value's
        !           298:    original location.  */
        !           299: rtx original_result_rtx;
        !           300: 
        !           301: /* Sequence of insns which represents base initialization.  */
        !           302: rtx base_init_insns;
        !           303: 
        !           304: /* C++: Keep these around to reduce calls to `get_identifier'.
        !           305:    Identifiers for `this' in member functions and the auto-delete
        !           306:    parameter for destructors.  */
        !           307: tree this_identifier, in_charge_identifier;
        !           308: /* Used in pointer to member functions, and in vtables. */
        !           309: tree pfn_identifier, index_identifier, delta_identifier, delta2_identifier;
        !           310: tree pfn_or_delta2_identifier;
        !           311: 
        !           312: /* A list (chain of TREE_LIST nodes) of named label uses.
        !           313:    The TREE_PURPOSE field is the list of variables defined
        !           314:    the the label's scope defined at the point of use.
        !           315:    The TREE_VALUE field is the LABEL_DECL used.
        !           316:    The TREE_TYPE field holds `current_binding_level' at the
        !           317:    point of the label's use.
        !           318: 
        !           319:    Used only for jumps to as-yet undefined labels, since
        !           320:    jumps to defined labels can have their validity checked
        !           321:    by stmt.c.  */
        !           322: 
        !           323: static tree named_label_uses;
        !           324: 
        !           325: /* A list of objects which have constructors or destructors
        !           326:    which reside in the global scope.  The decl is stored in
        !           327:    the TREE_VALUE slot and the initializer is stored
        !           328:    in the TREE_PURPOSE slot.  */
        !           329: tree static_aggregates;
        !           330: 
        !           331: /* A list of functions which were declared inline, but later had their
        !           332:    address taken.  Used only for non-virtual member functions, since we can
        !           333:    find other functions easily enough.  */
        !           334: tree pending_addressable_inlines;
        !           335: 
        !           336: /* A list of overloaded functions which we should forget ever
        !           337:    existed, such as functions declared in a function's scope,
        !           338:    once we leave that function's scope.  */
        !           339: static tree overloads_to_forget;
        !           340: 
        !           341: /* -- end of C++ */
        !           342: 
        !           343: /* Two expressions that are constants with value zero.
        !           344:    The first is of type `int', the second of type `void *'.  */
        !           345: 
        !           346: tree integer_zero_node;
        !           347: tree null_pointer_node;
        !           348: 
        !           349: /* A node for the integer constants 1, 2, and 3.  */
        !           350: 
        !           351: tree integer_one_node, integer_two_node, integer_three_node;
        !           352: 
        !           353: /* Nonzero if we have seen an invalid cross reference
        !           354:    to a struct, union, or enum, but not yet printed the message.  */
        !           355: 
        !           356: tree pending_invalid_xref;
        !           357: /* File and line to appear in the eventual error message.  */
        !           358: char *pending_invalid_xref_file;
        !           359: int pending_invalid_xref_line;
        !           360: 
        !           361: /* While defining an enum type, this is 1 plus the last enumerator
        !           362:    constant value.  */
        !           363: 
        !           364: static tree enum_next_value;
        !           365: 
        !           366: /* Parsing a function declarator leaves a list of parameter names
        !           367:    or a chain or parameter decls here.  */
        !           368: 
        !           369: tree last_function_parms;
        !           370: 
        !           371: /* Parsing a function declarator leaves here a chain of structure
        !           372:    and enum types declared in the parmlist.  */
        !           373: 
        !           374: static tree last_function_parm_tags;
        !           375: 
        !           376: /* After parsing the declarator that starts a function definition,
        !           377:    `start_function' puts here the list of parameter names or chain of decls.
        !           378:    `store_parm_decls' finds it here.  */
        !           379: 
        !           380: static tree current_function_parms;
        !           381: 
        !           382: /* Similar, for last_function_parm_tags.  */
        !           383: static tree current_function_parm_tags;
        !           384: 
        !           385: /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
        !           386:    that have names.  Here so we can clear out their names' definitions
        !           387:    at the end of the function.  */
        !           388: 
        !           389: static tree named_labels;
        !           390: 
        !           391: /* A list of LABEL_DECLs from outer contexts that are currently shadowed.  */
        !           392: 
        !           393: static tree shadowed_labels;
        !           394: 
        !           395: #if 0 /* Not needed by C++ */
        !           396: /* Nonzero when store_parm_decls is called indicates a varargs function.
        !           397:    Value not meaningful after store_parm_decls.  */
        !           398: 
        !           399: static int c_function_varargs;
        !           400: #endif
        !           401: 
        !           402: /* The FUNCTION_DECL for the function currently being compiled,
        !           403:    or 0 if between functions.  */
        !           404: tree current_function_decl;
        !           405: 
        !           406: /* Set to 0 at beginning of a function definition, set to 1 if
        !           407:    a return statement that specifies a return value is seen.  */
        !           408: 
        !           409: int current_function_returns_value;
        !           410: 
        !           411: /* Set to 0 at beginning of a function definition, set to 1 if
        !           412:    a return statement with no argument is seen.  */
        !           413: 
        !           414: int current_function_returns_null;
        !           415: 
        !           416: /* Set to 0 at beginning of a function definition, and whenever
        !           417:    a label (case or named) is defined.  Set to value of expression
        !           418:    returned from function when that value can be transformed into
        !           419:    a named return value.  */
        !           420: 
        !           421: tree current_function_return_value;
        !           422: 
        !           423: /* Set to nonzero by `grokdeclarator' for a function
        !           424:    whose return type is defaulted, if warnings for this are desired.  */
        !           425: 
        !           426: static int warn_about_return_type;
        !           427: 
        !           428: /* Nonzero when starting a function declared `extern inline'.  */
        !           429: 
        !           430: static int current_extern_inline;
        !           431: 
        !           432: /* Nonzero means give `double' the same size as `float'.  */
        !           433: 
        !           434: extern int flag_short_double;
        !           435: 
        !           436: /* Nonzero means don't recognize any builtin functions.  */
        !           437: 
        !           438: extern int flag_no_builtin;
        !           439: 
        !           440: /* Nonzero means do emit exported implementations of functions even if
        !           441:    they can be inlined.  */
        !           442: 
        !           443: extern int flag_implement_inlines;
        !           444: 
        !           445: /* Nonzero means handle things in ANSI, instead of GNU fashion.  This
        !           446:    flag should be tested for language behavior that's different between
        !           447:    ANSI and GNU, but not so horrible as to merit a PEDANTIC label.  */
        !           448: 
        !           449: extern int flag_ansi;
        !           450: 
        !           451: /* Pointers to the base and current top of the language name stack.  */
        !           452: 
        !           453: extern tree *current_lang_base, *current_lang_stack;
        !           454: 
        !           455: /* C and C++ flags are in cp-decl2.c.  */
        !           456: 
        !           457: /* Set to 0 at beginning of a constructor, set to 1
        !           458:    if that function does an allocation before referencing its
        !           459:    instance variable.  */
        !           460: int current_function_assigns_this;
        !           461: int current_function_just_assigned_this;
        !           462: 
        !           463: /* Set to 0 at beginning of a function.  Set non-zero when
        !           464:    store_parm_decls is called.  Don't call store_parm_decls
        !           465:    if this flag is non-zero!  */
        !           466: int current_function_parms_stored;
        !           467: 
        !           468: /* Current end of entries in the gc obstack for stack pointer variables.  */
        !           469: 
        !           470: int current_function_obstack_index;
        !           471: 
        !           472: /* Flag saying whether we have used the obstack in this function or not.  */
        !           473: 
        !           474: int current_function_obstack_usage;
        !           475: 
        !           476: /* Flag used when debugging cp-spew.c */
        !           477: 
        !           478: extern int spew_debug;
        !           479: 
        !           480: /* This is a copy of the class_shadowed list of the previous class binding
        !           481:    contour when at global scope.  It's used to reset IDENTIFIER_CLASS_VALUEs
        !           482:    when entering another class scope (i.e. a cache miss).  */
        !           483: extern tree previous_class_values;
        !           484: 
        !           485: 
        !           486: 
        !           487: #ifdef NeXT
        !           488: #ifdef HPPA
        !           489: extern void add_vararg_func(char *, char);
        !           490: #endif
        !           491: #endif
        !           492: 
        !           493: /* Allocate a level of searching.  */
        !           494: struct stack_level *
        !           495: push_decl_level (stack, obstack)
        !           496:      struct stack_level *stack;
        !           497:      struct obstack *obstack;
        !           498: {
        !           499:   struct stack_level tem;
        !           500:   tem.prev = stack;
        !           501: 
        !           502:   return push_stack_level (obstack, (char *)&tem, sizeof (tem));
        !           503: }
        !           504: 
        !           505: /* Discard a level of decl allocation.  */
        !           506: 
        !           507: static struct stack_level *
        !           508: pop_decl_level (stack)
        !           509:      struct stack_level *stack;
        !           510: {
        !           511: #if !NEW_CLASS_SCOPING
        !           512:   tree *bp, *tp;
        !           513:   struct obstack *obstack = stack->obstack;
        !           514:   bp = stack->first;
        !           515:   tp = (tree *)obstack_next_free (obstack);
        !           516:   while (tp != bp)
        !           517:     {
        !           518:       --tp;
        !           519:       if (*tp != NULL_TREE)
        !           520:        IDENTIFIER_CLASS_VALUE (DECL_NAME (*tp)) = NULL_TREE;
        !           521:     }
        !           522: #endif
        !           523:   return pop_stack_level (stack);
        !           524: }
        !           525: 
        !           526: /* For each binding contour we allocate a binding_level structure
        !           527:  * which records the names defined in that contour.
        !           528:  * Contours include:
        !           529:  *  0) the global one
        !           530:  *  1) one for each function definition,
        !           531:  *     where internal declarations of the parameters appear.
        !           532:  *  2) one for each compound statement,
        !           533:  *     to record its declarations.
        !           534:  *
        !           535:  * The current meaning of a name can be found by searching the levels from
        !           536:  * the current one out to the global one.
        !           537:  *
        !           538:  * Off to the side, may be the class_binding_level.  This exists
        !           539:  * only to catch class-local declarations.  It is otherwise
        !           540:  * nonexistent.
        !           541:  * 
        !           542:  * Also there may be binding levels that catch cleanups that
        !           543:  * must be run when exceptions occur.
        !           544:  */
        !           545: 
        !           546: /* Note that the information in the `names' component of the global contour
        !           547:    is duplicated in the IDENTIFIER_GLOBAL_VALUEs of all identifiers.  */
        !           548: 
        !           549: struct binding_level
        !           550:   {
        !           551:     /* A chain of _DECL nodes for all variables, constants, functions,
        !           552:      * and typedef types.  These are in the reverse of the order supplied.
        !           553:      */
        !           554:     tree names;
        !           555: 
        !           556:     /* A list of structure, union and enum definitions,
        !           557:      * for looking up tag names.
        !           558:      * It is a chain of TREE_LIST nodes, each of whose TREE_PURPOSE is a name,
        !           559:      * or NULL_TREE; and whose TREE_VALUE is a RECORD_TYPE, UNION_TYPE,
        !           560:      * or ENUMERAL_TYPE node.
        !           561:      *
        !           562:      * C++: the TREE_VALUE nodes can be simple types for component_bindings.
        !           563:      *
        !           564:      */
        !           565:     tree tags;
        !           566: 
        !           567:     /* For each level, a list of shadowed outer-level local definitions
        !           568:        to be restored when this level is popped.
        !           569:        Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and
        !           570:        whose TREE_VALUE is its old definition (a kind of ..._DECL node).  */
        !           571:     tree shadowed;
        !           572: 
        !           573:     /* Same, for IDENTIFIER_CLASS_VALUE.  */
        !           574:     tree class_shadowed;
        !           575: 
        !           576:     /* Same, for IDENTIFIER_TYPE_VALUE.  */
        !           577:     tree type_shadowed;
        !           578: 
        !           579:     /* For each level (except not the global one),
        !           580:        a chain of BLOCK nodes for all the levels
        !           581:        that were entered and exited one level down.  */
        !           582:     tree blocks;
        !           583: 
        !           584:     /* The BLOCK node for this level, if one has been preallocated.
        !           585:        If 0, the BLOCK is allocated (if needed) when the level is popped.  */
        !           586:     tree this_block;
        !           587: 
        !           588:     /* The binding level which this one is contained in (inherits from).  */
        !           589:     struct binding_level *level_chain;
        !           590: 
        !           591:     /* Number of decls in `names' that have incomplete 
        !           592:        structure or union types.  */
        !           593:     unsigned short n_incomplete;
        !           594: 
        !           595:     /* 1 for the level that holds the parameters of a function.
        !           596:        2 for the level that holds a class declaration.
        !           597:        3 for levels that hold parameter declarations.  */
        !           598:     unsigned parm_flag : 4;
        !           599: 
        !           600:     /* 1 means make a BLOCK for this level regardless of all else.
        !           601:        2 for temporary binding contours created by the compiler.  */
        !           602:     unsigned keep : 3;
        !           603: 
        !           604:     /* Nonzero if this level "doesn't exist" for tags.  */
        !           605:     unsigned tag_transparent : 1;
        !           606: 
        !           607:     /* Nonzero if this level can safely have additional
        !           608:        cleanup-needing variables added to it.  */
        !           609:     unsigned more_cleanups_ok : 1;
        !           610:     unsigned have_cleanups : 1;
        !           611: 
        !           612:     /* Nonzero if this level can safely have additional
        !           613:        exception-raising statements added to it.  */
        !           614:     unsigned more_exceptions_ok : 1;
        !           615:     unsigned have_exceptions : 1;
        !           616: 
        !           617:     /* Nonzero if we should accept any name as an identifier in
        !           618:        this scope.  This happens in some template definitions.  */
        !           619:     unsigned accept_any : 1;
        !           620: 
        !           621:     /* Nonzero if this level is for completing a template class definition
        !           622:        inside a binding level that temporarily binds the parameters.  This
        !           623:        means that definitions here should not be popped off when unwinding
        !           624:        this binding level.  (Not actually implemented this way,
        !           625:        unfortunately.)  */
        !           626:     unsigned pseudo_global : 1;
        !           627: 
        !           628:     /* Two bits left for this word.  */
        !           629: 
        !           630: #if defined(DEBUG_CP_BINDING_LEVELS)
        !           631:     /* Binding depth at which this level began.  */
        !           632:     unsigned binding_depth;
        !           633: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
        !           634:   };
        !           635: 
        !           636: #define NULL_BINDING_LEVEL ((struct binding_level *) NULL)
        !           637:   
        !           638: /* The binding level currently in effect.  */
        !           639: 
        !           640: static struct binding_level *current_binding_level;
        !           641: 
        !           642: /* The binding level of the current class, if any.  */
        !           643: 
        !           644: static struct binding_level *class_binding_level;
        !           645: 
        !           646: /* A chain of binding_level structures awaiting reuse.  */
        !           647: 
        !           648: static struct binding_level *free_binding_level;
        !           649: 
        !           650: /* The outermost binding level, for names of file scope.
        !           651:    This is created when the compiler is started and exists
        !           652:    through the entire run.  */
        !           653: 
        !           654: static struct binding_level *global_binding_level;
        !           655: 
        !           656: /* Binding level structures are initialized by copying this one.  */
        !           657: 
        !           658: static struct binding_level clear_binding_level;
        !           659: 
        !           660: /* Nonzero means unconditionally make a BLOCK for the next level pushed.  */
        !           661: 
        !           662: static int keep_next_level_flag;
        !           663: 
        !           664: #if defined(DEBUG_CP_BINDING_LEVELS)
        !           665: static int binding_depth = 0;
        !           666: static int is_class_level = 0;
        !           667: 
        !           668: static void
        !           669: indent ()
        !           670: {
        !           671:   register unsigned i;
        !           672: 
        !           673:   for (i = 0; i < binding_depth*2; i++)
        !           674:     putc (' ', stderr);
        !           675: }
        !           676: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
        !           677: 
        !           678: static void
        !           679: push_binding_level (newlevel, tag_transparent, keep)
        !           680:      struct binding_level *newlevel;
        !           681:      int tag_transparent, keep;
        !           682: {
        !           683:   /* Add this level to the front of the chain (stack) of levels that
        !           684:      are active.  */
        !           685:   *newlevel = clear_binding_level;
        !           686:   if (class_binding_level)
        !           687:     {
        !           688:       newlevel->level_chain = class_binding_level;
        !           689:       class_binding_level = (struct binding_level *)0;
        !           690:     }
        !           691:   else
        !           692:     {
        !           693:       newlevel->level_chain = current_binding_level;
        !           694:     }
        !           695:   current_binding_level = newlevel;
        !           696:   newlevel->tag_transparent = tag_transparent;
        !           697:   newlevel->more_cleanups_ok = 1;
        !           698:   newlevel->more_exceptions_ok = 1;
        !           699:   newlevel->keep = keep;
        !           700: #if defined(DEBUG_CP_BINDING_LEVELS)
        !           701:   newlevel->binding_depth = binding_depth;
        !           702:   indent ();
        !           703:   fprintf (stderr, "push %s level 0x%08x line %d\n",
        !           704:           (is_class_level) ? "class" : "block", newlevel, lineno);
        !           705:   is_class_level = 0;
        !           706:   binding_depth++;
        !           707: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
        !           708: }
        !           709: 
        !           710: static void
        !           711: pop_binding_level ()
        !           712: {
        !           713:   if (class_binding_level)
        !           714:     current_binding_level = class_binding_level;
        !           715: 
        !           716:   if (global_binding_level)
        !           717:     {
        !           718:       /* cannot pop a level, if there are none left to pop. */
        !           719:       if (current_binding_level == global_binding_level)
        !           720:        my_friendly_abort (123);
        !           721:     }
        !           722:   /* Pop the current level, and free the structure for reuse.  */
        !           723: #if defined(DEBUG_CP_BINDING_LEVELS)
        !           724:   binding_depth--;
        !           725:   indent ();
        !           726:   fprintf (stderr, "pop  %s level 0x%08x line %d\n",
        !           727:          (is_class_level) ? "class" : "block",
        !           728:          current_binding_level, lineno);
        !           729:   if (is_class_level != (current_binding_level == class_binding_level))
        !           730: #if 0 /* XXX Don't abort when we're watching how things are being managed.  */
        !           731:     abort ();
        !           732: #else
        !           733:   {
        !           734:     indent ();
        !           735:     fprintf (stderr, "XXX is_class_level != (current_binding_level == class_binding_level)\n");
        !           736:   }
        !           737: #endif
        !           738:   is_class_level = 0;
        !           739: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
        !           740:   {
        !           741:     register struct binding_level *level = current_binding_level;
        !           742:     current_binding_level = current_binding_level->level_chain;
        !           743:     level->level_chain = free_binding_level;
        !           744: #if 0 /* defined(DEBUG_CP_BINDING_LEVELS) */
        !           745:     if (level->binding_depth != binding_depth)
        !           746:       abort ();
        !           747: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
        !           748:       free_binding_level = level;
        !           749: 
        !           750:     class_binding_level = current_binding_level;
        !           751:     if (class_binding_level->parm_flag != 2)
        !           752:       class_binding_level = 0;
        !           753:     while (current_binding_level->parm_flag == 2)
        !           754:       current_binding_level = current_binding_level->level_chain;
        !           755:   }
        !           756: }
        !           757: 
        !           758: /* Nonzero if we are currently in the global binding level.  */
        !           759: 
        !           760: int
        !           761: global_bindings_p ()
        !           762: {
        !           763:   return current_binding_level == global_binding_level;
        !           764: }
        !           765: 
        !           766: void
        !           767: keep_next_level ()
        !           768: {
        !           769:   keep_next_level_flag = 1;
        !           770: }
        !           771: 
        !           772: /* Nonzero if the current level needs to have a BLOCK made.  */
        !           773: 
        !           774: int
        !           775: kept_level_p ()
        !           776: {
        !           777:   return (current_binding_level->blocks != NULL_TREE
        !           778:          || current_binding_level->keep
        !           779:          || current_binding_level->names != NULL_TREE
        !           780:          || (current_binding_level->tags != NULL_TREE
        !           781:              && !current_binding_level->tag_transparent));
        !           782: }
        !           783: 
        !           784: /* Identify this binding level as a level of parameters.  */
        !           785: 
        !           786: void
        !           787: declare_parm_level ()
        !           788: {
        !           789:   current_binding_level->parm_flag = 1;
        !           790: }
        !           791: 
        !           792: /* Identify this binding level as a level of a default exception handler.  */
        !           793: 
        !           794: void
        !           795: declare_implicit_exception ()
        !           796: {
        !           797:   current_binding_level->parm_flag = 3;
        !           798: }
        !           799: 
        !           800: /* Nonzero if current binding contour contains expressions
        !           801:    that might raise exceptions.  */
        !           802: 
        !           803: int
        !           804: have_exceptions_p ()
        !           805: {
        !           806:   return current_binding_level->have_exceptions;
        !           807: }
        !           808: 
        !           809: void
        !           810: declare_uninstantiated_type_level ()
        !           811: {
        !           812:   current_binding_level->accept_any = 1;
        !           813: }
        !           814: 
        !           815: int
        !           816: uninstantiated_type_level_p ()
        !           817: {
        !           818:   return current_binding_level->accept_any;
        !           819: }
        !           820: 
        !           821: void
        !           822: declare_pseudo_global_level ()
        !           823: {
        !           824:   current_binding_level->pseudo_global = 1;
        !           825: }
        !           826: 
        !           827: int
        !           828: pseudo_global_level_p ()
        !           829: {
        !           830:   return current_binding_level->pseudo_global;
        !           831: }
        !           832: 
        !           833: void
        !           834: set_class_shadows (shadows)
        !           835:      tree shadows;
        !           836: {
        !           837:   class_binding_level->class_shadowed = shadows;
        !           838: }
        !           839: 
        !           840: /* Enter a new binding level.
        !           841:    If TAG_TRANSPARENT is nonzero, do so only for the name space of variables,
        !           842:    not for that of tags.  */
        !           843: 
        !           844: void
        !           845: pushlevel (tag_transparent)
        !           846:      int tag_transparent;
        !           847: {
        !           848:   register struct binding_level *newlevel = NULL_BINDING_LEVEL;
        !           849: 
        !           850:   /* If this is the top level of a function,
        !           851:      just make sure that NAMED_LABELS is 0.
        !           852:      They should have been set to 0 at the end of the previous function.  */
        !           853: 
        !           854:   if (current_binding_level == global_binding_level)
        !           855:     my_friendly_assert (named_labels == NULL_TREE, 134);
        !           856: 
        !           857:   /* Reuse or create a struct for this binding level.  */
        !           858: 
        !           859: #if defined(DEBUG_CP_BINDING_LEVELS)
        !           860:   if (0)
        !           861: #else /* !defined(DEBUG_CP_BINDING_LEVELS) */
        !           862:   if (free_binding_level)
        !           863: #endif /* !defined(DEBUG_CP_BINDING_LEVELS) */
        !           864:     {
        !           865:       newlevel = free_binding_level;
        !           866:       free_binding_level = free_binding_level->level_chain;
        !           867:     }
        !           868:   else
        !           869:     {
        !           870:       /* Create a new `struct binding_level'.  */
        !           871:       newlevel = (struct binding_level *) xmalloc (sizeof (struct binding_level));
        !           872:     }
        !           873:   push_binding_level (newlevel, tag_transparent, keep_next_level_flag);
        !           874:   GNU_xref_start_scope ((HOST_WIDE_INT) newlevel);
        !           875:   keep_next_level_flag = 0;
        !           876: }
        !           877: 
        !           878: void
        !           879: pushlevel_temporary (tag_transparent)
        !           880:      int tag_transparent;
        !           881: {
        !           882:   pushlevel (tag_transparent);
        !           883:   current_binding_level->keep = 2;
        !           884:   clear_last_expr ();
        !           885: 
        !           886:   /* Note we don't call push_momentary() here.  Otherwise, it would cause
        !           887:      cleanups to be allocated on the momentary obstack, and they will be
        !           888:      overwritten by the next statement.  */
        !           889: 
        !           890:   expand_start_bindings (0);
        !           891: }
        !           892: 
        !           893: /* Exit a binding level.
        !           894:    Pop the level off, and restore the state of the identifier-decl mappings
        !           895:    that were in effect when this level was entered.
        !           896: 
        !           897:    If KEEP == 1, this level had explicit declarations, so
        !           898:    and create a "block" (a BLOCK node) for the level
        !           899:    to record its declarations and subblocks for symbol table output.
        !           900: 
        !           901:    If KEEP == 2, this level's subblocks go to the front,
        !           902:    not the back of the current binding level.  This happens,
        !           903:    for instance, when code for constructors and destructors
        !           904:    need to generate code at the end of a function which must
        !           905:    be moved up to the front of the function.
        !           906: 
        !           907:    If FUNCTIONBODY is nonzero, this level is the body of a function,
        !           908:    so create a block as if KEEP were set and also clear out all
        !           909:    label names.
        !           910: 
        !           911:    If REVERSE is nonzero, reverse the order of decls before putting
        !           912:    them into the BLOCK.  */
        !           913: 
        !           914: tree
        !           915: poplevel (keep, reverse, functionbody)
        !           916:      int keep;
        !           917:      int reverse;
        !           918:      int functionbody;
        !           919: {
        !           920:   register tree link;
        !           921:   /* The chain of decls was accumulated in reverse order.
        !           922:      Put it into forward order, just for cleanliness.  */
        !           923:   tree decls;
        !           924:   int tmp = functionbody;
        !           925:   int implicit_try_block = current_binding_level->parm_flag == 3;
        !           926:   int real_functionbody = current_binding_level->keep == 2
        !           927:     ? ((functionbody = 0), tmp) : functionbody;
        !           928:   tree tags = functionbody >= 0 ? current_binding_level->tags : 0;
        !           929:   tree subblocks = functionbody >= 0 ? current_binding_level->blocks : 0;
        !           930:   tree block = NULL_TREE;
        !           931:   tree decl;
        !           932:   int block_previously_created;
        !           933: 
        !           934:   GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level,
        !           935:                      (HOST_WIDE_INT) current_binding_level->level_chain,
        !           936:                      current_binding_level->parm_flag,
        !           937:                      current_binding_level->keep,
        !           938:                      current_binding_level->tag_transparent);
        !           939: 
        !           940:   if (current_binding_level->keep == 1)
        !           941:     keep = 1;
        !           942: 
        !           943:   /* This warning is turned off because it causes warnings for
        !           944:      declarations like `extern struct foo *x'.  */
        !           945: #if 0
        !           946:   /* Warn about incomplete structure types in this level.  */
        !           947:   for (link = tags; link; link = TREE_CHAIN (link))
        !           948:     if (TYPE_SIZE (TREE_VALUE (link)) == NULL_TREE)
        !           949:       {
        !           950:        tree type = TREE_VALUE (link);
        !           951:        char *errmsg;
        !           952:        switch (TREE_CODE (type))
        !           953:          {
        !           954:          case RECORD_TYPE:
        !           955:            errmsg = "`struct %s' incomplete in scope ending here";
        !           956:            break;
        !           957:          case UNION_TYPE:
        !           958:            errmsg = "`union %s' incomplete in scope ending here";
        !           959:            break;
        !           960:          case ENUMERAL_TYPE:
        !           961:            errmsg = "`enum %s' incomplete in scope ending here";
        !           962:            break;
        !           963:          }
        !           964:        if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
        !           965:          error (errmsg, IDENTIFIER_POINTER (TYPE_NAME (type)));
        !           966:        else
        !           967:          /* If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL.  */
        !           968:          error (errmsg, TYPE_NAME_STRING (type));
        !           969:       }
        !           970: #endif /* 0 */
        !           971: 
        !           972:   /* Get the decls in the order they were written.
        !           973:      Usually current_binding_level->names is in reverse order.
        !           974:      But parameter decls were previously put in forward order.  */
        !           975: 
        !           976:   if (reverse)
        !           977:     current_binding_level->names
        !           978:       = decls = nreverse (current_binding_level->names);
        !           979:   else
        !           980:     decls = current_binding_level->names;
        !           981: 
        !           982:   /* Output any nested inline functions within this block
        !           983:      if they weren't already output.  */
        !           984: 
        !           985:   for (decl = decls; decl; decl = TREE_CHAIN (decl))
        !           986:     if (TREE_CODE (decl) == FUNCTION_DECL
        !           987:        && ! TREE_ASM_WRITTEN (decl)
        !           988:        && DECL_INITIAL (decl) != NULL_TREE
        !           989:        && TREE_ADDRESSABLE (decl))
        !           990:       {
        !           991:        /* If this decl was copied from a file-scope decl
        !           992:           on account of a block-scope extern decl,
        !           993:           propagate TREE_ADDRESSABLE to the file-scope decl.  */
        !           994:        if (DECL_ABSTRACT_ORIGIN (decl) != NULL_TREE)
        !           995:          TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
        !           996:        else
        !           997:          {
        !           998:            push_function_context ();
        !           999:            output_inline_function (decl);
        !          1000:            pop_function_context ();
        !          1001:          }
        !          1002:       }
        !          1003: 
        !          1004:   /* If there were any declarations or structure tags in that level,
        !          1005:      or if this level is a function body,
        !          1006:      create a BLOCK to record them for the life of this function.  */
        !          1007: 
        !          1008:   block = NULL_TREE;
        !          1009:   block_previously_created = (current_binding_level->this_block != NULL_TREE);
        !          1010:   if (block_previously_created)
        !          1011:     block = current_binding_level->this_block;
        !          1012:   else if (keep == 1 || functionbody)
        !          1013:     block = make_node (BLOCK);
        !          1014:   if (block != NULL_TREE)
        !          1015:     {
        !          1016:       BLOCK_VARS (block) = decls;
        !          1017:       BLOCK_TYPE_TAGS (block) = tags;
        !          1018:       BLOCK_SUBBLOCKS (block) = subblocks;
        !          1019:       /* If we created the block earlier on, and we are just diddling it now,
        !          1020:         then it already should have a proper BLOCK_END_NOTE value associated
        !          1021:         with it, so avoid trashing that.  Otherwise, for a new block, install
        !          1022:         a new BLOCK_END_NOTE value.  */
        !          1023:       if (! block_previously_created)
        !          1024:        remember_end_note (block);
        !          1025:     }
        !          1026: 
        !          1027:   /* In each subblock, record that this is its superior.  */
        !          1028: 
        !          1029:   if (keep >= 0)
        !          1030:     for (link = subblocks; link; link = TREE_CHAIN (link))
        !          1031:       BLOCK_SUPERCONTEXT (link) = block;
        !          1032: 
        !          1033:   /* Clear out the meanings of the local variables of this level.  */
        !          1034: 
        !          1035:   for (link = decls; link; link = TREE_CHAIN (link))
        !          1036:     {
        !          1037:       if (DECL_NAME (link) != NULL_TREE)
        !          1038:        {
        !          1039:          /* If the ident. was used or addressed via a local extern decl,
        !          1040:             don't forget that fact.  */
        !          1041:          if (DECL_EXTERNAL (link))
        !          1042:            {
        !          1043:              if (TREE_USED (link))
        !          1044:                TREE_USED (DECL_ASSEMBLER_NAME (link)) = 1;
        !          1045:              if (TREE_ADDRESSABLE (link))
        !          1046:                TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
        !          1047:            }
        !          1048:          IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = NULL_TREE;
        !          1049:        }
        !          1050:     }
        !          1051: 
        !          1052:   /* Restore all name-meanings of the outer levels
        !          1053:      that were shadowed by this level.  */
        !          1054: 
        !          1055:   for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
        !          1056:     IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
        !          1057:   for (link = current_binding_level->class_shadowed;
        !          1058:        link; link = TREE_CHAIN (link))
        !          1059:     IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
        !          1060:   for (link = current_binding_level->type_shadowed;
        !          1061:        link; link = TREE_CHAIN (link))
        !          1062:     IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
        !          1063: 
        !          1064:   /* If the level being exited is the top level of a function,
        !          1065:      check over all the labels.  */
        !          1066: 
        !          1067:   if (functionbody)
        !          1068:     {
        !          1069:       /* If this is the top level block of a function,
        !          1070:          the vars are the function's parameters.
        !          1071:          Don't leave them in the BLOCK because they are
        !          1072:          found in the FUNCTION_DECL instead.  */
        !          1073: 
        !          1074:       BLOCK_VARS (block) = 0;
        !          1075: 
        !          1076:       /* Clear out the definitions of all label names,
        !          1077:         since their scopes end here.  */
        !          1078: 
        !          1079:       for (link = named_labels; link; link = TREE_CHAIN (link))
        !          1080:        {
        !          1081:          register tree label = TREE_VALUE (link);
        !          1082: 
        !          1083:          if (DECL_INITIAL (label) == NULL_TREE)
        !          1084:            {
        !          1085:              cp_error_at ("label `%D' used but not defined", label);
        !          1086:              /* Avoid crashing later.  */
        !          1087:              define_label (input_filename, 1, DECL_NAME (label));
        !          1088:            }
        !          1089:          else if (warn_unused && !TREE_USED (label))
        !          1090:            cp_warning_at ("label `%D' defined but not used", label);
        !          1091:          SET_IDENTIFIER_LABEL_VALUE (DECL_NAME (label), NULL_TREE);
        !          1092: 
        !          1093:           /* Put the labels into the "variables" of the
        !          1094:              top-level block, so debugger can see them.  */
        !          1095:           TREE_CHAIN (label) = BLOCK_VARS (block);
        !          1096:           BLOCK_VARS (block) = label;
        !          1097:        }
        !          1098: 
        !          1099:       named_labels = NULL_TREE;
        !          1100:     }
        !          1101: 
        !          1102:   /* Any uses of undefined labels now operate under constraints
        !          1103:      of next binding contour.  */
        !          1104:   {
        !          1105:     struct binding_level *level_chain;
        !          1106:     level_chain = current_binding_level->level_chain;
        !          1107:     if (level_chain)
        !          1108:       {
        !          1109:        tree labels;
        !          1110:        for (labels = named_label_uses; labels; labels = TREE_CHAIN (labels))
        !          1111:          if (TREE_TYPE (labels) == (tree)current_binding_level)
        !          1112:            {
        !          1113:              TREE_TYPE (labels) = (tree)level_chain;
        !          1114:              TREE_PURPOSE (labels) = level_chain->names;
        !          1115:            }
        !          1116:       }
        !          1117:   }
        !          1118: 
        !          1119:   tmp = current_binding_level->keep;
        !          1120: 
        !          1121:   pop_binding_level ();
        !          1122:   if (functionbody)
        !          1123:     DECL_INITIAL (current_function_decl) = block;
        !          1124:   else if (block)
        !          1125:     {
        !          1126:       if (!block_previously_created)
        !          1127:         current_binding_level->blocks
        !          1128:           = chainon (current_binding_level->blocks, block);
        !          1129:     }
        !          1130:   /* If we did not make a block for the level just exited,
        !          1131:      any blocks made for inner levels
        !          1132:      (since they cannot be recorded as subblocks in that level)
        !          1133:      must be carried forward so they will later become subblocks
        !          1134:      of something else.  */
        !          1135:   else if (subblocks)
        !          1136:     {
        !          1137:       if (keep == 2)
        !          1138:        current_binding_level->blocks
        !          1139:          = chainon (subblocks, current_binding_level->blocks);
        !          1140:       else
        !          1141:        current_binding_level->blocks
        !          1142:          = chainon (current_binding_level->blocks, subblocks);
        !          1143:     }
        !          1144: 
        !          1145:   /* Take care of compiler's internal binding structures.  */
        !          1146:   if (tmp == 2 && !implicit_try_block)
        !          1147:     {
        !          1148: #if 0
        !          1149:       /* We did not call push_momentary for this
        !          1150:         binding contour, so there is nothing to pop.  */
        !          1151:       pop_momentary ();
        !          1152: #endif
        !          1153:       expand_end_bindings (getdecls (), keep, 1);
        !          1154:       /* Each and every BLOCK node created here in `poplevel' is important
        !          1155:         (e.g. for proper debugging information) so if we created one
        !          1156:         earlier, mark it as "used".  */
        !          1157:       if (block)
        !          1158:        TREE_USED (block) = 1;
        !          1159:       block = poplevel (keep, reverse, real_functionbody);
        !          1160:     }
        !          1161: 
        !          1162:   /* Each and every BLOCK node created here in `poplevel' is important
        !          1163:      (e.g. for proper debugging information) so if we created one
        !          1164:      earlier, mark it as "used".  */
        !          1165:   if (block)
        !          1166:     TREE_USED (block) = 1;
        !          1167:   return block;
        !          1168: }
        !          1169: 
        !          1170: /* Delete the node BLOCK from the current binding level.
        !          1171:    This is used for the block inside a stmt expr ({...})
        !          1172:    so that the block can be reinserted where appropriate.  */
        !          1173: 
        !          1174: void
        !          1175: delete_block (block)
        !          1176:      tree block;
        !          1177: {
        !          1178:   tree t;
        !          1179:   if (current_binding_level->blocks == block)
        !          1180:     current_binding_level->blocks = TREE_CHAIN (block);
        !          1181:   for (t = current_binding_level->blocks; t;)
        !          1182:     {
        !          1183:       if (TREE_CHAIN (t) == block)
        !          1184:        TREE_CHAIN (t) = TREE_CHAIN (block);
        !          1185:       else
        !          1186:        t = TREE_CHAIN (t);
        !          1187:     }
        !          1188:   TREE_CHAIN (block) = NULL_TREE;
        !          1189:   /* Clear TREE_USED which is always set by poplevel.
        !          1190:      The flag is set again if insert_block is called.  */
        !          1191:   TREE_USED (block) = 0;
        !          1192: }
        !          1193: 
        !          1194: /* Insert BLOCK at the end of the list of subblocks of the
        !          1195:    current binding level.  This is used when a BIND_EXPR is expanded,
        !          1196:    to handle the BLOCK node inside the BIND_EXPR.  */
        !          1197: 
        !          1198: void
        !          1199: insert_block (block)
        !          1200:      tree block;
        !          1201: {
        !          1202:   TREE_USED (block) = 1;
        !          1203:   current_binding_level->blocks
        !          1204:     = chainon (current_binding_level->blocks, block);
        !          1205: }
        !          1206: 
        !          1207: /* Add BLOCK to the current list of blocks for this binding contour.  */
        !          1208: void
        !          1209: add_block_current_level (block)
        !          1210:      tree block;
        !          1211: {
        !          1212:   current_binding_level->blocks
        !          1213:     = chainon (current_binding_level->blocks, block);
        !          1214: }
        !          1215: 
        !          1216: /* Set the BLOCK node for the innermost scope
        !          1217:    (the one we are currently in).  */
        !          1218: 
        !          1219: void
        !          1220: set_block (block)
        !          1221:     register tree block;
        !          1222: {
        !          1223:   current_binding_level->this_block = block;
        !          1224: }
        !          1225: 
        !          1226: /* Do a pushlevel for class declarations.  */
        !          1227: void
        !          1228: pushlevel_class ()
        !          1229: {
        !          1230:   register struct binding_level *newlevel;
        !          1231: 
        !          1232:   /* Reuse or create a struct for this binding level.  */
        !          1233: #if defined(DEBUG_CP_BINDING_LEVELS)
        !          1234:   if (0)
        !          1235: #else /* !defined(DEBUG_CP_BINDING_LEVELS) */
        !          1236:   if (free_binding_level)
        !          1237: #endif /* !defined(DEBUG_CP_BINDING_LEVELS) */
        !          1238:     {
        !          1239:       newlevel = free_binding_level;
        !          1240:       free_binding_level = free_binding_level->level_chain;
        !          1241:     }
        !          1242:   else
        !          1243:     {
        !          1244:       /* Create a new `struct binding_level'.  */
        !          1245:       newlevel = (struct binding_level *) xmalloc (sizeof (struct binding_level));
        !          1246:     }
        !          1247: 
        !          1248: #if defined(DEBUG_CP_BINDING_LEVELS)
        !          1249:   is_class_level = 1;
        !          1250: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
        !          1251: 
        !          1252:   push_binding_level (newlevel, 0, 0);
        !          1253: 
        !          1254:   decl_stack = push_decl_level (decl_stack, &decl_obstack);
        !          1255:   class_binding_level = current_binding_level;
        !          1256:   class_binding_level->parm_flag = 2;
        !          1257:   /* We have just pushed into a new binding level.  Now, fake out the rest
        !          1258:      of the compiler.  Set the `current_binding_level' back to point to
        !          1259:      the most closely containing non-class binding level.  */
        !          1260:   do
        !          1261:     {
        !          1262:       current_binding_level = current_binding_level->level_chain;
        !          1263:     }
        !          1264:   while (current_binding_level->parm_flag == 2);
        !          1265: }
        !          1266: 
        !          1267: /* ...and a poplevel for class declarations.  */
        !          1268: tree
        !          1269: poplevel_class ()
        !          1270: {
        !          1271:   register struct binding_level *level = class_binding_level;
        !          1272:   tree block = NULL_TREE;
        !          1273:   tree shadowed;
        !          1274: 
        !          1275:   my_friendly_assert (level != 0, 354);
        !          1276:   
        !          1277:   decl_stack = pop_decl_level (decl_stack);
        !          1278: #if !NEW_CLASS_SCOPING
        !          1279:   for (shadowed = level->shadowed; shadowed; shadowed = TREE_CHAIN (shadowed))
        !          1280:     IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed);
        !          1281:   for (shadowed = level->class_shadowed; shadowed; shadowed = TREE_CHAIN (shadowed))
        !          1282:     IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed);
        !          1283:   for (shadowed = level->type_shadowed; shadowed; shadowed = TREE_CHAIN (shadowed))
        !          1284:     IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed);
        !          1285: #else
        !          1286:   for (shadowed = level->shadowed; shadowed; shadowed = TREE_CHAIN (shadowed))
        !          1287:     IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed);
        !          1288:   /* If we're leaving a toplevel class, don't bother to do the setting
        !          1289:      of IDENTIFER_CLASS_VALUE to NULL_TREE, since first of all this slot
        !          1290:      shouldn't even be used when current_class_type isn't set, and second,
        !          1291:      if we don't touch it here, we're able to use the caching effect if the
        !          1292:      next time we're entering a class scope, it is the same class.  */
        !          1293:   if (current_class_depth != 1)
        !          1294:     for (shadowed = level->class_shadowed;
        !          1295:         shadowed;
        !          1296:         shadowed = TREE_CHAIN (shadowed))
        !          1297:       IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed);
        !          1298:   else
        !          1299:     /* Remember to save what IDENTIFIER's were bound in this scope so we
        !          1300:        can recover from cache misses.  */
        !          1301:     previous_class_values = class_binding_level->class_shadowed;
        !          1302:   for (shadowed = level->type_shadowed;
        !          1303:        shadowed;
        !          1304:        shadowed = TREE_CHAIN (shadowed))
        !          1305:     IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed);
        !          1306: #endif
        !          1307: 
        !          1308:   GNU_xref_end_scope ((HOST_WIDE_INT) class_binding_level,
        !          1309:                      (HOST_WIDE_INT) class_binding_level->level_chain,
        !          1310:                      class_binding_level->parm_flag,
        !          1311:                      class_binding_level->keep,
        !          1312:                      class_binding_level->tag_transparent);
        !          1313: 
        !          1314:   if (class_binding_level->parm_flag != 2)
        !          1315:     class_binding_level = (struct binding_level *)0;
        !          1316: 
        !          1317:   /* Now, pop out of the the binding level which we created up in the
        !          1318:      `pushlevel_class' routine.  */
        !          1319: #if defined(DEBUG_CP_BINDING_LEVELS)
        !          1320:   is_class_level = 1;
        !          1321: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */
        !          1322: 
        !          1323:   pop_binding_level ();
        !          1324: 
        !          1325:   return block;
        !          1326: }
        !          1327: 
        !          1328: /* For debugging.  */
        !          1329: int no_print_functions = 0;
        !          1330: int no_print_builtins = 0;
        !          1331: 
        !          1332: void
        !          1333: print_binding_level (lvl)
        !          1334:      struct binding_level *lvl;
        !          1335: {
        !          1336:   tree t;
        !          1337:   int i = 0, len;
        !          1338:   fprintf (stderr, " blocks=");
        !          1339:   fprintf (stderr, HOST_PTR_PRINTF, lvl->blocks);
        !          1340:   fprintf (stderr, " n_incomplete=%d parm_flag=%d keep=%d",
        !          1341:           lvl->n_incomplete, lvl->parm_flag, lvl->keep);
        !          1342:   if (lvl->tag_transparent)
        !          1343:     fprintf (stderr, " tag-transparent");
        !          1344:   if (lvl->more_cleanups_ok)
        !          1345:     fprintf (stderr, " more-cleanups-ok");
        !          1346:   if (lvl->have_cleanups)
        !          1347:     fprintf (stderr, " have-cleanups");
        !          1348:   if (lvl->more_exceptions_ok)
        !          1349:     fprintf (stderr, " more-exceptions-ok");
        !          1350:   if (lvl->have_exceptions)
        !          1351:     fprintf (stderr, " have-exceptions");
        !          1352:   fprintf (stderr, "\n");
        !          1353:   if (lvl->names)
        !          1354:     {
        !          1355:       fprintf (stderr, " names:\t");
        !          1356:       /* We can probably fit 3 names to a line?  */
        !          1357:       for (t = lvl->names; t; t = TREE_CHAIN (t))
        !          1358:        {
        !          1359:          if (no_print_functions && (TREE_CODE(t) == FUNCTION_DECL)) 
        !          1360:            continue;
        !          1361:          if (no_print_builtins
        !          1362:              && (TREE_CODE(t) == TYPE_DECL)
        !          1363:              && (!strcmp(DECL_SOURCE_FILE(t),"<built-in>")))
        !          1364:            continue;
        !          1365: 
        !          1366:          /* Function decls tend to have longer names.  */
        !          1367:          if (TREE_CODE (t) == FUNCTION_DECL)
        !          1368:            len = 3;
        !          1369:          else
        !          1370:            len = 2;
        !          1371:          i += len;
        !          1372:          if (i > 6)
        !          1373:            {
        !          1374:              fprintf (stderr, "\n\t");
        !          1375:              i = len;
        !          1376:            }
        !          1377:          print_node_brief (stderr, "", t, 0);
        !          1378:          if (TREE_CODE (t) == ERROR_MARK)
        !          1379:            break;
        !          1380:        }
        !          1381:       if (i)
        !          1382:         fprintf (stderr, "\n");
        !          1383:     }
        !          1384:   if (lvl->tags)
        !          1385:     {
        !          1386:       fprintf (stderr, " tags:\t");
        !          1387:       i = 0;
        !          1388:       for (t = lvl->tags; t; t = TREE_CHAIN (t))
        !          1389:        {
        !          1390:          if (TREE_PURPOSE (t) == NULL_TREE)
        !          1391:            len = 3;
        !          1392:          else if (TREE_PURPOSE (t) == TYPE_IDENTIFIER (TREE_VALUE (t)))
        !          1393:            len = 2;
        !          1394:          else
        !          1395:            len = 4;
        !          1396:          i += len;
        !          1397:          if (i > 5)
        !          1398:            {
        !          1399:              fprintf (stderr, "\n\t");
        !          1400:              i = len;
        !          1401:            }
        !          1402:          if (TREE_PURPOSE (t) == NULL_TREE)
        !          1403:            {
        !          1404:              print_node_brief (stderr, "<unnamed-typedef", TREE_VALUE (t), 0);
        !          1405:              fprintf (stderr, ">");
        !          1406:            }
        !          1407:          else if (TREE_PURPOSE (t) == TYPE_IDENTIFIER (TREE_VALUE (t)))
        !          1408:            print_node_brief (stderr, "", TREE_VALUE (t), 0);
        !          1409:          else
        !          1410:            {
        !          1411:              print_node_brief (stderr, "<typedef", TREE_PURPOSE (t), 0);
        !          1412:              print_node_brief (stderr, "", TREE_VALUE (t), 0);
        !          1413:              fprintf (stderr, ">");
        !          1414:            }
        !          1415:        }
        !          1416:       if (i)
        !          1417:        fprintf (stderr, "\n");
        !          1418:     }
        !          1419:   if (lvl->shadowed)
        !          1420:     {
        !          1421:       fprintf (stderr, " shadowed:");
        !          1422:       for (t = lvl->shadowed; t; t = TREE_CHAIN (t))
        !          1423:        {
        !          1424:          fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t)));
        !          1425:        }
        !          1426:       fprintf (stderr, "\n");
        !          1427:     }
        !          1428:   if (lvl->class_shadowed)
        !          1429:     {
        !          1430:       fprintf (stderr, " class-shadowed:");
        !          1431:       for (t = lvl->class_shadowed; t; t = TREE_CHAIN (t))
        !          1432:        {
        !          1433:          fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t)));
        !          1434:        }
        !          1435:       fprintf (stderr, "\n");
        !          1436:     }
        !          1437:   if (lvl->type_shadowed)
        !          1438:     {
        !          1439:       fprintf (stderr, " type-shadowed:");
        !          1440:       for (t = lvl->type_shadowed; t; t = TREE_CHAIN (t))
        !          1441:         {
        !          1442: #if 0
        !          1443:           fprintf (stderr, "\n\t");
        !          1444:           print_node_brief (stderr, "<", TREE_PURPOSE (t), 0);
        !          1445:           if (TREE_VALUE (t))
        !          1446:             print_node_brief (stderr, " ", TREE_VALUE (t), 0);
        !          1447:           else
        !          1448:             fprintf (stderr, " (none)");
        !          1449:           fprintf (stderr, ">");
        !          1450: #else
        !          1451:          fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t)));
        !          1452: #endif
        !          1453:         }
        !          1454:       fprintf (stderr, "\n");
        !          1455:     }
        !          1456: }
        !          1457: 
        !          1458: void
        !          1459: print_other_binding_stack (stack)
        !          1460:      struct binding_level *stack;
        !          1461: {
        !          1462:   struct binding_level *level;
        !          1463:   for (level = stack; level != global_binding_level; level = level->level_chain)
        !          1464:     {
        !          1465:       fprintf (stderr, "binding level ");
        !          1466:       fprintf (stderr, HOST_PTR_PRINTF, level);
        !          1467:       fprintf (stderr, "\n");
        !          1468:       print_binding_level (level);
        !          1469:     }
        !          1470: }
        !          1471: 
        !          1472: void
        !          1473: print_binding_stack ()
        !          1474: {
        !          1475:   struct binding_level *b;
        !          1476:   fprintf (stderr, "current_binding_level=");
        !          1477:   fprintf (stderr, HOST_PTR_PRINTF, current_binding_level);
        !          1478:   fprintf (stderr, "\nclass_binding_level=");
        !          1479:   fprintf (stderr, HOST_PTR_PRINTF, class_binding_level);
        !          1480:   fprintf (stderr, "\nglobal_binding_level=");
        !          1481:   fprintf (stderr, HOST_PTR_PRINTF, global_binding_level);
        !          1482:   fprintf (stderr, "\n");
        !          1483:   if (class_binding_level)
        !          1484:     {
        !          1485:       for (b = class_binding_level; b; b = b->level_chain)
        !          1486:        if (b == current_binding_level)
        !          1487:          break;
        !          1488:       if (b)
        !          1489:        b = class_binding_level;
        !          1490:       else
        !          1491:        b = current_binding_level;
        !          1492:     }
        !          1493:   else
        !          1494:     b = current_binding_level;
        !          1495:   print_other_binding_stack (b);
        !          1496:   fprintf (stderr, "global:\n");
        !          1497:   print_binding_level (global_binding_level);
        !          1498: }
        !          1499: 
        !          1500: /* Subroutines for reverting temporarily to top-level for instantiation
        !          1501:    of templates and such.  We actually need to clear out the class- and
        !          1502:    local-value slots of all identifiers, so that only the global values
        !          1503:    are at all visible.  Simply setting current_binding_level to the global
        !          1504:    scope isn't enough, because more binding levels may be pushed.  */
        !          1505: struct saved_scope {
        !          1506:   struct binding_level *old_binding_level;
        !          1507:   tree old_bindings;
        !          1508:   struct saved_scope *prev;
        !          1509:   tree class_name, class_type, class_decl, function_decl;
        !          1510:   struct binding_level *class_bindings;
        !          1511:   tree previous_class_type;
        !          1512: };
        !          1513: static struct saved_scope *current_saved_scope;
        !          1514: extern tree prev_class_type;
        !          1515: 
        !          1516: void
        !          1517: push_to_top_level ()
        !          1518: {
        !          1519:   struct saved_scope *s =
        !          1520:     (struct saved_scope *) xmalloc (sizeof (struct saved_scope));
        !          1521:   struct binding_level *b = current_binding_level;
        !          1522:   tree old_bindings = NULL_TREE;
        !          1523: 
        !          1524:   /* Have to include global_binding_level, because class-level decls
        !          1525:      aren't listed anywhere useful.  */
        !          1526:   for (; b; b = b->level_chain)
        !          1527:     {
        !          1528:       tree t;
        !          1529:       for (t = b->names; t; t = TREE_CHAIN (t))
        !          1530:        if (b != global_binding_level)
        !          1531:          {
        !          1532:            tree binding, t1, t2 = t;
        !          1533:            tree id = DECL_ASSEMBLER_NAME (t2);
        !          1534: 
        !          1535:            if (!id
        !          1536:                || (!IDENTIFIER_LOCAL_VALUE (id)
        !          1537:                    && !IDENTIFIER_CLASS_VALUE (id)))
        !          1538:              continue;
        !          1539: 
        !          1540:            for (t1 = old_bindings; t1; t1 = TREE_CHAIN (t1))
        !          1541:              if (TREE_VEC_ELT (t1, 0) == id)
        !          1542:                goto skip_it;
        !          1543:            
        !          1544:            binding = make_tree_vec (4);
        !          1545:            if (id)
        !          1546:              {
        !          1547:                my_friendly_assert (TREE_CODE (id) == IDENTIFIER_NODE, 135);
        !          1548:                TREE_VEC_ELT (binding, 0) = id;
        !          1549:                TREE_VEC_ELT (binding, 1) = IDENTIFIER_TYPE_VALUE (id);
        !          1550:                TREE_VEC_ELT (binding, 2) = IDENTIFIER_LOCAL_VALUE (id);
        !          1551:                TREE_VEC_ELT (binding, 3) = IDENTIFIER_CLASS_VALUE (id);
        !          1552:                IDENTIFIER_LOCAL_VALUE (id) = NULL_TREE;
        !          1553:                IDENTIFIER_CLASS_VALUE (id) = NULL_TREE;
        !          1554: #if !NEW_CLASS_SCOPING
        !          1555:                /* The type unwinding below should take care of this.  */
        !          1556:                adjust_type_value (id);
        !          1557: #endif
        !          1558:              }
        !          1559:            TREE_CHAIN (binding) = old_bindings;
        !          1560:            old_bindings = binding;
        !          1561:            skip_it:
        !          1562:            ;
        !          1563:          }
        !          1564:       /* Unwind type-value slots back to top level.  */
        !          1565:       if (b != global_binding_level)
        !          1566:         for (t = b->type_shadowed; t; t = TREE_CHAIN (t))
        !          1567:           SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (t), TREE_VALUE (t));
        !          1568:     }
        !          1569: 
        !          1570:   s->old_binding_level = current_binding_level;
        !          1571:   current_binding_level = global_binding_level;
        !          1572: 
        !          1573:   s->class_name = current_class_name;
        !          1574:   s->class_type = current_class_type;
        !          1575:   s->class_decl = current_class_decl;
        !          1576:   s->function_decl = current_function_decl;
        !          1577:   s->class_bindings = class_binding_level;
        !          1578:   s->previous_class_type = previous_class_type;
        !          1579:   current_class_name = current_class_type = current_class_decl = NULL_TREE;
        !          1580:   current_function_decl = NULL_TREE;
        !          1581:   class_binding_level = (struct binding_level *)0;
        !          1582:   previous_class_type = NULL_TREE;
        !          1583: 
        !          1584:   s->prev = current_saved_scope;
        !          1585:   s->old_bindings = old_bindings;
        !          1586:   current_saved_scope = s;
        !          1587: }
        !          1588: 
        !          1589: void
        !          1590: pop_from_top_level ()
        !          1591: {
        !          1592:   struct saved_scope *s = current_saved_scope;
        !          1593:   tree t;
        !          1594: 
        !          1595:   if (previous_class_type)
        !          1596:     previous_class_type = NULL_TREE;
        !          1597: 
        !          1598:   current_binding_level = s->old_binding_level;
        !          1599:   current_saved_scope = s->prev;
        !          1600:   for (t = s->old_bindings; t; t = TREE_CHAIN (t))
        !          1601:     {
        !          1602:       tree id = TREE_VEC_ELT (t, 0);
        !          1603:       if (id)
        !          1604:        {
        !          1605:          IDENTIFIER_TYPE_VALUE (id) = TREE_VEC_ELT (t, 1);
        !          1606:          IDENTIFIER_LOCAL_VALUE (id) = TREE_VEC_ELT (t, 2);
        !          1607:          IDENTIFIER_CLASS_VALUE (id) = TREE_VEC_ELT (t, 3);
        !          1608:        }
        !          1609:     }
        !          1610:   current_class_name = s->class_name;
        !          1611:   current_class_type = s->class_type;
        !          1612:   current_class_decl = s->class_decl;
        !          1613:   if (current_class_type)
        !          1614:     C_C_D = CLASSTYPE_INST_VAR (current_class_type);
        !          1615:   else
        !          1616:     C_C_D = NULL_TREE;
        !          1617:   current_function_decl = s->function_decl;
        !          1618:   class_binding_level = s->class_bindings;
        !          1619:   previous_class_type = s->previous_class_type;
        !          1620:   free (s);
        !          1621: }
        !          1622: 
        !          1623: /* Push a definition of struct, union or enum tag "name".
        !          1624:    "type" should be the type node.
        !          1625:    We assume that the tag "name" is not already defined.
        !          1626: 
        !          1627:    Note that the definition may really be just a forward reference.
        !          1628:    In that case, the TYPE_SIZE will be a NULL_TREE.
        !          1629: 
        !          1630:    C++ gratuitously puts all these tags in the name space. */
        !          1631: 
        !          1632: /* When setting the IDENTIFIER_TYPE_VALUE field of an identifier ID,
        !          1633:    record the shadowed value for this binding contour.  TYPE is
        !          1634:    the type that ID maps to.  */
        !          1635: void
        !          1636: set_identifier_type_value (id, type)
        !          1637:      tree id;
        !          1638:      tree type;
        !          1639: {
        !          1640: #if NEW_CLASS_SCOPING
        !          1641:   if (class_binding_level)
        !          1642:     {
        !          1643:       tree old_type_value = IDENTIFIER_TYPE_VALUE (id);
        !          1644:       class_binding_level->type_shadowed
        !          1645:        = tree_cons (id, old_type_value, class_binding_level->type_shadowed);
        !          1646:     }      
        !          1647:   else if (current_binding_level != global_binding_level)
        !          1648:     {
        !          1649:       tree old_type_value = IDENTIFIER_TYPE_VALUE (id);
        !          1650:       current_binding_level->type_shadowed
        !          1651:        = tree_cons (id, old_type_value, current_binding_level->type_shadowed);
        !          1652:     }
        !          1653: #else
        !          1654:   if (current_binding_level != global_binding_level)
        !          1655:     {
        !          1656:       tree old_type_value = IDENTIFIER_TYPE_VALUE (id);
        !          1657:       current_binding_level->type_shadowed
        !          1658:        = tree_cons (id, old_type_value, current_binding_level->type_shadowed);
        !          1659:     }
        !          1660:   else if (class_binding_level)
        !          1661:     {
        !          1662:       tree old_type_value = IDENTIFIER_TYPE_VALUE (id);
        !          1663:       class_binding_level->type_shadowed
        !          1664:        = tree_cons (id, old_type_value, class_binding_level->type_shadowed);
        !          1665:     }      
        !          1666: #endif
        !          1667:   SET_IDENTIFIER_TYPE_VALUE (id, type);
        !          1668: }
        !          1669: 
        !          1670: /*
        !          1671:  * local values can need to be shadowed too, but it only happens
        !          1672:  * explicitly from pushdecl, in support of nested enums.
        !          1673:  */
        !          1674: void
        !          1675: set_identifier_local_value (id, type)
        !          1676:      tree id;
        !          1677:      tree type;
        !          1678: {
        !          1679:   if (current_binding_level != global_binding_level)
        !          1680:     {
        !          1681:       tree old_local_value = IDENTIFIER_LOCAL_VALUE (id);
        !          1682:       current_binding_level->shadowed
        !          1683:        = tree_cons (id, old_local_value, current_binding_level->shadowed);
        !          1684:     }
        !          1685:   else if (class_binding_level)
        !          1686:     {
        !          1687:       tree old_local_value = IDENTIFIER_LOCAL_VALUE (id);
        !          1688:       class_binding_level->shadowed
        !          1689:        = tree_cons (id, old_local_value, class_binding_level->shadowed);
        !          1690:     }      
        !          1691:   IDENTIFIER_LOCAL_VALUE (id) = type;
        !          1692: 
        !          1693: #if NEW_CLASS_SCOPING
        !          1694:   /* If this is a TYPE_DECL, push it into the type value slot.  */
        !          1695:   if (TREE_CODE (type) == TYPE_DECL)
        !          1696:     set_identifier_type_value (id, TREE_TYPE (type));
        !          1697: #endif
        !          1698: }
        !          1699: 
        !          1700: /* Subroutine "set_nested_typename" builds the nested-typename of
        !          1701:    the type decl in question.  (Argument CLASSNAME can actually be
        !          1702:    a function as well, if that's the smallest containing scope.)  */
        !          1703: 
        !          1704: static void
        !          1705: set_nested_typename (decl, classname, name, type)
        !          1706:      tree decl, classname, name, type;
        !          1707: {
        !          1708:   my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 136);
        !          1709:   if (classname != NULL_TREE)
        !          1710:     {
        !          1711:       char *buf;
        !          1712:       my_friendly_assert (TREE_CODE (classname) == IDENTIFIER_NODE, 137);
        !          1713:       my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 138);
        !          1714:       buf = (char *) alloca (4 + IDENTIFIER_LENGTH (classname)
        !          1715:                             + IDENTIFIER_LENGTH (name));
        !          1716:       sprintf (buf, "%s::%s", IDENTIFIER_POINTER (classname),
        !          1717:               IDENTIFIER_POINTER (name));
        !          1718:       DECL_NESTED_TYPENAME (decl) = get_identifier (buf);
        !          1719: 
        !          1720:       /* When NEW_CLASS_SCOPING is set to 1:
        !          1721: 
        !          1722:         This is a special usage of IDENTIFIER_TYPE_VALUE which have no
        !          1723:         correspondence in any binding_level.  This is ok since the
        !          1724:         DECL_NESTED_TYPENAME is just a convenience identifier whose
        !          1725:         IDENTIFIER_TYPE_VALUE will remain constant from now on.  */
        !          1726:       SET_IDENTIFIER_TYPE_VALUE (DECL_NESTED_TYPENAME (decl), type);
        !          1727:     }
        !          1728:   else
        !          1729:     DECL_NESTED_TYPENAME (decl) = name;
        !          1730: }
        !          1731: 
        !          1732: #if 0 /* not yet, should get fixed properly later */
        !          1733: /* Create a TYPE_DECL node with the correct DECL_ASSEMBLER_NAME.
        !          1734:    Other routines shouldn't use build_decl directly; they'll produce
        !          1735:    incorrect results with `-g' unless they duplicate this code.
        !          1736: 
        !          1737:    This is currently needed mainly for dbxout.c, but we can make
        !          1738:    use of it in cp-method.c later as well.  */
        !          1739: tree
        !          1740: make_type_decl (name, type)
        !          1741:      tree name, type;
        !          1742: {
        !          1743:   tree decl, id;
        !          1744:   decl = build_decl (TYPE_DECL, name, type);
        !          1745:   if (TYPE_NAME (type) == name)
        !          1746:     /* Class/union/enum definition, or a redundant typedef for same.  */
        !          1747:     {
        !          1748:       id = get_identifier (build_overload_name (type, 1, 1));
        !          1749:       DECL_ASSEMBLER_NAME (decl) = id;
        !          1750:     }
        !          1751:   else if (TYPE_NAME (type) != NULL_TREE)
        !          1752:     /* Explicit typedef, or implicit typedef for template expansion.  */
        !          1753:     DECL_ASSEMBLER_NAME (decl) = DECL_ASSEMBLER_NAME (TYPE_NAME (type));
        !          1754:   else
        !          1755:     {
        !          1756:       /* XXX: Typedef for unnamed struct; some other situations.
        !          1757:         TYPE_NAME is null; what's right here?  */
        !          1758:     }
        !          1759:   return decl;
        !          1760: }
        !          1761: #endif
        !          1762: 
        !          1763: void
        !          1764: pushtag (name, type)
        !          1765:      tree name, type;
        !          1766: {
        !          1767:   register struct binding_level *b;
        !          1768: 
        !          1769:   if (class_binding_level)
        !          1770:     b = class_binding_level;
        !          1771:   else
        !          1772:     {
        !          1773:       b = current_binding_level;
        !          1774:       while (b->tag_transparent) b = b->level_chain;
        !          1775:     }
        !          1776: 
        !          1777:   if (b == global_binding_level)
        !          1778:     b->tags = perm_tree_cons (name, type, b->tags);
        !          1779:   else
        !          1780:     b->tags = saveable_tree_cons (name, type, b->tags);
        !          1781: 
        !          1782:   if (name)
        !          1783:     {
        !          1784:       /* Record the identifier as the type's name if it has none.  */
        !          1785: 
        !          1786:       if (TYPE_NAME (type) == NULL_TREE)
        !          1787:         TYPE_NAME (type) = name;
        !          1788:       
        !          1789:       /* Do C++ gratuitous typedefing.  */
        !          1790:       if (IDENTIFIER_TYPE_VALUE (name) != type
        !          1791:          && (TREE_CODE (type) != RECORD_TYPE
        !          1792:              || class_binding_level == (struct binding_level *)0
        !          1793:              || !CLASSTYPE_DECLARED_EXCEPTION (type)))
        !          1794:         {
        !          1795:           register tree d;
        !          1796:          if (current_class_type == NULL_TREE
        !          1797:              || TYPE_SIZE (current_class_type) != NULL_TREE)
        !          1798:            {
        !          1799:              if (current_lang_name == lang_name_cplusplus)
        !          1800:                d = lookup_nested_type (type, current_class_type ? TYPE_NAME (current_class_type) : NULL_TREE);
        !          1801:              else
        !          1802:                d = NULL_TREE;
        !          1803: 
        !          1804:              if (d == NULL_TREE)
        !          1805:                {
        !          1806: #if 0 /* not yet, should get fixed properly later */
        !          1807:                  d = make_type_decl (name, type);
        !          1808:                  DECL_ASSEMBLER_NAME (d) = get_identifier (build_overload_name (type, 1, 1));
        !          1809: #else
        !          1810:                  d = build_decl (TYPE_DECL, name, type);
        !          1811:                  DECL_ASSEMBLER_NAME (d) = get_identifier (build_overload_name (type, 1, 1));
        !          1812: #endif
        !          1813: #ifdef DWARF_DEBUGGING_INFO
        !          1814:                  if (write_symbols == DWARF_DEBUG)
        !          1815:                    {
        !          1816:                      /* Mark the TYPE_DECL node we created just above as an
        !          1817:                         gratuitous one.  We need to do this so that dwarfout.c
        !          1818:                         will understand that it is not supposed to output a
        !          1819:                         TAG_typedef DIE  for it. */
        !          1820:                      DECL_IGNORED_P (d) = 1;
        !          1821:                    }
        !          1822: #endif /* DWARF_DEBUGGING_INFO */
        !          1823:                  set_identifier_type_value (name, type);
        !          1824:                }
        !          1825:              else
        !          1826:                d = TYPE_NAME (d);
        !          1827: 
        !          1828:              /* If it is anonymous, then we are called from pushdecl,
        !          1829:                 and we don't want to infinitely recurse.  Also, if the
        !          1830:                 name is already in scope, we don't want to push it
        !          1831:                 again--pushdecl is only for pushing new decls.  */
        !          1832:              if (! ANON_AGGRNAME_P (name)
        !          1833: #ifdef OBJCPLUS
        !          1834:                  /* we only want this behavior when doing c++ */
        !          1835:                  && current_lang_name == lang_name_cplusplus
        !          1836: #endif
        !          1837:                  && TYPE_NAME (type)
        !          1838:                  && (TREE_CODE (TYPE_NAME (type)) != TYPE_DECL
        !          1839:                      || lookup_name (name, 1) != TYPE_NAME (type)))
        !          1840:                {
        !          1841:                  if (class_binding_level)
        !          1842:                    d = pushdecl_class_level (d);
        !          1843:                  else
        !          1844:                    d = pushdecl (d);
        !          1845:                }
        !          1846:            }
        !          1847:          else
        !          1848:            {
        !          1849:              /* Make nested declarations go into class-level scope.  */
        !          1850:              d = build_lang_field_decl (TYPE_DECL, name, type);
        !          1851: #ifdef DWARF_DEBUGGING_INFO
        !          1852:              if (write_symbols == DWARF_DEBUG)
        !          1853:                {
        !          1854:                  /* Mark the TYPE_DECL node we created just above as an
        !          1855:                     gratuitous one.  We need to do this so that dwarfout.c
        !          1856:                     will understand that it is not supposed to output a
        !          1857:                     TAG_typedef DIE  for it. */
        !          1858:                  DECL_IGNORED_P (d) = 1;
        !          1859:                }
        !          1860: #endif /* DWARF_DEBUGGING_INFO */
        !          1861: #if !NEW_CLASS_SCOPING
        !          1862:              set_identifier_type_value (name, type);
        !          1863: #else
        !          1864:              /* Make sure we're in this type's scope when we push the
        !          1865:                 decl for a template, otherwise class_binding_level will
        !          1866:                 be NULL and we'll end up dying inside of
        !          1867:                 push_class_level_binding.  */
        !          1868:              if (TREE_CODE (type) == UNINSTANTIATED_P_TYPE)
        !          1869:                pushclass (type, 0);
        !          1870:              d = pushdecl_class_level (d);
        !          1871:              if (TREE_CODE (type) == UNINSTANTIATED_P_TYPE)
        !          1872:                popclass (0);
        !          1873: #endif
        !          1874:            }
        !          1875:          if (write_symbols != DWARF_DEBUG)
        !          1876:            {
        !          1877:              if (ANON_AGGRNAME_P (name))
        !          1878:                DECL_IGNORED_P (d) = 1;
        !          1879:            }
        !          1880:          TYPE_NAME (type) = d;
        !          1881: 
        !          1882:          if ((current_class_type == NULL_TREE
        !          1883:               && current_function_decl == NULL_TREE)
        !          1884:              || current_lang_name != lang_name_cplusplus)
        !          1885:            /* Non-nested class.  */
        !          1886:            DECL_NESTED_TYPENAME (d) = name;
        !          1887:          else if (current_function_decl != NULL_TREE)
        !          1888:            {
        !          1889:              /* Function-nested class.  */
        !          1890:              set_nested_typename (d, DECL_ASSEMBLER_NAME (current_function_decl),
        !          1891:                                   name, type);
        !          1892:              /* This builds the links for classes nested in fn scope.  */
        !          1893:              DECL_CONTEXT (d) = current_function_decl;
        !          1894:            }
        !          1895:          else if (TYPE_SIZE (current_class_type) == NULL_TREE)
        !          1896:            {
        !          1897:              /* Class-nested class.  */
        !          1898:              set_nested_typename (d, DECL_NESTED_TYPENAME (TYPE_NAME (current_class_type)),
        !          1899:                                   name, type);
        !          1900:              /* This builds the links for classes nested in type scope.  */
        !          1901:              DECL_CONTEXT (d) = current_class_type;
        !          1902:              DECL_CLASS_CONTEXT (d) = current_class_type;
        !          1903:            }
        !          1904:          TYPE_CONTEXT (type) = DECL_CONTEXT (d);
        !          1905:         }
        !          1906:       if (b->parm_flag == 2)
        !          1907:        {
        !          1908:          TREE_NONLOCAL_FLAG (type) = 1;
        !          1909: #if !NEW_CLASS_SCOPING
        !          1910:          IDENTIFIER_CLASS_VALUE (name) = TYPE_NAME (type);
        !          1911: #endif
        !          1912:          if (TYPE_SIZE (current_class_type) == NULL_TREE)
        !          1913:            CLASSTYPE_TAGS (current_class_type) = b->tags;
        !          1914:        }
        !          1915:     }
        !          1916: 
        !          1917:   if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
        !          1918:     /* Use the canonical TYPE_DECL for this node.  */
        !          1919:     TYPE_STUB_DECL (type) = TYPE_NAME (type);
        !          1920:   else
        !          1921:     {
        !          1922:       /* Create a fake NULL-named TYPE_DECL node whose TREE_TYPE
        !          1923:         will be the tagged type we just added to the current
        !          1924:         binding level.  This fake NULL-named TYPE_DECL node helps
        !          1925:         dwarfout.c to know when it needs to output a
        !          1926:         representation of a tagged type, and it also gives us a
        !          1927:         convenient place to record the "scope start" address for
        !          1928:         the tagged type.  */
        !          1929: 
        !          1930: #if 0 /* not yet, should get fixed properly later */
        !          1931:       TYPE_STUB_DECL (type) = pushdecl (make_type_decl (NULL_TREE, type));
        !          1932: #else
        !          1933:       TYPE_STUB_DECL (type) = pushdecl (build_decl (TYPE_DECL, NULL_TREE, type));
        !          1934: #endif
        !          1935:     }
        !          1936: }
        !          1937: 
        !          1938: /* Counter used to create anonymous type names.  */
        !          1939: static int anon_cnt = 0;
        !          1940: 
        !          1941: /* Return an IDENTIFIER which can be used as a name for
        !          1942:    anonymous structs and unions.  */
        !          1943: tree
        !          1944: make_anon_name ()
        !          1945: {
        !          1946:   char buf[32];
        !          1947: 
        !          1948:   sprintf (buf, ANON_AGGRNAME_FORMAT, anon_cnt++);
        !          1949:   return get_identifier (buf);
        !          1950: }
        !          1951: 
        !          1952: /* Clear the TREE_PURPOSE slot of tags which have anonymous typenames.
        !          1953:    This keeps dbxout from getting confused.  */
        !          1954: void
        !          1955: clear_anon_tags ()
        !          1956: {
        !          1957:   register struct binding_level *b;
        !          1958:   register tree tags;
        !          1959:   static int last_cnt = 0;
        !          1960: 
        !          1961:   /* Fast out if no new anon names were declared.  */
        !          1962:   if (last_cnt == anon_cnt)
        !          1963:     return;
        !          1964: 
        !          1965:   b = current_binding_level;
        !          1966:   while (b->tag_transparent)
        !          1967:     b = b->level_chain;
        !          1968:   tags = b->tags;
        !          1969:   while (tags)
        !          1970:     {
        !          1971:       /* A NULL purpose means we have already processed all tags
        !          1972:         from here to the end of the list.  */
        !          1973:       if (TREE_PURPOSE (tags) == NULL_TREE)
        !          1974:        break;
        !          1975:       if (ANON_AGGRNAME_P (TREE_PURPOSE (tags)))
        !          1976:        TREE_PURPOSE (tags) = NULL_TREE;
        !          1977:       tags = TREE_CHAIN (tags);
        !          1978:     }
        !          1979:   last_cnt = anon_cnt;
        !          1980: }
        !          1981: 
        !          1982: /* Subroutine of duplicate_decls: return truthvalue of whether
        !          1983:    or not types of these decls match.
        !          1984: 
        !          1985:    For C++, we must compare the parameter list so that `int' can match
        !          1986:    `int&' in a parameter position, but `int&' is not confused with
        !          1987:    `const int&'.  */
        !          1988: int
        !          1989: decls_match (newdecl, olddecl)
        !          1990:      tree newdecl, olddecl;
        !          1991: {
        !          1992:   int types_match;
        !          1993: 
        !          1994:   if (TREE_CODE (newdecl) == FUNCTION_DECL && TREE_CODE (olddecl) == FUNCTION_DECL)
        !          1995:     {
        !          1996:       tree f1 = TREE_TYPE (newdecl);
        !          1997:       tree f2 = TREE_TYPE (olddecl);
        !          1998:       tree p1 = TYPE_ARG_TYPES (f1);
        !          1999:       tree p2 = TYPE_ARG_TYPES (f2);
        !          2000: 
        !          2001:       /* When we parse a static member function definition,
        !          2002:         we put together a FUNCTION_DECL which thinks its type
        !          2003:         is METHOD_TYPE.  Change that to FUNCTION_TYPE, and
        !          2004:         proceed.  */
        !          2005:       if (TREE_CODE (f1) == METHOD_TYPE && DECL_STATIC_FUNCTION_P (olddecl))
        !          2006:        revert_static_member_fn (&f1, &newdecl, &p1);
        !          2007:       else if (TREE_CODE (f2) == METHOD_TYPE
        !          2008:               && DECL_STATIC_FUNCTION_P (newdecl))
        !          2009:        revert_static_member_fn (&f2, &olddecl, &p2);
        !          2010: 
        !          2011:       /* Here we must take care of the case where new default
        !          2012:         parameters are specified.  Also, warn if an old
        !          2013:         declaration becomes ambiguous because default
        !          2014:         parameters may cause the two to be ambiguous.  */
        !          2015:       if (TREE_CODE (f1) != TREE_CODE (f2))
        !          2016:        {
        !          2017:          if (TREE_CODE (f1) == OFFSET_TYPE)
        !          2018:            cp_compiler_error ("`%D' redeclared as member function", newdecl);
        !          2019:          else
        !          2020:            cp_compiler_error ("`%D' redeclared as non-member function", newdecl);
        !          2021:          return 0;
        !          2022:        }
        !          2023: 
        !          2024:       if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (f1)),
        !          2025:                     TYPE_MAIN_VARIANT (TREE_TYPE (f2)), 2))
        !          2026:        types_match = compparms (p1, p2, 2);
        !          2027:       else
        !          2028:        types_match = 0;
        !          2029:     }
        !          2030:   else
        !          2031:     {
        !          2032:       if (TREE_TYPE (newdecl) == error_mark_node)
        !          2033:        types_match = TREE_TYPE (olddecl) == error_mark_node;
        !          2034:       else if (TREE_TYPE (olddecl) == NULL_TREE)
        !          2035:        types_match = TREE_TYPE (newdecl) == NULL_TREE;
        !          2036:       else
        !          2037:        types_match = comptypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl), 1);
        !          2038:     }
        !          2039: 
        !          2040:   return types_match;
        !          2041: }
        !          2042: 
        !          2043: /* Handle when a new declaration NEWDECL has the same name as an old
        !          2044:    one OLDDECL in the same binding contour.  Prints an error message
        !          2045:    if appropriate.
        !          2046: 
        !          2047:    If safely possible, alter OLDDECL to look like NEWDECL, and return 1.
        !          2048:    Otherwise, return 0.  */
        !          2049: 
        !          2050: int
        !          2051: duplicate_decls (newdecl, olddecl)
        !          2052:      register tree newdecl, olddecl;
        !          2053: {
        !          2054:   extern struct obstack permanent_obstack;
        !          2055:   unsigned olddecl_uid = DECL_UID (olddecl);
        !          2056:   int olddecl_friend = 0, types_match = 0;
        !          2057:   int new_defines_function;
        !          2058: 
        !          2059:   if (TREE_CODE (olddecl) == TREE_LIST
        !          2060:       && TREE_CODE (newdecl) == FUNCTION_DECL)
        !          2061:     {
        !          2062:       /* If a new decl finds a list of old decls, then
        !          2063:         we assume that the new decl has C linkage, and
        !          2064:         that the old decls have C++ linkage.  In this case,
        !          2065:         we must look through the list to see whether
        !          2066:         there is an ambiguity or not.  */
        !          2067:       tree olddecls = olddecl;
        !          2068:       tree previous_c_decl = NULL_TREE; 
        !          2069: 
        !          2070:       /* If the overload list is empty, just install the decl.  */
        !          2071:       if (TREE_VALUE (olddecls) == NULL_TREE)
        !          2072:        {
        !          2073:          TREE_VALUE (olddecls) = newdecl;
        !          2074:          return 1;
        !          2075:        }
        !          2076: 
        !          2077:       while (olddecls)
        !          2078:        {
        !          2079:          if (DECL_HAS_C_LINKAGE (TREE_VALUE (olddecls)))
        !          2080:            previous_c_decl = TREE_VALUE (olddecls);
        !          2081: 
        !          2082:          if (decls_match (newdecl, TREE_VALUE (olddecls)))
        !          2083:            {
        !          2084:              if (TREE_CODE (newdecl) == VAR_DECL)
        !          2085:                ;
        !          2086:              else if (! DECLS_SAME_LINKAGE (newdecl, TREE_VALUE (olddecls)))
        !          2087:                {
        !          2088:                  cp_error
        !          2089:                    ("declaration of `%#D' with different language linkage",
        !          2090:                     newdecl);
        !          2091:                  cp_error_at ("previous declaration here", TREE_VALUE (olddecls));
        !          2092:                }
        !          2093:              types_match = 1;
        !          2094:              break;
        !          2095:            }
        !          2096:          olddecls = TREE_CHAIN (olddecls);
        !          2097:        }
        !          2098:       if (olddecls)
        !          2099:        olddecl = TREE_VALUE (olddecls);
        !          2100:       else
        !          2101:        {
        !          2102:          if (previous_c_decl != NULL_TREE
        !          2103:              && DECL_HAS_C_LINKAGE (newdecl))
        !          2104:            {
        !          2105:              cp_error ("declaration of C function `%#D' conflicts with previous declaration", newdecl);
        !          2106:              cp_error_at ("`%#D' declared previously at this point in file", previous_c_decl);
        !          2107:            }
        !          2108:          else
        !          2109:            {
        !          2110:              /* If we found no match, make this join the other
        !          2111:                 overloaded decls.  */
        !          2112:              DECL_OVERLOADED (newdecl) = 1;
        !          2113:            }
        !          2114:          return 1;
        !          2115:        }
        !          2116:     }
        !          2117:   else
        !          2118:     {
        !          2119:       if (TREE_CODE (olddecl) != TREE_LIST)
        !          2120:        olddecl_friend = DECL_LANG_SPECIFIC (olddecl) && DECL_FRIEND_P (olddecl);
        !          2121:       types_match = decls_match (newdecl, olddecl);
        !          2122:     }
        !          2123: 
        !          2124:   /* If either the type of the new decl or the type of the old decl is an
        !          2125:      error_mark_node, then that implies that we have already issued an
        !          2126:      error (earlier) for some bogus type specification, and in that case,
        !          2127:      it is rather pointless to harass the user with yet more error message
        !          2128:      about the same declaration, so well just pretent the types match here.  */
        !          2129:   if ((TREE_TYPE (newdecl)
        !          2130:        && TREE_CODE (TREE_TYPE (newdecl)) == ERROR_MARK)
        !          2131:       || (TREE_TYPE (olddecl)
        !          2132:          && TREE_CODE (TREE_TYPE (olddecl)) == ERROR_MARK))
        !          2133:     types_match = 1;
        !          2134: 
        !          2135:   /* If this decl has linkage, and the old one does too, maybe no error.  */
        !          2136:   if (TREE_CODE (olddecl) != TREE_CODE (newdecl))
        !          2137:     {
        !          2138:       cp_error ("`%#D' redeclared as different kind of symbol", newdecl);
        !          2139:       if (TREE_CODE (olddecl) == TREE_LIST)
        !          2140:        olddecl = TREE_VALUE (olddecl);
        !          2141:       cp_error_at ("previous declaration of `%#D'", olddecl);
        !          2142: 
        !          2143:       /* New decl is completely inconsistent with the old one =>
        !          2144:         tell caller to replace the old one.  */
        !          2145: 
        !          2146:       return 0;
        !          2147:     }
        !          2148: 
        !          2149:   if (flag_traditional && TREE_CODE (newdecl) == FUNCTION_DECL
        !          2150:       && IDENTIFIER_IMPLICIT_DECL (DECL_ASSEMBLER_NAME (newdecl)) == olddecl)
        !          2151:     /* If -traditional, avoid error for redeclaring fcn
        !          2152:        after implicit decl.  */
        !          2153:     ;
        !          2154:   else if (TREE_CODE (olddecl) == FUNCTION_DECL && DECL_BUILT_IN (olddecl))
        !          2155:     {
        !          2156:       /* A function declaration for a built-in function.  */
        !          2157:       if (!TREE_PUBLIC (newdecl))
        !          2158:        {
        !          2159:          /* If you declare a built-in function name as static, the
        !          2160:             built-in definition is overridden,
        !          2161:             but optionally warn this was a bad choice of name.  */
        !          2162:          if (warn_shadow)
        !          2163:            cp_warning ("shadowing built-in function `%#D'", newdecl);
        !          2164:          /* Discard the old built-in function.  */
        !          2165:          return 0;
        !          2166:        }
        !          2167:       if (!types_match)
        !          2168:        {
        !          2169:          cp_warning ("declaration of `%#D'", newdecl);
        !          2170:          cp_warning ("conflicts with built-in declaration `%#D'",
        !          2171:                      olddecl);
        !          2172:          return 0;
        !          2173:        }
        !          2174:     }
        !          2175:   else if (!types_match)
        !          2176:     {
        !          2177:       tree oldtype = TREE_TYPE (olddecl);
        !          2178:       tree newtype = TREE_TYPE (newdecl);
        !          2179:       int give_error = 0;
        !          2180: 
        !          2181:       /* Already complained about this, so don't do so again.  */
        !          2182:       if (current_class_type == NULL_TREE
        !          2183:          || IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl)) != current_class_type)
        !          2184:        {
        !          2185:          give_error = 1;
        !          2186: 
        !          2187:          /* Since we're doing this before finish_struct can set the
        !          2188:             line number on NEWDECL, we just do a regular error here.  */
        !          2189:          if (DECL_SOURCE_LINE (newdecl) == 0)
        !          2190:            cp_error ("conflicting types for `%#D'", newdecl);
        !          2191:          else
        !          2192:            cp_error_at ("conflicting types for `%#D'", newdecl);
        !          2193:        }
        !          2194: 
        !          2195:       /* Check for function type mismatch
        !          2196:         involving an empty arglist vs a nonempty one.  */
        !          2197:       if (TREE_CODE (olddecl) == FUNCTION_DECL
        !          2198:          && comptypes (TREE_TYPE (oldtype),
        !          2199:                        TREE_TYPE (newtype), 1)
        !          2200:          && ((TYPE_ARG_TYPES (oldtype) == NULL_TREE
        !          2201:               && DECL_INITIAL (olddecl) == NULL_TREE)
        !          2202:              || (TYPE_ARG_TYPES (newtype) == NULL_TREE
        !          2203:                  && DECL_INITIAL (newdecl) == NULL_TREE)))
        !          2204:        {
        !          2205:          /* Classify the problem further.  */
        !          2206:          register tree t = TYPE_ARG_TYPES (oldtype);
        !          2207: 
        !          2208:          if (t == NULL_TREE)
        !          2209:            t = TYPE_ARG_TYPES (newtype);
        !          2210:          for (; t; t = TREE_CHAIN (t))
        !          2211:            {
        !          2212:              register tree type = TREE_VALUE (t);
        !          2213: 
        !          2214:              if (TREE_CHAIN (t) == NULL_TREE && type != void_type_node)
        !          2215:                {
        !          2216:                  give_error = 1;
        !          2217:                  error ("A parameter list with an ellipsis can't match");
        !          2218:                  error ("an empty parameter name list declaration.");
        !          2219:                  break;
        !          2220:                }
        !          2221: 
        !          2222:              if (TYPE_MAIN_VARIANT (type) == float_type_node
        !          2223:                  || C_PROMOTING_INTEGER_TYPE_P (type))
        !          2224:                {
        !          2225:                  give_error = 1;
        !          2226:                  error ("An argument type that has a default promotion");
        !          2227:                  error ("can't match an empty parameter name list declaration.");
        !          2228:                  break;
        !          2229:                }
        !          2230:            }
        !          2231:        }
        !          2232:       if (give_error)
        !          2233:        cp_error_at ("previous declaration as `%#D'", olddecl);
        !          2234: 
        !          2235:       /* There is one thing GNU C++ cannot tolerate: a constructor
        !          2236:         which takes the type of object being constructed.
        !          2237:         Farm that case out here.  */
        !          2238:       if (TREE_CODE (newdecl) == FUNCTION_DECL
        !          2239:          && DECL_CONSTRUCTOR_P (newdecl))
        !          2240:        {
        !          2241:          tree tmp = TREE_CHAIN (TYPE_ARG_TYPES (newtype));
        !          2242: 
        !          2243:          if (tmp != NULL_TREE
        !          2244:              && (TYPE_MAIN_VARIANT (TREE_VALUE (tmp))
        !          2245:                  == TYPE_METHOD_BASETYPE (newtype)))
        !          2246:            {
        !          2247:              tree parm = TREE_CHAIN (DECL_ARGUMENTS (newdecl));
        !          2248:              tree argtypes
        !          2249:                = hash_tree_chain (build_reference_type (TREE_VALUE (tmp)),
        !          2250:                                   TREE_CHAIN (tmp));
        !          2251: 
        !          2252:              DECL_ARG_TYPE (parm)
        !          2253:                = TREE_TYPE (parm)
        !          2254:                  = TYPE_REFERENCE_TO (TREE_VALUE (tmp));
        !          2255: 
        !          2256:              TREE_TYPE (newdecl) = newtype
        !          2257:                = build_cplus_method_type (TYPE_METHOD_BASETYPE (newtype),
        !          2258:                                           TREE_TYPE (newtype), argtypes);
        !          2259:              error ("constructor cannot take as argument the type being constructed");
        !          2260:              SET_IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl), current_class_type);
        !          2261:            }
        !          2262:        }
        !          2263:     }
        !          2264:   else
        !          2265:     {
        !          2266:       char *errmsg = redeclaration_error_message (newdecl, olddecl);
        !          2267:       if (errmsg)
        !          2268:        {
        !          2269:          error_with_decl (newdecl, errmsg);
        !          2270:          if (DECL_NAME (olddecl) != NULL_TREE)
        !          2271:            cp_error_at ((DECL_INITIAL (olddecl)
        !          2272:                          && current_binding_level == global_binding_level)
        !          2273:                         ? "`%#D' previously defined here"
        !          2274:                         : "`%#D' previously declared here", olddecl);
        !          2275:        }
        !          2276:       else if (TREE_CODE (olddecl) == FUNCTION_DECL
        !          2277:               && DECL_INITIAL (olddecl) != NULL_TREE
        !          2278:               && TYPE_ARG_TYPES (TREE_TYPE (olddecl)) == NULL_TREE
        !          2279:               && TYPE_ARG_TYPES (TREE_TYPE (newdecl)) != NULL_TREE)
        !          2280:        {
        !          2281:          /* Prototype decl follows defn w/o prototype.  */
        !          2282:          cp_warning_at ("prototype for `%#D'", newdecl);
        !          2283:          cp_warning_at ("follows non-prototype definition here", olddecl);
        !          2284:        }
        !          2285:       else if (TREE_CODE (olddecl) == FUNCTION_DECL
        !          2286:               && ! DECLS_SAME_LINKAGE (newdecl, olddecl))
        !          2287:        /* extern "C" int foo ();
        !          2288:           int foo () { bar (); }
        !          2289:           is OK.  */
        !          2290:        if (current_lang_stack == current_lang_base)
        !          2291:          DECL_LANGUAGE (newdecl) = DECL_LANGUAGE (olddecl);
        !          2292:        else
        !          2293:          {
        !          2294:            cp_error_at ("previous declaration of `%#D' with %L linkage",
        !          2295:                         olddecl, DECL_LANGUAGE (olddecl));
        !          2296:            cp_error ("conflicts with new declaration with %L linkage",
        !          2297:                      DECL_LANGUAGE (newdecl));
        !          2298:          }
        !          2299: 
        !          2300:       /* These bits are logically part of the type.  */
        !          2301:       if (pedantic
        !          2302:          && (TREE_READONLY (newdecl) != TREE_READONLY (olddecl)
        !          2303:              || TREE_THIS_VOLATILE (newdecl) != TREE_THIS_VOLATILE (olddecl)))
        !          2304:        cp_error_at ("type qualifiers for `%D' conflict with previous decl", newdecl);
        !          2305:     }
        !          2306: 
        !          2307:   /* We have committed to returning 1 at this point. */
        !          2308:   if (TREE_CODE (newdecl) == FUNCTION_DECL)
        !          2309:     {
        !          2310:       /* Now that functions must hold information normally held
        !          2311:         by field decls, there is extra work to do so that
        !          2312:         declaration information does not get destroyed during
        !          2313:         definition.  */
        !          2314:       if (DECL_VINDEX (olddecl))
        !          2315:        DECL_VINDEX (newdecl) = DECL_VINDEX (olddecl);
        !          2316:       if (DECL_CONTEXT (olddecl))
        !          2317:        DECL_CONTEXT (newdecl) = DECL_CONTEXT (olddecl);
        !          2318:       if (DECL_CLASS_CONTEXT (olddecl))
        !          2319:        DECL_CLASS_CONTEXT (newdecl) = DECL_CLASS_CONTEXT (olddecl);
        !          2320:       if (DECL_CHAIN (newdecl) == NULL_TREE)
        !          2321:        DECL_CHAIN (newdecl) = DECL_CHAIN (olddecl);
        !          2322:       if (DECL_PENDING_INLINE_INFO (newdecl) == (struct pending_inline *)0)
        !          2323:        DECL_PENDING_INLINE_INFO (newdecl) = DECL_PENDING_INLINE_INFO (olddecl);
        !          2324:     }
        !          2325: 
        !          2326:   /* Deal with C++: must preserve virtual function table size.  */
        !          2327:   if (TREE_CODE (olddecl) == TYPE_DECL)
        !          2328:     {
        !          2329:       register tree newtype = TREE_TYPE (newdecl);
        !          2330:       register tree oldtype = TREE_TYPE (olddecl);
        !          2331: 
        !          2332:       if (newtype != error_mark_node && oldtype != error_mark_node
        !          2333:          && TYPE_LANG_SPECIFIC (newtype) && TYPE_LANG_SPECIFIC (oldtype))
        !          2334:        {
        !          2335:          CLASSTYPE_VSIZE (newtype) = CLASSTYPE_VSIZE (oldtype);
        !          2336:          CLASSTYPE_FRIEND_CLASSES (newtype)
        !          2337:            = CLASSTYPE_FRIEND_CLASSES (oldtype);
        !          2338:        }
        !          2339:       /* why assert here?  Just because debugging information is
        !          2340:         messed up? (mrs) */
        !          2341:       /* it happens on something like:
        !          2342:                typedef struct Thing {
        !          2343:                        Thing();
        !          2344:                        int     x;
        !          2345:                } Thing;
        !          2346:       */
        !          2347: #if 0
        !          2348:       my_friendly_assert (DECL_IGNORED_P (olddecl) == DECL_IGNORED_P (newdecl), 139);
        !          2349: #endif
        !          2350:     }
        !          2351: 
        !          2352:   /* Special handling ensues if new decl is a function definition.  */
        !          2353:   new_defines_function = (TREE_CODE (newdecl) == FUNCTION_DECL
        !          2354:                          && DECL_INITIAL (newdecl) != NULL_TREE);
        !          2355: 
        !          2356:   /* Optionally warn about more than one declaration for the same name,
        !          2357:      but don't warn about a function declaration followed by a definition.  */
        !          2358:   if (warn_redundant_decls
        !          2359:       && DECL_SOURCE_LINE (olddecl) != 0
        !          2360:       && !(new_defines_function && DECL_INITIAL (olddecl) == NULL_TREE))
        !          2361:     {
        !          2362:       cp_warning ("redundant redeclaration of `%D' in same scope", newdecl);
        !          2363:       cp_warning ("previous declaration of `%D'", olddecl);
        !          2364:     }
        !          2365: 
        !          2366:   /* Copy all the DECL_... slots specified in the new decl
        !          2367:      except for any that we copy here from the old type.  */
        !          2368: 
        !          2369:   if (types_match)
        !          2370:     {
        !          2371:       /* Automatically handles default parameters.  */
        !          2372:       tree oldtype = TREE_TYPE (olddecl);
        !          2373:       /* Merge the data types specified in the two decls.  */
        !          2374:       tree newtype = common_type (TREE_TYPE (newdecl), TREE_TYPE (olddecl));
        !          2375: 
        !          2376:       if (TREE_CODE (newdecl) == VAR_DECL)
        !          2377:        DECL_THIS_EXTERN (newdecl) |= DECL_THIS_EXTERN (olddecl);
        !          2378:       /* Do this after calling `common_type' so that default
        !          2379:         parameters don't confuse us.  */
        !          2380:       else if (TREE_CODE (newdecl) == FUNCTION_DECL
        !          2381:          && (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl))
        !          2382:              != TYPE_RAISES_EXCEPTIONS (TREE_TYPE (olddecl))))
        !          2383:        {
        !          2384:          tree ctype = NULL_TREE;
        !          2385:          ctype = DECL_CLASS_CONTEXT (newdecl);
        !          2386:          TREE_TYPE (newdecl) = build_exception_variant (ctype, newtype,
        !          2387:                                                         TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl)));
        !          2388:          TREE_TYPE (olddecl) = build_exception_variant (ctype, newtype,
        !          2389:                                                         TYPE_RAISES_EXCEPTIONS (oldtype));
        !          2390: 
        !          2391:          if (! compexcepttypes (TREE_TYPE (newdecl), TREE_TYPE(olddecl), 0))
        !          2392:            {
        !          2393:              cp_error ("declaration of `%D' raises different exceptions...", newdecl);
        !          2394:              cp_error_at ("...from previous declaration here", olddecl);
        !          2395:            }
        !          2396:        }
        !          2397:       TREE_TYPE (newdecl) = TREE_TYPE (olddecl) = newtype;
        !          2398: 
        !          2399:       /* Lay the type out, unless already done.  */
        !          2400:       if (oldtype != TREE_TYPE (newdecl))
        !          2401:        {
        !          2402:          if (TREE_TYPE (newdecl) != error_mark_node)
        !          2403:            layout_type (TREE_TYPE (newdecl));
        !          2404:          if (TREE_CODE (newdecl) != FUNCTION_DECL
        !          2405:              && TREE_CODE (newdecl) != TYPE_DECL
        !          2406:              && TREE_CODE (newdecl) != CONST_DECL)
        !          2407:            layout_decl (newdecl, 0);
        !          2408:        }
        !          2409:       else
        !          2410:        {
        !          2411:          /* Since the type is OLDDECL's, make OLDDECL's size go with.  */
        !          2412:          DECL_SIZE (newdecl) = DECL_SIZE (olddecl);
        !          2413:        }
        !          2414: 
        !          2415:       /* Merge the type qualifiers.  */
        !          2416:       if (TREE_READONLY (newdecl))
        !          2417:        TREE_READONLY (olddecl) = 1;
        !          2418:       if (TREE_THIS_VOLATILE (newdecl))
        !          2419:        TREE_THIS_VOLATILE (olddecl) = 1;
        !          2420: 
        !          2421:       /* Merge the initialization information.  */
        !          2422:       if (DECL_INITIAL (newdecl) == NULL_TREE)
        !          2423:        DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
        !          2424:       /* Keep the old rtl since we can safely use it, unless it's the
        !          2425:         call to abort() used for abstract virtuals.  */
        !          2426:       if ((DECL_LANG_SPECIFIC (olddecl)
        !          2427:           && !DECL_ABSTRACT_VIRTUAL_P (olddecl))
        !          2428:          || DECL_RTL (olddecl) != DECL_RTL (abort_fndecl))
        !          2429:        DECL_RTL (newdecl) = DECL_RTL (olddecl);
        !          2430:     }
        !          2431:   /* If cannot merge, then use the new type and qualifiers,
        !          2432:      and don't preserve the old rtl.  */
        !          2433:   else
        !          2434:     {
        !          2435:       /* Clean out any memory we had of the old declaration.  */
        !          2436:       tree oldstatic = value_member (olddecl, static_aggregates);
        !          2437:       if (oldstatic)
        !          2438:        TREE_VALUE (oldstatic) = error_mark_node;
        !          2439: 
        !          2440:       TREE_TYPE (olddecl) = TREE_TYPE (newdecl);
        !          2441:       TREE_READONLY (olddecl) = TREE_READONLY (newdecl);
        !          2442:       TREE_THIS_VOLATILE (olddecl) = TREE_THIS_VOLATILE (newdecl);
        !          2443:       TREE_SIDE_EFFECTS (olddecl) = TREE_SIDE_EFFECTS (newdecl);
        !          2444:     }
        !          2445: 
        !          2446:   /* Merge the storage class information.  */
        !          2447:   if (DECL_EXTERNAL (newdecl))
        !          2448:     {
        !          2449:       TREE_STATIC (newdecl) = TREE_STATIC (olddecl);
        !          2450:       DECL_EXTERNAL (newdecl) = DECL_EXTERNAL (olddecl);
        !          2451: 
        !          2452:       /* For functions, static overrides non-static.  */
        !          2453:       if (TREE_CODE (newdecl) == FUNCTION_DECL)
        !          2454:        {
        !          2455:          TREE_PUBLIC (newdecl) &= TREE_PUBLIC (olddecl);
        !          2456:          /* This is since we don't automatically
        !          2457:             copy the attributes of NEWDECL into OLDDECL.  */
        !          2458:          TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
        !          2459:          /* If this clears `static', clear it in the identifier too.  */
        !          2460:          if (! TREE_PUBLIC (olddecl))
        !          2461:            TREE_PUBLIC (DECL_ASSEMBLER_NAME (olddecl)) = 0;
        !          2462:        }
        !          2463:       else
        !          2464:        TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl);
        !          2465:     }
        !          2466:   else
        !          2467:     {
        !          2468:       TREE_STATIC (olddecl) = TREE_STATIC (newdecl);
        !          2469:       /* A `const' which was not declared `extern' and is
        !          2470:         in static storage is invisible.  */
        !          2471:       if (TREE_CODE (newdecl) == VAR_DECL
        !          2472:          && TREE_READONLY (newdecl) && TREE_STATIC (newdecl)
        !          2473:          && ! DECL_THIS_EXTERN (newdecl))
        !          2474:        TREE_PUBLIC (newdecl) = 0;
        !          2475:       TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
        !          2476:     }
        !          2477: 
        !          2478:   /* If either decl says `inline', this fn is inline,
        !          2479:      unless its definition was passed already.  */
        !          2480:   if (DECL_INLINE (newdecl) && DECL_INITIAL (olddecl) == NULL_TREE)
        !          2481:     DECL_INLINE (olddecl) = 1;
        !          2482:   DECL_INLINE (newdecl) = DECL_INLINE (olddecl);
        !          2483: 
        !          2484:   if (TREE_CODE (newdecl) == FUNCTION_DECL)
        !          2485:     {
        !          2486:       if (new_defines_function)
        !          2487:        /* If defining a function declared with other language
        !          2488:           linkage, use the previously declared language linkage.  */
        !          2489:        DECL_LANGUAGE (newdecl) = DECL_LANGUAGE (olddecl);
        !          2490:       else
        !          2491:        {
        !          2492:          /* If redeclaring a builtin function, and not a definition,
        !          2493:             it stays built in.  */
        !          2494:          if (DECL_BUILT_IN (olddecl))
        !          2495:            {
        !          2496:              DECL_BUILT_IN (newdecl) = 1;
        !          2497:              DECL_SET_FUNCTION_CODE (newdecl, DECL_FUNCTION_CODE (olddecl));
        !          2498:              /* If we're keeping the built-in definition, keep the rtl,
        !          2499:                 regardless of declaration matches.  */
        !          2500:              DECL_RTL (newdecl) = DECL_RTL (olddecl);
        !          2501:            }
        !          2502:          else
        !          2503:            DECL_FRAME_SIZE (newdecl) = DECL_FRAME_SIZE (olddecl);
        !          2504: 
        !          2505:          DECL_RESULT (newdecl) = DECL_RESULT (olddecl);
        !          2506:          if (DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl))
        !          2507:            /* Previously saved insns go together with
        !          2508:               the function's previous definition.  */
        !          2509:            DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
        !          2510:          /* Don't clear out the arguments if we're redefining a function.  */
        !          2511:          if (DECL_ARGUMENTS (olddecl))
        !          2512:            DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl);
        !          2513:        }
        !          2514:     }
        !          2515: 
        !          2516:   /* Now preserve various other info from the definition.  */
        !          2517:   TREE_ADDRESSABLE (newdecl) = TREE_ADDRESSABLE (olddecl);
        !          2518:   TREE_ASM_WRITTEN (newdecl) = TREE_ASM_WRITTEN (olddecl);
        !          2519: 
        !          2520:   /* Don't really know how much of the language-specific
        !          2521:      values we should copy from old to new.  */
        !          2522: #if 1
        !          2523:   if (DECL_LANG_SPECIFIC (olddecl))
        !          2524:     DECL_IN_AGGR_P (newdecl) = DECL_IN_AGGR_P (olddecl);
        !          2525: #endif
        !          2526: 
        !          2527:   if (TREE_CODE (newdecl) == FUNCTION_DECL)
        !          2528:     {
        !          2529:       int function_size;
        !          2530:       struct lang_decl *ol = DECL_LANG_SPECIFIC (olddecl);
        !          2531:       struct lang_decl *nl = DECL_LANG_SPECIFIC (newdecl);
        !          2532: 
        !          2533:       function_size = sizeof (struct tree_decl);
        !          2534: 
        !          2535:       bcopy ((char *) newdecl + sizeof (struct tree_common),
        !          2536:             (char *) olddecl + sizeof (struct tree_common),
        !          2537:             function_size - sizeof (struct tree_common));
        !          2538: 
        !          2539:       if ((char *)newdecl + ((function_size + sizeof (struct lang_decl)
        !          2540:                             + obstack_alignment_mask (&permanent_obstack))
        !          2541:                             & ~ obstack_alignment_mask (&permanent_obstack))
        !          2542:          == obstack_next_free (&permanent_obstack))
        !          2543:        {
        !          2544:          DECL_MAIN_VARIANT (newdecl) = olddecl;
        !          2545:          DECL_LANG_SPECIFIC (olddecl) = ol;
        !          2546:          bcopy ((char *)nl, (char *)ol, sizeof (struct lang_decl));
        !          2547: 
        !          2548:          obstack_free (&permanent_obstack, newdecl);
        !          2549:        }
        !          2550:       else if (LANG_DECL_PERMANENT (ol))
        !          2551:        {
        !          2552:          if (DECL_MAIN_VARIANT (olddecl) == olddecl)
        !          2553:            {
        !          2554:              /* Save these lang_decls that would otherwise be lost.  */
        !          2555:              extern tree free_lang_decl_chain;
        !          2556:              tree free_lang_decl = (tree) ol;
        !          2557:              TREE_CHAIN (free_lang_decl) = free_lang_decl_chain;
        !          2558:              free_lang_decl_chain = free_lang_decl;
        !          2559:            }
        !          2560:          else
        !          2561:            {
        !          2562:              /* Storage leak.  */
        !          2563:            }
        !          2564:        }
        !          2565:     }
        !          2566:   else
        !          2567:     {
        !          2568:       bcopy ((char *) newdecl + sizeof (struct tree_common),
        !          2569:             (char *) olddecl + sizeof (struct tree_common),
        !          2570:             sizeof (struct tree_decl) - sizeof (struct tree_common)
        !          2571:             + tree_code_length [(int)TREE_CODE (newdecl)] * sizeof (char *));
        !          2572:     }
        !          2573: 
        !          2574:   DECL_UID (olddecl) = olddecl_uid;
        !          2575:   if (olddecl_friend)
        !          2576:     DECL_FRIEND_P (olddecl) = 1;
        !          2577: 
        !          2578:   return 1;
        !          2579: }
        !          2580: 
        !          2581: #if !NEW_CLASS_SCOPING
        !          2582: /* This was always a hack, that never should've been necessary.  */
        !          2583: void
        !          2584: adjust_type_value (id)
        !          2585:      tree id;
        !          2586: {
        !          2587:   tree t;
        !          2588: 
        !          2589:   if (current_binding_level != global_binding_level)
        !          2590:     {
        !          2591:       if (current_binding_level != class_binding_level)
        !          2592:        {
        !          2593:          t = IDENTIFIER_LOCAL_VALUE (id);
        !          2594:          if (t && TREE_CODE (t) == TYPE_DECL)
        !          2595:            {
        !          2596:            set_it:
        !          2597:              SET_IDENTIFIER_TYPE_VALUE (id, TREE_TYPE (t));
        !          2598:              return;
        !          2599:            }
        !          2600:        }
        !          2601:       else
        !          2602:        my_friendly_abort (7);
        !          2603: 
        !          2604:       if (current_class_type)
        !          2605:        {
        !          2606:          t = IDENTIFIER_CLASS_VALUE (id);
        !          2607:          if (t && TREE_CODE (t) == TYPE_DECL)
        !          2608:            goto set_it;
        !          2609:        }
        !          2610:     }
        !          2611: 
        !          2612:   t = IDENTIFIER_GLOBAL_VALUE (id);
        !          2613:   if (t && TREE_CODE (t) == TYPE_DECL)
        !          2614:     goto set_it;
        !          2615:   if (t && TREE_CODE (t) == TEMPLATE_DECL)
        !          2616:     SET_IDENTIFIER_TYPE_VALUE (id, NULL_TREE);
        !          2617: }
        !          2618: #endif
        !          2619: 
        !          2620: /* Record a decl-node X as belonging to the current lexical scope.
        !          2621:    Check for errors (such as an incompatible declaration for the same
        !          2622:    name already seen in the same scope).
        !          2623: 
        !          2624:    Returns either X or an old decl for the same name.
        !          2625:    If an old decl is returned, it may have been smashed
        !          2626:    to agree with what X says.  */
        !          2627: 
        !          2628: tree
        !          2629: pushdecl (x)
        !          2630:      tree x;
        !          2631: {
        !          2632:   register tree t;
        !          2633: #if 0 /* not yet, should get fixed properly later */
        !          2634:   register tree name;
        !          2635: #else
        !          2636:   register tree name = DECL_ASSEMBLER_NAME (x);
        !          2637: #endif
        !          2638:   register struct binding_level *b = current_binding_level;
        !          2639: 
        !          2640: #if 0
        !          2641:   static int nglobals; int len;
        !          2642: 
        !          2643:   len = list_length (global_binding_level->names);
        !          2644:   if (len < nglobals)
        !          2645:     my_friendly_abort (8);
        !          2646:   else if (len > nglobals)
        !          2647:     nglobals = len;
        !          2648: #endif
        !          2649: 
        !          2650:   /* Don't change DECL_CONTEXT of virtual methods.  */
        !          2651:   if (x != current_function_decl
        !          2652:       && (TREE_CODE (x) != FUNCTION_DECL
        !          2653:          || !DECL_VIRTUAL_P (x)))
        !          2654:     DECL_CONTEXT (x) = current_function_decl;
        !          2655:   /* A local declaration for a function doesn't constitute nesting.  */
        !          2656:   if (TREE_CODE (x) == FUNCTION_DECL && DECL_INITIAL (x) == 0)
        !          2657:     DECL_CONTEXT (x) = 0;
        !          2658: 
        !          2659: #if 0 /* not yet, should get fixed properly later */
        !          2660:   /* For functions and class static data, we currently look up the encoded
        !          2661:      form of the name.  For types, we want the real name.  The former will
        !          2662:      probably be changed soon, according to MDT.  */
        !          2663:   if (TREE_CODE (x) == FUNCTION_DECL || TREE_CODE (x) == VAR_DECL)
        !          2664:     name = DECL_ASSEMBLER_NAME (x);
        !          2665:   else
        !          2666:     name = DECL_NAME (x);
        !          2667: #else
        !          2668:   /* Type are looked up using the DECL_NAME, as that is what the rest of the
        !          2669:      compiler wants to use. */
        !          2670:   if (TREE_CODE (x) == TYPE_DECL)
        !          2671:     name = DECL_NAME (x);
        !          2672: #endif
        !          2673: 
        !          2674:   if (name)
        !          2675:     {
        !          2676:       char *file;
        !          2677:       int line;
        !          2678: 
        !          2679:       t = lookup_name_current_level (name);
        !          2680:       if (t == error_mark_node)
        !          2681:        {
        !          2682:          /* error_mark_node is 0 for a while during initialization!  */
        !          2683:          t = NULL_TREE;
        !          2684:          cp_error_at ("`%#D' used prior to declaration", x);
        !          2685:        }
        !          2686: 
        !          2687:       if (t != NULL_TREE)
        !          2688:        {
        !          2689:          if (TREE_CODE (t) == PARM_DECL)
        !          2690:            {
        !          2691:              if (DECL_CONTEXT (t) == NULL_TREE)
        !          2692:                fatal ("parse errors have confused me too much");
        !          2693:            }
        !          2694:          file = DECL_SOURCE_FILE (t);
        !          2695:          line = DECL_SOURCE_LINE (t);
        !          2696:        }
        !          2697: 
        !          2698:       if (t != NULL_TREE && TREE_CODE (t) != TREE_CODE (x))
        !          2699:        {
        !          2700:          if (TREE_CODE (t) == TYPE_DECL || TREE_CODE (x) == TYPE_DECL)
        !          2701:            {
        !          2702:              /* We do nothing special here, because C++ does such nasty
        !          2703:                 things with TYPE_DECLs.  Instead, just let the TYPE_DECL
        !          2704:                 get shadowed, and know that if we need to find a TYPE_DECL
        !          2705:                 for a given name, we can look in the IDENTIFIER_TYPE_VALUE
        !          2706:                 slot of the identifier.  */
        !          2707:              ;
        !          2708:            }
        !          2709:          else if (duplicate_decls (x, t))
        !          2710:            return t;
        !          2711:        }
        !          2712:       else if (t != NULL_TREE && duplicate_decls (x, t))
        !          2713:        {
        !          2714:          /* If this decl is `static' and an `extern' was seen previously,
        !          2715:             that is erroneous.  But don't complain if -traditional,
        !          2716:             since traditional compilers don't complain.
        !          2717: 
        !          2718:             Note that this does not apply to the C++ case of declaring
        !          2719:             a variable `extern const' and then later `const'.  */
        !          2720:          if (!flag_traditional && TREE_PUBLIC (name)
        !          2721:              && ! TREE_PUBLIC (x) && ! DECL_EXTERNAL (x) && ! DECL_INLINE (x))
        !          2722:            {
        !          2723:              /* Due to interference in memory reclamation (X may be
        !          2724:                 obstack-deallocated at this point), we must guard against
        !          2725:                 one really special case.  */
        !          2726:              if (current_function_decl == x)
        !          2727:                current_function_decl = t;
        !          2728:              if (IDENTIFIER_IMPLICIT_DECL (name))
        !          2729:                cp_warning ("`%D' was declared implicitly `extern' and later `static'", t);
        !          2730:              else
        !          2731:                cp_warning ("`%D' was declared `extern' and later `static'",
        !          2732:                            x);
        !          2733:              cp_warning_at ("previous declaration of `%D'", t);
        !          2734:            }
        !          2735: #if 0
        !          2736:          /* This is turned off until I have time to do it right (bpk).  */
        !          2737: 
        !          2738:          /* Also warn if they did a prototype with `static' on it, but
        !          2739:             then later left the `static' off.  */
        !          2740:          else if (! TREE_PUBLIC (name) && TREE_PUBLIC (x))
        !          2741:            {
        !          2742:              if (DECL_LANG_SPECIFIC (t) && DECL_FRIEND_P (t))
        !          2743:                return t;
        !          2744: 
        !          2745:              if (current_function_decl == x)
        !          2746:                current_function_decl = t;
        !          2747: 
        !          2748:              if (extra_warnings)
        !          2749:                {
        !          2750:                  cp_warning ("`static' missing from declaration of `%D'", t);
        !          2751:                  warning_with_file_and_line (file, line,
        !          2752:                                              "previous declaration of `%s'",
        !          2753:                                              decl_as_string (t, 0));
        !          2754:                }
        !          2755: 
        !          2756:              /* Now fix things so it'll do what they expect.  */
        !          2757:              if (current_function_decl)
        !          2758:                TREE_PUBLIC (current_function_decl) = 0;
        !          2759:            }
        !          2760: #endif
        !          2761:          return t;
        !          2762:        }
        !          2763: 
        !          2764:       /* If declaring a type as a typedef, and the type has no known
        !          2765:         typedef name, install this TYPE_DECL as its typedef name.  */
        !          2766:       if (TREE_CODE (x) == TYPE_DECL)
        !          2767:        {
        !          2768:          tree type = TREE_TYPE (x);
        !          2769:          tree name = (type != error_mark_node) ? TYPE_NAME (type) : x;
        !          2770: 
        !          2771:          if (name == NULL_TREE || TREE_CODE (name) != TYPE_DECL)
        !          2772:            {
        !          2773:              /* If these are different names, and we're at the global
        !          2774:                 binding level, make two equivalent definitions.  */
        !          2775:               name = x;
        !          2776:               if (global_bindings_p ())
        !          2777:                 TYPE_NAME (type) = x;
        !          2778:            }
        !          2779:          else
        !          2780:            {
        !          2781:              tree tname = DECL_NAME (name);
        !          2782: 
        !          2783:              if (global_bindings_p () && ANON_AGGRNAME_P (tname))
        !          2784:                {
        !          2785:                  /* do gratuitous C++ typedefing, and make sure that
        !          2786:                     we access this type either through TREE_TYPE field
        !          2787:                     or via the tags list.  */
        !          2788:                  TYPE_NAME (TREE_TYPE (x)) = x;
        !          2789:                  pushtag (tname, TREE_TYPE (x));
        !          2790:                }
        !          2791:            }
        !          2792:          my_friendly_assert (TREE_CODE (name) == TYPE_DECL, 140);
        !          2793: 
        !          2794:          if (DECL_NAME (name) && !DECL_NESTED_TYPENAME (name))
        !          2795:            set_nested_typename (x, current_class_name,
        !          2796:                                 DECL_NAME (name), type);
        !          2797: 
        !          2798:          if (type != error_mark_node
        !          2799:              && TYPE_NAME (type)
        !          2800:              && TYPE_IDENTIFIER (type))
        !          2801:             set_identifier_type_value (DECL_NAME (x), type);
        !          2802:        }
        !          2803: 
        !          2804:       /* Multiple external decls of the same identifier ought to match.
        !          2805: 
        !          2806:         We get warnings about inline functions where they are defined.
        !          2807:         Avoid duplicate warnings where they are used.  */
        !          2808:       if (TREE_PUBLIC (x) && !DECL_INLINE (x))
        !          2809:        {
        !          2810:          tree decl;
        !          2811: 
        !          2812:          if (IDENTIFIER_GLOBAL_VALUE (name) != NULL_TREE
        !          2813:              && (DECL_EXTERNAL (IDENTIFIER_GLOBAL_VALUE (name))
        !          2814:                  || TREE_PUBLIC (IDENTIFIER_GLOBAL_VALUE (name))))
        !          2815:            decl = IDENTIFIER_GLOBAL_VALUE (name);
        !          2816:          else
        !          2817:            decl = NULL_TREE;
        !          2818: 
        !          2819:          if (decl && ! comptypes (TREE_TYPE (x), TREE_TYPE (decl), 1)
        !          2820:              /* If old decl is built-in, we already warned if we should.  */
        !          2821:              && !DECL_BUILT_IN (decl))
        !          2822:            {
        !          2823:              cp_pedwarn_at ("type mismatch with previous external decl", x);
        !          2824:              cp_pedwarn_at ("previous external decl of `%D'", decl);
        !          2825:            }
        !          2826:        }
        !          2827: 
        !          2828:       /* In PCC-compatibility mode, extern decls of vars with no current decl
        !          2829:         take effect at top level no matter where they are.  */
        !          2830:       if (flag_traditional && DECL_EXTERNAL (x)
        !          2831:          && lookup_name (name, 0) == NULL_TREE)
        !          2832:        b = global_binding_level;
        !          2833: 
        !          2834:       /* This name is new in its binding level.
        !          2835:         Install the new declaration and return it.  */
        !          2836:       if (b == global_binding_level)
        !          2837:        {
        !          2838:          /* Install a global value.  */
        !          2839: 
        !          2840:          /* Rule for VAR_DECLs, but not for other kinds of _DECLs:
        !          2841:             A `const' which was not declared `extern' is invisible.  */
        !          2842:          if (TREE_CODE (x) == VAR_DECL
        !          2843:              && TREE_READONLY (x) && ! DECL_THIS_EXTERN (x))
        !          2844:            TREE_PUBLIC (x) = 0;
        !          2845: 
        !          2846:          /* If the first global decl has external linkage,
        !          2847:             warn if we later see static one.  */
        !          2848:          if (IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE && TREE_PUBLIC (x))
        !          2849:            TREE_PUBLIC (name) = 1;
        !          2850: 
        !          2851:          /* Don't install a TYPE_DECL if we already have another
        !          2852:             sort of _DECL with that name.  */
        !          2853:          if (TREE_CODE (x) != TYPE_DECL
        !          2854:              || t == NULL_TREE
        !          2855:              || TREE_CODE (t) == TYPE_DECL)
        !          2856:            IDENTIFIER_GLOBAL_VALUE (name) = x;
        !          2857: 
        !          2858:          /* Don't forget if the function was used via an implicit decl.  */
        !          2859:          if (IDENTIFIER_IMPLICIT_DECL (name)
        !          2860:              && TREE_USED (IDENTIFIER_IMPLICIT_DECL (name)))
        !          2861:            TREE_USED (x) = 1;
        !          2862: 
        !          2863:          /* Don't forget if its address was taken in that way.  */
        !          2864:          if (IDENTIFIER_IMPLICIT_DECL (name)
        !          2865:              && TREE_ADDRESSABLE (IDENTIFIER_IMPLICIT_DECL (name)))
        !          2866:            TREE_ADDRESSABLE (x) = 1;
        !          2867: 
        !          2868:          /* Warn about mismatches against previous implicit decl.  */
        !          2869:          if (IDENTIFIER_IMPLICIT_DECL (name) != NULL_TREE
        !          2870:              /* If this real decl matches the implicit, don't complain.  */
        !          2871:              && ! (TREE_CODE (x) == FUNCTION_DECL
        !          2872:                    && TREE_TYPE (TREE_TYPE (x)) == integer_type_node))
        !          2873:            cp_warning
        !          2874:              ("`%D' was previously implicitly declared to return `int'", x);
        !          2875: 
        !          2876:          /* If this decl is `static' and an `extern' was seen previously,
        !          2877:             that is erroneous.  Don't do this for TYPE_DECLs.  */
        !          2878:          if (TREE_PUBLIC (name)
        !          2879:              && TREE_CODE (x) != TYPE_DECL
        !          2880:              && ! TREE_PUBLIC (x) && ! DECL_EXTERNAL (x))
        !          2881:            {
        !          2882:              if (IDENTIFIER_IMPLICIT_DECL (name))
        !          2883:                cp_warning
        !          2884:                  ("`%D' was declared implicitly `extern' and later `static'",
        !          2885:                   x);
        !          2886:              else
        !          2887:                cp_warning
        !          2888:                  ("`%D' was declared `extern' and later `static'", x);
        !          2889:            }
        !          2890:        }
        !          2891:       else
        !          2892:        {
        !          2893:          /* Here to install a non-global value.  */
        !          2894:          tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
        !          2895:          tree oldglobal = IDENTIFIER_GLOBAL_VALUE (name);
        !          2896:          set_identifier_local_value (name, x);
        !          2897: 
        !          2898:          /* If this is an extern function declaration, see if we
        !          2899:             have a global definition or declaration for the function.  */
        !          2900:          if (oldlocal == NULL_TREE
        !          2901:              && DECL_EXTERNAL (x) && !DECL_INLINE (x)
        !          2902:              && oldglobal != NULL_TREE
        !          2903:              && TREE_CODE (x) == FUNCTION_DECL
        !          2904:              && TREE_CODE (oldglobal) == FUNCTION_DECL)
        !          2905:            {
        !          2906:              /* We have one.  Their types must agree.  */
        !          2907:              if (! comptypes (TREE_TYPE (x), TREE_TYPE (oldglobal), 1))
        !          2908:                {
        !          2909:                  cp_warning ("extern declaration of `%#D' doesn't match", x);
        !          2910:                  cp_warning_at ("global declaration `%#D'", oldglobal);
        !          2911:                }
        !          2912:              else
        !          2913:                {
        !          2914:                  /* Inner extern decl is inline if global one is.
        !          2915:                     Copy enough to really inline it.  */
        !          2916:                  if (DECL_INLINE (oldglobal))
        !          2917:                    {
        !          2918:                      DECL_INLINE (x) = DECL_INLINE (oldglobal);
        !          2919:                      DECL_INITIAL (x) = (current_function_decl == oldglobal
        !          2920:                                          ? NULL_TREE : DECL_INITIAL (oldglobal));
        !          2921:                      DECL_SAVED_INSNS (x) = DECL_SAVED_INSNS (oldglobal);
        !          2922:                      DECL_FRAME_SIZE (x) = DECL_FRAME_SIZE (oldglobal);
        !          2923:                      DECL_ARGUMENTS (x) = DECL_ARGUMENTS (oldglobal);
        !          2924:                      DECL_RESULT (x) = DECL_RESULT (oldglobal);
        !          2925:                      TREE_ASM_WRITTEN (x) = TREE_ASM_WRITTEN (oldglobal);
        !          2926:                      DECL_ABSTRACT_ORIGIN (x) = oldglobal;
        !          2927:                    }
        !          2928:                  /* Inner extern decl is built-in if global one is.  */
        !          2929:                  if (DECL_BUILT_IN (oldglobal))
        !          2930:                    {
        !          2931:                      DECL_BUILT_IN (x) = DECL_BUILT_IN (oldglobal);
        !          2932:                      DECL_SET_FUNCTION_CODE (x, DECL_FUNCTION_CODE (oldglobal));
        !          2933:                    }
        !          2934:                  /* Keep the arg types from a file-scope fcn defn.  */
        !          2935:                  if (TYPE_ARG_TYPES (TREE_TYPE (oldglobal)) != NULL_TREE
        !          2936:                      && DECL_INITIAL (oldglobal)
        !          2937:                      && TYPE_ARG_TYPES (TREE_TYPE (x)) == NULL_TREE)
        !          2938:                    TREE_TYPE (x) = TREE_TYPE (oldglobal);
        !          2939:                }
        !          2940:            }
        !          2941:          /* If we have a local external declaration,
        !          2942:             and no file-scope declaration has yet been seen,
        !          2943:             then if we later have a file-scope decl it must not be static.  */
        !          2944:          if (oldlocal == NULL_TREE
        !          2945:              && oldglobal == NULL_TREE
        !          2946:              && DECL_EXTERNAL (x)
        !          2947:              && TREE_PUBLIC (x))
        !          2948:            {
        !          2949:              TREE_PUBLIC (name) = 1;
        !          2950:            }
        !          2951: 
        !          2952:          if (DECL_FROM_INLINE (x))
        !          2953:            /* Inline decls shadow nothing.  */;
        !          2954: 
        !          2955:          /* Warn if shadowing an argument at the top level of the body.  */
        !          2956:          else if (oldlocal != NULL_TREE && !DECL_EXTERNAL (x)
        !          2957:              && TREE_CODE (oldlocal) == PARM_DECL
        !          2958:              && TREE_CODE (x) != PARM_DECL)
        !          2959:            {
        !          2960:              /* Go to where the parms should be and see if we
        !          2961:                 find them there.  */
        !          2962:              struct binding_level *b = current_binding_level->level_chain;
        !          2963: 
        !          2964:              if (cleanup_label)
        !          2965:                b = b->level_chain;
        !          2966: 
        !          2967:              /* ARM $8.3 */
        !          2968:              if (b->parm_flag == 1)
        !          2969:                cp_error ("declaration of `%#D' shadows a parameter", name);
        !          2970:            }
        !          2971:          /* Maybe warn if shadowing something else.  */
        !          2972:          else if (warn_shadow && !DECL_EXTERNAL (x)
        !          2973:                   /* No shadow warnings for internally generated vars.  */
        !          2974:                   && DECL_SOURCE_LINE (x) != 0
        !          2975:                   /* No shadow warnings for vars made for inlining.  */
        !          2976:                   && ! DECL_FROM_INLINE (x))
        !          2977:            {
        !          2978:              char *warnstring = NULL;
        !          2979: 
        !          2980:              if (oldlocal != NULL_TREE && TREE_CODE (oldlocal) == PARM_DECL)
        !          2981:                warnstring = "declaration of `%s' shadows a parameter";
        !          2982:              else if (IDENTIFIER_CLASS_VALUE (name) != NULL_TREE
        !          2983:                       && !TREE_STATIC (name))
        !          2984:                warnstring = "declaration of `%s' shadows a member of `this'";
        !          2985:              else if (oldlocal != NULL_TREE)
        !          2986:                warnstring = "declaration of `%s' shadows previous local";
        !          2987:              else if (oldglobal != NULL_TREE)
        !          2988:                warnstring = "declaration of `%s' shadows global declaration";
        !          2989: 
        !          2990:              if (warnstring)
        !          2991:                warning (warnstring, IDENTIFIER_POINTER (name));
        !          2992:            }
        !          2993: 
        !          2994:          /* If storing a local value, there may already be one (inherited).
        !          2995:             If so, record it for restoration when this binding level ends.  */
        !          2996:          if (oldlocal != NULL_TREE)
        !          2997:            b->shadowed = tree_cons (name, oldlocal, b->shadowed);
        !          2998:        }
        !          2999: 
        !          3000:       /* Keep count of variables in this level with incomplete type.  */
        !          3001:       if (TREE_CODE (x) != TEMPLATE_DECL
        !          3002:          && TREE_CODE (x) != CPLUS_CATCH_DECL
        !          3003:          && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE
        !          3004:          && PROMOTES_TO_AGGR_TYPE (TREE_TYPE (x), ARRAY_TYPE))
        !          3005:        {
        !          3006:          if (++b->n_incomplete == 0)
        !          3007:            error ("too many incomplete variables at this point");
        !          3008:        }
        !          3009:     }
        !          3010: 
        !          3011:   if (TREE_CODE (x) == TYPE_DECL && name != NULL_TREE)
        !          3012:     {
        !          3013: #if !NEW_CLASS_SCOPING
        !          3014:       adjust_type_value (name);
        !          3015: #endif
        !          3016:       if (current_class_name)
        !          3017:        {
        !          3018:          if (!DECL_NESTED_TYPENAME (x))
        !          3019:            set_nested_typename (x, current_class_name, DECL_NAME (x),
        !          3020:                                 TREE_TYPE (x));
        !          3021: #if !NEW_CLASS_SCOPING
        !          3022:          adjust_type_value (DECL_NESTED_TYPENAME (x));
        !          3023: #endif
        !          3024:        }
        !          3025:     }
        !          3026: 
        !          3027:   /* Put decls on list in reverse order.
        !          3028:      We will reverse them later if necessary.  */
        !          3029:   TREE_CHAIN (x) = b->names;
        !          3030:   b->names = x;
        !          3031:   if (! (b != global_binding_level || TREE_PERMANENT (x)))
        !          3032:     my_friendly_abort (124);
        !          3033: 
        !          3034:   return x;
        !          3035: }
        !          3036: 
        !          3037: /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL,
        !          3038:    if appropriate.  */
        !          3039: tree
        !          3040: pushdecl_top_level (x)
        !          3041:      tree x;
        !          3042: {
        !          3043:   register tree t;
        !          3044:   register struct binding_level *b = current_binding_level;
        !          3045: 
        !          3046:   current_binding_level = global_binding_level;
        !          3047:   t = pushdecl (x);
        !          3048:   current_binding_level = b;
        !          3049:   if (class_binding_level)
        !          3050:     b = class_binding_level;
        !          3051:   /* Now, the type_shadowed stack may screw us.  Munge it so it does
        !          3052:      what we want.  */
        !          3053:   if (TREE_CODE (x) == TYPE_DECL)
        !          3054:     {
        !          3055:       tree name = DECL_NAME (x);
        !          3056:       tree newval;
        !          3057:       tree *ptr = (tree *)0;
        !          3058:       for (; b != global_binding_level; b = b->level_chain)
        !          3059:         {
        !          3060:           tree shadowed = b->type_shadowed;
        !          3061:           for (; shadowed; shadowed = TREE_CHAIN (shadowed))
        !          3062:             if (TREE_PURPOSE (shadowed) == name)
        !          3063:               {
        !          3064:                ptr = &TREE_VALUE (shadowed);
        !          3065:                /* Can't break out of the loop here because sometimes
        !          3066:                   a binding level will have duplicate bindings for
        !          3067:                   PT names.  It's gross, but I haven't time to fix it.  */
        !          3068:               }
        !          3069:         }
        !          3070:       newval = TREE_TYPE (x);
        !          3071:       if (ptr == (tree *)0)
        !          3072:         {
        !          3073:           /* @@ This shouldn't be needed.  My test case "zstring.cc" trips
        !          3074:              up here if this is changed to an assertion.  --KR  */
        !          3075:          SET_IDENTIFIER_TYPE_VALUE (name, newval);
        !          3076:        }
        !          3077:       else
        !          3078:         {
        !          3079: #if 0
        !          3080:          /* Disabled this 11/10/92, since there are many cases which
        !          3081:             behave just fine when *ptr doesn't satisfy either of these.
        !          3082:             For example, nested classes declared as friends of their enclosing
        !          3083:             class will not meet this criteria.  (bpk) */
        !          3084:          my_friendly_assert (*ptr == NULL_TREE || *ptr == newval, 141);
        !          3085: #endif
        !          3086:          *ptr = newval;
        !          3087:         }
        !          3088:     }
        !          3089:   return t;
        !          3090: }
        !          3091: 
        !          3092: /* Like push_overloaded_decl, only it places X in GLOBAL_BINDING_LEVEL,
        !          3093:    if appropriate.  */
        !          3094: void
        !          3095: push_overloaded_decl_top_level (x, forget)
        !          3096:      tree x;
        !          3097:      int forget;
        !          3098: {
        !          3099:   struct binding_level *b = current_binding_level;
        !          3100: 
        !          3101:   current_binding_level = global_binding_level;
        !          3102:   push_overloaded_decl (x, forget);
        !          3103:   current_binding_level = b;
        !          3104: }
        !          3105: 
        !          3106: /* Make the declaration of X appear in CLASS scope.  */
        !          3107: tree
        !          3108: pushdecl_class_level (x)
        !          3109:      tree x;
        !          3110: {
        !          3111:   /* Don't use DECL_ASSEMBLER_NAME here!  Everything that looks in class
        !          3112:      scope looks for the pre-mangled name.  */
        !          3113:   register tree name = DECL_NAME (x);
        !          3114: 
        !          3115:   if (name)
        !          3116:     {
        !          3117: #if NEW_CLASS_SCOPING
        !          3118:       push_class_level_binding (name, x);
        !          3119:       if (TREE_CODE (x) == TYPE_DECL)
        !          3120:        {
        !          3121:          set_identifier_type_value (name, TREE_TYPE (x));
        !          3122:          if (!DECL_NESTED_TYPENAME (x))
        !          3123:            set_nested_typename (x, current_class_name, name, TREE_TYPE (x));
        !          3124:        }
        !          3125: #else
        !          3126:       tree oldclass = IDENTIFIER_CLASS_VALUE (name);
        !          3127:       if (oldclass)
        !          3128:        class_binding_level->class_shadowed
        !          3129:          = tree_cons (name, oldclass, class_binding_level->class_shadowed);
        !          3130:       IDENTIFIER_CLASS_VALUE (name) = x;
        !          3131:       obstack_ptr_grow (&decl_obstack, x);
        !          3132:       if (TREE_CODE (x) == TYPE_DECL && !DECL_NESTED_TYPENAME (x))
        !          3133:        set_nested_typename (x, current_class_name, name, TREE_TYPE (x));
        !          3134: #endif
        !          3135:     }
        !          3136:   return x;
        !          3137: }
        !          3138: 
        !          3139: #if NEW_CLASS_SCOPING
        !          3140: /* Make the declaration(s) of X appear in CLASS scope
        !          3141:    under the name NAME.  */
        !          3142: void
        !          3143: push_class_level_binding (name, x)
        !          3144:      tree name;
        !          3145:      tree x;
        !          3146: {
        !          3147:   maybe_push_cache_obstack ();
        !          3148:   class_binding_level->class_shadowed
        !          3149:       = tree_cons (name, IDENTIFIER_CLASS_VALUE (name),
        !          3150:                   class_binding_level->class_shadowed);
        !          3151:   pop_obstacks ();
        !          3152:   IDENTIFIER_CLASS_VALUE (name) = x;
        !          3153:   obstack_ptr_grow (&decl_obstack, x);
        !          3154: }
        !          3155: #endif
        !          3156: 
        !          3157: /* Tell caller how to interpret a TREE_LIST which contains
        !          3158:    chains of FUNCTION_DECLS.  */
        !          3159: int
        !          3160: overloaded_globals_p (list)
        !          3161:      tree list;
        !          3162: {
        !          3163:   my_friendly_assert (TREE_CODE (list) == TREE_LIST, 142);
        !          3164: 
        !          3165:   /* Don't commit caller to seeing them as globals.  */
        !          3166:   if (TREE_NONLOCAL_FLAG (list))
        !          3167:     return -1;
        !          3168:   /* Do commit caller to seeing them as globals.  */
        !          3169:   if (TREE_CODE (TREE_PURPOSE (list)) == IDENTIFIER_NODE)
        !          3170:     return 1;
        !          3171:   /* Do commit caller to not seeing them as globals.  */
        !          3172:   return 0;
        !          3173: }
        !          3174: 
        !          3175: /* DECL is a FUNCTION_DECL which may have other definitions already in place.
        !          3176:    We get around this by making IDENTIFIER_GLOBAL_VALUE (DECL_NAME (DECL))
        !          3177:    point to a list of all the things that want to be referenced by that name.
        !          3178:    It is then up to the users of that name to decide what to do with that
        !          3179:    list.
        !          3180: 
        !          3181:    DECL may also be a TEMPLATE_DECL, with a FUNCTION_DECL in its DECL_RESULT
        !          3182:    slot.  It is dealt with the same way.
        !          3183: 
        !          3184:    The value returned may be a previous declaration if we guessed wrong
        !          3185:    about what language DECL should belong to (C or C++).  Otherwise,
        !          3186:    it's always DECL (and never something that's not a _DECL).  */
        !          3187: tree
        !          3188: push_overloaded_decl (decl, forgettable)
        !          3189:      tree decl;
        !          3190:      int forgettable;
        !          3191: {
        !          3192:   tree orig_name = DECL_NAME (decl);
        !          3193:   tree glob = IDENTIFIER_GLOBAL_VALUE (orig_name);
        !          3194: 
        !          3195:   DECL_OVERLOADED (decl) = 1;
        !          3196:   if (glob)
        !          3197:     {
        !          3198:       if (TREE_CODE (glob) != TREE_LIST)
        !          3199:        {
        !          3200:          if (DECL_HAS_C_LINKAGE (decl))
        !          3201:            {
        !          3202:              if (TREE_CODE (glob) == FUNCTION_DECL)
        !          3203:                {
        !          3204:                  if (DECL_HAS_C_LINKAGE (glob))
        !          3205:                    {
        !          3206:                      cp_error ("C-language function `%D' overloaded here", decl);
        !          3207:                      cp_error_at ("Previous C-language version of this function was `%D'", glob);
        !          3208:                    }
        !          3209:                }
        !          3210:              else
        !          3211:                my_friendly_abort (9);
        !          3212:            }
        !          3213:          if (forgettable
        !          3214:              && ! flag_traditional
        !          3215:              && TREE_PERMANENT (glob) == 1
        !          3216:              && !global_bindings_p ())
        !          3217:            overloads_to_forget = tree_cons (orig_name, glob, overloads_to_forget);
        !          3218:          /* We cache the value of builtin functions as ADDR_EXPRs
        !          3219:             in the name space.  Convert it to some kind of _DECL after
        !          3220:             remembering what to forget.  */
        !          3221:          if (TREE_CODE (glob) == ADDR_EXPR)
        !          3222:            glob = TREE_OPERAND (glob, 0);
        !          3223: 
        !          3224:          if (TREE_CODE (glob) == FUNCTION_DECL
        !          3225:              && ! DECLS_SAME_LINKAGE (glob, decl)
        !          3226:              && comptypes (TREE_TYPE (glob), TREE_TYPE (decl), 2))
        !          3227:            {
        !          3228:              if (current_lang_stack == current_lang_base)
        !          3229:                {
        !          3230:                  DECL_LANGUAGE (decl) = DECL_LANGUAGE (glob);
        !          3231:                  return glob;
        !          3232:                }
        !          3233:              else
        !          3234:                {
        !          3235:                  cp_error ("conflicting language contexts for declaration of `%D';", decl);
        !          3236:                  cp_error_at ("conflicts with previous declaration here", glob);
        !          3237:                }
        !          3238:            }
        !          3239:          if (pedantic && TREE_CODE (glob) == VAR_DECL)
        !          3240:            {
        !          3241:              my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (glob)) == 'd', 143);
        !          3242:              cp_error ("non-function declaration `%D'", glob);
        !          3243:              cp_error_at ("conflicts with function declaration `%D'", decl);
        !          3244:            }
        !          3245:          glob = tree_cons (orig_name, glob, NULL_TREE);
        !          3246:          glob = tree_cons (TREE_PURPOSE (glob), decl, glob);
        !          3247:          IDENTIFIER_GLOBAL_VALUE (orig_name) = glob;
        !          3248:          TREE_TYPE (glob) = unknown_type_node;
        !          3249:          return decl;
        !          3250:        }
        !          3251: 
        !          3252:       if (TREE_VALUE (glob) == NULL_TREE)
        !          3253:        {
        !          3254:          TREE_VALUE (glob) = decl;
        !          3255:          return decl;
        !          3256:        }
        !          3257:       if (TREE_CODE (decl) != TEMPLATE_DECL)
        !          3258:         {
        !          3259:           tree name = DECL_ASSEMBLER_NAME (decl);
        !          3260:           tree tmp;
        !          3261:          
        !          3262:          for (tmp = glob; tmp; tmp = TREE_CHAIN (tmp))
        !          3263:            {
        !          3264:              if (TREE_CODE (TREE_VALUE (tmp)) == FUNCTION_DECL
        !          3265:                  && comptypes (TREE_TYPE (TREE_VALUE (tmp)), TREE_TYPE (decl),
        !          3266:                                2))
        !          3267:                {
        !          3268:                  if (! DECLS_SAME_LINKAGE (TREE_VALUE (tmp), decl))
        !          3269:                    {
        !          3270:                      cp_error_at ("conflicting language contexts for declaration of `%D';", decl);
        !          3271:                      cp_error_at ("conflicts with previous declaration here", TREE_VALUE (tmp));
        !          3272:                    }
        !          3273:                  else if (TREE_CODE (TREE_VALUE (tmp)) != TEMPLATE_DECL
        !          3274:                           && DECL_ASSEMBLER_NAME (TREE_VALUE (tmp)) != name)
        !          3275:                    {
        !          3276:                      cp_error ("new declaration `%#D'", decl);
        !          3277:                      cp_error_at ("ambiguates old declaration `%#D'",
        !          3278:                                     TREE_VALUE (tmp));
        !          3279:                    }
        !          3280:                }
        !          3281:              /* If we really have seen this before, then if it ambiguates
        !          3282:                 something, we've already given an error before.  */
        !          3283:              if (TREE_CODE (TREE_VALUE (tmp)) != TEMPLATE_DECL
        !          3284:                  && DECL_ASSEMBLER_NAME (TREE_VALUE (tmp)) == name)
        !          3285:                return decl;
        !          3286:            }
        !          3287:        }
        !          3288:     }
        !          3289:   if (DECL_HAS_C_LINKAGE (decl))
        !          3290:     {
        !          3291:       tree decls = glob;
        !          3292:       while (decls && DECL_HAS_CPLUSPLUS_LINKAGE (TREE_VALUE (decls)))
        !          3293:        decls = TREE_CHAIN (decls);
        !          3294:       if (decls)
        !          3295:        {
        !          3296:          cp_error ("C-language function `%D' overloaded here", decl);
        !          3297:          cp_error_at
        !          3298:            ("Previous C-language version of this function was `%D'",
        !          3299:             TREE_VALUE (decls));
        !          3300:        }
        !          3301:     }
        !          3302: 
        !          3303:   if (forgettable
        !          3304:       && ! flag_traditional
        !          3305:       && (glob == NULL_TREE || TREE_PERMANENT (glob) == 1)
        !          3306:       && !global_bindings_p ()
        !          3307:       && !pseudo_global_level_p ())
        !          3308:     overloads_to_forget = tree_cons (orig_name, glob, overloads_to_forget);
        !          3309:   glob = tree_cons (orig_name, decl, glob);
        !          3310:   IDENTIFIER_GLOBAL_VALUE (orig_name) = glob;
        !          3311:   TREE_TYPE (glob) = unknown_type_node;
        !          3312:   return decl;
        !          3313: }
        !          3314: 
        !          3315: /* Generate an implicit declaration for identifier FUNCTIONID
        !          3316:    as a function of type int ().  Print a warning if appropriate.  */
        !          3317: 
        !          3318: tree
        !          3319: implicitly_declare (functionid)
        !          3320:      tree functionid;
        !          3321: {
        !          3322:   register tree decl;
        !          3323:   int temp = allocation_temporary_p ();
        !          3324: 
        !          3325:   push_obstacks_nochange ();
        !          3326: 
        !          3327:   /* Save the decl permanently so we can warn if definition follows.
        !          3328:      In ANSI C, warn_implicit is usually false, so the saves little space.
        !          3329:      But in C++, it's usually true, hence the extra code.  */
        !          3330:   if (temp && (flag_traditional || !warn_implicit
        !          3331:               || current_binding_level == global_binding_level))
        !          3332:     end_temporary_allocation ();
        !          3333: 
        !          3334:   /* We used to reuse an old implicit decl here,
        !          3335:      but this loses with inline functions because it can clobber
        !          3336:      the saved decl chains.  */
        !          3337:   decl = build_lang_decl (FUNCTION_DECL, functionid, default_function_type);
        !          3338: 
        !          3339:   DECL_EXTERNAL (decl) = 1;
        !          3340:   TREE_PUBLIC (decl) = 1;
        !          3341: 
        !          3342:   /* ANSI standard says implicit declarations are in the innermost block.
        !          3343:      So we record the decl in the standard fashion.
        !          3344:      If flag_traditional is set, pushdecl does it top-level.  */
        !          3345:   pushdecl (decl);
        !          3346:   rest_of_decl_compilation (decl, NULL_PTR, 0, 0);
        !          3347: 
        !          3348:   if (warn_implicit
        !          3349:       /* Only one warning per identifier.  */
        !          3350:       && IDENTIFIER_IMPLICIT_DECL (functionid) == NULL_TREE)
        !          3351:     {
        !          3352:       cp_pedwarn ("implicit declaration of function `%#D'", decl);
        !          3353:     }
        !          3354: 
        !          3355:   SET_IDENTIFIER_IMPLICIT_DECL (functionid, decl);
        !          3356: 
        !          3357:   pop_obstacks ();
        !          3358: 
        !          3359:   return decl;
        !          3360: }
        !          3361: 
        !          3362: /* Return zero if the declaration NEWDECL is valid
        !          3363:    when the declaration OLDDECL (assumed to be for the same name)
        !          3364:    has already been seen.
        !          3365:    Otherwise return an error message format string with a %s
        !          3366:    where the identifier should go.  */
        !          3367: 
        !          3368: static char *
        !          3369: redeclaration_error_message (newdecl, olddecl)
        !          3370:      tree newdecl, olddecl;
        !          3371: {
        !          3372:   if (TREE_CODE (newdecl) == TYPE_DECL)
        !          3373:     {
        !          3374:       /* Because C++ can put things into name space for free,
        !          3375:         constructs like "typedef struct foo { ... } foo"
        !          3376:         would look like an erroneous redeclaration.  */
        !          3377:       if (comptypes (newdecl, olddecl, 0))
        !          3378:        return 0;
        !          3379:       else
        !          3380:        return "redefinition of `%s'";
        !          3381:     }
        !          3382:   else if (TREE_CODE (newdecl) == FUNCTION_DECL)
        !          3383:     {
        !          3384:       /* If this is a pure function, its olddecl will actually be
        !          3385:         the original initialization to `0' (which we force to call
        !          3386:         abort()).  Don't complain about redefinition in this case.  */
        !          3387:       if (DECL_LANG_SPECIFIC (olddecl) && DECL_ABSTRACT_VIRTUAL_P (olddecl))
        !          3388:        return 0;
        !          3389: 
        !          3390:       /* Declarations of functions can insist on internal linkage
        !          3391:         but they can't be inconsistent with internal linkage,
        !          3392:         so there can be no error on that account.
        !          3393:         However defining the same name twice is no good.  */
        !          3394:       if (DECL_INITIAL (olddecl) != NULL_TREE
        !          3395:          && DECL_INITIAL (newdecl) != NULL_TREE
        !          3396:          /* However, defining once as extern inline and a second
        !          3397:             time in another way is ok.  */
        !          3398:          && !(DECL_INLINE (olddecl) && DECL_EXTERNAL (olddecl)
        !          3399:               && !(DECL_INLINE (newdecl) && DECL_EXTERNAL (newdecl))))
        !          3400:        {
        !          3401:          if (DECL_NAME (olddecl) == NULL_TREE)
        !          3402:            return "`%s' not declared in class";
        !          3403:          else
        !          3404:            return "redefinition of `%s'";
        !          3405:        }
        !          3406:       return 0;
        !          3407:     }
        !          3408:   else if (current_binding_level == global_binding_level)
        !          3409:     {
        !          3410:       /* Objects declared at top level:  */
        !          3411:       /* If at least one is a reference, it's ok.  */
        !          3412:       if (DECL_EXTERNAL (newdecl) || DECL_EXTERNAL (olddecl))
        !          3413:        return 0;
        !          3414:       /* Reject two definitions.  */
        !          3415:       if (DECL_INITIAL (olddecl) != NULL_TREE
        !          3416:          && DECL_INITIAL (newdecl) != NULL_TREE)
        !          3417:        return "redefinition of `%s'";
        !          3418:       /* Now we have two tentative defs, or one tentative and one real def.  */
        !          3419:       /* Insist that the linkage match.  */
        !          3420:       if (TREE_PUBLIC (olddecl) != TREE_PUBLIC (newdecl))
        !          3421:        return "conflicting declarations of `%s'";
        !          3422:       return 0;
        !          3423:     }
        !          3424:   else
        !          3425:     {
        !          3426:       /* Objects declared with block scope:  */
        !          3427:       /* Reject two definitions, and reject a definition
        !          3428:         together with an external reference.  */
        !          3429:       if (!(DECL_EXTERNAL (newdecl) && DECL_EXTERNAL (olddecl)))
        !          3430:        return "redeclaration of `%s'";
        !          3431:       return 0;
        !          3432:     }
        !          3433: }
        !          3434: 
        !          3435: /* Get the LABEL_DECL corresponding to identifier ID as a label.
        !          3436:    Create one if none exists so far for the current function.
        !          3437:    This function is called for both label definitions and label references.  */
        !          3438: 
        !          3439: tree
        !          3440: lookup_label (id)
        !          3441:      tree id;
        !          3442: {
        !          3443:   register tree decl = IDENTIFIER_LABEL_VALUE (id);
        !          3444: 
        !          3445:   if (current_function_decl == NULL_TREE)
        !          3446:     {
        !          3447:       error ("label `%s' referenced outside of any function",
        !          3448:             IDENTIFIER_POINTER (id));
        !          3449:       return NULL_TREE;
        !          3450:     }
        !          3451: 
        !          3452:   if ((decl == NULL_TREE
        !          3453:       || DECL_SOURCE_LINE (decl) == 0)
        !          3454:       && (named_label_uses == NULL_TREE
        !          3455:          || TREE_PURPOSE (named_label_uses) != current_binding_level->names
        !          3456:          || TREE_VALUE (named_label_uses) != decl))
        !          3457:     {
        !          3458:       named_label_uses
        !          3459:        = tree_cons (current_binding_level->names, decl, named_label_uses);
        !          3460:       TREE_TYPE (named_label_uses) = (tree)current_binding_level;
        !          3461:     }
        !          3462: 
        !          3463:   /* Use a label already defined or ref'd with this name.  */
        !          3464:   if (decl != NULL_TREE)
        !          3465:     {
        !          3466:       /* But not if it is inherited and wasn't declared to be inheritable.  */
        !          3467:       if (DECL_CONTEXT (decl) != current_function_decl
        !          3468:          && ! C_DECLARED_LABEL_FLAG (decl))
        !          3469:        return shadow_label (id);
        !          3470:       return decl;
        !          3471:     }
        !          3472: 
        !          3473:   decl = build_decl (LABEL_DECL, id, void_type_node);
        !          3474: 
        !          3475:   /* A label not explicitly declared must be local to where it's ref'd.  */
        !          3476:   DECL_CONTEXT (decl) = current_function_decl;
        !          3477: 
        !          3478:   DECL_MODE (decl) = VOIDmode;
        !          3479: 
        !          3480:   /* Say where one reference is to the label,
        !          3481:      for the sake of the error if it is not defined.  */
        !          3482:   DECL_SOURCE_LINE (decl) = lineno;
        !          3483:   DECL_SOURCE_FILE (decl) = input_filename;
        !          3484: 
        !          3485:   SET_IDENTIFIER_LABEL_VALUE (id, decl);
        !          3486: 
        !          3487:   named_labels = tree_cons (NULL_TREE, decl, named_labels);
        !          3488:   TREE_VALUE (named_label_uses) = decl;
        !          3489: 
        !          3490:   return decl;
        !          3491: }
        !          3492: 
        !          3493: /* Make a label named NAME in the current function,
        !          3494:    shadowing silently any that may be inherited from containing functions
        !          3495:    or containing scopes.
        !          3496: 
        !          3497:    Note that valid use, if the label being shadowed
        !          3498:    comes from another scope in the same function,
        !          3499:    requires calling declare_nonlocal_label right away.  */
        !          3500: 
        !          3501: tree
        !          3502: shadow_label (name)
        !          3503:      tree name;
        !          3504: {
        !          3505:   register tree decl = IDENTIFIER_LABEL_VALUE (name);
        !          3506: 
        !          3507:   if (decl != NULL_TREE)
        !          3508:     {
        !          3509:       shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels);
        !          3510:       SET_IDENTIFIER_LABEL_VALUE (name, NULL_TREE);
        !          3511:       SET_IDENTIFIER_LABEL_VALUE (decl, NULL_TREE);
        !          3512:     }
        !          3513: 
        !          3514:   return lookup_label (name);
        !          3515: }
        !          3516: 
        !          3517: /* Define a label, specifying the location in the source file.
        !          3518:    Return the LABEL_DECL node for the label, if the definition is valid.
        !          3519:    Otherwise return 0.  */
        !          3520: 
        !          3521: tree
        !          3522: define_label (filename, line, name)
        !          3523:      char *filename;
        !          3524:      int line;
        !          3525:      tree name;
        !          3526: {
        !          3527:   tree decl = lookup_label (name);
        !          3528: 
        !          3529:   /* After labels, make any new cleanups go into their
        !          3530:      own new (temporary) binding contour.  */
        !          3531:   current_binding_level->more_cleanups_ok = 0;
        !          3532: 
        !          3533:   /* If label with this name is known from an outer context, shadow it.  */
        !          3534:   if (decl != NULL_TREE && DECL_CONTEXT (decl) != current_function_decl)
        !          3535:     {
        !          3536:       shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels);
        !          3537:       SET_IDENTIFIER_LABEL_VALUE (name, NULL_TREE);
        !          3538:       decl = lookup_label (name);
        !          3539:     }
        !          3540: 
        !          3541:   if (DECL_INITIAL (decl) != NULL_TREE)
        !          3542:     {
        !          3543:       cp_error ("duplicate label `%D'", decl);
        !          3544:       return 0;
        !          3545:     }
        !          3546:   else
        !          3547:     {
        !          3548:       tree uses, prev;
        !          3549: 
        !          3550:       /* Mark label as having been defined.  */
        !          3551:       DECL_INITIAL (decl) = error_mark_node;
        !          3552:       /* Say where in the source.  */
        !          3553:       DECL_SOURCE_FILE (decl) = filename;
        !          3554:       DECL_SOURCE_LINE (decl) = line;
        !          3555: 
        !          3556:       for (prev = NULL_TREE, uses = named_label_uses;
        !          3557:           uses;
        !          3558:           prev = uses, uses = TREE_CHAIN (uses))
        !          3559:        if (TREE_VALUE (uses) == decl)
        !          3560:          {
        !          3561:            struct binding_level *b = current_binding_level;
        !          3562:            while (b)
        !          3563:              {
        !          3564:                tree new_decls = b->names;
        !          3565:                tree old_decls = ((tree)b == TREE_TYPE (uses)
        !          3566:                                  ? TREE_PURPOSE (uses) : NULL_TREE);
        !          3567:                while (new_decls != old_decls)
        !          3568:                  {
        !          3569:                    if (TREE_CODE (new_decls) == VAR_DECL
        !          3570:                        /* Don't complain about crossing initialization
        !          3571:                           of internal entities.  They can't be accessed,
        !          3572:                           and they should be cleaned up
        !          3573:                           by the time we get to the label.  */
        !          3574:                        && DECL_SOURCE_LINE (new_decls) != 0
        !          3575:                        && ((DECL_INITIAL (new_decls) != NULL_TREE
        !          3576:                             && DECL_INITIAL (new_decls) != error_mark_node)
        !          3577:                            || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (new_decls))))
        !          3578:                      {
        !          3579:                        if (IDENTIFIER_ERROR_LOCUS (decl) == NULL_TREE)
        !          3580:                          cp_error ("invalid jump to label `%D'", decl);
        !          3581:                        SET_IDENTIFIER_ERROR_LOCUS (decl, current_function_decl);
        !          3582:                        cp_error ("crosses initialization of `%D'", new_decls);
        !          3583:                      }
        !          3584:                    new_decls = TREE_CHAIN (new_decls);
        !          3585:                  }
        !          3586:                if ((tree)b == TREE_TYPE (uses))
        !          3587:                  break;
        !          3588:                b = b->level_chain;
        !          3589:              }
        !          3590: 
        !          3591:            if (prev)
        !          3592:              TREE_CHAIN (prev) = TREE_CHAIN (uses);
        !          3593:            else
        !          3594:              named_label_uses = TREE_CHAIN (uses);
        !          3595:          }
        !          3596:       current_function_return_value = NULL_TREE;
        !          3597:       return decl;
        !          3598:     }
        !          3599: }
        !          3600: 
        !          3601: /* Same, but for CASE labels.  If DECL is NULL_TREE, it's the default.  */
        !          3602: /* XXX Note decl is never actually used. (bpk) */
        !          3603: void
        !          3604: define_case_label (decl)
        !          3605:      tree decl;
        !          3606: {
        !          3607:   tree cleanup = last_cleanup_this_contour ();
        !          3608:   if (cleanup)
        !          3609:     {
        !          3610:       static int explained = 0;
        !          3611:       cp_error_at ("destructor needed for `%#D'", TREE_PURPOSE (cleanup));
        !          3612:       error ("where case label appears here");
        !          3613:       if (!explained)
        !          3614:        {
        !          3615:          error ("(enclose actions of previous case statements requiring");
        !          3616:          error ("destructors in their own binding contours.)");
        !          3617:          explained = 1;
        !          3618:        }
        !          3619:     }
        !          3620: 
        !          3621:   /* After labels, make any new cleanups go into their
        !          3622:      own new (temporary) binding contour.  */
        !          3623: 
        !          3624:   current_binding_level->more_cleanups_ok = 0;
        !          3625:   current_function_return_value = NULL_TREE;
        !          3626: }
        !          3627: 
        !          3628: /* Return the list of declarations of the current level.
        !          3629:    Note that this list is in reverse order unless/until
        !          3630:    you nreverse it; and when you do nreverse it, you must
        !          3631:    store the result back using `storedecls' or you will lose.  */
        !          3632: 
        !          3633: tree
        !          3634: getdecls ()
        !          3635: {
        !          3636:   return current_binding_level->names;
        !          3637: }
        !          3638: 
        !          3639: /* Return the list of type-tags (for structs, etc) of the current level.  */
        !          3640: 
        !          3641: tree
        !          3642: gettags ()
        !          3643: {
        !          3644:   return current_binding_level->tags;
        !          3645: }
        !          3646: 
        !          3647: /* Store the list of declarations of the current level.
        !          3648:    This is done for the parameter declarations of a function being defined,
        !          3649:    after they are modified in the light of any missing parameters.  */
        !          3650: 
        !          3651: static void
        !          3652: storedecls (decls)
        !          3653:      tree decls;
        !          3654: {
        !          3655:   current_binding_level->names = decls;
        !          3656: }
        !          3657: 
        !          3658: /* Similarly, store the list of tags of the current level.  */
        !          3659: 
        !          3660: static void
        !          3661: storetags (tags)
        !          3662:      tree tags;
        !          3663: {
        !          3664:   current_binding_level->tags = tags;
        !          3665: }
        !          3666: 
        !          3667: /* Given NAME, an IDENTIFIER_NODE,
        !          3668:    return the structure (or union or enum) definition for that name.
        !          3669:    Searches binding levels from BINDING_LEVEL up to the global level.
        !          3670:    If THISLEVEL_ONLY is nonzero, searches only the specified context
        !          3671:    (but skips any tag-transparent contexts to find one that is
        !          3672:    meaningful for tags).
        !          3673:    FORM says which kind of type the caller wants;
        !          3674:    it is RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE.
        !          3675:    If the wrong kind of type is found, and it's not a template, an error is
        !          3676:    reported.  */
        !          3677: 
        !          3678: static tree
        !          3679: lookup_tag (form, name, binding_level, thislevel_only)
        !          3680:      enum tree_code form;
        !          3681:      struct binding_level *binding_level;
        !          3682:      tree name;
        !          3683:      int thislevel_only;
        !          3684: {
        !          3685:   register struct binding_level *level;
        !          3686: 
        !          3687:   for (level = binding_level; level; level = level->level_chain)
        !          3688:     {
        !          3689:       register tree tail;
        !          3690:       if (ANON_AGGRNAME_P (name))
        !          3691:        for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
        !          3692:          {
        !          3693:            /* There's no need for error checking here, because
        !          3694:               anon names are unique throughout the compilation.  */
        !          3695:            if (TYPE_IDENTIFIER (TREE_VALUE (tail)) == name)
        !          3696:              return TREE_VALUE (tail);
        !          3697:          }
        !          3698:       else
        !          3699:        for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
        !          3700:          {
        !          3701:            if (TREE_PURPOSE (tail) == name)
        !          3702:              {
        !          3703:                enum tree_code code = TREE_CODE (TREE_VALUE (tail));
        !          3704:                /* Should tighten this up; it'll probably permit
        !          3705:                   UNION_TYPE and a struct template, for example.  */
        !          3706:                if (code != form
        !          3707:                    && !(form != ENUMERAL_TYPE
        !          3708:                         && (code == TEMPLATE_DECL
        !          3709:                             || code == UNINSTANTIATED_P_TYPE)))
        !          3710:                           
        !          3711:                  {
        !          3712:                    /* Definition isn't the kind we were looking for.  */
        !          3713:                    cp_error ("`%#D' redeclared as %C", TREE_VALUE (tail),
        !          3714:                              form);
        !          3715:                  }
        !          3716:                return TREE_VALUE (tail);
        !          3717:              }
        !          3718:          }
        !          3719:       if (thislevel_only && ! level->tag_transparent)
        !          3720:        return NULL_TREE;
        !          3721:       if (current_class_type && level->level_chain == global_binding_level)
        !          3722:        {
        !          3723:          /* Try looking in this class's tags before heading into
        !          3724:             global binding level.  */
        !          3725:          tree context = current_class_type;
        !          3726:          while (context)
        !          3727:            {
        !          3728:              switch (TREE_CODE_CLASS (TREE_CODE (context)))
        !          3729:                {
        !          3730:                case 't':
        !          3731:                  {
        !          3732:                    tree these_tags = CLASSTYPE_TAGS (context);
        !          3733:                    if (ANON_AGGRNAME_P (name))
        !          3734:                      while (these_tags)
        !          3735:                        {
        !          3736:                          if (TYPE_IDENTIFIER (TREE_VALUE (these_tags))
        !          3737:                              == name)
        !          3738:                            return TREE_VALUE (tail);
        !          3739:                          these_tags = TREE_CHAIN (these_tags);
        !          3740:                        }
        !          3741:                    else
        !          3742:                      while (these_tags)
        !          3743:                        {
        !          3744:                          if (TREE_PURPOSE (these_tags) == name)
        !          3745:                            {
        !          3746:                              if (TREE_CODE (TREE_VALUE (these_tags)) != form)
        !          3747:                                {
        !          3748:                                  cp_error ("`%#D' redeclared as %C in class scope",
        !          3749:                                            TREE_VALUE (tail), form);
        !          3750:                                }
        !          3751:                              return TREE_VALUE (tail);
        !          3752:                            }
        !          3753:                          these_tags = TREE_CHAIN (these_tags);
        !          3754:                        }
        !          3755:                    /* If this type is not yet complete, then don't
        !          3756:                       look at its context.  */
        !          3757:                    if (TYPE_SIZE (context) == NULL_TREE)
        !          3758:                      goto no_context;
        !          3759:                    /* Go to next enclosing type, if any.  */
        !          3760:                    context = DECL_CONTEXT (TYPE_NAME (context));
        !          3761:                    break;
        !          3762:                  case 'd':
        !          3763:                    context = DECL_CONTEXT (context);
        !          3764:                    break;
        !          3765:                  default:
        !          3766:                    my_friendly_abort (10);
        !          3767:                  }
        !          3768:                  continue;
        !          3769:                }
        !          3770:            no_context:
        !          3771:              break;
        !          3772:            }
        !          3773:        }
        !          3774:     }
        !          3775:   return NULL_TREE;
        !          3776: }
        !          3777: 
        !          3778: void
        !          3779: set_current_level_tags_transparency (tags_transparent)
        !          3780:      int tags_transparent;
        !          3781: {
        !          3782:   current_binding_level->tag_transparent = tags_transparent;
        !          3783: }
        !          3784: 
        !          3785: /* Given a type, find the tag that was defined for it and return the tag name.
        !          3786:    Otherwise return 0.  However, the value can never be 0
        !          3787:    in the cases in which this is used.
        !          3788: 
        !          3789:    C++: If NAME is non-zero, this is the new name to install.  This is
        !          3790:    done when replacing anonymous tags with real tag names.  */
        !          3791: 
        !          3792: static tree
        !          3793: lookup_tag_reverse (type, name)
        !          3794:      tree type;
        !          3795:      tree name;
        !          3796: {
        !          3797:   register struct binding_level *level;
        !          3798: 
        !          3799:   for (level = current_binding_level; level; level = level->level_chain)
        !          3800:     {
        !          3801:       register tree tail;
        !          3802:       for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
        !          3803:        {
        !          3804:          if (TREE_VALUE (tail) == type)
        !          3805:            {
        !          3806:              if (name)
        !          3807:                TREE_PURPOSE (tail) = name;
        !          3808:              return TREE_PURPOSE (tail);
        !          3809:            }
        !          3810:        }
        !          3811:     }
        !          3812:   return NULL_TREE;
        !          3813: }
        !          3814: 
        !          3815: /* Given type TYPE which was not declared in C++ language context,
        !          3816:    attempt to find a name by which it is referred.  */
        !          3817: tree
        !          3818: typedecl_for_tag (tag)
        !          3819:      tree tag;
        !          3820: {
        !          3821:   struct binding_level *b = current_binding_level;
        !          3822: 
        !          3823:   if (TREE_CODE (TYPE_NAME (tag)) == TYPE_DECL)
        !          3824:     return TYPE_NAME (tag);
        !          3825: 
        !          3826:   while (b)
        !          3827:     {
        !          3828:       tree decls = b->names;
        !          3829:       while (decls)
        !          3830:        {
        !          3831:          if (TREE_CODE (decls) == TYPE_DECL && TREE_TYPE (decls) == tag)
        !          3832:            break;
        !          3833:          decls = TREE_CHAIN (decls);
        !          3834:        }
        !          3835:       if (decls)
        !          3836:        return decls;
        !          3837:       b = b->level_chain;
        !          3838:     }
        !          3839:   return NULL_TREE;
        !          3840: }
        !          3841: 
        !          3842: /* Called when we must retroactively globalize a type we previously
        !          3843:    thought needed to be nested.  This happens, for example, when
        !          3844:    a `friend class' declaration is seen for an undefined type.  */
        !          3845: 
        !          3846: static void
        !          3847: globalize_nested_type (type)
        !          3848:      tree type;
        !          3849: {
        !          3850:   tree t, prev = NULL_TREE, d = TYPE_NAME (type);
        !          3851:   struct binding_level *b;
        !          3852:   tree name = DECL_NAME (d);
        !          3853: #if NEW_CLASS_SCOPING
        !          3854:   tree class_shadower = NULL_TREE, type_shadower = NULL_TREE, shadow;
        !          3855: #endif
        !          3856: 
        !          3857:   my_friendly_assert (TREE_CODE (d) == TYPE_DECL, 144);
        !          3858:   /* If the type value has already been globalized, then we're set.  */
        !          3859:   if (IDENTIFIER_GLOBAL_VALUE (name) == d)
        !          3860:     return;
        !          3861:   if (IDENTIFIER_HAS_TYPE_VALUE (name))
        !          3862:     {
        !          3863:       /* If this type already made it into the global tags,
        !          3864:         silently return.  */
        !          3865:       if (value_member (type, global_binding_level->tags))
        !          3866:        return;
        !          3867:     }
        !          3868: 
        !          3869: #if NEW_CLASS_SCOPING
        !          3870:   if (DECL_LANG_SPECIFIC (d))
        !          3871:     DECL_CLASS_CONTEXT (d) = NULL_TREE;
        !          3872: #else
        !          3873:   set_identifier_type_value (DECL_NESTED_TYPENAME (d), NULL_TREE);
        !          3874: #endif
        !          3875:   DECL_CONTEXT (d) = NULL_TREE;
        !          3876:   TYPE_CONTEXT (d) = NULL_TREE;
        !          3877:   DECL_NESTED_TYPENAME (d) = name;
        !          3878:   if (class_binding_level)
        !          3879:     b = class_binding_level;
        !          3880:   else
        !          3881:     b = current_binding_level;
        !          3882:   while (b != global_binding_level)
        !          3883:     {
        !          3884:       prev = NULL_TREE;
        !          3885:       if (b->parm_flag == 2)
        !          3886:        for (t = b->tags; t != NULL_TREE; prev = t, t = TREE_CHAIN (t))
        !          3887:          if (TREE_VALUE (t) == type)
        !          3888:            goto found;
        !          3889: #if NEW_CLASS_SCOPING
        !          3890:       /* Find (im?)possible objects shadowing the type we're globalizing.  */
        !          3891:       class_shadower = purpose_member (name, b->class_shadowed);
        !          3892:       type_shadower = purpose_member (name, b->type_shadowed);
        !          3893: #endif      
        !          3894:       b = b->level_chain;
        !          3895:     }
        !          3896:   /* We failed to find this tag anywhere up the binding chains.
        !          3897:      B is now the global binding level... check there.  */
        !          3898:   prev = NULL_TREE;
        !          3899:   if (b->parm_flag == 2)
        !          3900:     for (t = b->tags; t != NULL_TREE; prev = t, t = TREE_CHAIN (t))
        !          3901:       if (TREE_VALUE (t) == type)
        !          3902:        goto foundglobal;
        !          3903:   /* It wasn't in global scope either, so this is an anonymous forward ref
        !          3904:      of some kind; let it happen.  */
        !          3905:   return;
        !          3906: 
        !          3907: foundglobal:
        !          3908:   print_node_brief (stderr, "Tried to globalize already-global type ",
        !          3909:                    type, 0);
        !          3910:   my_friendly_abort (11);
        !          3911: 
        !          3912: found:
        !          3913:   /* Pull the tag out of the nested binding contour.  */
        !          3914:   if (prev)
        !          3915:     TREE_CHAIN (prev) = TREE_CHAIN (t);
        !          3916:   else
        !          3917:     b->tags = TREE_CHAIN (t);
        !          3918:   
        !          3919: #if NEW_CLASS_SCOPING
        !          3920:   /* Find and remove the corresponding entry from the class_shadowed list,
        !          3921:      and move the shadowed value to a possibly later shadow.  If there were
        !          3922:      no such beast (could there ever be?), install the previously shadowed
        !          3923:      value as the IDENTIFIER_CLASS_VALUE.  */
        !          3924:   prev = NULL_TREE;
        !          3925:   for (shadow = b->class_shadowed;
        !          3926:        shadow != NULL_TREE;
        !          3927:        prev = shadow, shadow = TREE_CHAIN (shadow))
        !          3928:     if (TREE_PURPOSE (shadow) == name)
        !          3929:       break;
        !          3930: 
        !          3931:   if (shadow)
        !          3932:     {
        !          3933:       /* An example where shadow is NULL is when you have something
        !          3934:         like `class foo { public: struct bar; bar *x(); };', since
        !          3935:         bar isn't added to the class_shadowed list until it's been
        !          3936:         defined.  */
        !          3937: 
        !          3938:       if (prev)
        !          3939:        TREE_CHAIN (prev) = TREE_CHAIN (shadow);
        !          3940:       else
        !          3941:        b->class_shadowed = TREE_CHAIN (shadow);
        !          3942: 
        !          3943:       if (class_shadower)
        !          3944:        TREE_VALUE (class_shadower) = TREE_VALUE (shadow);
        !          3945:       else
        !          3946:        IDENTIFIER_CLASS_VALUE (name) = TREE_VALUE (shadow);
        !          3947:     }
        !          3948: 
        !          3949:   /* Find and remove the corresponding entry from the type_shadowed list,
        !          3950:      and move the shadowed value to a possibly later shadow.  If there were
        !          3951:      no such beast (could there ever be?), install the previously shadowed
        !          3952:      value as the IDENTIFIER_TYPE_VALUE.  */
        !          3953:   prev = NULL_TREE;
        !          3954:   for (shadow = b->type_shadowed;
        !          3955:        shadow != NULL_TREE;
        !          3956:        prev = shadow, shadow = TREE_CHAIN (shadow))
        !          3957:     if (TREE_PURPOSE (shadow) == name)
        !          3958:       break;
        !          3959: 
        !          3960:   if (shadow)
        !          3961:     {
        !          3962:       if (prev)
        !          3963:        TREE_CHAIN (prev) = TREE_CHAIN (shadow);
        !          3964:       else
        !          3965:        b->type_shadowed = TREE_CHAIN (shadow);
        !          3966: 
        !          3967:       if (type_shadower)
        !          3968:        TREE_VALUE (type_shadower) = TREE_VALUE (shadow);
        !          3969:       else
        !          3970:        SET_IDENTIFIER_TYPE_VALUE (name, TREE_VALUE (shadow));
        !          3971:     }
        !          3972: #else
        !          3973:   set_identifier_type_value (TREE_PURPOSE (t), TREE_VALUE (t));
        !          3974: #endif
        !          3975:   global_binding_level->tags
        !          3976:     = perm_tree_cons (TREE_PURPOSE (t), TREE_VALUE (t),
        !          3977:                      global_binding_level->tags);
        !          3978: 
        !          3979:   /* Pull the tag out of the class's tags (if there).
        !          3980:      It won't show up if it appears e.g. in a parameter declaration
        !          3981:      or definition of a member function of this type.  */
        !          3982:   if (current_class_type != NULL_TREE)
        !          3983:     {
        !          3984:       for (t = CLASSTYPE_TAGS (current_class_type), prev = NULL_TREE;
        !          3985:           t != NULL_TREE;
        !          3986:           prev = t, t = TREE_CHAIN (t))
        !          3987:        if (TREE_VALUE (t) == type)
        !          3988:          break;
        !          3989: 
        !          3990:       if (t != NULL_TREE)
        !          3991:        {
        !          3992:          if (prev)
        !          3993:            TREE_CHAIN (prev) = TREE_CHAIN (t);
        !          3994:          else
        !          3995:            CLASSTYPE_TAGS (current_class_type) = TREE_CHAIN (t);
        !          3996:        }
        !          3997:     }
        !          3998: 
        !          3999:   pushdecl_top_level (d);
        !          4000: }
        !          4001: 
        !          4002: static void
        !          4003: maybe_globalize_type (type)
        !          4004:      tree type;
        !          4005: {
        !          4006:   if ((((TREE_CODE (type) == RECORD_TYPE
        !          4007:         || TREE_CODE (type) == UNION_TYPE)
        !          4008:        && ! TYPE_BEING_DEFINED (type))
        !          4009:        || TREE_CODE (type) == ENUMERAL_TYPE)
        !          4010:       && TYPE_SIZE (type) == NULL_TREE
        !          4011:       /* This part is gross.  We keep calling here with types that
        !          4012:         are instantiations of templates, when that type should is
        !          4013:         global, or doesn't have the type decl established yet,
        !          4014:         so globalizing will fail (because it won't find the type in any
        !          4015:         non-global scope).  So we short-circuit that path.  */
        !          4016:       && !(TYPE_NAME (type) != NULL_TREE
        !          4017:           && TYPE_IDENTIFIER (type) != NULL_TREE
        !          4018:           && ! IDENTIFIER_HAS_TYPE_VALUE (TYPE_IDENTIFIER (type)))
        !          4019:       )
        !          4020:     globalize_nested_type (type);
        !          4021: }
        !          4022: 
        !          4023: /* Lookup TYPE in CONTEXT (a chain of nested types or a FUNCTION_DECL).
        !          4024:    Return the type value, or NULL_TREE if not found.  */
        !          4025: static tree
        !          4026: lookup_nested_type (type, context)
        !          4027:      tree type;
        !          4028:      tree context;
        !          4029: {
        !          4030:   if (context == NULL_TREE)
        !          4031:     return NULL_TREE;
        !          4032:   while (context)
        !          4033:     {
        !          4034:       switch (TREE_CODE (context))
        !          4035:        {
        !          4036:        case TYPE_DECL:
        !          4037:          {
        !          4038:            tree ctype = TREE_TYPE (context);
        !          4039:            tree match = value_member (type, CLASSTYPE_TAGS (ctype));
        !          4040:            if (match)
        !          4041:              return TREE_VALUE (match);
        !          4042:            context = DECL_CONTEXT (context);
        !          4043: 
        !          4044:            /* When we have a nested class whose member functions have
        !          4045:               local types (e.g., a set of enums), we'll arrive here
        !          4046:               with the DECL_CONTEXT as the actual RECORD_TYPE node for
        !          4047:               the enclosing class.  Instead, we want to make sure we
        !          4048:               come back in here with the TYPE_DECL, not the RECORD_TYPE.  */
        !          4049:            if (context && TREE_CODE (context) == RECORD_TYPE)
        !          4050:              context = TREE_CHAIN (context);
        !          4051:          }
        !          4052:          break;
        !          4053:        case FUNCTION_DECL:
        !          4054:          return TYPE_IDENTIFIER (type) ? lookup_name (TYPE_IDENTIFIER (type), 1) : NULL_TREE;
        !          4055:          break;
        !          4056:        default:
        !          4057:          my_friendly_abort (12);
        !          4058:        }
        !          4059:     }
        !          4060:   return NULL_TREE;
        !          4061: }
        !          4062: 
        !          4063: /* Look up NAME in the current binding level and its superiors in the
        !          4064:    namespace of variables, functions and typedefs.  Return a ..._DECL
        !          4065:    node of some kind representing its definition if there is only one
        !          4066:    such declaration, or return a TREE_LIST with all the overloaded
        !          4067:    definitions if there are many, or return 0 if it is undefined.
        !          4068: 
        !          4069:    If PREFER_TYPE is > 0, we prefer TYPE_DECLs.
        !          4070:    If PREFER_TYPE is = 0, we prefer non-TYPE_DECLs.
        !          4071:    If PREFER_TYPE is < 0, we arbitrate according to lexical context.  */
        !          4072: 
        !          4073: tree
        !          4074: lookup_name (name, prefer_type)
        !          4075:      tree name;
        !          4076:      int prefer_type;
        !          4077: {
        !          4078:   register tree val;
        !          4079: 
        !          4080:   if (current_binding_level != global_binding_level
        !          4081:       && IDENTIFIER_LOCAL_VALUE (name))
        !          4082:     val = IDENTIFIER_LOCAL_VALUE (name);
        !          4083:   /* In C++ class fields are between local and global scope,
        !          4084:      just before the global scope.  */
        !          4085:   else if (current_class_type)
        !          4086:     {
        !          4087:       val = IDENTIFIER_CLASS_VALUE (name);
        !          4088:       if (val == NULL_TREE
        !          4089:          && TYPE_SIZE (current_class_type) == NULL_TREE
        !          4090:          && CLASSTYPE_LOCAL_TYPEDECLS (current_class_type))
        !          4091:        {
        !          4092:          /* Try to find values from base classes
        !          4093:             if we are presently defining a type.
        !          4094:             We are presently only interested in TYPE_DECLs.  */
        !          4095:          val = lookup_field (current_class_type, name, 0, prefer_type < 0);
        !          4096:          if (val == error_mark_node)
        !          4097:            return val;
        !          4098:          if (val && TREE_CODE (val) != TYPE_DECL)
        !          4099:            val = NULL_TREE;
        !          4100:        }
        !          4101: 
        !          4102:       /* yylex() calls this with -2, since we should never start digging for
        !          4103:         the nested name at the point where we haven't even, for example,
        !          4104:         created the COMPONENT_REF or anything like that.  */
        !          4105:       if (val == NULL_TREE)
        !          4106:        val = lookup_nested_field (name, prefer_type != -2);
        !          4107: 
        !          4108:       if (val == NULL_TREE)
        !          4109:        val = IDENTIFIER_GLOBAL_VALUE (name);
        !          4110:     }
        !          4111:   else
        !          4112:     val = IDENTIFIER_GLOBAL_VALUE (name);
        !          4113: 
        !          4114:   if (val)
        !          4115:     {
        !          4116:       extern int looking_for_typename;
        !          4117: 
        !          4118:       /* Arbitrate between finding a TYPE_DECL and finding
        !          4119:         other kinds of _DECLs.  */
        !          4120:       if (TREE_CODE (val) == TYPE_DECL || looking_for_typename < 0)
        !          4121:        return val;
        !          4122: 
        !          4123:       if (IDENTIFIER_HAS_TYPE_VALUE (name))
        !          4124:        {
        !          4125:          register tree val_as_type = TYPE_NAME (IDENTIFIER_TYPE_VALUE (name));
        !          4126: 
        !          4127:          if (val == val_as_type || prefer_type > 0
        !          4128:              || looking_for_typename > 0)
        !          4129:            return val_as_type;
        !          4130:          if (prefer_type == 0)
        !          4131:            return val;
        !          4132:          return arbitrate_lookup (name, val, val_as_type);
        !          4133:        }
        !          4134:       if (TREE_TYPE (val) == error_mark_node)
        !          4135:        return error_mark_node;
        !          4136:     }
        !          4137: 
        !          4138:   return val;
        !          4139: }
        !          4140: 
        !          4141: /* Similar to `lookup_name' but look only at current binding level.  */
        !          4142: 
        !          4143: tree
        !          4144: lookup_name_current_level (name)
        !          4145:      tree name;
        !          4146: {
        !          4147:   register tree t;
        !          4148: 
        !          4149:   if (current_binding_level == global_binding_level)
        !          4150:     return IDENTIFIER_GLOBAL_VALUE (name);
        !          4151: 
        !          4152:   if (IDENTIFIER_LOCAL_VALUE (name) == NULL_TREE)
        !          4153:     return 0;
        !          4154: 
        !          4155:   for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
        !          4156:     if (DECL_NAME (t) == name)
        !          4157:       break;
        !          4158: 
        !          4159:   return t;
        !          4160: }
        !          4161: 
        !          4162: /* Arrange for the user to get a source line number, even when the
        !          4163:    compiler is going down in flames, so that she at least has a
        !          4164:    chance of working around problems in the compiler.  We used to
        !          4165:    call error(), but that let the segmentation fault continue
        !          4166:    through; now, it's much more passive by asking them to send the
        !          4167:    maintainers mail about the problem.  */
        !          4168: 
        !          4169: static void
        !          4170: signal_catch (sig)
        !          4171:      int sig;
        !          4172: {
        !          4173:   signal (SIGSEGV, SIG_DFL);
        !          4174: #ifdef SIGIOT
        !          4175:   signal (SIGIOT, SIG_DFL);
        !          4176: #endif
        !          4177: #ifdef SIGILL
        !          4178:   signal (SIGILL, SIG_DFL);
        !          4179: #endif
        !          4180: #ifdef SIGABRT
        !          4181:   signal (SIGABRT, SIG_DFL);
        !          4182: #endif
        !          4183: #ifdef SIGBUS
        !          4184:   signal (SIGBUS, SIG_DFL);
        !          4185: #endif
        !          4186:   printf ("signal_catch=%d\n", sig);
        !          4187:   my_friendly_abort (0);
        !          4188: }
        !          4189: 
        !          4190: /* Array for holding types considered "built-in".  These types
        !          4191:    are output in the module in which `main' is defined.  */
        !          4192: static tree *builtin_type_tdescs_arr;
        !          4193: static int builtin_type_tdescs_len, builtin_type_tdescs_max;
        !          4194: 
        !          4195: /* Push the declarations of builtin types into the namespace.
        !          4196:    RID_INDEX, if < RID_MAX is the index of the builtin type
        !          4197:    in the array RID_POINTERS.  NAME is the name used when looking
        !          4198:    up the builtin type.  TYPE is the _TYPE node for the builtin type.  */
        !          4199: 
        !          4200: static void
        !          4201: record_builtin_type (rid_index, name, type)
        !          4202:      enum rid rid_index;
        !          4203:      char *name;
        !          4204:      tree type;
        !          4205: {
        !          4206:   tree rname = NULL_TREE, tname = NULL_TREE;
        !          4207:   tree tdecl;
        !          4208: 
        !          4209:   if ((int) rid_index < (int) RID_MAX)
        !          4210:     rname = ridpointers[(int) rid_index];
        !          4211:   if (name)
        !          4212:     tname = get_identifier (name);
        !          4213: 
        !          4214:   TYPE_BUILT_IN (type) = 1;
        !          4215:   
        !          4216:   if (tname)
        !          4217:     {
        !          4218: #if 0 /* not yet, should get fixed properly later */
        !          4219:       tdecl = pushdecl (make_type_decl (tname, type));
        !          4220: #else
        !          4221:       tdecl = pushdecl (build_decl (TYPE_DECL, tname, type));
        !          4222: #endif
        !          4223:       set_identifier_type_value (tname, NULL_TREE);
        !          4224:       if ((int) rid_index < (int) RID_MAX)
        !          4225:        IDENTIFIER_GLOBAL_VALUE (tname) = tdecl;
        !          4226:     }
        !          4227:   if (rname != NULL_TREE)
        !          4228:     {
        !          4229:       if (tname != NULL_TREE)
        !          4230:        {
        !          4231:          set_identifier_type_value (rname, NULL_TREE);
        !          4232:          IDENTIFIER_GLOBAL_VALUE (rname) = tdecl;
        !          4233:        }
        !          4234:       else
        !          4235:        {
        !          4236: #if 0 /* not yet, should get fixed properly later */
        !          4237:          tdecl = pushdecl (make_type_decl (rname, type));
        !          4238: #else
        !          4239:          tdecl = pushdecl (build_decl (TYPE_DECL, rname, type));
        !          4240: #endif
        !          4241:          set_identifier_type_value (rname, NULL_TREE);
        !          4242:        }
        !          4243:     }
        !          4244: 
        !          4245:   if (flag_dossier)
        !          4246:     {
        !          4247:       if (builtin_type_tdescs_len+5 >= builtin_type_tdescs_max)
        !          4248:        {
        !          4249:          builtin_type_tdescs_max *= 2;
        !          4250:          builtin_type_tdescs_arr
        !          4251:            = (tree *)xrealloc (builtin_type_tdescs_arr,
        !          4252:                                builtin_type_tdescs_max * sizeof (tree));
        !          4253:        }
        !          4254:       builtin_type_tdescs_arr[builtin_type_tdescs_len++] = type;
        !          4255:       if (TREE_CODE (type) != POINTER_TYPE)
        !          4256:        {
        !          4257:          builtin_type_tdescs_arr[builtin_type_tdescs_len++]
        !          4258:            = build_pointer_type (type);
        !          4259:          builtin_type_tdescs_arr[builtin_type_tdescs_len++]
        !          4260:            = build_type_variant (TYPE_POINTER_TO (type), 1, 0);
        !          4261:        }
        !          4262:       if (TREE_CODE (type) != VOID_TYPE)
        !          4263:        {
        !          4264:          builtin_type_tdescs_arr[builtin_type_tdescs_len++]
        !          4265:            = build_reference_type (type);
        !          4266:          builtin_type_tdescs_arr[builtin_type_tdescs_len++]
        !          4267:            = build_type_variant (TYPE_REFERENCE_TO (type), 1, 0);
        !          4268:        }
        !          4269:     }
        !          4270: }
        !          4271: 
        !          4272: static void
        !          4273: output_builtin_tdesc_entries ()
        !          4274: {
        !          4275:   extern struct obstack permanent_obstack;
        !          4276: 
        !          4277:   /* If there's more than one main in this file, don't crash.  */
        !          4278:   if (builtin_type_tdescs_arr == 0)
        !          4279:     return;
        !          4280: 
        !          4281:   push_obstacks (&permanent_obstack, &permanent_obstack);
        !          4282:   while (builtin_type_tdescs_len > 0)
        !          4283:     {
        !          4284:       tree type = builtin_type_tdescs_arr[--builtin_type_tdescs_len];
        !          4285:       tree tdesc = build_t_desc (type, 0);
        !          4286:       TREE_ASM_WRITTEN (tdesc) = 0;
        !          4287:       build_t_desc (type, 2);
        !          4288:     }
        !          4289:   free (builtin_type_tdescs_arr);
        !          4290:   builtin_type_tdescs_arr = 0;
        !          4291:   pop_obstacks ();
        !          4292: }
        !          4293: 
        !          4294: /* Push overloaded decl, in global scope, with one argument so it
        !          4295:    can be used as a callback from define_function.  */
        !          4296: static void
        !          4297: push_overloaded_decl_1 (x)
        !          4298:      tree x;
        !          4299: {
        !          4300:   push_overloaded_decl (x, 0);
        !          4301: }
        !          4302: 
        !          4303: /* Create the predefined scalar types of C,
        !          4304:    and some nodes representing standard constants (0, 1, (void *)0).
        !          4305:    Initialize the global binding level.
        !          4306:    Make definitions for built-in primitive functions.  */
        !          4307: 
        !          4308: void
        !          4309: init_decl_processing ()
        !          4310: {
        !          4311:   tree decl;
        !          4312:   register tree endlink, int_endlink, double_endlink, ptr_endlink;
        !          4313:   tree fields[20];
        !          4314:   /* Either char* or void*.  */
        !          4315:   tree traditional_ptr_type_node;
        !          4316:   /* Data type of memcpy.  */
        !          4317:   tree memcpy_ftype;
        !          4318:   /* Data type of strncpy.  */
        !          4319:   tree strncpy_ftype;
        !          4320:   int wchar_type_size;
        !          4321:   tree temp;
        !          4322:   tree array_domain_type;
        !          4323: 
        !          4324:   /* Have to make these distinct before we try using them.  */
        !          4325:   lang_name_cplusplus = get_identifier ("C++");
        !          4326:   lang_name_c = get_identifier ("C");
        !          4327: #ifdef OBJCPLUS
        !          4328:   lang_name_objc = get_identifier ("Objective-C");
        !          4329: #endif
        !          4330: 
        !          4331:   /* Initially, C.  */
        !          4332:   current_lang_name = lang_name_c;
        !          4333: 
        !          4334:   current_function_decl = NULL_TREE;
        !          4335:   named_labels = NULL_TREE;
        !          4336:   named_label_uses = NULL_TREE;
        !          4337:   current_binding_level = NULL_BINDING_LEVEL;
        !          4338:   free_binding_level = NULL_BINDING_LEVEL;
        !          4339: 
        !          4340:   /* Because most segmentation signals can be traced back into user
        !          4341:      code, catch them and at least give the user a chance of working
        !          4342:      around compiler bugs. */
        !          4343:   signal (SIGSEGV, signal_catch);
        !          4344: 
        !          4345:   /* We will also catch aborts in the back-end through signal_catch and
        !          4346:      give the user a chance to see where the error might be, and to defeat
        !          4347:      aborts in the back-end when there have been errors previously in their
        !          4348:      code. */
        !          4349: #ifdef SIGIOT
        !          4350:   signal (SIGIOT, signal_catch);
        !          4351: #endif
        !          4352: #ifdef SIGILL
        !          4353:   signal (SIGILL, signal_catch);
        !          4354: #endif
        !          4355: #ifdef SIGABRT
        !          4356:   signal (SIGABRT, signal_catch);
        !          4357: #endif
        !          4358: #ifdef SIGBUS
        !          4359:   signal (SIGBUS, signal_catch);
        !          4360: #endif
        !          4361: 
        !          4362:   gcc_obstack_init (&decl_obstack);
        !          4363:   if (flag_dossier)
        !          4364:     {
        !          4365:       builtin_type_tdescs_max = 100;
        !          4366:       builtin_type_tdescs_arr = (tree *)xmalloc (100 * sizeof (tree));
        !          4367:     }
        !          4368: 
        !          4369:   /* Must lay these out before anything else gets laid out.  */
        !          4370:   error_mark_node = make_node (ERROR_MARK);
        !          4371:   TREE_PERMANENT (error_mark_node) = 1;
        !          4372:   TREE_TYPE (error_mark_node) = error_mark_node;
        !          4373:   error_mark_list = build_tree_list (error_mark_node, error_mark_node);
        !          4374:   TREE_TYPE (error_mark_list) = error_mark_node;
        !          4375: 
        !          4376:   pushlevel (0);       /* make the binding_level structure for global names.  */
        !          4377:   global_binding_level = current_binding_level;
        !          4378: 
        !          4379:   this_identifier = get_identifier (THIS_NAME);
        !          4380:   in_charge_identifier = get_identifier (IN_CHARGE_NAME);
        !          4381:   pfn_identifier = get_identifier (VTABLE_PFN_NAME);
        !          4382:   index_identifier = get_identifier (VTABLE_INDEX_NAME);
        !          4383:   delta_identifier = get_identifier (VTABLE_DELTA_NAME);
        !          4384:   delta2_identifier = get_identifier (VTABLE_DELTA2_NAME);
        !          4385:   pfn_or_delta2_identifier = get_identifier ("__pfn_or_delta2");
        !          4386: 
        !          4387:   /* Define `int' and `char' first so that dbx will output them first.  */
        !          4388: 
        !          4389:   integer_type_node = make_signed_type (INT_TYPE_SIZE);
        !          4390:   record_builtin_type (RID_INT, NULL_PTR, integer_type_node);
        !          4391: 
        !          4392:   /* Define `char', which is like either `signed char' or `unsigned char'
        !          4393:      but not the same as either.  */
        !          4394: 
        !          4395:   char_type_node =
        !          4396:     (flag_signed_char
        !          4397:      ? make_signed_type (CHAR_TYPE_SIZE)
        !          4398:      : make_unsigned_type (CHAR_TYPE_SIZE));
        !          4399:   record_builtin_type (RID_CHAR, "char", char_type_node);
        !          4400: 
        !          4401:   long_integer_type_node = make_signed_type (LONG_TYPE_SIZE);
        !          4402:   record_builtin_type (RID_LONG, "long int", long_integer_type_node);
        !          4403: 
        !          4404:   unsigned_type_node = make_unsigned_type (INT_TYPE_SIZE);
        !          4405:   record_builtin_type (RID_UNSIGNED, "unsigned int", unsigned_type_node);
        !          4406: 
        !          4407:   long_unsigned_type_node = make_unsigned_type (LONG_TYPE_SIZE);
        !          4408:   record_builtin_type (RID_MAX, "long unsigned int", long_unsigned_type_node);
        !          4409:   record_builtin_type (RID_MAX, "unsigned long", long_unsigned_type_node);
        !          4410: 
        !          4411:   /* `unsigned long' is the standard type for sizeof.
        !          4412:      Traditionally, use a signed type.
        !          4413:      Note that stddef.h uses `unsigned long',
        !          4414:      and this must agree, even of long and int are the same size.  */
        !          4415:   sizetype
        !          4416:     = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (SIZE_TYPE)));
        !          4417:   if (flag_traditional && TREE_UNSIGNED (sizetype))
        !          4418:     sizetype = signed_type (sizetype);
        !          4419: 
        !          4420:   ptrdiff_type_node
        !          4421:     = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (PTRDIFF_TYPE)));
        !          4422: 
        !          4423:   TREE_TYPE (TYPE_SIZE (integer_type_node)) = sizetype;
        !          4424:   TREE_TYPE (TYPE_SIZE (char_type_node)) = sizetype;
        !          4425:   TREE_TYPE (TYPE_SIZE (unsigned_type_node)) = sizetype;
        !          4426:   TREE_TYPE (TYPE_SIZE (long_unsigned_type_node)) = sizetype;
        !          4427:   TREE_TYPE (TYPE_SIZE (long_integer_type_node)) = sizetype;
        !          4428: 
        !          4429:   short_integer_type_node = make_signed_type (SHORT_TYPE_SIZE);
        !          4430:   record_builtin_type (RID_SHORT, "short int", short_integer_type_node);
        !          4431:   long_long_integer_type_node = make_signed_type (LONG_LONG_TYPE_SIZE);
        !          4432:   record_builtin_type (RID_MAX, "long long int", long_long_integer_type_node);
        !          4433:   short_unsigned_type_node = make_unsigned_type (SHORT_TYPE_SIZE);
        !          4434:   record_builtin_type (RID_MAX, "short unsigned int", short_unsigned_type_node);
        !          4435:   record_builtin_type (RID_MAX, "unsigned short", short_unsigned_type_node);
        !          4436:   long_long_unsigned_type_node = make_unsigned_type (LONG_LONG_TYPE_SIZE);
        !          4437:   record_builtin_type (RID_MAX, "long long unsigned int", long_long_unsigned_type_node);
        !          4438:   record_builtin_type (RID_MAX, "long long unsigned", long_long_unsigned_type_node);
        !          4439: 
        !          4440:   /* Define both `signed char' and `unsigned char'.  */
        !          4441:   signed_char_type_node = make_signed_type (CHAR_TYPE_SIZE);
        !          4442:   record_builtin_type (RID_MAX, "signed char", signed_char_type_node);
        !          4443:   unsigned_char_type_node = make_unsigned_type (CHAR_TYPE_SIZE);
        !          4444:   record_builtin_type (RID_MAX, "unsigned char", unsigned_char_type_node);
        !          4445: 
        !          4446:   /* These are types that type_for_size and type_for_mode use.  */
        !          4447:   intQI_type_node = make_signed_type (GET_MODE_BITSIZE (QImode));
        !          4448:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intQI_type_node));
        !          4449:   intHI_type_node = make_signed_type (GET_MODE_BITSIZE (HImode));
        !          4450:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intHI_type_node));
        !          4451:   intSI_type_node = make_signed_type (GET_MODE_BITSIZE (SImode));
        !          4452:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intSI_type_node));
        !          4453:   intDI_type_node = make_signed_type (GET_MODE_BITSIZE (DImode));
        !          4454:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intDI_type_node));
        !          4455:   unsigned_intQI_type_node = make_unsigned_type (GET_MODE_BITSIZE (QImode));
        !          4456:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intQI_type_node));
        !          4457:   unsigned_intHI_type_node = make_unsigned_type (GET_MODE_BITSIZE (HImode));
        !          4458:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intHI_type_node));
        !          4459:   unsigned_intSI_type_node = make_unsigned_type (GET_MODE_BITSIZE (SImode));
        !          4460:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intSI_type_node));
        !          4461:   unsigned_intDI_type_node = make_unsigned_type (GET_MODE_BITSIZE (DImode));
        !          4462:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intDI_type_node));
        !          4463: 
        !          4464:   float_type_node = make_node (REAL_TYPE);
        !          4465:   TYPE_PRECISION (float_type_node) = FLOAT_TYPE_SIZE;
        !          4466:   record_builtin_type (RID_FLOAT, NULL_PTR, float_type_node);
        !          4467:   layout_type (float_type_node);
        !          4468: 
        !          4469:   double_type_node = make_node (REAL_TYPE);
        !          4470:   if (flag_short_double)
        !          4471:     TYPE_PRECISION (double_type_node) = FLOAT_TYPE_SIZE;
        !          4472:   else
        !          4473:     TYPE_PRECISION (double_type_node) = DOUBLE_TYPE_SIZE;
        !          4474:   record_builtin_type (RID_DOUBLE, NULL_PTR, double_type_node);
        !          4475:   layout_type (double_type_node);
        !          4476: 
        !          4477:   long_double_type_node = make_node (REAL_TYPE);
        !          4478:   TYPE_PRECISION (long_double_type_node) = LONG_DOUBLE_TYPE_SIZE;
        !          4479:   record_builtin_type (RID_MAX, "long double", long_double_type_node);
        !          4480:   layout_type (long_double_type_node);
        !          4481: 
        !          4482:   integer_zero_node = build_int_2 (0, 0);
        !          4483:   TREE_TYPE (integer_zero_node) = integer_type_node;
        !          4484:   integer_one_node = build_int_2 (1, 0);
        !          4485:   TREE_TYPE (integer_one_node) = integer_type_node;
        !          4486:   integer_two_node = build_int_2 (2, 0);
        !          4487:   TREE_TYPE (integer_two_node) = integer_type_node;
        !          4488:   integer_three_node = build_int_2 (3, 0);
        !          4489:   TREE_TYPE (integer_three_node) = integer_type_node;
        !          4490:   empty_init_node = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE);
        !          4491: 
        !          4492:   /* These are needed by stor-layout.c.  */
        !          4493:   size_zero_node = size_int (0);
        !          4494:   size_one_node = size_int (1);
        !          4495: 
        !          4496:   void_type_node = make_node (VOID_TYPE);
        !          4497:   record_builtin_type (RID_VOID, NULL_PTR, void_type_node);
        !          4498:   layout_type (void_type_node); /* Uses integer_zero_node.  */
        !          4499:   void_list_node = build_tree_list (NULL_TREE, void_type_node);
        !          4500:   TREE_PARMLIST (void_list_node) = 1;
        !          4501: 
        !          4502:   null_pointer_node = build_int_2 (0, 0);
        !          4503:   TREE_TYPE (null_pointer_node) = build_pointer_type (void_type_node);
        !          4504:   layout_type (TREE_TYPE (null_pointer_node));
        !          4505: 
        !          4506:   /* Used for expressions that do nothing, but are not errors.  */
        !          4507:   void_zero_node = build_int_2 (0, 0);
        !          4508:   TREE_TYPE (void_zero_node) = void_type_node;
        !          4509: 
        !          4510:   string_type_node = build_pointer_type (char_type_node);
        !          4511:   const_string_type_node = build_pointer_type (build_type_variant (char_type_node, 1, 0));
        !          4512:   record_builtin_type (RID_MAX, NULL_PTR, string_type_node);
        !          4513: 
        !          4514:   /* Make a type to be the domain of a few array types
        !          4515:      whose domains don't really matter.
        !          4516:      200 is small enough that it always fits in size_t
        !          4517:      and large enough that it can hold most function names for the
        !          4518:      initializations of __FUNCTION__ and __PRETTY_FUNCTION__.  */
        !          4519:   array_domain_type = build_index_type (build_int_2 (200, 0));
        !          4520: 
        !          4521:   /* make a type for arrays of characters.
        !          4522:      With luck nothing will ever really depend on the length of this
        !          4523:      array type.  */
        !          4524:   char_array_type_node
        !          4525:     = build_array_type (char_type_node, array_domain_type);
        !          4526:   /* Likewise for arrays of ints.  */
        !          4527:   int_array_type_node
        !          4528:     = build_array_type (integer_type_node, array_domain_type);
        !          4529: 
        !          4530:   /* This is just some anonymous class type.  Nobody should ever
        !          4531:      need to look inside this envelope.  */
        !          4532:   class_star_type_node = build_pointer_type (make_lang_type (RECORD_TYPE));
        !          4533: 
        !          4534:   default_function_type
        !          4535:     = build_function_type (integer_type_node, NULL_TREE);
        !          4536:   build_pointer_type (default_function_type);
        !          4537: 
        !          4538:   ptr_type_node = build_pointer_type (void_type_node);
        !          4539:   const_ptr_type_node = build_pointer_type (build_type_variant (void_type_node, 1, 0));
        !          4540:   record_builtin_type (RID_MAX, NULL_PTR, ptr_type_node);
        !          4541:   endlink = void_list_node;
        !          4542:   int_endlink = tree_cons (NULL_TREE, integer_type_node, endlink);
        !          4543:   double_endlink = tree_cons (NULL_TREE, double_type_node, endlink);
        !          4544:   ptr_endlink = tree_cons (NULL_TREE, ptr_type_node, endlink);
        !          4545: 
        !          4546:   double_ftype_double
        !          4547:     = build_function_type (double_type_node, double_endlink);
        !          4548: 
        !          4549:   double_ftype_double_double
        !          4550:     = build_function_type (double_type_node,
        !          4551:                           tree_cons (NULL_TREE, double_type_node, double_endlink));
        !          4552: 
        !          4553:   int_ftype_int
        !          4554:     = build_function_type (integer_type_node, int_endlink);
        !          4555: 
        !          4556:   long_ftype_long
        !          4557:     = build_function_type (long_integer_type_node,
        !          4558:                           tree_cons (NULL_TREE, long_integer_type_node, endlink));
        !          4559: 
        !          4560:   void_ftype_ptr_ptr_int
        !          4561:     = build_function_type (void_type_node,
        !          4562:                           tree_cons (NULL_TREE, ptr_type_node,
        !          4563:                                      tree_cons (NULL_TREE, ptr_type_node,
        !          4564:                                                 int_endlink)));
        !          4565: 
        !          4566:   int_ftype_cptr_cptr_sizet
        !          4567:     = build_function_type (integer_type_node,
        !          4568:                           tree_cons (NULL_TREE, const_ptr_type_node,
        !          4569:                                      tree_cons (NULL_TREE, const_ptr_type_node,
        !          4570:                                                 tree_cons (NULL_TREE,
        !          4571:                                                            sizetype,
        !          4572:                                                            endlink))));
        !          4573: 
        !          4574:   void_ftype_ptr_int_int
        !          4575:     = build_function_type (void_type_node,
        !          4576:                           tree_cons (NULL_TREE, ptr_type_node,
        !          4577:                                      tree_cons (NULL_TREE, integer_type_node,
        !          4578:                                                 int_endlink)));
        !          4579: 
        !          4580:   string_ftype_ptr_ptr         /* strcpy prototype */
        !          4581:     = build_function_type (string_type_node,
        !          4582:                           tree_cons (NULL_TREE, string_type_node,
        !          4583:                                      tree_cons (NULL_TREE,
        !          4584:                                                 const_string_type_node,
        !          4585:                                                 endlink)));
        !          4586: 
        !          4587: #if 0
        !          4588:   /* Not yet.  */
        !          4589:   strncpy_ftype                        /* strncpy prototype */
        !          4590:     = build_function_type (string_type_node,
        !          4591:                           tree_cons (NULL_TREE, string_type_node,
        !          4592:                                      tree_cons (NULL_TREE, const_string_type_node,
        !          4593:                                                 tree_cons (NULL_TREE,
        !          4594:                                                            sizetype,
        !          4595:                                                            endlink))));
        !          4596: #endif
        !          4597: 
        !          4598:   int_ftype_string_string      /* strcmp prototype */
        !          4599:     = build_function_type (integer_type_node,
        !          4600:                           tree_cons (NULL_TREE, const_string_type_node,
        !          4601:                                      tree_cons (NULL_TREE,
        !          4602:                                                 const_string_type_node,
        !          4603:                                                 endlink)));
        !          4604: 
        !          4605:   sizet_ftype_string           /* strlen prototype */
        !          4606:     = build_function_type (sizetype,
        !          4607:                           tree_cons (NULL_TREE, const_string_type_node,
        !          4608:                                      endlink));
        !          4609: 
        !          4610:   traditional_ptr_type_node
        !          4611:     = (flag_traditional ? string_type_node : ptr_type_node);
        !          4612: 
        !          4613:   memcpy_ftype /* memcpy prototype */
        !          4614:     = build_function_type (traditional_ptr_type_node,
        !          4615:                           tree_cons (NULL_TREE, ptr_type_node,
        !          4616:                                      tree_cons (NULL_TREE, const_ptr_type_node,
        !          4617:                                                 tree_cons (NULL_TREE,
        !          4618:                                                            sizetype,
        !          4619:                                                            endlink))));
        !          4620: 
        !          4621: #ifdef VTABLE_USES_MASK
        !          4622:   /* This is primarily for virtual function definition.  We
        !          4623:      declare an array of `void *', which can later be
        !          4624:      converted to the appropriate function pointer type.
        !          4625:      To do pointers to members, we need a mask which can
        !          4626:      distinguish an index value into a virtual function table
        !          4627:      from an address.  */
        !          4628:   vtbl_mask = build_int_2 (~((HOST_WIDE_INT) VINDEX_MAX - 1), -1);
        !          4629: #endif
        !          4630: 
        !          4631:   vtbl_type_node
        !          4632:     = build_array_type (ptr_type_node, NULL_TREE);
        !          4633:   layout_type (vtbl_type_node);
        !          4634:   vtbl_type_node = build_type_variant (vtbl_type_node, 1, 0);
        !          4635:   record_builtin_type (RID_MAX, NULL_PTR, vtbl_type_node);
        !          4636: 
        !          4637:   builtin_function ("__builtin_constant_p", int_ftype_int,
        !          4638:                    BUILT_IN_CONSTANT_P, NULL_PTR);
        !          4639: 
        !          4640:   builtin_function ("__builtin_alloca",
        !          4641:                    build_function_type (ptr_type_node,
        !          4642:                                         tree_cons (NULL_TREE,
        !          4643:                                                    sizetype,
        !          4644:                                                    endlink)),
        !          4645:                    BUILT_IN_ALLOCA, "alloca");
        !          4646: #if 0
        !          4647:   builtin_function ("alloca",
        !          4648:                    build_function_type (ptr_type_node,
        !          4649:                                         tree_cons (NULL_TREE,
        !          4650:                                                    sizetype,
        !          4651:                                                    endlink)),
        !          4652:                    BUILT_IN_ALLOCA, NULL_PTR);
        !          4653: #endif
        !          4654: 
        !          4655:   builtin_function ("__builtin_abs", int_ftype_int,
        !          4656:                    BUILT_IN_ABS, NULL_PTR);
        !          4657:   builtin_function ("__builtin_fabs", double_ftype_double,
        !          4658:                    BUILT_IN_FABS, NULL_PTR);
        !          4659:   builtin_function ("__builtin_labs", long_ftype_long,
        !          4660:                    BUILT_IN_LABS, NULL_PTR);
        !          4661:   builtin_function ("__builtin_ffs", int_ftype_int,
        !          4662:                    BUILT_IN_FFS, NULL_PTR);
        !          4663:   builtin_function ("__builtin_fsqrt", double_ftype_double,
        !          4664:                    BUILT_IN_FSQRT, NULL_PTR);
        !          4665:   builtin_function ("__builtin_sin", double_ftype_double, 
        !          4666:                    BUILT_IN_SIN, "sin");
        !          4667:   builtin_function ("__builtin_cos", double_ftype_double, 
        !          4668:                    BUILT_IN_COS, "cos");
        !          4669:   builtin_function ("__builtin_saveregs",
        !          4670:                    build_function_type (ptr_type_node, NULL_TREE),
        !          4671:                    BUILT_IN_SAVEREGS, NULL_PTR);
        !          4672: /* EXPAND_BUILTIN_VARARGS is obsolete.  */
        !          4673: #if 0
        !          4674:   builtin_function ("__builtin_varargs",
        !          4675:                    build_function_type (ptr_type_node,
        !          4676:                                         tree_cons (NULL_TREE,
        !          4677:                                                    integer_type_node,
        !          4678:                                                    endlink)),
        !          4679:                    BUILT_IN_VARARGS, NULL_PTR);
        !          4680: #endif
        !          4681:   builtin_function ("__builtin_classify_type", default_function_type,
        !          4682:                    BUILT_IN_CLASSIFY_TYPE, NULL_PTR);
        !          4683:   builtin_function ("__builtin_next_arg",
        !          4684:                    build_function_type (ptr_type_node, endlink),
        !          4685:                    BUILT_IN_NEXT_ARG, NULL_PTR);
        !          4686:   builtin_function ("__builtin_args_info",
        !          4687:                    build_function_type (integer_type_node,
        !          4688:                                         tree_cons (NULL_TREE,
        !          4689:                                                    integer_type_node,
        !          4690:                                                    endlink)),
        !          4691:                    BUILT_IN_ARGS_INFO, NULL_PTR);
        !          4692: 
        !          4693:   /* Untyped call and return.  */
        !          4694:   builtin_function ("__builtin_apply_args",
        !          4695:                    build_function_type (ptr_type_node, NULL_TREE),
        !          4696:                    BUILT_IN_APPLY_ARGS, NULL_PTR);
        !          4697: 
        !          4698:   temp = tree_cons (NULL_TREE,
        !          4699:                    build_pointer_type (build_function_type (void_type_node,
        !          4700:                                                             NULL_TREE)),
        !          4701:                    tree_cons (NULL_TREE,
        !          4702:                               ptr_type_node,
        !          4703:                               tree_cons (NULL_TREE,
        !          4704:                                          sizetype,
        !          4705:                                          endlink)));
        !          4706:   builtin_function ("__builtin_apply",
        !          4707:                    build_function_type (ptr_type_node, temp),
        !          4708:                    BUILT_IN_APPLY, NULL_PTR);
        !          4709:   builtin_function ("__builtin_return",
        !          4710:                    build_function_type (void_type_node,
        !          4711:                                         tree_cons (NULL_TREE,
        !          4712:                                                    ptr_type_node,
        !          4713:                                                    endlink)),
        !          4714:                    BUILT_IN_RETURN, NULL_PTR);
        !          4715: 
        !          4716:   /* Currently under experimentation.  */
        !          4717:   builtin_function ("__builtin_memcpy", memcpy_ftype,
        !          4718:                    BUILT_IN_MEMCPY, "memcpy");
        !          4719:   builtin_function ("__builtin_memcmp", int_ftype_cptr_cptr_sizet,
        !          4720:                    BUILT_IN_MEMCMP, "memcmp");
        !          4721:   builtin_function ("__builtin_strcmp", int_ftype_string_string,
        !          4722:                    BUILT_IN_STRCMP, "strcmp");
        !          4723:   builtin_function ("__builtin_strcpy", string_ftype_ptr_ptr,
        !          4724:                    BUILT_IN_STRCPY, "strcpy");
        !          4725: #if 0
        !          4726:   /* Not yet.  */
        !          4727:   builtin_function ("__builtin_strncpy", strncpy_ftype,
        !          4728:                    BUILT_IN_STRNCPY, "strncpy");
        !          4729: #endif
        !          4730:   builtin_function ("__builtin_strlen", sizet_ftype_string,
        !          4731:                    BUILT_IN_STRLEN, "strlen");
        !          4732: 
        !          4733:   if (!flag_no_builtin)
        !          4734:     {
        !          4735: #if 0 /* These do not work well with libg++.  */
        !          4736:       builtin_function ("abs", int_ftype_int, BUILT_IN_ABS, NULL_PTR);
        !          4737:       builtin_function ("fabs", double_ftype_double, BUILT_IN_FABS, NULL_PTR);
        !          4738:       builtin_function ("labs", long_ftype_long, BUILT_IN_LABS, NULL_PTR);
        !          4739: #endif
        !          4740:       builtin_function ("memcpy", memcpy_ftype, BUILT_IN_MEMCPY, NULL_PTR);
        !          4741:       builtin_function ("memcmp", int_ftype_cptr_cptr_sizet, BUILT_IN_MEMCMP,
        !          4742:                        NULL_PTR);
        !          4743:       builtin_function ("strcmp", int_ftype_string_string, BUILT_IN_STRCMP, NULL_PTR);
        !          4744:       builtin_function ("strcpy", string_ftype_ptr_ptr, BUILT_IN_STRCPY, NULL_PTR);
        !          4745: #if 0
        !          4746:       /* Not yet.  */
        !          4747:       builtin_function ("strncpy", strncpy_ftype, BUILT_IN_STRNCPY, NULL_PTR);
        !          4748: #endif
        !          4749:       builtin_function ("strlen", sizet_ftype_string, BUILT_IN_STRLEN, NULL_PTR);
        !          4750:       builtin_function ("sin", double_ftype_double, BUILT_IN_SIN, NULL_PTR);
        !          4751:       builtin_function ("cos", double_ftype_double, BUILT_IN_COS, NULL_PTR);
        !          4752:     }
        !          4753: 
        !          4754: #if 0
        !          4755:   /* Support for these has not been written in either expand_builtin
        !          4756:      or build_function_call.  */
        !          4757:   builtin_function ("__builtin_div", default_ftype, BUILT_IN_DIV, 0);
        !          4758:   builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV, 0);
        !          4759:   builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR, 0);
        !          4760:   builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL, 0);
        !          4761:   builtin_function ("__builtin_fmod", double_ftype_double_double, BUILT_IN_FMOD, 0);
        !          4762:   builtin_function ("__builtin_frem", double_ftype_double_double, BUILT_IN_FREM, 0);
        !          4763:   builtin_function ("__builtin_memset", ptr_ftype_ptr_int_int, BUILT_IN_MEMSET, 0);
        !          4764:   builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP, 0);
        !          4765:   builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN, 0);
        !          4766: #endif
        !          4767: 
        !          4768:   /* C++ extensions */
        !          4769: 
        !          4770:   unknown_type_node = make_node (UNKNOWN_TYPE);
        !          4771: #if 0 /* not yet, should get fixed properly later */
        !          4772:   pushdecl (make_type_decl (get_identifier ("unknown type"),
        !          4773:                       unknown_type_node));
        !          4774: #else
        !          4775:   decl = pushdecl (build_decl (TYPE_DECL, get_identifier ("unknown type"),
        !          4776:                        unknown_type_node));
        !          4777:   /* Make sure the "unknown type" typedecl gets ignored for debug info.  */
        !          4778:   DECL_IGNORED_P (decl) = 1;
        !          4779: #endif
        !          4780:   TYPE_SIZE (unknown_type_node) = TYPE_SIZE (void_type_node);
        !          4781:   TYPE_ALIGN (unknown_type_node) = 1;
        !          4782:   TYPE_MODE (unknown_type_node) = TYPE_MODE (void_type_node);
        !          4783:   /* Indirecting an UNKNOWN_TYPE node yields an UNKNOWN_TYPE node.  */
        !          4784:   TREE_TYPE (unknown_type_node) = unknown_type_node;
        !          4785:   /* Looking up TYPE_POINTER_TO and TYPE_REFERENCE_TO yield the same result.  */
        !          4786:   TYPE_POINTER_TO (unknown_type_node) = unknown_type_node;
        !          4787:   TYPE_REFERENCE_TO (unknown_type_node) = unknown_type_node;
        !          4788: 
        !          4789:   /* This is special for C++ so functions can be overloaded. */
        !          4790:   wchar_type_node
        !          4791:     = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (WCHAR_TYPE)));
        !          4792:   wchar_type_size = TYPE_PRECISION (wchar_type_node);
        !          4793:   signed_wchar_type_node = make_signed_type (wchar_type_size);
        !          4794:   unsigned_wchar_type_node = make_unsigned_type (wchar_type_size);
        !          4795:   wchar_type_node
        !          4796:     = TREE_UNSIGNED (wchar_type_node)
        !          4797:       ? unsigned_wchar_type_node
        !          4798:       : signed_wchar_type_node;
        !          4799:   record_builtin_type (RID_WCHAR, "__wchar_t", wchar_type_node);
        !          4800: 
        !          4801:   /* This is for wide string constants.  */
        !          4802:   wchar_array_type_node
        !          4803:     = build_array_type (wchar_type_node, array_domain_type);
        !          4804: 
        !          4805:   /* This is a hack that should go away when we deliver the
        !          4806:      real gc code.  */
        !          4807:   if (flag_gc)
        !          4808:     {
        !          4809:       builtin_function ("__gc_main", default_function_type, NOT_BUILT_IN, 0);
        !          4810:       pushdecl (lookup_name (get_identifier ("__gc_main"), 0));
        !          4811:     }
        !          4812: 
        !          4813:   /* Simplify life by making a "vtable_entry_type".  Give its
        !          4814:      fields names so that the debugger can use them.  */
        !          4815: 
        !          4816:   vtable_entry_type = make_lang_type (RECORD_TYPE);
        !          4817:   fields[0] = build_lang_field_decl (FIELD_DECL, delta_identifier, short_integer_type_node);
        !          4818:   fields[1] = build_lang_field_decl (FIELD_DECL, index_identifier, short_integer_type_node);
        !          4819:   fields[2] = build_lang_field_decl (FIELD_DECL, pfn_identifier, ptr_type_node);
        !          4820:   finish_builtin_type (vtable_entry_type, VTBL_PTR_TYPE, fields, 2,
        !          4821:                       double_type_node);
        !          4822: 
        !          4823:   /* Make this part of an invisible union.  */
        !          4824:   fields[3] = copy_node (fields[2]);
        !          4825:   TREE_TYPE (fields[3]) = short_integer_type_node;
        !          4826:   DECL_NAME (fields[3]) = delta2_identifier;
        !          4827:   DECL_MODE (fields[3]) = TYPE_MODE (short_integer_type_node);
        !          4828:   DECL_SIZE (fields[3]) = TYPE_SIZE (short_integer_type_node);
        !          4829:   TREE_UNSIGNED (fields[3]) = 0;
        !          4830:   TREE_CHAIN (fields[2]) = fields[3];
        !          4831:   vtable_entry_type = build_type_variant (vtable_entry_type, 1, 0);
        !          4832:   record_builtin_type (RID_MAX, VTBL_PTR_TYPE, vtable_entry_type);
        !          4833: 
        !          4834:   if (flag_dossier)
        !          4835:     {
        !          4836:       /* Must build __t_desc type.  Currently, type descriptors look like this:
        !          4837: 
        !          4838:         struct __t_desc
        !          4839:         {
        !          4840:            const char *name;
        !          4841:           int size;
        !          4842:           int bits;
        !          4843:           struct __t_desc *points_to;
        !          4844:           int ivars_count, meths_count;
        !          4845:           struct __i_desc *ivars[];
        !          4846:           struct __m_desc *meths[];
        !          4847:           struct __t_desc *parents[];
        !          4848:           struct __t_desc *vbases[];
        !          4849:           int offsets[];
        !          4850:         };
        !          4851: 
        !          4852:         ...as per Linton's paper.  */
        !          4853: 
        !          4854:       __t_desc_type_node = make_lang_type (RECORD_TYPE);
        !          4855:       __i_desc_type_node = make_lang_type (RECORD_TYPE);
        !          4856:       __m_desc_type_node = make_lang_type (RECORD_TYPE);
        !          4857:       __t_desc_array_type = build_array_type (TYPE_POINTER_TO (__t_desc_type_node), NULL_TREE);
        !          4858:       __i_desc_array_type = build_array_type (TYPE_POINTER_TO (__i_desc_type_node), NULL_TREE);
        !          4859:       __m_desc_array_type = build_array_type (TYPE_POINTER_TO (__m_desc_type_node), NULL_TREE);
        !          4860: 
        !          4861:       fields[0] = build_lang_field_decl (FIELD_DECL, get_identifier ("name"),
        !          4862:                                         string_type_node);
        !          4863:       fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier ("size"),
        !          4864:                                         unsigned_type_node);
        !          4865:       fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier ("bits"),
        !          4866:                                         unsigned_type_node);
        !          4867:       fields[3] = build_lang_field_decl (FIELD_DECL, get_identifier ("points_to"),
        !          4868:                                         TYPE_POINTER_TO (__t_desc_type_node));
        !          4869:       fields[4] = build_lang_field_decl (FIELD_DECL,
        !          4870:                                         get_identifier ("ivars_count"),
        !          4871:                                         integer_type_node);
        !          4872:       fields[5] = build_lang_field_decl (FIELD_DECL,
        !          4873:                                         get_identifier ("meths_count"),
        !          4874:                                         integer_type_node);
        !          4875:       fields[6] = build_lang_field_decl (FIELD_DECL, get_identifier ("ivars"),
        !          4876:                                         build_pointer_type (__i_desc_array_type));
        !          4877:       fields[7] = build_lang_field_decl (FIELD_DECL, get_identifier ("meths"),
        !          4878:                                         build_pointer_type (__m_desc_array_type));
        !          4879:       fields[8] = build_lang_field_decl (FIELD_DECL, get_identifier ("parents"),
        !          4880:                                         build_pointer_type (__t_desc_array_type));
        !          4881:       fields[9] = build_lang_field_decl (FIELD_DECL, get_identifier ("vbases"),
        !          4882:                                         build_pointer_type (__t_desc_array_type));
        !          4883:       fields[10] = build_lang_field_decl (FIELD_DECL, get_identifier ("offsets"),
        !          4884:                                         build_pointer_type (integer_type_node));
        !          4885:       finish_builtin_type (__t_desc_type_node, "__t_desc", fields, 10, integer_type_node);
        !          4886: 
        !          4887:       /* ivar descriptors look like this:
        !          4888: 
        !          4889:         struct __i_desc
        !          4890:         {
        !          4891:           const char *name;
        !          4892:           int offset;
        !          4893:           struct __t_desc *type;
        !          4894:         };
        !          4895:       */
        !          4896: 
        !          4897:       fields[0] = build_lang_field_decl (FIELD_DECL, get_identifier ("name"),
        !          4898:                                         string_type_node);
        !          4899:       fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier ("offset"),
        !          4900:                                         integer_type_node);
        !          4901:       fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier ("type"),
        !          4902:                                         TYPE_POINTER_TO (__t_desc_type_node));
        !          4903:       finish_builtin_type (__i_desc_type_node, "__i_desc", fields, 2, integer_type_node);
        !          4904: 
        !          4905:       /* method descriptors look like this:
        !          4906: 
        !          4907:         struct __m_desc
        !          4908:         {
        !          4909:           const char *name;
        !          4910:           int vindex;
        !          4911:           struct __t_desc *vcontext;
        !          4912:           struct __t_desc *return_type;
        !          4913:           void (*address)();
        !          4914:           short parm_count;
        !          4915:           short required_parms;
        !          4916:           struct __t_desc *parm_types[];
        !          4917:         };
        !          4918:       */
        !          4919: 
        !          4920:       fields[0] = build_lang_field_decl (FIELD_DECL, get_identifier ("name"),
        !          4921:                                         string_type_node);
        !          4922:       fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier ("vindex"),
        !          4923:                                         integer_type_node);
        !          4924:       fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier ("vcontext"),
        !          4925:                                         TYPE_POINTER_TO (__t_desc_type_node));
        !          4926:       fields[3] = build_lang_field_decl (FIELD_DECL, get_identifier ("return_type"),
        !          4927:                                         TYPE_POINTER_TO (__t_desc_type_node));
        !          4928:       fields[4] = build_lang_field_decl (FIELD_DECL, get_identifier ("address"),
        !          4929:                                         build_pointer_type (default_function_type));
        !          4930:       fields[5] = build_lang_field_decl (FIELD_DECL, get_identifier ("parm_count"),
        !          4931:                                         short_integer_type_node);
        !          4932:       fields[6] = build_lang_field_decl (FIELD_DECL, get_identifier ("required_parms"),
        !          4933:                                         short_integer_type_node);
        !          4934:       fields[7] = build_lang_field_decl (FIELD_DECL, get_identifier ("parm_types"),
        !          4935:                                         build_pointer_type (build_array_type (TYPE_POINTER_TO (__t_desc_type_node), NULL_TREE)));
        !          4936:       finish_builtin_type (__m_desc_type_node, "__m_desc", fields, 7, integer_type_node);
        !          4937:     }
        !          4938: 
        !          4939:   /* Now, C++.  */
        !          4940:   current_lang_name = lang_name_cplusplus;
        !          4941:   if (flag_dossier)
        !          4942:     {
        !          4943:       int i = builtin_type_tdescs_len;
        !          4944:       while (i > 0)
        !          4945:        {
        !          4946:          tree tdesc = build_t_desc (builtin_type_tdescs_arr[--i], 0);
        !          4947:          TREE_ASM_WRITTEN (tdesc) = 1;
        !          4948:          TREE_PUBLIC (TREE_OPERAND (tdesc, 0)) = 1;
        !          4949:        }
        !          4950:     }
        !          4951: 
        !          4952:   auto_function (ansi_opname[(int) NEW_EXPR],
        !          4953:                 build_function_type (ptr_type_node,
        !          4954:                                      tree_cons (NULL_TREE, sizetype,
        !          4955:                                                 void_list_node)),
        !          4956:                 NOT_BUILT_IN);
        !          4957:   auto_function (ansi_opname[(int) DELETE_EXPR],
        !          4958:                 build_function_type (void_type_node,
        !          4959:                                      tree_cons (NULL_TREE, ptr_type_node,
        !          4960:                                                 void_list_node)),
        !          4961:                 NOT_BUILT_IN);
        !          4962: 
        !          4963:   abort_fndecl
        !          4964:     = define_function ("abort",
        !          4965:                       build_function_type (void_type_node, void_list_node),
        !          4966:                       NOT_BUILT_IN, 0, 0);
        !          4967: 
        !          4968:   unhandled_exception_fndecl
        !          4969:     = define_function ("__unhandled_exception",
        !          4970:                       build_function_type (void_type_node, NULL_TREE),
        !          4971:                       NOT_BUILT_IN, 0, 0);
        !          4972: 
        !          4973:   /* Perform other language dependent initializations.  */
        !          4974:   init_class_processing ();
        !          4975:   init_init_processing ();
        !          4976:   init_search_processing ();
        !          4977: 
        !          4978:   if (flag_handle_exceptions)
        !          4979:     {
        !          4980:       if (flag_handle_exceptions == 2)
        !          4981:        /* Too much trouble to inline all the trys needed for this.  */
        !          4982:        flag_this_is_variable = 2;
        !          4983:       init_exception_processing ();
        !          4984:     }
        !          4985:   if (flag_gc)
        !          4986:     init_gc_processing ();
        !          4987:   if (flag_no_inline)
        !          4988:     flag_inline_functions = 0, flag_default_inline = 0;
        !          4989:   if (flag_cadillac)
        !          4990:     init_cadillac ();
        !          4991: 
        !          4992:   /* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__.  */
        !          4993:   declare_function_name ();
        !          4994: }
        !          4995: 
        !          4996: /* Make a definition for a builtin function named NAME and whose data type
        !          4997:    is TYPE.  TYPE should be a function type with argument types.
        !          4998:    FUNCTION_CODE tells later passes how to compile calls to this function.
        !          4999:    See tree.h for its possible values.
        !          5000: 
        !          5001:    If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
        !          5002:    the name to be called if we can't opencode the function.  */
        !          5003: 
        !          5004: tree
        !          5005: define_function (name, type, function_code, pfn, library_name)
        !          5006:      char *name;
        !          5007:      tree type;
        !          5008:      enum built_in_function function_code;
        !          5009:      void (*pfn)();
        !          5010:      char *library_name;
        !          5011: {
        !          5012:   tree decl = build_lang_decl (FUNCTION_DECL, get_identifier (name), type);
        !          5013:   DECL_EXTERNAL (decl) = 1;
        !          5014:   TREE_PUBLIC (decl) = 1;
        !          5015: 
        !          5016:   /* Since `pushdecl' relies on DECL_ASSEMBLER_NAME instead of DECL_NAME,
        !          5017:      we cannot change DECL_ASSEMBLER_NAME until we have installed this
        !          5018:      function in the namespace.  */
        !          5019:   if (pfn) (*pfn) (decl);
        !          5020:   if (library_name)
        !          5021:     DECL_ASSEMBLER_NAME (decl) = get_identifier (library_name);
        !          5022:   make_function_rtl (decl);
        !          5023:   if (function_code != NOT_BUILT_IN)
        !          5024:     {
        !          5025:       DECL_BUILT_IN (decl) = 1;
        !          5026:       DECL_SET_FUNCTION_CODE (decl, function_code);
        !          5027:     }
        !          5028:   return decl;
        !          5029: }
        !          5030: 
        !          5031: /* Called when a declaration is seen that contains no names to declare.
        !          5032:    If its type is a reference to a structure, union or enum inherited
        !          5033:    from a containing scope, shadow that tag name for the current scope
        !          5034:    with a forward reference.
        !          5035:    If its type defines a new named structure or union
        !          5036:    or defines an enum, it is valid but we need not do anything here.
        !          5037:    Otherwise, it is an error.
        !          5038: 
        !          5039:    C++: may have to grok the declspecs to learn about static,
        !          5040:    complain for anonymous unions.  */
        !          5041: 
        !          5042: void
        !          5043: shadow_tag (declspecs)
        !          5044:      tree declspecs;
        !          5045: {
        !          5046:   int found_tag = 0;
        !          5047:   int warned = 0;
        !          5048:   int static_or_extern = 0;
        !          5049:   register tree link;
        !          5050:   register enum tree_code code, ok_code = ERROR_MARK;
        !          5051:   register tree t = NULL_TREE;
        !          5052: 
        !          5053:   for (link = declspecs; link; link = TREE_CHAIN (link))
        !          5054:     {
        !          5055:       register tree value = TREE_VALUE (link);
        !          5056: 
        !          5057:       code = TREE_CODE (value);
        !          5058:       if (IS_AGGR_TYPE_CODE (code) || code == ENUMERAL_TYPE)
        !          5059:        /* Used to test also that TYPE_SIZE (value) != 0.
        !          5060:           That caused warning for `struct foo;' at top level in the file.  */
        !          5061:        {
        !          5062:          register tree name = TYPE_NAME (value);
        !          5063: 
        !          5064:          if (name == NULL_TREE)
        !          5065:            name = lookup_tag_reverse (value, NULL_TREE);
        !          5066: 
        !          5067:          if (name && TREE_CODE (name) == TYPE_DECL)
        !          5068:            name = DECL_NAME (name);
        !          5069: 
        !          5070:          if (class_binding_level)
        !          5071:            t = lookup_tag (code, name, class_binding_level, 1);
        !          5072:          else
        !          5073:            t = lookup_tag (code, name, current_binding_level, 1);
        !          5074: 
        !          5075:          if (t == NULL_TREE)
        !          5076:            {
        !          5077:              push_obstacks (&permanent_obstack, &permanent_obstack);
        !          5078:              if (IS_AGGR_TYPE_CODE (code))
        !          5079:                t = make_lang_type (code);
        !          5080:              else
        !          5081:                t = make_node (code);
        !          5082:              pushtag (name, t);
        !          5083:              pop_obstacks ();
        !          5084:              ok_code = code;
        !          5085:              break;
        !          5086:            }
        !          5087:          else if (name != NULL_TREE || code == ENUMERAL_TYPE)
        !          5088:            ok_code = code;
        !          5089: 
        !          5090:          if (ok_code != ERROR_MARK)
        !          5091:            found_tag++;
        !          5092:          else
        !          5093:            {
        !          5094:              if (!warned)
        !          5095:                pedwarn ("useless keyword or type name in declaration");
        !          5096:              warned = 1;
        !          5097:            }
        !          5098:        }
        !          5099:       else if (value == ridpointers[(int) RID_STATIC]
        !          5100:               || value == ridpointers[(int) RID_EXTERN])
        !          5101:        static_or_extern = 1;
        !          5102:     }
        !          5103: 
        !          5104:   /* This is where the variables in an anonymous union are
        !          5105:      declared.  An anonymous union declaration looks like:
        !          5106:      union { ... } ;
        !          5107:      because there is no declarator after the union, the parser
        !          5108:      sends that declaration here.  */
        !          5109:   if (ok_code == UNION_TYPE
        !          5110:       && t != NULL_TREE
        !          5111:       && ((TREE_CODE (TYPE_NAME (t)) == IDENTIFIER_NODE
        !          5112:           && ANON_AGGRNAME_P (TYPE_NAME (t)))
        !          5113:          || (TREE_CODE (TYPE_NAME (t)) == TYPE_DECL
        !          5114:              && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t)))))
        !          5115:     {
        !          5116:       /* ANSI C++ June 5 1992 WP 9.5.3.  Anonymous unions may not have
        !          5117:         function members.  */
        !          5118:       if (TYPE_FIELDS (t))
        !          5119:        {
        !          5120:          tree decl = grokdeclarator (NULL_TREE, declspecs, NORMAL, 0, NULL_TREE);
        !          5121:          finish_anon_union (decl);
        !          5122:        }
        !          5123:       else
        !          5124:        error ("anonymous union cannot have a function member");
        !          5125:     }
        !          5126:   else
        !          5127:     {
        !          5128:       /* Anonymous unions are objects, that's why we only check for
        !          5129:         static/extern specifiers in this branch.  */
        !          5130:       if (static_or_extern)
        !          5131:        error ("static/extern can only be specified for objects and functions");
        !          5132: 
        !          5133:       if (ok_code == RECORD_TYPE
        !          5134:          && found_tag == 1
        !          5135:          && TYPE_LANG_SPECIFIC (t)
        !          5136:          && CLASSTYPE_DECLARED_EXCEPTION (t))
        !          5137:        {
        !          5138:          if (TYPE_SIZE (t))
        !          5139:            cp_error ("redeclaration of exception `%T'", t);
        !          5140:          else
        !          5141:            {
        !          5142:              tree ename, decl;
        !          5143: 
        !          5144:              push_obstacks (&permanent_obstack, &permanent_obstack);
        !          5145: 
        !          5146:              pushclass (t, 0);
        !          5147:              finish_exception (t, NULL_TREE);
        !          5148: 
        !          5149:              ename = TYPE_NAME (t);
        !          5150:              if (TREE_CODE (ename) == TYPE_DECL)
        !          5151:                ename = DECL_NAME (ename);
        !          5152:              decl = build_lang_field_decl (VAR_DECL, ename, t);
        !          5153:              finish_exception_decl (current_class_name, decl);
        !          5154:              end_exception_decls ();
        !          5155: 
        !          5156:              pop_obstacks ();
        !          5157:            }
        !          5158:        }
        !          5159:       else if (!warned && found_tag > 1)
        !          5160:        warning ("multiple types in one declaration");
        !          5161:     }
        !          5162: }
        !          5163: 
        !          5164: /* Decode a "typename", such as "int **", returning a ..._TYPE node.  */
        !          5165: 
        !          5166: tree
        !          5167: groktypename (typename)
        !          5168:      tree typename;
        !          5169: {
        !          5170:   if (TREE_CODE (typename) != TREE_LIST)
        !          5171:     return typename;
        !          5172:   return grokdeclarator (TREE_VALUE (typename),
        !          5173:                         TREE_PURPOSE (typename),
        !          5174:                         TYPENAME, 0, NULL_TREE);
        !          5175: }
        !          5176: 
        !          5177: #ifdef OBJCPLUS
        !          5178: /* Return a PARM_DECL node for a given pair of specs and declarator.  */
        !          5179: 
        !          5180: tree
        !          5181: groktypename_in_parm_context (typename)
        !          5182:      tree typename;
        !          5183: {
        !          5184:   if (TREE_CODE (typename) != TREE_LIST)
        !          5185:     return typename;
        !          5186:   return grokdeclarator (TREE_VALUE (typename),
        !          5187:                          TREE_PURPOSE (typename),
        !          5188:                          PARM, 0, NULL_TREE);
        !          5189: }
        !          5190: #endif /* OBJCPLUS */
        !          5191: 
        !          5192: 
        !          5193: /* Decode a declarator in an ordinary declaration or data definition.
        !          5194:    This is called as soon as the type information and variable name
        !          5195:    have been parsed, before parsing the initializer if any.
        !          5196:    Here we create the ..._DECL node, fill in its type,
        !          5197:    and put it on the list of decls for the current context.
        !          5198:    The ..._DECL node is returned as the value.
        !          5199: 
        !          5200:    Exception: for arrays where the length is not specified,
        !          5201:    the type is left null, to be filled in by `finish_decl'.
        !          5202: 
        !          5203:    Function definitions do not come here; they go to start_function
        !          5204:    instead.  However, external and forward declarations of functions
        !          5205:    do go through here.  Structure field declarations are done by
        !          5206:    grokfield and not through here.  */
        !          5207: 
        !          5208: /* Set this to zero to debug not using the temporary obstack
        !          5209:    to parse initializers.  */
        !          5210: int debug_temp_inits = 1;
        !          5211: 
        !          5212: tree
        !          5213: start_decl (declarator, declspecs, initialized, raises)
        !          5214:      tree declarator, declspecs;
        !          5215:      int initialized;
        !          5216:      tree raises;
        !          5217: {
        !          5218:   register tree decl;
        !          5219:   register tree type, tem;
        !          5220:   tree context;
        !          5221:   extern int have_extern_spec;
        !          5222:   extern int used_extern_spec;
        !          5223: 
        !          5224:   int init_written = initialized;
        !          5225: 
        !          5226:   /* This should only be done once on the top most decl. */
        !          5227:   if (have_extern_spec && !used_extern_spec)
        !          5228:     {
        !          5229:       declspecs = decl_tree_cons (NULL_TREE, get_identifier ("extern"), declspecs);
        !          5230:       used_extern_spec = 1;
        !          5231:     }
        !          5232: 
        !          5233:   decl = grokdeclarator (declarator, declspecs, NORMAL, initialized, raises);
        !          5234:   if (decl == NULL_TREE || decl == void_type_node)
        !          5235:     return NULL_TREE;
        !          5236: 
        !          5237:   type = TREE_TYPE (decl);
        !          5238: 
        !          5239:   /* Don't lose if destructors must be executed at file-level.  */
        !          5240:   if (TREE_STATIC (decl)
        !          5241:       && TYPE_NEEDS_DESTRUCTOR (type)
        !          5242:       && !TREE_PERMANENT (decl))
        !          5243:     {
        !          5244:       push_obstacks (&permanent_obstack, &permanent_obstack);
        !          5245:       decl = copy_node (decl);
        !          5246:       if (TREE_CODE (type) == ARRAY_TYPE)
        !          5247:        {
        !          5248:          tree itype = TYPE_DOMAIN (type);
        !          5249:          if (itype && ! TREE_PERMANENT (itype))
        !          5250:            {
        !          5251:              itype = build_index_type (copy_to_permanent (TYPE_MAX_VALUE (itype)));
        !          5252:              type = build_cplus_array_type (TREE_TYPE (type), itype);
        !          5253:              TREE_TYPE (decl) = type;
        !          5254:            }
        !          5255:        }
        !          5256:       pop_obstacks ();
        !          5257:     }
        !          5258: 
        !          5259:   /* Interesting work for this is done in `finish_exception_decl'.  */
        !          5260:   if (TREE_CODE (type) == RECORD_TYPE
        !          5261:       && CLASSTYPE_DECLARED_EXCEPTION (type))
        !          5262:     return decl;
        !          5263: 
        !          5264:   /* Corresponding pop_obstacks is done in `finish_decl'.  */
        !          5265:   push_obstacks_nochange ();
        !          5266: 
        !          5267:   context
        !          5268:     = (TREE_CODE (decl) == FUNCTION_DECL && DECL_VIRTUAL_P (decl))
        !          5269:       ? DECL_CLASS_CONTEXT (decl)
        !          5270:       : DECL_CONTEXT (decl);
        !          5271: 
        !          5272:   if (processing_template_decl)
        !          5273:     {
        !          5274:       tree d;
        !          5275:       if (TREE_CODE (decl) == FUNCTION_DECL)
        !          5276:         {
        !          5277:           /* Declarator is a call_expr; extract arguments from it, since
        !          5278:              grokdeclarator didn't do it.  */
        !          5279:           tree args;
        !          5280:           args = copy_to_permanent (last_function_parms);
        !          5281:           if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
        !          5282:             {
        !          5283:              tree t = TREE_TYPE (decl);
        !          5284:               tree decl;
        !          5285:              
        !          5286:               t = TYPE_METHOD_BASETYPE (t); /* type method belongs to */
        !          5287:              if (TREE_CODE (t) != UNINSTANTIATED_P_TYPE)
        !          5288:                {
        !          5289:                  t = build_pointer_type (t); /* base type of `this' */
        !          5290: #if 1
        !          5291:                  /* I suspect this is wrong. */
        !          5292:                  t = build_type_variant (t, flag_this_is_variable <= 0,
        !          5293:                                          0); /* type of `this' */
        !          5294: #else
        !          5295:                  t = build_type_variant (t, 0, 0); /* type of `this' */
        !          5296: #endif
        !          5297:                  t = build (PARM_DECL, t, this_identifier);
        !          5298:                  TREE_CHAIN (t) = args;
        !          5299:                  args = t;
        !          5300:                }
        !          5301:            }
        !          5302:           DECL_ARGUMENTS (decl) = args;
        !          5303:         }
        !          5304:       d = build_lang_decl (TEMPLATE_DECL, DECL_NAME (decl), TREE_TYPE (decl));
        !          5305:       if (interface_unknown && flag_external_templates)
        !          5306:        warn_if_unknown_interface ();
        !          5307:       TREE_PUBLIC (d) = TREE_PUBLIC (decl) = flag_external_templates && !interface_unknown;
        !          5308:       TREE_STATIC (d) = TREE_STATIC (decl);
        !          5309:       DECL_EXTERNAL (d) = (DECL_EXTERNAL (decl)
        !          5310:                           && !(context && !DECL_THIS_EXTERN (decl)));
        !          5311:       DECL_TEMPLATE_RESULT (d) = decl;
        !          5312:       DECL_OVERLOADED (d) = 1;
        !          5313:       decl = d;
        !          5314:     }
        !          5315: 
        !          5316:   if (context && TYPE_SIZE (context) != NULL_TREE)
        !          5317:     {
        !          5318:       /* If it was not explicitly declared `extern',
        !          5319:         revoke any previous claims of DECL_EXTERNAL.  */
        !          5320:       if (DECL_THIS_EXTERN (decl) == 0)
        !          5321:        DECL_EXTERNAL (decl) = 0;
        !          5322:       if (DECL_LANG_SPECIFIC (decl))
        !          5323:        DECL_IN_AGGR_P (decl) = 0;
        !          5324:       pushclass (context, 2);
        !          5325:     }
        !          5326: 
        !          5327:   /* If this type of object needs a cleanup, and control may
        !          5328:      jump past it, make a new binding level so that it is cleaned
        !          5329:      up only when it is initialized first.  */
        !          5330:   if (TYPE_NEEDS_DESTRUCTOR (type)
        !          5331:       && current_binding_level->more_cleanups_ok == 0)
        !          5332:     pushlevel_temporary (1);
        !          5333: 
        !          5334:   if (initialized)
        !          5335:     /* Is it valid for this decl to have an initializer at all?
        !          5336:        If not, set INITIALIZED to zero, which will indirectly
        !          5337:        tell `finish_decl' to ignore the initializer once it is parsed.  */
        !          5338:     switch (TREE_CODE (decl))
        !          5339:       {
        !          5340:       case TYPE_DECL:
        !          5341:        /* typedef foo = bar  means give foo the same type as bar.
        !          5342:           We haven't parsed bar yet, so `finish_decl' will fix that up.
        !          5343:           Any other case of an initialization in a TYPE_DECL is an error.  */
        !          5344:        if (pedantic || list_length (declspecs) > 1)
        !          5345:          {
        !          5346:            cp_error ("typedef `%D' is initialized", decl);
        !          5347:            initialized = 0;
        !          5348:          }
        !          5349:        break;
        !          5350: 
        !          5351:       case FUNCTION_DECL:
        !          5352:        cp_error ("function `%#D' is initialized like a variable", decl);
        !          5353:        initialized = 0;
        !          5354:        break;
        !          5355: 
        !          5356:       default:
        !          5357:        /* Don't allow initializations for incomplete types except for
        !          5358:           arrays which might be completed by the initialization.  */
        !          5359:        if (TYPE_SIZE (type) != NULL_TREE)
        !          5360:          ;                     /* A complete type is ok.  */
        !          5361:        else if (TREE_CODE (type) != ARRAY_TYPE)
        !          5362:          {
        !          5363:            cp_error ("variable `%#D' has initializer but incomplete type",
        !          5364:                      decl);
        !          5365:            initialized = 0;
        !          5366:          }
        !          5367:        else if (TYPE_SIZE (TREE_TYPE (type)) == NULL_TREE)
        !          5368:          {
        !          5369:            cp_error ("elements of array `%#D' have incomplete type", decl);
        !          5370:            initialized = 0;
        !          5371:          }
        !          5372:       }
        !          5373: 
        !          5374:   if (!initialized
        !          5375:       && TREE_CODE (decl) != TYPE_DECL
        !          5376:       && TREE_CODE (decl) != TEMPLATE_DECL
        !          5377:       && IS_AGGR_TYPE (type) && ! DECL_EXTERNAL (decl))
        !          5378:     {
        !          5379:       if (TYPE_SIZE (type) == NULL_TREE)
        !          5380:        {
        !          5381:          cp_error ("aggregate `%#D' has incomplete type and cannot be initialized",
        !          5382:                 decl);
        !          5383:          /* Change the type so that assemble_variable will give
        !          5384:             DECL an rtl we can live with: (mem (const_int 0)).  */
        !          5385:          TREE_TYPE (decl) = error_mark_node;
        !          5386:          type = error_mark_node;
        !          5387:        }
        !          5388:       else
        !          5389:        {
        !          5390:          /* If any base type in the hierarchy of TYPE needs a constructor,
        !          5391:             then we set initialized to 1.  This way any nodes which are
        !          5392:             created for the purposes of initializing this aggregate
        !          5393:             will live as long as it does.  This is necessary for global
        !          5394:             aggregates which do not have their initializers processed until
        !          5395:             the end of the file.  */
        !          5396:          initialized = TYPE_NEEDS_CONSTRUCTING (type);
        !          5397:        }
        !          5398:     }
        !          5399: 
        !          5400:   if (initialized)
        !          5401:     {
        !          5402:       if (current_binding_level != global_binding_level
        !          5403:          && DECL_EXTERNAL (decl))
        !          5404:        cp_warning ("declaration of `%#D' has `extern' and is initialized",
        !          5405:                    decl);
        !          5406:       DECL_EXTERNAL (decl) = 0;
        !          5407:       if (current_binding_level == global_binding_level)
        !          5408:        TREE_STATIC (decl) = 1;
        !          5409: 
        !          5410:       /* Tell `pushdecl' this is an initialized decl
        !          5411:         even though we don't yet have the initializer expression.
        !          5412:         Also tell `finish_decl' it may store the real initializer.  */
        !          5413:       DECL_INITIAL (decl) = error_mark_node;
        !          5414:     }
        !          5415: 
        !          5416:   /* Add this decl to the current binding level, but not if it
        !          5417:      comes from another scope, e.g. a static member variable.
        !          5418:      TEM may equal DECL or it may be a previous decl of the same name.  */
        !          5419:   if ((TREE_CODE (decl) != PARM_DECL && DECL_CONTEXT (decl) != NULL_TREE)
        !          5420:       || (TREE_CODE (decl) == TEMPLATE_DECL && !global_bindings_p ())
        !          5421:       || TREE_CODE (type) == LANG_TYPE)
        !          5422:     tem = decl;
        !          5423:   else
        !          5424:     {
        !          5425:       tem = pushdecl (decl);
        !          5426:       if (TREE_CODE (tem) == TREE_LIST)
        !          5427:        {
        !          5428:          tree tem2 = value_member (decl, tem);
        !          5429:          if (tem2 != NULL_TREE)
        !          5430:            tem = TREE_VALUE (tem2);
        !          5431:          else
        !          5432:            {
        !          5433:              while (tem && ! decls_match (decl, TREE_VALUE (tem)))
        !          5434:                tem = TREE_CHAIN (tem);
        !          5435:              if (tem == NULL_TREE)
        !          5436:                tem = decl;
        !          5437:              else
        !          5438:                tem = TREE_VALUE (tem);
        !          5439:            }
        !          5440:        }
        !          5441:     }
        !          5442: 
        !          5443: #if 0
        !          5444:   /* We don't do this yet for GNU C++.  */
        !          5445:   /* For a local variable, define the RTL now.  */
        !          5446:   if (current_binding_level != global_binding_level
        !          5447:       /* But not if this is a duplicate decl
        !          5448:         and we preserved the rtl from the previous one
        !          5449:         (which may or may not happen).  */
        !          5450:       && DECL_RTL (tem) == NULL_RTX)
        !          5451:     {
        !          5452:       if (TYPE_SIZE (TREE_TYPE (tem)) != NULL_TREE)
        !          5453:        expand_decl (tem);
        !          5454:       else if (TREE_CODE (TREE_TYPE (tem)) == ARRAY_TYPE
        !          5455:               && DECL_INITIAL (tem) != NULL_TREE)
        !          5456:        expand_decl (tem);
        !          5457:     }
        !          5458: #endif
        !          5459: 
        !          5460:   if (TREE_CODE (decl) == FUNCTION_DECL && DECL_OVERLOADED (decl))
        !          5461:     /* @@ Also done in start_function.  */
        !          5462:     tem = push_overloaded_decl (tem, 1);
        !          5463:   else if (TREE_CODE (decl) == TEMPLATE_DECL)
        !          5464:     {
        !          5465:       tree result = DECL_TEMPLATE_RESULT (decl);
        !          5466:       if (DECL_CONTEXT (result) != NULL_TREE)
        !          5467:        {
        !          5468:           tree type;
        !          5469:           type = DECL_CONTEXT (result);
        !          5470: 
        !          5471:          if (TREE_CODE (type) != UNINSTANTIATED_P_TYPE)
        !          5472:            {
        !          5473:              cp_error ("declaration of `%D' in non-template type `%T'",
        !          5474:                        decl, type);
        !          5475:              return NULL_TREE;
        !          5476:            }
        !          5477: 
        !          5478:           if (/* TREE_CODE (result) == VAR_DECL */ 1)
        !          5479:             {
        !          5480: #if 0
        !          5481:               tree tmpl = UPT_TEMPLATE (type);
        !          5482:              
        !          5483:              fprintf (stderr, "%s:%d: adding ", __FILE__, __LINE__);
        !          5484:              print_node_brief (stderr, "", DECL_NAME (tem), 0);
        !          5485:              fprintf (stderr, " to class %s\n",
        !          5486:                       IDENTIFIER_POINTER (DECL_NAME (tmpl)));
        !          5487:               DECL_TEMPLATE_MEMBERS (tmpl)
        !          5488:                 = perm_tree_cons (DECL_NAME (tem), tem,
        !          5489:                                  DECL_TEMPLATE_MEMBERS (tmpl));
        !          5490: #endif
        !          5491:              return tem;
        !          5492:            }
        !          5493:           my_friendly_abort (13);
        !          5494:         }
        !          5495:       else if (TREE_CODE (result) == FUNCTION_DECL)
        !          5496:         tem = push_overloaded_decl (tem, 0);
        !          5497:       else if (TREE_CODE (result) == VAR_DECL
        !          5498:               || TREE_CODE (result) == TYPE_DECL)
        !          5499:        {
        !          5500:          cp_error ("invalid template `%#D'", result);
        !          5501:          return NULL_TREE;
        !          5502:        }
        !          5503:       else
        !          5504:        my_friendly_abort (14);
        !          5505:     }
        !          5506: 
        !          5507:   if (init_written
        !          5508:       && ! (TREE_CODE (tem) == PARM_DECL
        !          5509:            || (TREE_READONLY (tem)
        !          5510:                && (TREE_CODE (tem) == VAR_DECL
        !          5511:                    || TREE_CODE (tem) == FIELD_DECL))))
        !          5512:     {
        !          5513:       /* When parsing and digesting the initializer,
        !          5514:         use temporary storage.  Do this even if we will ignore the value.  */
        !          5515:       if (current_binding_level == global_binding_level && debug_temp_inits)
        !          5516:        {
        !          5517:          if (TYPE_NEEDS_CONSTRUCTING (type) || TREE_CODE (type) == REFERENCE_TYPE)
        !          5518:            /* In this case, the initializer must lay down in permanent
        !          5519:               storage, since it will be saved until `finish_file' is run.   */
        !          5520:            ;
        !          5521:          else
        !          5522:            temporary_allocation ();
        !          5523:        }
        !          5524:     }
        !          5525: 
        !          5526:   if (flag_cadillac)
        !          5527:     cadillac_start_decl (tem);
        !          5528: 
        !          5529:   return tem;
        !          5530: }
        !          5531: 
        !          5532: static void
        !          5533: make_temporary_for_reference (decl, ctor_call, init, cleanupp)
        !          5534:      tree decl, ctor_call, init;
        !          5535:      tree *cleanupp;
        !          5536: {
        !          5537:   tree type = TREE_TYPE (decl);
        !          5538:   tree target_type = TREE_TYPE (type);
        !          5539:   tree tmp, tmp_addr;
        !          5540: 
        !          5541:   if (ctor_call)
        !          5542:     {
        !          5543:       tmp_addr = TREE_VALUE (TREE_OPERAND (ctor_call, 1));
        !          5544:       if (TREE_CODE (tmp_addr) == NOP_EXPR)
        !          5545:        tmp_addr = TREE_OPERAND (tmp_addr, 0);
        !          5546:       my_friendly_assert (TREE_CODE (tmp_addr) == ADDR_EXPR, 146);
        !          5547:       tmp = TREE_OPERAND (tmp_addr, 0);
        !          5548:     }
        !          5549:   else
        !          5550:     {
        !          5551:       tmp = get_temp_name (target_type,
        !          5552:                           current_binding_level == global_binding_level);
        !          5553:       tmp_addr = build_unary_op (ADDR_EXPR, tmp, 0);
        !          5554:     }
        !          5555: 
        !          5556:   TREE_TYPE (tmp_addr) = build_pointer_type (target_type);
        !          5557:   DECL_INITIAL (decl) = convert (TYPE_POINTER_TO (target_type), tmp_addr);
        !          5558:   TREE_TYPE (DECL_INITIAL (decl)) = type;
        !          5559:   if (TYPE_NEEDS_CONSTRUCTING (target_type))
        !          5560:     {
        !          5561:       if (current_binding_level == global_binding_level)
        !          5562:        {
        !          5563:          /* lay this variable out now.  Otherwise `output_addressed_constants'
        !          5564:             gets confused by its initializer.  */
        !          5565:          make_decl_rtl (tmp, NULL_PTR, 1);
        !          5566:          static_aggregates = perm_tree_cons (init, tmp, static_aggregates);
        !          5567:        }
        !          5568:       else
        !          5569:        {
        !          5570:          if (ctor_call != NULL_TREE)
        !          5571:            init = ctor_call;
        !          5572:          else
        !          5573:            init = build_method_call (tmp, constructor_name_full (target_type),
        !          5574:                                      build_tree_list (NULL_TREE, init),
        !          5575:                                      NULL_TREE, LOOKUP_NORMAL);
        !          5576:          DECL_INITIAL (decl) = build (COMPOUND_EXPR, type, init,
        !          5577:                                       DECL_INITIAL (decl));
        !          5578:          *cleanupp = maybe_build_cleanup (tmp);
        !          5579:        }
        !          5580:     }
        !          5581:   else
        !          5582:     {
        !          5583:       DECL_INITIAL (tmp) = init;
        !          5584:       TREE_STATIC (tmp) = current_binding_level == global_binding_level;
        !          5585:       finish_decl (tmp, init, 0, 0);
        !          5586:     }
        !          5587:   if (TREE_STATIC (tmp))
        !          5588:     preserve_initializer ();
        !          5589: }
        !          5590: 
        !          5591: /* Handle initialization of references.
        !          5592:    These three arguments from from `finish_decl', and have the
        !          5593:    same meaning here that they do there.  */
        !          5594: /* quotes on semantics can be found in ARM 8.4.3. */
        !          5595: static void
        !          5596: grok_reference_init (decl, type, init, cleanupp)
        !          5597:      tree decl, type, init;
        !          5598:      tree *cleanupp;
        !          5599: {
        !          5600:   char *errstr = NULL;
        !          5601:   int is_reference;
        !          5602:   tree tmp;
        !          5603:   tree this_ptr_type, actual_init;
        !          5604: 
        !          5605:   if (init == NULL_TREE)
        !          5606:     {
        !          5607:       if (DECL_LANG_SPECIFIC (decl) == 0
        !          5608:          || DECL_IN_AGGR_P (decl) == 0)
        !          5609:        {
        !          5610:          error ("variable declared as reference not initialized");
        !          5611:          if (TREE_CODE (decl) == VAR_DECL)
        !          5612:            SET_DECL_REFERENCE_SLOT (decl, error_mark_node);
        !          5613:        }
        !          5614:       return;
        !          5615:     }
        !          5616: 
        !          5617:   if (TREE_CODE (type) == REFERENCE_TYPE
        !          5618:       && TREE_CODE (init) == CONSTRUCTOR)
        !          5619:     {
        !          5620:       error ("ANSI C++ forbids use of initializer list for a reference initializer");
        !          5621:       return;
        !          5622:     }
        !          5623: 
        !          5624:   if (TREE_CODE (init) == TREE_LIST)
        !          5625:     init = build_compound_expr (init);
        !          5626:   is_reference = TREE_CODE (TREE_TYPE (init)) == REFERENCE_TYPE;
        !          5627:   tmp = is_reference ? convert_from_reference (init) : init;
        !          5628: 
        !          5629:   if (is_reference)
        !          5630:     {
        !          5631:       if (! comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (type)),
        !          5632:                       TYPE_MAIN_VARIANT (TREE_TYPE (tmp)), 0))
        !          5633:        errstr = "initialization of `%s' from dissimilar reference type";
        !          5634:       else if (TYPE_READONLY (TREE_TYPE (type))
        !          5635:               >= TYPE_READONLY (TREE_TYPE (TREE_TYPE (init))))
        !          5636:        {
        !          5637:          is_reference = 0;
        !          5638:          init = tmp;
        !          5639:        }
        !          5640:     }
        !          5641:   else
        !          5642:     {
        !          5643:       if (TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE
        !          5644:          && TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE)
        !          5645:        {
        !          5646:          /* Note: default conversion is only called in very
        !          5647:             special cases.  */
        !          5648:          init = default_conversion (init);
        !          5649:        }
        !          5650:       if (TREE_CODE (TREE_TYPE (type)) == TREE_CODE (TREE_TYPE (init)))
        !          5651:        {
        !          5652:          if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (type)),
        !          5653:                         TYPE_MAIN_VARIANT (TREE_TYPE (init)), 0))
        !          5654:            {
        !          5655:              /* This section implements ANSI C++ June 5 1992 WP 8.4.3.5. */
        !          5656: 
        !          5657:              /* A reference to a volatile T cannot be initialized with
        !          5658:                 a const T, and vice-versa.  */
        !          5659:              if (TYPE_VOLATILE (TREE_TYPE (type)) && TREE_READONLY (init))
        !          5660:                errstr = "cannot initialize a reference to a volatile T with a const T";
        !          5661:              else if (TYPE_READONLY (TREE_TYPE (type)) && TREE_THIS_VOLATILE (init))
        !          5662:                errstr = "cannot initialize a reference to a const T with a volatile T";
        !          5663:              /* A reference to a plain T can be initialized only with
        !          5664:                 a plain T.  */
        !          5665:              else if (!TYPE_VOLATILE (TREE_TYPE (type))
        !          5666:                       && !TYPE_READONLY (TREE_TYPE (type)))
        !          5667:                {
        !          5668:                  if (TREE_READONLY (init))
        !          5669:                    errstr = "cannot initialize a reference to T with a const T";
        !          5670:                  else if (TREE_THIS_VOLATILE (init))
        !          5671:                    errstr = "cannot initialize a reference to T with a volatile T";
        !          5672:                }
        !          5673:            }
        !          5674:          else
        !          5675:            init = convert (TREE_TYPE (type), init);
        !          5676:        }
        !          5677:       else if (init != error_mark_node
        !          5678:               && ! comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (type)),
        !          5679:                               TYPE_MAIN_VARIANT (TREE_TYPE (init)), 0))
        !          5680:        errstr = "invalid type conversion for reference";
        !          5681:     }
        !          5682: 
        !          5683:   if (errstr)
        !          5684:     {
        !          5685:       /* Things did not go smoothly; look for operator& type conversion.  */
        !          5686:       if (IS_AGGR_TYPE (TREE_TYPE (tmp)))
        !          5687:        {
        !          5688:          tmp = build_type_conversion (CONVERT_EXPR, type, init, 0);
        !          5689:          if (tmp != NULL_TREE)
        !          5690:            {
        !          5691:              init = tmp;
        !          5692:              if (tmp == error_mark_node)
        !          5693:                errstr = "ambiguous pointer conversion";
        !          5694:              else
        !          5695:                errstr = NULL;
        !          5696:              is_reference = 1;
        !          5697:            }
        !          5698:          else
        !          5699:            {
        !          5700:              tmp = build_type_conversion (CONVERT_EXPR, TREE_TYPE (type), init, 0);
        !          5701:              if (tmp != NULL_TREE)
        !          5702:                {
        !          5703:                  init = tmp;
        !          5704:                  if (tmp == error_mark_node)
        !          5705:                    errstr = "ambiguous pointer conversion";
        !          5706:                  else
        !          5707:                    errstr = NULL;
        !          5708:                  is_reference = 0;
        !          5709:                }
        !          5710:            }
        !          5711:        }
        !          5712:       /* Look for constructor.  */
        !          5713:       else if (IS_AGGR_TYPE (TREE_TYPE (type))
        !          5714:               && TYPE_HAS_CONSTRUCTOR (TREE_TYPE (type)))
        !          5715:        {
        !          5716:          tmp = get_temp_name (TREE_TYPE (type),
        !          5717:                               current_binding_level == global_binding_level);
        !          5718:          tmp = build_method_call (tmp, constructor_name_full (TREE_TYPE (type)),
        !          5719:                                   build_tree_list (NULL_TREE, init),
        !          5720:                                   NULL_TREE, LOOKUP_NORMAL);
        !          5721:          if (tmp == NULL_TREE || tmp == error_mark_node)
        !          5722:            {
        !          5723:              if (TREE_CODE (decl) == VAR_DECL)
        !          5724:                SET_DECL_REFERENCE_SLOT (decl, error_mark_node);
        !          5725:              cp_error_at ("constructor failed to build reference initializer", decl);
        !          5726:              return;
        !          5727:            }
        !          5728:          make_temporary_for_reference (decl, tmp, init, cleanupp);
        !          5729:          goto done;
        !          5730:        }
        !          5731:     }
        !          5732: 
        !          5733:   if (errstr)
        !          5734:     {
        !          5735:       error_with_decl (decl, errstr);
        !          5736:       if (TREE_CODE (decl) == VAR_DECL)
        !          5737:        SET_DECL_REFERENCE_SLOT (decl, error_mark_node);
        !          5738:       return;
        !          5739:     }
        !          5740: 
        !          5741:   /* In the case of initialization, it is permissible
        !          5742:      to assign one reference to another.  */
        !          5743:   this_ptr_type = build_pointer_type (TREE_TYPE (type));
        !          5744: 
        !          5745:   if (is_reference)
        !          5746:     {
        !          5747:       if (TREE_SIDE_EFFECTS (init))
        !          5748:        DECL_INITIAL (decl) = save_expr (init);
        !          5749:       else
        !          5750:        DECL_INITIAL (decl) = init;
        !          5751:     }
        !          5752:   else if (lvalue_p (init))
        !          5753:     {
        !          5754:       tmp = build_unary_op (ADDR_EXPR, init, 0);
        !          5755:       if (TREE_CODE (tmp) == ADDR_EXPR
        !          5756:          && TREE_CODE (TREE_OPERAND (tmp, 0)) == WITH_CLEANUP_EXPR)
        !          5757:        {
        !          5758:          /* Associate the cleanup with the reference so that we
        !          5759:             don't get burned by "aggressive" cleanup policy.  */
        !          5760:          *cleanupp = TREE_OPERAND (TREE_OPERAND (tmp, 0), 2);
        !          5761:          TREE_OPERAND (TREE_OPERAND (tmp, 0), 2) = error_mark_node;
        !          5762:        }
        !          5763:       if (IS_AGGR_TYPE (TREE_TYPE (this_ptr_type)))
        !          5764:        DECL_INITIAL (decl) = convert_pointer_to (TREE_TYPE (this_ptr_type), tmp);
        !          5765:       else
        !          5766:        DECL_INITIAL (decl) = convert (this_ptr_type, tmp);
        !          5767: 
        !          5768:       DECL_INITIAL (decl) = save_expr (DECL_INITIAL (decl));
        !          5769:       if (DECL_INITIAL (decl) == current_class_decl)
        !          5770:        DECL_INITIAL (decl) = copy_node (current_class_decl);
        !          5771:       TREE_TYPE (DECL_INITIAL (decl)) = type;
        !          5772:     }
        !          5773:   else if ((actual_init = unary_complex_lvalue (ADDR_EXPR, init)))
        !          5774:     {
        !          5775:       /* The initializer for this decl goes into its
        !          5776:         DECL_REFERENCE_SLOT.  Make sure that we can handle
        !          5777:         multiple evaluations without ill effect.  */
        !          5778:       if (TREE_CODE (actual_init) == ADDR_EXPR
        !          5779:          && TREE_CODE (TREE_OPERAND (actual_init, 0)) == TARGET_EXPR)
        !          5780:        actual_init = save_expr (actual_init);
        !          5781:       DECL_INITIAL (decl) = convert_pointer_to (TREE_TYPE (this_ptr_type), actual_init);
        !          5782:       DECL_INITIAL (decl) = save_expr (DECL_INITIAL (decl));
        !          5783:       TREE_TYPE (DECL_INITIAL (decl)) = type;
        !          5784:     }
        !          5785:   else if (TYPE_READONLY (TREE_TYPE (type)))
        !          5786:     /* Section 8.4.3 allows us to make a temporary for
        !          5787:        the initialization of const&.  */
        !          5788:     make_temporary_for_reference (decl, NULL_TREE, init, cleanupp);
        !          5789:   else
        !          5790:     {
        !          5791:       cp_error ("type mismatch in initialization of `%D' (use `const')", decl);
        !          5792:       DECL_INITIAL (decl) = error_mark_node;
        !          5793:     }
        !          5794: 
        !          5795:  done:
        !          5796:   /* ?? Can this be optimized in some cases to
        !          5797:      hand back the DECL_INITIAL slot??  */
        !          5798:   if (TYPE_SIZE (TREE_TYPE (type)))
        !          5799:     {
        !          5800:       init = convert_from_reference (decl);
        !          5801:       if (TREE_PERMANENT (decl))
        !          5802:        init = copy_to_permanent (init);
        !          5803:       SET_DECL_REFERENCE_SLOT (decl, init);
        !          5804:     }
        !          5805: 
        !          5806:   if (TREE_STATIC (decl) && ! TREE_CONSTANT (DECL_INITIAL (decl)))
        !          5807:     {
        !          5808:       expand_static_init (decl, DECL_INITIAL (decl));
        !          5809:       DECL_INITIAL (decl) = NULL_TREE;
        !          5810:     }
        !          5811: }
        !          5812: 
        !          5813: /* Finish processing of a declaration;
        !          5814:    install its line number and initial value.
        !          5815:    If the length of an array type is not known before,
        !          5816:    it must be determined now, from the initial value, or it is an error.
        !          5817: 
        !          5818:    Call `pop_obstacks' iff NEED_POP is nonzero.
        !          5819: 
        !          5820:    For C++, `finish_decl' must be fairly evasive:  it must keep initializers
        !          5821:    for aggregates that have constructors alive on the permanent obstack,
        !          5822:    so that the global initializing functions can be written at the end.
        !          5823: 
        !          5824:    INIT0 holds the value of an initializer that should be allowed to escape
        !          5825:    the normal rules.
        !          5826: 
        !          5827:    For functions that take default parameters, DECL points to its
        !          5828:    "maximal" instantiation.  `finish_decl' must then also declared its
        !          5829:    subsequently lower and lower forms of instantiation, checking for
        !          5830:    ambiguity as it goes.  This can be sped up later.  */
        !          5831: 
        !          5832: void
        !          5833: finish_decl (decl, init, asmspec_tree, need_pop)
        !          5834:      tree decl, init;
        !          5835:      tree asmspec_tree;
        !          5836:      int need_pop;
        !          5837: {
        !          5838:   register tree type;
        !          5839:   tree cleanup = NULL_TREE, ttype;
        !          5840:   int was_incomplete;
        !          5841:   int temporary = allocation_temporary_p ();
        !          5842:   char *asmspec = NULL;
        !          5843:   int was_readonly = 0;
        !          5844: 
        !          5845:   /* If this is 0, then we did not change obstacks.  */
        !          5846:   if (! decl)
        !          5847:     {
        !          5848:       if (init)
        !          5849:        error ("assignment (not initialization) in declaration");
        !          5850:       return;
        !          5851:     }
        !          5852: 
        !          5853:   if (asmspec_tree)
        !          5854:     {
        !          5855:       asmspec = TREE_STRING_POINTER (asmspec_tree);
        !          5856:       /* Zero out old RTL, since we will rewrite it.  */
        !          5857:       DECL_RTL (decl) = NULL_RTX;
        !          5858:     }
        !          5859: 
        !          5860:   /* If the type of the thing we are declaring either has
        !          5861:      a constructor, or has a virtual function table pointer,
        !          5862:      AND its initialization was accepted by `start_decl',
        !          5863:      then we stayed on the permanent obstack through the
        !          5864:      declaration, otherwise, changed obstacks as GCC would.  */
        !          5865: 
        !          5866:   type = TREE_TYPE (decl);
        !          5867: 
        !          5868:   was_incomplete = (DECL_SIZE (decl) == NULL_TREE);
        !          5869: 
        !          5870:   /* Take care of TYPE_DECLs up front.  */
        !          5871:   if (TREE_CODE (decl) == TYPE_DECL)
        !          5872:     {
        !          5873:       if (init && DECL_INITIAL (decl))
        !          5874:        {
        !          5875:          /* typedef foo = bar; store the type of bar as the type of foo.  */
        !          5876:          TREE_TYPE (decl) = type = TREE_TYPE (init);
        !          5877:          DECL_INITIAL (decl) = init = NULL_TREE;
        !          5878:        }
        !          5879:       if (IS_AGGR_TYPE (type) && DECL_NAME (decl))
        !          5880:        {
        !          5881:          if (TREE_TYPE (DECL_NAME (decl)) && TREE_TYPE (decl) != type)
        !          5882:            cp_warning ("shadowing previous type declaration of `%#D'", decl);
        !          5883:          set_identifier_type_value (DECL_NAME (decl), type);
        !          5884:          CLASSTYPE_GOT_SEMICOLON (type) = 1;
        !          5885:        }
        !          5886:       GNU_xref_decl (current_function_decl, decl);
        !          5887:       rest_of_decl_compilation (decl, NULL_PTR,
        !          5888:                                DECL_CONTEXT (decl) == NULL_TREE, 0);
        !          5889:       goto finish_end;
        !          5890:     }
        !          5891:   if (type != error_mark_node && IS_AGGR_TYPE (type)
        !          5892:       && CLASSTYPE_DECLARED_EXCEPTION (type))
        !          5893:     {
        !          5894:       finish_exception_decl (NULL_TREE, decl);
        !          5895:       CLASSTYPE_GOT_SEMICOLON (type) = 1;
        !          5896:       goto finish_end;
        !          5897:     }
        !          5898:   if (TREE_CODE (decl) != FUNCTION_DECL)
        !          5899:     {
        !          5900:       ttype = target_type (type);
        !          5901: #if 0 /* WTF?  -KR
        !          5902:         Leave this out until we can figure out why it was
        !          5903:         needed/desirable in the first place.  Then put a comment
        !          5904:         here explaining why.  Or just delete the code if no ill
        !          5905:         effects arise.  */
        !          5906:       if (TYPE_NAME (ttype)
        !          5907:          && TREE_CODE (TYPE_NAME (ttype)) == TYPE_DECL
        !          5908:          && ANON_AGGRNAME_P (TYPE_IDENTIFIER (ttype)))
        !          5909:        {
        !          5910:          tree old_id = TYPE_IDENTIFIER (ttype);
        !          5911:          char *newname = (char *)alloca (IDENTIFIER_LENGTH (old_id) + 2);
        !          5912:          /* Need to preserve template data for UPT nodes.  */
        !          5913:          tree old_template = IDENTIFIER_TEMPLATE (old_id);
        !          5914:          newname[0] = '_';
        !          5915:          bcopy (IDENTIFIER_POINTER (old_id), newname + 1,
        !          5916:                 IDENTIFIER_LENGTH (old_id) + 1);
        !          5917:          old_id = get_identifier (newname);
        !          5918:          lookup_tag_reverse (ttype, old_id);
        !          5919:          TYPE_IDENTIFIER (ttype) = old_id;
        !          5920:          IDENTIFIER_TEMPLATE (old_id) = old_template;
        !          5921:        }
        !          5922: #endif
        !          5923:     }
        !          5924: 
        !          5925:   if (! DECL_EXTERNAL (decl) && TREE_READONLY (decl)
        !          5926:       && TYPE_NEEDS_CONSTRUCTING (type))
        !          5927:     {
        !          5928: 
        !          5929:       /* Currently, GNU C++ puts constants in text space, making them
        !          5930:         impossible to initialize.  In the future, one would hope for
        !          5931:         an operating system which understood the difference between
        !          5932:         initialization and the running of a program.  */
        !          5933:       was_readonly = 1;
        !          5934:       TREE_READONLY (decl) = 0;
        !          5935:     }
        !          5936: 
        !          5937:   if (TREE_CODE (decl) == FIELD_DECL)
        !          5938:     {
        !          5939:       if (init && init != error_mark_node)
        !          5940:        my_friendly_assert (TREE_PERMANENT (init), 147);
        !          5941: 
        !          5942:       if (asmspec)
        !          5943:        {
        !          5944:          /* This must override the asm specifier which was placed
        !          5945:             by grokclassfn.  Lay this out fresh.
        !          5946:             
        !          5947:             @@ Should emit an error if this redefines an asm-specified
        !          5948:             @@ name, or if we have already used the function's name.  */
        !          5949:          DECL_RTL (TREE_TYPE (decl)) = NULL_RTX;
        !          5950:          DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
        !          5951:          make_decl_rtl (decl, asmspec, 0);
        !          5952:        }
        !          5953:     }
        !          5954:   /* If `start_decl' didn't like having an initialization, ignore it now.  */
        !          5955:   else if (init != NULL_TREE && DECL_INITIAL (decl) == NULL_TREE)
        !          5956:     init = NULL_TREE;
        !          5957:   else if (DECL_EXTERNAL (decl))
        !          5958:     ;
        !          5959:   else if (TREE_CODE (type) == REFERENCE_TYPE)
        !          5960:     {
        !          5961:       grok_reference_init (decl, type, init, &cleanup);
        !          5962:       init = NULL_TREE;
        !          5963:     }
        !          5964: 
        !          5965:   GNU_xref_decl (current_function_decl, decl);
        !          5966: 
        !          5967:   if (TREE_CODE (decl) == FIELD_DECL || DECL_EXTERNAL (decl))
        !          5968:     ;
        !          5969:   else if (TREE_CODE (decl) == CONST_DECL)
        !          5970:     {
        !          5971:       my_friendly_assert (TREE_CODE (decl) != REFERENCE_TYPE, 148);
        !          5972: 
        !          5973:       DECL_INITIAL (decl) = init;
        !          5974: 
        !          5975:       /* This will keep us from needing to worry about our obstacks.  */
        !          5976:       my_friendly_assert (init != NULL_TREE, 149);
        !          5977:       init = NULL_TREE;
        !          5978:     }
        !          5979:   else if (init)
        !          5980:     {
        !          5981:       if (TYPE_NEEDS_CONSTRUCTING (type))
        !          5982:        {
        !          5983:          if (TREE_CODE (type) == ARRAY_TYPE)
        !          5984:            init = digest_init (type, init, (tree *) 0);
        !          5985:          else if (TREE_CODE (init) == CONSTRUCTOR
        !          5986:                   && CONSTRUCTOR_ELTS (init) != NULL_TREE)
        !          5987:            {
        !          5988:              cp_error ("`%D' must be initialized by constructor, not by `{...}'", decl);
        !          5989:              init = error_mark_node;
        !          5990:            }
        !          5991: #if 0
        !          5992:          /* fix this in `build_functional_cast' instead.
        !          5993:             Here's the trigger code:
        !          5994: 
        !          5995:                struct ostream
        !          5996:                {
        !          5997:                  ostream ();
        !          5998:                  ostream (int, char *);
        !          5999:                  ostream (char *);
        !          6000:                  operator char *();
        !          6001:                  ostream (void *);
        !          6002:                  operator void *();
        !          6003:                  operator << (int);
        !          6004:                };
        !          6005:                int buf_size = 1024;
        !          6006:                static char buf[buf_size];
        !          6007:                const char *debug(int i) {
        !          6008:                  char *b = &buf[0];
        !          6009:                  ostream o = ostream(buf_size, b);
        !          6010:                  o << i;
        !          6011:                  return buf;
        !          6012:                }
        !          6013:                */
        !          6014: 
        !          6015:          else if (TREE_CODE (init) == TARGET_EXPR
        !          6016:                   && TREE_CODE (TREE_OPERAND (init, 1) == NEW_EXPR))
        !          6017:            {
        !          6018:              /* User wrote something like `foo x = foo (args)'  */
        !          6019:              my_friendly_assert (TREE_CODE (TREE_OPERAND (init, 0)) == VAR_DECL, 150);
        !          6020:              my_friendly_assert (DECL_NAME (TREE_OPERAND (init, 0)) == NULL_TREE, 151);
        !          6021: 
        !          6022:              /* User wrote exactly `foo x = foo (args)'  */
        !          6023:              if (TYPE_MAIN_VARIANT (type) == TREE_TYPE (init))
        !          6024:                {
        !          6025:                  init = build (CALL_EXPR, TREE_TYPE (init),
        !          6026:                                TREE_OPERAND (TREE_OPERAND (init, 1), 0),
        !          6027:                                TREE_OPERAND (TREE_OPERAND (init, 1), 1), 0);
        !          6028:                  TREE_SIDE_EFFECTS (init) = 1;
        !          6029:                }
        !          6030:            }
        !          6031: #endif
        !          6032: 
        !          6033:          /* We must hide the initializer so that expand_decl
        !          6034:             won't try to do something it does not understand.  */
        !          6035:          if (current_binding_level == global_binding_level)
        !          6036:            {
        !          6037:              tree value = digest_init (type, empty_init_node, (tree *) 0);
        !          6038:              DECL_INITIAL (decl) = value;
        !          6039:            }
        !          6040:          else
        !          6041:            DECL_INITIAL (decl) = error_mark_node;
        !          6042:        }
        !          6043:       else
        !          6044:        {
        !          6045:          if (TREE_CODE (init) != TREE_VEC)
        !          6046:            init = store_init_value (decl, init);
        !          6047: 
        !          6048:          if (init)
        !          6049:            /* Don't let anyone try to initialize this variable
        !          6050:               until we are ready to do so.  */
        !          6051:            DECL_INITIAL (decl) = error_mark_node;
        !          6052:        }
        !          6053:     }
        !          6054:   else if (TREE_CODE_CLASS (TREE_CODE (type)) == 't'
        !          6055:           && (IS_AGGR_TYPE (type) || TYPE_NEEDS_CONSTRUCTING (type))
        !          6056:           && init != NULL_TREE)
        !          6057:     {
        !          6058:       tree ctype = type;
        !          6059:       while (TREE_CODE (ctype) == ARRAY_TYPE)
        !          6060:        ctype = TREE_TYPE (ctype);
        !          6061:       if (! TYPE_NEEDS_CONSTRUCTOR (ctype))
        !          6062:        {
        !          6063:          if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (ctype))
        !          6064:            cp_error ("structure `%D' with uninitialized const members", decl);
        !          6065:          if (CLASSTYPE_REF_FIELDS_NEED_INIT (ctype))
        !          6066:            cp_error ("structure `%D' with uninitialized reference members", decl);
        !          6067:        }
        !          6068: 
        !          6069:       if (TREE_CODE (decl) == VAR_DECL
        !          6070:          && !TYPE_NEEDS_CONSTRUCTING (type)
        !          6071:          && (TYPE_READONLY (type) || TREE_READONLY (decl)))
        !          6072:        cp_error ("uninitialized const `%D'", decl);
        !          6073: 
        !          6074:       /* Initialize variables in need of static initialization
        !          6075:         with `empty_init_node' to keep assemble_variable from putting them
        !          6076:         in the wrong program space.  (Common storage is okay for non-public
        !          6077:         uninitialized data; the linker can't match it with storage from other
        !          6078:         files, and we may save some disk space.)  */
        !          6079:       if (flag_pic == 0
        !          6080:          && TREE_STATIC (decl)
        !          6081:          && TREE_PUBLIC (decl)
        !          6082:          && ! DECL_EXTERNAL (decl)
        !          6083:          && TREE_CODE (decl) == VAR_DECL
        !          6084:          && TYPE_NEEDS_CONSTRUCTING (type)
        !          6085:          && (DECL_INITIAL (decl) == NULL_TREE
        !          6086:              || DECL_INITIAL (decl) == error_mark_node))
        !          6087:        {
        !          6088:          tree value = digest_init (type, empty_init_node, (tree *) 0);
        !          6089:          DECL_INITIAL (decl) = value;
        !          6090:        }
        !          6091:     }
        !          6092:   else if (TREE_CODE (decl) == VAR_DECL
        !          6093:           && TREE_CODE (type) != REFERENCE_TYPE
        !          6094:           && (TYPE_READONLY (type) || TREE_READONLY (decl)))
        !          6095:     {
        !          6096:       /* ``Unless explicitly declared extern, a const object does not have
        !          6097:         external linkage and must be initialized. ($8.4; $12.1)'' ARM 7.1.6
        !          6098:         However, if it's `const int foo = 1; const int foo;', don't complain
        !          6099:         about the second decl, since it does have an initializer before.
        !          6100:         We deliberately don't complain about arrays, because they're
        !          6101:         supposed to be initialized by a constructor.  */
        !          6102:       if (! DECL_INITIAL (decl)
        !          6103:          && TREE_CODE (type) != ARRAY_TYPE
        !          6104:          && (!pedantic || !current_class_type))
        !          6105:        cp_error ("uninitialized const `%#D'", decl);
        !          6106:     }
        !          6107: 
        !          6108:   /* For top-level declaration, the initial value was read in
        !          6109:      the temporary obstack.  MAXINDEX, rtl, etc. to be made below
        !          6110:      must go in the permanent obstack; but don't discard the
        !          6111:      temporary data yet.  */
        !          6112: 
        !          6113:   if (current_binding_level == global_binding_level && temporary)
        !          6114:     end_temporary_allocation ();
        !          6115: 
        !          6116:   /* Deduce size of array from initialization, if not already known.  */
        !          6117: 
        !          6118:   if (TREE_CODE (type) == ARRAY_TYPE
        !          6119:       && TYPE_DOMAIN (type) == NULL_TREE
        !          6120:       && TREE_CODE (decl) != TYPE_DECL)
        !          6121:     {
        !          6122:       int do_default
        !          6123:        = (TREE_STATIC (decl)
        !          6124:           /* Even if pedantic, an external linkage array
        !          6125:              may have incomplete type at first.  */
        !          6126:           ? pedantic && DECL_EXTERNAL (decl)
        !          6127:           : !DECL_EXTERNAL (decl));
        !          6128:       tree initializer = init ? init : DECL_INITIAL (decl);
        !          6129:       int failure = complete_array_type (type, initializer, do_default);
        !          6130: 
        !          6131:       if (failure == 1)
        !          6132:        cp_error ("initializer fails to determine size of `%D'", decl);
        !          6133: 
        !          6134:       if (failure == 2)
        !          6135:        {
        !          6136:          if (do_default)
        !          6137:            cp_error ("array size missing in `%D'", decl);
        !          6138:          /* If a `static' var's size isn't known, make it extern as
        !          6139:             well as static, so it does not get allocated.  If it's not
        !          6140:             `static', then don't mark it extern; finish_incomplete_decl
        !          6141:             will give it a default size and it will get allocated.  */
        !          6142:          else if (!pedantic && TREE_STATIC (decl) && !TREE_PUBLIC (decl))
        !          6143:            DECL_EXTERNAL (decl) = 1;
        !          6144:        }
        !          6145: 
        !          6146:       if (pedantic && TYPE_DOMAIN (type) != NULL_TREE
        !          6147:          && tree_int_cst_lt (TYPE_MAX_VALUE (TYPE_DOMAIN (type)),
        !          6148:                              integer_zero_node))
        !          6149:        cp_error ("zero-size array `%D'", decl);
        !          6150: 
        !          6151:       layout_decl (decl, 0);
        !          6152:     }
        !          6153: 
        !          6154:   if (TREE_CODE (decl) == VAR_DECL)
        !          6155:     {
        !          6156:       if (DECL_SIZE (decl) == NULL_TREE
        !          6157:          && TYPE_SIZE (TREE_TYPE (decl)) != NULL_TREE)
        !          6158:        layout_decl (decl, 0);
        !          6159: 
        !          6160:       if (TREE_STATIC (decl) && DECL_SIZE (decl) == NULL_TREE)
        !          6161:        {
        !          6162:          /* A static variable with an incomplete type:
        !          6163:             that is an error if it is initialized or `static'.
        !          6164:             Otherwise, let it through, but if it is not `extern'
        !          6165:             then it may cause an error message later.  */
        !          6166:          if (!DECL_EXTERNAL (decl) || DECL_INITIAL (decl) != NULL_TREE)
        !          6167:            cp_error ("storage size of `%D' isn't known", decl);
        !          6168:          init = NULL_TREE;
        !          6169:        }
        !          6170:       else if (!DECL_EXTERNAL (decl) && DECL_SIZE (decl) == NULL_TREE)
        !          6171:        {
        !          6172:          /* An automatic variable with an incomplete type: that is an error.
        !          6173:             Don't talk about array types here, since we took care of that
        !          6174:             message in grokdeclarator.  */
        !          6175:          cp_error ("storage size of `%D' isn't known", decl);
        !          6176:          TREE_TYPE (decl) = error_mark_node;
        !          6177:        }
        !          6178:       else if (!DECL_EXTERNAL (decl) && IS_AGGR_TYPE (ttype))
        !          6179:        /* Let debugger know it should output info for this type.  */
        !          6180:        note_debug_info_needed (ttype);
        !          6181: 
        !          6182:       if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl))
        !          6183:          && DECL_SIZE (decl) != NULL_TREE
        !          6184:          && ! TREE_CONSTANT (DECL_SIZE (decl)))
        !          6185:        {
        !          6186:          if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST)
        !          6187:            constant_expression_warning (DECL_SIZE (decl));
        !          6188:          else
        !          6189:            cp_error ("storage size of `%D' isn't constant", decl);
        !          6190:        }
        !          6191: 
        !          6192:       if (!DECL_EXTERNAL (decl) && TYPE_NEEDS_DESTRUCTOR (type))
        !          6193:        {
        !          6194:          int yes = suspend_momentary ();
        !          6195: 
        !          6196:          /* If INIT comes from a functional cast, use the cleanup
        !          6197:             we built for that.  Otherwise, make our own cleanup.  */
        !          6198:          if (init && TREE_CODE (init) == WITH_CLEANUP_EXPR
        !          6199:              && comptypes (TREE_TYPE (decl), TREE_TYPE (init), 1))
        !          6200:            {
        !          6201:              cleanup = TREE_OPERAND (init, 2);
        !          6202:              init = TREE_OPERAND (init, 0);
        !          6203:              current_binding_level->have_cleanups = 1;
        !          6204:              current_binding_level->more_exceptions_ok = 0;
        !          6205:            }
        !          6206:          else
        !          6207:            cleanup = maybe_build_cleanup (decl);
        !          6208:          resume_momentary (yes);
        !          6209:        }
        !          6210:     }
        !          6211:   /* PARM_DECLs get cleanups, too.  */
        !          6212:   else if (TREE_CODE (decl) == PARM_DECL && TYPE_NEEDS_DESTRUCTOR (type))
        !          6213:     {
        !          6214:       if (temporary)
        !          6215:        end_temporary_allocation ();
        !          6216:       cleanup = maybe_build_cleanup (decl);
        !          6217:       if (temporary)
        !          6218:        resume_temporary_allocation ();
        !          6219:     }
        !          6220: 
        !          6221:   /* Output the assembler code and/or RTL code for variables and functions,
        !          6222:      unless the type is an undefined structure or union.
        !          6223:      If not, it will get done when the type is completed.  */
        !          6224: 
        !          6225:   if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL
        !          6226:       || TREE_CODE (decl) == RESULT_DECL)
        !          6227:     {
        !          6228:       /* ??? FIXME: What about nested classes?  */
        !          6229:       int toplev = (current_binding_level == global_binding_level
        !          6230:                    || pseudo_global_level_p ());
        !          6231:       int was_temp
        !          6232:        = ((flag_traditional
        !          6233:            || (TREE_STATIC (decl) && TYPE_NEEDS_DESTRUCTOR (type)))
        !          6234:           && allocation_temporary_p ());
        !          6235: 
        !          6236:       if (was_temp)
        !          6237:        end_temporary_allocation ();
        !          6238: 
        !          6239:       /* If we are in need of a cleanup, get out of any implicit
        !          6240:         handlers that have been established so far.  */
        !          6241:       if (cleanup && current_binding_level->parm_flag == 3)
        !          6242:        {
        !          6243:          pop_implicit_try_blocks (decl);
        !          6244:          current_binding_level->more_exceptions_ok = 0;
        !          6245:        }
        !          6246: 
        !          6247:       if (TREE_CODE (decl) == VAR_DECL
        !          6248:          && current_binding_level != global_binding_level
        !          6249:          && ! TREE_STATIC (decl)
        !          6250:          && type_needs_gc_entry (type))
        !          6251:        DECL_GC_OFFSET (decl) = size_int (++current_function_obstack_index);
        !          6252: 
        !          6253:       if (TREE_CODE (decl) == VAR_DECL && DECL_VIRTUAL_P (decl))
        !          6254:        make_decl_rtl (decl, NULL_PTR, toplev);
        !          6255:       else if (TREE_CODE (decl) == VAR_DECL
        !          6256:               && TREE_READONLY (decl)
        !          6257:               && DECL_INITIAL (decl) != NULL_TREE
        !          6258:               && DECL_INITIAL (decl) != error_mark_node
        !          6259:               && DECL_INITIAL (decl) != empty_init_node)
        !          6260:        {
        !          6261:          DECL_INITIAL (decl) = save_expr (DECL_INITIAL (decl));
        !          6262: 
        !          6263:          if (asmspec)
        !          6264:            DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
        !          6265: 
        !          6266:          if (! toplev
        !          6267:              && TREE_STATIC (decl)
        !          6268:              && ! TREE_SIDE_EFFECTS (decl)
        !          6269:              && ! TREE_PUBLIC (decl)
        !          6270:              && ! DECL_EXTERNAL (decl)
        !          6271:              && ! TYPE_NEEDS_DESTRUCTOR (type)
        !          6272:              && DECL_MODE (decl) != BLKmode)
        !          6273:            {
        !          6274:              /* If this variable is really a constant, then fill its DECL_RTL
        !          6275:                 slot with something which won't take up storage.
        !          6276:                 If something later should take its address, we can always give
        !          6277:                 it legitimate RTL at that time.  */
        !          6278:              DECL_RTL (decl) = gen_reg_rtx (DECL_MODE (decl));
        !          6279:              store_expr (DECL_INITIAL (decl), DECL_RTL (decl), 0);
        !          6280:              TREE_ASM_WRITTEN (decl) = 1;
        !          6281:            }
        !          6282:          else if (toplev)
        !          6283:            {
        !          6284:              /* Keep GCC from complaining that this variable
        !          6285:                 is defined but never used.  */
        !          6286:              TREE_USED (decl) = 1;
        !          6287:              /* If this is a static const, change its apparent linkage
        !          6288:                 if it belongs to a #pragma interface.  */
        !          6289:              if (TREE_STATIC (decl) && !interface_unknown)
        !          6290:                {
        !          6291:                  TREE_PUBLIC (decl) = 1;
        !          6292:                  DECL_EXTERNAL (decl) = interface_only;
        !          6293:                }
        !          6294:              make_decl_rtl (decl, asmspec, toplev);
        !          6295:            }
        !          6296:          else
        !          6297:            rest_of_decl_compilation (decl, asmspec, toplev, 0);
        !          6298:        }
        !          6299:       else if (TREE_CODE (decl) == VAR_DECL
        !          6300:               && DECL_LANG_SPECIFIC (decl)
        !          6301:               && DECL_IN_AGGR_P (decl))
        !          6302:        {
        !          6303:          if (TREE_STATIC (decl))
        !          6304:            {
        !          6305:              if (init == NULL_TREE
        !          6306: #ifdef DEFAULT_STATIC_DEFS
        !          6307:                  /* If this code is dead, then users must
        !          6308:                     explicitly declare static member variables
        !          6309:                     outside the class def'n as well.  */
        !          6310:                  && TYPE_NEEDS_CONSTRUCTING (type)
        !          6311: #endif
        !          6312:                  )
        !          6313:                {
        !          6314:                  DECL_EXTERNAL (decl) = 1;
        !          6315:                  make_decl_rtl (decl, asmspec, 1);
        !          6316:                }
        !          6317:              else
        !          6318:                rest_of_decl_compilation (decl, asmspec, toplev, 0);
        !          6319:            }
        !          6320:          else
        !          6321:            /* Just a constant field.  Should not need any rtl.  */
        !          6322:            goto finish_end0;
        !          6323:        }
        !          6324:       else
        !          6325:        rest_of_decl_compilation (decl, asmspec, toplev, 0);
        !          6326: 
        !          6327:       if (was_temp)
        !          6328:        resume_temporary_allocation ();
        !          6329: 
        !          6330:       if (type != error_mark_node
        !          6331:          && TYPE_LANG_SPECIFIC (type)
        !          6332:          && CLASSTYPE_ABSTRACT_VIRTUALS (type))
        !          6333:        abstract_virtuals_error (decl, type);
        !          6334:       else if ((TREE_CODE (type) == FUNCTION_TYPE
        !          6335:                || TREE_CODE (type) == METHOD_TYPE)
        !          6336:               && TYPE_LANG_SPECIFIC (TREE_TYPE (type))
        !          6337:               && CLASSTYPE_ABSTRACT_VIRTUALS (TREE_TYPE (type)))
        !          6338:        abstract_virtuals_error (decl, TREE_TYPE (type));
        !          6339: 
        !          6340:       if (TREE_CODE (decl) == FUNCTION_DECL)
        !          6341:        {
        !          6342:          /* C++: Handle overloaded functions with default parameters.  */
        !          6343:          if (DECL_OVERLOADED (decl))
        !          6344:            {
        !          6345:              tree parmtypes = TYPE_ARG_TYPES (type);
        !          6346:              tree prev = NULL_TREE;
        !          6347:              tree original_name = DECL_NAME (decl);
        !          6348:              struct lang_decl *tmp_lang_decl = DECL_LANG_SPECIFIC (decl);
        !          6349:              /* All variants will share an uncollectible lang_decl.  */
        !          6350:              copy_decl_lang_specific (decl);
        !          6351: 
        !          6352:              while (parmtypes && parmtypes != void_list_node)
        !          6353:                {
        !          6354:                  /* The default value for the parameter in parmtypes is
        !          6355:                     stored in the TREE_PURPOSE of the TREE_LIST.  */ 
        !          6356:                  if (TREE_PURPOSE (parmtypes))
        !          6357:                    {
        !          6358:                      tree fnname, fndecl;
        !          6359:                      tree *argp;
        !          6360: 
        !          6361:                      argp = prev ? & TREE_CHAIN (prev)
        !          6362:                        : & TYPE_ARG_TYPES (type);
        !          6363: 
        !          6364:                      *argp = NULL_TREE;
        !          6365:                      fnname = build_decl_overload (original_name, TYPE_ARG_TYPES (type), 0);
        !          6366:                      *argp = parmtypes;
        !          6367:                      fndecl = build_decl (FUNCTION_DECL, fnname, type);
        !          6368:                      DECL_EXTERNAL (fndecl) = DECL_EXTERNAL (decl);
        !          6369:                      TREE_PUBLIC (fndecl) = TREE_PUBLIC (decl);
        !          6370:                      DECL_INLINE (fndecl) = DECL_INLINE (decl);
        !          6371:                      /* Keep G++ from thinking this function is unused.
        !          6372:                         It is only used to speed up search in name space.  */
        !          6373:                      TREE_USED (fndecl) = 1;
        !          6374:                      TREE_ASM_WRITTEN (fndecl) = 1;
        !          6375:                      DECL_INITIAL (fndecl) = NULL_TREE;
        !          6376:                      DECL_LANG_SPECIFIC (fndecl) = DECL_LANG_SPECIFIC (decl);
        !          6377:                      fndecl = pushdecl (fndecl);
        !          6378:                      DECL_INITIAL (fndecl) = error_mark_node;
        !          6379:                      DECL_RTL (fndecl) = DECL_RTL (decl);
        !          6380:                    }
        !          6381:                  prev = parmtypes;
        !          6382:                  parmtypes = TREE_CHAIN (parmtypes);
        !          6383:                }
        !          6384:              DECL_LANG_SPECIFIC (decl) = tmp_lang_decl;
        !          6385:            }
        !          6386:        }
        !          6387:       else if (DECL_EXTERNAL (decl))
        !          6388:        ;
        !          6389:       else if (TREE_STATIC (decl) && type != error_mark_node)
        !          6390:        {
        !          6391:          /* Cleanups for static variables are handled by `finish_file'.  */
        !          6392:          if (TYPE_NEEDS_CONSTRUCTING (type) || init != NULL_TREE)
        !          6393:            expand_static_init (decl, init);
        !          6394:          else if (TYPE_NEEDS_DESTRUCTOR (type))
        !          6395:            static_aggregates = perm_tree_cons (NULL_TREE, decl,
        !          6396:                                                static_aggregates);
        !          6397: 
        !          6398:          /* Make entry in appropriate vector.  */
        !          6399:          if (flag_gc && type_needs_gc_entry (type))
        !          6400:            build_static_gc_entry (decl, type);
        !          6401:        }
        !          6402:       else if (! toplev)
        !          6403:        {
        !          6404:          /* This is a declared decl which must live until the
        !          6405:             end of the binding contour.  It may need a cleanup.  */
        !          6406: 
        !          6407:          /* Recompute the RTL of a local array now
        !          6408:             if it used to be an incomplete type.  */
        !          6409:          if (was_incomplete && ! TREE_STATIC (decl))
        !          6410:            {
        !          6411:              /* If we used it already as memory, it must stay in memory.  */
        !          6412:              TREE_ADDRESSABLE (decl) = TREE_USED (decl);
        !          6413:              /* If it's still incomplete now, no init will save it.  */
        !          6414:              if (DECL_SIZE (decl) == NULL_TREE)
        !          6415:                DECL_INITIAL (decl) = NULL_TREE;
        !          6416:              expand_decl (decl);
        !          6417:            }
        !          6418:          else if (! TREE_ASM_WRITTEN (decl)
        !          6419:                   && (TYPE_SIZE (type) != NULL_TREE
        !          6420:                       || TREE_CODE (type) == ARRAY_TYPE))
        !          6421:            {
        !          6422:              /* Do this here, because we did not expand this decl's
        !          6423:                 rtl in start_decl.  */
        !          6424:              if (DECL_RTL (decl) == NULL_RTX)
        !          6425:                expand_decl (decl);
        !          6426:              else if (cleanup)
        !          6427:                {
        !          6428:                  expand_decl_cleanup (NULL_TREE, cleanup);
        !          6429:                  /* Cleanup used up here.  */
        !          6430:                  cleanup = NULL_TREE;
        !          6431:                }
        !          6432:            }
        !          6433: 
        !          6434:          if (DECL_SIZE (decl) && type != error_mark_node)
        !          6435:            {
        !          6436:              /* Compute and store the initial value.  */
        !          6437:              expand_decl_init (decl);
        !          6438: 
        !          6439:              if (init || TYPE_NEEDS_CONSTRUCTING (type))
        !          6440:                {
        !          6441:                  emit_line_note (DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
        !          6442:                  expand_aggr_init (decl, init, 0);
        !          6443:                }
        !          6444: 
        !          6445:              /* Set this to 0 so we can tell whether an aggregate
        !          6446:                 which was initialized was ever used.  */
        !          6447:              if (TYPE_NEEDS_CONSTRUCTING (type))
        !          6448:                TREE_USED (decl) = 0;
        !          6449: 
        !          6450:              /* Store the cleanup, if there was one.  */
        !          6451:              if (cleanup)
        !          6452:                {
        !          6453:                  if (! expand_decl_cleanup (decl, cleanup))
        !          6454:                    cp_error ("parser lost in parsing declaration of `%D'", decl);
        !          6455:                }
        !          6456:            }
        !          6457:        }
        !          6458:     finish_end0:
        !          6459: 
        !          6460:       /* Undo call to `pushclass' that was done in `start_decl'
        !          6461:         due to initialization of qualified member variable.
        !          6462:         I.e., Foo::x = 10;  */
        !          6463:       {
        !          6464:        tree context = DECL_CONTEXT (decl);
        !          6465:        if (context
        !          6466:            && TREE_CODE_CLASS (TREE_CODE (context)) == 't'
        !          6467:            && (TREE_CODE (decl) == VAR_DECL
        !          6468:                /* We also have a pushclass done that we need to undo here
        !          6469:                   if we're at top level and declare a method.  */
        !          6470:                || (TREE_CODE (decl) == FUNCTION_DECL
        !          6471:                    /* If size hasn't been set, we're still defining it,
        !          6472:                       and therefore inside the class body; don't pop
        !          6473:                       the binding level..  */
        !          6474:                    && TYPE_SIZE (context) != NULL_TREE
        !          6475:                    /* The binding level gets popped elsewhere for a
        !          6476:                       friend declaration inside another class.  */
        !          6477:                    && TYPE_IDENTIFIER (context) == current_class_name
        !          6478:                    )))
        !          6479:          popclass (1);
        !          6480:       }
        !          6481:     }
        !          6482: 
        !          6483:  finish_end:
        !          6484: 
        !          6485:   if (need_pop)
        !          6486:     {
        !          6487:       /* Resume permanent allocation, if not within a function.  */
        !          6488:       /* The corresponding push_obstacks_nochange is in start_decl,
        !          6489:         start_method, groktypename, and in grokfield.  */
        !          6490:       pop_obstacks ();
        !          6491:     }
        !          6492: 
        !          6493:   if (was_readonly)
        !          6494:     TREE_READONLY (decl) = 1;
        !          6495: 
        !          6496:   if (flag_cadillac)
        !          6497:     cadillac_finish_decl (decl);
        !          6498: }
        !          6499: 
        !          6500: static void
        !          6501: expand_static_init (decl, init)
        !          6502:      tree decl;
        !          6503:      tree init;
        !          6504: {
        !          6505:   tree oldstatic = value_member (decl, static_aggregates);
        !          6506:   if (oldstatic)
        !          6507:     {
        !          6508:       if (TREE_PURPOSE (oldstatic) && init != NULL_TREE)
        !          6509:        cp_error ("multiple initializations given for `%D'", decl);
        !          6510:     }
        !          6511:   else if (current_binding_level != global_binding_level)
        !          6512:     {
        !          6513:       /* Emit code to perform this initialization but once.  */
        !          6514:       tree temp;
        !          6515: 
        !          6516:       /* Remember this information until end of file. */
        !          6517:       push_obstacks (&permanent_obstack, &permanent_obstack);
        !          6518: 
        !          6519:       /* Emit code to perform this initialization but once.  */
        !          6520:       temp = get_temp_name (integer_type_node, 1);
        !          6521:       rest_of_decl_compilation (temp, NULL_PTR, 0, 0);
        !          6522:       expand_start_cond (build_binary_op (EQ_EXPR, temp,
        !          6523:                                          integer_zero_node, 1), 0);
        !          6524:       expand_assignment (temp, integer_one_node, 0, 0);
        !          6525:       if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
        !          6526:        {
        !          6527:          expand_aggr_init (decl, init, 0);
        !          6528:          do_pending_stack_adjust ();
        !          6529:        }
        !          6530:       else
        !          6531:        expand_assignment (decl, init, 0, 0);
        !          6532:       expand_end_cond ();
        !          6533:       if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (decl)))
        !          6534:        {
        !          6535:          static_aggregates = perm_tree_cons (temp, decl, static_aggregates);
        !          6536:          TREE_STATIC (static_aggregates) = 1;
        !          6537:        }
        !          6538: 
        !          6539:       /* Resume old (possibly temporary) allocation. */
        !          6540:       pop_obstacks ();
        !          6541:     }
        !          6542:   else
        !          6543:     {
        !          6544:       /* This code takes into account memory allocation
        !          6545:         policy of `start_decl'.  Namely, if TYPE_NEEDS_CONSTRUCTING
        !          6546:         does not hold for this object, then we must make permanent
        !          6547:         the storage currently in the temporary obstack.  */
        !          6548:       if (! TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
        !          6549:        preserve_initializer ();
        !          6550:       static_aggregates = perm_tree_cons (init, decl, static_aggregates);
        !          6551:     }
        !          6552: }
        !          6553: 
        !          6554: /* Make TYPE a complete type based on INITIAL_VALUE.
        !          6555:    Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered,
        !          6556:    2 if there was no information (in which case assume 1 if DO_DEFAULT).  */
        !          6557: 
        !          6558: int
        !          6559: complete_array_type (type, initial_value, do_default)
        !          6560:      tree type, initial_value;
        !          6561:      int do_default;
        !          6562: {
        !          6563:   register tree maxindex = NULL_TREE;
        !          6564:   int value = 0;
        !          6565: 
        !          6566:   if (initial_value)
        !          6567:     {
        !          6568:       /* Note MAXINDEX  is really the maximum index,
        !          6569:         one less than the size.  */
        !          6570:       if (TREE_CODE (initial_value) == STRING_CST)
        !          6571:        maxindex = build_int_2 (TREE_STRING_LENGTH (initial_value) - 1, 0);
        !          6572:       else if (TREE_CODE (initial_value) == CONSTRUCTOR)
        !          6573:        {
        !          6574:          register int nelts
        !          6575:            = list_length (CONSTRUCTOR_ELTS (initial_value));
        !          6576:          maxindex = build_int_2 (nelts - 1, - (nelts == 0));
        !          6577:        }
        !          6578:       else
        !          6579:        {
        !          6580:          /* Make an error message unless that happened already.  */
        !          6581:          if (initial_value != error_mark_node)
        !          6582:            value = 1;
        !          6583: 
        !          6584:          /* Prevent further error messages.  */
        !          6585:          maxindex = build_int_2 (0, 0);
        !          6586:        }
        !          6587:     }
        !          6588: 
        !          6589:   if (!maxindex)
        !          6590:     {
        !          6591:       if (do_default)
        !          6592:        maxindex = build_int_2 (0, 0);
        !          6593:       value = 2;
        !          6594:     }
        !          6595: 
        !          6596:   if (maxindex)
        !          6597:     {
        !          6598:       TYPE_DOMAIN (type) = build_index_type (maxindex);
        !          6599:       if (!TREE_TYPE (maxindex))
        !          6600:        TREE_TYPE (maxindex) = TYPE_DOMAIN (type);
        !          6601:     }
        !          6602: 
        !          6603:   /* Lay out the type now that we can get the real answer.  */
        !          6604: 
        !          6605:   layout_type (type);
        !          6606: 
        !          6607:   return value;
        !          6608: }
        !          6609: 
        !          6610: /* Return zero if something is declared to be a member of type
        !          6611:    CTYPE when in the context of CUR_TYPE.  STRING is the error
        !          6612:    message to print in that case.  Otherwise, quietly return 1.  */
        !          6613: static int
        !          6614: member_function_or_else (ctype, cur_type, string)
        !          6615:      tree ctype, cur_type;
        !          6616:      char *string;
        !          6617: {
        !          6618:   if (ctype && ctype != cur_type)
        !          6619:     {
        !          6620:       error (string, TYPE_NAME_STRING (ctype));
        !          6621:       return 0;
        !          6622:     }
        !          6623:   return 1;
        !          6624: }
        !          6625: 
        !          6626: /* Subroutine of `grokdeclarator'.  */
        !          6627: 
        !          6628: /* Generate errors possibly applicable for a given set of specifiers.
        !          6629:    This is for ARM $7.1.2.  */
        !          6630: static void
        !          6631: bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises)
        !          6632:      tree object;
        !          6633:      char *type;
        !          6634:      int virtualp, quals, inlinep, friendp, raises;
        !          6635: {
        !          6636:   if (virtualp)
        !          6637:     cp_error ("`%D' declared as a `virtual' %s", object, type);
        !          6638:   if (inlinep)
        !          6639:     cp_error ("`%D' declared as an `inline' %s", object, type);
        !          6640:   if (quals)
        !          6641:     cp_error ("`const' and `volatile' function specifiers on `%D' invalid in %s declaration", object, type);
        !          6642:   if (friendp)
        !          6643:     cp_error_at ("invalid friend declaration", object);
        !          6644:   if (raises)
        !          6645:     cp_error_at ("invalid raises declaration", object);
        !          6646: }
        !          6647: 
        !          6648: /* CTYPE is class type, or null if non-class.
        !          6649:    TYPE is type this FUNCTION_DECL should have, either FUNCTION_TYPE
        !          6650:    or METHOD_TYPE.
        !          6651:    DECLARATOR is the function's name.
        !          6652:    VIRTUALP is truthvalue of whether the function is virtual or not.
        !          6653:    FLAGS are to be passed through to `grokclassfn'.
        !          6654:    QUALS are qualifiers indicating whether the function is `const'
        !          6655:    or `volatile'.
        !          6656:    RAISES is a list of exceptions that this function can raise.
        !          6657:    CHECK is 1 if we must find this method in CTYPE, 0 if we should
        !          6658:    not look, and -1 if we should not call `grokclassfn' at all.  */
        !          6659: static tree
        !          6660: grokfndecl (ctype, type, declarator, virtualp, flags, quals, raises, check, publicp)
        !          6661:      tree ctype, type;
        !          6662:      tree declarator;
        !          6663:      int virtualp;
        !          6664:      enum overload_flags flags;
        !          6665:      tree quals, raises;
        !          6666:      int check, publicp;
        !          6667: {
        !          6668:   tree cname, decl;
        !          6669:   int staticp = ctype && TREE_CODE (type) == FUNCTION_TYPE;
        !          6670: 
        !          6671:   if (ctype)
        !          6672:     cname = TREE_CODE (TYPE_NAME (ctype)) == TYPE_DECL
        !          6673:       ? TYPE_IDENTIFIER (ctype) : TYPE_NAME (ctype);
        !          6674:   else
        !          6675:     cname = NULL_TREE;
        !          6676: 
        !          6677:   if (raises)
        !          6678:     {
        !          6679:       type = build_exception_variant (ctype, type, raises);
        !          6680:       raises = TYPE_RAISES_EXCEPTIONS (type);
        !          6681:     }
        !          6682:   decl = build_lang_decl (FUNCTION_DECL, declarator, type);
        !          6683:   /* propagate volatile out from type to decl */
        !          6684:   if (TYPE_VOLATILE (type))
        !          6685:       TREE_THIS_VOLATILE (decl) = 1;
        !          6686: 
        !          6687:   /* Should probably propagate const out from type to decl I bet (mrs).  */
        !          6688:   if (staticp)
        !          6689:     {
        !          6690:       DECL_STATIC_FUNCTION_P (decl) = 1;
        !          6691:       DECL_CONTEXT (decl) = ctype;
        !          6692:       DECL_CLASS_CONTEXT (decl) = ctype;
        !          6693:     }
        !          6694: 
        !          6695:   if (publicp)
        !          6696:     TREE_PUBLIC (decl) = 1;
        !          6697: 
        !          6698:   DECL_EXTERNAL (decl) = 1;
        !          6699:   if (quals != NULL_TREE && TREE_CODE (type) == FUNCTION_TYPE)
        !          6700:     {
        !          6701:       cp_error ("%smember function `%D' cannot have `%T' method qualifier",
        !          6702:                (ctype ? "static " : "non-"), decl, TREE_VALUE (quals));
        !          6703:       quals = NULL_TREE;
        !          6704:     }
        !          6705: 
        !          6706:   if (IDENTIFIER_OPNAME_P (DECL_NAME (decl)))
        !          6707:     grok_op_properties (decl, virtualp);
        !          6708: 
        !          6709:   /* Caller will do the rest of this.  */
        !          6710:   if (check < 0)
        !          6711:     return decl;
        !          6712: 
        !          6713:   if (flags == NO_SPECIAL && ctype && constructor_name (cname) == declarator)
        !          6714:     {
        !          6715:       tree tmp;
        !          6716:       /* Just handle constructors here.  We could do this
        !          6717:         inside the following if stmt, but I think
        !          6718:         that the code is more legible by breaking this
        !          6719:         case out.  See comments below for what each of
        !          6720:         the following calls is supposed to do.  */
        !          6721:       DECL_CONSTRUCTOR_P (decl) = 1;
        !          6722: 
        !          6723:       grokclassfn (ctype, declarator, decl, flags, quals);
        !          6724:       if (check)
        !          6725:        check_classfn (ctype, declarator, decl);
        !          6726:       grok_ctor_properties (ctype, decl);
        !          6727:       if (check == 0)
        !          6728:        {
        !          6729:          /* FIXME: this should only need to look at IDENTIFIER_GLOBAL_VALUE.  */
        !          6730:          tmp = lookup_name (DECL_ASSEMBLER_NAME (decl), 0);
        !          6731:          if (tmp == NULL_TREE)
        !          6732:            IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (decl)) = decl;
        !          6733:          else if (TREE_CODE (tmp) != TREE_CODE (decl))
        !          6734:            cp_error ("inconsistent declarations for `%D'", decl);
        !          6735:          else
        !          6736:            {
        !          6737:              duplicate_decls (decl, tmp);
        !          6738:              decl = tmp;
        !          6739:              /* avoid creating circularities.  */
        !          6740:              DECL_CHAIN (decl) = NULL_TREE;
        !          6741:            }
        !          6742:          make_decl_rtl (decl, NULL_PTR, 1);
        !          6743:        }
        !          6744:     }
        !          6745:   else
        !          6746:     {
        !          6747:       tree tmp;
        !          6748: 
        !          6749:       /* Function gets the ugly name, field gets the nice one.
        !          6750:         This call may change the type of the function (because
        !          6751:         of default parameters)!  */
        !          6752:       if (ctype != NULL_TREE)
        !          6753:        grokclassfn (ctype, cname, decl, flags, quals);
        !          6754: 
        !          6755:       if (ctype != NULL_TREE && check)
        !          6756:        check_classfn (ctype, cname, decl);
        !          6757: 
        !          6758:       if (ctype == NULL_TREE || check)
        !          6759:        return decl;
        !          6760: 
        !          6761:       /* Now install the declaration of this function so that
        !          6762:         others may find it (esp. its DECL_FRIENDLIST).
        !          6763:         Pretend we are at top level, we will get true
        !          6764:         reference later, perhaps.
        !          6765: 
        !          6766:         FIXME: This should only need to look at IDENTIFIER_GLOBAL_VALUE.  */
        !          6767:       tmp = lookup_name (DECL_ASSEMBLER_NAME (decl), 0);
        !          6768:       if (tmp == NULL_TREE)
        !          6769:        IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (decl)) = decl;
        !          6770:       else if (TREE_CODE (tmp) != TREE_CODE (decl))
        !          6771:        cp_error ("inconsistent declarations for `%D'", decl);
        !          6772:       else
        !          6773:        {
        !          6774:          duplicate_decls (decl, tmp);
        !          6775:          decl = tmp;
        !          6776:          /* avoid creating circularities.  */
        !          6777:          DECL_CHAIN (decl) = NULL_TREE;
        !          6778:        }
        !          6779:       make_decl_rtl (decl, NULL_PTR, 1);
        !          6780: 
        !          6781:       /* If this declaration supersedes the declaration of
        !          6782:         a method declared virtual in the base class, then
        !          6783:         mark this field as being virtual as well.  */
        !          6784:       {
        !          6785:        tree binfos = BINFO_BASETYPES (TYPE_BINFO (ctype));
        !          6786:        int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
        !          6787: 
        !          6788:        for (i = 0; i < n_baselinks; i++)
        !          6789:          {
        !          6790:            tree base_binfo = TREE_VEC_ELT (binfos, i);
        !          6791:            if (TYPE_VIRTUAL_P (BINFO_TYPE (base_binfo)) || flag_all_virtual == 1)
        !          6792:              {
        !          6793:                tmp = get_first_matching_virtual (base_binfo, decl,
        !          6794:                                                  flags == DTOR_FLAG);
        !          6795:                if (tmp)
        !          6796:                  {
        !          6797:                    /* If this function overrides some virtual in some base
        !          6798:                       class, then the function itself is also necessarily
        !          6799:                       virtual, even if the user didn't explicitly say so.  */
        !          6800:                    DECL_VIRTUAL_P (decl) = 1;
        !          6801: 
        !          6802:                    /* The TMP we really want is the one from the deepest
        !          6803:                       baseclass on this path, taking care not to
        !          6804:                       duplicate if we have already found it (via another
        !          6805:                       path to its virtual baseclass.  */
        !          6806:                    if (staticp)
        !          6807:                      {
        !          6808:                        cp_error ("method `%D' may not be declared static", decl);
        !          6809:                        cp_error_at ("(since `%D' declared virtual in base class.)", tmp);
        !          6810:                        break;
        !          6811:                      }
        !          6812:                    virtualp = 1;
        !          6813: 
        !          6814:                    if ((TYPE_USES_VIRTUAL_BASECLASSES (BINFO_TYPE (base_binfo))
        !          6815:                         || TYPE_USES_MULTIPLE_INHERITANCE (ctype))
        !          6816:                        && BINFO_TYPE (base_binfo) != DECL_CONTEXT (tmp))
        !          6817:                      tmp = get_first_matching_virtual (TYPE_BINFO (DECL_CONTEXT (tmp)),
        !          6818:                                                        decl, flags == DTOR_FLAG);
        !          6819:                    if (value_member (tmp, DECL_VINDEX (decl)) == NULL_TREE)
        !          6820:                      {
        !          6821:                        /* The argument types may have changed... */
        !          6822:                        tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
        !          6823:                        tree base_variant = TREE_TYPE (TREE_VALUE (argtypes));
        !          6824: 
        !          6825:                        argtypes = commonparms (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (tmp))),
        !          6826:                                                TREE_CHAIN (argtypes));
        !          6827:                        /* But the return type has not.  */
        !          6828:                        type = build_cplus_method_type (base_variant, TREE_TYPE (type), argtypes);
        !          6829:                        if (raises)
        !          6830:                          {
        !          6831:                            type = build_exception_variant (ctype, type, raises);
        !          6832:                            raises = TYPE_RAISES_EXCEPTIONS (type);
        !          6833:                          }
        !          6834:                        TREE_TYPE (decl) = type;
        !          6835:                        DECL_VINDEX (decl)
        !          6836:                          = tree_cons (NULL_TREE, tmp, DECL_VINDEX (decl));
        !          6837:                      }
        !          6838:                  }
        !          6839:              }
        !          6840:          }
        !          6841:       }
        !          6842:       if (virtualp)
        !          6843:        {
        !          6844:          if (DECL_VINDEX (decl) == NULL_TREE)
        !          6845:            DECL_VINDEX (decl) = error_mark_node;
        !          6846:          IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)) = 1;
        !          6847:          if (ctype && CLASSTYPE_VTABLE_NEEDS_WRITING (ctype)
        !          6848:              /* If this function is derived from a template, don't
        !          6849:                 make it public.  This shouldn't be here, but there's
        !          6850:                 no good way to override the interface pragmas for one
        !          6851:                 function or class only.  Bletch.  */
        !          6852:              && IDENTIFIER_TEMPLATE (TYPE_IDENTIFIER (ctype)) == NULL_TREE
        !          6853:              && (write_virtuals == 2
        !          6854:                  || (write_virtuals == 3
        !          6855:                      && CLASSTYPE_INTERFACE_KNOWN (ctype))))
        !          6856:            TREE_PUBLIC (decl) = 1;
        !          6857:        }
        !          6858:     }
        !          6859:   return decl;
        !          6860: }
        !          6861: 
        !          6862: static tree
        !          6863: grokvardecl (type, declarator, specbits, initialized)
        !          6864:      tree type;
        !          6865:      tree declarator;
        !          6866:      RID_BIT_TYPE specbits;
        !          6867:      int initialized;
        !          6868: {
        !          6869:   tree decl;
        !          6870: 
        !          6871:   if (TREE_CODE (type) == OFFSET_TYPE)
        !          6872:     {
        !          6873:       /* If you declare a static member so that it
        !          6874:         can be initialized, the code will reach here.  */
        !          6875:       tree field = lookup_field (TYPE_OFFSET_BASETYPE (type),
        !          6876:                                 declarator, 0, 0);
        !          6877:       if (field == NULL_TREE || TREE_CODE (field) != VAR_DECL)
        !          6878:        {
        !          6879:          tree basetype = TYPE_OFFSET_BASETYPE (type);
        !          6880:          error ("`%s' is not a static member of class `%s'",
        !          6881:                 IDENTIFIER_POINTER (declarator),
        !          6882:                 TYPE_NAME_STRING (basetype));
        !          6883:          type = TREE_TYPE (type);
        !          6884:          decl = build_lang_field_decl (VAR_DECL, declarator, type);
        !          6885:          DECL_CONTEXT (decl) = basetype;
        !          6886:          DECL_CLASS_CONTEXT (decl) = basetype;
        !          6887:        }
        !          6888:       else
        !          6889:        {
        !          6890:          tree f_type = TREE_TYPE (field);
        !          6891:          tree o_type = TREE_TYPE (type);
        !          6892: 
        !          6893:          if (TYPE_SIZE (f_type) == NULL_TREE)
        !          6894:            {
        !          6895:              if (TREE_CODE (f_type) != TREE_CODE (o_type)
        !          6896:                  || (TREE_CODE (f_type) == ARRAY_TYPE
        !          6897:                      && TREE_TYPE (f_type) != TREE_TYPE (o_type)))
        !          6898:                error ("redeclaration of type for `%s'",
        !          6899:                       IDENTIFIER_POINTER (declarator));
        !          6900:              else if (TYPE_SIZE (o_type) != NULL_TREE)
        !          6901:                TREE_TYPE (field) = type;
        !          6902:            }
        !          6903:          else if (f_type != o_type)
        !          6904:            error ("redeclaration of type for `%s'",
        !          6905:                   IDENTIFIER_POINTER (declarator));
        !          6906:          decl = field;
        !          6907:          if (initialized && DECL_INITIAL (decl)
        !          6908:              /* Complain about multiply-initialized
        !          6909:                 member variables, but don't be faked
        !          6910:                 out if initializer is faked up from `empty_init_node'.  */
        !          6911:              && (TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR
        !          6912:                  || CONSTRUCTOR_ELTS (DECL_INITIAL (decl)) != NULL_TREE))
        !          6913:            error_with_aggr_type (DECL_CONTEXT (decl),
        !          6914:                                  "multiple initializations of static member `%s::%s'",
        !          6915:                                  IDENTIFIER_POINTER (DECL_NAME (decl)));
        !          6916:        }
        !          6917:     }
        !          6918:   else
        !          6919:     decl = build_decl (VAR_DECL, declarator, type);
        !          6920: 
        !          6921:   if (RIDBIT_SETP (RID_EXTERN, specbits))
        !          6922:     {
        !          6923:       DECL_THIS_EXTERN (decl) = 1;
        !          6924:       DECL_EXTERNAL (decl) = !initialized;
        !          6925:     }
        !          6926: 
        !          6927:   /* In class context, static means one per class,
        !          6928:      public visibility, and static storage.  */
        !          6929:   if (DECL_FIELD_CONTEXT (decl) != NULL_TREE
        !          6930:       && IS_AGGR_TYPE (DECL_FIELD_CONTEXT (decl)))
        !          6931:     {
        !          6932:       TREE_PUBLIC (decl) = 1;
        !          6933:       TREE_STATIC (decl) = 1;
        !          6934:       DECL_EXTERNAL (decl) = !initialized;
        !          6935:     }
        !          6936:   /* At top level, either `static' or no s.c. makes a definition
        !          6937:      (perhaps tentative), and absence of `static' makes it public.  */
        !          6938:   else if (current_binding_level == global_binding_level)
        !          6939:     {
        !          6940:       TREE_PUBLIC (decl) = RIDBIT_NOTSETP (RID_STATIC, specbits);
        !          6941:       TREE_STATIC (decl) = ! DECL_EXTERNAL (decl);
        !          6942:     }
        !          6943:   /* Not at top level, only `static' makes a static definition.  */
        !          6944:   else
        !          6945:     {
        !          6946:       TREE_STATIC (decl) = !! RIDBIT_SETP (RID_STATIC, specbits);
        !          6947:       TREE_PUBLIC (decl) = DECL_EXTERNAL (decl);
        !          6948:     }
        !          6949:   return decl;
        !          6950: }
        !          6951: 
        !          6952: /* Create a canonical pointer to member function type. */
        !          6953: 
        !          6954: static tree
        !          6955: build_ptrmemfunc_type (type)
        !          6956:      tree type;
        !          6957: {
        !          6958:   tree fields[4];
        !          6959:   tree t;
        !          6960:   tree u;
        !          6961: 
        !          6962:   /* If a canonical type already exists for this type, use it.  We use
        !          6963:      this method instead of type_hash_canon, because it only does a
        !          6964:      simple equality check on the list of field members.  */
        !          6965: 
        !          6966:   if ((t = TYPE_GET_PTRMEMFUNC_TYPE (type)))
        !          6967:     return t;
        !          6968: 
        !          6969:   u = make_lang_type (UNION_TYPE);
        !          6970:   fields[0] = build_lang_field_decl (FIELD_DECL, pfn_identifier, type);
        !          6971:   fields[1] = build_lang_field_decl (FIELD_DECL, delta2_identifier, short_integer_type_node);
        !          6972:   finish_builtin_type (u, "__ptrmemfunc_type", fields, 1, ptr_type_node);
        !          6973:   TYPE_NAME (u) = NULL_TREE;
        !          6974: 
        !          6975:   t = make_lang_type (RECORD_TYPE);
        !          6976: 
        !          6977:   /* Let the front-end know this is a pointer to member function. */
        !          6978:   TYPE_PTRMEMFUNC_FLAG(t) = 1;
        !          6979: 
        !          6980:   fields[0] = build_lang_field_decl (FIELD_DECL, delta_identifier, short_integer_type_node);
        !          6981:   fields[1] = build_lang_field_decl (FIELD_DECL, index_identifier, short_integer_type_node);
        !          6982:   fields[2] = build_lang_field_decl (FIELD_DECL, pfn_or_delta2_identifier, u);
        !          6983:   finish_builtin_type (t, "__ptrmemfunc_type", fields, 2, ptr_type_node);
        !          6984: 
        !          6985:   /* Zap out the name so that the back-end will give us the debugging
        !          6986:      information for this anonymous RECORD_TYPE.  */
        !          6987:   TYPE_NAME (t) = NULL_TREE;
        !          6988: 
        !          6989:   TYPE_SET_PTRMEMFUNC_TYPE (type, t);
        !          6990: 
        !          6991:   /* Seems to be wanted. */
        !          6992:   CLASSTYPE_GOT_SEMICOLON (t) = 1;
        !          6993:   return t;
        !          6994: }
        !          6995: 
        !          6996: /* Given declspecs and a declarator,
        !          6997:    determine the name and type of the object declared
        !          6998:    and construct a ..._DECL node for it.
        !          6999:    (In one case we can return a ..._TYPE node instead.
        !          7000:     For invalid input we sometimes return 0.)
        !          7001: 
        !          7002:    DECLSPECS is a chain of tree_list nodes whose value fields
        !          7003:     are the storage classes and type specifiers.
        !          7004: 
        !          7005:    DECL_CONTEXT says which syntactic context this declaration is in:
        !          7006:      NORMAL for most contexts.  Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL.
        !          7007:      FUNCDEF for a function definition.  Like NORMAL but a few different
        !          7008:       error messages in each case.  Return value may be zero meaning
        !          7009:       this definition is too screwy to try to parse.
        !          7010:      MEMFUNCDEF for a function definition.  Like FUNCDEF but prepares to
        !          7011:       handle member functions (which have FIELD context).
        !          7012:       Return value may be zero meaning this definition is too screwy to
        !          7013:       try to parse.
        !          7014:      PARM for a parameter declaration (either within a function prototype
        !          7015:       or before a function body).  Make a PARM_DECL, or return void_type_node.
        !          7016:      TYPENAME if for a typename (in a cast or sizeof).
        !          7017:       Don't make a DECL node; just return the ..._TYPE node.
        !          7018:      FIELD for a struct or union field; make a FIELD_DECL.
        !          7019:      BITFIELD for a field with specified width.
        !          7020:    INITIALIZED is 1 if the decl has an initializer.
        !          7021: 
        !          7022:    In the TYPENAME case, DECLARATOR is really an absolute declarator.
        !          7023:    It may also be so in the PARM case, for a prototype where the
        !          7024:    argument type is specified but not the name.
        !          7025: 
        !          7026:    This function is where the complicated C meanings of `static'
        !          7027:    and `extern' are interpreted.
        !          7028: 
        !          7029:    For C++, if there is any monkey business to do, the function which
        !          7030:    calls this one must do it, i.e., prepending instance variables,
        !          7031:    renaming overloaded function names, etc.
        !          7032: 
        !          7033:    Note that for this C++, it is an error to define a method within a class
        !          7034:    which does not belong to that class.
        !          7035: 
        !          7036:    Except in the case where SCOPE_REFs are implicitly known (such as
        !          7037:    methods within a class being redundantly qualified),
        !          7038:    declarations which involve SCOPE_REFs are returned as SCOPE_REFs
        !          7039:    (class_name::decl_name).  The caller must also deal with this.
        !          7040: 
        !          7041:    If a constructor or destructor is seen, and the context is FIELD,
        !          7042:    then the type gains the attribute TREE_HAS_x.  If such a declaration
        !          7043:    is erroneous, NULL_TREE is returned.
        !          7044: 
        !          7045:    QUALS is used only for FUNCDEF and MEMFUNCDEF cases.  For a member
        !          7046:    function, these are the qualifiers to give to the `this' pointer.
        !          7047: 
        !          7048:    May return void_type_node if the declarator turned out to be a friend.
        !          7049:    See grokfield for details.  */
        !          7050: 
        !          7051: enum return_types { return_normal, return_ctor, return_dtor, return_conversion };
        !          7052: 
        !          7053: tree
        !          7054: grokdeclarator (declarator, declspecs, decl_context, initialized, raises)
        !          7055:      tree declspecs;
        !          7056:      tree declarator;
        !          7057:      enum decl_context decl_context;
        !          7058:      int initialized;
        !          7059:      tree raises;
        !          7060: {
        !          7061:   RID_BIT_TYPE specbits;
        !          7062:   int nclasses = 0;
        !          7063:   tree spec;
        !          7064:   tree type = NULL_TREE;
        !          7065:   int longlong = 0;
        !          7066:   int constp;
        !          7067:   int volatilep;
        !          7068:   int virtualp, friendp, inlinep, staticp;
        !          7069:   int explicit_int = 0;
        !          7070:   int explicit_char = 0;
        !          7071:   tree typedef_decl = NULL_TREE;
        !          7072:   char *name;
        !          7073:   tree typedef_type = NULL_TREE;
        !          7074:   int funcdef_flag = 0;
        !          7075:   enum tree_code innermost_code = ERROR_MARK;
        !          7076:   int bitfield = 0;
        !          7077:   int size_varies = 0;
        !          7078:   /* Set this to error_mark_node for FIELD_DECLs we could not handle properly.
        !          7079:      All FIELD_DECLs we build here have `init' put into their DECL_INITIAL.  */
        !          7080:   tree init = NULL_TREE;
        !          7081: 
        !          7082:   /* Keep track of what sort of function is being processed
        !          7083:      so that we can warn about default return values, or explicit
        !          7084:      return values which do not match prescribed defaults.  */
        !          7085:   enum return_types return_type = return_normal;
        !          7086: 
        !          7087:   tree dname = NULL_TREE;
        !          7088:   tree ctype = current_class_type;
        !          7089:   tree ctor_return_type = NULL_TREE;
        !          7090:   enum overload_flags flags = NO_SPECIAL;
        !          7091:   int seen_scope_ref = 0;
        !          7092:   tree quals = NULL_TREE;
        !          7093: 
        !          7094:   RIDBIT_RESET_ALL (specbits);
        !          7095:   if (decl_context == FUNCDEF)
        !          7096:     funcdef_flag = 1, decl_context = NORMAL;
        !          7097:   else if (decl_context == MEMFUNCDEF)
        !          7098:     funcdef_flag = -1, decl_context = FIELD;
        !          7099:   else if (decl_context == BITFIELD)
        !          7100:     bitfield = 1, decl_context = FIELD;
        !          7101: 
        !          7102:   if (flag_traditional && allocation_temporary_p ())
        !          7103:     end_temporary_allocation ();
        !          7104: 
        !          7105:   /* Look inside a declarator for the name being declared
        !          7106:      and get it as a string, for an error message.  */
        !          7107:   {
        !          7108:     tree type, last = NULL_TREE;
        !          7109:     register tree decl = declarator;
        !          7110:     name = NULL;
        !          7111: 
        !          7112:     /* If we see something of the form `aggr_type xyzzy (a, b, c)'
        !          7113:        it is either an old-style function declaration or a call to
        !          7114:        a constructor.  The following conditional makes recognizes this
        !          7115:        case as being a call to a constructor.  Too bad if it is not.  */
        !          7116: 
        !          7117:     /* For Doug Lea, also grok `aggr_type xyzzy (a, b, c)[10][10][10]'.  */
        !          7118:     while (decl && TREE_CODE (decl) == ARRAY_REF)
        !          7119:       {
        !          7120:        last = decl;
        !          7121:        decl = TREE_OPERAND (decl, 0);
        !          7122:       }
        !          7123: 
        !          7124:     if (decl && declspecs
        !          7125:         && TREE_CODE (decl) == CALL_EXPR
        !          7126:         && TREE_OPERAND (decl, 0)
        !          7127:         && (TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE
        !          7128:            || TREE_CODE (TREE_OPERAND (decl, 0)) == SCOPE_REF))
        !          7129:       {
        !          7130:         type = TREE_CODE (TREE_VALUE (declspecs)) == IDENTIFIER_NODE
        !          7131:           ? lookup_name (TREE_VALUE (declspecs), 1) :
        !          7132:         (IS_AGGR_TYPE (TREE_VALUE (declspecs))
        !          7133:          ? TYPE_NAME (TREE_VALUE (declspecs)) : NULL_TREE);
        !          7134: 
        !          7135:        /* We used to restrict this to just aggregate types for
        !          7136:           function-call notation for initialization.  But since it
        !          7137:           can be done for more than aggregates (e.g., `int a(b);'),
        !          7138:           it's no longer restrained.  */
        !          7139:         if (type
        !          7140:            && TREE_CODE (type) == TYPE_DECL
        !          7141:             && parmlist_is_exprlist (TREE_OPERAND (decl, 1)))
        !          7142:           {
        !          7143:             if (decl_context == FIELD
        !          7144:                 && TREE_CHAIN (TREE_OPERAND (decl, 1)))
        !          7145:               {
        !          7146:                 /* That was an initializer list.  */
        !          7147:                 sorry ("initializer lists for field declarations");
        !          7148:                 decl = TREE_OPERAND (decl, 0);
        !          7149:                if (last)
        !          7150:                  {
        !          7151:                    TREE_OPERAND (last, 0) = decl;
        !          7152:                    decl = declarator;
        !          7153:                  }
        !          7154:                 declarator = decl;
        !          7155:                 init = error_mark_node;
        !          7156:                 goto bot;
        !          7157:               }
        !          7158:             else
        !          7159:               {
        !          7160:                init = TREE_OPERAND (decl, 1);
        !          7161:                if (last)
        !          7162:                  {
        !          7163:                    TREE_OPERAND (last, 0) = TREE_OPERAND (decl, 0);
        !          7164:                    if (pedantic && init)
        !          7165:                      {
        !          7166:                      error ("arrays cannot take initializers");
        !          7167:                      init = error_mark_node;
        !          7168:                    }
        !          7169:                  }
        !          7170:                else
        !          7171:                  declarator = TREE_OPERAND (declarator, 0);
        !          7172: 
        !          7173:                /* When dealing with scalar initializations we have to get
        !          7174:                   rid of the surrounding TREE_LIST around the initializer.  */
        !          7175:                if (! IS_AGGR_TYPE (TREE_TYPE (type)))
        !          7176:                  init = TREE_VALUE (init);
        !          7177: 
        !          7178:                decl = start_decl (declarator, declspecs, 1, NULL_TREE);
        !          7179:                finish_decl (decl, init, NULL_TREE, 1);
        !          7180:                return 0;
        !          7181:               }
        !          7182:           }
        !          7183: 
        !          7184:         if (parmlist_is_random (TREE_OPERAND (decl, 1)))
        !          7185:           {
        !          7186:            decl = TREE_OPERAND (decl, 0);
        !          7187:            if (TREE_CODE (decl) == SCOPE_REF)
        !          7188:              {
        !          7189:                if (TREE_COMPLEXITY (decl))
        !          7190:                  my_friendly_abort (15);
        !          7191:                decl = TREE_OPERAND (decl, 1);
        !          7192:              }
        !          7193:            if (TREE_CODE (decl) == IDENTIFIER_NODE)
        !          7194:              name = IDENTIFIER_POINTER (decl);
        !          7195:            if (name)
        !          7196:              error ("bad parameter list specification for function `%s'",
        !          7197:                     name);
        !          7198:            else
        !          7199:              error ("bad parameter list specification for function");
        !          7200:             return void_type_node;
        !          7201:           }
        !          7202:       bot:
        !          7203:         ;
        !          7204:       }
        !          7205:     else
        !          7206:       /* It didn't look like we thought it would, leave the ARRAY_REFs on.  */
        !          7207:       decl = declarator;
        !          7208: 
        !          7209:     while (decl)
        !          7210:       switch (TREE_CODE (decl))
        !          7211:         {
        !          7212:        case COND_EXPR:
        !          7213:          ctype = NULL_TREE;
        !          7214:          decl = TREE_OPERAND (decl, 0);
        !          7215:          break;
        !          7216: 
        !          7217:        case BIT_NOT_EXPR:      /* for C++ destructors!  */
        !          7218:          {
        !          7219:            tree name = TREE_OPERAND (decl, 0);
        !          7220:            tree rename = NULL_TREE;
        !          7221: 
        !          7222:            my_friendly_assert (flags == NO_SPECIAL, 152);
        !          7223:            flags = DTOR_FLAG;
        !          7224:            return_type = return_dtor;
        !          7225:            my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 153);
        !          7226:            if (ctype == NULL_TREE)
        !          7227:              {
        !          7228:                if (current_class_type == NULL_TREE)
        !          7229:                  {
        !          7230:                    error ("destructors must be member functions");
        !          7231:                    flags = NO_SPECIAL;
        !          7232:                  }
        !          7233:                else
        !          7234:                  {
        !          7235:                    tree t = constructor_name (current_class_name);
        !          7236:                    if (t != name)
        !          7237:                      rename = t;
        !          7238:                  }
        !          7239:              }
        !          7240:            else
        !          7241:              {
        !          7242:                tree t = constructor_name (ctype);
        !          7243:                if (t != name)
        !          7244:                  rename = t;
        !          7245:              }
        !          7246: 
        !          7247:            if (rename)
        !          7248:              {
        !          7249:                error ("destructor `%s' must match class name `%s'",
        !          7250:                       IDENTIFIER_POINTER (name),
        !          7251:                       IDENTIFIER_POINTER (rename));
        !          7252:                TREE_OPERAND (decl, 0) = rename;
        !          7253:              }
        !          7254:            decl = name;
        !          7255:          }
        !          7256:          break;
        !          7257: 
        !          7258:        case ADDR_EXPR:         /* C++ reference declaration */
        !          7259:          /* fall through */
        !          7260:        case ARRAY_REF:
        !          7261:        case INDIRECT_REF:
        !          7262:          ctype = NULL_TREE;
        !          7263:          innermost_code = TREE_CODE (decl);
        !          7264:          decl = TREE_OPERAND (decl, 0);
        !          7265:          break;
        !          7266: 
        !          7267:        case CALL_EXPR:
        !          7268:          innermost_code = TREE_CODE (decl);
        !          7269:          decl = TREE_OPERAND (decl, 0);
        !          7270:          if (decl_context == FIELD && ctype == NULL_TREE)
        !          7271:            ctype = current_class_type;
        !          7272:          if (ctype != NULL_TREE
        !          7273:              && decl != NULL_TREE && flags != DTOR_FLAG
        !          7274:              && decl == constructor_name (ctype))
        !          7275:            {
        !          7276:              return_type = return_ctor;
        !          7277:              ctor_return_type = ctype;
        !          7278:            }
        !          7279:          ctype = NULL_TREE;
        !          7280:          break;
        !          7281: 
        !          7282:        case IDENTIFIER_NODE:
        !          7283:          dname = decl;
        !          7284:          name = IDENTIFIER_POINTER (decl);
        !          7285:          decl = NULL_TREE;
        !          7286:          break;
        !          7287: 
        !          7288:        case RECORD_TYPE:
        !          7289:        case UNION_TYPE:
        !          7290:        case ENUMERAL_TYPE:
        !          7291:          /* Parse error puts this typespec where
        !          7292:             a declarator should go.  */
        !          7293:          error ("declarator name missing");
        !          7294:          dname = TYPE_NAME (decl);
        !          7295:          if (dname && TREE_CODE (dname) == TYPE_DECL)
        !          7296:            dname = DECL_NAME (dname);
        !          7297:          name = dname ? IDENTIFIER_POINTER (dname) : "<nameless>";
        !          7298:          declspecs = temp_tree_cons (NULL_TREE, decl, declspecs);
        !          7299:          decl = NULL_TREE;
        !          7300:          break;
        !          7301: 
        !          7302:        case TYPE_EXPR:
        !          7303:          my_friendly_assert (flags == NO_SPECIAL, 154);
        !          7304:          flags = TYPENAME_FLAG;
        !          7305:          name = "operator <typename>"; /* We don't know the type yet.  */
        !          7306:          /* Go to the absdcl.  */
        !          7307:          decl = TREE_OPERAND (decl, 0);
        !          7308:          return_type = return_conversion;
        !          7309:          break;
        !          7310: 
        !          7311:          /* C++ extension */
        !          7312:        case SCOPE_REF:
        !          7313:          if (seen_scope_ref == 1)
        !          7314:            error ("multiple `::' terms in declarator invalid");
        !          7315:          seen_scope_ref += 1;
        !          7316:          {
        !          7317:            /* Perform error checking, and convert class names to types.
        !          7318:               We may call grokdeclarator multiple times for the same
        !          7319:               tree structure, so only do the conversion once.  In this
        !          7320:               case, we have exactly what we want for `ctype'.  */
        !          7321:            tree cname = TREE_OPERAND (decl, 0);
        !          7322:            if (cname == NULL_TREE)
        !          7323:              ctype = NULL_TREE;
        !          7324:            /* Can't use IS_AGGR_TYPE because CNAME might not be a type.  */
        !          7325:            else if (IS_AGGR_TYPE_CODE (TREE_CODE (cname))
        !          7326:                     || TREE_CODE (cname) == UNINSTANTIATED_P_TYPE)
        !          7327:              ctype = cname;
        !          7328:            else if (! is_aggr_typedef (cname, 1))
        !          7329:              {
        !          7330:                TREE_OPERAND (decl, 0) = NULL_TREE;
        !          7331:              }
        !          7332:            /* Must test TREE_OPERAND (decl, 1), in case user gives
        !          7333:               us `typedef (class::memfunc)(int); memfunc *memfuncptr;'  */
        !          7334:            else if (TREE_OPERAND (decl, 1)
        !          7335:                     && TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF)
        !          7336:              {
        !          7337:                TREE_OPERAND (decl, 0) = IDENTIFIER_TYPE_VALUE (cname);
        !          7338:              }
        !          7339:            else if (ctype == NULL_TREE)
        !          7340:              {
        !          7341:                ctype = IDENTIFIER_TYPE_VALUE (cname);
        !          7342:                TREE_OPERAND (decl, 0) = ctype;
        !          7343:              }
        !          7344:            else if (TREE_COMPLEXITY (decl) == current_class_depth)
        !          7345:              TREE_OPERAND (decl, 0) = ctype;
        !          7346:            else
        !          7347:              {
        !          7348:                if (! UNIQUELY_DERIVED_FROM_P (IDENTIFIER_TYPE_VALUE (cname), ctype))
        !          7349:                  {
        !          7350:                    error ("type `%s' is not derived from type `%s'",
        !          7351:                           IDENTIFIER_POINTER (cname),
        !          7352:                           TYPE_NAME_STRING (ctype));
        !          7353:                    TREE_OPERAND (decl, 0) = NULL_TREE;
        !          7354:                  }
        !          7355:                else
        !          7356:                  {
        !          7357:                    ctype = IDENTIFIER_TYPE_VALUE (cname);
        !          7358:                    TREE_OPERAND (decl, 0) = ctype;
        !          7359:                  }
        !          7360:              }
        !          7361: 
        !          7362:            decl = TREE_OPERAND (decl, 1);
        !          7363:            if (ctype)
        !          7364:              {
        !          7365:                if (TREE_CODE (decl) == IDENTIFIER_NODE
        !          7366:                    && constructor_name (ctype) == decl)
        !          7367:                  {
        !          7368:                    return_type = return_ctor;
        !          7369:                    ctor_return_type = ctype;
        !          7370:                  }
        !          7371:                else if (TREE_CODE (decl) == BIT_NOT_EXPR
        !          7372:                         && TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE
        !          7373:                         && constructor_name (ctype) == TREE_OPERAND (decl, 0))
        !          7374:                  {
        !          7375:                    return_type = return_dtor;
        !          7376:                    ctor_return_type = ctype;
        !          7377:                    flags = DTOR_FLAG;
        !          7378:                    decl = TREE_OPERAND (decl, 0);
        !          7379:                  }
        !          7380:              }
        !          7381:          }
        !          7382:          break;
        !          7383: 
        !          7384:        case ERROR_MARK:
        !          7385:          decl = NULL_TREE;
        !          7386:          break;
        !          7387: 
        !          7388:        default:
        !          7389:          return 0; /* We used to do a 155 abort here.  */
        !          7390:        }
        !          7391:     if (name == NULL)
        !          7392:       name = "type name";
        !          7393:   }
        !          7394: 
        !          7395:   /* A function definition's declarator must have the form of
        !          7396:      a function declarator.  */
        !          7397: 
        !          7398:   if (funcdef_flag && innermost_code != CALL_EXPR)
        !          7399:     return 0;
        !          7400: 
        !          7401:   /* Anything declared one level down from the top level
        !          7402:      must be one of the parameters of a function
        !          7403:      (because the body is at least two levels down).  */
        !          7404: 
        !          7405:   /* This heuristic cannot be applied to C++ nodes! Fixed, however,
        !          7406:      by not allowing C++ class definitions to specify their parameters
        !          7407:      with xdecls (must be spec.d in the parmlist).
        !          7408: 
        !          7409:      Since we now wait to push a class scope until we are sure that
        !          7410:      we are in a legitimate method context, we must set oldcname
        !          7411:      explicitly (since current_class_name is not yet alive).  */
        !          7412: 
        !          7413:   if (decl_context == NORMAL
        !          7414:       && current_binding_level->level_chain == global_binding_level)
        !          7415:     decl_context = PARM;
        !          7416: 
        !          7417:   /* Look through the decl specs and record which ones appear.
        !          7418:      Some typespecs are defined as built-in typenames.
        !          7419:      Others, the ones that are modifiers of other types,
        !          7420:      are represented by bits in SPECBITS: set the bits for
        !          7421:      the modifiers that appear.  Storage class keywords are also in SPECBITS.
        !          7422: 
        !          7423:      If there is a typedef name or a type, store the type in TYPE.
        !          7424:      This includes builtin typedefs such as `int'.
        !          7425: 
        !          7426:      Set EXPLICIT_INT if the type is `int' or `char' and did not
        !          7427:      come from a user typedef.
        !          7428: 
        !          7429:      Set LONGLONG if `long' is mentioned twice.
        !          7430: 
        !          7431:      For C++, constructors and destructors have their own fast treatment.  */
        !          7432: 
        !          7433:   for (spec = declspecs; spec; spec = TREE_CHAIN (spec))
        !          7434:     {
        !          7435:       register int i;
        !          7436:       register tree id = TREE_VALUE (spec);
        !          7437: 
        !          7438:       /* Certain parse errors slip through.  For example,
        !          7439:         `int class;' is not caught by the parser. Try
        !          7440:         weakly to recover here.  */
        !          7441:       if (TREE_CODE (spec) != TREE_LIST)
        !          7442:        return 0;
        !          7443: 
        !          7444:       if (TREE_CODE (id) == IDENTIFIER_NODE)
        !          7445:        {
        !          7446:          if (id == ridpointers[(int) RID_INT])
        !          7447:            {
        !          7448:              if (type)
        !          7449:                error ("extraneous `int' ignored");
        !          7450:              else
        !          7451:                {
        !          7452:                  explicit_int = 1;
        !          7453:                  type = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (id));
        !          7454:                }
        !          7455:              goto found;
        !          7456:            }
        !          7457:          if (id == ridpointers[(int) RID_CHAR])
        !          7458:            {
        !          7459:              if (type)
        !          7460:                error ("extraneous `char' ignored");
        !          7461:              else
        !          7462:                {
        !          7463:                  explicit_char = 1;
        !          7464:                  type = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (id));
        !          7465:                }
        !          7466:              goto found;
        !          7467:            }
        !          7468:          if (id == ridpointers[(int) RID_WCHAR])
        !          7469:            {
        !          7470:              if (type)
        !          7471:                error ("extraneous `__wchar_t' ignored");
        !          7472:              else
        !          7473:                {
        !          7474:                  type = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (id));
        !          7475:                }
        !          7476:              goto found;
        !          7477:            }
        !          7478:          /* C++ aggregate types.  */
        !          7479:          if (IDENTIFIER_HAS_TYPE_VALUE (id))
        !          7480:            {
        !          7481:              if (type)
        !          7482:                error ("multiple declarations `%s' and `%s'",
        !          7483:                       IDENTIFIER_POINTER (type),
        !          7484:                       IDENTIFIER_POINTER (id));
        !          7485:              else
        !          7486:                type = IDENTIFIER_TYPE_VALUE (id);
        !          7487:              goto found;
        !          7488:            }
        !          7489: 
        !          7490:          for (i = (int) RID_FIRST_MODIFIER; i < (int) RID_MAX; i++)
        !          7491:            {
        !          7492:              if (ridpointers[i] == id)
        !          7493:                {
        !          7494:                  if (i == (int) RID_LONG && RIDBIT_SETP (i, specbits))
        !          7495:                    {
        !          7496: #if 0
        !          7497:                      if (pedantic)
        !          7498:                        pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id));
        !          7499:                      else
        !          7500: #endif
        !          7501:                        if (longlong)
        !          7502:                        error ("`long long long' is too long for GCC");
        !          7503:                      else
        !          7504:                        longlong = 1;
        !          7505:                    }
        !          7506:                  else if (RIDBIT_SETP (i, specbits))
        !          7507:                    warning ("duplicate `%s'", IDENTIFIER_POINTER (id));
        !          7508:                  RIDBIT_SET (i, specbits);
        !          7509:                  goto found;
        !          7510:                }
        !          7511:            }
        !          7512:        }
        !          7513:       if (type)
        !          7514:        error ("two or more data types in declaration of `%s'", name);
        !          7515:       else if (TREE_CODE (id) == IDENTIFIER_NODE)
        !          7516:        {
        !          7517:          register tree t = lookup_name (id, 1);
        !          7518:          if (!t || TREE_CODE (t) != TYPE_DECL)
        !          7519:            error ("`%s' fails to be a typedef or built in type",
        !          7520:                   IDENTIFIER_POINTER (id));
        !          7521:          else
        !          7522:            {
        !          7523:              type = TREE_TYPE (t);
        !          7524:              typedef_decl = t;
        !          7525:            }
        !          7526:        }
        !          7527:       else if (TREE_CODE (id) != ERROR_MARK)
        !          7528:        /* Can't change CLASS nodes into RECORD nodes here!  */
        !          7529:        type = id;
        !          7530: 
        !          7531:     found: {}
        !          7532:     }
        !          7533: 
        !          7534:   typedef_type = type;
        !          7535: 
        !          7536:   /* No type at all: default to `int', and set EXPLICIT_INT
        !          7537:      because it was not a user-defined typedef.  */
        !          7538: 
        !          7539:   if (type == NULL_TREE)
        !          7540:     {
        !          7541:       explicit_int = -1;
        !          7542:       if (return_type == return_dtor)
        !          7543:        type = void_type_node;
        !          7544:       else if (return_type == return_ctor)
        !          7545:        type = TYPE_POINTER_TO (ctor_return_type);
        !          7546:       else
        !          7547:        {
        !          7548:          if (funcdef_flag && explicit_warn_return_type
        !          7549:              && return_type == return_normal
        !          7550:              && ! (RIDBIT_SETP (RID_SIGNED, specbits)
        !          7551:                    || RIDBIT_SETP (RID_UNSIGNED, specbits)
        !          7552:                    || RIDBIT_SETP (RID_LONG, specbits)
        !          7553:                    || RIDBIT_SETP (RID_SHORT, specbits)))
        !          7554:            warn_about_return_type = 1;
        !          7555:          /* Save warning until we know what is really going on.  */
        !          7556:          type = integer_type_node;
        !          7557:        }
        !          7558:     }
        !          7559:   else if (return_type == return_dtor)
        !          7560:     {
        !          7561:       error ("return type specification for destructor invalid");
        !          7562:       type = void_type_node;
        !          7563:     }
        !          7564:   else if (return_type == return_ctor)
        !          7565:     {
        !          7566:       error ("return type specification for constructor invalid");
        !          7567:       type = TYPE_POINTER_TO (ctor_return_type);
        !          7568:     }
        !          7569:   else if (RIDBIT_SETP (RID_FRIEND, specbits)
        !          7570:           && IS_AGGR_TYPE (type)
        !          7571:           && ! TYPE_BEING_DEFINED (type)
        !          7572:           && TYPE_SIZE (type) == NULL_TREE
        !          7573:           && ! ANON_AGGRNAME_P (TYPE_IDENTIFIER (type))
        !          7574:           && current_function_decl == NULL_TREE
        !          7575:           && decl_context != PARM)
        !          7576:     {
        !          7577:       /* xref_tag will make friend class declarations look like
        !          7578:         nested class declarations.  Retroactively change that
        !          7579:         if the type has not yet been defined.
        !          7580: 
        !          7581:         ??? ANSI C++ doesn't say what to do in this case yet.  */
        !          7582:       globalize_nested_type (type);
        !          7583:     }
        !          7584: 
        !          7585:   ctype = NULL_TREE;
        !          7586: 
        !          7587:   /* Now process the modifiers that were specified
        !          7588:      and check for invalid combinations.  */
        !          7589: 
        !          7590:   /* Long double is a special combination.  */
        !          7591: 
        !          7592:   if (RIDBIT_SETP (RID_LONG, specbits)
        !          7593:       && TYPE_MAIN_VARIANT (type) == double_type_node)
        !          7594:     {
        !          7595:       RIDBIT_RESET (RID_LONG, specbits);
        !          7596:       type = build_type_variant (long_double_type_node, TYPE_READONLY (type),
        !          7597:                                 TYPE_VOLATILE (type));
        !          7598:     }
        !          7599: 
        !          7600:   /* Check all other uses of type modifiers.  */
        !          7601: 
        !          7602:   if (RIDBIT_SETP (RID_UNSIGNED, specbits)
        !          7603:       || RIDBIT_SETP (RID_SIGNED, specbits)
        !          7604:       || RIDBIT_SETP (RID_LONG, specbits)
        !          7605:       || RIDBIT_SETP (RID_SHORT, specbits))
        !          7606:     {
        !          7607:       int ok = 0;
        !          7608: 
        !          7609:       if (TREE_CODE (type) == REAL_TYPE)
        !          7610:        error ("short, signed or unsigned invalid for `%s'", name);
        !          7611:       else if (TREE_CODE (type) != INTEGER_TYPE || type == wchar_type_node)
        !          7612:        error ("long, short, signed or unsigned invalid for `%s'", name);
        !          7613:       else if (RIDBIT_SETP (RID_LONG, specbits)
        !          7614:               && RIDBIT_SETP (RID_SHORT, specbits))
        !          7615:        error ("long and short specified together for `%s'", name);
        !          7616:       else if ((RIDBIT_SETP (RID_LONG, specbits)
        !          7617:                || RIDBIT_SETP (RID_SHORT, specbits))
        !          7618:               && explicit_char)
        !          7619:        error ("long or short specified with char for `%s'", name);
        !          7620:       else if ((RIDBIT_SETP (RID_LONG, specbits)
        !          7621:                || RIDBIT_SETP (RID_SHORT, specbits))
        !          7622:               && TREE_CODE (type) == REAL_TYPE)
        !          7623:        error ("long or short specified with floating type for `%s'", name);
        !          7624:       else if (RIDBIT_SETP (RID_SIGNED, specbits)
        !          7625:               && RIDBIT_SETP (RID_UNSIGNED, specbits))
        !          7626:        error ("signed and unsigned given together for `%s'", name);
        !          7627:       else
        !          7628:        {
        !          7629:          ok = 1;
        !          7630:          if (!explicit_int && !explicit_char && pedantic)
        !          7631:            {
        !          7632:              pedwarn ("long, short, signed or unsigned used invalidly for `%s'",
        !          7633:                       name);
        !          7634:              if (flag_pedantic_errors)
        !          7635:                ok = 0;
        !          7636:            }
        !          7637:        }
        !          7638: 
        !          7639:       /* Discard the type modifiers if they are invalid.  */
        !          7640:       if (! ok)
        !          7641:        {
        !          7642:          RIDBIT_RESET (RID_UNSIGNED, specbits);
        !          7643:          RIDBIT_RESET (RID_SIGNED, specbits);
        !          7644:          RIDBIT_RESET (RID_LONG, specbits);
        !          7645:          RIDBIT_RESET (RID_SHORT, specbits);
        !          7646:          longlong = 0;
        !          7647:        }
        !          7648:     }
        !          7649: 
        !          7650:   /* Decide whether an integer type is signed or not.
        !          7651:      Optionally treat bitfields as signed by default.  */
        !          7652:   if (RIDBIT_SETP (RID_UNSIGNED, specbits)
        !          7653:       /* Traditionally, all bitfields are unsigned.  */
        !          7654:       || (bitfield && flag_traditional)
        !          7655:       || (bitfield && ! flag_signed_bitfields
        !          7656:          && (explicit_int || explicit_char
        !          7657:              /* A typedef for plain `int' without `signed'
        !          7658:                 can be controlled just like plain `int'.  */
        !          7659:              || ! (typedef_decl != NULL_TREE
        !          7660:                    && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
        !          7661:          && TREE_CODE (type) != ENUMERAL_TYPE
        !          7662:          && RIDBIT_NOTSETP (RID_SIGNED, specbits)))
        !          7663:     {
        !          7664:       if (longlong)
        !          7665:        type = long_long_unsigned_type_node;
        !          7666:       else if (RIDBIT_SETP (RID_LONG, specbits))
        !          7667:        type = long_unsigned_type_node;
        !          7668:       else if (RIDBIT_SETP (RID_SHORT, specbits))
        !          7669:        type = short_unsigned_type_node;
        !          7670:       else if (type == char_type_node)
        !          7671:        type = unsigned_char_type_node;
        !          7672:       else if (typedef_decl)
        !          7673:        type = unsigned_type (type);
        !          7674:       else
        !          7675:        type = unsigned_type_node;
        !          7676:     }
        !          7677:   else if (RIDBIT_SETP (RID_SIGNED, specbits)
        !          7678:           && type == char_type_node)
        !          7679:     type = signed_char_type_node;
        !          7680:   else if (longlong)
        !          7681:     type = long_long_integer_type_node;
        !          7682:   else if (RIDBIT_SETP (RID_LONG, specbits))
        !          7683:     type = long_integer_type_node;
        !          7684:   else if (RIDBIT_SETP (RID_SHORT, specbits))
        !          7685:     type = short_integer_type_node;
        !          7686: 
        !          7687:   /* Set CONSTP if this declaration is `const', whether by
        !          7688:      explicit specification or via a typedef.
        !          7689:      Likewise for VOLATILEP.  */
        !          7690: 
        !          7691:   constp = !! RIDBIT_SETP (RID_CONST, specbits) + TYPE_READONLY (type);
        !          7692:   volatilep = !! RIDBIT_SETP (RID_VOLATILE, specbits) + TYPE_VOLATILE (type);
        !          7693:   staticp = 0;
        !          7694:   inlinep = !! RIDBIT_SETP (RID_INLINE, specbits);
        !          7695:   if (constp > 1)
        !          7696:     warning ("duplicate `const'");
        !          7697:   if (volatilep > 1)
        !          7698:     warning ("duplicate `volatile'");
        !          7699:   virtualp = RIDBIT_SETP (RID_VIRTUAL, specbits);
        !          7700:   if (RIDBIT_SETP (RID_STATIC, specbits))
        !          7701:     staticp = 1 + (decl_context == FIELD);
        !          7702: 
        !          7703:   if (virtualp && staticp == 2)
        !          7704:     {
        !          7705:       error ("member `%s' cannot be declared both virtual and static", name);
        !          7706:       staticp = 0;
        !          7707:     }
        !          7708:   friendp = RIDBIT_SETP (RID_FRIEND, specbits);
        !          7709:   RIDBIT_RESET (RID_VIRTUAL, specbits);
        !          7710:   RIDBIT_RESET (RID_FRIEND, specbits);
        !          7711: 
        !          7712:   if (RIDBIT_SETP (RID_MUTABLE, specbits))
        !          7713:     {
        !          7714:       if (decl_context == PARM)
        !          7715:        {
        !          7716:          error ("non-member `%s' cannot be declared mutable", name);
        !          7717:          RIDBIT_RESET (RID_MUTABLE, specbits);
        !          7718:        }
        !          7719:       else if (friendp || decl_context == TYPENAME)
        !          7720:        {
        !          7721:          error ("non-object member `%s' cannot be declared mutable", name);
        !          7722:          RIDBIT_RESET (RID_MUTABLE, specbits);
        !          7723:        }
        !          7724:       else if (staticp)
        !          7725:        {
        !          7726:          error ("static `%s' cannot be declared mutable", name);
        !          7727:          RIDBIT_RESET (RID_MUTABLE, specbits);
        !          7728:        }
        !          7729: #if 0
        !          7730:       if (RIDBIT_SETP (RID_TYPEDEF, specbits))
        !          7731:        {
        !          7732:          error ("non-object member `%s' cannot be declared mutable", name);
        !          7733:          RIDBIT_RESET (RID_MUTABLE, specbits);
        !          7734:        }
        !          7735:       /* Because local typedefs are parsed twice, we don't want this
        !          7736:         message here. */
        !          7737:       else if (decl_context != FIELD)
        !          7738:        {
        !          7739:          error ("non-member `%s' cannot be declared mutable", name);
        !          7740:          RIDBIT_RESET (RID_MUTABLE, specbits);
        !          7741:        }
        !          7742: #endif
        !          7743:     }
        !          7744: 
        !          7745:   /* Warn if two storage classes are given. Default to `auto'.  */
        !          7746: 
        !          7747:   if (RIDBIT_ANY_SET (specbits))
        !          7748:     {
        !          7749:       if (RIDBIT_SETP (RID_STATIC, specbits)) nclasses++;
        !          7750:       if (RIDBIT_SETP (RID_EXTERN, specbits)) nclasses++;
        !          7751:       if (decl_context == PARM && nclasses > 0)
        !          7752:        error ("storage class specifiers invalid in parameter declarations");
        !          7753:       if (RIDBIT_SETP (RID_TYPEDEF, specbits))
        !          7754:        {
        !          7755:          if (decl_context == PARM)
        !          7756:            error ("typedef declaration invalid in parameter declaration");
        !          7757:          nclasses++;
        !          7758:        }
        !          7759:       if (RIDBIT_SETP (RID_AUTO, specbits)) nclasses++;
        !          7760:       if (RIDBIT_SETP (RID_REGISTER, specbits)) nclasses++;
        !          7761:     }
        !          7762: 
        !          7763:   /* Give error if `virtual' is used outside of class declaration.  */
        !          7764:   if (virtualp && current_class_name == NULL_TREE)
        !          7765:     {
        !          7766:       error ("virtual outside class declaration");
        !          7767:       virtualp = 0;
        !          7768:     }
        !          7769:   if (current_class_name == NULL_TREE && RIDBIT_SETP (RID_MUTABLE, specbits))
        !          7770:     {
        !          7771:       error ("only members can be declared mutable");
        !          7772:       RIDBIT_RESET (RID_MUTABLE, specbits);
        !          7773:     }
        !          7774: 
        !          7775:   /* Static anonymous unions are dealt with here.  */
        !          7776:   if (staticp && decl_context == TYPENAME
        !          7777:       && TREE_CODE (declspecs) == TREE_LIST
        !          7778:       && TREE_CODE (TREE_VALUE (declspecs)) == UNION_TYPE
        !          7779:       && ANON_AGGRNAME_P (TYPE_IDENTIFIER (TREE_VALUE (declspecs))))
        !          7780:     decl_context = FIELD;
        !          7781: 
        !          7782:   /* Warn about storage classes that are invalid for certain
        !          7783:      kinds of declarations (parameters, typenames, etc.).  */
        !          7784: 
        !          7785:   if (nclasses > 1)
        !          7786:     error ("multiple storage classes in declaration of `%s'", name);
        !          7787:   else if (decl_context != NORMAL && nclasses > 0)
        !          7788:     {
        !          7789:       if (decl_context == PARM
        !          7790:          && (RIDBIT_SETP (RID_REGISTER, specbits)
        !          7791:              || RIDBIT_SETP (RID_AUTO, specbits)))
        !          7792:        ;
        !          7793:       else if (decl_context == FIELD
        !          7794:               && RIDBIT_SETP (RID_TYPEDEF, specbits))
        !          7795:        {
        !          7796:          /* Processing a typedef declaration nested within a class type
        !          7797:             definition.  */
        !          7798:          register tree scanner;
        !          7799:          register tree previous_declspec;
        !          7800:          tree loc_typedecl;
        !          7801:   
        !          7802:          if (initialized)
        !          7803:            error ("typedef declaration includes an initializer");
        !          7804:   
        !          7805:          /* To process a class-local typedef declaration, we descend down
        !          7806:             the chain of declspecs looking for the `typedef' spec.  When we
        !          7807:             find it, we splice it out of the chain of declspecs, and then
        !          7808:             recursively call `grokdeclarator' with the original declarator
        !          7809:             and with the newly adjusted declspecs.  This call should return
        !          7810:             a FIELD_DECL node with the TREE_TYPE (and other parts) set
        !          7811:             appropriately.  We can then just change the TREE_CODE on that
        !          7812:             from FIELD_DECL to TYPE_DECL and we're done.  */
        !          7813: 
        !          7814:          for (previous_declspec = NULL_TREE, scanner = declspecs;
        !          7815:               scanner;
        !          7816:               previous_declspec = scanner, scanner = TREE_CHAIN (scanner))
        !          7817:            {
        !          7818:              if (TREE_VALUE (scanner) == ridpointers[(int) RID_TYPEDEF])
        !          7819:                break;
        !          7820:            }
        !          7821:          if (previous_declspec)
        !          7822:            TREE_CHAIN (previous_declspec) = TREE_CHAIN (scanner);
        !          7823:          else
        !          7824:            declspecs = TREE_CHAIN (scanner);
        !          7825:   
        !          7826:          loc_typedecl =
        !          7827:            grokdeclarator (declarator, declspecs, FIELD, 0, NULL_TREE);
        !          7828:   
        !          7829:          if (loc_typedecl != error_mark_node)
        !          7830:            {
        !          7831:              register int i = sizeof (struct lang_decl_flags) / sizeof (int);
        !          7832:              register int *pi;
        !          7833:   
        !          7834:              TREE_SET_CODE (loc_typedecl, TYPE_DECL);
        !          7835:   
        !          7836:              pi = (int *) permalloc (sizeof (struct lang_decl_flags));
        !          7837:              while (i > 0)
        !          7838:                pi[--i] = 0;
        !          7839:              DECL_LANG_SPECIFIC (loc_typedecl) = (struct lang_decl *) pi;
        !          7840:            }
        !          7841:   
        !          7842:          return loc_typedecl;
        !          7843:        }
        !          7844:       else if (decl_context == FIELD
        !          7845:               /* C++ allows static class elements  */
        !          7846:               && RIDBIT_SETP (RID_STATIC, specbits))
        !          7847:        /* C++ also allows inlines and signed and unsigned elements,
        !          7848:           but in those cases we don't come in here.  */
        !          7849:        ;
        !          7850:       else
        !          7851:        {
        !          7852:          if (decl_context == FIELD)
        !          7853:            {
        !          7854:              tree tmp = TREE_OPERAND (declarator, 0);
        !          7855:              register int op = IDENTIFIER_OPNAME_P (tmp);
        !          7856:              error ("storage class specified for %s `%s'",
        !          7857:                     op ? "member operator" : "structure field",
        !          7858:                     op ? operator_name_string (tmp) : name);
        !          7859:            }
        !          7860:          else
        !          7861:            error ((decl_context == PARM
        !          7862:                    ? "storage class specified for parameter `%s'"
        !          7863:                    : "storage class specified for typename"), name);
        !          7864:          RIDBIT_RESET (RID_REGISTER, specbits);
        !          7865:          RIDBIT_RESET (RID_AUTO, specbits);
        !          7866:          RIDBIT_RESET (RID_EXTERN, specbits);
        !          7867:        }
        !          7868:     }
        !          7869:   else if (RIDBIT_SETP (RID_EXTERN, specbits) && initialized && !funcdef_flag)
        !          7870:     {
        !          7871:       if (current_binding_level == global_binding_level)
        !          7872:        {
        !          7873:          /* It's common practice (and completely legal) to have a const
        !          7874:             be initialized and declared extern.  */
        !          7875:          if (! constp)
        !          7876:            warning ("`%s' initialized and declared `extern'", name);
        !          7877:        }
        !          7878:       else
        !          7879:        error ("`%s' has both `extern' and initializer", name);
        !          7880:     }
        !          7881:   else if (RIDBIT_SETP (RID_EXTERN, specbits) && funcdef_flag
        !          7882:           && current_binding_level != global_binding_level)
        !          7883:     error ("nested function `%s' declared `extern'", name);
        !          7884:   else if (current_binding_level == global_binding_level)
        !          7885:     {
        !          7886:       if (RIDBIT_SETP (RID_AUTO, specbits))
        !          7887:        error ("top-level declaration of `%s' specifies `auto'", name);
        !          7888: #if 0
        !          7889:       if (RIDBIT_SETP (RID_REGISTER, specbits))
        !          7890:        error ("top-level declaration of `%s' specifies `register'", name);
        !          7891: #endif
        !          7892: #if 0
        !          7893:       /* I'm not sure under what circumstances we should turn
        !          7894:         on the extern bit, and under what circumstances we should
        !          7895:         warn if other bits are turned on.  */
        !          7896:       if (decl_context == NORMAL
        !          7897:          && RIDBIT_NOSETP (RID_EXTERN, specbits)
        !          7898:          && ! root_lang_context_p ())
        !          7899:        {
        !          7900:          RIDBIT_SET (RID_EXTERN, specbits);
        !          7901:        }
        !          7902: #endif
        !          7903:     }
        !          7904: 
        !          7905:   /* Now figure out the structure of the declarator proper.
        !          7906:      Descend through it, creating more complex types, until we reach
        !          7907:      the declared identifier (or NULL_TREE, in an absolute declarator).  */
        !          7908: 
        !          7909:   while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE)
        !          7910:     {
        !          7911:       /* Each level of DECLARATOR is either an ARRAY_REF (for ...[..]),
        !          7912:         an INDIRECT_REF (for *...),
        !          7913:         a CALL_EXPR (for ...(...)),
        !          7914:         an identifier (for the name being declared)
        !          7915:         or a null pointer (for the place in an absolute declarator
        !          7916:         where the name was omitted).
        !          7917:         For the last two cases, we have just exited the loop.
        !          7918: 
        !          7919:         For C++ it could also be
        !          7920:         a SCOPE_REF (for class :: ...).  In this case, we have converted
        !          7921:         sensible names to types, and those are the values we use to
        !          7922:         qualify the member name.
        !          7923:         an ADDR_EXPR (for &...),
        !          7924:         a BIT_NOT_EXPR (for destructors)
        !          7925:         a TYPE_EXPR (for operator typenames)
        !          7926: 
        !          7927:         At this point, TYPE is the type of elements of an array,
        !          7928:         or for a function to return, or for a pointer to point to.
        !          7929:         After this sequence of ifs, TYPE is the type of the
        !          7930:         array or function or pointer, and DECLARATOR has had its
        !          7931:         outermost layer removed.  */
        !          7932: 
        !          7933:       if (TREE_CODE (type) == ERROR_MARK)
        !          7934:        {
        !          7935:          if (TREE_CODE (declarator) == SCOPE_REF)
        !          7936:            declarator = TREE_OPERAND (declarator, 1);
        !          7937:          else
        !          7938:            declarator = TREE_OPERAND (declarator, 0);
        !          7939:          continue;
        !          7940:        }
        !          7941:       if (quals != NULL_TREE
        !          7942:          && (declarator == NULL_TREE
        !          7943:              || TREE_CODE (declarator) != SCOPE_REF))
        !          7944:        {
        !          7945:          if (ctype == NULL_TREE && TREE_CODE (type) == METHOD_TYPE)
        !          7946:            ctype = TYPE_METHOD_BASETYPE (type);
        !          7947:          if (ctype != NULL_TREE)
        !          7948:            {
        !          7949: #if 0 /* not yet, should get fixed properly later */
        !          7950:              tree dummy = make_type_decl (NULL_TREE, type);
        !          7951: #else
        !          7952:              tree dummy = build_decl (TYPE_DECL, NULL_TREE, type);
        !          7953: #endif
        !          7954:              ctype = grok_method_quals (ctype, dummy, quals);
        !          7955:              type = TREE_TYPE (dummy);
        !          7956:              quals = NULL_TREE;
        !          7957:            }
        !          7958:        }
        !          7959:       switch (TREE_CODE (declarator))
        !          7960:        {
        !          7961:        case ARRAY_REF:
        !          7962:          maybe_globalize_type (type);
        !          7963:          {
        !          7964:            register tree itype = NULL_TREE;
        !          7965:            register tree size = TREE_OPERAND (declarator, 1);
        !          7966: 
        !          7967:            declarator = TREE_OPERAND (declarator, 0);
        !          7968: 
        !          7969:            /* Check for some types that there cannot be arrays of.  */
        !          7970: 
        !          7971:            if (TYPE_MAIN_VARIANT (type) == void_type_node)
        !          7972:              {
        !          7973:                cp_error ("declaration of `%D' as array of voids", dname);
        !          7974:                type = error_mark_node;
        !          7975:              }
        !          7976: 
        !          7977:            if (TREE_CODE (type) == FUNCTION_TYPE)
        !          7978:              {
        !          7979:                cp_error ("declaration of `%D' as array of functions", dname);
        !          7980:                type = error_mark_node;
        !          7981:              }
        !          7982: 
        !          7983:            /* ARM $8.4.3: Since you can't have a pointer to a reference,
        !          7984:               you can't have arrays of references.  If we allowed them,
        !          7985:               then we'd be saying x[i] is legal for an array x, but
        !          7986:               then you'd have to ask: what does `*(x + i)' mean?  */
        !          7987:            if (TREE_CODE (type) == REFERENCE_TYPE)
        !          7988:              {
        !          7989:                cp_error ("declaration of `%D' as array of references", dname);
        !          7990:                type = error_mark_node;
        !          7991:              }
        !          7992: 
        !          7993:            if (TREE_CODE (type) == OFFSET_TYPE)
        !          7994:              {
        !          7995:                cp_error ("declaration of `%D' as array of data members",
        !          7996:                          dname);
        !          7997:                type = error_mark_node;
        !          7998:              }
        !          7999: 
        !          8000:            if (TREE_CODE (type) == METHOD_TYPE)
        !          8001:              {
        !          8002:                cp_error ("declaration of `%D' as array of function members",
        !          8003:                       dname);
        !          8004:                type = error_mark_node;
        !          8005:              }
        !          8006: 
        !          8007:            if (size == error_mark_node)
        !          8008:              type = error_mark_node;
        !          8009: 
        !          8010:            if (type == error_mark_node)
        !          8011:              continue;
        !          8012: 
        !          8013:            if (size)
        !          8014:              {
        !          8015:                /* Must suspend_momentary here because the index
        !          8016:                   type may need to live until the end of the function.
        !          8017:                   For example, it is used in the declaration of a
        !          8018:                   variable which requires destructing at the end of
        !          8019:                   the function; then build_vec_delete will need this
        !          8020:                   value.  */
        !          8021:                int yes = suspend_momentary ();
        !          8022:                /* might be a cast */
        !          8023:                if (TREE_CODE (size) == NOP_EXPR
        !          8024:                    && TREE_TYPE (size) == TREE_TYPE (TREE_OPERAND (size, 0)))
        !          8025:                  size = TREE_OPERAND (size, 0);
        !          8026: 
        !          8027:                /* If this is a template parameter, it'll be constant, but
        !          8028:                   we don't know what the value is yet.  */
        !          8029:                if (TREE_CODE (size) == TEMPLATE_CONST_PARM)
        !          8030:                  goto dont_grok_size;
        !          8031: 
        !          8032:                if (TREE_CODE (TREE_TYPE (size)) != INTEGER_TYPE
        !          8033:                    && TREE_CODE (TREE_TYPE (size)) != ENUMERAL_TYPE)
        !          8034:                  {
        !          8035:                    cp_error ("size of array `%D' has non-integer type",
        !          8036:                              dname);
        !          8037:                    size = integer_one_node;
        !          8038:                  }
        !          8039:                if (TREE_READONLY_DECL_P (size))
        !          8040:                  size = decl_constant_value (size);
        !          8041:                if (pedantic && integer_zerop (size))
        !          8042:                  cp_pedwarn ("ANSI C++ forbids zero-size array `%D'", dname);
        !          8043:                if (TREE_CONSTANT (size))
        !          8044:                  {
        !          8045:                    constant_expression_warning (size);
        !          8046:                    if (INT_CST_LT (size, integer_zero_node))
        !          8047:                      {
        !          8048:                        cp_error ("size of array `%D' is negative", dname);
        !          8049:                        size = integer_one_node;
        !          8050:                      }
        !          8051:                    itype = build_index_type (size_binop (MINUS_EXPR, size,
        !          8052:                                                          integer_one_node));
        !          8053:                  }
        !          8054:                else
        !          8055:                  {
        !          8056:                    if (pedantic)
        !          8057:                      cp_pedwarn ("ANSI C++ forbids variable-size array `%D'", dname);
        !          8058:                  dont_grok_size:
        !          8059:                    itype =
        !          8060:                      build_binary_op (MINUS_EXPR, size, integer_one_node, 1);
        !          8061:                    /* Make sure the array size remains visibly nonconstant
        !          8062:                       even if it is (eg) a const variable with known value.  */
        !          8063:                    size_varies = 1;
        !          8064:                    itype = variable_size (itype);
        !          8065:                    itype = build_index_type (itype);
        !          8066:                  }
        !          8067:                resume_momentary (yes);
        !          8068:              }
        !          8069: 
        !          8070:          /* Build the array type itself, then merge any constancy or
        !          8071:             volatility into the target type.  We must do it in this order
        !          8072:             to ensure that the TYPE_MAIN_VARIANT field of the array type
        !          8073:             is set correctly.  */
        !          8074: 
        !          8075:            type = build_cplus_array_type (type, itype);
        !          8076:            if (constp || volatilep)
        !          8077:              type = build_type_variant (type, constp, volatilep);
        !          8078: 
        !          8079:            ctype = NULL_TREE;
        !          8080:          }
        !          8081:          break;
        !          8082: 
        !          8083:        case CALL_EXPR:
        !          8084:          maybe_globalize_type (type);
        !          8085:          {
        !          8086:            tree arg_types;
        !          8087: 
        !          8088:            /* Declaring a function type.
        !          8089:               Make sure we have a valid type for the function to return.  */
        !          8090: #if 0
        !          8091:            /* Is this an error?  Should they be merged into TYPE here?  */
        !          8092:            if (pedantic && (constp || volatilep))
        !          8093:              pedwarn ("function declared to return const or volatile result");
        !          8094: #else
        !          8095:            /* Merge any constancy or volatility into the target type
        !          8096:               for the pointer.  */
        !          8097: 
        !          8098:            if (constp || volatilep)
        !          8099:              {
        !          8100:                type = build_type_variant (type, constp, volatilep);
        !          8101:                if (IS_AGGR_TYPE (type))
        !          8102:                  build_pointer_type (type);
        !          8103:                constp = 0;
        !          8104:                volatilep = 0;
        !          8105:              }
        !          8106: #endif
        !          8107: 
        !          8108:            /* Warn about some types functions can't return.  */
        !          8109: 
        !          8110:            if (TREE_CODE (type) == FUNCTION_TYPE)
        !          8111:              {
        !          8112:                error ("`%s' declared as function returning a function", name);
        !          8113:                type = integer_type_node;
        !          8114:              }
        !          8115:            if (TREE_CODE (type) == ARRAY_TYPE)
        !          8116:              {
        !          8117:                error ("`%s' declared as function returning an array", name);
        !          8118:                type = integer_type_node;
        !          8119:              }
        !          8120: 
        !          8121:            if (ctype == NULL_TREE
        !          8122:                && decl_context == FIELD
        !          8123:                && (friendp == 0 || dname == current_class_name))
        !          8124:              ctype = current_class_type;
        !          8125: 
        !          8126:            if (ctype && flags == TYPENAME_FLAG)
        !          8127:              TYPE_HAS_CONVERSION (ctype) = 1;
        !          8128:            if (ctype && constructor_name (ctype) == dname)
        !          8129:              {
        !          8130:                /* We are within a class's scope. If our declarator name
        !          8131:                   is the same as the class name, and we are defining
        !          8132:                   a function, then it is a constructor/destructor, and
        !          8133:                   therefore returns a void type.  */
        !          8134: 
        !          8135:                if (flags == DTOR_FLAG)
        !          8136:                  {
        !          8137:                    /* ANSI C++ June 5 1992 WP 12.4.1.  A destructor may
        !          8138:                       not be declared const or volatile.  A destructor
        !          8139:                       may not be static.  */
        !          8140:                    if (staticp == 2)
        !          8141:                      error ("destructor cannot be static member function");
        !          8142:                    if (TYPE_READONLY (type))
        !          8143:                      {
        !          8144:                        error ("destructors cannot be declared `const'");
        !          8145:                        return void_type_node;
        !          8146:                      }
        !          8147:                    if (TYPE_VOLATILE (type))
        !          8148:                      {
        !          8149:                        error ("destructors cannot be declared `volatile'");
        !          8150:                        return void_type_node;
        !          8151:                      }
        !          8152:                    if (decl_context == FIELD)
        !          8153:                      {
        !          8154:                        if (! member_function_or_else (ctype, current_class_type,
        !          8155:                                                       "destructor for alien class `%s' cannot be a member"))
        !          8156:                          return void_type_node;
        !          8157:                      }
        !          8158:                  }
        !          8159:                else            /* it's a constructor. */
        !          8160:                  {
        !          8161:                    /* ANSI C++ June 5 1992 WP 12.1.2.  A constructor may
        !          8162:                       not be declared const or volatile.  A constructor may
        !          8163:                       not be virtual.  A constructor may not be static.  */
        !          8164:                    if (staticp == 2)
        !          8165:                      error ("constructor cannot be static member function");
        !          8166:                    if (virtualp)
        !          8167:                      {
        !          8168:                        pedwarn ("constructors cannot be declared virtual");
        !          8169:                        virtualp = 0;
        !          8170:                      }
        !          8171:                    if (TYPE_READONLY (type))
        !          8172:                      {
        !          8173:                        error ("constructors cannot be declared `const'");
        !          8174:                        return void_type_node;
        !          8175:                      }
        !          8176:                    if (TYPE_VOLATILE (type))
        !          8177:                      {
        !          8178:                        error ("constructors cannot be declared `volatile'");
        !          8179:                        return void_type_node;
        !          8180:                      }
        !          8181:                    {
        !          8182:                      int inlinep, staticp;
        !          8183:                      inlinep = RIDBIT_SETP (RID_INLINE, specbits);
        !          8184:                      staticp = RIDBIT_SETP (RID_STATIC, specbits);
        !          8185:                      RIDBIT_RESET (RID_INLINE, specbits);
        !          8186:                      RIDBIT_RESET (RID_STATIC, specbits);
        !          8187:                      if (RIDBIT_ANY_SET (specbits))
        !          8188:                        error ("return value type specifier for constructor ignored");
        !          8189:                      if (inlinep)
        !          8190:                        RIDBIT_SET (RID_INLINE, specbits);
        !          8191:                      if (staticp)
        !          8192:                        RIDBIT_SET (RID_STATIC, specbits);
        !          8193:                    }
        !          8194:                    type = TYPE_POINTER_TO (ctype);
        !          8195:                    if (decl_context == FIELD)
        !          8196:                      {
        !          8197:                        if (! member_function_or_else (ctype, current_class_type,
        !          8198:                                                       "constructor for alien class `%s' cannot be member"))
        !          8199:                          return void_type_node;
        !          8200:                        TYPE_HAS_CONSTRUCTOR (ctype) = 1;
        !          8201:                        if (return_type != return_ctor)
        !          8202:                          return NULL_TREE;
        !          8203:                      }
        !          8204:                  }
        !          8205:                if (decl_context == FIELD)
        !          8206:                  staticp = 0;
        !          8207:              }
        !          8208:            else if (friendp && virtualp)
        !          8209:              {
        !          8210:                /* Cannot be both friend and virtual.  */
        !          8211:                error ("virtual functions cannot be friends");
        !          8212:                RIDBIT_RESET (RID_FRIEND, specbits);
        !          8213:              }
        !          8214: 
        !          8215:            if (decl_context == NORMAL && friendp)
        !          8216:              error ("friend declaration not in class definition");
        !          8217: 
        !          8218:            /* Pick up type qualifiers which should be applied to `this'.  */
        !          8219:            quals = TREE_OPERAND (declarator, 2);
        !          8220: 
        !          8221:            /* Traditionally, declaring return type float means double.  */
        !          8222: 
        !          8223:            if (flag_traditional
        !          8224:                && TYPE_MAIN_VARIANT (type) == float_type_node)
        !          8225:              {
        !          8226:                type = build_type_variant (double_type_node,
        !          8227:                                           TYPE_READONLY (type),
        !          8228:                                           TYPE_VOLATILE (type));
        !          8229:              }
        !          8230: 
        !          8231:            /* Construct the function type and go to the next
        !          8232:               inner layer of declarator.  */
        !          8233: 
        !          8234:            {
        !          8235:              int funcdef_p;
        !          8236:              tree inner_parms = TREE_OPERAND (declarator, 1);
        !          8237:              tree inner_decl = TREE_OPERAND (declarator, 0);
        !          8238: 
        !          8239:              declarator = TREE_OPERAND (declarator, 0);
        !          8240: 
        !          8241:              if (inner_decl && TREE_CODE (inner_decl) == SCOPE_REF)
        !          8242:                inner_decl = TREE_OPERAND (inner_decl, 1);
        !          8243: 
        !          8244:              /* Say it's a definition only for the CALL_EXPR
        !          8245:                 closest to the identifier.  */
        !          8246:              funcdef_p =
        !          8247:                (inner_decl &&
        !          8248:                 (TREE_CODE (inner_decl) == IDENTIFIER_NODE
        !          8249:                  || TREE_CODE (inner_decl) == TYPE_EXPR)) ? funcdef_flag : 0;
        !          8250: 
        !          8251:              /* FIXME: This is where default args should be fully processed.  */
        !          8252: 
        !          8253:              arg_types = grokparms (inner_parms, funcdef_p);
        !          8254:            }
        !          8255: 
        !          8256:            if (declarator)
        !          8257:              {
        !          8258:                /* Get past destructors, etc.
        !          8259:                   We know we have one because FLAGS will be non-zero.
        !          8260: 
        !          8261:                   Complain about improper parameter lists here.  */
        !          8262:                if (TREE_CODE (declarator) == BIT_NOT_EXPR)
        !          8263:                  {
        !          8264:                    declarator = TREE_OPERAND (declarator, 0);
        !          8265: 
        !          8266:                    if (strict_prototype == 0 && arg_types == NULL_TREE)
        !          8267:                      arg_types = void_list_node;
        !          8268:                    else if (arg_types == NULL_TREE
        !          8269:                             || arg_types != void_list_node)
        !          8270:                      {
        !          8271:                        error ("destructors cannot be specified with parameters");
        !          8272:                        arg_types = void_list_node;
        !          8273:                      }
        !          8274:                  }
        !          8275:              }
        !          8276:            /* the top level const or volatile is attached semantically only
        !          8277:               to the function not the actual type. */
        !          8278:            if (TYPE_READONLY (type) || TYPE_VOLATILE (type))
        !          8279:              {
        !          8280:                int constp = TYPE_READONLY (type);
        !          8281:                int volatilep = TYPE_VOLATILE (type);
        !          8282:                type = build_function_type (TYPE_MAIN_VARIANT (type),
        !          8283:                                            flag_traditional
        !          8284:                                            ? 0
        !          8285:                                            : arg_types);
        !          8286:                type = build_type_variant (type, constp, volatilep);
        !          8287:              }
        !          8288:            else
        !          8289:              type = build_function_type (type,
        !          8290:                                          flag_traditional
        !          8291:                                          ? 0
        !          8292:                                          : arg_types);
        !          8293:          }
        !          8294:          break;
        !          8295: 
        !          8296:        case ADDR_EXPR:
        !          8297:        case INDIRECT_REF:
        !          8298:          maybe_globalize_type (type);
        !          8299: 
        !          8300:          /* Filter out pointers-to-references and references-to-references.
        !          8301:             We can get these if a TYPE_DECL is used.  */
        !          8302: 
        !          8303:          if (TREE_CODE (type) == REFERENCE_TYPE)
        !          8304:            {
        !          8305:              error ("cannot declare %s to references",
        !          8306:                     TREE_CODE (declarator) == ADDR_EXPR
        !          8307:                     ? "references" : "pointers");
        !          8308:              declarator = TREE_OPERAND (declarator, 0);
        !          8309:              continue;
        !          8310:            }
        !          8311: 
        !          8312:          /* Merge any constancy or volatility into the target type
        !          8313:             for the pointer.  */
        !          8314: 
        !          8315:          if (constp || volatilep)
        !          8316:            {
        !          8317:              type = build_type_variant (type, constp, volatilep);
        !          8318:              if (IS_AGGR_TYPE (type))
        !          8319:                build_pointer_type (type);
        !          8320:              constp = 0;
        !          8321:              volatilep = 0;
        !          8322:            }
        !          8323: 
        !          8324:          if (TREE_CODE (declarator) == ADDR_EXPR)
        !          8325:            {
        !          8326:              if (TREE_CODE (type) == FUNCTION_TYPE)
        !          8327:                {
        !          8328:                  error ("cannot declare references to functions; use pointer to function instead");
        !          8329:                  type = build_pointer_type (type);
        !          8330:                }
        !          8331:              else
        !          8332:                {
        !          8333:                  if (TYPE_MAIN_VARIANT (type) == void_type_node)
        !          8334:                    error ("invalid type: `void &'");
        !          8335:                  else
        !          8336:                    type = build_reference_type (type);
        !          8337:                }
        !          8338:            }
        !          8339:          else if (TREE_CODE (type) == METHOD_TYPE)
        !          8340:            {
        !          8341:              type = build_ptrmemfunc_type (build_pointer_type (type));
        !          8342:            }
        !          8343:          else
        !          8344:            type = build_pointer_type (type);
        !          8345: 
        !          8346:          /* Process a list of type modifier keywords (such as
        !          8347:             const or volatile) that were given inside the `*' or `&'.  */
        !          8348: 
        !          8349:          if (TREE_TYPE (declarator))
        !          8350:            {
        !          8351:              register tree typemodlist;
        !          8352:              int erred = 0;
        !          8353:              for (typemodlist = TREE_TYPE (declarator); typemodlist;
        !          8354:                   typemodlist = TREE_CHAIN (typemodlist))
        !          8355:                {
        !          8356:                  if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_CONST])
        !          8357:                    constp++;
        !          8358:                  else if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_VOLATILE])
        !          8359:                    volatilep++;
        !          8360:                  else if (!erred)
        !          8361:                    {
        !          8362:                      erred = 1;
        !          8363:                      error ("invalid type modifier within %s declarator",
        !          8364:                             TREE_CODE (declarator) == ADDR_EXPR
        !          8365:                             ? "reference" : "pointer");
        !          8366:                    }
        !          8367:                }
        !          8368:              if (constp > 1)
        !          8369:                warning ("duplicate `const'");
        !          8370:              if (volatilep > 1)
        !          8371:                warning ("duplicate `volatile'");
        !          8372:            }
        !          8373:          declarator = TREE_OPERAND (declarator, 0);
        !          8374:          ctype = NULL_TREE;
        !          8375:          break;
        !          8376: 
        !          8377:        case SCOPE_REF:
        !          8378:          {
        !          8379:            /* We have converted type names to NULL_TREE if the
        !          8380:               name was bogus, or to a _TYPE node, if not.
        !          8381: 
        !          8382:               The variable CTYPE holds the type we will ultimately
        !          8383:               resolve to.  The code here just needs to build
        !          8384:               up appropriate member types.  */
        !          8385:            tree sname = TREE_OPERAND (declarator, 1);
        !          8386:            /* Destructors can have their visibilities changed as well.  */
        !          8387:            if (TREE_CODE (sname) == BIT_NOT_EXPR)
        !          8388:              sname = TREE_OPERAND (sname, 0);
        !          8389: 
        !          8390:            if (TREE_COMPLEXITY (declarator) == 0)
        !          8391:              /* This needs to be here, in case we are called
        !          8392:                 multiple times.  */ ;
        !          8393:            else if (friendp && (TREE_COMPLEXITY (declarator) < 2))
        !          8394:              /* don't fall out into global scope. Hides real bug? --eichin */ ;
        !          8395:            else if (TREE_COMPLEXITY (declarator) == current_class_depth)
        !          8396:              {
        !          8397:                /* I'm not really sure what pushclass calls this popclass
        !          8398:                   corresponds to.  One is in build_push_scope and that has
        !          8399:                   been changed to a push_nested_class call, that's why I
        !          8400:                   try to use pop_nested_class here instead.
        !          8401:                   [email protected] */
        !          8402: #if NEW_CLASS_SCOPING
        !          8403:                pop_nested_class (1);
        !          8404:                TREE_COMPLEXITY (declarator) = current_class_depth;
        !          8405: #else
        !          8406:                TREE_COMPLEXITY (declarator) -= 1;
        !          8407:                /* This popclass conflicts with the poplevel over in
        !          8408:                   grokdeclarator.  See ``This poplevel conflicts'' */
        !          8409:                popclass (1);
        !          8410: #endif
        !          8411:              }
        !          8412:            else
        !          8413:              my_friendly_abort (16);
        !          8414: 
        !          8415:            if (TREE_OPERAND (declarator, 0) == NULL_TREE)
        !          8416:              {
        !          8417:                /* We had a reference to a global decl, or
        !          8418:                   perhaps we were given a non-aggregate typedef,
        !          8419:                   in which case we cleared this out, and should just
        !          8420:                   keep going as though it wasn't there.  */
        !          8421:                declarator = sname;
        !          8422:                continue;
        !          8423:              }
        !          8424:            ctype = TREE_OPERAND (declarator, 0);
        !          8425: 
        !          8426:            if (sname == NULL_TREE)
        !          8427:              goto done_scoping;
        !          8428: 
        !          8429:            if (TREE_CODE (sname) == IDENTIFIER_NODE)
        !          8430:              {
        !          8431:                /* This is the `standard' use of the scoping operator:
        !          8432:                   basetype :: member .  */
        !          8433: 
        !          8434:                if (TREE_CODE (type) == FUNCTION_TYPE)
        !          8435:                  {
        !          8436:                    if (current_class_type == NULL_TREE
        !          8437:                        || TYPE_MAIN_VARIANT (ctype) == current_class_type
        !          8438:                        || friendp)
        !          8439:                      type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep),
        !          8440:                                                      TREE_TYPE (type), TYPE_ARG_TYPES (type));
        !          8441:                    else
        !          8442:                      {
        !          8443:                        error ("cannot declare member function `%s::%s' within this class",
        !          8444:                               TYPE_NAME_STRING (ctype), name);
        !          8445:                        return void_type_node;
        !          8446:                      }
        !          8447:                  }
        !          8448:                else if (TYPE_MAIN_VARIANT (ctype) == current_class_type)
        !          8449:                  {
        !          8450:                    if (extra_warnings)
        !          8451:                      warning ("extra qualification `%s' on member `%s' ignored",
        !          8452:                               TYPE_NAME_STRING (ctype), name);
        !          8453:                    type = build_offset_type (ctype, type);
        !          8454:                  }
        !          8455:                else if (TYPE_SIZE (ctype) != NULL_TREE
        !          8456:                         || (RIDBIT_SETP (RID_TYPEDEF, specbits)))
        !          8457:                  {
        !          8458:                    tree t;
        !          8459:                    /* have to move this code elsewhere in this function.
        !          8460:                       this code is used for i.e., typedef int A::M; M *pm; */
        !          8461: 
        !          8462:                    if (explicit_int == -1 && decl_context == FIELD
        !          8463:                        && funcdef_flag == 0)
        !          8464:                      {
        !          8465:                        /* The code in here should only be used to build
        !          8466:                           stuff that will be grokked as visibility decls.  */
        !          8467:                        t = lookup_field (ctype, sname, 0, 0);
        !          8468:                        if (t)
        !          8469:                          {
        !          8470:                            t = build_lang_field_decl (FIELD_DECL, build_nt (SCOPE_REF, ctype, t), type);
        !          8471:                            DECL_INITIAL (t) = init;
        !          8472:                            return t;
        !          8473:                          }
        !          8474:                        /* No such field, try member functions.  */
        !          8475:                        t = lookup_fnfields (TYPE_BINFO (ctype), sname, 0);
        !          8476:                        if (t)
        !          8477:                          {
        !          8478:                            if (flags == DTOR_FLAG)
        !          8479:                              t = TREE_VALUE (t);
        !          8480:                            else if (CLASSTYPE_METHOD_VEC (ctype)
        !          8481:                                     && TREE_VALUE (t) == TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (ctype), 0))
        !          8482:                              {
        !          8483:                                /* Don't include destructor with constructors.  */
        !          8484:                                t = DECL_CHAIN (TREE_VALUE (t));
        !          8485:                                if (t == NULL_TREE)
        !          8486:                                  error ("class `%s' does not have any constructors", IDENTIFIER_POINTER (sname));
        !          8487:                                t = build_tree_list (NULL_TREE, t);
        !          8488:                              }
        !          8489:                            t = build_lang_field_decl (FIELD_DECL, build_nt (SCOPE_REF, ctype, t), type);
        !          8490:                            DECL_INITIAL (t) = init;
        !          8491:                            return t;
        !          8492:                          }
        !          8493: 
        !          8494:                        if (flags == TYPENAME_FLAG)
        !          8495:                          cp_error ("type conversion is not a member of structure `%T'", ctype);
        !          8496:                        else
        !          8497:                          cp_error
        !          8498:                            ("field `%D' is not a member of structure `%T'",
        !          8499:                             sname, ctype);
        !          8500:                      }
        !          8501: 
        !          8502:                    if (current_class_type)
        !          8503:                      {
        !          8504:                        if (TYPE_MAIN_VARIANT (ctype) != current_class_type)
        !          8505:                          {
        !          8506:                            cp_error ("cannot declare member `%T::%s' within `%T'",
        !          8507:                                   ctype, name, current_class_type);
        !          8508:                            return void_type_node;
        !          8509:                          }
        !          8510:                        else if (extra_warnings)
        !          8511:                          cp_warning ("extra qualification `%T' on member `%s' ignored",
        !          8512:                                   ctype, name);
        !          8513:                      }
        !          8514:                    type = build_offset_type (ctype, type);
        !          8515:                  }
        !          8516:                else if (uses_template_parms (ctype))
        !          8517:                  {
        !          8518:                     enum tree_code c;
        !          8519:                     if (TREE_CODE (type) == FUNCTION_TYPE)
        !          8520:                      {
        !          8521:                        type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep),
        !          8522:                                                        TREE_TYPE (type),
        !          8523:                                                        TYPE_ARG_TYPES (type));
        !          8524:                        c = FUNCTION_DECL;
        !          8525:                      }
        !          8526:                  }
        !          8527:                else
        !          8528:                  {
        !          8529:                    cp_error ("structure `%T' not yet defined", ctype);
        !          8530:                    return error_mark_node;
        !          8531:                  }
        !          8532: 
        !          8533:                declarator = sname;
        !          8534:              }
        !          8535:            else if (TREE_CODE (sname) == TYPE_EXPR)
        !          8536:              {
        !          8537:                /* A TYPE_EXPR will change types out from under us.
        !          8538:                   So do the TYPE_EXPR now, and make this SCOPE_REF
        !          8539:                   inner to the TYPE_EXPR's CALL_EXPR.
        !          8540: 
        !          8541:                   This does not work if we don't get a CALL_EXPR back.
        !          8542:                   I did not think about error recovery, hence the
        !          8543:                   my_friendly_abort.  */
        !          8544: 
        !          8545:                /* Get the CALL_EXPR.  */
        !          8546:                sname = grokoptypename (sname, 0);
        !          8547:                my_friendly_assert (TREE_CODE (sname) == CALL_EXPR, 157);
        !          8548:                type = TREE_TYPE (TREE_OPERAND (sname, 0));
        !          8549:                /* Scope the CALL_EXPR's name.  */
        !          8550:                TREE_OPERAND (declarator, 1) = TREE_OPERAND (sname, 0);
        !          8551:                /* Put the SCOPE_EXPR in the CALL_EXPR's innermost position.  */
        !          8552:                TREE_OPERAND (sname, 0) = declarator;
        !          8553:                /* Now work from the CALL_EXPR.  */
        !          8554:                declarator = sname;
        !          8555:                continue;
        !          8556:              }
        !          8557:            else if (TREE_CODE (sname) == SCOPE_REF)
        !          8558:              my_friendly_abort (17);
        !          8559:            else
        !          8560:              {
        !          8561:              done_scoping:
        !          8562:                declarator = TREE_OPERAND (declarator, 1);
        !          8563:                if (declarator && TREE_CODE (declarator) == CALL_EXPR)
        !          8564:                  /* In this case, we will deal with it later.  */
        !          8565:                  ;
        !          8566:                else
        !          8567:                  {
        !          8568:                    if (TREE_CODE (type) == FUNCTION_TYPE)
        !          8569:                      type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep), TREE_TYPE (type), TYPE_ARG_TYPES (type));
        !          8570:                    else
        !          8571:                      type = build_offset_type (ctype, type);
        !          8572:                  }
        !          8573:              }
        !          8574:          }
        !          8575:          break;
        !          8576: 
        !          8577:        case BIT_NOT_EXPR:
        !          8578:          declarator = TREE_OPERAND (declarator, 0);
        !          8579:          break;
        !          8580: 
        !          8581:        case TYPE_EXPR:
        !          8582:          declarator = grokoptypename (declarator, 0);
        !          8583:          if (explicit_int != -1)
        !          8584:            {
        !          8585:              tree stype = TREE_TYPE (TREE_OPERAND (declarator, 0));
        !          8586:              if (comp_target_types (type, stype, 1) == 0)
        !          8587:                cp_error ("`operator %T' declared to return `%T'", stype,
        !          8588:                          type);
        !          8589:              else
        !          8590:                cp_pedwarn ("return type specified for `operator %T'", type);
        !          8591:            }
        !          8592:          dname = declarator;
        !          8593:          type = TREE_TYPE (TREE_OPERAND (declarator, 0));
        !          8594:          maybe_globalize_type (type);
        !          8595:          break;
        !          8596: 
        !          8597:        case RECORD_TYPE:
        !          8598:        case UNION_TYPE:
        !          8599:        case ENUMERAL_TYPE:
        !          8600:          declarator = NULL_TREE;
        !          8601:          break;
        !          8602: 
        !          8603:        case ERROR_MARK:
        !          8604:          declarator = NULL_TREE;
        !          8605:          break;
        !          8606: 
        !          8607:        default:
        !          8608:          my_friendly_abort (158);
        !          8609:        }
        !          8610:     }
        !          8611: 
        !          8612:   /* Now TYPE has the actual type.  */
        !          8613: 
        !          8614:   /* If this is declaring a typedef name, return a TYPE_DECL.  */
        !          8615: 
        !          8616:   if (RIDBIT_SETP (RID_TYPEDEF, specbits))
        !          8617:     {
        !          8618:       tree decl;
        !          8619: 
        !          8620:       /* Note that the grammar rejects storage classes
        !          8621:         in typenames, fields or parameters.  */
        !          8622:       if (constp || volatilep)
        !          8623:        type = build_type_variant (type, constp, volatilep);
        !          8624: 
        !          8625:       /* If the user declares "struct {...} foo" then `foo' will have
        !          8626:         an anonymous name.  Fill that name in now.  Nothing can
        !          8627:         refer to it, so nothing needs know about the name change.
        !          8628:         The TYPE_NAME field was filled in by build_struct_xref.  */
        !          8629:       if (type != error_mark_node
        !          8630:          && TYPE_NAME (type)
        !          8631:          && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
        !          8632:          && ANON_AGGRNAME_P (TYPE_IDENTIFIER (type)))
        !          8633:        {
        !          8634:          /* replace the anonymous name with the real name everywhere.  */
        !          8635:          lookup_tag_reverse (type, declarator);
        !          8636:          TYPE_IDENTIFIER (type) = declarator;
        !          8637:        }
        !          8638: 
        !          8639: #if 0 /* not yet, should get fixed properly later */
        !          8640:       decl = make_type_decl (declarator, type);
        !          8641: #else
        !          8642:       decl = build_decl (TYPE_DECL, declarator, type);
        !          8643: #endif
        !          8644:       if (TREE_CODE (type) == OFFSET_TYPE || TREE_CODE (type) == METHOD_TYPE)
        !          8645:        {
        !          8646:          cp_error_at ("typedef name may not be class-qualified", decl);
        !          8647:          TREE_TYPE (decl) = error_mark_node;
        !          8648:        }
        !          8649:       else if (quals)
        !          8650:        {
        !          8651:          if (ctype == NULL_TREE)
        !          8652:            {
        !          8653:              if (TREE_CODE (type) != METHOD_TYPE)
        !          8654:                cp_error_at ("invalid type qualifier for non-method type", decl);
        !          8655:              else
        !          8656:                ctype = TYPE_METHOD_BASETYPE (type);
        !          8657:            }
        !          8658:          if (ctype != NULL_TREE)
        !          8659:            grok_method_quals (ctype, decl, quals);
        !          8660:        }
        !          8661: 
        !          8662:       if (RIDBIT_SETP (RID_SIGNED, specbits)
        !          8663:          || (typedef_decl && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
        !          8664:        C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1;
        !          8665: 
        !          8666:       if (RIDBIT_SETP (RID_MUTABLE, specbits))
        !          8667:        {
        !          8668:          error ("non-object member `%s' cannot be declared mutable", name);
        !          8669:        }
        !          8670: 
        !          8671:       return decl;
        !          8672:     }
        !          8673: 
        !          8674:   /* Detect the case of an array type of unspecified size
        !          8675:      which came, as such, direct from a typedef name.
        !          8676:      We must copy the type, so that each identifier gets
        !          8677:      a distinct type, so that each identifier's size can be
        !          8678:      controlled separately by its own initializer.  */
        !          8679: 
        !          8680:   if (type == typedef_type && TREE_CODE (type) == ARRAY_TYPE
        !          8681:       && TYPE_DOMAIN (type) == NULL_TREE)
        !          8682:     {
        !          8683:       type = build_cplus_array_type (TREE_TYPE (type), TYPE_DOMAIN (type));
        !          8684:     }
        !          8685: 
        !          8686:   /* If this is a type name (such as, in a cast or sizeof),
        !          8687:      compute the type and return it now.  */
        !          8688: 
        !          8689:   if (decl_context == TYPENAME)
        !          8690:     {
        !          8691:       /* Note that the grammar rejects storage classes
        !          8692:         in typenames, fields or parameters.  */
        !          8693:       if (constp || volatilep)
        !          8694:        type = build_type_variant (type, constp, volatilep);
        !          8695: 
        !          8696:       /* Special case: "friend class foo" looks like a TYPENAME context.  */
        !          8697:       if (friendp)
        !          8698:        {
        !          8699:          /* A friendly class?  */
        !          8700:          if (current_class_type)
        !          8701:            make_friend_class (current_class_type, TYPE_MAIN_VARIANT (type));
        !          8702:          else
        !          8703:            error("trying to make class `%s' a friend of global scope",
        !          8704:                  TYPE_NAME_STRING (type));
        !          8705:          type = void_type_node;
        !          8706:        }
        !          8707:       else if (quals)
        !          8708:        {
        !          8709: #if 0 /* not yet, should get fixed properly later */
        !          8710:          tree dummy = make_type_decl (declarator, type);
        !          8711: #else
        !          8712:          tree dummy = build_decl (TYPE_DECL, declarator, type);
        !          8713: #endif
        !          8714:          if (ctype == NULL_TREE)
        !          8715:            {
        !          8716:              my_friendly_assert (TREE_CODE (type) == METHOD_TYPE, 159);
        !          8717:              ctype = TYPE_METHOD_BASETYPE (type);
        !          8718:            }
        !          8719:          grok_method_quals (ctype, dummy, quals);
        !          8720:          type = TREE_TYPE (dummy);
        !          8721:        }
        !          8722: 
        !          8723:       return type;
        !          8724:     }
        !          8725: 
        !          8726:   /* `void' at top level (not within pointer)
        !          8727:      is allowed only in typedefs or type names.
        !          8728:      We don't complain about parms either, but that is because
        !          8729:      a better error message can be made later.  */
        !          8730: 
        !          8731:   if (TYPE_MAIN_VARIANT (type) == void_type_node && decl_context != PARM)
        !          8732:     {
        !          8733:       if (declarator != NULL_TREE
        !          8734:          && TREE_CODE (declarator) == IDENTIFIER_NODE)
        !          8735:        {
        !          8736:          if (IDENTIFIER_OPNAME_P (declarator))
        !          8737: #if 0                          /* How could this happen? */
        !          8738:            error ("operator `%s' declared void",
        !          8739:                   operator_name_string (declarator));
        !          8740: #else
        !          8741:            my_friendly_abort (356);
        !          8742: #endif
        !          8743:          else
        !          8744:            error ("variable or field `%s' declared void", name);
        !          8745:        }
        !          8746:       else
        !          8747:        error ("variable or field declared void");
        !          8748:       type = integer_type_node;
        !          8749:     }
        !          8750: 
        !          8751:   /* Now create the decl, which may be a VAR_DECL, a PARM_DECL
        !          8752:      or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE.  */
        !          8753: 
        !          8754:   {
        !          8755:     register tree decl;
        !          8756: 
        !          8757:     if (decl_context == PARM)
        !          8758:       {
        !          8759:        tree parmtype = type;
        !          8760: 
        !          8761:        if (ctype)
        !          8762:          error ("cannot use `::' in parameter declaration");
        !          8763: 
        !          8764:        /* A parameter declared as an array of T is really a pointer to T.
        !          8765:           One declared as a function is really a pointer to a function.
        !          8766:           One declared as a member is really a pointer to member.
        !          8767: 
        !          8768:           Don't be misled by references.  */
        !          8769: 
        !          8770:        if (TREE_CODE (type) == REFERENCE_TYPE)
        !          8771:          type = TREE_TYPE (type);
        !          8772: 
        !          8773:        if (TREE_CODE (type) == ARRAY_TYPE)
        !          8774:          {
        !          8775:            if (parmtype == type)
        !          8776:              {
        !          8777:                /* Transfer const-ness of array into that of type
        !          8778:                   pointed to.  */
        !          8779:                type = build_pointer_type
        !          8780:                  (build_type_variant (TREE_TYPE (type), constp, volatilep));
        !          8781:                volatilep = constp = 0;
        !          8782:              }
        !          8783:            else
        !          8784:              type = build_pointer_type (TREE_TYPE (type));
        !          8785:          }
        !          8786:        else if (TREE_CODE (type) == FUNCTION_TYPE)
        !          8787:          type = build_pointer_type (type);
        !          8788:        else if (TREE_CODE (type) == OFFSET_TYPE)
        !          8789:          type = build_pointer_type (type);
        !          8790: 
        !          8791:        if (TREE_CODE (parmtype) == REFERENCE_TYPE)
        !          8792:          {
        !          8793:            /* Transfer const-ness of reference into that of type pointed to.  */
        !          8794:            type = build_type_variant (build_reference_type (type), constp, volatilep);
        !          8795:            constp = volatilep = 0;
        !          8796:          }
        !          8797: 
        !          8798:        decl = build_decl (PARM_DECL, declarator, type);
        !          8799: 
        !          8800:        bad_specifiers (decl, "parameter", virtualp, quals != NULL_TREE,
        !          8801:                        inlinep, friendp, raises != NULL_TREE);
        !          8802: 
        !          8803:        /* Compute the type actually passed in the parmlist,
        !          8804:           for the case where there is no prototype.
        !          8805:           (For example, shorts and chars are passed as ints.)
        !          8806:           When there is a prototype, this is overridden later.  */
        !          8807: 
        !          8808:        DECL_ARG_TYPE (decl) = type;
        !          8809:        if (TYPE_MAIN_VARIANT (type) == float_type_node)
        !          8810:          DECL_ARG_TYPE (decl) = build_type_variant (double_type_node,
        !          8811:                                                     TYPE_READONLY (type),
        !          8812:                                                     TYPE_VOLATILE (type));
        !          8813:        else if (C_PROMOTING_INTEGER_TYPE_P (type))
        !          8814:          {
        !          8815:            tree argtype;
        !          8816: 
        !          8817:            /* Retain unsignedness if traditional or if not really
        !          8818:               getting wider.  */
        !          8819:            if (TREE_UNSIGNED (type)
        !          8820:                && (flag_traditional
        !          8821:                    || TYPE_PRECISION (type)
        !          8822:                        == TYPE_PRECISION (integer_type_node)))
        !          8823:              argtype = unsigned_type_node;
        !          8824:            else
        !          8825:              argtype = integer_type_node;
        !          8826:            DECL_ARG_TYPE (decl) = build_type_variant (argtype,
        !          8827:                                                       TYPE_READONLY (type),
        !          8828:                                                       TYPE_VOLATILE (type));
        !          8829:          }
        !          8830:       }
        !          8831:     else if (decl_context == FIELD)
        !          8832:       {
        !          8833:        if (type == error_mark_node)
        !          8834:          {
        !          8835:            /* Happens when declaring arrays of sizes which
        !          8836:               are error_mark_node, for example.  */
        !          8837:            decl = NULL_TREE;
        !          8838:          }
        !          8839:        else if (TREE_CODE (type) == FUNCTION_TYPE)
        !          8840:          {
        !          8841:            int publicp = 0;
        !          8842: 
        !          8843:            if (friendp == 0)
        !          8844:              {
        !          8845:                if (ctype == NULL_TREE)
        !          8846:                  ctype = current_class_type;
        !          8847: 
        !          8848:                if (ctype == NULL_TREE)
        !          8849:                  {
        !          8850:                    cp_error ("can't make `%D' into a method -- not in a class",
        !          8851:                              declarator);
        !          8852:                    return void_type_node;
        !          8853:                  }
        !          8854: 
        !          8855:                /* ``A union may [ ... ] not [ have ] virtual functions.''
        !          8856:                   ARM 9.5 */
        !          8857:                if (virtualp && TREE_CODE (ctype) == UNION_TYPE)
        !          8858:                  {
        !          8859:                    error ("function `%s' declared virtual inside a union",
        !          8860:                           IDENTIFIER_POINTER (declarator));
        !          8861:                    return void_type_node;
        !          8862:                  }
        !          8863: 
        !          8864:                /* Don't convert type of operators new and delete to
        !          8865:                   METHOD_TYPE; they remain FUNCTION_TYPEs.  */
        !          8866:                if (staticp < 2
        !          8867:                    && declarator != ansi_opname[(int) NEW_EXPR]
        !          8868:                    && declarator != ansi_opname[(int) DELETE_EXPR])
        !          8869:                  type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep),
        !          8870:                                                  TREE_TYPE (type), TYPE_ARG_TYPES (type));
        !          8871:              }
        !          8872: 
        !          8873:            /* Tell grokfndecl if it needs to set TREE_PUBLIC on the node.  */
        !          8874:            publicp = (RIDBIT_SETP (RID_EXTERN, specbits)
        !          8875:                       || (ctype != NULL_TREE && funcdef_flag >= 0)
        !          8876:                       || (friendp
        !          8877:                           && RIDBIT_NOTSETP (RID_STATIC, specbits)
        !          8878:                           && RIDBIT_NOTSETP (RID_INLINE, specbits))
        !          8879:                       );
        !          8880:            decl = grokfndecl (ctype, type, declarator,
        !          8881:                               virtualp, flags, quals,
        !          8882:                               raises, friendp ? -1 : 0, publicp);
        !          8883:            DECL_INLINE (decl) = inlinep;
        !          8884:          }
        !          8885:        else if (TREE_CODE (type) == METHOD_TYPE)
        !          8886:          {
        !          8887:            /* All method decls are public, so tell grokfndecl to set
        !          8888:               TREE_PUBLIC, also.  */
        !          8889:            decl = grokfndecl (ctype, type, declarator,
        !          8890:                               virtualp, flags, quals,
        !          8891:                               raises, friendp ? -1 : 0, 1);
        !          8892:            DECL_INLINE (decl) = inlinep;
        !          8893:          }
        !          8894:        else if (TREE_CODE (type) == RECORD_TYPE
        !          8895:                 && CLASSTYPE_DECLARED_EXCEPTION (type))
        !          8896:          {
        !          8897:            /* Handle a class-local exception declaration.  */
        !          8898:            decl = build_lang_field_decl (VAR_DECL, declarator, type);
        !          8899:            if (ctype == NULL_TREE)
        !          8900:              ctype = current_class_type;
        !          8901:            finish_exception_decl (TREE_CODE (TYPE_NAME (ctype)) == TYPE_DECL
        !          8902:                                   ? TYPE_IDENTIFIER (ctype) : TYPE_NAME (ctype), decl);
        !          8903:            return void_type_node;
        !          8904:          }
        !          8905:        else if (TYPE_SIZE (type) == NULL_TREE && !staticp
        !          8906:                 && (TREE_CODE (type) != ARRAY_TYPE || initialized == 0))
        !          8907:          {
        !          8908:            if (declarator)
        !          8909:              error ("field `%s' has incomplete type",
        !          8910:                     IDENTIFIER_POINTER (declarator));
        !          8911:            else
        !          8912:              error ("field has incomplete type");
        !          8913: 
        !          8914:            /* If we're instantiating a template, tell them which
        !          8915:               instantiation made the field's type be incomplete.  */
        !          8916:            if (current_class_type
        !          8917:                && TYPE_NAME (current_class_type)
        !          8918:                && IDENTIFIER_TEMPLATE (DECL_NAME (TYPE_NAME (current_class_type)))
        !          8919:                && declspecs && TREE_VALUE (declspecs)
        !          8920:                && TREE_TYPE (TREE_VALUE (declspecs)) == type)
        !          8921:              error ("  in instantiation of template `%s'",
        !          8922:                     TYPE_NAME_STRING (current_class_type));
        !          8923:                
        !          8924:            type = error_mark_node;
        !          8925:            decl = NULL_TREE;
        !          8926:          }
        !          8927:        else
        !          8928:          {
        !          8929:            if (friendp)
        !          8930:              {
        !          8931:                if (declarator)
        !          8932:                  error ("`%s' is neither function nor method; cannot be declared friend",
        !          8933:                         IDENTIFIER_POINTER (declarator));
        !          8934:                else
        !          8935:                  {
        !          8936:                    error ("invalid friend declaration");
        !          8937:                    return void_type_node;
        !          8938:                  }
        !          8939:                friendp = 0;
        !          8940:              }
        !          8941:            decl = NULL_TREE;
        !          8942:          }
        !          8943: 
        !          8944:        if (friendp)
        !          8945:          {
        !          8946:            /* Friends are treated specially.  */
        !          8947:            if (ctype == current_class_type)
        !          8948:              warning ("member functions are implicitly friends of their class");
        !          8949:            else if (decl && DECL_NAME (decl))
        !          8950:              return do_friend (ctype, declarator, decl,
        !          8951:                                last_function_parms, flags, quals);
        !          8952:            else
        !          8953:              return void_type_node;
        !          8954:          }
        !          8955: 
        !          8956:        /* Structure field.  It may not be a function, except for C++ */
        !          8957: 
        !          8958:        if (decl == NULL_TREE)
        !          8959:          {
        !          8960:            /* ANSI C++ June 5 1992 WP 9.2.2 and 9.4.2.  A member-declarator
        !          8961:               cannot have an initializer, and a static member declaration must
        !          8962:               be defined elsewhere.  */
        !          8963:            if (initialized)
        !          8964:              {
        !          8965:                if (staticp)
        !          8966:                  error ("static member `%s' must be defined separately from its declaration",
        !          8967:                          IDENTIFIER_POINTER (declarator));
        !          8968:                /* Note that initialization of const members is prohibited
        !          8969:                   by the draft ANSI standard, though it appears to be in
        !          8970:                   common practice.  12.6.2: The argument list is used to
        !          8971:                   initialize the named nonstatic member....  This (or an
        !          8972:                   aggregate) is the only way to initialize nonstatic const
        !          8973:                   and reference members.  */
        !          8974:                else if (pedantic && (!constp || flag_ansi))
        !          8975:                  warning ("ANSI C++ forbids initialization of %s `%s'",
        !          8976:                           constp ? "const member" : "member",
        !          8977:                           IDENTIFIER_POINTER (declarator));
        !          8978:              }
        !          8979: 
        !          8980:            if (staticp || (constp && initialized))
        !          8981:              {
        !          8982:                /* C++ allows static class members.
        !          8983:                   All other work for this is done by grokfield.
        !          8984:                   This VAR_DECL is built by build_lang_field_decl.
        !          8985:                   All other VAR_DECLs are built by build_decl.  */
        !          8986:                decl = build_lang_field_decl (VAR_DECL, declarator, type);
        !          8987:                if (staticp || TREE_CODE (type) == ARRAY_TYPE)
        !          8988:                  TREE_STATIC (decl) = 1;
        !          8989:                /* In class context, static means public visibility.  */
        !          8990:                TREE_PUBLIC (decl) = 1;
        !          8991:                DECL_EXTERNAL (decl) = !initialized;
        !          8992:              }
        !          8993:            else
        !          8994:              {
        !          8995:                decl = build_lang_field_decl (FIELD_DECL, declarator, type);
        !          8996:                if (RIDBIT_SETP (RID_MUTABLE, specbits))
        !          8997:                  {
        !          8998:                    DECL_MUTABLE_P (decl) = 1;
        !          8999:                    RIDBIT_RESET (RID_MUTABLE, specbits);
        !          9000:                  }
        !          9001:              }
        !          9002: 
        !          9003:            bad_specifiers (decl, "field", virtualp, quals != NULL_TREE,
        !          9004:                            inlinep, friendp, raises != NULL_TREE);
        !          9005:          }
        !          9006:       }
        !          9007:     else if (TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE)
        !          9008:       {
        !          9009:        int was_overloaded = 0;
        !          9010:        tree original_name = declarator;
        !          9011:        int publicp = 0;
        !          9012: 
        !          9013:        if (! declarator)
        !          9014:          return NULL_TREE;
        !          9015: 
        !          9016:        if (RIDBIT_SETP (RID_AUTO, specbits)
        !          9017:            || RIDBIT_SETP (RID_REGISTER, specbits))
        !          9018:          error ("invalid storage class for function `%s'", name);
        !          9019: 
        !          9020:        /* Function declaration not at top level.
        !          9021:           Storage classes other than `extern' are not allowed
        !          9022:           and `extern' makes no difference.  */
        !          9023:        if (current_binding_level != global_binding_level
        !          9024:            && (RIDBIT_SETP (RID_STATIC, specbits) || RIDBIT_SETP (RID_INLINE, specbits))
        !          9025:            && pedantic)
        !          9026:          pedwarn ("invalid storage class for function `%s'", name);
        !          9027: 
        !          9028:        if (ctype == NULL_TREE)
        !          9029:          {
        !          9030:            if (virtualp)
        !          9031:              {
        !          9032:                error ("virtual non-class function `%s'", name);
        !          9033:                virtualp = 0;
        !          9034:              }
        !          9035: 
        !          9036:            if (current_lang_name == lang_name_cplusplus
        !          9037:                && ! (IDENTIFIER_LENGTH (original_name) == 4
        !          9038:                      && IDENTIFIER_POINTER (original_name)[0] == 'm'
        !          9039:                      && strcmp (IDENTIFIER_POINTER (original_name), "main") == 0)
        !          9040:                && ! (IDENTIFIER_LENGTH (original_name) > 10
        !          9041:                      && IDENTIFIER_POINTER (original_name)[0] == '_'
        !          9042:                      && IDENTIFIER_POINTER (original_name)[1] == '_'
        !          9043:                      && strncmp (IDENTIFIER_POINTER (original_name)+2, "builtin_", 8) == 0))
        !          9044:              {
        !          9045:                /* Plain overloading: will not be grok'd by grokclassfn.  */
        !          9046:                declarator = build_decl_overload (dname, TYPE_ARG_TYPES (type), 0);
        !          9047:                was_overloaded = 1;
        !          9048:              }
        !          9049:          }
        !          9050:        else if (TREE_CODE (type) == FUNCTION_TYPE && staticp < 2)
        !          9051:          type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep),
        !          9052:                                          TREE_TYPE (type), TYPE_ARG_TYPES (type));
        !          9053: 
        !          9054:        /* Record presence of `static'.  In C++, `inline' is like `static'.
        !          9055:           Methods of classes should be public, unless we're dropping them
        !          9056:           into some other file, so we don't clear TREE_PUBLIC for them.  */
        !          9057:        publicp
        !          9058:          = ((ctype
        !          9059:              && CLASSTYPE_INTERFACE_KNOWN (ctype)
        !          9060:              && ! CLASSTYPE_INTERFACE_ONLY (ctype))
        !          9061:             || !(RIDBIT_SETP (RID_STATIC, specbits)
        !          9062:                  || RIDBIT_SETP (RID_INLINE, specbits)));
        !          9063: 
        !          9064:        decl = grokfndecl (ctype, type, original_name,
        !          9065:                           virtualp, flags, quals,
        !          9066:                           raises,
        !          9067:                           processing_template_decl ? 0 : friendp ? 2 : 1,
        !          9068:                           publicp);
        !          9069: 
        !          9070:        
        !          9071:        if (ctype == NULL_TREE && DECL_HAS_CPLUSPLUS_LINKAGE(decl))
        !          9072:          DECL_ASSEMBLER_NAME (decl) = declarator;
        !          9073: 
        !          9074:        if (staticp == 1)
        !          9075:          {
        !          9076:            int illegal_static = 0;
        !          9077: 
        !          9078:            /* Don't allow a static member function in a class, and forbid
        !          9079:               declaring main to be static.  */
        !          9080:            if (TREE_CODE (type) == METHOD_TYPE)
        !          9081:              {
        !          9082:                cp_error_at ("cannot declare member function `%D' to have static linkage", decl);
        !          9083:                illegal_static = 1;
        !          9084:              }
        !          9085:            else if (! was_overloaded
        !          9086:                     && ! ctype
        !          9087:                     && IDENTIFIER_LENGTH (original_name) == 4
        !          9088:                     && IDENTIFIER_POINTER (original_name)[0] == 'm'
        !          9089:                     && ! strcmp (IDENTIFIER_POINTER (original_name), "main"))
        !          9090:              {
        !          9091:                error ("cannot declare function `main' to have static linkage");
        !          9092:                illegal_static = 1;
        !          9093:              }
        !          9094: 
        !          9095:            if (illegal_static)
        !          9096:              {
        !          9097:                staticp = 0;
        !          9098:                RIDBIT_RESET (RID_STATIC, specbits);
        !          9099:              }
        !          9100:          }
        !          9101: 
        !          9102: #ifdef NeXT
        !          9103: #ifdef HPPA
        !          9104:   {
        !          9105:     tree last = tree_last (TYPE_ARG_TYPES (type));
        !          9106: 
        !          9107:     if (last && (TYPE_MAIN_VARIANT (TREE_VALUE (last)) != void_type_node))
        !          9108:        add_vararg_func(IDENTIFIER_POINTER(declarator), '1');
        !          9109:     else
        !          9110:        add_vararg_func(IDENTIFIER_POINTER(declarator), '0');
        !          9111:   }
        !          9112: #endif
        !          9113: #endif
        !          9114: 
        !          9115:        /* Record presence of `inline', if it is reasonable.  */
        !          9116:        if (inlinep)
        !          9117:          {
        !          9118:            tree last = tree_last (TYPE_ARG_TYPES (type));
        !          9119: 
        !          9120:            if (! was_overloaded
        !          9121:                && ! ctype
        !          9122:                && ! strcmp (IDENTIFIER_POINTER (original_name), "main"))
        !          9123:              error ("cannot inline function `main'");
        !          9124:            else if (last && last != void_list_node)
        !          9125:              cp_warning ("cannot inline function `%D' which takes `...'", original_name);
        !          9126:            else
        !          9127:              /* Assume that otherwise the function can be inlined.  */
        !          9128:              DECL_INLINE (decl) = 1;
        !          9129: 
        !          9130:            if (RIDBIT_SETP (RID_EXTERN, specbits))
        !          9131:              {
        !          9132:                current_extern_inline = 1;
        !          9133:                if (flag_ansi || pedantic || flag_pedantic_errors)
        !          9134:                  pedwarn ("ANSI C++ does not permit `extern inline'");
        !          9135:              }
        !          9136:          }
        !          9137:        if (was_overloaded)
        !          9138:          DECL_OVERLOADED (decl) = 1;
        !          9139:       }
        !          9140:     else
        !          9141:       {
        !          9142:        /* It's a variable.  */
        !          9143: 
        !          9144:        /* An uninitialized decl with `extern' is a reference.  */
        !          9145:        decl = grokvardecl (type, declarator, specbits, initialized);
        !          9146:        bad_specifiers (decl, "variable", virtualp, quals != NULL_TREE,
        !          9147:                        inlinep, friendp, raises != NULL_TREE);
        !          9148: 
        !          9149:        if (ctype)
        !          9150:          {
        !          9151:            if (staticp == 1)
        !          9152:              {
        !          9153:                cp_error ("static member `%D' re-declared as static",
        !          9154:                          decl);
        !          9155:                staticp = 0;
        !          9156:                RIDBIT_RESET (RID_STATIC, specbits);
        !          9157:              }
        !          9158:            if (RIDBIT_SETP (RID_EXTERN, specbits))
        !          9159:              {
        !          9160:                cp_error ("cannot explicitly declare member `%#D' to have extern linkage",
        !          9161:                          decl);
        !          9162:                RIDBIT_RESET (RID_EXTERN, specbits);
        !          9163:              }
        !          9164:          }
        !          9165:       }
        !          9166: 
        !          9167:     if (RIDBIT_SETP (RID_MUTABLE, specbits))
        !          9168:       {
        !          9169:        error ("`%s' cannot be declared mutable", name);
        !          9170:       }
        !          9171: 
        !          9172:     /* Record `register' declaration for warnings on &
        !          9173:        and in case doing stupid register allocation.  */
        !          9174: 
        !          9175:     if (RIDBIT_SETP (RID_REGISTER, specbits))
        !          9176:       DECL_REGISTER (decl) = 1;
        !          9177: 
        !          9178:     /* Record constancy and volatility.  */
        !          9179: 
        !          9180:     if (constp)
        !          9181:       TREE_READONLY (decl) = TREE_CODE (type) != REFERENCE_TYPE;
        !          9182:     if (volatilep)
        !          9183:       {
        !          9184:        TREE_SIDE_EFFECTS (decl) = 1;
        !          9185:        TREE_THIS_VOLATILE (decl) = 1;
        !          9186:       }
        !          9187: 
        !          9188:     return decl;
        !          9189:   }
        !          9190: }
        !          9191: 
        !          9192: /* Tell if a parmlist/exprlist looks like an exprlist or a parmlist.
        !          9193:    An empty exprlist is a parmlist.  An exprlist which
        !          9194:    contains only identifiers at the global level
        !          9195:    is a parmlist.  Otherwise, it is an exprlist.  */
        !          9196: int
        !          9197: parmlist_is_exprlist (exprs)
        !          9198:      tree exprs;
        !          9199: {
        !          9200:   if (exprs == NULL_TREE || TREE_PARMLIST (exprs))
        !          9201:     return 0;
        !          9202: 
        !          9203:   if (current_binding_level == global_binding_level)
        !          9204:     {
        !          9205:       /* At the global level, if these are all identifiers,
        !          9206:         then it is a parmlist.  */
        !          9207:       while (exprs)
        !          9208:        {
        !          9209:          if (TREE_CODE (TREE_VALUE (exprs)) != IDENTIFIER_NODE)
        !          9210:            return 1;
        !          9211:          exprs = TREE_CHAIN (exprs);
        !          9212:        }
        !          9213:       return 0;
        !          9214:     }
        !          9215:   return 1;
        !          9216: }
        !          9217: 
        !          9218: /* Make sure that the this list of PARMS has a chance of being
        !          9219:    grokked by `grokparms'.
        !          9220: 
        !          9221:    @@ This is really weak, but the grammar does not allow us
        !          9222:    @@ to easily reject things that this has to catch as syntax errors.  */
        !          9223: static int
        !          9224: parmlist_is_random (parms)
        !          9225:      tree parms;
        !          9226: {
        !          9227:   if (parms == NULL_TREE)
        !          9228:     return 0;
        !          9229: 
        !          9230:   if (TREE_CODE (parms) != TREE_LIST)
        !          9231:     return 1;
        !          9232: 
        !          9233:   while (parms)
        !          9234:     {
        !          9235:       if (parms == void_list_node)
        !          9236:        return 0;
        !          9237: 
        !          9238:       if (TREE_CODE (TREE_VALUE (parms)) != TREE_LIST)
        !          9239:        return 1;
        !          9240:       /* Don't get faked out by overloaded functions, which
        !          9241:         masquerade as TREE_LISTs!  */
        !          9242:       if (TREE_TYPE (TREE_VALUE (parms)) == unknown_type_node)
        !          9243:        return 1;
        !          9244:       parms = TREE_CHAIN (parms);
        !          9245:     }
        !          9246:   return 0;
        !          9247: }
        !          9248: 
        !          9249: /* Subroutine of `grokparms'.  In a fcn definition, arg types must
        !          9250:    be complete.
        !          9251: 
        !          9252:    C++: also subroutine of `start_function'.  */
        !          9253: static void
        !          9254: require_complete_types_for_parms (parms)
        !          9255:      tree parms;
        !          9256: {
        !          9257:   while (parms)
        !          9258:     {
        !          9259:       tree type = TREE_TYPE (parms);
        !          9260:       if (TYPE_SIZE (type) == NULL_TREE)
        !          9261:        {
        !          9262:          if (DECL_NAME (parms))
        !          9263:            error ("parameter `%s' has incomplete type",
        !          9264:                   IDENTIFIER_POINTER (DECL_NAME (parms)));
        !          9265:          else
        !          9266:            error ("parameter has incomplete type");
        !          9267:          TREE_TYPE (parms) = error_mark_node;
        !          9268:        }
        !          9269: #if 0
        !          9270:       /* If the arg types are incomplete in a declaration,
        !          9271:         they must include undefined tags.
        !          9272:         These tags can never be defined in the scope of the declaration,
        !          9273:         so the types can never be completed,
        !          9274:         and no call can be compiled successfully.  */
        !          9275:       /* This is not the right behavior for C++, but not having
        !          9276:         it is also probably wrong.  */
        !          9277:       else
        !          9278:        {
        !          9279:          /* Now warn if is a pointer to an incomplete type.  */
        !          9280:          while (TREE_CODE (type) == POINTER_TYPE
        !          9281:                 || TREE_CODE (type) == REFERENCE_TYPE)
        !          9282:            type = TREE_TYPE (type);
        !          9283:          type = TYPE_MAIN_VARIANT (type);
        !          9284:          if (TYPE_SIZE (type) == NULL_TREE)
        !          9285:            {
        !          9286:              if (DECL_NAME (parm) != NULL_TREE)
        !          9287:                warning ("parameter `%s' points to incomplete type",
        !          9288:                         IDENTIFIER_POINTER (DECL_NAME (parm)));
        !          9289:              else
        !          9290:                warning ("parameter points to incomplete type");
        !          9291:            }
        !          9292:        }
        !          9293: #endif
        !          9294:       parms = TREE_CHAIN (parms);
        !          9295:     }
        !          9296: }
        !          9297: 
        !          9298: /* Decode the list of parameter types for a function type.
        !          9299:    Given the list of things declared inside the parens,
        !          9300:    return a list of types.
        !          9301: 
        !          9302:    The list we receive can have three kinds of elements:
        !          9303:    an IDENTIFIER_NODE for names given without types,
        !          9304:    a TREE_LIST node for arguments given as typespecs or names with typespecs,
        !          9305:    or void_type_node, to mark the end of an argument list
        !          9306:    when additional arguments are not permitted (... was not used).
        !          9307: 
        !          9308:    FUNCDEF_FLAG is nonzero for a function definition, 0 for
        !          9309:    a mere declaration.  A nonempty identifier-list gets an error message
        !          9310:    when FUNCDEF_FLAG is zero.
        !          9311:    If FUNCDEF_FLAG is 1, then parameter types must be complete.
        !          9312:    If FUNCDEF_FLAG is -1, then parameter types may be incomplete.
        !          9313: 
        !          9314:    If all elements of the input list contain types,
        !          9315:    we return a list of the types.
        !          9316:    If all elements contain no type (except perhaps a void_type_node
        !          9317:    at the end), we return a null list.
        !          9318:    If some have types and some do not, it is an error, and we
        !          9319:    return a null list.
        !          9320: 
        !          9321:    Also set last_function_parms to either
        !          9322:    a list of names (IDENTIFIER_NODEs) or a chain of PARM_DECLs.
        !          9323:    A list of names is converted to a chain of PARM_DECLs
        !          9324:    by store_parm_decls so that ultimately it is always a chain of decls.
        !          9325: 
        !          9326:    Note that in C++, parameters can take default values.  These default
        !          9327:    values are in the TREE_PURPOSE field of the TREE_LIST.  It is
        !          9328:    an error to specify default values which are followed by parameters
        !          9329:    that have no default values, or an ELLIPSES.  For simplicities sake,
        !          9330:    only parameters which are specified with their types can take on
        !          9331:    default values.  */
        !          9332: 
        !          9333: tree
        !          9334: grokparms (first_parm, funcdef_flag)
        !          9335:      tree first_parm;
        !          9336:      int funcdef_flag;
        !          9337: {
        !          9338:   tree result = NULL_TREE;
        !          9339:   tree decls = NULL_TREE;
        !          9340: 
        !          9341:   if (first_parm != NULL_TREE
        !          9342:       && TREE_CODE (TREE_VALUE (first_parm)) == IDENTIFIER_NODE)
        !          9343:     {
        !          9344:       if (! funcdef_flag)
        !          9345:        warning ("parameter names (without types) in function declaration");
        !          9346:       last_function_parms = first_parm;
        !          9347:       return NULL_TREE;
        !          9348:     }
        !          9349:   else
        !          9350:     {
        !          9351:       /* Types were specified.  This is a list of declarators
        !          9352:         each represented as a TREE_LIST node.  */
        !          9353:       register tree parm, chain;
        !          9354:       int any_init = 0, any_error = 0, saw_void = 0;
        !          9355: 
        !          9356:       if (first_parm != NULL_TREE)
        !          9357:        {
        !          9358:          tree last_result = NULL_TREE;
        !          9359:          tree last_decl = NULL_TREE;
        !          9360: 
        !          9361:          for (parm = first_parm; parm != NULL_TREE; parm = chain)
        !          9362:            {
        !          9363:              tree type, list_node = parm;
        !          9364:              register tree decl = TREE_VALUE (parm);
        !          9365:              tree init = TREE_PURPOSE (parm);
        !          9366: 
        !          9367:              chain = TREE_CHAIN (parm);
        !          9368:              /* @@ weak defense against parse errors.  */
        !          9369:              if (decl != void_type_node && TREE_CODE (decl) != TREE_LIST)
        !          9370:                {
        !          9371:                  /* Give various messages as the need arises.  */
        !          9372:                  if (TREE_CODE (decl) == STRING_CST)
        !          9373:                    error ("invalid string constant `%s'",
        !          9374:                           TREE_STRING_POINTER (decl));
        !          9375:                  else if (TREE_CODE (decl) == INTEGER_CST)
        !          9376:                    error ("invalid integer constant in parameter list, did you forget to give parameter name?");
        !          9377:                  continue;
        !          9378:                }
        !          9379: 
        !          9380:              if (decl != void_type_node)
        !          9381:                {
        !          9382:                  /* @@ May need to fetch out a `raises' here.  */
        !          9383:                  decl = grokdeclarator (TREE_VALUE (decl),
        !          9384:                                         TREE_PURPOSE (decl),
        !          9385:                                         PARM, init != NULL_TREE, NULL_TREE);
        !          9386:                  if (! decl)
        !          9387:                    continue;
        !          9388:                  type = TREE_TYPE (decl);
        !          9389:                  if (TYPE_MAIN_VARIANT (type) == void_type_node)
        !          9390:                    decl = void_type_node;
        !          9391:                  else if (TREE_CODE (type) == METHOD_TYPE)
        !          9392:                    {
        !          9393:                      if (DECL_NAME (decl))
        !          9394:                        /* Cannot use `error_with_decl' here because
        !          9395:                           we don't have DECL_CONTEXT set up yet.  */
        !          9396:                        error ("parameter `%s' invalidly declared method type",
        !          9397:                               IDENTIFIER_POINTER (DECL_NAME (decl)));
        !          9398:                      else
        !          9399:                        error ("parameter invalidly declared method type");
        !          9400:                      type = build_pointer_type (type);
        !          9401:                      TREE_TYPE (decl) = type;
        !          9402:                    }
        !          9403:                  else if (TREE_CODE (type) == OFFSET_TYPE)
        !          9404:                    {
        !          9405:                      if (DECL_NAME (decl))
        !          9406:                        error ("parameter `%s' invalidly declared offset type",
        !          9407:                               IDENTIFIER_POINTER (DECL_NAME (decl)));
        !          9408:                      else
        !          9409:                        error ("parameter invalidly declared offset type");
        !          9410:                      type = build_pointer_type (type);
        !          9411:                      TREE_TYPE (decl) = type;
        !          9412:                    }
        !          9413:                   else if (TREE_CODE (type) == RECORD_TYPE
        !          9414:                            && TYPE_LANG_SPECIFIC (type)
        !          9415:                            && CLASSTYPE_ABSTRACT_VIRTUALS (type))
        !          9416:                     {
        !          9417:                       abstract_virtuals_error (decl, type);
        !          9418:                       any_error = 1;  /* seems like a good idea */
        !          9419:                     }
        !          9420:                }
        !          9421: 
        !          9422:              if (decl == void_type_node)
        !          9423:                {
        !          9424:                  if (result == NULL_TREE)
        !          9425:                    {
        !          9426:                      result = void_list_node;
        !          9427:                      last_result = result;
        !          9428:                    }
        !          9429:                  else
        !          9430:                    {
        !          9431:                      TREE_CHAIN (last_result) = void_list_node;
        !          9432:                      last_result = void_list_node;
        !          9433:                    }
        !          9434:                  saw_void = 1;
        !          9435:                  if (chain
        !          9436:                      && (chain != void_list_node || TREE_CHAIN (chain)))
        !          9437:                    error ("`void' in parameter list must be entire list");
        !          9438:                  break;
        !          9439:                }
        !          9440: 
        !          9441:              /* Since there is a prototype, args are passed in their own types.  */
        !          9442:              DECL_ARG_TYPE (decl) = TREE_TYPE (decl);
        !          9443: #ifdef PROMOTE_PROTOTYPES
        !          9444:              if ((TREE_CODE (type) == INTEGER_TYPE
        !          9445:                   || TREE_CODE (type) == ENUMERAL_TYPE)
        !          9446:                  && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
        !          9447:                DECL_ARG_TYPE (decl) = integer_type_node;
        !          9448: #endif
        !          9449:              if (!any_error)
        !          9450:                {
        !          9451:                  if (init)
        !          9452:                    {
        !          9453:                      any_init++;
        !          9454:                      if (TREE_CODE (init) == SAVE_EXPR)
        !          9455:                        PARM_DECL_EXPR (init) = 1;
        !          9456:                      else if (TREE_CODE (init) == VAR_DECL)
        !          9457:                        {
        !          9458:                          if (IDENTIFIER_LOCAL_VALUE (DECL_NAME (init)))
        !          9459:                            {
        !          9460:                              /* ``Local variables may not be used in default
        !          9461:                                 argument expressions.'' dpANSI C++ 8.2.6 */
        !          9462:                              /* If extern int i; within a function is not
        !          9463:                                 considered a local variable, then this code is
        !          9464:                                 wrong. */
        !          9465:                              cp_error ("local variable `%D' may not be used as a default argument", init);
        !          9466:                              any_error = 1;
        !          9467:                            }
        !          9468:                          else if (TREE_READONLY_DECL_P (init))
        !          9469:                            init = decl_constant_value (init);
        !          9470:                        }
        !          9471:                      else
        !          9472:                        init = require_instantiated_type (type, init, integer_zero_node);
        !          9473:                    }
        !          9474:                  else if (any_init)
        !          9475:                    {
        !          9476:                      error ("all trailing parameters must have default arguments");
        !          9477:                      any_error = 1;
        !          9478:                    }
        !          9479:                }
        !          9480:              else
        !          9481:                init = NULL_TREE;
        !          9482: 
        !          9483:              if (decls == NULL_TREE)
        !          9484:                {
        !          9485:                  decls = decl;
        !          9486:                  last_decl = decls;
        !          9487:                }
        !          9488:              else
        !          9489:                {
        !          9490:                  TREE_CHAIN (last_decl) = decl;
        !          9491:                  last_decl = decl;
        !          9492:                }
        !          9493:              if (TREE_PERMANENT (list_node))
        !          9494:                {
        !          9495:                  TREE_PURPOSE (list_node) = init;
        !          9496:                  TREE_VALUE (list_node) = type;
        !          9497:                  TREE_CHAIN (list_node) = NULL_TREE;
        !          9498:                }
        !          9499:              else
        !          9500:                list_node = saveable_tree_cons (init, type, NULL_TREE);
        !          9501:              if (result == NULL_TREE)
        !          9502:                {
        !          9503:                  result = list_node;
        !          9504:                  last_result = result;
        !          9505:                }
        !          9506:              else
        !          9507:                {
        !          9508:                  TREE_CHAIN (last_result) = list_node;
        !          9509:                  last_result = list_node;
        !          9510:                }
        !          9511:            }
        !          9512:          if (last_result)
        !          9513:            TREE_CHAIN (last_result) = NULL_TREE;
        !          9514:          /* If there are no parameters, and the function does not end
        !          9515:             with `...', then last_decl will be NULL_TREE.  */
        !          9516:          if (last_decl != NULL_TREE)
        !          9517:            TREE_CHAIN (last_decl) = NULL_TREE;
        !          9518:        }
        !          9519:     }
        !          9520: 
        !          9521:   last_function_parms = decls;
        !          9522: 
        !          9523:   /* In a fcn definition, arg types must be complete.  */
        !          9524:   if (funcdef_flag > 0)
        !          9525:     require_complete_types_for_parms (last_function_parms);
        !          9526: 
        !          9527:   return result;
        !          9528: }
        !          9529: 
        !          9530: /* These memoizing functions keep track of special properties which
        !          9531:    a class may have.  `grok_ctor_properties' notices whether a class
        !          9532:    has a constructor of the form X(X&), and also complains
        !          9533:    if the class has a constructor of the form X(X).
        !          9534:    `grok_op_properties' takes notice of the various forms of
        !          9535:    operator= which are defined, as well as what sorts of type conversion
        !          9536:    may apply.  Both functions take a FUNCTION_DECL as an argument.  */
        !          9537: void
        !          9538: grok_ctor_properties (ctype, decl)
        !          9539:      tree ctype, decl;
        !          9540: {
        !          9541:   tree parmtypes = FUNCTION_ARG_CHAIN (decl);
        !          9542:   tree parmtype = parmtypes ? TREE_VALUE (parmtypes) : void_type_node;
        !          9543: 
        !          9544:   /* When a type has virtual baseclasses, a magical first int argument is
        !          9545:      added to any ctor so we can tell if the class has been initialized
        !          9546:      yet.  This could screw things up in this function, so we deliberately
        !          9547:      ignore the leading int if we're in that situation.  */
        !          9548:   if (parmtypes
        !          9549:       && TREE_VALUE (parmtypes) == integer_type_node
        !          9550:       && TYPE_USES_VIRTUAL_BASECLASSES (ctype))
        !          9551:     {
        !          9552:       parmtypes = TREE_CHAIN (parmtypes);
        !          9553:       parmtype = TREE_VALUE (parmtypes);
        !          9554:     }
        !          9555: 
        !          9556:   if (TREE_CODE (parmtype) == REFERENCE_TYPE
        !          9557:       && TYPE_MAIN_VARIANT (TREE_TYPE (parmtype)) == ctype)
        !          9558:     {
        !          9559:       if (TREE_CHAIN (parmtypes) == NULL_TREE
        !          9560:          || TREE_CHAIN (parmtypes) == void_list_node
        !          9561:          || TREE_PURPOSE (TREE_CHAIN (parmtypes)))
        !          9562:        {
        !          9563:          TYPE_HAS_INIT_REF (ctype) = 1;
        !          9564:          TYPE_GETS_INIT_REF (ctype) = 1;
        !          9565:          if (TYPE_READONLY (TREE_TYPE (parmtype)))
        !          9566:            TYPE_GETS_CONST_INIT_REF (ctype) = 1;
        !          9567:        }
        !          9568:       else
        !          9569:        TYPE_GETS_INIT_AGGR (ctype) = 1;
        !          9570:     }
        !          9571:   else if (TYPE_MAIN_VARIANT (parmtype) == ctype)
        !          9572:     {
        !          9573:       if (TREE_CHAIN (parmtypes) != NULL_TREE
        !          9574:          && TREE_CHAIN (parmtypes) == void_list_node)
        !          9575:        error ("invalid constructor; you probably meant `%s (%s&)'",
        !          9576:               TYPE_NAME_STRING (ctype),
        !          9577:               TYPE_NAME_STRING (ctype));
        !          9578:       SET_IDENTIFIER_ERROR_LOCUS (DECL_NAME (decl), ctype);
        !          9579:       TYPE_GETS_INIT_AGGR (ctype) = 1;
        !          9580:     }
        !          9581:   else if (TREE_CODE (parmtype) == VOID_TYPE
        !          9582:           || TREE_PURPOSE (parmtypes) != NULL_TREE)
        !          9583:     TYPE_HAS_DEFAULT_CONSTRUCTOR (ctype) = 1;
        !          9584: }
        !          9585: 
        !          9586: /* An operator with this name can be either unary or binary.  */
        !          9587: int ambi_op_p (name)
        !          9588:      tree name;
        !          9589: {
        !          9590:   return (name == ansi_opname [(int) INDIRECT_REF]
        !          9591:          || name == ansi_opname [(int) ADDR_EXPR]
        !          9592:          || name == ansi_opname [(int) NEGATE_EXPR]
        !          9593:          || name == ansi_opname[(int) POSTINCREMENT_EXPR]
        !          9594:          || name == ansi_opname[(int) POSTDECREMENT_EXPR]
        !          9595:          || name == ansi_opname [(int) CONVERT_EXPR]);
        !          9596: }
        !          9597: 
        !          9598: /* An operator with this name can only be unary.  */
        !          9599: int unary_op_p (name)
        !          9600:      tree name;
        !          9601: {
        !          9602:   return (name == ansi_opname [(int) TRUTH_NOT_EXPR]
        !          9603:          || name == ansi_opname [(int) BIT_NOT_EXPR]
        !          9604:          || name == ansi_opname [(int) COMPONENT_REF]
        !          9605:          || OPERATOR_TYPENAME_P (name));
        !          9606: }
        !          9607: 
        !          9608: /* Do a little sanity-checking on how they declared their operator.  */
        !          9609: static void
        !          9610: grok_op_properties (decl, virtualp)
        !          9611:      tree decl;
        !          9612:      int virtualp;
        !          9613: {
        !          9614:   tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
        !          9615:   int methodp = (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE);
        !          9616:   tree name = DECL_NAME (decl);
        !          9617: 
        !          9618:   if (name == ansi_opname[(int) NEW_EXPR])
        !          9619:     {
        !          9620: #if 0 /* When the compiler encounters the definition of A::operator new, it
        !          9621:         doesn't look at the class declaration to find out if it's static.  */
        !          9622:        my_friendly_assert (!methodp, 355);
        !          9623: #endif
        !          9624:      
        !          9625:       /* Take care of function decl if we had syntax errors.  */
        !          9626:       if (argtypes == NULL_TREE)
        !          9627:        TREE_TYPE (decl) =
        !          9628:          build_function_type (ptr_type_node,
        !          9629:                               hash_tree_chain (integer_type_node,
        !          9630:                                                void_list_node));
        !          9631:       else
        !          9632:        decl = coerce_new_type (TREE_TYPE (decl));
        !          9633:     }
        !          9634:   else if (name == ansi_opname[(int) DELETE_EXPR])
        !          9635:     {
        !          9636: #if 0
        !          9637:        my_friendly_assert (!methodp, 355);
        !          9638: #endif
        !          9639:      
        !          9640:       if (argtypes == NULL_TREE)
        !          9641:        TREE_TYPE (decl) =
        !          9642:          build_function_type (void_type_node,
        !          9643:                               hash_tree_chain (ptr_type_node,
        !          9644:                                                void_list_node));
        !          9645:       else
        !          9646:        decl = coerce_delete_type (TREE_TYPE (decl));
        !          9647:     }
        !          9648:   /* 13.4.0.3 */
        !          9649:   else if (name == ansi_opname[(int) COND_EXPR])
        !          9650:     error("`operator ?:' cannot be overloaded");
        !          9651:   else
        !          9652:     {
        !          9653:       /* An operator function must either be a non-static member function
        !          9654:         or have at least one parameter of a class, a reference to a class,
        !          9655:         an enumeration, or a reference to an enumeration.  13.4.0.6 */
        !          9656:       if (! methodp)
        !          9657:        {
        !          9658:          if (OPERATOR_TYPENAME_P (name)
        !          9659:              || name == ansi_opname[(int) CALL_EXPR]
        !          9660:              || name == ansi_opname[(int) MODIFY_EXPR]
        !          9661:              || name == ansi_opname[(int) COMPONENT_REF]
        !          9662:              || name == ansi_opname[(int) ARRAY_REF])
        !          9663:            cp_error ("`%D' must be a nonstatic member function", decl);
        !          9664:          else
        !          9665:            {
        !          9666:              tree p = argtypes;
        !          9667: 
        !          9668:              if (p)
        !          9669:                for (; TREE_VALUE (p) != void_type_node ; p = TREE_CHAIN (p))
        !          9670:                  {
        !          9671:                    tree arg = TREE_VALUE (p);
        !          9672:                    if (TREE_CODE (arg) == REFERENCE_TYPE)
        !          9673:                      arg = TREE_TYPE (arg);
        !          9674: 
        !          9675:                    /* This lets bad template code slip through.  */
        !          9676:                    if (IS_AGGR_TYPE (arg)
        !          9677:                        || TREE_CODE (arg) == ENUMERAL_TYPE
        !          9678:                        || TREE_CODE (arg) == TEMPLATE_TYPE_PARM)
        !          9679:                      goto foundaggr;
        !          9680:                  }
        !          9681:              cp_error
        !          9682:                ("`%D' must have an argument of class or enumerated type",
        !          9683:                 decl);
        !          9684:            foundaggr:
        !          9685:              ;
        !          9686:            }
        !          9687:        }
        !          9688:       
        !          9689:       if (name == ansi_opname[(int) CALL_EXPR]
        !          9690:          || name == ansi_opname[(int) METHOD_CALL_EXPR])
        !          9691:        return;                 /* no restrictions on args */
        !          9692: 
        !          9693:       if (name == ansi_opname[(int) MODIFY_EXPR])
        !          9694:        {
        !          9695:          tree parmtype;
        !          9696: 
        !          9697:          if (list_length (argtypes) != 3 && methodp)
        !          9698:            {
        !          9699:              cp_error ("`%D' must take exactly one argument", decl);
        !          9700:              return;
        !          9701:            }
        !          9702:          parmtype = TREE_VALUE (TREE_CHAIN (argtypes));
        !          9703: 
        !          9704:          if (TREE_CODE (parmtype) == REFERENCE_TYPE
        !          9705:              && TREE_TYPE (parmtype) == current_class_type)
        !          9706:            {
        !          9707:              TYPE_HAS_ASSIGN_REF (current_class_type) = 1;
        !          9708:              TYPE_GETS_ASSIGN_REF (current_class_type) = 1;
        !          9709:              if (TYPE_READONLY (TREE_TYPE (parmtype)))
        !          9710:                TYPE_GETS_CONST_INIT_REF (current_class_type) = 1;
        !          9711:            }
        !          9712:        }
        !          9713:       else if (ambi_op_p (name))
        !          9714:        {
        !          9715:          if (list_length (argtypes) == 2)
        !          9716:            /* prefix */;
        !          9717:          else if (list_length (argtypes) == 3)
        !          9718:            {
        !          9719:              if ((name == ansi_opname[(int) POSTINCREMENT_EXPR]
        !          9720:                   || name == ansi_opname[(int) POSTDECREMENT_EXPR])
        !          9721:                  && TREE_VALUE (TREE_CHAIN (argtypes)) != integer_type_node)
        !          9722:                {
        !          9723:                  if (methodp)
        !          9724:                    cp_error ("postfix `%D' must take `int' as its argument",
        !          9725:                              decl);
        !          9726:                  else
        !          9727:                    cp_error
        !          9728:                      ("postfix `%D' must take `int' as its second argument",
        !          9729:                       decl);
        !          9730:                }
        !          9731:            }
        !          9732:          else
        !          9733:            {
        !          9734:              if (methodp)
        !          9735:                cp_error ("`%D' must take either zero or one argument", decl);
        !          9736:              else
        !          9737:                cp_error ("`%D' must take either one or two arguments", decl);
        !          9738:            }
        !          9739:        }
        !          9740:       else if (unary_op_p (name))
        !          9741:        {
        !          9742:          if (list_length (argtypes) != 2)
        !          9743:            {
        !          9744:              if (methodp)
        !          9745:                cp_error ("`%D' must take `void'", decl);
        !          9746:              else
        !          9747:                cp_error ("`%D' must take exactly one argument", decl);
        !          9748:            }
        !          9749:        }
        !          9750:       else /* if (binary_op_p (name)) */
        !          9751:        {
        !          9752:          if (list_length (argtypes) != 3)
        !          9753:            {
        !          9754:              if (methodp)
        !          9755:                cp_error ("`%D' must take exactly one argument", decl);
        !          9756:              else
        !          9757:                cp_error ("`%D' must take exactly two arguments", decl);
        !          9758:            }
        !          9759:        }
        !          9760: 
        !          9761:       /* 13.4.0.8 */
        !          9762:       if (argtypes)
        !          9763:        for (; argtypes != void_list_node ; argtypes = TREE_CHAIN (argtypes))
        !          9764:          if (TREE_PURPOSE (argtypes))
        !          9765:            {
        !          9766:              TREE_PURPOSE (argtypes) = NULL_TREE;
        !          9767:              cp_error ("`%D' cannot have default arguments", decl);
        !          9768:            }
        !          9769:     }
        !          9770: }
        !          9771: 
        !          9772: /* Get the struct, enum or union (CODE says which) with tag NAME.
        !          9773:    Define the tag as a forward-reference if it is not defined.
        !          9774: 
        !          9775:    C++: If a class derivation is given, process it here, and report
        !          9776:    an error if multiple derivation declarations are not identical.
        !          9777: 
        !          9778:    If this is a definition, come in through xref_tag and only look in
        !          9779:    the current frame for the name (since C++ allows new names in any
        !          9780:    scope.)  */
        !          9781: 
        !          9782: /* avoid rewriting all callers of xref_tag */
        !          9783: static int xref_next_defn = 0;
        !          9784: 
        !          9785: tree
        !          9786: xref_defn_tag (code_type_node, name, binfo)
        !          9787:      tree code_type_node;
        !          9788:      tree name, binfo;
        !          9789: {
        !          9790:   tree rv, ncp;
        !          9791:   xref_next_defn = 1;
        !          9792: 
        !          9793:   if (class_binding_level)
        !          9794:     {
        !          9795:       tree n1;
        !          9796:       char *buf;
        !          9797:       /* we need to build a new IDENTIFIER_NODE for name which nukes
        !          9798:        * the pieces... */
        !          9799:       n1 = IDENTIFIER_LOCAL_VALUE (current_class_name);
        !          9800:       if (n1)
        !          9801:        n1 = DECL_NAME (n1);
        !          9802:       else
        !          9803:        n1 = current_class_name;
        !          9804:       
        !          9805:       buf = (char *) alloca (4 + IDENTIFIER_LENGTH (n1)
        !          9806:                             + IDENTIFIER_LENGTH (name));
        !          9807:       
        !          9808:       sprintf (buf, "%s::%s", IDENTIFIER_POINTER (n1),
        !          9809:               IDENTIFIER_POINTER (name));
        !          9810:       ncp = get_identifier (buf);
        !          9811: #ifdef SPEW_DEBUG
        !          9812:       if (spew_debug)
        !          9813:        printf("*** %s ***\n", IDENTIFIER_POINTER (ncp));
        !          9814: #endif
        !          9815: #if 0
        !          9816:       IDENTIFIER_LOCAL_VALUE (name) =
        !          9817:        build_lang_decl (TYPE_DECL, ncp, NULL_TREE);
        !          9818: #endif
        !          9819:       rv = xref_tag (code_type_node, name, binfo);
        !          9820:       {
        !          9821:        register tree type_decl = build_lang_decl (TYPE_DECL, ncp, rv);
        !          9822: #ifdef DWARF_DEBUGGING_INFO
        !          9823:        /* Mark the TYPE_DECL node created just above as a gratuitous one
        !          9824:           so that dwarfout.c will know not to generate a TAG_typedef DIE
        !          9825:           for it.  */
        !          9826:        if (write_symbols == DWARF_DEBUG)
        !          9827:          DECL_IGNORED_P (type_decl) = 1;
        !          9828: #endif /* DWARF_DEBUGGING_INFO */
        !          9829:        pushdecl_top_level (type_decl);
        !          9830:       }
        !          9831:     }
        !          9832:   else
        !          9833:     {
        !          9834:       rv = xref_tag (code_type_node, name, binfo);
        !          9835:     }
        !          9836:   xref_next_defn = 0;
        !          9837:   return rv;
        !          9838: }
        !          9839: 
        !          9840: tree
        !          9841: xref_tag (code_type_node, name, binfo)
        !          9842:      tree code_type_node;
        !          9843:      tree name, binfo;
        !          9844: {
        !          9845:   enum tag_types tag_code;
        !          9846:   enum tree_code code;
        !          9847:   int temp = 0;
        !          9848:   int i, len;
        !          9849:   register tree ref;
        !          9850:   struct binding_level *b
        !          9851:     = (class_binding_level ? class_binding_level : current_binding_level);
        !          9852: 
        !          9853:   tag_code = (enum tag_types) TREE_INT_CST_LOW (code_type_node);
        !          9854:   switch (tag_code)
        !          9855:     {
        !          9856:     case record_type:
        !          9857:     case class_type:
        !          9858:     case exception_type:
        !          9859:       code = RECORD_TYPE;
        !          9860:       len = list_length (binfo);
        !          9861:       break;
        !          9862:     case union_type:
        !          9863:       code = UNION_TYPE;
        !          9864:       if (binfo)
        !          9865:        {
        !          9866:          cp_error ("derived union `%T' invalid", name);
        !          9867:          binfo = NULL_TREE;
        !          9868:        }
        !          9869:       len = 0;
        !          9870:       break;
        !          9871:     case enum_type:
        !          9872:       code = ENUMERAL_TYPE;
        !          9873:       break;
        !          9874:     default:
        !          9875:       my_friendly_abort (18);
        !          9876:     }
        !          9877: 
        !          9878:   /* If a cross reference is requested, look up the type
        !          9879:      already defined for this tag and return it.  */
        !          9880:   if (xref_next_defn)
        !          9881:     {
        !          9882:       /* If we know we are defining this tag, only look it up in this scope
        !          9883:        * and don't try to find it as a type. */
        !          9884:       xref_next_defn = 0;
        !          9885:       ref = lookup_tag (code, name, b, 1);
        !          9886:     }
        !          9887:   else
        !          9888:     {
        !          9889:       ref = lookup_tag (code, name, b, 0);
        !          9890: 
        !          9891:       if (! ref)
        !          9892:        {
        !          9893:          /* Try finding it as a type declaration.  If that wins, use it.  */
        !          9894:          ref = lookup_name (name, 1);
        !          9895:          if (ref && TREE_CODE (ref) == TYPE_DECL
        !          9896:              && TREE_CODE (TREE_TYPE (ref)) == code)
        !          9897:            ref = TREE_TYPE (ref);
        !          9898:          else
        !          9899:            ref = NULL_TREE;
        !          9900:        }
        !          9901:     }
        !          9902: 
        !          9903:   push_obstacks_nochange ();
        !          9904: 
        !          9905:   if (! ref)
        !          9906:     {
        !          9907:       /* If no such tag is yet defined, create a forward-reference node
        !          9908:         and record it as the "definition".
        !          9909:         When a real declaration of this type is found,
        !          9910:         the forward-reference will be altered into a real type.  */
        !          9911: 
        !          9912:       /* In C++, since these migrate into the global scope, we must
        !          9913:         build them on the permanent obstack.  */
        !          9914: 
        !          9915:       temp = allocation_temporary_p ();
        !          9916:       if (temp)
        !          9917:        end_temporary_allocation ();
        !          9918: 
        !          9919:       if (code == ENUMERAL_TYPE)
        !          9920:        {
        !          9921:          ref = make_node (ENUMERAL_TYPE);
        !          9922: 
        !          9923:          /* Give the type a default layout like unsigned int
        !          9924:             to avoid crashing if it does not get defined.  */
        !          9925:          TYPE_MODE (ref) = TYPE_MODE (unsigned_type_node);
        !          9926:          TYPE_ALIGN (ref) = TYPE_ALIGN (unsigned_type_node);
        !          9927:          TREE_UNSIGNED (ref) = 1;
        !          9928:          TYPE_PRECISION (ref) = TYPE_PRECISION (unsigned_type_node);
        !          9929:          TYPE_MIN_VALUE (ref) = TYPE_MIN_VALUE (unsigned_type_node);
        !          9930:          TYPE_MAX_VALUE (ref) = TYPE_MAX_VALUE (unsigned_type_node);
        !          9931: 
        !          9932:          /* Enable us to recognize when a type is created in class context.
        !          9933:             To do nested classes correctly, this should probably be cleared
        !          9934:             out when we leave this classes scope.  Currently this in only
        !          9935:             done in `start_enum'.  */
        !          9936: 
        !          9937:          pushtag (name, ref);
        !          9938:          if (flag_cadillac)
        !          9939:            cadillac_start_enum (ref);
        !          9940:        }
        !          9941:       else if (tag_code == exception_type)
        !          9942:        {
        !          9943:          ref = make_lang_type (code);
        !          9944:          /* Enable us to recognize when an exception type is created in
        !          9945:             class context.  To do nested classes correctly, this should
        !          9946:             probably be cleared out when we leave this class's scope.  */
        !          9947:          CLASSTYPE_DECLARED_EXCEPTION (ref) = 1;
        !          9948:          pushtag (name, ref);
        !          9949:          if (flag_cadillac)
        !          9950:            cadillac_start_struct (ref);
        !          9951:        }
        !          9952:       else
        !          9953:        {
        !          9954:          extern tree pending_vtables;
        !          9955:          struct binding_level *old_b = class_binding_level;
        !          9956:          int needs_writing;
        !          9957: 
        !          9958:          ref = make_lang_type (code);
        !          9959: 
        !          9960:          /* Record how to set the visibility of this class's
        !          9961:             virtual functions.  If write_virtuals == 2 or 3, then
        !          9962:             inline virtuals are ``extern inline''.  */
        !          9963:          switch (write_virtuals)
        !          9964:            {
        !          9965:            case 0:
        !          9966:            case 1:
        !          9967:              needs_writing = 1;
        !          9968:              break;
        !          9969:            case 2:
        !          9970:              needs_writing = !! value_member (name, pending_vtables);
        !          9971:              break;
        !          9972:            case 3:
        !          9973:              needs_writing = ! CLASSTYPE_INTERFACE_ONLY (ref)
        !          9974:                && CLASSTYPE_INTERFACE_KNOWN (ref);
        !          9975:              break;
        !          9976:            default:
        !          9977:              needs_writing = 0;
        !          9978:            }
        !          9979: 
        !          9980:          CLASSTYPE_VTABLE_NEEDS_WRITING (ref) = needs_writing;
        !          9981: 
        !          9982: #ifdef NONNESTED_CLASSES
        !          9983:          /* Class types don't nest the way enums do.  */
        !          9984:          class_binding_level = (struct binding_level *)0;
        !          9985: #endif
        !          9986:          pushtag (name, ref);
        !          9987:          class_binding_level = old_b;
        !          9988: 
        !          9989:          if (flag_cadillac)
        !          9990:            cadillac_start_struct (ref);
        !          9991:        }
        !          9992:     }
        !          9993:   else
        !          9994:     {
        !          9995:       if (IS_AGGR_TYPE_CODE (code))
        !          9996:        {
        !          9997:          if (IS_AGGR_TYPE (ref)
        !          9998:              && ((tag_code == exception_type)
        !          9999:                  != (CLASSTYPE_DECLARED_EXCEPTION (ref) == 1)))
        !          10000:            {
        !          10001:              cp_error ("type `%T' is both exception and aggregate type", ref);
        !          10002:              CLASSTYPE_DECLARED_EXCEPTION (ref) = (tag_code == exception_type);
        !          10003:            }
        !          10004:        }
        !          10005: 
        !          10006:       /* If it no longer looks like a nested type, make sure it's
        !          10007:         in global scope.  */
        !          10008:       if (b == global_binding_level && !class_binding_level
        !          10009:          && IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE)
        !          10010:        IDENTIFIER_GLOBAL_VALUE (name) = TYPE_NAME (ref);
        !          10011: 
        !          10012:       if (binfo)
        !          10013:        {
        !          10014:          tree tt1 = binfo;
        !          10015:          tree tt2 = TYPE_BINFO_BASETYPES (ref);
        !          10016: 
        !          10017:          if (TYPE_BINFO_BASETYPES (ref))
        !          10018:            for (i = 0; tt1; i++, tt1 = TREE_CHAIN (tt1))
        !          10019:              if (TREE_VALUE (tt1) != TYPE_IDENTIFIER (BINFO_TYPE (TREE_VEC_ELT (tt2, i))))
        !          10020:                {
        !          10021:                  cp_error ("redeclaration of derivation chain of type `%#T'",
        !          10022:                            ref);
        !          10023:                  break;
        !          10024:                }
        !          10025: 
        !          10026:          if (tt1 == NULL_TREE)
        !          10027:            /* The user told us something we already knew.  */
        !          10028:            goto just_return;
        !          10029: 
        !          10030:          /* In C++, since these migrate into the global scope, we must
        !          10031:             build them on the permanent obstack.  */
        !          10032:          end_temporary_allocation ();
        !          10033:        }
        !          10034:     }
        !          10035: 
        !          10036:   if (binfo)
        !          10037:     {
        !          10038:       /* In the declaration `A : X, Y, ... Z' we mark all the types
        !          10039:         (A, X, Y, ..., Z) so we can check for duplicates.  */
        !          10040:       tree binfos;
        !          10041: 
        !          10042:       SET_CLASSTYPE_MARKED (ref);
        !          10043:       BINFO_BASETYPES (TYPE_BINFO (ref)) = binfos = make_tree_vec (len);
        !          10044: 
        !          10045:       for (i = 0; binfo; binfo = TREE_CHAIN (binfo))
        !          10046:        {
        !          10047:          /* The base of a derived struct is public.  */
        !          10048:          int via_public = (tag_code != class_type
        !          10049:                            || TREE_PURPOSE (binfo) == (tree)visibility_public
        !          10050:                            || TREE_PURPOSE (binfo) == (tree)visibility_public_virtual);
        !          10051:          int via_protected = TREE_PURPOSE (binfo) == (tree)visibility_protected;
        !          10052:          int via_virtual = (TREE_PURPOSE (binfo) == (tree)visibility_private_virtual
        !          10053:                             || TREE_PURPOSE (binfo) == (tree)visibility_public_virtual
        !          10054:                             || TREE_PURPOSE (binfo) == (tree)visibility_default_virtual);
        !          10055:          tree basetype = TREE_TYPE (TREE_VALUE (binfo));
        !          10056:          tree base_binfo;
        !          10057: 
        !          10058:          GNU_xref_hier (IDENTIFIER_POINTER (name),
        !          10059:                         IDENTIFIER_POINTER (TREE_VALUE (binfo)),
        !          10060:                         via_public, via_virtual, 0);
        !          10061: 
        !          10062:          if (basetype && TREE_CODE (basetype) == TYPE_DECL)
        !          10063:            basetype = TREE_TYPE (basetype);
        !          10064:          if (!basetype || TREE_CODE (basetype) != RECORD_TYPE)
        !          10065:            {
        !          10066:              error ("base type `%s' fails to be a struct or class type",
        !          10067:                     IDENTIFIER_POINTER (TREE_VALUE (binfo)));
        !          10068:              continue;
        !          10069:            }
        !          10070: #if 1
        !          10071:          /* This code replaces similar code in layout_basetypes.  */
        !          10072:          else if (TYPE_SIZE (basetype) == NULL_TREE)
        !          10073:            {
        !          10074:              cp_error ("base class `%T' has incomplete type", basetype);
        !          10075:              continue;
        !          10076:            }
        !          10077: #endif
        !          10078:          else
        !          10079:            {
        !          10080:              if (CLASSTYPE_MARKED (basetype))
        !          10081:                {
        !          10082:                  if (basetype == ref)
        !          10083:                    cp_error ("recursive type `%T' undefined", basetype);
        !          10084:                  else
        !          10085:                    cp_error ("duplicate base type `%T' invalid", basetype);
        !          10086:                  continue;
        !          10087:                }
        !          10088: 
        !          10089:              /* Note that the BINFO records which describe individual
        !          10090:                 inheritances are *not* shared in the lattice!  They
        !          10091:                 cannot be shared because a given baseclass may be
        !          10092:                 inherited with different `accessibility' by different
        !          10093:                 derived classes.  (Each BINFO record describing an
        !          10094:                 individual inheritance contains flags which say what
        !          10095:                 the `accessibility' of that particular inheritance is.)  */
        !          10096:   
        !          10097:              base_binfo = make_binfo (integer_zero_node, basetype,
        !          10098:                                  TYPE_BINFO_VTABLE (basetype),
        !          10099:                                  TYPE_BINFO_VIRTUALS (basetype), 0);
        !          10100:  
        !          10101:              TREE_VEC_ELT (binfos, i) = base_binfo;
        !          10102:              TREE_VIA_PUBLIC (base_binfo) = via_public;
        !          10103:              TREE_VIA_PROTECTED (base_binfo) = via_protected;
        !          10104:              TREE_VIA_VIRTUAL (base_binfo) = via_virtual;
        !          10105: 
        !          10106:              SET_CLASSTYPE_MARKED (basetype);
        !          10107: #if 0
        !          10108: /* XYZZY TEST VIRTUAL BASECLASSES */
        !          10109: if (CLASSTYPE_N_BASECLASSES (basetype) == NULL_TREE
        !          10110:     && TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype)
        !          10111:     && via_virtual == 0)
        !          10112:   {
        !          10113:     warning ("making type `%s' a virtual baseclass",
        !          10114:             TYPE_NAME_STRING (basetype));
        !          10115:     via_virtual = 1;
        !          10116:   }
        !          10117: #endif
        !          10118:              /* We are free to modify these bits because they are meaningless
        !          10119:                 at top level, and BASETYPE is a top-level type.  */
        !          10120:              if (via_virtual || TYPE_USES_VIRTUAL_BASECLASSES (basetype))
        !          10121:                {
        !          10122:                  TYPE_USES_VIRTUAL_BASECLASSES (ref) = 1;
        !          10123:                  TYPE_USES_COMPLEX_INHERITANCE (ref) = 1;
        !          10124:                }
        !          10125: 
        !          10126:              TYPE_GETS_ASSIGNMENT (ref) |= TYPE_GETS_ASSIGNMENT (basetype);
        !          10127:              TYPE_OVERLOADS_METHOD_CALL_EXPR (ref) |= TYPE_OVERLOADS_METHOD_CALL_EXPR (basetype);
        !          10128:              TREE_GETS_NEW (ref) |= TREE_GETS_NEW (basetype);
        !          10129:              TREE_GETS_DELETE (ref) |= TREE_GETS_DELETE (basetype);
        !          10130:              CLASSTYPE_LOCAL_TYPEDECLS (ref) |= CLASSTYPE_LOCAL_TYPEDECLS (basetype);
        !          10131:              i += 1;
        !          10132:            }
        !          10133:        }
        !          10134:       if (i)
        !          10135:        TREE_VEC_LENGTH (binfos) = i;
        !          10136:       else
        !          10137:        BINFO_BASETYPES (TYPE_BINFO (ref)) = NULL_TREE;
        !          10138: 
        !          10139:       if (i > 1)
        !          10140:        TYPE_USES_MULTIPLE_INHERITANCE (ref) = 1;
        !          10141:       else if (i == 1)
        !          10142:        TYPE_USES_MULTIPLE_INHERITANCE (ref)
        !          10143:          = TYPE_USES_MULTIPLE_INHERITANCE (BINFO_TYPE (TREE_VEC_ELT (binfos, 0)));
        !          10144:       if (TYPE_USES_MULTIPLE_INHERITANCE (ref))
        !          10145:        TYPE_USES_COMPLEX_INHERITANCE (ref) = 1;
        !          10146: 
        !          10147:       /* Unmark all the types.  */
        !          10148:       while (--i >= 0)
        !          10149:        CLEAR_CLASSTYPE_MARKED (BINFO_TYPE (TREE_VEC_ELT (binfos, i)));
        !          10150:       CLEAR_CLASSTYPE_MARKED (ref);
        !          10151:     }
        !          10152: 
        !          10153:  just_return:
        !          10154: 
        !          10155:   /* Until the type is defined, tentatively accept whatever
        !          10156:      structure tag the user hands us.  */
        !          10157:   if (TYPE_SIZE (ref) == NULL_TREE
        !          10158:       && ref != current_class_type
        !          10159:       /* Have to check this, in case we have contradictory tag info.  */
        !          10160:       && IS_AGGR_TYPE_CODE (TREE_CODE (ref)))
        !          10161:     {
        !          10162:       if (tag_code == class_type)
        !          10163:        CLASSTYPE_DECLARED_CLASS (ref) = 1;
        !          10164:       else if (tag_code == record_type)
        !          10165:        CLASSTYPE_DECLARED_CLASS (ref) = 0;
        !          10166:     }
        !          10167: 
        !          10168:   pop_obstacks ();
        !          10169: 
        !          10170:   return ref;
        !          10171: }
        !          10172: 
        !          10173: static tree current_local_enum = NULL_TREE;
        !          10174: 
        !          10175: /* Begin compiling the definition of an enumeration type.
        !          10176:    NAME is its name (or null if anonymous).
        !          10177:    Returns the type object, as yet incomplete.
        !          10178:    Also records info about it so that build_enumerator
        !          10179:    may be used to declare the individual values as they are read.  */
        !          10180: 
        !          10181: tree
        !          10182: start_enum (name)
        !          10183:      tree name;
        !          10184: {
        !          10185:   register tree enumtype = NULL_TREE;
        !          10186:   struct binding_level *b
        !          10187:     = (class_binding_level ? class_binding_level : current_binding_level);
        !          10188: 
        !          10189:   /* If this is the real definition for a previous forward reference,
        !          10190:      fill in the contents in the same object that used to be the
        !          10191:      forward reference.  */
        !          10192: 
        !          10193:   if (name != NULL_TREE)
        !          10194:     enumtype = lookup_tag (ENUMERAL_TYPE, name, b, 1);
        !          10195: 
        !          10196:   if (enumtype != NULL_TREE && TREE_CODE (enumtype) == ENUMERAL_TYPE)
        !          10197:     cp_error ("multiple definition of enum `%T'", enumtype);
        !          10198:   else
        !          10199:     {
        !          10200:       enumtype = make_node (ENUMERAL_TYPE);
        !          10201:       pushtag (name, enumtype);
        !          10202:     }
        !          10203: 
        !          10204:   if (current_class_type)
        !          10205:     TREE_ADDRESSABLE (b->tags) = 1;
        !          10206:   current_local_enum = NULL_TREE;
        !          10207: 
        !          10208:   if (TYPE_VALUES (enumtype) != NULL_TREE)
        !          10209:     /* Completely replace its old definition.
        !          10210:        The old enumerators remain defined, however.  */
        !          10211:     TYPE_VALUES (enumtype) = NULL_TREE;
        !          10212: 
        !          10213:   /* Initially, set up this enum as like `int'
        !          10214:      so that we can create the enumerators' declarations and values.
        !          10215:      Later on, the precision of the type may be changed and
        !          10216:      it may be laid out again.  */
        !          10217: 
        !          10218:   TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node);
        !          10219:   TYPE_SIZE (enumtype) = NULL_TREE;
        !          10220:   fixup_unsigned_type (enumtype);
        !          10221: 
        !          10222:   /* We copy this value because enumerated type constants
        !          10223:      are really of the type of the enumerator, not integer_type_node.  */
        !          10224:   enum_next_value = copy_node (integer_zero_node);
        !          10225: 
        !          10226:   GNU_xref_decl (current_function_decl, enumtype);
        !          10227:   return enumtype;
        !          10228: }
        !          10229: 
        !          10230: /* After processing and defining all the values of an enumeration type,
        !          10231:    install their decls in the enumeration type and finish it off.
        !          10232:    ENUMTYPE is the type object and VALUES a list of name-value pairs.
        !          10233:    Returns ENUMTYPE.  */
        !          10234: 
        !          10235: tree
        !          10236: finish_enum (enumtype, values)
        !          10237:      register tree enumtype, values;
        !          10238: {
        !          10239:   register tree pair, tem;
        !          10240:   register HOST_WIDE_INT maxvalue = 0;
        !          10241:   register HOST_WIDE_INT minvalue = 0;
        !          10242:   register HOST_WIDE_INT i;
        !          10243: 
        !          10244:   TYPE_VALUES (enumtype) = values;
        !          10245: 
        !          10246:   /* Calculate the maximum value of any enumerator in this type.  */
        !          10247: 
        !          10248:   if (values)
        !          10249:     {
        !          10250:       /* Speed up the main loop by performing some precalculations */
        !          10251: 
        !          10252:       HOST_WIDE_INT value = TREE_INT_CST_LOW (TREE_VALUE (values));
        !          10253:       TREE_TYPE (TREE_VALUE (values)) = enumtype;
        !          10254:       minvalue = maxvalue = value;
        !          10255:       
        !          10256:       for (pair = TREE_CHAIN (values); pair; pair = TREE_CHAIN (pair))
        !          10257:        {
        !          10258:          value = TREE_INT_CST_LOW (TREE_VALUE (pair));
        !          10259:          if (value > maxvalue)
        !          10260:            maxvalue = value;
        !          10261:          else if (value < minvalue)
        !          10262:            minvalue = value;
        !          10263:          TREE_TYPE (TREE_VALUE (pair)) = enumtype;
        !          10264:        }
        !          10265:     }
        !          10266: 
        !          10267:   if (flag_short_enums)
        !          10268:     {
        !          10269:       /* Determine the precision this type needs, lay it out, and define it.  */
        !          10270: 
        !          10271:       for (i = maxvalue; i; i >>= 1)
        !          10272:        TYPE_PRECISION (enumtype)++;
        !          10273: 
        !          10274:       if (!TYPE_PRECISION (enumtype))
        !          10275:        TYPE_PRECISION (enumtype) = 1;
        !          10276: 
        !          10277:       /* Cancel the laying out previously done for the enum type,
        !          10278:         so that fixup_unsigned_type will do it over.  */
        !          10279:       TYPE_SIZE (enumtype) = NULL_TREE;
        !          10280: 
        !          10281:       fixup_unsigned_type (enumtype);
        !          10282:     }
        !          10283: 
        !          10284:   TREE_INT_CST_LOW (TYPE_MAX_VALUE (enumtype)) = maxvalue;
        !          10285: 
        !          10286:   /* An enum can have some negative values; then it is signed.  */
        !          10287:   if (minvalue < 0)
        !          10288:     {
        !          10289:       TREE_INT_CST_LOW (TYPE_MIN_VALUE (enumtype)) = minvalue;
        !          10290:       TREE_INT_CST_HIGH (TYPE_MIN_VALUE (enumtype)) = -1;
        !          10291:       TREE_UNSIGNED (enumtype) = 0;
        !          10292:     }
        !          10293:   if (flag_cadillac)
        !          10294:     cadillac_finish_enum (enumtype);
        !          10295: 
        !          10296:   /* Fix up all variant types of this enum type.  */
        !          10297:   for (tem = TYPE_MAIN_VARIANT (enumtype); tem; tem = TYPE_NEXT_VARIANT (tem))
        !          10298:     {
        !          10299:       TYPE_VALUES (tem) = TYPE_VALUES (enumtype);
        !          10300:       TYPE_MIN_VALUE (tem) = TYPE_MIN_VALUE (enumtype);
        !          10301:       TYPE_MAX_VALUE (tem) = TYPE_MAX_VALUE (enumtype);
        !          10302:       TYPE_SIZE (tem) = TYPE_SIZE (enumtype);
        !          10303:       TYPE_MODE (tem) = TYPE_MODE (enumtype);
        !          10304:       TYPE_PRECISION (tem) = TYPE_PRECISION (enumtype);
        !          10305:       TYPE_ALIGN (tem) = TYPE_ALIGN (enumtype);
        !          10306:       TREE_UNSIGNED (tem) = TREE_UNSIGNED (enumtype);
        !          10307:     }
        !          10308: 
        !          10309:   /* Finish debugging output for this type.  */
        !          10310: #if 0
        !          10311:   /* @@ Do we ever generate generate ENUMERAL_TYPE nodes for which debugging
        !          10312:      information should *not* be generated?  I think not.  */
        !          10313:   if (! DECL_IGNORED_P (TYPE_NAME (enumtype)))
        !          10314: #endif
        !          10315:     rest_of_type_compilation (enumtype, global_bindings_p ());
        !          10316: 
        !          10317:   return enumtype;
        !          10318: }
        !          10319: 
        !          10320: /* Build and install a CONST_DECL for one value of the
        !          10321:    current enumeration type (one that was begun with start_enum).
        !          10322:    Return a tree-list containing the name and its value.
        !          10323:    Assignment of sequential values by default is handled here.  */
        !          10324: 
        !          10325: tree
        !          10326: build_enumerator (name, value)
        !          10327:      tree name, value;
        !          10328: {
        !          10329:   tree decl, result;
        !          10330:   /* Change this to zero if we find VALUE is not shareable.  */
        !          10331:   int shareable = 1;
        !          10332: 
        !          10333:   /* Remove no-op casts from the value.  */
        !          10334:   if (value)
        !          10335:     STRIP_TYPE_NOPS (value);
        !          10336: 
        !          10337:   /* Validate and default VALUE.  */
        !          10338:   if (value != NULL_TREE)
        !          10339:     {
        !          10340:       if (TREE_READONLY_DECL_P (value))
        !          10341:        {
        !          10342:          value = decl_constant_value (value);
        !          10343:          shareable = 0;
        !          10344:        }
        !          10345: 
        !          10346:       if (TREE_CODE (value) == INTEGER_CST)
        !          10347:        {
        !          10348:          value = default_conversion (value);
        !          10349:          constant_expression_warning (value);
        !          10350:        }
        !          10351:       else
        !          10352:        {
        !          10353:          error ("enumerator value for `%s' not integer constant",
        !          10354:                 IDENTIFIER_POINTER (name));
        !          10355:          value = NULL_TREE;
        !          10356:        }
        !          10357:     }
        !          10358: 
        !          10359:   /* The order of things is reversed here so that we
        !          10360:      can check for possible sharing of enum values,
        !          10361:      to keep that from happening.  */
        !          10362:   /* Default based on previous value.  */
        !          10363:   if (value == NULL_TREE)
        !          10364:     value = enum_next_value;
        !          10365: 
        !          10366:   /* Remove no-op casts from the value.  */
        !          10367:   if (value)
        !          10368:     STRIP_TYPE_NOPS (value);
        !          10369: 
        !          10370:   /* Make up for hacks in cp-lex.c.  */
        !          10371:   if (value == integer_zero_node)
        !          10372:     value = build_int_2 (0, 0);
        !          10373:   else if (value == integer_one_node)
        !          10374:     value = build_int_2 (1, 0);
        !          10375:   else if (TREE_CODE (value) == INTEGER_CST
        !          10376:           && (shareable == 0
        !          10377:               || TREE_CODE (TREE_TYPE (value)) == ENUMERAL_TYPE))
        !          10378:     {
        !          10379:       value = copy_node (value);
        !          10380:       TREE_TYPE (value) = integer_type_node;
        !          10381:     }
        !          10382: 
        !          10383:   result = saveable_tree_cons (name, value, NULL_TREE);
        !          10384: 
        !          10385:   /* C++ associates enums with global, function, or class declarations.  */
        !          10386: 
        !          10387:   /* There are a number of cases we need to be aware of here:
        !          10388:                                current_class_type      current_function_decl
        !          10389:      * global enums            NULL                    NULL
        !          10390:      * fn-local enum           NULL                    SET
        !          10391:      * class-local enum                SET                     NULL
        !          10392:      * class->fn->enum         SET                     SET
        !          10393:      * fn->class->enum         SET                     SET
        !          10394: 
        !          10395:      Those last two make life interesting.  If it's a fn-local enum which is
        !          10396:      itself inside a class, we need the enum to go into the fn's decls (our
        !          10397:      second case below).  But if it's a class-local enum and the class itself
        !          10398:      is inside a function, we need that enum to go into the decls for the
        !          10399:      class.  To achieve this last goal, we must see if, when both
        !          10400:      current_class_decl and current_function_decl are set, the class was
        !          10401:      declared inside that function.  If so, we know to put the enum into
        !          10402:      the class's scope.  */
        !          10403:      
        !          10404:   if ((current_class_type && ! current_function_decl)
        !          10405:       || (current_class_type && current_function_decl
        !          10406:          && TYPE_CONTEXT (current_class_type) == current_function_decl))
        !          10407:     {
        !          10408:       /* This enum declaration is local to the class, so we must put
        !          10409:         it in that class's list of decls.  */
        !          10410:       decl = build_lang_field_decl (CONST_DECL, name, integer_type_node);
        !          10411:       DECL_INITIAL (decl) = value;
        !          10412:       TREE_READONLY (decl) = 1;
        !          10413:       pushdecl_class_level (decl);
        !          10414:       TREE_CHAIN (decl) = current_local_enum;
        !          10415:       current_local_enum = decl;
        !          10416:     }
        !          10417:   else
        !          10418:     {
        !          10419:       /* It's a global enum, or it's local to a function.  (Note local to
        !          10420:         a function could mean local to a class method.  */
        !          10421:       decl = build_decl (CONST_DECL, name, integer_type_node);
        !          10422:       DECL_INITIAL (decl) = value;
        !          10423: 
        !          10424:       pushdecl (decl);
        !          10425:       GNU_xref_decl (current_function_decl, decl);
        !          10426:     }
        !          10427: 
        !          10428:   /* Set basis for default for next value.  */
        !          10429:   enum_next_value = build_binary_op_nodefault (PLUS_EXPR, value,
        !          10430:                                               integer_one_node, PLUS_EXPR);
        !          10431:   if (enum_next_value == integer_one_node)
        !          10432:     enum_next_value = copy_node (enum_next_value);
        !          10433: 
        !          10434:   return result;
        !          10435: }
        !          10436: 
        !          10437: tree
        !          10438: grok_enum_decls (type, decl)
        !          10439:      tree type, decl;
        !          10440: {
        !          10441:   tree d = current_local_enum;
        !          10442:   
        !          10443:   if (d == NULL_TREE)
        !          10444:     return decl;
        !          10445:   
        !          10446:   while (1)
        !          10447:     {
        !          10448:       TREE_TYPE (d) = type;
        !          10449:       if (TREE_CHAIN (d) == NULL_TREE)
        !          10450:        {
        !          10451:          TREE_CHAIN (d) = decl;
        !          10452:          break;
        !          10453:        }
        !          10454:       d = TREE_CHAIN (d);
        !          10455:     }
        !          10456: 
        !          10457:   decl = current_local_enum;
        !          10458:   current_local_enum = NULL_TREE;
        !          10459:   
        !          10460:   return decl;
        !          10461: }
        !          10462: 
        !          10463: /* Create the FUNCTION_DECL for a function definition.
        !          10464:    DECLSPECS and DECLARATOR are the parts of the declaration;
        !          10465:    they describe the function's name and the type it returns,
        !          10466:    but twisted together in a fashion that parallels the syntax of C.
        !          10467: 
        !          10468:    This function creates a binding context for the function body
        !          10469:    as well as setting up the FUNCTION_DECL in current_function_decl.
        !          10470: 
        !          10471:    Returns 1 on success.  If the DECLARATOR is not suitable for a function
        !          10472:    (it defines a datum instead), we return 0, which tells
        !          10473:    yyparse to report a parse error.
        !          10474: 
        !          10475:    For C++, we must first check whether that datum makes any sense.
        !          10476:    For example, "class A local_a(1,2);" means that variable local_a
        !          10477:    is an aggregate of type A, which should have a constructor
        !          10478:    applied to it with the argument list [1, 2].
        !          10479: 
        !          10480:    @@ There is currently no way to retrieve the storage
        !          10481:    @@ allocated to FUNCTION (or all of its parms) if we return
        !          10482:    @@ something we had previously.  */
        !          10483: 
        !          10484: int
        !          10485: start_function (declspecs, declarator, raises, pre_parsed_p)
        !          10486:      tree declarator, declspecs, raises;
        !          10487:      int pre_parsed_p;
        !          10488: {
        !          10489:   extern tree EHS_decl;
        !          10490:   tree decl1, olddecl;
        !          10491:   tree ctype = NULL_TREE;
        !          10492:   tree fntype;
        !          10493:   tree restype;
        !          10494:   extern int have_extern_spec;
        !          10495:   extern int used_extern_spec;
        !          10496:   int doing_friend = 0;
        !          10497: 
        !          10498:   if (flag_handle_exceptions && EHS_decl == NULL_TREE)
        !          10499:     init_exception_processing_1 ();
        !          10500: 
        !          10501:   /* Sanity check.  */
        !          10502:   my_friendly_assert (TREE_VALUE (void_list_node) == void_type_node, 160);
        !          10503:   my_friendly_assert (TREE_CHAIN (void_list_node) == NULL_TREE, 161);
        !          10504: 
        !          10505:   /* Assume, until we see it does. */
        !          10506:   current_function_returns_value = 0;
        !          10507:   current_function_returns_null = 0;
        !          10508:   warn_about_return_type = 0;
        !          10509:   current_extern_inline = 0;
        !          10510:   current_function_assigns_this = 0;
        !          10511:   current_function_just_assigned_this = 0;
        !          10512:   current_function_parms_stored = 0;
        !          10513:   original_result_rtx = NULL_RTX;
        !          10514:   current_function_obstack_index = 0;
        !          10515:   current_function_obstack_usage = 0;
        !          10516: 
        !          10517:   clear_temp_name ();
        !          10518: 
        !          10519:   /* This should only be done once on the top most decl. */
        !          10520:   if (have_extern_spec && !used_extern_spec)
        !          10521:     {
        !          10522:       declspecs = decl_tree_cons (NULL_TREE, get_identifier ("extern"), declspecs);
        !          10523:       used_extern_spec = 1;
        !          10524:     }
        !          10525: 
        !          10526:   if (pre_parsed_p)
        !          10527:     {
        !          10528:       decl1 = declarator;
        !          10529: 
        !          10530:       if (! DECL_ARGUMENTS (decl1)
        !          10531:          && !DECL_STATIC_FUNCTION_P (decl1)
        !          10532:          && DECL_CONTEXT (decl1)
        !          10533:          && DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl1)))
        !          10534:          && IDENTIFIER_TEMPLATE (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl1)))))
        !          10535:        {
        !          10536:          cp_error ("redeclaration of `%#D'", decl1);
        !          10537:          if (IDENTIFIER_CLASS_VALUE (DECL_NAME (decl1)))
        !          10538:            cp_error_at ("previous declaration here", IDENTIFIER_CLASS_VALUE (DECL_NAME (decl1)));
        !          10539:          else if (IDENTIFIER_GLOBAL_VALUE (DECL_NAME (decl1)))
        !          10540:            cp_error_at ("previous declaration here", IDENTIFIER_GLOBAL_VALUE (DECL_NAME (decl1)));
        !          10541:        }
        !          10542: 
        !          10543:       last_function_parms = DECL_ARGUMENTS (decl1);
        !          10544:       last_function_parm_tags = NULL_TREE;
        !          10545:       fntype = TREE_TYPE (decl1);
        !          10546:       if (TREE_CODE (fntype) == METHOD_TYPE)
        !          10547:        ctype = TYPE_METHOD_BASETYPE (fntype);
        !          10548: 
        !          10549:       /* ANSI C++ June 5 1992 WP 11.4.5.  A friend function defined in a
        !          10550:         class is in the (lexical) scope of the class in which it is
        !          10551:         defined.  */
        !          10552:       if (!ctype && DECL_FRIEND_P (decl1))
        !          10553:        {
        !          10554:          ctype = TREE_TYPE (TREE_CHAIN (decl1));
        !          10555: 
        !          10556:          /* CTYPE could be null here if we're dealing with a template;
        !          10557:             for example, `inline friend float foo()' inside a template
        !          10558:             will have no CTYPE set.  */
        !          10559:          if (ctype && TREE_CODE (ctype) != RECORD_TYPE)
        !          10560:            ctype = NULL_TREE;
        !          10561:          else
        !          10562:            doing_friend = 1;
        !          10563:        }
        !          10564: 
        !          10565:       if ( !(DECL_VINDEX (decl1)
        !          10566:             && write_virtuals >= 2
        !          10567:             && CLASSTYPE_VTABLE_NEEDS_WRITING (ctype)))
        !          10568:        current_extern_inline = TREE_PUBLIC (decl1) && DECL_INLINE (decl1);
        !          10569: 
        !          10570:       raises = TYPE_RAISES_EXCEPTIONS (fntype);
        !          10571: 
        !          10572:       /* In a fcn definition, arg types must be complete.  */
        !          10573:       require_complete_types_for_parms (last_function_parms);
        !          10574:     }
        !          10575:   else
        !          10576:     {
        !          10577:       decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1, raises);
        !          10578:       /* If the declarator is not suitable for a function definition,
        !          10579:         cause a syntax error.  */
        !          10580:       if (decl1 == NULL_TREE || TREE_CODE (decl1) != FUNCTION_DECL) return 0;
        !          10581: 
        !          10582:       fntype = TREE_TYPE (decl1);
        !          10583: 
        !          10584:       restype = TREE_TYPE (fntype);
        !          10585:       if (IS_AGGR_TYPE (restype) && ! TYPE_PTRMEMFUNC_P (restype)
        !          10586:          && ! CLASSTYPE_GOT_SEMICOLON (restype))
        !          10587:        {
        !          10588:          cp_error ("semicolon missing after declaration of `%#T'", restype);
        !          10589:          shadow_tag (build_tree_list (NULL_TREE, restype));
        !          10590:          CLASSTYPE_GOT_SEMICOLON (restype) = 1;
        !          10591:          if (TREE_CODE (fntype) == FUNCTION_TYPE)
        !          10592:            fntype = build_function_type (integer_type_node,
        !          10593:                                          TYPE_ARG_TYPES (fntype));
        !          10594:          else
        !          10595:            fntype = build_cplus_method_type (build_type_variant (TYPE_METHOD_BASETYPE (fntype), TREE_READONLY (decl1), TREE_SIDE_EFFECTS (decl1)),
        !          10596:                                              integer_type_node,
        !          10597:                                              TYPE_ARG_TYPES (fntype));
        !          10598:          TREE_TYPE (decl1) = fntype;
        !          10599:        }
        !          10600: 
        !          10601:       if (TREE_CODE (fntype) == METHOD_TYPE)
        !          10602:        ctype = TYPE_METHOD_BASETYPE (fntype);
        !          10603:       else if (IDENTIFIER_LENGTH (DECL_NAME (decl1)) == 4
        !          10604:               && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (decl1)), "main")
        !          10605:               && DECL_CONTEXT (decl1) == NULL_TREE)
        !          10606:        {
        !          10607:          /* If this doesn't return integer_type, complain.  */
        !          10608:          if (TREE_TYPE (TREE_TYPE (decl1)) != integer_type_node)
        !          10609:            {
        !          10610:              warning ("return type for `main' changed to integer type");
        !          10611:              TREE_TYPE (decl1) = fntype = default_function_type;
        !          10612:            }
        !          10613:          warn_about_return_type = 0;
        !          10614:        }
        !          10615:     }
        !          10616: 
        !          10617:   /* Warn if function was previously implicitly declared
        !          10618:      (but not if we warned then).  */
        !          10619:   if (! warn_implicit
        !          10620:       && IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)) != NULL_TREE)
        !          10621:     cp_warning_at ("`%D' implicitly declared before its definition", IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)));
        !          10622: 
        !          10623:   current_function_decl = decl1;
        !          10624: 
        !          10625:   if (flag_cadillac)
        !          10626:     cadillac_start_function (decl1);
        !          10627:   else
        !          10628:     announce_function (decl1);
        !          10629: 
        !          10630:   if (TYPE_SIZE (TREE_TYPE (fntype)) == NULL_TREE)
        !          10631:     {
        !          10632:       if (IS_AGGR_TYPE (TREE_TYPE (fntype)))
        !          10633:        error_with_aggr_type (TREE_TYPE (fntype),
        !          10634:                              "return-type `%s' is an incomplete type");
        !          10635:       else
        !          10636:        error ("return-type is an incomplete type");
        !          10637: 
        !          10638:       /* Make it return void instead, but don't change the
        !          10639:         type of the DECL_RESULT, in case we have a named return value.  */
        !          10640:       if (ctype)
        !          10641:        TREE_TYPE (decl1)
        !          10642:          = build_cplus_method_type (build_type_variant (ctype,
        !          10643:                                                         TREE_READONLY (decl1),
        !          10644:                                                         TREE_SIDE_EFFECTS (decl1)),
        !          10645:                                     void_type_node,
        !          10646:                                     FUNCTION_ARG_CHAIN (decl1));
        !          10647:       else
        !          10648:        TREE_TYPE (decl1)
        !          10649:          = build_function_type (void_type_node,
        !          10650:                                 TYPE_ARG_TYPES (TREE_TYPE (decl1)));
        !          10651:       DECL_RESULT (decl1) = build_decl (RESULT_DECL, 0, TREE_TYPE (fntype));
        !          10652:     }
        !          10653: 
        !          10654:   if (warn_about_return_type)
        !          10655:     warning ("return-type defaults to `int'");
        !          10656: 
        !          10657:   /* Make the init_value nonzero so pushdecl knows this is not tentative.
        !          10658:      error_mark_node is replaced below (in poplevel) with the BLOCK.  */
        !          10659:   DECL_INITIAL (decl1) = error_mark_node;
        !          10660: 
        !          10661:   /* Didn't get anything from C.  */
        !          10662:   olddecl = NULL_TREE;
        !          10663: 
        !          10664:   /* This function exists in static storage.
        !          10665:      (This does not mean `static' in the C sense!)  */
        !          10666:   TREE_STATIC (decl1) = 1;
        !          10667: 
        !          10668:   /* If this function belongs to an interface, it is public.
        !          10669:      If it belongs to someone else's interface, it is also external.
        !          10670:      It doesn't matter whether it's inline or not.  */
        !          10671:   if (interface_unknown == 0)
        !          10672:     {
        !          10673:       TREE_PUBLIC (decl1) = 1;
        !          10674:       DECL_EXTERNAL (decl1) = (interface_only
        !          10675:                               || (DECL_INLINE (decl1)
        !          10676:                                   && ! flag_implement_inlines));
        !          10677:     }
        !          10678:   else
        !          10679:     /* This is a definition, not a reference.
        !          10680:        So normally clear DECL_EXTERNAL.
        !          10681:        However, `extern inline' acts like a declaration except for
        !          10682:        defining how to inline.  So set DECL_EXTERNAL in that case.  */
        !          10683:     DECL_EXTERNAL (decl1) = current_extern_inline;
        !          10684: 
        !          10685:   /* Now see if this is the implementation of a declared function.  */
        !          10686:   if (ctype == NULL_TREE && current_lang_name == lang_name_cplusplus
        !          10687:       && !DECL_CONTEXT (decl1))
        !          10688:     {
        !          10689:       olddecl = lookup_name_current_level (DECL_NAME (decl1));
        !          10690:       if (olddecl && TREE_CODE (olddecl) != FUNCTION_DECL)
        !          10691:        olddecl = NULL_TREE;
        !          10692:       if (olddecl && DECL_NAME (decl1) != DECL_NAME (olddecl))
        !          10693:        {
        !          10694:          /* Collision between user and internal naming scheme.  */
        !          10695:          olddecl = lookup_name_current_level (DECL_ASSEMBLER_NAME (decl1));
        !          10696:          if (olddecl == NULL_TREE)
        !          10697:            olddecl = decl1;
        !          10698:        }
        !          10699:       if (olddecl && olddecl != decl1
        !          10700:          && DECL_NAME (decl1) == DECL_NAME (olddecl))
        !          10701:        {
        !          10702:          if (TREE_CODE (olddecl) == FUNCTION_DECL
        !          10703:              && decls_match (decl1, olddecl))
        !          10704:            {
        !          10705:              olddecl = DECL_MAIN_VARIANT (olddecl);
        !          10706:              /* The following copy is needed to handle forcing a function's
        !          10707:                 linkage to obey the linkage of the original decl.  */
        !          10708:              DECL_ASSEMBLER_NAME (decl1) = DECL_ASSEMBLER_NAME (olddecl);
        !          10709:              DECL_OVERLOADED (decl1) = DECL_OVERLOADED (olddecl);
        !          10710:              if (! DECL_BUILT_IN (olddecl) && DECL_INITIAL (olddecl))
        !          10711:                redeclaration_error_message (decl1, olddecl);
        !          10712:              if (duplicate_decls (decl1, olddecl))
        !          10713:                decl1 = olddecl;
        !          10714:              else
        !          10715:                olddecl = NULL_TREE;
        !          10716:            }
        !          10717:          else
        !          10718:            olddecl = NULL_TREE;
        !          10719:        }
        !          10720:     }
        !          10721: 
        !          10722:   /* Record the decl so that the function name is defined.
        !          10723:      If we already have a decl for this name, and it is a FUNCTION_DECL,
        !          10724:      use the old decl.  */
        !          10725: 
        !          10726:   if (olddecl)
        !          10727:     current_function_decl = olddecl;
        !          10728:   else if (pre_parsed_p == 0)
        !          10729:     {
        !          10730:       current_function_decl = pushdecl (decl1);
        !          10731:       if (TREE_CODE (current_function_decl) == TREE_LIST)
        !          10732:        {
        !          10733:          /* @@ revert to modified original declaration.  */
        !          10734:          decl1 = DECL_MAIN_VARIANT (decl1);
        !          10735:          current_function_decl = decl1;
        !          10736:        }
        !          10737:       else
        !          10738:        {
        !          10739:          decl1 = current_function_decl;
        !          10740:          DECL_MAIN_VARIANT (decl1) = decl1;
        !          10741:        }
        !          10742:       fntype = TREE_TYPE (decl1);
        !          10743:     }
        !          10744:   else
        !          10745:     current_function_decl = decl1;
        !          10746: 
        !          10747:   if (DECL_OVERLOADED (decl1))
        !          10748:     decl1 = push_overloaded_decl (decl1, 1);
        !          10749: 
        !          10750:   if (ctype != NULL_TREE && DECL_STATIC_FUNCTION_P (decl1))
        !          10751:     {
        !          10752:       if (TREE_CODE (fntype) == METHOD_TYPE)
        !          10753:        TREE_TYPE (decl1) = fntype
        !          10754:          = build_function_type (TREE_TYPE (fntype),
        !          10755:                                 TREE_CHAIN (TYPE_ARG_TYPES (fntype)));
        !          10756:       last_function_parms = TREE_CHAIN (last_function_parms);
        !          10757:       DECL_ARGUMENTS (decl1) = last_function_parms;
        !          10758:       ctype = NULL_TREE;
        !          10759:     }
        !          10760:   restype = TREE_TYPE (fntype);
        !          10761: 
        !          10762:   pushlevel (0);
        !          10763:   current_binding_level->parm_flag = 1;
        !          10764: 
        !          10765:   /* Save the parm names or decls from this function's declarator
        !          10766:      where store_parm_decls will find them.  */
        !          10767:   current_function_parms = last_function_parms;
        !          10768:   current_function_parm_tags = last_function_parm_tags;
        !          10769: 
        !          10770:   GNU_xref_function (decl1, current_function_parms);
        !          10771: 
        !          10772:   make_function_rtl (decl1);
        !          10773: 
        !          10774:   if (ctype)
        !          10775:     {
        !          10776: #if NEW_CLASS_SCOPING
        !          10777:       push_nested_class (ctype, 1);
        !          10778: #else
        !          10779:       pushclass (ctype, 1);
        !          10780: #endif
        !          10781: 
        !          10782:       /* If we're compiling a friend function, neither of the variables
        !          10783:         current_class_decl nor current_class_type will have values.  */
        !          10784:       if (! doing_friend)
        !          10785:        {
        !          10786:          /* We know that this was set up by `grokclassfn'.
        !          10787:             We do not wait until `store_parm_decls', since evil
        !          10788:             parse errors may never get us to that point.  Here
        !          10789:             we keep the consistency between `current_class_type'
        !          10790:             and `current_class_decl'.  */
        !          10791:          current_class_decl = last_function_parms;
        !          10792:          my_friendly_assert (current_class_decl != NULL_TREE
        !          10793:                  && TREE_CODE (current_class_decl) == PARM_DECL, 162);
        !          10794:          if (TREE_CODE (TREE_TYPE (current_class_decl)) == POINTER_TYPE)
        !          10795:            {
        !          10796:              tree variant = TREE_TYPE (TREE_TYPE (current_class_decl));
        !          10797:              if (CLASSTYPE_INST_VAR (ctype) == NULL_TREE)
        !          10798:                {
        !          10799:                  /* Can't call build_indirect_ref here, because it has special
        !          10800:                     logic to return C_C_D given this argument.  */
        !          10801:                  C_C_D = build1 (INDIRECT_REF, current_class_type, current_class_decl);
        !          10802:                  CLASSTYPE_INST_VAR (ctype) = C_C_D;
        !          10803:                }
        !          10804:              else
        !          10805:                {
        !          10806:                  C_C_D = CLASSTYPE_INST_VAR (ctype);
        !          10807:                  /* `current_class_decl' is different for every
        !          10808:                     function we compile.  */
        !          10809:                  TREE_OPERAND (C_C_D, 0) = current_class_decl;
        !          10810:                }
        !          10811:              TREE_READONLY (C_C_D) = TYPE_READONLY (variant);
        !          10812:              TREE_SIDE_EFFECTS (C_C_D) = TYPE_VOLATILE (variant);
        !          10813:              TREE_THIS_VOLATILE (C_C_D) = TYPE_VOLATILE (variant);
        !          10814:            }
        !          10815:          else
        !          10816:            C_C_D = current_class_decl;
        !          10817:        }
        !          10818:     }
        !          10819:   else
        !          10820:     {
        !          10821:       if (DECL_STATIC_FUNCTION_P (decl1))
        !          10822: #if NEW_CLASS_SCOPING
        !          10823:        push_nested_class (DECL_CONTEXT (decl1), 2);
        !          10824: #else
        !          10825:        pushclass (DECL_CONTEXT (decl1), 2);
        !          10826: #endif
        !          10827:       else
        !          10828:        push_memoized_context (0, 1);
        !          10829:     }
        !          10830: 
        !          10831:   /* Allocate further tree nodes temporarily during compilation
        !          10832:      of this function only.  Tiemann moved up here from bottom of fn.  */
        !          10833:   temporary_allocation ();
        !          10834: 
        !          10835:   /* Promote the value to int before returning it.  */
        !          10836:   if (C_PROMOTING_INTEGER_TYPE_P (restype))
        !          10837:     {
        !          10838:       /* It retains unsignedness if traditional or if it isn't
        !          10839:         really getting wider.  */
        !          10840:       if (TREE_UNSIGNED (restype)
        !          10841:          && (flag_traditional
        !          10842:              || TYPE_PRECISION (restype)
        !          10843:                   == TYPE_PRECISION (integer_type_node)))
        !          10844:        restype = unsigned_type_node;
        !          10845:       else
        !          10846:        restype = integer_type_node;
        !          10847:     }
        !          10848:   if (DECL_RESULT (decl1) == NULL_TREE)
        !          10849:     DECL_RESULT (decl1) = build_decl (RESULT_DECL, 0, restype);
        !          10850: 
        !          10851:   if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl1)))
        !          10852:     {
        !          10853:       dtor_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
        !          10854:       ctor_label = NULL_TREE;
        !          10855:     }
        !          10856:   else
        !          10857:     {
        !          10858:       dtor_label = NULL_TREE;
        !          10859:       if (DECL_CONSTRUCTOR_P (decl1))
        !          10860:        ctor_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
        !          10861:     }
        !          10862: 
        !          10863:   /* If this fcn was already referenced via a block-scope `extern' decl
        !          10864:      (or an implicit decl), propagate certain information about the usage.  */
        !          10865:   if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (decl1)))
        !          10866:     TREE_ADDRESSABLE (decl1) = 1;
        !          10867: 
        !          10868:   return 1;
        !          10869: }
        !          10870: 
        !          10871: /* Store the parameter declarations into the current function declaration.
        !          10872:    This is called after parsing the parameter declarations, before
        !          10873:    digesting the body of the function.
        !          10874: 
        !          10875:    Also install to binding contour return value identifier, if any.  */
        !          10876: 
        !          10877: void
        !          10878: store_parm_decls ()
        !          10879: {
        !          10880:   register tree fndecl = current_function_decl;
        !          10881:   register tree parm;
        !          10882:   int parms_have_cleanups = 0;
        !          10883:   tree eh_decl;
        !          10884: 
        !          10885:   /* This is either a chain of PARM_DECLs (when a prototype is used).  */
        !          10886:   tree specparms = current_function_parms;
        !          10887: 
        !          10888:   /* This is a list of types declared among parms in a prototype.  */
        !          10889:   tree parmtags = current_function_parm_tags;
        !          10890: 
        !          10891:   /* This is a chain of any other decls that came in among the parm
        !          10892:      declarations.  If a parm is declared with  enum {foo, bar} x;
        !          10893:      then CONST_DECLs for foo and bar are put here.  */
        !          10894:   tree nonparms = NULL_TREE;
        !          10895: 
        !          10896:   if (current_binding_level == global_binding_level)
        !          10897:     fatal ("parse errors have confused me too much");
        !          10898: 
        !          10899:   /* Initialize RTL machinery.  */
        !          10900:   init_function_start (fndecl, input_filename, lineno);
        !          10901: 
        !          10902:   /* Declare __FUNCTION__ and __PRETTY_FUNCTION__ for this function.  */
        !          10903:   declare_function_name ();
        !          10904: 
        !          10905:   /* Create a binding level for the parms.  */
        !          10906:   expand_start_bindings (0);
        !          10907: 
        !          10908:   /* Prepare to catch raises, if appropriate.  */
        !          10909:   if (flag_handle_exceptions)
        !          10910:     {
        !          10911:       /* Get this cleanup to be run last, since it
        !          10912:         is a call to `longjmp'.  */
        !          10913:       setup_exception_throw_decl ();
        !          10914:       eh_decl = current_binding_level->names;
        !          10915:       current_binding_level->names = TREE_CHAIN (current_binding_level->names);
        !          10916:     }
        !          10917:   if (flag_handle_exceptions)
        !          10918:     expand_start_try (integer_one_node, 0, 1);
        !          10919: 
        !          10920:   if (specparms != NULL_TREE)
        !          10921:     {
        !          10922:       /* This case is when the function was defined with an ANSI prototype.
        !          10923:         The parms already have decls, so we need not do anything here
        !          10924:         except record them as in effect
        !          10925:         and complain if any redundant old-style parm decls were written.  */
        !          10926: 
        !          10927:       register tree next;
        !          10928: 
        !          10929:       /* Must clear this because it might contain TYPE_DECLs declared
        !          10930:         at class level.  */
        !          10931:       storedecls (NULL_TREE);
        !          10932:       for (parm = nreverse (specparms); parm; parm = next)
        !          10933:        {
        !          10934:          next = TREE_CHAIN (parm);
        !          10935:          if (TREE_CODE (parm) == PARM_DECL)
        !          10936:            {
        !          10937:              tree cleanup = maybe_build_cleanup (parm);
        !          10938:              if (DECL_NAME (parm) == NULL_TREE)
        !          10939:                {
        !          10940: #if 0
        !          10941:                  cp_error_at ("parameter name omitted", parm);
        !          10942: #else
        !          10943:                  /* for C++, this is not an error.  */
        !          10944:                  pushdecl (parm);
        !          10945: #endif
        !          10946:                }
        !          10947:              else if (TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == void_type_node)
        !          10948:                cp_error ("parameter `%D' declared void", parm);
        !          10949:              else
        !          10950:                {
        !          10951:                  /* Now fill in DECL_REFERENCE_SLOT for any of the parm decls.
        !          10952:                     A parameter is assumed not to have any side effects.
        !          10953:                     If this should change for any reason, then this
        !          10954:                     will have to wrap the bashed reference type in a save_expr.
        !          10955:                     
        !          10956:                     Also, if the parameter type is declared to be an X
        !          10957:                     and there is an X(X&) constructor, we cannot lay it
        !          10958:                     into the stack (any more), so we make this parameter
        !          10959:                     look like it is really of reference type.  Functions
        !          10960:                     which pass parameters to this function will know to
        !          10961:                     create a temporary in their frame, and pass a reference
        !          10962:                     to that.  */
        !          10963: 
        !          10964:                  if (TREE_CODE (TREE_TYPE (parm)) == REFERENCE_TYPE
        !          10965:                      && TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm))))
        !          10966:                    SET_DECL_REFERENCE_SLOT (parm, convert_from_reference (parm));
        !          10967: 
        !          10968:                  pushdecl (parm);
        !          10969:                }
        !          10970:              if (cleanup)
        !          10971:                {
        !          10972:                  expand_decl (parm);
        !          10973:                  expand_decl_cleanup (parm, cleanup);
        !          10974:                  parms_have_cleanups = 1;
        !          10975:                }
        !          10976:            }
        !          10977:          else
        !          10978:            {
        !          10979:              /* If we find an enum constant or a type tag,
        !          10980:                 put it aside for the moment.  */
        !          10981:              TREE_CHAIN (parm) = NULL_TREE;
        !          10982:              nonparms = chainon (nonparms, parm);
        !          10983:            }
        !          10984:        }
        !          10985: 
        !          10986:       /* Get the decls in their original chain order
        !          10987:         and record in the function.  This is all and only the
        !          10988:         PARM_DECLs that were pushed into scope by the loop above.  */
        !          10989:       DECL_ARGUMENTS (fndecl) = getdecls ();
        !          10990: 
        !          10991:       storetags (chainon (parmtags, gettags ()));
        !          10992:     }
        !          10993:   else
        !          10994:     DECL_ARGUMENTS (fndecl) = NULL_TREE;
        !          10995: 
        !          10996:   /* Now store the final chain of decls for the arguments
        !          10997:      as the decl-chain of the current lexical scope.
        !          10998:      Put the enumerators in as well, at the front so that
        !          10999:      DECL_ARGUMENTS is not modified.  */
        !          11000: 
        !          11001:   storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl)));
        !          11002: 
        !          11003:   /* Initialize the RTL code for the function.  */
        !          11004:   DECL_SAVED_INSNS (fndecl) = NULL_RTX;
        !          11005:   expand_function_start (fndecl, parms_have_cleanups);
        !          11006: 
        !          11007:   if (flag_handle_exceptions)
        !          11008:     {
        !          11009:       /* Make the throw decl visible at this level, just
        !          11010:         not in the way of the parameters.  */
        !          11011:       pushdecl (eh_decl);
        !          11012:       expand_decl_init (eh_decl);
        !          11013:     }
        !          11014: 
        !          11015:   /* Create a binding contour which can be used to catch
        !          11016:      cleanup-generated temporaries.  Also, if the return value needs or
        !          11017:      has initialization, deal with that now.  */
        !          11018:   if (parms_have_cleanups)
        !          11019:     {
        !          11020:       pushlevel (0);
        !          11021:       expand_start_bindings (0);
        !          11022:     }
        !          11023: 
        !          11024:   current_function_parms_stored = 1;
        !          11025: 
        !          11026:   if (flag_gc)
        !          11027:     {
        !          11028:       maybe_gc_cleanup = build_tree_list (NULL_TREE, error_mark_node);
        !          11029:       expand_decl_cleanup (NULL_TREE, maybe_gc_cleanup);
        !          11030:     }
        !          11031: 
        !          11032:   /* If this function is `main', emit a call to `__main'
        !          11033:      to run global initializers, etc.  */
        !          11034:   if (DECL_NAME (fndecl)
        !          11035:       && IDENTIFIER_LENGTH (DECL_NAME (fndecl)) == 4
        !          11036:       && strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "main") == 0
        !          11037:       && DECL_CONTEXT (fndecl) == NULL_TREE)
        !          11038:     {
        !          11039:       expand_main_function ();
        !          11040: 
        !          11041:       if (flag_gc)
        !          11042:        expand_expr (build_function_call (lookup_name (get_identifier ("__gc_main"), 0), NULL_TREE),
        !          11043:                     0, VOIDmode, 0);
        !          11044: 
        !          11045:       if (flag_dossier)
        !          11046:        output_builtin_tdesc_entries ();
        !          11047:     }
        !          11048: }
        !          11049: 
        !          11050: /* Bind a name and initialization to the return value of
        !          11051:    the current function.  */
        !          11052: void
        !          11053: store_return_init (return_id, init)
        !          11054:      tree return_id, init;
        !          11055: {
        !          11056:   tree decl = DECL_RESULT (current_function_decl);
        !          11057: 
        !          11058:   if (pedantic)
        !          11059:     /* Give this error as many times as there are occurrences,
        !          11060:        so that users can use Emacs compilation buffers to find
        !          11061:        and fix all such places.  */
        !          11062:     error ("ANSI C++ does not permit named return values");
        !          11063: 
        !          11064:   if (return_id != NULL_TREE)
        !          11065:     {
        !          11066:       if (DECL_NAME (decl) == NULL_TREE)
        !          11067:        {
        !          11068:          DECL_NAME (decl) = return_id;
        !          11069:          DECL_ASSEMBLER_NAME (decl) = return_id;
        !          11070:        }
        !          11071:       else
        !          11072:        error ("return identifier `%s' already in place",
        !          11073:               IDENTIFIER_POINTER (DECL_NAME (decl)));
        !          11074:     }
        !          11075: 
        !          11076:   /* Can't let this happen for constructors.  */
        !          11077:   if (DECL_CONSTRUCTOR_P (current_function_decl))
        !          11078:     {
        !          11079:       error ("can't redefine default return value for constructors");
        !          11080:       return;
        !          11081:     }
        !          11082: 
        !          11083:   /* If we have a named return value, put that in our scope as well.  */
        !          11084:   if (DECL_NAME (decl) != NULL_TREE)
        !          11085:     {
        !          11086:       /* If this named return value comes in a register,
        !          11087:         put it in a pseudo-register.  */
        !          11088:       if (DECL_REGISTER (decl))
        !          11089:        {
        !          11090:          original_result_rtx = DECL_RTL (decl);
        !          11091:          DECL_RTL (decl) = gen_reg_rtx (DECL_MODE (decl));
        !          11092:        }
        !          11093: 
        !          11094:       /* Let `finish_decl' know that this initializer is ok.  */
        !          11095:       DECL_INITIAL (decl) = init;
        !          11096:       pushdecl (decl);
        !          11097:       finish_decl (decl, init, 0, 0);
        !          11098:     }
        !          11099: }
        !          11100: 
        !          11101: /* Generate code for default X(X&) constructor.  */
        !          11102: static void
        !          11103: build_default_constructor (fndecl)
        !          11104:      tree fndecl;
        !          11105: {
        !          11106:   int i = CLASSTYPE_N_BASECLASSES (current_class_type);
        !          11107:   tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl));
        !          11108:   tree fields = TYPE_FIELDS (current_class_type);
        !          11109:   tree binfos = TYPE_BINFO_BASETYPES (current_class_type);
        !          11110: 
        !          11111:   if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
        !          11112:     parm = TREE_CHAIN (parm);
        !          11113:   parm = DECL_REFERENCE_SLOT (parm);
        !          11114: 
        !          11115:   while (--i >= 0)
        !          11116:     {
        !          11117:       tree basetype = TREE_VEC_ELT (binfos, i);
        !          11118:       if (TYPE_GETS_INIT_REF (basetype))
        !          11119:        {
        !          11120:          tree name = TYPE_NAME (basetype);
        !          11121:          if (TREE_CODE (name) == TYPE_DECL)
        !          11122:            name = DECL_NAME (name);
        !          11123:          current_base_init_list = tree_cons (name, parm, current_base_init_list);
        !          11124:        }
        !          11125:     }
        !          11126:   for (; fields; fields = TREE_CHAIN (fields))
        !          11127:     {
        !          11128:       tree name, init;
        !          11129:       if (TREE_STATIC (fields))
        !          11130:        continue;
        !          11131:       if (TREE_CODE (fields) != FIELD_DECL)
        !          11132:        continue;
        !          11133:       if (DECL_NAME (fields))
        !          11134:        {
        !          11135:          if (VFIELD_NAME_P (DECL_NAME (fields)))
        !          11136:            continue;
        !          11137:          if (VBASE_NAME_P (DECL_NAME (fields)))
        !          11138:            continue;
        !          11139: 
        !          11140:          /* True for duplicate members.  */
        !          11141:          if (IDENTIFIER_CLASS_VALUE (DECL_NAME (fields)) != fields)
        !          11142:            continue;
        !          11143:        }
        !          11144: 
        !          11145:       init = build (COMPONENT_REF, TREE_TYPE (fields), parm, fields);
        !          11146:       init = build_tree_list (NULL_TREE, init);
        !          11147: 
        !          11148:       current_member_init_list
        !          11149:        = tree_cons (DECL_NAME (fields), init, current_member_init_list);
        !          11150:     }
        !          11151: }
        !          11152: 
        !          11153: 
        !          11154: /* Get the binfo associated with the vfield. */
        !          11155: 
        !          11156: tree
        !          11157: get_binfo_from_vfield (vfield)
        !          11158:      tree vfield;
        !          11159: {
        !          11160:   if (VF_BINFO_VALUE (vfield))
        !          11161:     return VF_BINFO_VALUE (vfield);
        !          11162:   /* Not sure where it is.  maybe get_binfo on
        !          11163:      VF_BASETYPE_VALUE (vfield), VF_DERIVED_VALUE (vfield)... */
        !          11164:   my_friendly_abort (350);
        !          11165:   return NULL_TREE;
        !          11166: }
        !          11167: 
        !          11168: /* Finish up a function declaration and compile that function
        !          11169:    all the way to assembler language output.  The free the storage
        !          11170:    for the function definition.
        !          11171: 
        !          11172:    This is called after parsing the body of the function definition.
        !          11173:    LINENO is the current line number.
        !          11174: 
        !          11175:    C++: CALL_POPLEVEL is non-zero if an extra call to poplevel
        !          11176:    (and expand_end_bindings) must be made to take care of the binding
        !          11177:    contour for the base initializers.  This is only relevant for
        !          11178:    constructors.  */
        !          11179: 
        !          11180: void
        !          11181: finish_function (lineno, call_poplevel)
        !          11182:      int lineno;
        !          11183:      int call_poplevel;
        !          11184: {
        !          11185:   register tree fndecl = current_function_decl;
        !          11186:   tree fntype, ctype = NULL_TREE;
        !          11187:   rtx head, last_parm_insn, mark;
        !          11188:   extern int sets_exception_throw_decl;
        !          11189:   /* Label to use if this function is supposed to return a value.  */
        !          11190:   tree no_return_label = NULL_TREE;
        !          11191:   tree decls = NULL_TREE;
        !          11192: 
        !          11193:   /* When we get some parse errors, we can end up without a
        !          11194:      current_function_decl, so cope.  */
        !          11195:   if (fndecl == NULL_TREE)
        !          11196:     return;
        !          11197: 
        !          11198:   fntype = TREE_TYPE (fndecl);
        !          11199: 
        !          11200: /*  TREE_READONLY (fndecl) = 1;
        !          11201:     This caused &foo to be of type ptr-to-const-function
        !          11202:     which then got a warning when stored in a ptr-to-function variable.  */
        !          11203: 
        !          11204:   /* This happens on strange parse errors.  */
        !          11205:   if (! current_function_parms_stored)
        !          11206:     {
        !          11207:       call_poplevel = 0;
        !          11208:       store_parm_decls ();
        !          11209:     }
        !          11210: 
        !          11211:   if (write_symbols != NO_DEBUG && TREE_CODE (fntype) != METHOD_TYPE)
        !          11212:     {
        !          11213:       tree ttype = target_type (fntype);
        !          11214:       tree parmdecl;
        !          11215: 
        !          11216:       if (IS_AGGR_TYPE (ttype))
        !          11217:        /* Let debugger know it should output info for this type.  */
        !          11218:        note_debug_info_needed (ttype);
        !          11219: 
        !          11220:       for (parmdecl = DECL_ARGUMENTS (fndecl); parmdecl; parmdecl = TREE_CHAIN (parmdecl))
        !          11221:        {
        !          11222:          ttype = target_type (TREE_TYPE (parmdecl));
        !          11223:          if (IS_AGGR_TYPE (ttype))
        !          11224:            /* Let debugger know it should output info for this type.  */
        !          11225:            note_debug_info_needed (ttype);
        !          11226:        }
        !          11227:     }
        !          11228: 
        !          11229:   /* Clean house because we will need to reorder insns here.  */
        !          11230:   do_pending_stack_adjust ();
        !          11231: 
        !          11232:   if (dtor_label)
        !          11233:     {
        !          11234:       tree binfo = TYPE_BINFO (current_class_type);
        !          11235:       tree cond = integer_one_node;
        !          11236:       tree exprstmt, vfields;
        !          11237:       tree in_charge_node = lookup_name (in_charge_identifier, 0);
        !          11238:       tree virtual_size;
        !          11239:       int ok_to_optimize_dtor = 0;
        !          11240: 
        !          11241:       if (current_function_assigns_this)
        !          11242:        cond = build (NE_EXPR, integer_type_node,
        !          11243:                      current_class_decl, integer_zero_node);
        !          11244:       else
        !          11245:        {
        !          11246:          int n_baseclasses = CLASSTYPE_N_BASECLASSES (current_class_type);
        !          11247: 
        !          11248:          /* If this destructor is empty, then we don't need to check
        !          11249:             whether `this' is NULL in some cases.  */
        !          11250:          mark = get_last_insn ();
        !          11251:          last_parm_insn = get_first_nonparm_insn ();
        !          11252: 
        !          11253:          if ((flag_this_is_variable & 1) == 0)
        !          11254:            ok_to_optimize_dtor = 1;
        !          11255:          else if (mark == last_parm_insn)
        !          11256:            ok_to_optimize_dtor
        !          11257:              = (n_baseclasses == 0
        !          11258:                 || (n_baseclasses == 1
        !          11259:                     && TYPE_HAS_DESTRUCTOR (TYPE_BINFO_BASETYPE (current_class_type, 0))));
        !          11260:        }
        !          11261: 
        !          11262:       /* These initializations might go inline.  Protect
        !          11263:         the binding level of the parms.  */
        !          11264:       pushlevel (0);
        !          11265:       expand_start_bindings (0);
        !          11266: 
        !          11267:       if (current_function_assigns_this)
        !          11268:        {
        !          11269:          current_function_assigns_this = 0;
        !          11270:          current_function_just_assigned_this = 0;
        !          11271:        }
        !          11272: 
        !          11273:       /* Generate the code to call destructor on base class.
        !          11274:         If this destructor belongs to a class with virtual
        !          11275:         functions, then set the virtual function table
        !          11276:         pointer to represent the type of our base class.  */
        !          11277: 
        !          11278:       /* This side-effect makes call to `build_delete' generate the
        !          11279:         code we have to have at the end of this destructor.  */
        !          11280:       TYPE_HAS_DESTRUCTOR (current_class_type) = 0;
        !          11281: 
        !          11282:       /* These are two cases where we cannot delegate deletion.  */
        !          11283:       if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)
        !          11284:          || TREE_GETS_DELETE (current_class_type))
        !          11285:        exprstmt = build_delete (current_class_type, C_C_D, integer_zero_node,
        !          11286:                                 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
        !          11287:       else
        !          11288:        exprstmt = build_delete (current_class_type, C_C_D, in_charge_node,
        !          11289:                                 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
        !          11290: 
        !          11291:       /* If we did not assign to this, then `this' is non-zero at
        !          11292:         the end of a destructor.  As a special optimization, don't
        !          11293:         emit test if this is an empty destructor.  If it does nothing,
        !          11294:         it does nothing.  If it calls a base destructor, the base
        !          11295:         destructor will perform the test.  */
        !          11296: 
        !          11297:       if (exprstmt != error_mark_node
        !          11298:          && (TREE_CODE (exprstmt) != NOP_EXPR
        !          11299:              || TREE_OPERAND (exprstmt, 0) != integer_zero_node
        !          11300:              || TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)))
        !          11301:        {
        !          11302:          expand_label (dtor_label);
        !          11303:          if (cond != integer_one_node)
        !          11304:            expand_start_cond (cond, 0);
        !          11305:          if (exprstmt != void_zero_node)
        !          11306:            /* Don't call `expand_expr_stmt' if we're not going to do
        !          11307:               anything, since -Wall will give a diagnostic.  */
        !          11308:            expand_expr_stmt (exprstmt);
        !          11309: 
        !          11310:          /* Run destructor on all virtual baseclasses.  */
        !          11311:          if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
        !          11312:            {
        !          11313:              tree vbases = nreverse (copy_list (CLASSTYPE_VBASECLASSES (current_class_type)));
        !          11314:              expand_start_cond (build (BIT_AND_EXPR, integer_type_node,
        !          11315:                                        in_charge_node, integer_two_node), 0);
        !          11316:              while (vbases)
        !          11317:                {
        !          11318:                  if (TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (vbases)))
        !          11319:                    {
        !          11320:                      tree ptr = convert_pointer_to_vbase (vbases, current_class_decl);
        !          11321:                      expand_expr_stmt (build_delete (TYPE_POINTER_TO (BINFO_TYPE (vbases)),
        !          11322:                                                      ptr, integer_zero_node,
        !          11323:                                                      LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_HAS_IN_CHARGE, 0));
        !          11324:                    }
        !          11325:                  vbases = TREE_CHAIN (vbases);
        !          11326:                }
        !          11327:              expand_end_cond ();
        !          11328:            }
        !          11329: 
        !          11330:          do_pending_stack_adjust ();
        !          11331:          if (cond != integer_one_node)
        !          11332:            expand_end_cond ();
        !          11333:        }
        !          11334: 
        !          11335:       TYPE_HAS_DESTRUCTOR (current_class_type) = 1;
        !          11336: 
        !          11337:       virtual_size = c_sizeof (current_class_type);
        !          11338: 
        !          11339:       /* At the end, call delete if that's what's requested.  */
        !          11340:       if (TREE_GETS_DELETE (current_class_type))
        !          11341:        /* This NOP_EXPR means we are in a static call context.  */
        !          11342:        exprstmt =
        !          11343:          build_method_call
        !          11344:            (build1 (NOP_EXPR,
        !          11345:                     TYPE_POINTER_TO (current_class_type), error_mark_node),
        !          11346:             ansi_opname[(int) DELETE_EXPR],
        !          11347:             tree_cons (NULL_TREE, current_class_decl,
        !          11348:                        build_tree_list (NULL_TREE, virtual_size)),
        !          11349:             NULL_TREE, LOOKUP_NORMAL);
        !          11350:       else if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
        !          11351:        exprstmt = build_x_delete (ptr_type_node, current_class_decl, 0,
        !          11352:                                   virtual_size);
        !          11353:       else
        !          11354:        exprstmt = NULL_TREE;
        !          11355: 
        !          11356:       if (exprstmt)
        !          11357:        {
        !          11358:          cond = build (BIT_AND_EXPR, integer_type_node,
        !          11359:                        in_charge_node, integer_one_node);
        !          11360:          expand_start_cond (cond, 0);
        !          11361:          expand_expr_stmt (exprstmt);
        !          11362:          expand_end_cond ();
        !          11363:        }
        !          11364: 
        !          11365:       /* End of destructor.  */
        !          11366:       expand_end_bindings (NULL_TREE, getdecls() != NULL_TREE, 0);
        !          11367:       poplevel (2, 0, 0); /* XXX change to 1 */
        !          11368: 
        !          11369:       /* Back to the top of destructor.  */
        !          11370:       /* Dont execute destructor code if `this' is NULL.  */
        !          11371:       mark = get_last_insn ();
        !          11372:       last_parm_insn = get_first_nonparm_insn ();
        !          11373:       if (last_parm_insn == NULL_RTX)
        !          11374:        last_parm_insn = mark;
        !          11375:       else
        !          11376:        last_parm_insn = previous_insn (last_parm_insn);
        !          11377: 
        !          11378:       /* Make all virtual function table pointers point to CURRENT_CLASS_TYPE's
        !          11379:         virtual function tables.  */
        !          11380:       if (CLASSTYPE_VFIELDS (current_class_type))
        !          11381:        {
        !          11382:          for (vfields = CLASSTYPE_VFIELDS (current_class_type);
        !          11383:               TREE_CHAIN (vfields);
        !          11384:               vfields = TREE_CHAIN (vfields))
        !          11385:            {
        !          11386:              tree vf_decl = current_class_decl;
        !          11387:              /* ??? This may need to be a loop if there are multiple
        !          11388:                 levels of replication.  */
        !          11389:              if (VF_BINFO_VALUE (vfields))
        !          11390:                vf_decl = convert_pointer_to (VF_BINFO_VALUE (vfields), vf_decl);
        !          11391:              if (vf_decl != error_mark_node)
        !          11392:                {
        !          11393:                  expand_expr_stmt (build_virtual_init (binfo,
        !          11394:                                                        get_binfo_from_vfield (vfields),
        !          11395:                                                        vf_decl));
        !          11396:                }
        !          11397:            }
        !          11398:          expand_expr_stmt (build_virtual_init (binfo, binfo,
        !          11399:                                                current_class_decl));
        !          11400:        }
        !          11401:       if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
        !          11402:        expand_expr_stmt (build_vbase_vtables_init (binfo, binfo,
        !          11403:                                                    C_C_D, current_class_decl, 0));
        !          11404:       if (! ok_to_optimize_dtor)
        !          11405:        {
        !          11406:          cond = build_binary_op (NE_EXPR,
        !          11407:                                  current_class_decl, integer_zero_node, 1);
        !          11408:          expand_start_cond (cond, 0);
        !          11409:        }
        !          11410:       if (mark != get_last_insn ())
        !          11411:        reorder_insns (next_insn (mark), get_last_insn (), last_parm_insn);
        !          11412:       if (! ok_to_optimize_dtor)
        !          11413:        expand_end_cond ();
        !          11414:     }
        !          11415:   else if (current_function_assigns_this)
        !          11416:     {
        !          11417:       /* Does not need to call emit_base_init, because
        !          11418:         that is done (if needed) just after assignment to this
        !          11419:         is seen.  */
        !          11420: 
        !          11421:       if (DECL_CONSTRUCTOR_P (current_function_decl))
        !          11422:        {
        !          11423:          expand_label (ctor_label);
        !          11424:          ctor_label = NULL_TREE;
        !          11425: 
        !          11426:          if (call_poplevel)
        !          11427:            {
        !          11428:              decls = getdecls ();
        !          11429:              if (flag_handle_exceptions == 2)
        !          11430:                deactivate_exception_cleanups ();
        !          11431:              expand_end_bindings (decls, decls != NULL_TREE, 0);
        !          11432:              poplevel (decls != NULL_TREE, 0, 0);
        !          11433:            }
        !          11434:          c_expand_return (current_class_decl);
        !          11435:        }
        !          11436:       else if (TYPE_MAIN_VARIANT (TREE_TYPE (
        !          11437:                        DECL_RESULT (current_function_decl))) != void_type_node
        !          11438:               && return_label != NULL_RTX)
        !          11439:        no_return_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
        !          11440: 
        !          11441:       current_function_assigns_this = 0;
        !          11442:       current_function_just_assigned_this = 0;
        !          11443:       base_init_insns = NULL_RTX;
        !          11444:     }
        !          11445:   else if (DECL_CONSTRUCTOR_P (fndecl))
        !          11446:     {
        !          11447:       tree allocated_this;
        !          11448:       tree cond, thenclause;
        !          11449:       /* Allow constructor for a type to get a new instance of the object
        !          11450:         using `build_new'.  */
        !          11451:       tree abstract_virtuals = CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type);
        !          11452:       CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type) = NULL_TREE;
        !          11453: 
        !          11454:       DECL_RETURNS_FIRST_ARG (fndecl) = 1;
        !          11455: 
        !          11456:       if (flag_this_is_variable > 0)
        !          11457:        {
        !          11458:          cond = build_binary_op (EQ_EXPR,
        !          11459:                                  current_class_decl, integer_zero_node, 1);
        !          11460:          thenclause = build_modify_expr (current_class_decl, NOP_EXPR,
        !          11461:                                          build_new (NULL_TREE, current_class_type, void_type_node, 0));
        !          11462:          if (flag_handle_exceptions == 2)
        !          11463:            {
        !          11464:              tree cleanup, cleanup_deallocate;
        !          11465:              tree virtual_size;
        !          11466: 
        !          11467:              /* This is the size of the virtual object pointed to by
        !          11468:                 allocated_this.  In this case, it is simple.  */
        !          11469:              virtual_size = c_sizeof (current_class_type);
        !          11470: 
        !          11471:              allocated_this = build_decl (VAR_DECL, NULL_TREE, ptr_type_node);
        !          11472:              DECL_REGISTER (allocated_this) = 1;
        !          11473:              DECL_INITIAL (allocated_this) = error_mark_node;
        !          11474:              expand_decl (allocated_this);
        !          11475:              expand_decl_init (allocated_this);
        !          11476:              /* How we cleanup `this' if an exception was raised before
        !          11477:                 we are ready to bail out.  */
        !          11478:              cleanup = TREE_GETS_DELETE (current_class_type)
        !          11479:                ? build_opfncall (DELETE_EXPR, LOOKUP_NORMAL, allocated_this, virtual_size, NULL_TREE)
        !          11480:                  /* The size of allocated_this is wrong, and hence the
        !          11481:                     second argument to operator delete will be wrong. */
        !          11482:                  : build_delete (TREE_TYPE (allocated_this), allocated_this,
        !          11483:                                  integer_three_node,
        !          11484:                                  LOOKUP_NORMAL|LOOKUP_HAS_IN_CHARGE, 1);
        !          11485:              cleanup_deallocate
        !          11486:                = build_modify_expr (current_class_decl, NOP_EXPR, integer_zero_node);
        !          11487:              cleanup = tree_cons (NULL_TREE, cleanup,
        !          11488:                                   build_tree_list (NULL_TREE, cleanup_deallocate));
        !          11489: 
        !          11490:              expand_decl_cleanup (allocated_this,
        !          11491:                                   build (COND_EXPR, integer_type_node,
        !          11492:                                          build (NE_EXPR, integer_type_node,
        !          11493:                                                 allocated_this, integer_zero_node),
        !          11494:                                          build_compound_expr (cleanup),
        !          11495:                                          integer_zero_node));
        !          11496:            }
        !          11497:        }
        !          11498:       else if (TREE_GETS_NEW (current_class_type))
        !          11499:        /* Just check visibility here.  */
        !          11500:        build_method_call (build1 (NOP_EXPR, TYPE_POINTER_TO (current_class_type), error_mark_node),
        !          11501:                           ansi_opname[(int) NEW_EXPR],
        !          11502:                           build_tree_list (NULL_TREE, integer_zero_node),
        !          11503:                           NULL_TREE, LOOKUP_NORMAL);
        !          11504: 
        !          11505:       CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type) = abstract_virtuals;
        !          11506: 
        !          11507:       /* must keep the first insn safe.  */
        !          11508:       head = get_insns ();
        !          11509: 
        !          11510:       /* this note will come up to the top with us.  */
        !          11511:       mark = get_last_insn ();
        !          11512: 
        !          11513:       if (flag_this_is_variable > 0)
        !          11514:        {
        !          11515:          expand_start_cond (cond, 0);
        !          11516:          expand_expr_stmt (thenclause);
        !          11517:          if (flag_handle_exceptions == 2)
        !          11518:            expand_assignment (allocated_this, current_class_decl, 0, 0);
        !          11519:          expand_end_cond ();
        !          11520:        }
        !          11521: 
        !          11522:       if (DECL_NAME (fndecl) == NULL_TREE
        !          11523:          && TREE_CHAIN (DECL_ARGUMENTS (fndecl)) != NULL_TREE)
        !          11524:        build_default_constructor (fndecl);
        !          11525: 
        !          11526:       /* Emit insns from `emit_base_init' which sets up virtual
        !          11527:         function table pointer(s).  */
        !          11528:       emit_insns (base_init_insns);
        !          11529:       base_init_insns = NULL_RTX;
        !          11530: 
        !          11531:       /* This is where the body of the constructor begins.
        !          11532:         If there were no insns in this function body, then the
        !          11533:         last_parm_insn is also the last insn.
        !          11534: 
        !          11535:         If optimization is enabled, last_parm_insn may move, so
        !          11536:         we don't hold on to it (across emit_base_init).  */
        !          11537:       last_parm_insn = get_first_nonparm_insn ();
        !          11538:       if (last_parm_insn == NULL_RTX)
        !          11539:        last_parm_insn = mark;
        !          11540:       else
        !          11541:        last_parm_insn = previous_insn (last_parm_insn);
        !          11542: 
        !          11543:       if (mark != get_last_insn ())
        !          11544:        reorder_insns (next_insn (mark), get_last_insn (), last_parm_insn);
        !          11545: 
        !          11546:       /* This is where the body of the constructor ends.  */
        !          11547:       expand_label (ctor_label);
        !          11548:       ctor_label = NULL_TREE;
        !          11549:       if (flag_handle_exceptions == 2)
        !          11550:        {
        !          11551:          expand_assignment (allocated_this, integer_zero_node, 0, 0);
        !          11552:          if (call_poplevel)
        !          11553:            deactivate_exception_cleanups ();
        !          11554:        }
        !          11555: 
        !          11556:       pop_implicit_try_blocks (NULL_TREE);
        !          11557: 
        !          11558:       if (call_poplevel)
        !          11559:        {
        !          11560:          expand_end_bindings (decls = getdecls (), decls != NULL_TREE, 0);
        !          11561:          poplevel (decls != NULL_TREE, 1, 0);
        !          11562:        }
        !          11563: 
        !          11564:       c_expand_return (current_class_decl);
        !          11565: 
        !          11566:       current_function_assigns_this = 0;
        !          11567:       current_function_just_assigned_this = 0;
        !          11568:     }
        !          11569:   else if (IDENTIFIER_LENGTH (DECL_NAME (fndecl)) == 4
        !          11570:           && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "main")
        !          11571:           && DECL_CONTEXT (fndecl) == NULL_TREE)
        !          11572:     {
        !          11573:       /* Make it so that `main' always returns 0 by default.  */
        !          11574: #ifdef VMS
        !          11575:       c_expand_return (integer_one_node);
        !          11576: #else
        !          11577:       c_expand_return (integer_zero_node);
        !          11578: #endif
        !          11579:     }
        !          11580:   else if (return_label != NULL_RTX
        !          11581:           && current_function_return_value == NULL_TREE
        !          11582:           && ! DECL_NAME (DECL_RESULT (current_function_decl)))
        !          11583:     no_return_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
        !          11584: 
        !          11585:   if (flag_gc)
        !          11586:     expand_gc_prologue_and_epilogue ();
        !          11587: 
        !          11588:   /* That's the end of the vtable decl's life.  Need to mark it such
        !          11589:      if doing stupid register allocation.
        !          11590: 
        !          11591:      Note that current_vtable_decl is really an INDIRECT_REF
        !          11592:      on top of a VAR_DECL here.  */
        !          11593:   if (obey_regdecls && current_vtable_decl)
        !          11594:     use_variable (DECL_RTL (TREE_OPERAND (current_vtable_decl, 0)));
        !          11595: 
        !          11596:   /* If this function is supposed to return a value, ensure that
        !          11597:      we do not fall into the cleanups by mistake.  The end of our
        !          11598:      function will look like this:
        !          11599: 
        !          11600:        user code (may have return stmt somewhere)
        !          11601:        goto no_return_label
        !          11602:        cleanup_label:
        !          11603:        cleanups
        !          11604:        goto return_label
        !          11605:        no_return_label:
        !          11606:        NOTE_INSN_FUNCTION_END
        !          11607:        return_label:
        !          11608:        things for return
        !          11609: 
        !          11610:      If the user omits a return stmt in the USER CODE section, we
        !          11611:      will have a control path which reaches NOTE_INSN_FUNCTION_END.
        !          11612:      Otherwise, we won't.  */
        !          11613:   if (no_return_label)
        !          11614:     {
        !          11615:       DECL_CONTEXT (no_return_label) = fndecl;
        !          11616:       DECL_INITIAL (no_return_label) = error_mark_node;
        !          11617:       DECL_SOURCE_FILE (no_return_label) = input_filename;
        !          11618:       DECL_SOURCE_LINE (no_return_label) = lineno;
        !          11619:       expand_goto (no_return_label);
        !          11620:     }
        !          11621: 
        !          11622:   if (cleanup_label)
        !          11623:     {
        !          11624:       /* remove the binding contour which is used
        !          11625:         to catch cleanup-generated temporaries.  */
        !          11626:       expand_end_bindings (0, 0, 0);
        !          11627:       poplevel (0, 0, 0);
        !          11628:     }
        !          11629: 
        !          11630:   if (cleanup_label)
        !          11631:     /* Emit label at beginning of cleanup code for parameters.  */
        !          11632:     emit_label (cleanup_label);
        !          11633: 
        !          11634: #if 1
        !          11635:   /* Cheap hack to get better code from GNU C++.  Remove when cse is fixed.  */
        !          11636:   if (exception_throw_decl && sets_exception_throw_decl == 0)
        !          11637:     expand_assignment (exception_throw_decl, integer_zero_node, 0, 0);
        !          11638: #endif
        !          11639: 
        !          11640:   if (flag_handle_exceptions)
        !          11641:     {
        !          11642:       expand_end_try ();
        !          11643:       expand_start_except (0, 0);
        !          11644:       expand_end_except ();
        !          11645:     }
        !          11646: 
        !          11647:   /* Get return value into register if that's where it's supposed to be.  */
        !          11648:   if (original_result_rtx)
        !          11649:     fixup_result_decl (DECL_RESULT (fndecl), original_result_rtx);
        !          11650: 
        !          11651:   /* Finish building code that will trigger warnings if users forget
        !          11652:      to make their functions return values.  */
        !          11653:   if (no_return_label || cleanup_label)
        !          11654:     emit_jump (return_label);
        !          11655:   if (no_return_label)
        !          11656:     {
        !          11657:       /* We don't need to call `expand_*_return' here because we
        !          11658:         don't need any cleanups here--this path of code is only
        !          11659:         for error checking purposes.  */
        !          11660:       expand_label (no_return_label);
        !          11661:     }
        !          11662: 
        !          11663:   /* reset scope for C++: if we were in the scope of a class,
        !          11664:      then when we finish this function, we are not longer so.
        !          11665:      This cannot be done until we know for sure that no more
        !          11666:      class members will ever be referenced in this function
        !          11667:      (i.e., calls to destructors).  */
        !          11668:   if (current_class_name)
        !          11669:     {
        !          11670:       ctype = current_class_type;
        !          11671: #if NEW_CLASS_SCOPING
        !          11672:       pop_nested_class (1);
        !          11673: #else
        !          11674:       popclass (1);
        !          11675: #endif
        !          11676:     }
        !          11677:   else
        !          11678:     pop_memoized_context (1);
        !          11679: 
        !          11680:   /* Forget about all overloaded functions defined in
        !          11681:      this scope which go away.  */
        !          11682:   while (overloads_to_forget)
        !          11683:     {
        !          11684:       IDENTIFIER_GLOBAL_VALUE (TREE_PURPOSE (overloads_to_forget))
        !          11685:        = TREE_VALUE (overloads_to_forget);
        !          11686:       overloads_to_forget = TREE_CHAIN (overloads_to_forget);
        !          11687:     }
        !          11688: 
        !          11689:   /* Generate rtl for function exit.  */
        !          11690:   expand_function_end (input_filename, lineno, 1);
        !          11691: 
        !          11692:   /* This must come after expand_function_end because cleanups might
        !          11693:      have declarations (from inline functions) that need to go into
        !          11694:      this function's blocks.  */
        !          11695:   if (current_binding_level->parm_flag != 1)
        !          11696:     my_friendly_abort (122);
        !          11697:   poplevel (1, 0, 1);
        !          11698: 
        !          11699:   /* Must mark the RESULT_DECL as being in this function.  */
        !          11700:   DECL_CONTEXT (DECL_RESULT (fndecl)) = DECL_INITIAL (fndecl);
        !          11701: 
        !          11702:   /* Obey `register' declarations if `setjmp' is called in this fn.  */
        !          11703:   if (flag_traditional && current_function_calls_setjmp)
        !          11704:     setjmp_protect (DECL_INITIAL (fndecl));
        !          11705: 
        !          11706:   /* Set the BLOCK_SUPERCONTEXT of the outermost function scope to point
        !          11707:      to the FUNCTION_DECL node itself.  */
        !          11708:   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
        !          11709: 
        !          11710:   /* So we can tell if jump_optimize sets it to 1.  */
        !          11711:   can_reach_end = 0;
        !          11712: 
        !          11713:   /* ??? Compensate for Sun brain damage in dealing with data segments
        !          11714:      of PIC code.  */
        !          11715:   if (flag_pic
        !          11716:       && (DECL_CONSTRUCTOR_P (fndecl)
        !          11717:          || DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (fndecl)))
        !          11718:       && CLASSTYPE_NEEDS_VIRTUAL_REINIT (TYPE_METHOD_BASETYPE (fntype)))
        !          11719:     DECL_INLINE (fndecl) = 0;
        !          11720: 
        !          11721:   if (DECL_EXTERNAL (fndecl)
        !          11722:       /* This function is just along for the ride.  If we can make
        !          11723:         it inline, that's great.  Otherwise, just punt it.  */
        !          11724:       && (DECL_INLINE (fndecl) == 0
        !          11725:          || flag_no_inline
        !          11726:          || function_cannot_inline_p (fndecl)))
        !          11727:     {
        !          11728:       extern int rtl_dump_and_exit;
        !          11729:       int old_rtl_dump_and_exit = rtl_dump_and_exit;
        !          11730:       int inline_spec = DECL_INLINE (fndecl);
        !          11731: 
        !          11732:       /* This throws away the code for FNDECL.  */
        !          11733:       rtl_dump_and_exit = 1;
        !          11734:       /* This throws away the memory of the code for FNDECL.  */
        !          11735:       if (flag_no_inline)
        !          11736:        DECL_INLINE (fndecl) = 0;
        !          11737:       rest_of_compilation (fndecl);
        !          11738:       rtl_dump_and_exit = old_rtl_dump_and_exit;
        !          11739:       DECL_INLINE (fndecl) = inline_spec;
        !          11740:     }
        !          11741:   else
        !          11742:     {
        !          11743:       /* Run the optimizers and output the assembler code for this function.  */
        !          11744:       rest_of_compilation (fndecl);
        !          11745:     }
        !          11746: 
        !          11747:   if (ctype && TREE_ASM_WRITTEN (fndecl))
        !          11748:     note_debug_info_needed (ctype);
        !          11749: 
        !          11750:   current_function_returns_null |= can_reach_end;
        !          11751: 
        !          11752:   /* Since we don't normally go through c_expand_return for constructors,
        !          11753:      this normally gets the wrong value.
        !          11754:      Also, named return values have their return codes emitted after
        !          11755:      NOTE_INSN_FUNCTION_END, confusing jump.c.  */
        !          11756:   if (DECL_CONSTRUCTOR_P (fndecl)
        !          11757:       || DECL_NAME (DECL_RESULT (fndecl)) != NULL_TREE)
        !          11758:     current_function_returns_null = 0;
        !          11759: 
        !          11760:   if (TREE_THIS_VOLATILE (fndecl) && current_function_returns_null)
        !          11761:     warning ("`volatile' function does return");
        !          11762:   else if (warn_return_type && current_function_returns_null
        !          11763:           && TYPE_MAIN_VARIANT (TREE_TYPE (fntype)) != void_type_node)
        !          11764:     {
        !          11765:       /* If this function returns non-void and control can drop through,
        !          11766:         complain.  */
        !          11767:       pedwarn ("control reaches end of non-void function");
        !          11768:     }
        !          11769:   /* With just -W, complain only if function returns both with
        !          11770:      and without a value.  */
        !          11771:   else if (extra_warnings
        !          11772:           && current_function_returns_value && current_function_returns_null)
        !          11773:     warning ("this function may return with or without a value");
        !          11774: 
        !          11775:   /* Free all the tree nodes making up this function.  */
        !          11776:   /* Switch back to allocating nodes permanently
        !          11777:      until we start another function.  */
        !          11778:   permanent_allocation ();
        !          11779: 
        !          11780:   if (flag_cadillac)
        !          11781:     cadillac_finish_function (fndecl);
        !          11782: 
        !          11783:   if (DECL_SAVED_INSNS (fndecl) == NULL_RTX)
        !          11784:     {
        !          11785:       /* Stop pointing to the local nodes about to be freed.  */
        !          11786:       /* But DECL_INITIAL must remain nonzero so we know this
        !          11787:         was an actual function definition.  */
        !          11788:       DECL_INITIAL (fndecl) = error_mark_node;
        !          11789:       if (! DECL_CONSTRUCTOR_P (fndecl)
        !          11790:          || !TYPE_USES_VIRTUAL_BASECLASSES (TYPE_METHOD_BASETYPE (fntype)))
        !          11791:        DECL_ARGUMENTS (fndecl) = NULL_TREE;
        !          11792:     }
        !          11793: 
        !          11794:   /* Let the error reporting routines know that we're outside a function.  */
        !          11795:   current_function_decl = NULL_TREE;
        !          11796:   named_label_uses = NULL_TREE;
        !          11797: }
        !          11798: 
        !          11799: /* Create the FUNCTION_DECL for a function definition.
        !          11800:    LINE1 is the line number that the definition absolutely begins on.
        !          11801:    LINE2 is the line number that the name of the function appears on.
        !          11802:    DECLSPECS and DECLARATOR are the parts of the declaration;
        !          11803:    they describe the function's name and the type it returns,
        !          11804:    but twisted together in a fashion that parallels the syntax of C.
        !          11805: 
        !          11806:    This function creates a binding context for the function body
        !          11807:    as well as setting up the FUNCTION_DECL in current_function_decl.
        !          11808: 
        !          11809:    Returns a FUNCTION_DECL on success.
        !          11810: 
        !          11811:    If the DECLARATOR is not suitable for a function (it defines a datum
        !          11812:    instead), we return 0, which tells yyparse to report a parse error.
        !          11813: 
        !          11814:    May return void_type_node indicating that this method is actually
        !          11815:    a friend.  See grokfield for more details.
        !          11816: 
        !          11817:    Came here with a `.pushlevel' .
        !          11818: 
        !          11819:    DO NOT MAKE ANY CHANGES TO THIS CODE WITHOUT MAKING CORRESPONDING
        !          11820:    CHANGES TO CODE IN `grokfield'.  */
        !          11821: tree
        !          11822: start_method (declspecs, declarator, raises)
        !          11823:      tree declarator, declspecs, raises;
        !          11824: {
        !          11825:   tree fndecl = grokdeclarator (declarator, declspecs, MEMFUNCDEF, 0, raises);
        !          11826: 
        !          11827:   /* Something too ugly to handle.  */
        !          11828:   if (fndecl == NULL_TREE)
        !          11829:     return NULL_TREE;
        !          11830: 
        !          11831:   /* Pass friends other than inline friend functions back.  */
        !          11832:   if (TYPE_MAIN_VARIANT (fndecl) == void_type_node)
        !          11833:     return fndecl;
        !          11834: 
        !          11835:   if (TREE_CODE (fndecl) != FUNCTION_DECL)
        !          11836:     /* Not a function, tell parser to report parse error.  */
        !          11837:     return NULL_TREE;
        !          11838: 
        !          11839:   if (DECL_IN_AGGR_P (fndecl))
        !          11840:     {
        !          11841:       if (IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (fndecl)) != current_class_type)
        !          11842:        {
        !          11843:          if (DECL_CONTEXT (fndecl))
        !          11844:            cp_error ("`%D' is already defined in class %s", fndecl,
        !          11845:                             TYPE_NAME_STRING (DECL_CONTEXT (fndecl)));
        !          11846:        }
        !          11847:       return void_type_node;
        !          11848:     }
        !          11849: 
        !          11850:   /* If we're expanding a template, a function must be explicitly declared
        !          11851:      inline if we're to compile it now.  If it isn't, we have to wait to see
        !          11852:      whether it's needed, and whether an override exists.  */
        !          11853:   if (flag_default_inline && !processing_template_defn)
        !          11854:     DECL_INLINE (fndecl) = 1;
        !          11855: 
        !          11856:   /* We read in the parameters on the maybepermanent_obstack,
        !          11857:      but we won't be getting back to them until after we
        !          11858:      may have clobbered them.  So the call to preserve_data
        !          11859:      will keep them safe.  */
        !          11860:   preserve_data ();
        !          11861: 
        !          11862:   if (! DECL_FRIEND_P (fndecl))
        !          11863:     {
        !          11864:       if (DECL_CHAIN (fndecl) != NULL_TREE)
        !          11865:        {
        !          11866:          /* Need a fresh node here so that we don't get circularity
        !          11867:             when we link these together.  If FNDECL was a friend, then
        !          11868:             `pushdecl' does the right thing, which is nothing wrt its
        !          11869:             current value of DECL_CHAIN.  */
        !          11870:          fndecl = copy_node (fndecl);
        !          11871:        }
        !          11872:       if (TREE_CHAIN (fndecl))
        !          11873:        {
        !          11874:          fndecl = copy_node (fndecl);
        !          11875:          TREE_CHAIN (fndecl) = NULL_TREE;
        !          11876:        }
        !          11877: 
        !          11878:       if (DECL_CONSTRUCTOR_P (fndecl))
        !          11879:        grok_ctor_properties (current_class_type, fndecl);
        !          11880:       else if (IDENTIFIER_OPNAME_P (DECL_NAME (fndecl)))
        !          11881:        grok_op_properties (fndecl, DECL_VIRTUAL_P (fndecl));
        !          11882:     }
        !          11883: 
        !          11884:   finish_decl (fndecl, NULL_TREE, NULL_TREE, 0);
        !          11885: 
        !          11886:   /* Make a place for the parms */
        !          11887:   pushlevel (0);
        !          11888:   current_binding_level->parm_flag = 1;
        !          11889:   
        !          11890:   DECL_IN_AGGR_P (fndecl) = 1;
        !          11891:   return fndecl;
        !          11892: }
        !          11893: 
        !          11894: /* Go through the motions of finishing a function definition.
        !          11895:    We don't compile this method until after the whole class has
        !          11896:    been processed.
        !          11897: 
        !          11898:    FINISH_METHOD must return something that looks as though it
        !          11899:    came from GROKFIELD (since we are defining a method, after all).
        !          11900: 
        !          11901:    This is called after parsing the body of the function definition.
        !          11902:    STMTS is the chain of statements that makes up the function body.
        !          11903: 
        !          11904:    DECL is the ..._DECL that `start_method' provided.  */
        !          11905: 
        !          11906: tree
        !          11907: finish_method (decl)
        !          11908:      tree decl;
        !          11909: {
        !          11910:   register tree fndecl = decl;
        !          11911:   tree old_initial;
        !          11912:   tree context = DECL_CONTEXT (fndecl);
        !          11913: 
        !          11914:   register tree link;
        !          11915: 
        !          11916:   if (TYPE_MAIN_VARIANT (decl) == void_type_node)
        !          11917:     return decl;
        !          11918: 
        !          11919:   old_initial = DECL_INITIAL (fndecl);
        !          11920: 
        !          11921:   /* Undo the level for the parms (from start_method).
        !          11922:      This is like poplevel, but it causes nothing to be
        !          11923:      saved.  Saving information here confuses symbol-table
        !          11924:      output routines.  Besides, this information will
        !          11925:      be correctly output when this method is actually
        !          11926:      compiled.  */
        !          11927: 
        !          11928:   /* Clear out the meanings of the local variables of this level;
        !          11929:      also record in each decl which block it belongs to.  */
        !          11930: 
        !          11931:   for (link = current_binding_level->names; link; link = TREE_CHAIN (link))
        !          11932:     {
        !          11933:       if (DECL_NAME (link) != NULL_TREE)
        !          11934:        IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = 0;
        !          11935:       my_friendly_assert (TREE_CODE (link) != FUNCTION_DECL, 163);
        !          11936:       DECL_CONTEXT (link) = NULL_TREE;
        !          11937:     }
        !          11938: 
        !          11939:   /* Restore all name-meanings of the outer levels
        !          11940:      that were shadowed by this level.  */
        !          11941: 
        !          11942:   for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
        !          11943:       IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
        !          11944:   for (link = current_binding_level->class_shadowed;
        !          11945:        link; link = TREE_CHAIN (link))
        !          11946:     IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
        !          11947:   for (link = current_binding_level->type_shadowed;
        !          11948:        link; link = TREE_CHAIN (link))
        !          11949:     IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
        !          11950: 
        !          11951:   GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level,
        !          11952:                      (HOST_WIDE_INT) current_binding_level->level_chain,
        !          11953:                      current_binding_level->parm_flag,
        !          11954:                      current_binding_level->keep,
        !          11955:                      current_binding_level->tag_transparent);
        !          11956: 
        !          11957:   poplevel (0, 0, 0);
        !          11958: 
        !          11959:   DECL_INITIAL (fndecl) = old_initial;
        !          11960: 
        !          11961:   /* We used to check if the context of FNDECL was different from
        !          11962:      current_class_type as another way to get inside here.  This didn't work
        !          11963:      for String.cc in libg++.  */
        !          11964:   if (DECL_FRIEND_P (fndecl))
        !          11965:     {
        !          11966:       CLASSTYPE_INLINE_FRIENDS (current_class_type)
        !          11967:        = tree_cons (NULL_TREE, fndecl, CLASSTYPE_INLINE_FRIENDS (current_class_type));
        !          11968:       decl = void_type_node;
        !          11969:     }
        !          11970: 
        !          11971:   return decl;
        !          11972: }
        !          11973: 
        !          11974: /* Called when a new struct TYPE is defined.
        !          11975:    If this structure or union completes the type of any previous
        !          11976:    variable declaration, lay it out and output its rtl.  */
        !          11977: 
        !          11978: void
        !          11979: hack_incomplete_structures (type)
        !          11980:      tree type;
        !          11981: {
        !          11982:   tree decl;
        !          11983: 
        !          11984:   if (current_binding_level->n_incomplete == 0)
        !          11985:     return;
        !          11986: 
        !          11987:   if (!type) /* Don't do this for class templates.  */
        !          11988:     return;
        !          11989: 
        !          11990:   for (decl = current_binding_level->names; decl; decl = TREE_CHAIN (decl))
        !          11991:     if (TREE_TYPE (decl) == type
        !          11992:        || (TREE_TYPE (decl)
        !          11993:            && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
        !          11994:            && TREE_TYPE (TREE_TYPE (decl)) == type))
        !          11995:       {
        !          11996:        if (TREE_CODE (decl) == TYPE_DECL)
        !          11997:          layout_type (TREE_TYPE (decl));
        !          11998:        else
        !          11999:          {
        !          12000:            int toplevel = global_binding_level == current_binding_level;
        !          12001:            if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
        !          12002:                && TREE_TYPE (TREE_TYPE (decl)) == type)
        !          12003:              layout_type (TREE_TYPE (decl));
        !          12004:            layout_decl (decl, 0);
        !          12005:            rest_of_decl_compilation (decl, NULL_PTR, toplevel, 0);
        !          12006:            if (! toplevel)
        !          12007:              {
        !          12008:                expand_decl (decl);
        !          12009:                expand_decl_cleanup (decl, maybe_build_cleanup (decl));
        !          12010:                expand_decl_init (decl);
        !          12011:              }
        !          12012:          }
        !          12013:        my_friendly_assert (current_binding_level->n_incomplete > 0, 164);
        !          12014:        --current_binding_level->n_incomplete;
        !          12015:       }
        !          12016: }
        !          12017: 
        !          12018: /* Nonzero if presently building a cleanup.  Needed because
        !          12019:    SAVE_EXPRs are not the right things to use inside of cleanups.
        !          12020:    They are only ever evaluated once, where the cleanup
        !          12021:    might be evaluated several times.  In this case, a later evaluation
        !          12022:    of the cleanup might fill in the SAVE_EXPR_RTL, and it will
        !          12023:    not be valid for an earlier cleanup.  */
        !          12024: 
        !          12025: int building_cleanup;
        !          12026: 
        !          12027: /* If DECL is of a type which needs a cleanup, build that cleanup here.
        !          12028:    We don't build cleanups if just going for syntax checking, since
        !          12029:    fixup_cleanups does not know how to not handle them.
        !          12030: 
        !          12031:    Don't build these on the momentary obstack; they must live
        !          12032:    the life of the binding contour.  */
        !          12033: tree
        !          12034: maybe_build_cleanup (decl)
        !          12035:      tree decl;
        !          12036: {
        !          12037:   tree type = TREE_TYPE (decl);
        !          12038:   if (TYPE_NEEDS_DESTRUCTOR (type))
        !          12039:     {
        !          12040:       int temp = 0, flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR;
        !          12041:       tree rval;
        !          12042:       int old_building_cleanup = building_cleanup;
        !          12043:       building_cleanup = 1;
        !          12044: 
        !          12045:       if (TREE_CODE (decl) != PARM_DECL)
        !          12046:        temp = suspend_momentary ();
        !          12047: 
        !          12048:       if (TREE_CODE (type) == ARRAY_TYPE)
        !          12049:        rval = decl;
        !          12050:       else
        !          12051:        {
        !          12052:          mark_addressable (decl);
        !          12053:          rval = build_unary_op (ADDR_EXPR, decl, 0);
        !          12054:        }
        !          12055: 
        !          12056:       /* Optimize for space over speed here.  */
        !          12057:       if (! TYPE_USES_VIRTUAL_BASECLASSES (type)
        !          12058:          || flag_expensive_optimizations)
        !          12059:        flags |= LOOKUP_NONVIRTUAL;
        !          12060: 
        !          12061:       /* Use TYPE_MAIN_VARIANT so we don't get a warning about
        !          12062:         calling delete on a `const' variable.  */
        !          12063:       if (TYPE_READONLY (TREE_TYPE (TREE_TYPE (rval))))
        !          12064:        rval = build1 (NOP_EXPR, TYPE_POINTER_TO (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (rval)))), rval);
        !          12065: 
        !          12066:       rval = build_delete (TREE_TYPE (rval), rval, integer_two_node, flags, 0);
        !          12067: 
        !          12068:       if (TYPE_USES_VIRTUAL_BASECLASSES (type)
        !          12069:          && ! TYPE_HAS_DESTRUCTOR (type))
        !          12070:        rval = build_compound_expr (tree_cons (NULL_TREE, rval,
        !          12071:                                               build_tree_list (NULL_TREE, build_vbase_delete (type, decl))));
        !          12072: 
        !          12073:       current_binding_level->have_cleanups = 1;
        !          12074:       current_binding_level->more_exceptions_ok = 0;
        !          12075: 
        !          12076:       if (TREE_CODE (decl) != PARM_DECL)
        !          12077:        resume_momentary (temp);
        !          12078: 
        !          12079:       building_cleanup = old_building_cleanup;
        !          12080: 
        !          12081:       return rval;
        !          12082:     }
        !          12083:   return 0;
        !          12084: }
        !          12085: 
        !          12086: /* Expand a C++ expression at the statement level.
        !          12087:    This is needed to ferret out nodes which have UNKNOWN_TYPE.
        !          12088:    The C++ type checker should get all of these out when
        !          12089:    expressions are combined with other, type-providing, expressions,
        !          12090:    leaving only orphan expressions, such as:
        !          12091: 
        !          12092:    &class::bar;                / / takes its address, but does nothing with it.
        !          12093: 
        !          12094:    */
        !          12095: void
        !          12096: cplus_expand_expr_stmt (exp)
        !          12097:      tree exp;
        !          12098: {
        !          12099:   if (TREE_TYPE (exp) == unknown_type_node)
        !          12100:     {
        !          12101:       if (TREE_CODE (exp) == ADDR_EXPR || TREE_CODE (exp) == TREE_LIST)
        !          12102:        error ("address of overloaded function with no contextual type information");
        !          12103:       else if (TREE_CODE (exp) == COMPONENT_REF)
        !          12104:        warning ("useless reference to a member function name, did you forget the ()?");
        !          12105:     }
        !          12106:   else
        !          12107:     {
        !          12108:       int remove_implicit_immediately = 0;
        !          12109: 
        !          12110:       if (TREE_CODE (exp) == FUNCTION_DECL)
        !          12111:        {
        !          12112:          cp_warning ("reference, not call, to function `%D'", exp);
        !          12113:          warning ("at this point in file");
        !          12114:        }
        !          12115:       if (TREE_RAISES (exp))
        !          12116:        {
        !          12117:          my_friendly_assert (flag_handle_exceptions, 165);
        !          12118:          if (flag_handle_exceptions == 2)
        !          12119:            {
        !          12120:              if (! current_binding_level->more_exceptions_ok)
        !          12121:                {
        !          12122:                  extern struct nesting *nesting_stack, *block_stack;
        !          12123: 
        !          12124:                  remove_implicit_immediately
        !          12125:                    = (nesting_stack != block_stack);
        !          12126:                  cplus_expand_start_try (1);
        !          12127:                }
        !          12128:              current_binding_level->have_exceptions = 1;
        !          12129:            }
        !          12130:        }
        !          12131: 
        !          12132:       expand_expr_stmt (break_out_cleanups (exp));
        !          12133: 
        !          12134:       if (remove_implicit_immediately)
        !          12135:        pop_implicit_try_blocks (NULL_TREE);
        !          12136:     }
        !          12137: 
        !          12138:   /* Clean up any pending cleanups.  This happens when a function call
        !          12139:      returns a cleanup-needing value that nobody uses.  */
        !          12140:   expand_cleanups_to (NULL_TREE);
        !          12141: }
        !          12142: 
        !          12143: /* When a stmt has been parsed, this function is called.
        !          12144: 
        !          12145:    Currently, this function only does something within a
        !          12146:    constructor's scope: if a stmt has just assigned to this,
        !          12147:    and we are in a derived class, we call `emit_base_init'.  */
        !          12148: 
        !          12149: void
        !          12150: finish_stmt ()
        !          12151: {
        !          12152:   extern struct nesting *cond_stack, *loop_stack, *case_stack;
        !          12153: 
        !          12154:   
        !          12155:   if (current_function_assigns_this
        !          12156:       || ! current_function_just_assigned_this)
        !          12157:     return;
        !          12158:   if (DECL_CONSTRUCTOR_P (current_function_decl))
        !          12159:     {
        !          12160:       /* Constructors must wait until we are out of control
        !          12161:         zones before calling base constructors.  */
        !          12162:       if (cond_stack || loop_stack || case_stack)
        !          12163:        return;
        !          12164:       emit_insns (base_init_insns);
        !          12165:       check_base_init (current_class_type);
        !          12166:     }
        !          12167:   current_function_assigns_this = 1;
        !          12168: 
        !          12169:   if (flag_cadillac)
        !          12170:     cadillac_finish_stmt ();
        !          12171: }
        !          12172: 
        !          12173: void
        !          12174: pop_implicit_try_blocks (decl)
        !          12175:      tree decl;
        !          12176: {
        !          12177:   if (decl)
        !          12178:     {
        !          12179:       my_friendly_assert (current_binding_level->parm_flag == 3, 166);
        !          12180:       current_binding_level->names = TREE_CHAIN (decl);
        !          12181:     }
        !          12182: 
        !          12183:   while (current_binding_level->parm_flag == 3)
        !          12184:     {
        !          12185:       tree name = get_identifier ("(compiler error)");
        !          12186:       tree orig_ex_type = current_exception_type;
        !          12187:       tree orig_ex_decl = current_exception_decl;
        !          12188:       tree orig_ex_obj = current_exception_object;
        !          12189:       tree decl = cplus_expand_end_try (2);
        !          12190: 
        !          12191:       /* @@ It would be nice to make all these point
        !          12192:         to exactly the same handler.  */
        !          12193:       /* Start hidden EXCEPT.  */
        !          12194:       cplus_expand_start_except (name, decl);
        !          12195:       /* reraise ALL.  */
        !          12196:       cplus_expand_reraise (NULL_TREE);
        !          12197:       current_exception_type = orig_ex_type;
        !          12198:       current_exception_decl = orig_ex_decl;
        !          12199:       current_exception_object = orig_ex_obj;
        !          12200:       /* This will reraise for us.  */
        !          12201:       cplus_expand_end_except (error_mark_node);
        !          12202:     }
        !          12203: 
        !          12204:   if (decl)
        !          12205:     {
        !          12206:       TREE_CHAIN (decl) = current_binding_level->names;
        !          12207:       current_binding_level->names = decl;
        !          12208:     }
        !          12209: }
        !          12210: 
        !          12211: /* Push a cleanup onto the current binding contour that will cause
        !          12212:    ADDR to be cleaned up, in the case that an exception propagates
        !          12213:    through its binding contour.  */
        !          12214: 
        !          12215: void
        !          12216: push_exception_cleanup (addr)
        !          12217:      tree addr;
        !          12218: {
        !          12219:   tree decl = build_decl (VAR_DECL, get_identifier (EXCEPTION_CLEANUP_NAME), ptr_type_node);
        !          12220:   tree cleanup;
        !          12221: 
        !          12222:   decl = pushdecl (decl);
        !          12223:   DECL_REGISTER (decl) = 1;
        !          12224:   store_init_value (decl, addr);
        !          12225:   expand_decl (decl);
        !          12226:   expand_decl_init (decl);
        !          12227: 
        !          12228:   cleanup = build (COND_EXPR, integer_type_node,
        !          12229:                   build (NE_EXPR, integer_type_node,
        !          12230:                          decl, integer_zero_node),
        !          12231:                   build_delete (TREE_TYPE (addr), decl,
        !          12232:                                 lookup_name (in_charge_identifier, 0),
        !          12233:                                 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0),
        !          12234:                   integer_zero_node);
        !          12235:   expand_decl_cleanup (decl, cleanup);
        !          12236: }
        !          12237: 
        !          12238: /* For each binding contour, emit code that deactivates the
        !          12239:    exception cleanups.  All other cleanups are left as they were.  */
        !          12240: 
        !          12241: static void
        !          12242: deactivate_exception_cleanups ()
        !          12243: {
        !          12244:   struct binding_level *b = current_binding_level;
        !          12245:   tree xyzzy = get_identifier (EXCEPTION_CLEANUP_NAME);
        !          12246:   while (b != class_binding_level)
        !          12247:     {
        !          12248:       if (b->parm_flag == 3)
        !          12249:        {
        !          12250:          tree decls = b->names;
        !          12251:          while (decls)
        !          12252:            {
        !          12253:              if (DECL_NAME (decls) == xyzzy)
        !          12254:                expand_assignment (decls, integer_zero_node, 0, 0);
        !          12255:              decls = TREE_CHAIN (decls);
        !          12256:            }
        !          12257:        }
        !          12258:       b = b->level_chain;
        !          12259:     }
        !          12260: }
        !          12261: 
        !          12262: /* Change a static member function definition into a FUNCTION_TYPE, instead
        !          12263:    of the METHOD_TYPE that we create when it's originally parsed.  */
        !          12264: void
        !          12265: revert_static_member_fn (fn, decl, argtypes)
        !          12266:      tree *fn, *decl, *argtypes;
        !          12267: {
        !          12268:   tree tmp, function = *fn;
        !          12269: 
        !          12270:   *argtypes = TREE_CHAIN (*argtypes);
        !          12271:   tmp = build_function_type (TREE_TYPE (function), *argtypes);
        !          12272:   tmp = build_type_variant (tmp, TYPE_READONLY (function),
        !          12273:                            TYPE_VOLATILE (function));
        !          12274:   tmp = build_exception_variant (TYPE_METHOD_BASETYPE (function), tmp,
        !          12275:                                 TYPE_RAISES_EXCEPTIONS (function));
        !          12276:   TREE_TYPE (*decl) = tmp;
        !          12277:   *fn = tmp;
        !          12278:   DECL_STATIC_FUNCTION_P (*decl) = 1;
        !          12279: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.