Annotation of gcc/cp-decl.c, revision 1.1

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

unix.superglobalmegacorp.com

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