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

1.1       root        1: /* Process declarations and variables for C compiler.
1.1.1.5 ! root        2:    Copyright (C) 1988, 1992, 1993 Free Software Foundation, Inc.
1.1       root        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"
1.1.1.4   root       32: #include "rtl.h"
1.1       root       33: #include "flags.h"
                     34: #include "cp-tree.h"
1.1.1.5 ! root       35: #include "cp-decl.h"
1.1       root       36: #include "cp-lex.h"
1.1.1.4   root       37: #include <sys/types.h>
1.1       root       38: #include <signal.h>
                     39: #include "obstack.h"
                     40: 
                     41: #define obstack_chunk_alloc xmalloc
                     42: #define obstack_chunk_free free
                     43: 
                     44: extern struct obstack permanent_obstack;
                     45: 
                     46: /* Stack of places to restore the search obstack back to.  */
                     47:    
                     48: /* Obstack used for remembering local class declarations (like
                     49:    enums and static (const) members.  */
                     50: #include "stack.h"
                     51: static struct obstack decl_obstack;
                     52: static struct stack_level *decl_stack;
                     53: 
                     54: #undef NULL
1.1.1.5 ! root       55: #define NULL (char *)0
1.1       root       56: 
                     57: #ifndef CHAR_TYPE_SIZE
                     58: #define CHAR_TYPE_SIZE BITS_PER_UNIT
                     59: #endif
                     60: 
                     61: #ifndef SHORT_TYPE_SIZE
                     62: #define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2))
                     63: #endif
                     64: 
                     65: #ifndef INT_TYPE_SIZE
                     66: #define INT_TYPE_SIZE BITS_PER_WORD
                     67: #endif
                     68: 
                     69: #ifndef LONG_TYPE_SIZE
                     70: #define LONG_TYPE_SIZE BITS_PER_WORD
                     71: #endif
                     72: 
                     73: #ifndef LONG_LONG_TYPE_SIZE
                     74: #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
                     75: #endif
                     76: 
                     77: #ifndef WCHAR_UNSIGNED
                     78: #define WCHAR_UNSIGNED 0
                     79: #endif
                     80: 
                     81: #ifndef FLOAT_TYPE_SIZE
                     82: #define FLOAT_TYPE_SIZE BITS_PER_WORD
                     83: #endif
                     84: 
                     85: #ifndef DOUBLE_TYPE_SIZE
                     86: #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
                     87: #endif
                     88: 
                     89: #ifndef LONG_DOUBLE_TYPE_SIZE
                     90: #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
                     91: #endif
                     92: 
                     93: /* We let tm.h override the types used here, to handle trivial differences
                     94:    such as the choice of unsigned int or long unsigned int for size_t.
                     95:    When machines start needing nontrivial differences in the size type,
                     96:    it would be best to do something here to figure out automatically
                     97:    from other information what type to use.  */
                     98: 
                     99: #ifndef SIZE_TYPE
                    100: #define SIZE_TYPE "long unsigned int"
                    101: #endif
                    102: 
                    103: #ifndef PTRDIFF_TYPE
                    104: #define PTRDIFF_TYPE "long int"
                    105: #endif
                    106: 
                    107: #ifndef WCHAR_TYPE
                    108: #define WCHAR_TYPE "int"
                    109: #endif
                    110: 
                    111: #define builtin_function(NAME, TYPE, CODE, LIBNAME) \
                    112:   define_function (NAME, TYPE, CODE, (void (*)())pushdecl, LIBNAME)
                    113: #define auto_function(NAME, TYPE, CODE) \
1.1.1.2   root      114:   do {                                 \
                    115:     tree __name = NAME;                \
                    116:     tree __type = TYPE;                        \
                    117:     define_function (IDENTIFIER_POINTER (__name), __type, CODE,        \
                    118:                     (void (*)())push_overloaded_decl_1,        \
                    119:                     IDENTIFIER_POINTER (build_decl_overload (__name, TYPE_ARG_TYPES (__type), 0)));\
                    120:   } while (0)
1.1       root      121: 
1.1.1.5 ! root      122: static tree grokparms                          PROTO((tree, int));
        !           123: static tree lookup_nested_type                 PROTO((tree, tree));
        !           124: static char *redeclaration_error_message       PROTO((tree, tree));
        !           125: static int parmlist_is_random                  PROTO((tree));
        !           126: static void grok_op_properties                 PROTO((tree, int));
        !           127: static void expand_static_init                 PROTO((tree, tree));
        !           128: static void deactivate_exception_cleanups      PROTO((void));
1.1       root      129: 
1.1.1.5 ! root      130: tree define_function                           PROTO((char *, tree, enum built_in_function, void (*)(), char *));
1.1       root      131: 
                    132: /* a node which has tree code ERROR_MARK, and whose type is itself.
                    133:    All erroneous expressions are replaced with this node.  All functions
                    134:    that accept nodes as arguments should avoid generating error messages
                    135:    if this node is one of the arguments, since it is undesirable to get
                    136:    multiple error messages from one error in the input.  */
                    137: 
                    138: tree error_mark_node;
                    139: 
                    140: /* Erroneous argument lists can use this *IFF* they do not modify it.  */
                    141: tree error_mark_list;
                    142: 
                    143: /* INTEGER_TYPE and REAL_TYPE nodes for the standard data types */
                    144: 
                    145: tree short_integer_type_node;
                    146: tree integer_type_node;
                    147: tree long_integer_type_node;
                    148: tree long_long_integer_type_node;
                    149: 
                    150: tree short_unsigned_type_node;
                    151: tree unsigned_type_node;
                    152: tree long_unsigned_type_node;
                    153: tree long_long_unsigned_type_node;
                    154: 
                    155: tree ptrdiff_type_node;
                    156: 
                    157: tree unsigned_char_type_node;
                    158: tree signed_char_type_node;
                    159: tree char_type_node;
                    160: tree wchar_type_node;
                    161: tree signed_wchar_type_node;
                    162: tree unsigned_wchar_type_node;
                    163: 
                    164: tree float_type_node;
                    165: tree double_type_node;
                    166: tree long_double_type_node;
                    167: 
1.1.1.4   root      168: tree intQI_type_node;
                    169: tree intHI_type_node;
                    170: tree intSI_type_node;
                    171: tree intDI_type_node;
                    172: 
                    173: tree unsigned_intQI_type_node;
                    174: tree unsigned_intHI_type_node;
                    175: tree unsigned_intSI_type_node;
                    176: tree unsigned_intDI_type_node;
                    177: 
1.1       root      178: /* a VOID_TYPE node, and the same, packaged in a TREE_LIST.  */
                    179: 
                    180: tree void_type_node, void_list_node;
                    181: tree void_zero_node;
                    182: 
                    183: /* Nodes for types `void *' and `const void *'.  */
                    184: 
                    185: tree ptr_type_node, const_ptr_type_node;
                    186: 
                    187: /* Nodes for types `char *' and `const char *'.  */
                    188: 
                    189: tree string_type_node, const_string_type_node;
                    190: 
                    191: /* Type `char[256]' or something like it.
                    192:    Used when an array of char is needed and the size is irrelevant.  */
                    193: 
                    194: tree char_array_type_node;
                    195: 
                    196: /* Type `int[256]' or something like it.
                    197:    Used when an array of int needed and the size is irrelevant.  */
                    198: 
                    199: tree int_array_type_node;
                    200: 
                    201: /* Type `wchar_t[256]' or something like it.
                    202:    Used when a wide string literal is created.  */
                    203: 
                    204: tree wchar_array_type_node;
                    205: 
                    206: /* type `int ()' -- used for implicit declaration of functions.  */
                    207: 
                    208: tree default_function_type;
                    209: 
                    210: /* function types `double (double)' and `double (double, double)', etc.  */
                    211: 
                    212: tree double_ftype_double, double_ftype_double_double;
                    213: tree int_ftype_int, long_ftype_long;
                    214: 
                    215: /* Function type `void (void *, void *, int)' and similar ones.  */
                    216: 
                    217: tree void_ftype_ptr_ptr_int, int_ftype_ptr_ptr_int, void_ftype_ptr_int_int;
                    218: 
                    219: /* Function type `char *(char *, char *)' and similar ones */
                    220: tree string_ftype_ptr_ptr, int_ftype_string_string;
                    221: 
                    222: /* Function type `size_t (const char *)' */
                    223: tree sizet_ftype_string;
                    224: 
                    225: /* Function type `int (const void *, const void *, size_t)' */
                    226: tree int_ftype_cptr_cptr_sizet;
                    227: 
                    228: /* C++ extensions */
                    229: tree vtable_entry_type;
                    230: tree __t_desc_type_node, __i_desc_type_node, __m_desc_type_node;
                    231: tree __t_desc_array_type, __i_desc_array_type, __m_desc_array_type;
                    232: tree class_star_type_node;
                    233: tree class_type_node, record_type_node, union_type_node, enum_type_node;
                    234: tree exception_type_node, unknown_type_node;
                    235: tree maybe_gc_cleanup;
                    236: 
                    237: /* Used for virtual function tables.  */
                    238: tree vtbl_mask;
                    239: 
                    240: /* Array type `(void *)[]' */
                    241: tree vtbl_type_node;
                    242: 
                    243: /* Static decls which do not have static initializers have no
                    244:    initializers as far as GNU C is concerned.  EMPTY_INIT_NODE
                    245:    is a static initializer which makes varasm code place the decl
                    246:    in data rather than in bss space.  Such gymnastics are necessary
                    247:    to avoid the problem that the linker will not include a library
                    248:    file if all the library appears to contribute are bss variables.  */
                    249: 
                    250: tree empty_init_node;
                    251: 
                    252: /* In a destructor, the point at which all derived class destroying
                    253:    has been done, just before any base class destroying will be done.  */
                    254: 
                    255: tree dtor_label;
                    256: 
                    257: /* In a constructor, the point at which we are ready to return
                    258:    the pointer to the initialized object.  */
                    259: 
                    260: tree ctor_label;
                    261: 
                    262: /* A FUNCTION_DECL which can call `unhandled_exception'.
1.1.1.2   root      263:    Not necessarily the one that the user will declare,
1.1       root      264:    but sufficient to be called by routines that want to abort the program.  */
                    265: 
                    266: tree unhandled_exception_fndecl;
                    267: 
1.1.1.2   root      268: /* A FUNCTION_DECL which can call `abort'.  Not necessarily the
1.1       root      269:    one that the user will declare, but sufficient to be called
                    270:    by routines that want to abort the program.  */
                    271: 
                    272: tree abort_fndecl;
                    273: 
1.1.1.4   root      274: extern rtx cleanup_label, return_label;
                    275: 
1.1       root      276: /* If original DECL_RESULT of current function was a register,
                    277:    but due to being an addressable named return value, would up
                    278:    on the stack, this variable holds the named return value's
                    279:    original location.  */
1.1.1.4   root      280: rtx original_result_rtx;
1.1       root      281: 
                    282: /* Sequence of insns which represents base initialization.  */
1.1.1.4   root      283: rtx base_init_insns;
1.1       root      284: 
                    285: /* C++: Keep these around to reduce calls to `get_identifier'.
                    286:    Identifiers for `this' in member functions and the auto-delete
                    287:    parameter for destructors.  */
                    288: tree this_identifier, in_charge_identifier;
                    289: 
                    290: /* A list (chain of TREE_LIST nodes) of named label uses.
                    291:    The TREE_PURPOSE field is the list of variables defined
                    292:    the the label's scope defined at the point of use.
                    293:    The TREE_VALUE field is the LABEL_DECL used.
                    294:    The TREE_TYPE field holds `current_binding_level' at the
                    295:    point of the label's use.
                    296: 
                    297:    Used only for jumps to as-yet undefined labels, since
                    298:    jumps to defined labels can have their validity checked
                    299:    by stmt.c.  */
                    300: 
                    301: static tree named_label_uses;
                    302: 
                    303: /* A list of objects which have constructors or destructors
                    304:    which reside in the global scope.  The decl is stored in
                    305:    the TREE_VALUE slot and the initializer is stored
                    306:    in the TREE_PURPOSE slot.  */
                    307: tree static_aggregates;
                    308: 
                    309: /* A list of functions which were declared inline, but later had their
                    310:    address taken.  Used only for non-virtual member functions, since we can
                    311:    find other functions easily enough.  */
                    312: tree pending_addressable_inlines;
                    313: 
                    314: /* A list of overloaded functions which we should forget ever
                    315:    existed, such as functions declared in a function's scope,
                    316:    once we leave that function's scope.  */
                    317: static tree overloads_to_forget;
                    318: 
                    319: /* -- end of C++ */
                    320: 
                    321: /* Two expressions that are constants with value zero.
                    322:    The first is of type `int', the second of type `void *'.  */
                    323: 
                    324: tree integer_zero_node;
                    325: tree null_pointer_node;
                    326: 
                    327: /* A node for the integer constants 1, 2, and 3.  */
                    328: 
                    329: tree integer_one_node, integer_two_node, integer_three_node;
                    330: 
                    331: /* Nonzero if we have seen an invalid cross reference
                    332:    to a struct, union, or enum, but not yet printed the message.  */
                    333: 
                    334: tree pending_invalid_xref;
                    335: /* File and line to appear in the eventual error message.  */
                    336: char *pending_invalid_xref_file;
                    337: int pending_invalid_xref_line;
                    338: 
                    339: /* While defining an enum type, this is 1 plus the last enumerator
                    340:    constant value.  */
                    341: 
                    342: static tree enum_next_value;
                    343: 
                    344: /* Parsing a function declarator leaves a list of parameter names
                    345:    or a chain or parameter decls here.  */
                    346: 
                    347: tree last_function_parms;
                    348: 
                    349: /* Parsing a function declarator leaves here a chain of structure
                    350:    and enum types declared in the parmlist.  */
                    351: 
                    352: static tree last_function_parm_tags;
                    353: 
                    354: /* After parsing the declarator that starts a function definition,
                    355:    `start_function' puts here the list of parameter names or chain of decls.
                    356:    `store_parm_decls' finds it here.  */
                    357: 
                    358: static tree current_function_parms;
                    359: 
                    360: /* Similar, for last_function_parm_tags.  */
                    361: static tree current_function_parm_tags;
                    362: 
                    363: /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
                    364:    that have names.  Here so we can clear out their names' definitions
                    365:    at the end of the function.  */
                    366: 
                    367: static tree named_labels;
                    368: 
                    369: /* A list of LABEL_DECLs from outer contexts that are currently shadowed.  */
                    370: 
                    371: static tree shadowed_labels;
                    372: 
1.1.1.4   root      373: #if 0 /* Not needed by C++ */
1.1       root      374: /* Nonzero when store_parm_decls is called indicates a varargs function.
                    375:    Value not meaningful after store_parm_decls.  */
                    376: 
                    377: static int c_function_varargs;
1.1.1.4   root      378: #endif
1.1       root      379: 
                    380: /* The FUNCTION_DECL for the function currently being compiled,
                    381:    or 0 if between functions.  */
                    382: tree current_function_decl;
                    383: 
                    384: /* Set to 0 at beginning of a function definition, set to 1 if
                    385:    a return statement that specifies a return value is seen.  */
                    386: 
                    387: int current_function_returns_value;
                    388: 
                    389: /* Set to 0 at beginning of a function definition, set to 1 if
                    390:    a return statement with no argument is seen.  */
                    391: 
                    392: int current_function_returns_null;
                    393: 
                    394: /* Set to 0 at beginning of a function definition, and whenever
                    395:    a label (case or named) is defined.  Set to value of expression
                    396:    returned from function when that value can be transformed into
                    397:    a named return value.  */
                    398: 
                    399: tree current_function_return_value;
                    400: 
1.1.1.4   root      401: /* Nonzero means warn about multiple (redundant) decls for the same single
                    402:    variable or function.  */
                    403: 
                    404: extern int warn_redundant_decls;
                    405: 
1.1       root      406: /* Set to nonzero by `grokdeclarator' for a function
                    407:    whose return type is defaulted, if warnings for this are desired.  */
                    408: 
                    409: static int warn_about_return_type;
                    410: 
1.1.1.2   root      411: /* Nonzero when starting a function declared `extern inline'.  */
1.1       root      412: 
                    413: static int current_extern_inline;
                    414: 
                    415: /* Nonzero means give `double' the same size as `float'.  */
                    416: 
                    417: extern int flag_short_double;
                    418: 
1.1.1.5 ! root      419: /* Nonzero means don't recognize any builtin functions.  */
        !           420: 
        !           421: extern int flag_no_builtin;
        !           422: 
        !           423: /* Nonzero means do emit exported implementations of functions even if
        !           424:    they can be inlined.  */
        !           425: 
        !           426: extern int flag_implement_inlines;
        !           427: 
1.1.1.4   root      428: /* Nonzero means handle things in ANSI, instead of GNU fashion.  This
                    429:    flag should be tested for language behavior that's different between
                    430:    ANSI and GNU, but not so horrible as to merit a PEDANTIC label.  */
                    431: 
                    432: extern int flag_ansi;
                    433: 
1.1       root      434: /* Pointers to the base and current top of the language name stack.  */
                    435: 
                    436: extern tree *current_lang_base, *current_lang_stack;
                    437: 
                    438: /* C and C++ flags are in cp-decl2.c.  */
                    439: 
                    440: /* Set to 0 at beginning of a constructor, set to 1
                    441:    if that function does an allocation before referencing its
                    442:    instance variable.  */
                    443: int current_function_assigns_this;
                    444: int current_function_just_assigned_this;
                    445: 
                    446: /* Set to 0 at beginning of a function.  Set non-zero when
                    447:    store_parm_decls is called.  Don't call store_parm_decls
                    448:    if this flag is non-zero!  */
                    449: int current_function_parms_stored;
                    450: 
                    451: /* Current end of entries in the gc obstack for stack pointer variables.  */
                    452: 
                    453: int current_function_obstack_index;
                    454: 
                    455: /* Flag saying whether we have used the obstack in this function or not.  */
                    456: 
                    457: int current_function_obstack_usage;
1.1.1.4   root      458: 
                    459: /* Flag used when debugging cp-spew.c */
                    460: 
                    461: extern int spew_debug;
1.1       root      462: 
                    463: /* Allocate a level of searching.  */
                    464: struct stack_level *
                    465: push_decl_level (stack, obstack)
                    466:      struct stack_level *stack;
                    467:      struct obstack *obstack;
                    468: {
                    469:   struct stack_level tem;
                    470:   tem.prev = stack;
                    471: 
1.1.1.5 ! root      472:   return push_stack_level (obstack, (char *)&tem, sizeof (tem));
1.1       root      473: }
                    474: 
                    475: /* Discard a level of decl allocation.  */
                    476: 
                    477: static struct stack_level *
                    478: pop_decl_level (stack)
                    479:      struct stack_level *stack;
                    480: {
                    481:   tree *bp, *tp;
                    482:   struct obstack *obstack = stack->obstack;
                    483:   bp = stack->first;
                    484:   tp = (tree *)obstack_next_free (obstack);
                    485:   while (tp != bp)
                    486:     {
                    487:       --tp;
                    488:       if (*tp != NULL_TREE)
                    489:        IDENTIFIER_CLASS_VALUE (DECL_NAME (*tp)) = NULL_TREE;
                    490:     }
                    491:   return pop_stack_level (stack);
                    492: }
                    493: 
                    494: /* For each binding contour we allocate a binding_level structure
                    495:  * which records the names defined in that contour.
                    496:  * Contours include:
                    497:  *  0) the global one
                    498:  *  1) one for each function definition,
                    499:  *     where internal declarations of the parameters appear.
                    500:  *  2) one for each compound statement,
                    501:  *     to record its declarations.
                    502:  *
                    503:  * The current meaning of a name can be found by searching the levels from
                    504:  * the current one out to the global one.
                    505:  *
                    506:  * Off to the side, may be the class_binding_level.  This exists
                    507:  * only to catch class-local declarations.  It is otherwise
                    508:  * nonexistent.
                    509:  * 
                    510:  * Also there may be binding levels that catch cleanups that
                    511:  * must be run when exceptions occur.
                    512:  */
                    513: 
                    514: /* Note that the information in the `names' component of the global contour
                    515:    is duplicated in the IDENTIFIER_GLOBAL_VALUEs of all identifiers.  */
                    516: 
                    517: struct binding_level
                    518:   {
                    519:     /* A chain of _DECL nodes for all variables, constants, functions,
                    520:      * and typedef types.  These are in the reverse of the order supplied.
                    521:      */
                    522:     tree names;
                    523: 
                    524:     /* A list of structure, union and enum definitions,
                    525:      * for looking up tag names.
                    526:      * It is a chain of TREE_LIST nodes, each of whose TREE_PURPOSE is a name,
                    527:      * or NULL_TREE; and whose TREE_VALUE is a RECORD_TYPE, UNION_TYPE,
                    528:      * or ENUMERAL_TYPE node.
                    529:      *
                    530:      * C++: the TREE_VALUE nodes can be simple types for component_bindings.
                    531:      *
                    532:      */
                    533:     tree tags;
                    534: 
                    535:     /* For each level, a list of shadowed outer-level local definitions
                    536:        to be restored when this level is popped.
                    537:        Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and
                    538:        whose TREE_VALUE is its old definition (a kind of ..._DECL node).  */
                    539:     tree shadowed;
                    540: 
                    541:     /* Same, for IDENTIFIER_CLASS_VALUE.  */
                    542:     tree class_shadowed;
                    543: 
                    544:     /* Same, for IDENTIFIER_TYPE_VALUE.  */
                    545:     tree type_shadowed;
                    546: 
                    547:     /* For each level (except not the global one),
                    548:        a chain of BLOCK nodes for all the levels
                    549:        that were entered and exited one level down.  */
                    550:     tree blocks;
                    551: 
1.1.1.4   root      552:     /* The BLOCK node for this level, if one has been preallocated.
                    553:        If 0, the BLOCK is allocated (if needed) when the level is popped.  */
                    554:     tree this_block;
                    555: 
1.1       root      556:     /* The binding level which this one is contained in (inherits from).  */
                    557:     struct binding_level *level_chain;
                    558: 
                    559:     /* Number of decls in `names' that have incomplete 
                    560:        structure or union types.  */
                    561:     unsigned short n_incomplete;
                    562: 
                    563:     /* 1 for the level that holds the parameters of a function.
                    564:        2 for the level that holds a class declaration.
                    565:        3 for levels that hold parameter declarations.  */
                    566:     unsigned parm_flag : 4;
                    567: 
                    568:     /* 1 means make a BLOCK for this level regardless of all else.
                    569:        2 for temporary binding contours created by the compiler.  */
                    570:     unsigned keep : 3;
                    571: 
                    572:     /* Nonzero if this level "doesn't exist" for tags.  */
                    573:     unsigned tag_transparent : 1;
                    574: 
                    575:     /* Nonzero if this level can safely have additional
                    576:        cleanup-needing variables added to it.  */
                    577:     unsigned more_cleanups_ok : 1;
                    578:     unsigned have_cleanups : 1;
                    579: 
                    580:     /* Nonzero if this level can safely have additional
                    581:        exception-raising statements added to it.  */
                    582:     unsigned more_exceptions_ok : 1;
                    583:     unsigned have_exceptions : 1;
                    584: 
                    585:     /* Nonzero if we should accept any name as an identifier in
                    586:        this scope.  This happens in some template definitions.  */
                    587:     unsigned accept_any : 1;
                    588: 
1.1.1.4   root      589:     /* Nonzero if this level is for completing a template class definition
                    590:        inside a binding level that temporarily binds the parameters.  This
                    591:        means that definitions here should not be popped off when unwinding
                    592:        this binding level.  (Not actually implemented this way,
                    593:        unfortunately.)  */
                    594:     unsigned pseudo_global : 1;
                    595: 
                    596:     /* Two bits left for this word.  */
1.1       root      597: 
1.1.1.3   root      598: #if PARANOID
1.1       root      599:     unsigned char depth;
                    600: #endif
                    601:   };
                    602: 
                    603: #define NULL_BINDING_LEVEL (struct binding_level *) NULL
                    604:   
                    605: /* The binding level currently in effect.  */
                    606: 
                    607: static struct binding_level *current_binding_level;
                    608: 
                    609: /* The binding level of the current class, if any.  */
                    610: 
                    611: static struct binding_level *class_binding_level;
                    612: 
                    613: /* A chain of binding_level structures awaiting reuse.  */
                    614: 
                    615: static struct binding_level *free_binding_level;
                    616: 
                    617: /* The outermost binding level, for names of file scope.
                    618:    This is created when the compiler is started and exists
                    619:    through the entire run.  */
                    620: 
                    621: static struct binding_level *global_binding_level;
                    622: 
                    623: /* Binding level structures are initialized by copying this one.  */
                    624: 
                    625: static struct binding_level clear_binding_level;
                    626: 
                    627: /* Nonzero means unconditionally make a BLOCK for the next level pushed.  */
                    628: 
                    629: static int keep_next_level_flag;
                    630: 
                    631: #if PARANOID
1.1.1.3   root      632: /* Perform sanity checking on binding levels.  Normally not needed.  */
                    633: void
                    634: binding_levels_sane ()
1.1       root      635: {
                    636:   struct binding_level *b = current_binding_level;
                    637:   static int n;
                    638:   if (++n < 3)
1.1.1.4   root      639:     return;
                    640:   my_friendly_assert (global_binding_level != 0, 126);
                    641:   my_friendly_assert (current_binding_level != 0, 127);
1.1       root      642:   for (b = current_binding_level; b != global_binding_level; b = b->level_chain)
                    643:     {
1.1.1.4   root      644:       my_friendly_assert (b->level_chain != 0, 128);
                    645:       my_friendly_assert (b->depth == 1 + b->level_chain->depth, 129);
1.1       root      646:     }
                    647:   if (class_binding_level)
                    648:     for (b = class_binding_level;
                    649:          b != global_binding_level && b != current_binding_level;
                    650:          b = b->level_chain)
                    651:     {
1.1.1.4   root      652:       my_friendly_assert (b->level_chain != 0, 130);
                    653:       my_friendly_assert (b->depth == 1 + b->level_chain->depth, 131);
1.1       root      654:     }
1.1.1.4   root      655:   my_friendly_assert (global_binding_level->depth == 0, 132);
                    656:   my_friendly_assert (global_binding_level->level_chain == 0, 133);
                    657:   return;
1.1       root      658: }
                    659: 
                    660: #else
1.1.1.3   root      661: #define binding_levels_sane() ((void)(1))
1.1       root      662: #endif
                    663: 
                    664: #ifdef DEBUG_CP_BINDING_LEVELS
                    665: int debug_bindings_indentation;
                    666: #endif
                    667: 
                    668: static void
                    669: #if !PARANOID && defined (__GNUC__)
                    670: __inline
                    671: #endif
                    672: push_binding_level (newlevel, tag_transparent, keep)
                    673:      struct binding_level *newlevel;
1.1.1.4   root      674:      int tag_transparent, keep;
1.1       root      675: {
1.1.1.3   root      676:   binding_levels_sane();
1.1       root      677:   /* Add this level to the front of the chain (stack) of levels that
                    678:      are active.  */
                    679: #ifdef DEBUG_CP_BINDING_LEVELS
                    680:   indent_to (stderr, debug_bindings_indentation);
1.1.1.4   root      681:   fprintf (stderr, "pushing binding level ");
                    682:   fprintf (stderr, HOST_PTR_PRINTF, newlevel);
                    683:   fprintf (stderr, "\n");
1.1       root      684: #endif
                    685:   *newlevel = clear_binding_level;
                    686:   if (class_binding_level)
                    687:     {
                    688:       newlevel->level_chain = class_binding_level;
1.1.1.5 ! root      689:       class_binding_level = (struct binding_level *)0;
1.1       root      690:     }
                    691:   else
                    692:     {
                    693:       newlevel->level_chain = current_binding_level;
                    694:     }
                    695:   current_binding_level = newlevel;
                    696:   newlevel->tag_transparent = tag_transparent;
                    697:   newlevel->more_cleanups_ok = 1;
                    698:   newlevel->more_exceptions_ok = 1;
                    699:   newlevel->keep = keep;
1.1.1.3   root      700: #if PARANOID
1.1       root      701:   newlevel->depth = (newlevel->level_chain
                    702:                     ? newlevel->level_chain->depth + 1
                    703:                     : 0);
                    704: #endif
1.1.1.3   root      705:   binding_levels_sane();
1.1       root      706: }
                    707: 
                    708: static void
                    709: #if !PARANOID && defined (__GNUC__)
                    710: __inline
                    711: #endif
                    712: pop_binding_level ()
                    713: {
1.1.1.3   root      714:   binding_levels_sane();
1.1       root      715: #ifdef DEBUG_CP_BINDING_LEVELS
                    716:   indent_to (stderr, debug_bindings_indentation);
1.1.1.4   root      717:   fprintf (stderr, "popping binding level ");
                    718:   fprintf (stderr, HOST_PTR_PRINTF, current_binding_level);
                    719:   fprintf (stderr, "\n");
1.1       root      720: #endif
                    721:   if (global_binding_level)
1.1.1.4   root      722:     {
                    723:       /* cannot pop a level, if there are none left to pop. */
                    724:       if (current_binding_level == global_binding_level)
                    725:        my_friendly_abort (123);
                    726:     }
1.1       root      727:   /* Pop the current level, and free the structure for reuse.  */
                    728:   {
                    729:     register struct binding_level *level = current_binding_level;
                    730:     current_binding_level = current_binding_level->level_chain;
                    731:     level->level_chain = free_binding_level;
                    732: #ifdef DEBUG_CP_BINDING_LEVELS
                    733:     memset (level, 0x69, sizeof (*level));
                    734: #else
                    735:     free_binding_level = level;
1.1.1.3   root      736: #if PARANOID
                    737:     level->depth = ~0; /* ~0 assumes that the depth is unsigned. */
1.1       root      738: #endif
                    739: #endif
                    740:     if (current_binding_level->parm_flag == 2)
                    741:       {
                    742:        class_binding_level = current_binding_level;
                    743:        do
                    744:          {
                    745:            current_binding_level = current_binding_level->level_chain;
                    746:          }
                    747:        while (current_binding_level->parm_flag == 2);
                    748:       }
                    749:   }
1.1.1.3   root      750:   binding_levels_sane();
1.1       root      751: }
                    752: 
                    753: /* Nonzero if we are currently in the global binding level.  */
                    754: 
                    755: int
                    756: global_bindings_p ()
                    757: {
                    758:   return current_binding_level == global_binding_level;
                    759: }
                    760: 
                    761: void
                    762: keep_next_level ()
                    763: {
                    764:   keep_next_level_flag = 1;
                    765: }
                    766: 
                    767: /* Nonzero if the current level needs to have a BLOCK made.  */
                    768: 
                    769: int
                    770: kept_level_p ()
                    771: {
1.1.1.5 ! root      772:   return (current_binding_level->blocks != NULL_TREE
1.1.1.4   root      773:          || current_binding_level->keep
1.1.1.5 ! root      774:          || current_binding_level->names != NULL_TREE
        !           775:          || (current_binding_level->tags != NULL_TREE
1.1.1.4   root      776:              && !current_binding_level->tag_transparent));
1.1       root      777: }
                    778: 
                    779: /* Identify this binding level as a level of parameters.  */
                    780: 
                    781: void
                    782: declare_parm_level ()
                    783: {
                    784:   current_binding_level->parm_flag = 1;
                    785: }
                    786: 
                    787: /* Identify this binding level as a level of a default exception handler.  */
                    788: 
                    789: void
                    790: declare_implicit_exception ()
                    791: {
                    792:   current_binding_level->parm_flag = 3;
                    793: }
                    794: 
                    795: /* Nonzero if current binding contour contains expressions
                    796:    that might raise exceptions.  */
                    797: 
                    798: int
                    799: have_exceptions_p ()
                    800: {
                    801:   return current_binding_level->have_exceptions;
                    802: }
                    803: 
                    804: void
                    805: declare_uninstantiated_type_level ()
                    806: {
                    807:   current_binding_level->accept_any = 1;
                    808: }
                    809: 
                    810: int
                    811: uninstantiated_type_level_p ()
                    812: {
                    813:   return current_binding_level->accept_any;
                    814: }
                    815: 
1.1.1.4   root      816: void
                    817: declare_pseudo_global_level ()
                    818: {
                    819:   current_binding_level->pseudo_global = 1;
                    820: }
                    821: 
                    822: int
                    823: pseudo_global_level_p ()
                    824: {
                    825:   return current_binding_level->pseudo_global;
                    826: }
                    827: 
1.1       root      828: /* Enter a new binding level.
                    829:    If TAG_TRANSPARENT is nonzero, do so only for the name space of variables,
                    830:    not for that of tags.  */
                    831: 
                    832: void
                    833: pushlevel (tag_transparent)
                    834:      int tag_transparent;
                    835: {
                    836:   register struct binding_level *newlevel = NULL_BINDING_LEVEL;
                    837: 
                    838: #ifdef DEBUG_CP_BINDING_LEVELS
                    839:   indent_to (stderr, debug_bindings_indentation);
                    840:   fprintf (stderr, "pushlevel");
                    841:   debug_bindings_indentation += 4;
                    842: #endif
                    843: 
                    844:   /* If this is the top level of a function,
                    845:      just make sure that NAMED_LABELS is 0.
                    846:      They should have been set to 0 at the end of the previous function.  */
                    847: 
                    848:   if (current_binding_level == global_binding_level)
1.1.1.4   root      849:     my_friendly_assert (named_labels == NULL_TREE, 134);
1.1       root      850: 
                    851:   /* Reuse or create a struct for this binding level.  */
                    852: 
                    853:   if (free_binding_level)
                    854:     {
                    855:       newlevel = free_binding_level;
                    856:       free_binding_level = free_binding_level->level_chain;
                    857:     }
                    858:   else
                    859:     {
                    860:       /* Create a new `struct binding_level'.  */
                    861:       newlevel = (struct binding_level *) xmalloc (sizeof (struct binding_level));
                    862:     }
                    863:   push_binding_level (newlevel, tag_transparent, keep_next_level_flag);
1.1.1.5 ! root      864:   GNU_xref_start_scope ((int) newlevel);
1.1       root      865:   keep_next_level_flag = 0;
                    866: 
                    867: #ifdef DEBUG_CP_BINDING_LEVELS
                    868:   debug_bindings_indentation -= 4;
                    869: #endif
                    870: }
                    871: 
                    872: void
                    873: pushlevel_temporary (tag_transparent)
                    874:      int tag_transparent;
                    875: {
                    876:   pushlevel (tag_transparent);
                    877:   current_binding_level->keep = 2;
                    878:   clear_last_expr ();
1.1.1.4   root      879: 
                    880:   /* Note we don't call push_momentary() here.  Otherwise, it would cause
                    881:      cleanups to be allocated on the momentary obstack, and they will be
                    882:      overwritten by the next statement.  */
                    883: 
1.1       root      884:   expand_start_bindings (0);
                    885: }
                    886: 
                    887: /* Exit a binding level.
                    888:    Pop the level off, and restore the state of the identifier-decl mappings
                    889:    that were in effect when this level was entered.
                    890: 
                    891:    If KEEP == 1, this level had explicit declarations, so
                    892:    and create a "block" (a BLOCK node) for the level
                    893:    to record its declarations and subblocks for symbol table output.
                    894: 
                    895:    If KEEP == 2, this level's subblocks go to the front,
                    896:    not the back of the current binding level.  This happens,
                    897:    for instance, when code for constructors and destructors
                    898:    need to generate code at the end of a function which must
                    899:    be moved up to the front of the function.
                    900: 
                    901:    If FUNCTIONBODY is nonzero, this level is the body of a function,
                    902:    so create a block as if KEEP were set and also clear out all
                    903:    label names.
                    904: 
                    905:    If REVERSE is nonzero, reverse the order of decls before putting
                    906:    them into the BLOCK.  */
                    907: 
                    908: tree
                    909: poplevel (keep, reverse, functionbody)
                    910:      int keep;
                    911:      int reverse;
                    912:      int functionbody;
                    913: {
                    914:   register tree link;
                    915:   /* The chain of decls was accumulated in reverse order.
                    916:      Put it into forward order, just for cleanliness.  */
                    917:   tree decls;
                    918:   int tmp = functionbody;
                    919:   int implicit_try_block = current_binding_level->parm_flag == 3;
                    920:   int real_functionbody = current_binding_level->keep == 2
                    921:     ? ((functionbody = 0), tmp) : functionbody;
                    922:   tree tags = functionbody >= 0 ? current_binding_level->tags : 0;
                    923:   tree subblocks = functionbody >= 0 ? current_binding_level->blocks : 0;
1.1.1.5 ! root      924:   tree block = NULL_TREE;
1.1       root      925:   tree decl;
1.1.1.4   root      926:   int block_previously_created;
1.1       root      927: 
                    928: #ifdef DEBUG_CP_BINDING_LEVELS
                    929:   indent_to (stderr, debug_bindings_indentation);
                    930:   fprintf (stderr, "poplevel");
                    931:   debug_bindings_indentation += 4;
                    932: #endif
                    933: 
1.1.1.3   root      934:   binding_levels_sane();
1.1.1.5 ! root      935:   GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level,
        !           936:                      (HOST_WIDE_INT) current_binding_level->level_chain,
1.1       root      937:                      current_binding_level->parm_flag,
                    938:                      current_binding_level->keep,
                    939:                      current_binding_level->tag_transparent);
                    940: 
                    941:   if (current_binding_level->keep == 1)
                    942:     keep = 1;
                    943: 
                    944:   /* This warning is turned off because it causes warnings for
                    945:      declarations like `extern struct foo *x'.  */
                    946: #if 0
                    947:   /* Warn about incomplete structure types in this level.  */
                    948:   for (link = tags; link; link = TREE_CHAIN (link))
1.1.1.5 ! root      949:     if (TYPE_SIZE (TREE_VALUE (link)) == NULL_TREE)
1.1       root      950:       {
                    951:        tree type = TREE_VALUE (link);
                    952:        char *errmsg;
                    953:        switch (TREE_CODE (type))
                    954:          {
                    955:          case RECORD_TYPE:
                    956:            errmsg = "`struct %s' incomplete in scope ending here";
                    957:            break;
                    958:          case UNION_TYPE:
                    959:            errmsg = "`union %s' incomplete in scope ending here";
                    960:            break;
                    961:          case ENUMERAL_TYPE:
                    962:            errmsg = "`enum %s' incomplete in scope ending here";
                    963:            break;
                    964:          }
                    965:        if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
                    966:          error (errmsg, IDENTIFIER_POINTER (TYPE_NAME (type)));
                    967:        else
                    968:          /* If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL.  */
                    969:          error (errmsg, TYPE_NAME_STRING (type));
                    970:       }
                    971: #endif /* 0 */
                    972: 
                    973:   /* Get the decls in the order they were written.
                    974:      Usually current_binding_level->names is in reverse order.
                    975:      But parameter decls were previously put in forward order.  */
                    976: 
                    977:   if (reverse)
                    978:     current_binding_level->names
                    979:       = decls = nreverse (current_binding_level->names);
                    980:   else
                    981:     decls = current_binding_level->names;
                    982: 
                    983:   /* Output any nested inline functions within this block
                    984:      if they weren't already output.  */
                    985: 
                    986:   for (decl = decls; decl; decl = TREE_CHAIN (decl))
                    987:     if (TREE_CODE (decl) == FUNCTION_DECL
                    988:        && ! TREE_ASM_WRITTEN (decl)
1.1.1.5 ! root      989:        && DECL_INITIAL (decl) != NULL_TREE
1.1       root      990:        && TREE_ADDRESSABLE (decl))
1.1.1.5 ! root      991:       {
        !           992:        /* If this decl was copied from a file-scope decl
        !           993:           on account of a block-scope extern decl,
        !           994:           propagate TREE_ADDRESSABLE to the file-scope decl.  */
        !           995:        if (DECL_ABSTRACT_ORIGIN (decl) != NULL_TREE)
        !           996:          TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
        !           997:        else
        !           998:          output_inline_function (decl);
        !           999:       }
1.1       root     1000: 
                   1001:   /* If there were any declarations or structure tags in that level,
                   1002:      or if this level is a function body,
                   1003:      create a BLOCK to record them for the life of this function.  */
                   1004: 
1.1.1.5 ! root     1005:   block = NULL_TREE;
        !          1006:   block_previously_created = (current_binding_level->this_block != NULL_TREE);
1.1.1.4   root     1007:   if (block_previously_created)
                   1008:     block = current_binding_level->this_block;
                   1009:   else if (keep == 1 || functionbody)
                   1010:     block = make_node (BLOCK);
1.1.1.5 ! root     1011:   if (block != NULL_TREE)
1.1.1.4   root     1012:     {
                   1013:       BLOCK_VARS (block) = decls;
                   1014:       BLOCK_TYPE_TAGS (block) = tags;
                   1015:       BLOCK_SUBBLOCKS (block) = subblocks;
                   1016:       remember_end_note (block);
                   1017:     }
1.1       root     1018: 
                   1019:   /* In each subblock, record that this is its superior.  */
                   1020: 
                   1021:   if (keep >= 0)
                   1022:     for (link = subblocks; link; link = TREE_CHAIN (link))
                   1023:       BLOCK_SUPERCONTEXT (link) = block;
                   1024: 
                   1025:   /* Clear out the meanings of the local variables of this level.  */
                   1026: 
                   1027:   for (link = decls; link; link = TREE_CHAIN (link))
                   1028:     {
1.1.1.5 ! root     1029:       if (DECL_NAME (link) != NULL_TREE)
1.1       root     1030:        {
                   1031:          /* If the ident. was used or addressed via a local extern decl,
                   1032:             don't forget that fact.  */
1.1.1.4   root     1033:          if (DECL_EXTERNAL (link))
1.1       root     1034:            {
                   1035:              if (TREE_USED (link))
                   1036:                TREE_USED (DECL_ASSEMBLER_NAME (link)) = 1;
                   1037:              if (TREE_ADDRESSABLE (link))
                   1038:                TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
                   1039:            }
1.1.1.5 ! root     1040:          IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = NULL_TREE;
1.1       root     1041:        }
                   1042:     }
                   1043: 
                   1044:   /* Restore all name-meanings of the outer levels
                   1045:      that were shadowed by this level.  */
                   1046: 
                   1047:   for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
                   1048:     IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
                   1049:   for (link = current_binding_level->class_shadowed;
                   1050:        link; link = TREE_CHAIN (link))
                   1051:     IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
                   1052:   for (link = current_binding_level->type_shadowed;
                   1053:        link; link = TREE_CHAIN (link))
                   1054:     IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
                   1055: 
                   1056:   /* If the level being exited is the top level of a function,
                   1057:      check over all the labels.  */
                   1058: 
                   1059:   if (functionbody)
                   1060:     {
1.1.1.4   root     1061:       /* If this is the top level block of a function,
                   1062:          the vars are the function's parameters.
                   1063:          Don't leave them in the BLOCK because they are
                   1064:          found in the FUNCTION_DECL instead.  */
                   1065: 
                   1066:       BLOCK_VARS (block) = 0;
                   1067: 
1.1       root     1068:       /* Clear out the definitions of all label names,
                   1069:         since their scopes end here.  */
                   1070: 
                   1071:       for (link = named_labels; link; link = TREE_CHAIN (link))
                   1072:        {
1.1.1.4   root     1073:          register tree label = TREE_VALUE (link);
                   1074: 
1.1.1.5 ! root     1075:          if (DECL_INITIAL (label) == NULL_TREE)
1.1       root     1076:            {
1.1.1.4   root     1077:              error_with_decl (label, "label `%s' used but not defined");
1.1       root     1078:              /* Avoid crashing later.  */
1.1.1.4   root     1079:              define_label (input_filename, 1, DECL_NAME (label));
1.1       root     1080:            }
1.1.1.4   root     1081:          else if (warn_unused && !TREE_USED (label))
                   1082:            warning_with_decl (label, 
1.1       root     1083:                               "label `%s' defined but not used");
1.1.1.4   root     1084:          SET_IDENTIFIER_LABEL_VALUE (DECL_NAME (label), 0);
                   1085: 
                   1086:           /* Put the labels into the "variables" of the
                   1087:              top-level block, so debugger can see them.  */
                   1088:           TREE_CHAIN (label) = BLOCK_VARS (block);
                   1089:           BLOCK_VARS (block) = label;
1.1       root     1090:        }
                   1091: 
1.1.1.5 ! root     1092:       named_labels = NULL_TREE;
1.1       root     1093:     }
                   1094: 
                   1095:   /* Any uses of undefined labels now operate under constraints
                   1096:      of next binding contour.  */
                   1097:   {
                   1098:     struct binding_level *level_chain;
                   1099:     level_chain = current_binding_level->level_chain;
                   1100:     if (level_chain)
                   1101:       {
                   1102:        tree labels;
                   1103:        for (labels = named_label_uses; labels; labels = TREE_CHAIN (labels))
                   1104:          if (TREE_TYPE (labels) == (tree)current_binding_level)
                   1105:            {
                   1106:              TREE_TYPE (labels) = (tree)level_chain;
                   1107:              TREE_PURPOSE (labels) = level_chain->names;
                   1108:            }
                   1109:       }
                   1110:   }
                   1111: 
                   1112:   tmp = current_binding_level->keep;
                   1113: 
                   1114:   pop_binding_level ();
1.1.1.4   root     1115:   if (functionbody)
                   1116:     DECL_INITIAL (current_function_decl) = block;
                   1117:   else if (block)
1.1       root     1118:     {
1.1.1.4   root     1119:       if (!block_previously_created)
                   1120:         current_binding_level->blocks
                   1121:           = chainon (current_binding_level->blocks, block);
1.1       root     1122:     }
1.1.1.5 ! root     1123: 
1.1       root     1124:   /* If we did not make a block for the level just exited,
                   1125:      any blocks made for inner levels
                   1126:      (since they cannot be recorded as subblocks in that level)
                   1127:      must be carried forward so they will later become subblocks
                   1128:      of something else.  */
                   1129:   else if (subblocks)
                   1130:     if (keep == 2)
                   1131:       current_binding_level->blocks = chainon (subblocks, current_binding_level->blocks);
                   1132:     else
                   1133:       current_binding_level->blocks
                   1134:         = chainon (current_binding_level->blocks, subblocks);
                   1135: 
                   1136:   /* Take care of compiler's internal binding structures.  */
                   1137:   if (tmp == 2 && !implicit_try_block)
                   1138:     {
                   1139: #if 0
                   1140:       /* We did not call push_momentary for this
                   1141:         binding contour, so there is nothing to pop.  */
                   1142:       pop_momentary ();
                   1143: #endif
                   1144:       expand_end_bindings (getdecls (), keep, 1);
                   1145:       block = poplevel (keep, reverse, real_functionbody);
                   1146:     }
                   1147:   if (block)
                   1148:     TREE_USED (block) = 1;
1.1.1.3   root     1149:   binding_levels_sane();
1.1       root     1150: #ifdef DEBUG_CP_BINDING_LEVELS
                   1151:   debug_bindings_indentation -= 4;
                   1152: #endif
                   1153:   return block;
                   1154: }
                   1155: 
1.1.1.4   root     1156: /* Delete the node BLOCK from the current binding level.
                   1157:    This is used for the block inside a stmt expr ({...})
                   1158:    so that the block can be reinserted where appropriate.  */
                   1159: 
                   1160: void
                   1161: delete_block (block)
                   1162:      tree block;
                   1163: {
                   1164:   tree t;
                   1165:   if (current_binding_level->blocks == block)
                   1166:     current_binding_level->blocks = TREE_CHAIN (block);
                   1167:   for (t = current_binding_level->blocks; t;)
                   1168:     {
                   1169:       if (TREE_CHAIN (t) == block)
                   1170:        TREE_CHAIN (t) = TREE_CHAIN (block);
                   1171:       else
                   1172:        t = TREE_CHAIN (t);
                   1173:     }
1.1.1.5 ! root     1174:   TREE_CHAIN (block) = NULL_TREE;
1.1.1.4   root     1175:   /* Clear TREE_USED which is always set by poplevel.
                   1176:      The flag is set again if insert_block is called.  */
                   1177:   TREE_USED (block) = 0;
                   1178: }
                   1179: 
                   1180: /* Insert BLOCK at the end of the list of subblocks of the
                   1181:    current binding level.  This is used when a BIND_EXPR is expanded,
                   1182:    to handle the BLOCK node inside the BIND_EXPR.  */
                   1183: 
                   1184: void
                   1185: insert_block (block)
                   1186:      tree block;
                   1187: {
                   1188:   TREE_USED (block) = 1;
                   1189:   current_binding_level->blocks
                   1190:     = chainon (current_binding_level->blocks, block);
                   1191: }
                   1192: 
1.1       root     1193: /* Add BLOCK to the current list of blocks for this binding contour.  */
                   1194: void
                   1195: add_block_current_level (block)
                   1196:      tree block;
                   1197: {
                   1198:   current_binding_level->blocks
                   1199:     = chainon (current_binding_level->blocks, block);
                   1200: }
                   1201: 
1.1.1.4   root     1202: /* Set the BLOCK node for the innermost scope
                   1203:    (the one we are currently in).  */
                   1204: 
                   1205: void
                   1206: set_block (block)
                   1207:     register tree block;
                   1208: {
                   1209:   current_binding_level->this_block = block;
                   1210: }
                   1211: 
1.1       root     1212: /* Do a pushlevel for class declarations.  */
                   1213: void
                   1214: pushlevel_class ()
                   1215: {
1.1.1.3   root     1216:   binding_levels_sane();
1.1       root     1217: #ifdef DEBUG_CP_BINDING_LEVELS
                   1218:   indent_to (stderr, debug_bindings_indentation);
                   1219:   fprintf (stderr, "pushlevel_class");
                   1220:   debug_bindings_indentation += 4;
                   1221: #endif
                   1222:   pushlevel (0);
                   1223:   decl_stack = push_decl_level (decl_stack, &decl_obstack);
                   1224:   class_binding_level = current_binding_level;
                   1225:   class_binding_level->parm_flag = 2;
                   1226:   do
                   1227:     {
                   1228:       current_binding_level = current_binding_level->level_chain;
                   1229:     }
                   1230:   while (current_binding_level->parm_flag == 2);
1.1.1.3   root     1231:   binding_levels_sane();
1.1       root     1232: #ifdef DEBUG_CP_BINDING_LEVELS
                   1233:   debug_bindings_indentation -= 4;
                   1234: #endif
                   1235: }
                   1236: 
                   1237: /* ...and a poplevel for class declarations.  */
                   1238: tree
                   1239: poplevel_class ()
                   1240: {
                   1241:   register struct binding_level *level = class_binding_level;
1.1.1.5 ! root     1242:   tree block = NULL_TREE;
1.1       root     1243:   tree shadowed;
                   1244: 
                   1245: #ifdef DEBUG_CP_BINDING_LEVELS
                   1246:   indent_to (stderr, debug_bindings_indentation);
                   1247:   fprintf (stderr, "poplevel_class");
                   1248:   debug_bindings_indentation += 4;
                   1249: #endif
1.1.1.3   root     1250:   binding_levels_sane();
1.1.1.5 ! root     1251:   if (level == (struct binding_level *)0)
1.1       root     1252:     {
1.1.1.5 ! root     1253:       while (current_binding_level && class_binding_level == (struct binding_level *)0)
1.1       root     1254:        block = poplevel (0, 0, 0);
1.1.1.5 ! root     1255:       if (current_binding_level == (struct binding_level *)0)
1.1       root     1256:        fatal ("syntax error too serious");
                   1257:       level = class_binding_level;
                   1258:     }
                   1259:   decl_stack = pop_decl_level (decl_stack);
                   1260:   for (shadowed = level->shadowed; shadowed; shadowed = TREE_CHAIN (shadowed))
                   1261:     IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed);
                   1262:   for (shadowed = level->class_shadowed; shadowed; shadowed = TREE_CHAIN (shadowed))
                   1263:     IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed);
                   1264:   for (shadowed = level->type_shadowed; shadowed; shadowed = TREE_CHAIN (shadowed))
                   1265:     IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed);
                   1266: 
1.1.1.5 ! root     1267:   GNU_xref_end_scope ((HOST_WIDE_INT) class_binding_level,
        !          1268:                      (HOST_WIDE_INT) class_binding_level->level_chain,
1.1       root     1269:                      class_binding_level->parm_flag,
                   1270:                      class_binding_level->keep,
                   1271:                      class_binding_level->tag_transparent);
                   1272: 
                   1273:   class_binding_level = level->level_chain;
                   1274:   if (class_binding_level->parm_flag != 2)
1.1.1.5 ! root     1275:     class_binding_level = (struct binding_level *)0;
1.1       root     1276: 
                   1277: #ifdef DEBUG_CP_BINDING_LEVELS
                   1278:   indent_to (stderr, debug_bindings_indentation);
1.1.1.4   root     1279:   fprintf (stderr, "popping class binding level ");
                   1280:   fprintf (stderr, HOST_PTR_PRINTF, level);
                   1281:   fprintf (stderr, "\n");
1.1       root     1282:   memset (level, 0x69, sizeof (*level));
                   1283:   debug_bindings_indentation -= 4;
                   1284: #else
                   1285:   level->level_chain = free_binding_level;
                   1286:   free_binding_level = level;
                   1287: #endif
1.1.1.3   root     1288:   binding_levels_sane();
1.1       root     1289: 
                   1290:   return block;
                   1291: }
                   1292: 
                   1293: /* For debugging.  */
                   1294: int no_print_functions = 0;
                   1295: int no_print_builtins = 0;
                   1296: 
                   1297: void
                   1298: print_binding_level (lvl)
                   1299:      struct binding_level *lvl;
                   1300: {
                   1301:   tree t;
                   1302:   int i = 0, len;
1.1.1.4   root     1303:   fprintf (stderr, " blocks=");
                   1304:   fprintf (stderr, HOST_PTR_PRINTF, lvl->blocks);
                   1305:   fprintf (stderr, " n_incomplete=%d parm_flag=%d keep=%d",
                   1306:           lvl->n_incomplete, lvl->parm_flag, lvl->keep);
1.1       root     1307:   if (lvl->tag_transparent)
                   1308:     fprintf (stderr, " tag-transparent");
                   1309:   if (lvl->more_cleanups_ok)
                   1310:     fprintf (stderr, " more-cleanups-ok");
                   1311:   if (lvl->have_cleanups)
                   1312:     fprintf (stderr, " have-cleanups");
                   1313:   if (lvl->more_exceptions_ok)
                   1314:     fprintf (stderr, " more-exceptions-ok");
                   1315:   if (lvl->have_exceptions)
                   1316:     fprintf (stderr, " have-exceptions");
                   1317:   fprintf (stderr, "\n");
                   1318:   if (lvl->names)
                   1319:     {
                   1320:       fprintf (stderr, " names:\t");
                   1321:       /* We can probably fit 3 names to a line?  */
                   1322:       for (t = lvl->names; t; t = TREE_CHAIN (t))
                   1323:        {
                   1324:          if (no_print_functions && (TREE_CODE(t) == FUNCTION_DECL)) 
                   1325:            continue;
                   1326:          if (no_print_builtins
                   1327:              && (TREE_CODE(t) == TYPE_DECL)
                   1328:              && (!strcmp(DECL_SOURCE_FILE(t),"<built-in>")))
                   1329:            continue;
                   1330: 
                   1331:          /* Function decls tend to have longer names.  */
                   1332:          if (TREE_CODE (t) == FUNCTION_DECL)
                   1333:            len = 3;
                   1334:          else
                   1335:            len = 2;
                   1336:          i += len;
                   1337:          if (i > 6)
                   1338:            {
                   1339:              fprintf (stderr, "\n\t");
                   1340:              i = len;
                   1341:            }
                   1342:          print_node_brief (stderr, "", t, 0);
                   1343:          if (TREE_CODE (t) == ERROR_MARK)
                   1344:            break;
                   1345:        }
                   1346:       if (i)
                   1347:         fprintf (stderr, "\n");
                   1348:     }
                   1349:   if (lvl->tags)
                   1350:     {
                   1351:       fprintf (stderr, " tags:\t");
                   1352:       i = 0;
                   1353:       for (t = lvl->tags; t; t = TREE_CHAIN (t))
                   1354:        {
                   1355:          if (TREE_PURPOSE (t) == NULL_TREE)
                   1356:            len = 3;
1.1.1.3   root     1357:          else if (TREE_PURPOSE (t) == TYPE_IDENTIFIER (TREE_VALUE (t)))
1.1       root     1358:            len = 2;
                   1359:          else
                   1360:            len = 4;
                   1361:          i += len;
                   1362:          if (i > 5)
                   1363:            {
                   1364:              fprintf (stderr, "\n\t");
                   1365:              i = len;
                   1366:            }
                   1367:          if (TREE_PURPOSE (t) == NULL_TREE)
                   1368:            {
                   1369:              print_node_brief (stderr, "<unnamed-typedef", TREE_VALUE (t), 0);
                   1370:              fprintf (stderr, ">");
                   1371:            }
1.1.1.3   root     1372:          else if (TREE_PURPOSE (t) == TYPE_IDENTIFIER (TREE_VALUE (t)))
1.1       root     1373:            print_node_brief (stderr, "", TREE_VALUE (t), 0);
                   1374:          else
                   1375:            {
                   1376:              print_node_brief (stderr, "<typedef", TREE_PURPOSE (t), 0);
                   1377:              print_node_brief (stderr, "", TREE_VALUE (t), 0);
                   1378:              fprintf (stderr, ">");
                   1379:            }
                   1380:        }
                   1381:       if (i)
                   1382:        fprintf (stderr, "\n");
                   1383:     }
                   1384:   if (lvl->shadowed)
                   1385:     {
                   1386:       fprintf (stderr, " shadowed:");
                   1387:       for (t = lvl->shadowed; t; t = TREE_CHAIN (t))
                   1388:        {
                   1389:          fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t)));
                   1390:        }
                   1391:       fprintf (stderr, "\n");
                   1392:     }
                   1393:   if (lvl->class_shadowed)
                   1394:     {
                   1395:       fprintf (stderr, " class-shadowed:");
                   1396:       for (t = lvl->class_shadowed; t; t = TREE_CHAIN (t))
                   1397:        {
                   1398:          fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t)));
                   1399:        }
                   1400:       fprintf (stderr, "\n");
                   1401:     }
                   1402:   if (lvl->type_shadowed)
                   1403:     {
                   1404:       fprintf (stderr, " type-shadowed:");
                   1405:       for (t = lvl->type_shadowed; t; t = TREE_CHAIN (t))
                   1406:         {
                   1407: #if 0
                   1408:           fprintf (stderr, "\n\t");
                   1409:           print_node_brief (stderr, "<", TREE_PURPOSE (t), 0);
                   1410:           if (TREE_VALUE (t))
                   1411:             print_node_brief (stderr, " ", TREE_VALUE (t), 0);
                   1412:           else
                   1413:             fprintf (stderr, " (none)");
                   1414:           fprintf (stderr, ">");
                   1415: #else
                   1416:          fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t)));
                   1417: #endif
                   1418:         }
                   1419:       fprintf (stderr, "\n");
                   1420:     }
                   1421: }
                   1422: 
                   1423: void
                   1424: print_other_binding_stack (stack)
                   1425:      struct binding_level *stack;
                   1426: {
                   1427:   struct binding_level *level;
                   1428:   for (level = stack; level != global_binding_level; level = level->level_chain)
                   1429:     {
1.1.1.4   root     1430:       fprintf (stderr, "binding level ");
                   1431:       fprintf (stderr, HOST_PTR_PRINTF, level);
                   1432:       fprintf (stderr, "\n");
1.1       root     1433:       print_binding_level (level);
                   1434:     }
                   1435: }
                   1436: 
                   1437: void
                   1438: print_binding_stack ()
                   1439: {
                   1440:   struct binding_level *b;
1.1.1.4   root     1441:   fprintf (stderr, "current_binding_level=");
                   1442:   fprintf (stderr, HOST_PTR_PRINTF, current_binding_level);
                   1443:   fprintf (stderr, "\nclass_binding_level=");
                   1444:   fprintf (stderr, HOST_PTR_PRINTF, class_binding_level);
                   1445:   fprintf (stderr, "\nglobal_binding_level=");
                   1446:   fprintf (stderr, HOST_PTR_PRINTF, global_binding_level);
                   1447:   fprintf (stderr, "\n");
1.1       root     1448:   if (class_binding_level)
                   1449:     {
                   1450:       for (b = class_binding_level; b; b = b->level_chain)
                   1451:        if (b == current_binding_level)
                   1452:          break;
                   1453:       if (b)
                   1454:        b = class_binding_level;
                   1455:       else
                   1456:        b = current_binding_level;
                   1457:     }
                   1458:   else
                   1459:     b = current_binding_level;
                   1460:   print_other_binding_stack (b);
                   1461:   fprintf (stderr, "global:\n");
                   1462:   print_binding_level (global_binding_level);
                   1463: }
                   1464: 
                   1465: /* Subroutines for reverting temporarily to top-level for instantiation
                   1466:    of templates and such.  We actually need to clear out the class- and
                   1467:    local-value slots of all identifiers, so that only the global values
                   1468:    are at all visible.  Simply setting current_binding_level to the global
                   1469:    scope isn't enough, because more binding levels may be pushed.  */
                   1470: struct saved_scope {
                   1471:   struct binding_level *old_binding_level;
                   1472:   tree old_bindings;
                   1473:   struct saved_scope *prev;
                   1474:   tree class_name, class_type, class_decl, function_decl;
                   1475:   struct binding_level *class_bindings;
                   1476: };
                   1477: static struct saved_scope *current_saved_scope;
                   1478: extern tree prev_class_type;
                   1479: 
                   1480: void
                   1481: push_to_top_level ()
                   1482: {
                   1483:   struct saved_scope *s =
                   1484:     (struct saved_scope *) xmalloc (sizeof (struct saved_scope));
                   1485:   struct binding_level *b = current_binding_level;
                   1486:   tree old_bindings = NULL_TREE;
                   1487: 
                   1488: #ifdef DEBUG_CP_BINDING_LEVELS
                   1489:   fprintf (stderr, "PUSH_TO_TOP_LEVEL\n");
                   1490: #endif
                   1491: 
                   1492:   /* Have to include global_binding_level, because class-level decls
                   1493:      aren't listed anywhere useful.  */
                   1494:   for (; b; b = b->level_chain)
                   1495:     {
                   1496:       tree t;
                   1497:       for (t = b->names; t; t = TREE_CHAIN (t))
                   1498:        if (b != global_binding_level)
                   1499:          {
                   1500:            tree binding, t1, t2 = t;
                   1501:            tree id = DECL_ASSEMBLER_NAME (t2);
                   1502: 
                   1503:            if (!id
                   1504:                || (!IDENTIFIER_LOCAL_VALUE (id)
                   1505:                    && !IDENTIFIER_CLASS_VALUE (id)))
                   1506:              continue;
                   1507: 
                   1508:            for (t1 = old_bindings; t1; t1 = TREE_CHAIN (t1))
                   1509:              if (TREE_VEC_ELT (t1, 0) == id)
                   1510:                goto skip_it;
                   1511:            
                   1512:            binding = make_tree_vec (4);
                   1513:            if (id)
                   1514:              {
1.1.1.4   root     1515:                my_friendly_assert (TREE_CODE (id) == IDENTIFIER_NODE, 135);
1.1       root     1516:                TREE_VEC_ELT (binding, 0) = id;
                   1517:                TREE_VEC_ELT (binding, 1) = IDENTIFIER_TYPE_VALUE (id);
                   1518:                TREE_VEC_ELT (binding, 2) = IDENTIFIER_LOCAL_VALUE (id);
                   1519:                TREE_VEC_ELT (binding, 3) = IDENTIFIER_CLASS_VALUE (id);
1.1.1.5 ! root     1520:                IDENTIFIER_LOCAL_VALUE (id) = NULL_TREE;
        !          1521:                IDENTIFIER_CLASS_VALUE (id) = NULL_TREE;
1.1       root     1522:                adjust_type_value (id);
                   1523:              }
                   1524:            TREE_CHAIN (binding) = old_bindings;
                   1525:            old_bindings = binding;
                   1526:            skip_it:
                   1527:            ;
                   1528:          }
                   1529:       /* Unwind type-value slots back to top level.  */
                   1530:       if (b != global_binding_level)
                   1531:         for (t = b->type_shadowed; t; t = TREE_CHAIN (t))
                   1532:           SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (t), TREE_VALUE (t));
                   1533:     }
                   1534: 
                   1535:   s->old_binding_level = current_binding_level;
                   1536:   current_binding_level = global_binding_level;
                   1537: 
                   1538:   s->class_name = current_class_name;
                   1539:   s->class_type = current_class_type;
                   1540:   s->class_decl = current_class_decl;
                   1541:   s->function_decl = current_function_decl;
                   1542:   s->class_bindings = class_binding_level;
1.1.1.5 ! root     1543:   current_class_name = current_class_type = current_class_decl = NULL_TREE;
        !          1544:   current_function_decl = NULL_TREE;
        !          1545:   class_binding_level = (struct binding_level *)0;
1.1       root     1546: 
                   1547:   s->prev = current_saved_scope;
                   1548:   s->old_bindings = old_bindings;
                   1549:   current_saved_scope = s;
1.1.1.3   root     1550:   binding_levels_sane();
1.1       root     1551: }
                   1552: 
                   1553: void
                   1554: pop_from_top_level ()
                   1555: {
                   1556:   struct saved_scope *s = current_saved_scope;
                   1557:   tree t;
                   1558: 
                   1559: #ifdef DEBUG_CP_BINDING_LEVELS
                   1560:   fprintf (stderr, "POP_FROM_TOP_LEVEL\n");
                   1561: #endif
                   1562: 
1.1.1.3   root     1563:   binding_levels_sane();
1.1       root     1564:   current_binding_level = s->old_binding_level;
                   1565:   current_saved_scope = s->prev;
                   1566:   for (t = s->old_bindings; t; t = TREE_CHAIN (t))
                   1567:     {
                   1568:       tree id = TREE_VEC_ELT (t, 0);
                   1569:       if (id)
                   1570:        {
                   1571:          IDENTIFIER_TYPE_VALUE (id) = TREE_VEC_ELT (t, 1);
                   1572:          IDENTIFIER_LOCAL_VALUE (id) = TREE_VEC_ELT (t, 2);
                   1573:          IDENTIFIER_CLASS_VALUE (id) = TREE_VEC_ELT (t, 3);
                   1574:        }
                   1575:     }
                   1576:   current_class_name = s->class_name;
                   1577:   current_class_type = s->class_type;
1.1.1.3   root     1578:   current_class_decl = s->class_decl;
1.1.1.2   root     1579:   if (current_class_type)
                   1580:     C_C_D = CLASSTYPE_INST_VAR (current_class_type);
                   1581:   else
                   1582:     C_C_D = NULL_TREE;
1.1       root     1583:   current_function_decl = s->function_decl;
                   1584:   class_binding_level = s->class_bindings;
                   1585:   free (s);
1.1.1.3   root     1586:   binding_levels_sane();
1.1       root     1587: }
                   1588: 
                   1589: /* Push a definition of struct, union or enum tag "name".
                   1590:    "type" should be the type node.
                   1591:    We assume that the tag "name" is not already defined.
                   1592: 
                   1593:    Note that the definition may really be just a forward reference.
1.1.1.5 ! root     1594:    In that case, the TYPE_SIZE will be a NULL_TREE.
1.1       root     1595: 
                   1596:    C++ gratuitously puts all these tags in the name space. */
                   1597: 
1.1.1.2   root     1598: /* When setting the IDENTIFIER_TYPE_VALUE field of an identifier ID,
1.1       root     1599:    record the shadowed value for this binding contour.  TYPE is
                   1600:    the type that ID maps to.  */
                   1601: void
                   1602: set_identifier_type_value (id, type)
                   1603:      tree id;
                   1604:      tree type;
                   1605: {
                   1606:   if (current_binding_level != global_binding_level)
                   1607:     {
                   1608:       tree old_type_value = IDENTIFIER_TYPE_VALUE (id);
                   1609:       current_binding_level->type_shadowed
                   1610:        = tree_cons (id, old_type_value, current_binding_level->type_shadowed);
                   1611:     }
                   1612:   else if (class_binding_level)
                   1613:     {
                   1614:       tree old_type_value = IDENTIFIER_TYPE_VALUE (id);
                   1615:       class_binding_level->type_shadowed
                   1616:        = tree_cons (id, old_type_value, class_binding_level->type_shadowed);
                   1617:     }      
                   1618:   SET_IDENTIFIER_TYPE_VALUE (id, type);
                   1619: }
                   1620: 
                   1621: /*
                   1622:  * local values can need to be shadowed too, but it only happens
                   1623:  * explicitly from pushdecl, in support of nested enums.
                   1624:  */
                   1625: void
                   1626: set_identifier_local_value (id, type)
                   1627:      tree id;
                   1628:      tree type;
                   1629: {
                   1630:   if (current_binding_level != global_binding_level)
                   1631:     {
                   1632:       tree old_local_value = IDENTIFIER_LOCAL_VALUE (id);
                   1633:       current_binding_level->shadowed
                   1634:        = tree_cons (id, old_local_value, current_binding_level->shadowed);
                   1635:     }
                   1636:   else if (class_binding_level)
                   1637:     {
                   1638:       tree old_local_value = IDENTIFIER_LOCAL_VALUE (id);
                   1639:       class_binding_level->shadowed
                   1640:        = tree_cons (id, old_local_value, class_binding_level->shadowed);
                   1641:     }      
                   1642:   IDENTIFIER_LOCAL_VALUE (id) = type;
                   1643: }
                   1644: 
                   1645: /* Subroutine "set_nested_typename" builds the nested-typename of
                   1646:    the type decl in question.  (Argument CLASSNAME can actually be
                   1647:    a function as well, if that's the smallest containing scope.)  */
                   1648: 
                   1649: static void
                   1650: set_nested_typename (decl, classname, name, type)
                   1651:      tree decl, classname, name, type;
                   1652: {
1.1.1.4   root     1653:   my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 136);
1.1.1.5 ! root     1654:   if (classname != NULL_TREE)
1.1       root     1655:     {
                   1656:       char *buf;
1.1.1.4   root     1657:       my_friendly_assert (TREE_CODE (classname) == IDENTIFIER_NODE, 137);
                   1658:       my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 138);
1.1       root     1659:       buf = (char *) alloca (4 + IDENTIFIER_LENGTH (classname)
                   1660:                             + IDENTIFIER_LENGTH (name));
                   1661:       sprintf (buf, "%s::%s", IDENTIFIER_POINTER (classname),
                   1662:               IDENTIFIER_POINTER (name));
                   1663:       DECL_NESTED_TYPENAME (decl) = get_identifier (buf);
                   1664:       SET_IDENTIFIER_TYPE_VALUE (DECL_NESTED_TYPENAME (decl), type);
                   1665:     }
                   1666:   else
                   1667:     DECL_NESTED_TYPENAME (decl) = name;
                   1668: }
                   1669: 
1.1.1.2   root     1670: #if 0 /* not yet, should get fixed properly later */
                   1671: /* Create a TYPE_DECL node with the correct DECL_ASSEMBLER_NAME.
                   1672:    Other routines shouldn't use build_decl directly; they'll produce
                   1673:    incorrect results with `-g' unless they duplicate this code.
                   1674: 
                   1675:    This is currently needed mainly for dbxout.c, but we can make
                   1676:    use of it in cp-method.c later as well.  */
                   1677: tree
                   1678: make_type_decl (name, type)
                   1679:      tree name, type;
                   1680: {
                   1681:   tree decl, id;
                   1682:   decl = build_decl (TYPE_DECL, name, type);
                   1683:   if (TYPE_NAME (type) == name)
                   1684:     /* Class/union/enum definition, or a redundant typedef for same.  */
                   1685:     {
                   1686:       id = get_identifier (build_overload_name (type, 1, 1));
                   1687:       DECL_ASSEMBLER_NAME (decl) = id;
                   1688:     }
                   1689:   else if (TYPE_NAME (type) != NULL_TREE)
                   1690:     /* Explicit typedef, or implicit typedef for template expansion.  */
                   1691:     DECL_ASSEMBLER_NAME (decl) = DECL_ASSEMBLER_NAME (TYPE_NAME (type));
                   1692:   else
                   1693:     {
                   1694:       /* Typedef for unnamed struct; some other situations.
                   1695:         TYPE_NAME is null; what's right here?  */
                   1696:     }
                   1697:   return decl;
                   1698: }
                   1699: 
                   1700: #endif
1.1       root     1701: void
                   1702: pushtag (name, type)
                   1703:      tree name, type;
                   1704: {
                   1705:   register struct binding_level *b;
                   1706: 
                   1707:   if (class_binding_level)
                   1708:     b = class_binding_level;
                   1709:   else
                   1710:     {
                   1711:       b = current_binding_level;
                   1712:       while (b->tag_transparent) b = b->level_chain;
                   1713:     }
                   1714: 
1.1.1.4   root     1715:   if (b == global_binding_level)
                   1716:     b->tags = perm_tree_cons (name, type, b->tags);
                   1717:   else
                   1718:     b->tags = saveable_tree_cons (name, type, b->tags);
                   1719: 
1.1       root     1720:   if (name)
                   1721:     {
                   1722:       /* Record the identifier as the type's name if it has none.  */
                   1723: 
1.1.1.5 ! root     1724:       if (TYPE_NAME (type) == NULL_TREE)
1.1       root     1725:         TYPE_NAME (type) = name;
1.1.1.2   root     1726:       
1.1       root     1727:       /* Do C++ gratuitous typedefing.  */
                   1728:       if (IDENTIFIER_TYPE_VALUE (name) != type
                   1729:          && (TREE_CODE (type) != RECORD_TYPE
1.1.1.5 ! root     1730:              || class_binding_level == (struct binding_level *)0
1.1       root     1731:              || !CLASSTYPE_DECLARED_EXCEPTION (type)))
                   1732:         {
                   1733:           register tree d;
1.1.1.5 ! root     1734:          if (current_class_type == NULL_TREE
1.1       root     1735:              || TYPE_SIZE (current_class_type) != NULL_TREE)
                   1736:            {
                   1737:              if (current_lang_name == lang_name_cplusplus)
                   1738:                d = lookup_nested_type (type, current_class_type ? TYPE_NAME (current_class_type) : NULL_TREE);
                   1739:              else
                   1740:                d = NULL_TREE;
                   1741: 
                   1742:              if (d == NULL_TREE)
                   1743:                {
1.1.1.2   root     1744: #if 0 /* not yet, should get fixed properly later */
                   1745:                  d = make_type_decl (name, type);
                   1746:                  DECL_ASSEMBLER_NAME (d) = get_identifier (build_overload_name (type, 1, 1));
                   1747: #else
1.1       root     1748:                  d = build_decl (TYPE_DECL, name, type);
1.1.1.4   root     1749:                  DECL_ASSEMBLER_NAME (d) = get_identifier (build_overload_name (type, 1, 1));
1.1.1.2   root     1750: #endif
1.1.1.4   root     1751:                  /* mark the binding layer marker as internal. (mrs) */
                   1752:                  DECL_SOURCE_LINE (d) = 0;
1.1       root     1753:                  set_identifier_type_value (name, type);
                   1754:                }
                   1755:              else
                   1756:                d = TYPE_NAME (d);
                   1757: 
                   1758:              /* If it is anonymous, then we are called from pushdecl,
                   1759:                 and we don't want to infinitely recurse.  Also, if the
                   1760:                 name is already in scope, we don't want to push it
                   1761:                 again--pushdecl is only for pushing new decls.  */
                   1762:              if (! ANON_AGGRNAME_P (name)
1.1.1.4   root     1763:                  && TYPE_NAME (type)
1.1       root     1764:                  && (TREE_CODE (TYPE_NAME (type)) != TYPE_DECL
                   1765:                      || lookup_name (name, 1) != TYPE_NAME (type)))
                   1766:                {
                   1767:                  if (class_binding_level)
                   1768:                    d = pushdecl_class_level (d);
                   1769:                  else
                   1770:                    d = pushdecl (d);
                   1771:                }
                   1772:            }
                   1773:          else
                   1774:            {
                   1775:              /* Make nested declarations go into class-level scope.  */
                   1776:              d = build_lang_field_decl (TYPE_DECL, name, type);
                   1777:              set_identifier_type_value (name, type);
                   1778:              d = pushdecl_class_level (d);
                   1779:            }
                   1780:          if (ANON_AGGRNAME_P (name))
                   1781:            DECL_IGNORED_P (d) = 1;
                   1782:          TYPE_NAME (type) = d;
                   1783: 
                   1784:          if ((current_class_type == NULL_TREE
                   1785:               && current_function_decl == NULL_TREE)
                   1786:              || current_lang_name != lang_name_cplusplus)
                   1787:            /* Non-nested class.  */
                   1788:            DECL_NESTED_TYPENAME (d) = name;
                   1789:          else if (current_function_decl != NULL_TREE)
                   1790:            {
                   1791:              /* Function-nested class.  */
                   1792:              set_nested_typename (d, DECL_ASSEMBLER_NAME (current_function_decl),
                   1793:                                   name, type);
                   1794:              /* This builds the links for classes nested in fn scope.  */
                   1795:              DECL_CONTEXT (d) = current_function_decl;
                   1796:            }
                   1797:          else if (TYPE_SIZE (current_class_type) == NULL_TREE)
                   1798:            {
                   1799:              /* Class-nested class.  */
                   1800:              set_nested_typename (d, DECL_NESTED_TYPENAME (TYPE_NAME (current_class_type)),
                   1801:                                   name, type);
                   1802:              /* This builds the links for classes nested in type scope.  */
                   1803:              DECL_CONTEXT (d) = current_class_type;
                   1804:              DECL_CLASS_CONTEXT (d) = current_class_type;
                   1805:            }
                   1806:         }
                   1807:       if (b->parm_flag == 2)
                   1808:        {
                   1809:          TREE_NONLOCAL_FLAG (type) = 1;
                   1810:          IDENTIFIER_CLASS_VALUE (name) = TYPE_NAME (type);
                   1811:          if (TYPE_SIZE (current_class_type) == NULL_TREE)
                   1812:            CLASSTYPE_TAGS (current_class_type) = b->tags;
                   1813:        }
1.1.1.4   root     1814:     }
1.1       root     1815: 
1.1.1.4   root     1816:   if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL)
                   1817:     /* Use the canonical TYPE_DECL for this node.  */
                   1818:     TYPE_STUB_DECL (type) = TYPE_NAME (type);
                   1819:   else
                   1820:     {
                   1821:       /* Create a fake NULL-named TYPE_DECL node whose TREE_TYPE
                   1822:         will be the tagged type we just added to the current
                   1823:         binding level.  This fake NULL-named TYPE_DECL node helps
                   1824:         dwarfout.c to know when it needs to output a
                   1825:         representation of a tagged type, and it also gives us a
                   1826:         convenient place to record the "scope start" address for
                   1827:         the tagged type.  */
1.1       root     1828: 
1.1.1.2   root     1829: #if 0 /* not yet, should get fixed properly later */
1.1.1.4   root     1830:       TYPE_STUB_DECL (type) = pushdecl (make_type_decl (NULL, type));
1.1.1.2   root     1831: #else
1.1.1.5 ! root     1832:       TYPE_STUB_DECL (type) = pushdecl (build_decl (TYPE_DECL, NULL_TREE, type));
1.1.1.2   root     1833: #endif
1.1       root     1834:     }
                   1835: }
                   1836: 
                   1837: /* Counter used to create anonymous type names.  */
                   1838: static int anon_cnt = 0;
                   1839: 
                   1840: /* Return an IDENTIFIER which can be used as a name for
                   1841:    anonymous structs and unions.  */
                   1842: tree
                   1843: make_anon_name ()
                   1844: {
                   1845:   char buf[32];
                   1846: 
                   1847:   sprintf (buf, ANON_AGGRNAME_FORMAT, anon_cnt++);
                   1848:   return get_identifier (buf);
                   1849: }
                   1850: 
                   1851: /* Clear the TREE_PURPOSE slot of tags which have anonymous typenames.
                   1852:    This keeps dbxout from getting confused.  */
                   1853: void
                   1854: clear_anon_tags ()
                   1855: {
1.1.1.4   root     1856:   register struct binding_level *b;
1.1       root     1857:   register tree tags;
                   1858:   static int last_cnt = 0;
                   1859: 
                   1860:   /* Fast out if no new anon names were declared.  */
                   1861:   if (last_cnt == anon_cnt)
                   1862:     return;
                   1863: 
1.1.1.4   root     1864:   b = current_binding_level;
                   1865:   while (b->tag_transparent)
                   1866:     b = b->level_chain;
1.1       root     1867:   tags = b->tags;
                   1868:   while (tags)
                   1869:     {
                   1870:       /* A NULL purpose means we have already processed all tags
                   1871:         from here to the end of the list.  */
                   1872:       if (TREE_PURPOSE (tags) == NULL_TREE)
                   1873:        break;
                   1874:       if (ANON_AGGRNAME_P (TREE_PURPOSE (tags)))
                   1875:        TREE_PURPOSE (tags) = NULL_TREE;
                   1876:       tags = TREE_CHAIN (tags);
                   1877:     }
                   1878:   last_cnt = anon_cnt;
                   1879: }
                   1880: 
                   1881: /* Subroutine of duplicate_decls: return truthvalue of whether
                   1882:    or not types of these decls match.  */
                   1883: static int
                   1884: decls_match (newdecl, olddecl)
                   1885:      tree newdecl, olddecl;
                   1886: {
                   1887:   int types_match;
                   1888: 
                   1889:   if (TREE_CODE (newdecl) == FUNCTION_DECL && TREE_CODE (olddecl) == FUNCTION_DECL)
                   1890:     {
                   1891:       tree f1 = TREE_TYPE (newdecl);
                   1892:       tree f2 = TREE_TYPE (olddecl);
                   1893:       tree p1 = TYPE_ARG_TYPES (f1);
                   1894:       tree p2 = TYPE_ARG_TYPES (f2);
                   1895: 
                   1896:       /* When we parse a static member function definition,
                   1897:         we put together a FUNCTION_DECL which thinks its type
                   1898:         is METHOD_TYPE.  Change that to FUNCTION_TYPE, and
                   1899:         proceed.  */
1.1.1.4   root     1900:       if (TREE_CODE (f1) == METHOD_TYPE && DECL_STATIC_FUNCTION_P (olddecl))
                   1901:        revert_static_member_fn (&f1, &newdecl, &p1);
                   1902:       else if (TREE_CODE (f2) == METHOD_TYPE
                   1903:               && DECL_STATIC_FUNCTION_P (newdecl))
                   1904:        revert_static_member_fn (&f2, &olddecl, &p2);
                   1905: 
1.1       root     1906:       /* Here we must take care of the case where new default
                   1907:         parameters are specified.  Also, warn if an old
                   1908:         declaration becomes ambiguous because default
                   1909:         parameters may cause the two to be ambiguous.  */
                   1910:       if (TREE_CODE (f1) != TREE_CODE (f2))
                   1911:        {
                   1912:          if (TREE_CODE (f1) == OFFSET_TYPE)
                   1913:            compiler_error_with_decl (newdecl, "`%s' redeclared as member function");
                   1914:          else
                   1915:            compiler_error_with_decl (newdecl, "`%s' redeclared as non-member function");
                   1916:          return 0;
                   1917:        }
                   1918: 
                   1919:       if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (f1)),
                   1920:                     TYPE_MAIN_VARIANT (TREE_TYPE (f2)), 1))
                   1921:        types_match = compparms (p1, p2, 1);
                   1922:       else types_match = 0;
                   1923:     }
                   1924:   else
                   1925:     {
                   1926:       if (TREE_TYPE (newdecl) == error_mark_node)
                   1927:        types_match = TREE_TYPE (olddecl) == error_mark_node;
1.1.1.4   root     1928:       else if (TREE_TYPE (olddecl) == NULL_TREE)
                   1929:        types_match = TREE_TYPE (newdecl) == NULL_TREE;
1.1       root     1930:       else
                   1931:        types_match = comptypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl), 1);
                   1932:     }
                   1933: 
                   1934:   return types_match;
                   1935: }
                   1936: 
                   1937: /* Handle when a new declaration NEWDECL has the same name as an old
                   1938:    one OLDDECL in the same binding contour.  Prints an error message
                   1939:    if appropriate.
                   1940: 
                   1941:    If safely possible, alter OLDDECL to look like NEWDECL, and return 1.
                   1942:    Otherwise, return 0.  */
                   1943: 
                   1944: static int
                   1945: duplicate_decls (newdecl, olddecl)
                   1946:      register tree newdecl, olddecl;
                   1947: {
                   1948:   extern struct obstack permanent_obstack;
1.1.1.4   root     1949:   unsigned olddecl_uid = DECL_UID (olddecl);
                   1950:   int olddecl_friend = 0, types_match;
                   1951:   int new_defines_function;
                   1952:   register unsigned saved_old_decl_uid;
                   1953:   register int saved_old_decl_friend_p;
1.1       root     1954: 
                   1955:   if (TREE_CODE (olddecl) == TREE_LIST
                   1956:       && TREE_CODE (newdecl) == FUNCTION_DECL)
                   1957:     {
                   1958:       /* If a new decl finds a list of old decls, then
                   1959:         we assume that the new decl has C linkage, and
                   1960:         that the old decls have C++ linkage.  In this case,
                   1961:         we must look through the list to see whether
                   1962:         there is an ambiguity or not.  */
                   1963:       tree olddecls = olddecl;
                   1964: 
                   1965:       /* If the overload list is empty, just install the decl.  */
                   1966:       if (TREE_VALUE (olddecls) == NULL_TREE)
                   1967:        {
                   1968:          TREE_VALUE (olddecls) = newdecl;
                   1969:          return 1;
                   1970:        }
                   1971: 
                   1972:       while (olddecls)
                   1973:        {
                   1974:          if (decls_match (newdecl, TREE_VALUE (olddecls)))
                   1975:            {
                   1976:              if (TREE_CODE (newdecl) == VAR_DECL)
                   1977:                ;
                   1978:              else if (DECL_LANGUAGE (newdecl)
                   1979:                       != DECL_LANGUAGE (TREE_VALUE (olddecls)))
                   1980:                {
                   1981:                  error_with_decl (newdecl, "declaration of `%s' with different language linkage");
                   1982:                  error_with_decl (TREE_VALUE (olddecls), "previous declaration here");
                   1983:                }
                   1984:              types_match = 1;
                   1985:              break;
                   1986:            }
                   1987:          olddecls = TREE_CHAIN (olddecls);
                   1988:        }
                   1989:       if (olddecls)
                   1990:        olddecl = TREE_VALUE (olddecl);
                   1991:       else
                   1992:        return 1;
                   1993:     }
                   1994:   else
1.1.1.4   root     1995:     {
                   1996:       if (TREE_CODE (olddecl) != TREE_LIST)
                   1997:        olddecl_friend = DECL_LANG_SPECIFIC (olddecl) && DECL_FRIEND_P (olddecl);
                   1998:       types_match = decls_match (newdecl, olddecl);
                   1999:     }
1.1       root     2000: 
                   2001:   if ((TREE_TYPE (newdecl) && TREE_CODE (TREE_TYPE (newdecl)) == ERROR_MARK)
                   2002:       || (TREE_TYPE (olddecl) && TREE_CODE (TREE_TYPE (olddecl)) == ERROR_MARK))
                   2003:     types_match = 0;
                   2004: 
                   2005:   /* If this decl has linkage, and the old one does too, maybe no error.  */
                   2006:   if (TREE_CODE (olddecl) != TREE_CODE (newdecl))
                   2007:     {
                   2008:       error_with_decl (newdecl, "`%s' redeclared as different kind of symbol");
                   2009:       if (TREE_CODE (olddecl) == TREE_LIST)
                   2010:        olddecl = TREE_VALUE (olddecl);
                   2011:       error_with_decl (olddecl, "previous declaration of `%s'");
                   2012: 
                   2013:       /* New decl is completely inconsistent with the old one =>
                   2014:         tell caller to replace the old one.  */
                   2015: 
                   2016:       return 0;
                   2017:     }
                   2018: 
                   2019:   if (TREE_CODE (newdecl) == FUNCTION_DECL)
                   2020:     {
                   2021:       /* Now that functions must hold information normally held
                   2022:         by field decls, there is extra work to do so that
                   2023:         declaration information does not get destroyed during
                   2024:         definition.  */
                   2025:       if (DECL_VINDEX (olddecl))
                   2026:        DECL_VINDEX (newdecl) = DECL_VINDEX (olddecl);
                   2027:       if (DECL_CONTEXT (olddecl))
                   2028:        DECL_CONTEXT (newdecl) = DECL_CONTEXT (olddecl);
                   2029:       if (DECL_CLASS_CONTEXT (olddecl))
                   2030:        DECL_CLASS_CONTEXT (newdecl) = DECL_CLASS_CONTEXT (olddecl);
1.1.1.5 ! root     2031:       if (DECL_CHAIN (newdecl) == NULL_TREE)
1.1       root     2032:        DECL_CHAIN (newdecl) = DECL_CHAIN (olddecl);
1.1.1.5 ! root     2033:       if (DECL_PENDING_INLINE_INFO (newdecl) == (struct pending_inline *)0)
1.1       root     2034:        DECL_PENDING_INLINE_INFO (newdecl) = DECL_PENDING_INLINE_INFO (olddecl);
                   2035:     }
                   2036: 
                   2037:   if (flag_traditional && TREE_CODE (newdecl) == FUNCTION_DECL
                   2038:       && IDENTIFIER_IMPLICIT_DECL (DECL_ASSEMBLER_NAME (newdecl)) == olddecl)
                   2039:     /* If -traditional, avoid error for redeclaring fcn
                   2040:        after implicit decl.  */
                   2041:     ;
                   2042:   else if (TREE_CODE (olddecl) == FUNCTION_DECL
                   2043:           && DECL_BUILT_IN (olddecl))
                   2044:     {
                   2045:       if (!types_match)
                   2046:        {
                   2047:          error_with_decl (newdecl, "declaration of `%s'");
                   2048:          error_with_decl (olddecl, "conflicts with built-in declaration `%s'");
                   2049:        }
                   2050:     }
                   2051:   else if (!types_match)
                   2052:     {
                   2053:       tree oldtype = TREE_TYPE (olddecl);
                   2054:       tree newtype = TREE_TYPE (newdecl);
                   2055:       int give_error = 0;
                   2056: 
                   2057:       /* Already complained about this, so don't do so again.  */
                   2058:       if (current_class_type == NULL_TREE
                   2059:          || IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl)) != current_class_type)
                   2060:        {
                   2061:          give_error = 1;
                   2062:          error_with_decl (newdecl, "conflicting types for `%s'");
                   2063:        }
                   2064: 
                   2065:       /* Check for function type mismatch
                   2066:         involving an empty arglist vs a nonempty one.  */
                   2067:       if (TREE_CODE (olddecl) == FUNCTION_DECL
                   2068:          && comptypes (TREE_TYPE (oldtype),
                   2069:                        TREE_TYPE (newtype), 1)
1.1.1.5 ! root     2070:          && ((TYPE_ARG_TYPES (oldtype) == NULL_TREE
        !          2071:               && DECL_INITIAL (olddecl) == NULL_TREE)
        !          2072:              || (TYPE_ARG_TYPES (newtype) == NULL_TREE
        !          2073:                  && DECL_INITIAL (newdecl) == NULL_TREE)))
1.1       root     2074:        {
                   2075:          /* Classify the problem further.  */
                   2076:          register tree t = TYPE_ARG_TYPES (oldtype);
1.1.1.5 ! root     2077:          if (t == NULL_TREE)
1.1       root     2078:            t = TYPE_ARG_TYPES (newtype);
                   2079:          for (; t; t = TREE_CHAIN (t))
                   2080:            {
                   2081:              register tree type = TREE_VALUE (t);
                   2082: 
1.1.1.5 ! root     2083:              if (TREE_CHAIN (t) == NULL_TREE && type != void_type_node)
1.1       root     2084:                {
                   2085:                  error ("A parameter list with an ellipsis can't match");
                   2086:                  error ("an empty parameter name list declaration.");
                   2087:                  break;
                   2088:                }
                   2089: 
1.1.1.4   root     2090:              if (TYPE_MAIN_VARIANT (type) == float_type_node
                   2091:                  || C_PROMOTING_INTEGER_TYPE_P (type))
1.1       root     2092:                {
                   2093:                  error ("An argument type that has a default promotion");
                   2094:                  error ("can't match an empty parameter name list declaration.");
                   2095:                  break;
                   2096:                }
                   2097:            }
                   2098:        }
                   2099:       if (give_error)
                   2100:        error_with_decl (olddecl, "previous declaration of `%s'");
                   2101: 
                   2102:       /* There is one thing GNU C++ cannot tolerate: a constructor
                   2103:         which takes the type of object being constructed.
                   2104:         Farm that case out here.  */
                   2105:       if (TREE_CODE (newdecl) == FUNCTION_DECL
                   2106:          && DECL_CONSTRUCTOR_P (newdecl))
                   2107:        {
                   2108:          tree tmp = TREE_CHAIN (TYPE_ARG_TYPES (newtype));
                   2109: 
                   2110:          if (tmp != NULL_TREE
                   2111:              && (TYPE_MAIN_VARIANT (TREE_VALUE (tmp))
                   2112:                  == TYPE_METHOD_BASETYPE (newtype)))
                   2113:            {
                   2114:              tree parm = TREE_CHAIN (DECL_ARGUMENTS (newdecl));
                   2115:              tree argtypes
                   2116:                = hash_tree_chain (build_reference_type (TREE_VALUE (tmp)),
                   2117:                                   TREE_CHAIN (tmp));
                   2118: 
                   2119:              DECL_ARG_TYPE (parm)
                   2120:                = TREE_TYPE (parm)
                   2121:                  = TYPE_REFERENCE_TO (TREE_VALUE (tmp));
                   2122: 
                   2123:              TREE_TYPE (newdecl) = newtype
                   2124:                = build_cplus_method_type (TYPE_METHOD_BASETYPE (newtype),
                   2125:                                           TREE_TYPE (newtype), argtypes);
                   2126:              error ("constructor cannot take as argument the type being constructed");
                   2127:              SET_IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl), current_class_type);
                   2128:            }
                   2129:        }
                   2130:     }
                   2131:   else
                   2132:     {
                   2133:       char *errmsg = redeclaration_error_message (newdecl, olddecl);
                   2134:       if (errmsg)
                   2135:        {
                   2136:          error_with_decl (newdecl, errmsg);
                   2137:          if (DECL_NAME (olddecl) != NULL_TREE)
                   2138:            error_with_decl (olddecl,
1.1.1.4   root     2139:                             (DECL_INITIAL (olddecl)
                   2140:                              && current_binding_level == global_binding_level)
                   2141:                                ? "`%s' previously defined here"
                   2142:                                : "`%s' previously declared here");
1.1       root     2143:        }
                   2144:       else if (TREE_CODE (olddecl) == FUNCTION_DECL
1.1.1.5 ! root     2145:               && DECL_INITIAL (olddecl) != NULL_TREE
        !          2146:               && TYPE_ARG_TYPES (TREE_TYPE (olddecl)) == NULL_TREE
        !          2147:               && TYPE_ARG_TYPES (TREE_TYPE (newdecl)) != NULL_TREE)
1.1       root     2148:        {
                   2149:          /* Prototype decl follows defn w/o prototype.  */
                   2150:          warning_with_decl (newdecl, "prototype for `%s'");
                   2151:          warning_with_decl (olddecl,
                   2152:                             "follows non-prototype definition here");
                   2153:        }
                   2154: 
                   2155:       /* These bits are logically part of the type.  */
                   2156:       if (pedantic
                   2157:          && (TREE_READONLY (newdecl) != TREE_READONLY (olddecl)
                   2158:              || TREE_THIS_VOLATILE (newdecl) != TREE_THIS_VOLATILE (olddecl)))
                   2159:        error_with_decl (newdecl, "type qualifiers for `%s' conflict with previous decl");
                   2160:     }
                   2161: 
                   2162:   /* Deal with C++: must preserve virtual function table size.  */
                   2163:   if (TREE_CODE (olddecl) == TYPE_DECL)
                   2164:     {
                   2165:       if (TYPE_LANG_SPECIFIC (TREE_TYPE (newdecl))
                   2166:           && TYPE_LANG_SPECIFIC (TREE_TYPE (olddecl)))
                   2167:        {
                   2168:          CLASSTYPE_VSIZE (TREE_TYPE (newdecl))
                   2169:            = CLASSTYPE_VSIZE (TREE_TYPE (olddecl));
                   2170:          CLASSTYPE_FRIEND_CLASSES (TREE_TYPE (newdecl))
                   2171:            = CLASSTYPE_FRIEND_CLASSES (TREE_TYPE (olddecl));
                   2172:        }
1.1.1.3   root     2173:       /* why assert here?  Just because debugging information is
                   2174:         messed up? (mrs) */
                   2175:       /* it happens on something like:
                   2176:                typedef struct Thing {
                   2177:                        Thing();
                   2178:                        int     x;
                   2179:                } Thing;
                   2180:       */
1.1.1.4   root     2181: #if 0
                   2182:       my_friendly_assert (DECL_IGNORED_P (olddecl) == DECL_IGNORED_P (newdecl), 139);
                   2183: #endif
1.1       root     2184:     }
                   2185: 
1.1.1.4   root     2186:   /* Special handling ensues if new decl is a function definition.  */
                   2187:   new_defines_function = (TREE_CODE (newdecl) == FUNCTION_DECL
1.1.1.5 ! root     2188:                          && DECL_INITIAL (newdecl) != NULL_TREE);
1.1.1.4   root     2189: 
                   2190:   /* Optionally warn about more than one declaration for the same name,
                   2191:      but don't warn about a function declaration followed by a definition.  */
1.1.1.5 ! root     2192:   if (warn_redundant_decls
        !          2193:       && DECL_SOURCE_LINE (olddecl) != 0
        !          2194:       && !(new_defines_function && DECL_INITIAL (olddecl) == NULL_TREE))
1.1.1.4   root     2195:     {
                   2196:       warning_with_decl (newdecl, "redundant redeclaration of `%s' in same scope");
                   2197:       warning_with_decl (olddecl, "previous declaration of `%s'");
                   2198:     }
1.1       root     2199: 
                   2200:   /* Copy all the DECL_... slots specified in the new decl
                   2201:      except for any that we copy here from the old type.  */
                   2202: 
                   2203:   if (types_match)
                   2204:     {
                   2205:       /* Automatically handles default parameters.  */
                   2206:       tree oldtype = TREE_TYPE (olddecl);
                   2207:       /* Merge the data types specified in the two decls.  */
                   2208:       tree newtype = common_type (TREE_TYPE (newdecl), TREE_TYPE (olddecl));
                   2209: 
                   2210:       if (TREE_CODE (newdecl) == VAR_DECL)
1.1.1.4   root     2211:        DECL_THIS_EXTERN (newdecl) |= DECL_THIS_EXTERN (olddecl);
1.1       root     2212:       /* Do this after calling `common_type' so that default
                   2213:         parameters don't confuse us.  */
                   2214:       else if (TREE_CODE (newdecl) == FUNCTION_DECL
                   2215:          && (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl))
                   2216:              != TYPE_RAISES_EXCEPTIONS (TREE_TYPE (olddecl))))
                   2217:        {
                   2218:          tree ctype = NULL_TREE;
                   2219:          ctype = DECL_CLASS_CONTEXT (newdecl);
                   2220:          TREE_TYPE (newdecl) = build_exception_variant (ctype, newtype,
                   2221:                                                         TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl)));
                   2222:          TREE_TYPE (olddecl) = build_exception_variant (ctype, newtype,
                   2223:                                                         TYPE_RAISES_EXCEPTIONS (oldtype));
                   2224: 
1.1.1.5 ! root     2225:          if (! compexcepttypes (TREE_TYPE (newdecl), TREE_TYPE(olddecl), 0))
1.1       root     2226:            {
                   2227:              error_with_decl (newdecl, "declaration of `%s' raises different exceptions...");
                   2228:              error_with_decl (olddecl, "...from previous declaration here");
                   2229:            }
                   2230:        }
                   2231:       TREE_TYPE (newdecl) = TREE_TYPE (olddecl) = newtype;
                   2232: 
                   2233:       /* Lay the type out, unless already done.  */
                   2234:       if (oldtype != TREE_TYPE (newdecl))
                   2235:        {
                   2236:          if (TREE_TYPE (newdecl) != error_mark_node)
                   2237:            layout_type (TREE_TYPE (newdecl));
                   2238:          if (TREE_CODE (newdecl) != FUNCTION_DECL
                   2239:              && TREE_CODE (newdecl) != TYPE_DECL
                   2240:              && TREE_CODE (newdecl) != CONST_DECL)
                   2241:            layout_decl (newdecl, 0);
                   2242:        }
                   2243:       else
                   2244:        {
                   2245:          /* Since the type is OLDDECL's, make OLDDECL's size go with.  */
                   2246:          DECL_SIZE (newdecl) = DECL_SIZE (olddecl);
                   2247:        }
                   2248: 
                   2249:       /* Merge the type qualifiers.  */
                   2250:       if (TREE_READONLY (newdecl))
                   2251:        TREE_READONLY (olddecl) = 1;
                   2252:       if (TREE_THIS_VOLATILE (newdecl))
                   2253:        TREE_THIS_VOLATILE (olddecl) = 1;
                   2254: 
                   2255:       /* Merge the initialization information.  */
1.1.1.5 ! root     2256:       if (DECL_INITIAL (newdecl) == NULL_TREE)
1.1       root     2257:        DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
1.1.1.4   root     2258:       /* Keep the old rtl since we can safely use it, unless it's the
                   2259:         call to abort() used for abstract virtuals.  */
                   2260:       if ((DECL_LANG_SPECIFIC (olddecl)
                   2261:           && !DECL_ABSTRACT_VIRTUAL_P (olddecl))
                   2262:          || DECL_RTL (olddecl) != DECL_RTL (abort_fndecl))
                   2263:        DECL_RTL (newdecl) = DECL_RTL (olddecl);
1.1       root     2264:     }
                   2265:   /* If cannot merge, then use the new type and qualifiers,
                   2266:      and don't preserve the old rtl.  */
                   2267:   else
                   2268:     {
                   2269:       /* Clean out any memory we had of the old declaration.  */
                   2270:       tree oldstatic = value_member (olddecl, static_aggregates);
                   2271:       if (oldstatic)
                   2272:        TREE_VALUE (oldstatic) = error_mark_node;
                   2273: 
                   2274:       TREE_TYPE (olddecl) = TREE_TYPE (newdecl);
                   2275:       TREE_READONLY (olddecl) = TREE_READONLY (newdecl);
                   2276:       TREE_THIS_VOLATILE (olddecl) = TREE_THIS_VOLATILE (newdecl);
                   2277:       TREE_SIDE_EFFECTS (olddecl) = TREE_SIDE_EFFECTS (newdecl);
                   2278:     }
                   2279: 
                   2280:   /* Merge the storage class information.  */
1.1.1.4   root     2281:   if (DECL_EXTERNAL (newdecl))
1.1       root     2282:     {
                   2283:       TREE_STATIC (newdecl) = TREE_STATIC (olddecl);
1.1.1.4   root     2284:       DECL_EXTERNAL (newdecl) = DECL_EXTERNAL (olddecl);
1.1       root     2285: 
                   2286:       /* For functions, static overrides non-static.  */
                   2287:       if (TREE_CODE (newdecl) == FUNCTION_DECL)
                   2288:        {
                   2289:          TREE_PUBLIC (newdecl) &= TREE_PUBLIC (olddecl);
                   2290:          /* This is since we don't automatically
                   2291:             copy the attributes of NEWDECL into OLDDECL.  */
                   2292:          TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
                   2293:          /* If this clears `static', clear it in the identifier too.  */
                   2294:          if (! TREE_PUBLIC (olddecl))
                   2295:            TREE_PUBLIC (DECL_ASSEMBLER_NAME (olddecl)) = 0;
                   2296:        }
                   2297:       else
                   2298:        TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl);
                   2299:     }
                   2300:   else
                   2301:     {
                   2302:       TREE_STATIC (olddecl) = TREE_STATIC (newdecl);
                   2303:       /* A `const' which was not declared `extern' and is
                   2304:         in static storage is invisible.  */
                   2305:       if (TREE_CODE (newdecl) == VAR_DECL
                   2306:          && TREE_READONLY (newdecl) && TREE_STATIC (newdecl)
1.1.1.4   root     2307:          && ! DECL_THIS_EXTERN (newdecl))
1.1       root     2308:        TREE_PUBLIC (newdecl) = 0;
                   2309:       TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
                   2310:     }
1.1.1.4   root     2311: 
1.1       root     2312:   /* If either decl says `inline', this fn is inline,
                   2313:      unless its definition was passed already.  */
1.1.1.5 ! root     2314:   if (DECL_INLINE (newdecl) && DECL_INITIAL (olddecl) == NULL_TREE)
1.1.1.4   root     2315:     DECL_INLINE (olddecl) = 1;
                   2316:   DECL_INLINE (newdecl) = DECL_INLINE (olddecl);
1.1       root     2317: 
                   2318:   if (TREE_CODE (newdecl) == FUNCTION_DECL)
                   2319:     {
1.1.1.4   root     2320:       if (new_defines_function)
1.1       root     2321:        /* If defining a function declared with other language
                   2322:           linkage, use the previously declared language linkage.  */
                   2323:        DECL_LANGUAGE (newdecl) = DECL_LANGUAGE (olddecl);
                   2324:       else
                   2325:        {
                   2326:          /* If redeclaring a builtin function, and not a definition,
                   2327:             it stays built in.  */
                   2328:          if (DECL_BUILT_IN (olddecl))
                   2329:            {
                   2330:              DECL_BUILT_IN (newdecl) = 1;
                   2331:              DECL_SET_FUNCTION_CODE (newdecl, DECL_FUNCTION_CODE (olddecl));
                   2332:              /* If we're keeping the built-in definition, keep the rtl,
                   2333:                 regardless of declaration matches.  */
                   2334:              DECL_RTL (newdecl) = DECL_RTL (olddecl);
                   2335:            }
                   2336:          else
                   2337:            DECL_FRAME_SIZE (newdecl) = DECL_FRAME_SIZE (olddecl);
                   2338: 
                   2339:          DECL_RESULT (newdecl) = DECL_RESULT (olddecl);
                   2340:          if (DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl))
                   2341:            /* Previously saved insns go together with
                   2342:               the function's previous definition.  */
                   2343:            DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
                   2344:          /* Don't clear out the arguments if we're redefining a function.  */
                   2345:          if (DECL_ARGUMENTS (olddecl))
                   2346:            DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl);
                   2347:        }
                   2348:     }
                   2349: 
                   2350:   /* Now preserve various other info from the definition.  */
                   2351:   TREE_ADDRESSABLE (newdecl) = TREE_ADDRESSABLE (olddecl);
                   2352:   TREE_ASM_WRITTEN (newdecl) = TREE_ASM_WRITTEN (olddecl);
                   2353: 
                   2354:   /* Don't really know how much of the language-specific
                   2355:      values we should copy from old to new.  */
                   2356: #if 1
                   2357:   if (DECL_LANG_SPECIFIC (olddecl))
                   2358:     DECL_IN_AGGR_P (newdecl) = DECL_IN_AGGR_P (olddecl);
                   2359: #endif
                   2360: 
1.1.1.4   root     2361:   /* We are about to copy the contexts of newdecl into olddecl, so save a
                   2362:      few tidbits of information from olddecl that we may need to restore
                   2363:      after the copying takes place.  */
                   2364: 
                   2365:   saved_old_decl_uid = DECL_UID (olddecl);
                   2366:   saved_old_decl_friend_p
                   2367:     = DECL_LANG_SPECIFIC (olddecl) ? DECL_FRIEND_P (olddecl) : 0;
                   2368: 
1.1       root     2369:   if (TREE_CODE (newdecl) == FUNCTION_DECL)
                   2370:     {
                   2371:       int function_size;
                   2372:       struct lang_decl *ol = DECL_LANG_SPECIFIC (olddecl);
                   2373:       struct lang_decl *nl = DECL_LANG_SPECIFIC (newdecl);
                   2374: 
                   2375:       function_size = sizeof (struct tree_decl);
                   2376: 
                   2377:       bcopy ((char *) newdecl + sizeof (struct tree_common),
                   2378:             (char *) olddecl + sizeof (struct tree_common),
                   2379:             function_size - sizeof (struct tree_common));
                   2380: 
1.1.1.4   root     2381:       if ((char *)newdecl + ((function_size + sizeof (struct lang_decl)
                   2382:                             + obstack_alignment_mask (&permanent_obstack))
                   2383:                             & ~ obstack_alignment_mask (&permanent_obstack))
                   2384:          == obstack_next_free (&permanent_obstack))
1.1       root     2385:        {
                   2386:          DECL_MAIN_VARIANT (newdecl) = olddecl;
                   2387:          DECL_LANG_SPECIFIC (olddecl) = ol;
1.1.1.4   root     2388:          bcopy ((char *)nl, (char *)ol, sizeof (struct lang_decl));
1.1       root     2389: 
                   2390:          obstack_free (&permanent_obstack, newdecl);
                   2391:        }
                   2392:       else if (LANG_DECL_PERMANENT (ol))
                   2393:        {
                   2394:          if (DECL_MAIN_VARIANT (olddecl) == olddecl)
                   2395:            {
                   2396:              /* Save these lang_decls that would otherwise be lost.  */
                   2397:              extern tree free_lang_decl_chain;
                   2398:              tree free_lang_decl = (tree) ol;
                   2399:              TREE_CHAIN (free_lang_decl) = free_lang_decl_chain;
                   2400:              free_lang_decl_chain = free_lang_decl;
                   2401:            }
                   2402:          else
                   2403:            {
                   2404:              /* Storage leak.  */
                   2405:            }
                   2406:        }
                   2407:     }
                   2408:   else
                   2409:     {
                   2410:       bcopy ((char *) newdecl + sizeof (struct tree_common),
                   2411:             (char *) olddecl + sizeof (struct tree_common),
                   2412:             sizeof (struct tree_decl) - sizeof (struct tree_common)
                   2413:             + tree_code_length [(int)TREE_CODE (newdecl)] * sizeof (char *));
                   2414:     }
                   2415: 
1.1.1.4   root     2416:   DECL_UID (olddecl) = olddecl_uid;
                   2417:   if (olddecl_friend)
                   2418:     DECL_FRIEND_P (olddecl) = 1;
                   2419: 
                   2420:   /* Restore some pieces of information which were originally in olddecl.  */
                   2421: 
                   2422:   DECL_UID (olddecl) = saved_old_decl_uid;
                   2423:   if (DECL_LANG_SPECIFIC (olddecl))
                   2424:     DECL_FRIEND_P (olddecl) |= saved_old_decl_friend_p;
                   2425: 
1.1       root     2426:   return 1;
                   2427: }
                   2428: 
                   2429: void
                   2430: adjust_type_value (id)
                   2431:      tree id;
                   2432: {
                   2433:   tree t;
                   2434: 
                   2435:   if (current_binding_level != global_binding_level)
                   2436:     {
                   2437:       if (current_binding_level != class_binding_level)
                   2438:        {
                   2439:          t = IDENTIFIER_LOCAL_VALUE (id);
                   2440:          if (t && TREE_CODE (t) == TYPE_DECL)
                   2441:            {
                   2442:            set_it:
                   2443:              SET_IDENTIFIER_TYPE_VALUE (id, TREE_TYPE (t));
                   2444:              return;
                   2445:            }
                   2446:        }
                   2447:       else
1.1.1.3   root     2448:        my_friendly_abort (7);
1.1       root     2449: 
                   2450:       if (current_class_type)
                   2451:        {
                   2452:          t = IDENTIFIER_CLASS_VALUE (id);
                   2453:          if (t && TREE_CODE (t) == TYPE_DECL)
                   2454:            goto set_it;
                   2455:        }
                   2456:     }
                   2457: 
                   2458:   t = IDENTIFIER_GLOBAL_VALUE (id);
                   2459:   if (t && TREE_CODE (t) == TYPE_DECL)
                   2460:     goto set_it;
                   2461:   if (t && TREE_CODE (t) == TEMPLATE_DECL)
                   2462:     SET_IDENTIFIER_TYPE_VALUE (id, NULL_TREE);
                   2463: }
                   2464: 
                   2465: /* Record a decl-node X as belonging to the current lexical scope.
                   2466:    Check for errors (such as an incompatible declaration for the same
                   2467:    name already seen in the same scope).
                   2468: 
                   2469:    Returns either X or an old decl for the same name.
                   2470:    If an old decl is returned, it may have been smashed
                   2471:    to agree with what X says.  */
                   2472: 
                   2473: tree
                   2474: pushdecl (x)
                   2475:      tree x;
                   2476: {
                   2477:   register tree t;
1.1.1.2   root     2478: #if 0 /* not yet, should get fixed properly later */
                   2479:   register tree name;
                   2480: #else
1.1       root     2481:   register tree name = DECL_ASSEMBLER_NAME (x);
1.1.1.2   root     2482: #endif
1.1       root     2483:   register struct binding_level *b = current_binding_level;
                   2484: 
                   2485: #if 0
                   2486:   static int nglobals; int len;
                   2487: 
                   2488:   len = list_length (global_binding_level->names);
                   2489:   if (len < nglobals)
1.1.1.3   root     2490:     my_friendly_abort (8);
1.1       root     2491:   else if (len > nglobals)
                   2492:     nglobals = len;
                   2493: #endif
                   2494: 
1.1.1.4   root     2495:   /* Don't change DECL_CONTEXT of virtual methods.  */
                   2496:   if (x != current_function_decl
                   2497:       && (TREE_CODE (x) != FUNCTION_DECL
                   2498:          || !DECL_VIRTUAL_P (x)))
                   2499:     DECL_CONTEXT (x) = current_function_decl;
1.1.1.5 ! root     2500:   /* A local declaration for a function doesn't constitute nesting.  */
        !          2501:   if (TREE_CODE (x) == FUNCTION_DECL && DECL_INITIAL (x) == 0)
        !          2502:     DECL_CONTEXT (x) = 0;
1.1.1.4   root     2503: 
1.1.1.2   root     2504: #if 0 /* not yet, should get fixed properly later */
                   2505:   /* For functions and class static data, we currently look up the encoded
                   2506:      form of the name.  For types, we want the real name.  The former will
                   2507:      probably be changed soon, according to MDT.  */
                   2508:   if (TREE_CODE (x) == FUNCTION_DECL || TREE_CODE (x) == VAR_DECL)
                   2509:     name = DECL_ASSEMBLER_NAME (x);
                   2510:   else
                   2511:     name = DECL_NAME (x);
1.1.1.4   root     2512: #else
                   2513:   /* Type are looked up using the DECL_NAME, as that is what the rest of the
                   2514:      compiler wants to use. */
                   2515:   if (TREE_CODE (x) == TYPE_DECL)
                   2516:     name = DECL_NAME (x);
1.1.1.2   root     2517: #endif
1.1.1.4   root     2518: 
1.1       root     2519:   if (name)
                   2520:     {
                   2521:       char *file;
                   2522:       int line;
                   2523: 
                   2524:       t = lookup_name_current_level (name);
1.1.1.5 ! root     2525:       if (t == error_mark_node)
1.1       root     2526:        {
1.1.1.5 ! root     2527:          /* error_mark_node is 0 for a while during initialization!  */
        !          2528:          t = NULL_TREE;
1.1       root     2529:          error_with_decl (x, "`%s' used prior to declaration");
                   2530:        }
                   2531: 
1.1.1.5 ! root     2532:       if (t != NULL_TREE)
1.1       root     2533:        {
                   2534:          if (TREE_CODE (t) == PARM_DECL)
                   2535:            {
                   2536:              if (DECL_CONTEXT (t) == NULL_TREE)
                   2537:                fatal ("parse errors have confused me too much");
                   2538:            }
                   2539:          file = DECL_SOURCE_FILE (t);
                   2540:          line = DECL_SOURCE_LINE (t);
                   2541:        }
                   2542: 
1.1.1.5 ! root     2543:       if (t != NULL_TREE && TREE_CODE (t) != TREE_CODE (x))
1.1       root     2544:        {
                   2545:          if (TREE_CODE (t) == TYPE_DECL || TREE_CODE (x) == TYPE_DECL)
                   2546:            {
                   2547:              /* We do nothing special here, because C++ does such nasty
                   2548:                 things with TYPE_DECLs.  Instead, just let the TYPE_DECL
                   2549:                 get shadowed, and know that if we need to find a TYPE_DECL
                   2550:                 for a given name, we can look in the IDENTIFIER_TYPE_VALUE
                   2551:                 slot of the identifier.  */
                   2552:              ;
                   2553:            }
                   2554:          else if (duplicate_decls (x, t))
                   2555:            return t;
                   2556:        }
1.1.1.5 ! root     2557:       else if (t != NULL_TREE && duplicate_decls (x, t))
1.1       root     2558:        {
                   2559:          /* If this decl is `static' and an `extern' was seen previously,
                   2560:             that is erroneous.  But don't complain if -traditional,
                   2561:             since traditional compilers don't complain.
                   2562: 
                   2563:             Note that this does not apply to the C++ case of declaring
                   2564:             a variable `extern const' and then later `const'.  */
                   2565:          if (!flag_traditional && TREE_PUBLIC (name)
1.1.1.4   root     2566:              && ! TREE_PUBLIC (x) && ! DECL_EXTERNAL (x) && ! DECL_INLINE (x))
1.1       root     2567:            {
                   2568:              /* Due to interference in memory reclamation (X may be
                   2569:                 obstack-deallocated at this point), we must guard against
                   2570:                 one really special case.  */
                   2571:              if (current_function_decl == x)
                   2572:                current_function_decl = t;
                   2573:              if (IDENTIFIER_IMPLICIT_DECL (name))
                   2574:                warning ("`%s' was declared implicitly `extern' and later `static'",
                   2575:                         lang_printable_name (t));
                   2576:              else
                   2577:                warning ("`%s' was declared `extern' and later `static'",
                   2578:                         lang_printable_name (t));
                   2579:              warning_with_file_and_line (file, line,
                   2580:                                          "previous declaration of `%s'",
                   2581:                                          lang_printable_name (t));
                   2582:            }
                   2583:          return t;
                   2584:        }
                   2585: 
                   2586:       /* If declaring a type as a typedef, and the type has no known
                   2587:         typedef name, install this TYPE_DECL as its typedef name.
                   2588: 
                   2589:         C++: If it had an anonymous aggregate or enum name,
                   2590:         give it a `better' one.  */
                   2591:       if (TREE_CODE (x) == TYPE_DECL)
                   2592:        {
                   2593:          tree name = TYPE_NAME (TREE_TYPE (x));
                   2594: 
                   2595:          if (name == NULL_TREE || TREE_CODE (name) != TYPE_DECL)
                   2596:            {
                   2597:              /* If these are different names, and we're at the global
                   2598:                 binding level, make two equivalent definitions.  */
                   2599:               name = x;
                   2600:               if (global_bindings_p ())
                   2601:                 TYPE_NAME (TREE_TYPE (x)) = x;
                   2602:            }
                   2603:          else
                   2604:            {
                   2605:              tree tname = DECL_NAME (name);
                   2606:              if (global_bindings_p () && ANON_AGGRNAME_P (tname))
                   2607:                {
                   2608:                  /* do gratuitous C++ typedefing, and make sure that
                   2609:                     we access this type either through TREE_TYPE field
                   2610:                     or via the tags list.  */
                   2611:                  TYPE_NAME (TREE_TYPE (x)) = x;
                   2612:                  pushtag (tname, TREE_TYPE (x));
                   2613:                }
                   2614:            }
1.1.1.4   root     2615:          my_friendly_assert (TREE_CODE (name) == TYPE_DECL, 140);
1.1       root     2616:          if (DECL_NAME (name) && !DECL_NESTED_TYPENAME (name))
                   2617:            set_nested_typename (x, current_class_name, DECL_NAME (name),
                   2618:                                 TREE_TYPE (x));
                   2619:          if (TYPE_NAME (TREE_TYPE (x)) && TYPE_IDENTIFIER (TREE_TYPE (x)))
                   2620:             set_identifier_type_value (DECL_NAME (x), TREE_TYPE (x));
                   2621: /* was using TYPE_IDENTIFIER (TREE_TYPE (x)) */
                   2622:        }
                   2623: 
                   2624:       /* Multiple external decls of the same identifier ought to match.  */
                   2625: 
1.1.1.5 ! root     2626:       if (DECL_EXTERNAL (x) && IDENTIFIER_GLOBAL_VALUE (name) != NULL_TREE
1.1.1.4   root     2627:          && (DECL_EXTERNAL (IDENTIFIER_GLOBAL_VALUE (name))
1.1       root     2628:              || TREE_PUBLIC (IDENTIFIER_GLOBAL_VALUE (name)))
                   2629:          /* We get warnings about inline functions where they are defined.
                   2630:             Avoid duplicate warnings where they are used.  */
1.1.1.4   root     2631:          && !DECL_INLINE (x))
1.1       root     2632:        {
                   2633:          if (! comptypes (TREE_TYPE (x),
                   2634:                           TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (name)), 1))
                   2635:            {
                   2636:              warning_with_decl (x,
                   2637:                                 "type mismatch with previous external decl");
                   2638:              warning_with_decl (IDENTIFIER_GLOBAL_VALUE (name),
                   2639:                                 "previous external decl of `%s'");
                   2640:            }
                   2641:        }
                   2642: 
                   2643:       /* In PCC-compatibility mode, extern decls of vars with no current decl
                   2644:         take effect at top level no matter where they are.  */
1.1.1.4   root     2645:       if (flag_traditional && DECL_EXTERNAL (x)
1.1.1.5 ! root     2646:          && lookup_name (name, 0) == NULL_TREE)
1.1       root     2647:        b = global_binding_level;
                   2648: 
                   2649:       /* This name is new in its binding level.
                   2650:         Install the new declaration and return it.  */
                   2651:       if (b == global_binding_level)
                   2652:        {
                   2653:          /* Install a global value.  */
                   2654: 
                   2655:          /* Rule for VAR_DECLs, but not for other kinds of _DECLs:
                   2656:             A `const' which was not declared `extern' is invisible.  */
                   2657:          if (TREE_CODE (x) == VAR_DECL
1.1.1.4   root     2658:              && TREE_READONLY (x) && ! DECL_THIS_EXTERN (x))
1.1       root     2659:            TREE_PUBLIC (x) = 0;
                   2660: 
                   2661:          /* If the first global decl has external linkage,
                   2662:             warn if we later see static one.  */
1.1.1.5 ! root     2663:          if (IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE && TREE_PUBLIC (x))
1.1       root     2664:            TREE_PUBLIC (name) = 1;
                   2665: 
                   2666:          /* Don't install a TYPE_DECL if we already have another
                   2667:             sort of _DECL with that name.  */
                   2668:          if (TREE_CODE (x) != TYPE_DECL
                   2669:              || t == NULL_TREE
                   2670:              || TREE_CODE (t) == TYPE_DECL)
1.1.1.4   root     2671: #if 0
                   2672:            /* This has not be thoroughly tested yet. */
                   2673:            /* It allows better dwarf debugging. */
                   2674:            IDENTIFIER_GLOBAL_VALUE (name)
                   2675:              = TREE_CODE_CLASS (TREE_CODE (x)) == 'd'
                   2676:                ? x : build_decl (TYPE_DECL, NULL, TREE_TYPE (x));
                   2677: #else
1.1       root     2678:            IDENTIFIER_GLOBAL_VALUE (name) = x;
1.1.1.4   root     2679: #endif
1.1       root     2680: 
                   2681:          /* Don't forget if the function was used via an implicit decl.  */
                   2682:          if (IDENTIFIER_IMPLICIT_DECL (name)
                   2683:              && TREE_USED (IDENTIFIER_IMPLICIT_DECL (name)))
                   2684:            TREE_USED (x) = 1;
                   2685: 
                   2686:          /* Don't forget if its address was taken in that way.  */
                   2687:          if (IDENTIFIER_IMPLICIT_DECL (name)
                   2688:              && TREE_ADDRESSABLE (IDENTIFIER_IMPLICIT_DECL (name)))
                   2689:            TREE_ADDRESSABLE (x) = 1;
                   2690: 
                   2691:          /* Warn about mismatches against previous implicit decl.  */
1.1.1.5 ! root     2692:          if (IDENTIFIER_IMPLICIT_DECL (name) != NULL_TREE
1.1       root     2693:              /* If this real decl matches the implicit, don't complain.  */
                   2694:              && ! (TREE_CODE (x) == FUNCTION_DECL
                   2695:                    && TREE_TYPE (TREE_TYPE (x)) == integer_type_node))
                   2696:            warning ("`%s' was previously implicitly declared to return `int'",
                   2697:                     lang_printable_name (x));
                   2698: 
                   2699:          /* If this decl is `static' and an `extern' was seen previously,
                   2700:             that is erroneous.  Don't do this for TYPE_DECLs.  */
                   2701:          if (TREE_PUBLIC (name)
                   2702:              && TREE_CODE (x) != TYPE_DECL
1.1.1.4   root     2703:              && ! TREE_PUBLIC (x) && ! DECL_EXTERNAL (x))
1.1       root     2704:            {
                   2705:              if (IDENTIFIER_IMPLICIT_DECL (name))
                   2706:                warning ("`%s' was declared implicitly `extern' and later `static'",
                   2707:                         lang_printable_name (x));
                   2708:              else
                   2709:                warning ("`%s' was declared `extern' and later `static'",
                   2710:                         lang_printable_name (x));
                   2711:            }
                   2712:        }
                   2713:       else
                   2714:        {
                   2715:          /* Here to install a non-global value.  */
                   2716:          tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
                   2717:          tree oldglobal = IDENTIFIER_GLOBAL_VALUE (name);
                   2718:          set_identifier_local_value (name, x);
                   2719: 
                   2720:          /* If this is an extern function declaration, see if we
1.1.1.4   root     2721:             have a global definition or declaration for the function.  */
1.1.1.5 ! root     2722:          if (oldlocal == NULL_TREE
1.1.1.4   root     2723:              && DECL_EXTERNAL (x) && !DECL_INLINE (x)
1.1.1.5 ! root     2724:              && oldglobal != NULL_TREE
1.1       root     2725:              && TREE_CODE (x) == FUNCTION_DECL
                   2726:              && TREE_CODE (oldglobal) == FUNCTION_DECL)
                   2727:            {
                   2728:              /* We have one.  Their types must agree.  */
                   2729:              if (! comptypes (TREE_TYPE (x), TREE_TYPE (oldglobal), 1))
1.1.1.4   root     2730:                warning_with_decl (x, "extern declaration of `%s' doesn't match global one");
                   2731:              else
                   2732:                {
                   2733:                  /* Inner extern decl is inline if global one is.
                   2734:                     Copy enough to really inline it.  */
                   2735:                  if (DECL_INLINE (oldglobal))
                   2736:                    {
                   2737:                      DECL_INLINE (x) = DECL_INLINE (oldglobal);
                   2738:                      DECL_INITIAL (x) = (current_function_decl == oldglobal
1.1.1.5 ! root     2739:                                          ? NULL_TREE : DECL_INITIAL (oldglobal));
1.1.1.4   root     2740:                      DECL_SAVED_INSNS (x) = DECL_SAVED_INSNS (oldglobal);
                   2741:                      DECL_ARGUMENTS (x) = DECL_ARGUMENTS (oldglobal);
                   2742:                      DECL_RESULT (x) = DECL_RESULT (oldglobal);
                   2743:                      TREE_ASM_WRITTEN (x) = TREE_ASM_WRITTEN (oldglobal);
                   2744:                      DECL_ABSTRACT_ORIGIN (x) = oldglobal;
                   2745:                    }
                   2746:                  /* Inner extern decl is built-in if global one is.  */
                   2747:                  if (DECL_BUILT_IN (oldglobal))
                   2748:                    {
                   2749:                      DECL_BUILT_IN (x) = DECL_BUILT_IN (oldglobal);
                   2750:                      DECL_SET_FUNCTION_CODE (x, DECL_FUNCTION_CODE (oldglobal));
                   2751:                    }
                   2752:                  /* Keep the arg types from a file-scope fcn defn.  */
1.1.1.5 ! root     2753:                  if (TYPE_ARG_TYPES (TREE_TYPE (oldglobal)) != NULL_TREE
1.1.1.4   root     2754:                      && DECL_INITIAL (oldglobal)
1.1.1.5 ! root     2755:                      && TYPE_ARG_TYPES (TREE_TYPE (x)) == NULL_TREE)
1.1.1.4   root     2756:                    TREE_TYPE (x) = TREE_TYPE (oldglobal);
                   2757:                }
1.1       root     2758:            }
                   2759:          /* If we have a local external declaration,
                   2760:             and no file-scope declaration has yet been seen,
                   2761:             then if we later have a file-scope decl it must not be static.  */
1.1.1.5 ! root     2762:          if (oldlocal == NULL_TREE
        !          2763:              && oldglobal == NULL_TREE
1.1.1.4   root     2764:              && DECL_EXTERNAL (x)
1.1       root     2765:              && TREE_PUBLIC (x))
                   2766:            {
                   2767:              TREE_PUBLIC (name) = 1;
                   2768:            }
                   2769: 
                   2770:          if (DECL_FROM_INLINE (x))
                   2771:            /* Inline decls shadow nothing.  */;
                   2772: 
                   2773:          /* Warn if shadowing an argument at the top level of the body.  */
1.1.1.5 ! root     2774:          else if (oldlocal != NULL_TREE && !DECL_EXTERNAL (x)
1.1       root     2775:              && TREE_CODE (oldlocal) == PARM_DECL
                   2776:              && TREE_CODE (x) != PARM_DECL)
                   2777:            {
                   2778:              /* Go to where the parms should be and see if we
                   2779:                 find them there.  */
                   2780:              struct binding_level *b = current_binding_level->level_chain;
                   2781: 
                   2782:              if (cleanup_label)
                   2783:                b = b->level_chain;
                   2784: 
1.1.1.5 ! root     2785:              /* ARM $8.3 */
1.1       root     2786:              if (b->parm_flag == 1)
1.1.1.5 ! root     2787:                pedwarn ("declaration of `%s' shadows a parameter",
1.1       root     2788:                         IDENTIFIER_POINTER (name));
                   2789:            }
                   2790:          /* Maybe warn if shadowing something else.  */
1.1.1.4   root     2791:          else if (warn_shadow && !DECL_EXTERNAL (x)
1.1.1.3   root     2792:                   /* No shadow warnings for internally generated vars.  */
1.1.1.4   root     2793:                   && DECL_SOURCE_LINE (x) != 0
1.1       root     2794:                   /* No shadow warnings for vars made for inlining.  */
                   2795:                   && ! DECL_FROM_INLINE (x))
                   2796:            {
1.1.1.5 ! root     2797:              char *warnstring = NULL;
1.1       root     2798: 
1.1.1.5 ! root     2799:              if (oldlocal != NULL_TREE && TREE_CODE (oldlocal) == PARM_DECL)
1.1       root     2800:                warnstring = "declaration of `%s' shadows a parameter";
1.1.1.5 ! root     2801:              else if (IDENTIFIER_CLASS_VALUE (name) != NULL_TREE)
1.1       root     2802:                warnstring = "declaration of `%s' shadows a member of `this'";
1.1.1.5 ! root     2803:              else if (oldlocal != NULL_TREE)
1.1       root     2804:                warnstring = "declaration of `%s' shadows previous local";
1.1.1.5 ! root     2805:              else if (oldglobal != NULL_TREE)
1.1       root     2806:                warnstring = "declaration of `%s' shadows global declaration";
                   2807: 
                   2808:              if (warnstring)
                   2809:                warning (warnstring, IDENTIFIER_POINTER (name));
                   2810:            }
                   2811: 
                   2812:          /* If storing a local value, there may already be one (inherited).
                   2813:             If so, record it for restoration when this binding level ends.  */
1.1.1.5 ! root     2814:          if (oldlocal != NULL_TREE)
1.1       root     2815:            b->shadowed = tree_cons (name, oldlocal, b->shadowed);
                   2816:        }
                   2817: 
                   2818:       /* Keep count of variables in this level with incomplete type.  */
                   2819:       if (TREE_CODE (x) != TEMPLATE_DECL
                   2820:          && TREE_CODE (x) != CPLUS_CATCH_DECL
1.1.1.5 ! root     2821:          && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE
1.1       root     2822:          && PROMOTES_TO_AGGR_TYPE (TREE_TYPE (x), ARRAY_TYPE))
                   2823:        {
                   2824:          if (++b->n_incomplete == 0)
                   2825:            error ("too many incomplete variables at this point");
                   2826:        }
                   2827:     }
                   2828: 
                   2829:   if (TREE_CODE (x) == TYPE_DECL && name != NULL_TREE)
                   2830:     {
                   2831:       adjust_type_value (name);
                   2832:       if (current_class_name)
                   2833:        {
                   2834:          if (!DECL_NESTED_TYPENAME (x))
                   2835:            set_nested_typename (x, current_class_name, DECL_NAME (x),
                   2836:                                 TREE_TYPE (x));
                   2837:          adjust_type_value (DECL_NESTED_TYPENAME (x));
                   2838:        }
                   2839:     }
                   2840: 
                   2841:   /* Put decls on list in reverse order.
                   2842:      We will reverse them later if necessary.  */
                   2843:   TREE_CHAIN (x) = b->names;
                   2844:   b->names = x;
1.1.1.4   root     2845:   if (! (b != global_binding_level || TREE_PERMANENT (x)))
                   2846:     my_friendly_abort (124);
1.1       root     2847: 
                   2848:   return x;
                   2849: }
                   2850: 
                   2851: /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL,
                   2852:    if appropriate.  */
                   2853: tree
                   2854: pushdecl_top_level (x)
                   2855:      tree x;
                   2856: {
                   2857:   register tree t;
                   2858:   register struct binding_level *b = current_binding_level;
                   2859: 
                   2860:   current_binding_level = global_binding_level;
                   2861:   t = pushdecl (x);
                   2862:   current_binding_level = b;
                   2863:   if (class_binding_level)
                   2864:     b = class_binding_level;
                   2865:   /* Now, the type_shadowed stack may screw us.  Munge it so it does
                   2866:      what we want.  */
                   2867:   if (TREE_CODE (x) == TYPE_DECL)
                   2868:     {
                   2869:       tree name = DECL_NAME (x);
                   2870:       tree newval;
1.1.1.5 ! root     2871:       tree *ptr = (tree *)0;
1.1       root     2872:       for (; b != global_binding_level; b = b->level_chain)
                   2873:         {
                   2874:           tree shadowed = b->type_shadowed;
                   2875:           for (; shadowed; shadowed = TREE_CHAIN (shadowed))
                   2876:             if (TREE_PURPOSE (shadowed) == name)
                   2877:               {
                   2878:                ptr = &TREE_VALUE (shadowed);
                   2879:                /* Can't break out of the loop here because sometimes
                   2880:                   a binding level will have duplicate bindings for
                   2881:                   PT names.  It's gross, but I haven't time to fix it.  */
                   2882:               }
                   2883:         }
                   2884:       newval = TREE_TYPE (x);
1.1.1.5 ! root     2885:       if (ptr == (tree *)0)
1.1       root     2886:         {
                   2887:           /* @@ This shouldn't be needed.  My test case "zstring.cc" trips
                   2888:              up here if this is changed to an assertion.  --KR  */
                   2889:          SET_IDENTIFIER_TYPE_VALUE (name, newval);
                   2890:        }
                   2891:       else
                   2892:         {
1.1.1.4   root     2893: #if 0
                   2894:          /* Disabled this 11/10/92, since there are many cases which
                   2895:             behave just fine when *ptr doesn't satisfy either of these.
                   2896:             For example, nested classes declared as friends of their enclosing
                   2897:             class will not meet this criteria.  (bpk) */
                   2898:          my_friendly_assert (*ptr == NULL_TREE || *ptr == newval, 141);
                   2899: #endif
1.1       root     2900:          *ptr = newval;
                   2901:         }
                   2902:     }
                   2903:   return t;
                   2904: }
                   2905: 
                   2906: /* Like push_overloaded_decl, only it places X in GLOBAL_BINDING_LEVEL,
                   2907:    if appropriate.  */
                   2908: void
                   2909: push_overloaded_decl_top_level (x, forget)
                   2910:      tree x;
                   2911:      int forget;
                   2912: {
                   2913:   struct binding_level *b = current_binding_level;
                   2914: 
                   2915:   current_binding_level = global_binding_level;
                   2916:   push_overloaded_decl (x, forget);
                   2917:   current_binding_level = b;
                   2918: }
                   2919: 
                   2920: /* Make the declaration of X appear in CLASS scope.  */
                   2921: tree
                   2922: pushdecl_class_level (x)
                   2923:      tree x;
                   2924: {
                   2925:   /* Don't use DECL_ASSEMBLER_NAME here!  Everything that looks in class
                   2926:      scope looks for the pre-mangled name.  */
                   2927:   register tree name = DECL_NAME (x);
                   2928: 
                   2929:   if (name)
                   2930:     {
                   2931:       tree oldclass = IDENTIFIER_CLASS_VALUE (name);
                   2932:       if (oldclass)
                   2933:        class_binding_level->class_shadowed
                   2934:          = tree_cons (name, oldclass, class_binding_level->class_shadowed);
                   2935:       IDENTIFIER_CLASS_VALUE (name) = x;
                   2936:       obstack_ptr_grow (&decl_obstack, x);
                   2937:       if (TREE_CODE (x) == TYPE_DECL && !DECL_NESTED_TYPENAME (x))
                   2938:        set_nested_typename (x, current_class_name, name, TREE_TYPE (x));
                   2939:     }
                   2940:   return x;
                   2941: }
                   2942: 
                   2943: /* Tell caller how to interpret a TREE_LIST which contains
                   2944:    chains of FUNCTION_DECLS.  */
                   2945: int
                   2946: overloaded_globals_p (list)
                   2947:      tree list;
                   2948: {
1.1.1.4   root     2949:   my_friendly_assert (TREE_CODE (list) == TREE_LIST, 142);
1.1       root     2950: 
                   2951:   /* Don't commit caller to seeing them as globals.  */
                   2952:   if (TREE_NONLOCAL_FLAG (list))
                   2953:     return -1;
                   2954:   /* Do commit caller to seeing them as globals.  */
                   2955:   if (TREE_CODE (TREE_PURPOSE (list)) == IDENTIFIER_NODE)
                   2956:     return 1;
                   2957:   /* Do commit caller to not seeing them as globals.  */
                   2958:   return 0;
                   2959: }
                   2960: 
                   2961: /* DECL is a FUNCTION_DECL which may have other definitions already in place.
                   2962:    We get around this by making IDENTIFIER_GLOBAL_VALUE (DECL_NAME (DECL))
                   2963:    point to a list of all the things that want to be referenced by that name.
                   2964:    It is then up to the users of that name to decide what to do with that
                   2965:    list.
                   2966: 
                   2967:    DECL may also be a TEMPLATE_DECL, with a FUNCTION_DECL in its DECL_RESULT
                   2968:    slot.  It is dealt with the same way.
                   2969: 
                   2970:    The value returned may be a previous declaration if we guessed wrong
                   2971:    about what language DECL should belong to (C or C++).  Otherwise,
                   2972:    it's always DECL (and never something that's not a _DECL).  */
                   2973: tree
                   2974: push_overloaded_decl (decl, forgettable)
                   2975:      tree decl;
                   2976:      int forgettable;
                   2977: {
                   2978:   tree orig_name = DECL_NAME (decl);
                   2979:   tree glob = IDENTIFIER_GLOBAL_VALUE (orig_name);
                   2980: 
                   2981:   DECL_OVERLOADED (decl) = 1;
                   2982:   if (glob)
                   2983:     {
                   2984:       if (TREE_CODE (glob) != TREE_LIST)
                   2985:        {
                   2986:          if (DECL_LANGUAGE (decl) == lang_c)
                   2987:            {
                   2988:              if (TREE_CODE (glob) == FUNCTION_DECL)
                   2989:                {
                   2990:                  if (DECL_LANGUAGE (glob) == lang_c)
                   2991:                    {
                   2992:                      error_with_decl (decl, "C-language function `%s' overloaded here");
                   2993:                      error_with_decl (glob, "Previous C-language version of this function was `%s'");
                   2994:                    }
                   2995:                }
                   2996:              else
1.1.1.3   root     2997:                my_friendly_abort (9);
1.1       root     2998:            }
                   2999:          if (forgettable
                   3000:              && ! flag_traditional
                   3001:              && TREE_PERMANENT (glob) == 1
                   3002:              && !global_bindings_p ())
                   3003:            overloads_to_forget = tree_cons (orig_name, glob, overloads_to_forget);
                   3004:          /* We cache the value of builtin functions as ADDR_EXPRs
                   3005:             in the name space.  Convert it to some kind of _DECL after
                   3006:             remembering what to forget.  */
                   3007:          if (TREE_CODE (glob) == ADDR_EXPR)
                   3008:            glob = TREE_OPERAND (glob, 0);
                   3009: 
                   3010:          if (TREE_CODE (glob) == FUNCTION_DECL
                   3011:              && DECL_LANGUAGE (glob) != DECL_LANGUAGE (decl)
                   3012:              && comptypes (TREE_TYPE (glob), TREE_TYPE (decl), 1))
                   3013:            {
                   3014:              if (current_lang_stack == current_lang_base)
                   3015:                {
                   3016:                  DECL_LANGUAGE (decl) = DECL_LANGUAGE (glob);
                   3017:                  return glob;
                   3018:                }
                   3019:              else
                   3020:                {
                   3021:                  error_with_decl (decl, "conflicting language contexts for declaration of `%s';");
                   3022:                  error_with_decl (glob, "conflicts with previous declaration here");
                   3023:                }
                   3024:            }
                   3025:          if (pedantic && TREE_CODE (glob) == VAR_DECL)
                   3026:            {
1.1.1.4   root     3027:              my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (glob)) == 'd', 143);
1.1       root     3028:              error_with_decl (glob, "non-function declaration `%s'");
                   3029:              error_with_decl (decl, "conflicts with function declaration `%s'");
                   3030:            }
1.1.1.2   root     3031:          glob = tree_cons (orig_name, glob, NULL_TREE);
1.1       root     3032:          glob = tree_cons (TREE_PURPOSE (glob), decl, glob);
                   3033:          IDENTIFIER_GLOBAL_VALUE (orig_name) = glob;
                   3034:          TREE_TYPE (glob) = unknown_type_node;
                   3035:          return decl;
                   3036:        }
                   3037: 
                   3038:       if (TREE_VALUE (glob) == NULL_TREE)
                   3039:        {
                   3040:          TREE_VALUE (glob) = decl;
                   3041:          return decl;
                   3042:        }
                   3043:       if (TREE_CODE (decl) != TEMPLATE_DECL)
                   3044:         {
                   3045:           tree name = DECL_ASSEMBLER_NAME (decl);
                   3046:           tree tmp;
                   3047:          
                   3048:          for (tmp = glob; tmp; tmp = TREE_CHAIN (tmp))
                   3049:            {
                   3050:              if (TREE_CODE (TREE_VALUE (tmp)) == FUNCTION_DECL
                   3051:                  && DECL_LANGUAGE (TREE_VALUE (tmp)) != DECL_LANGUAGE (decl)
                   3052:                  && comptypes (TREE_TYPE (TREE_VALUE (tmp)), TREE_TYPE (decl),
                   3053:                                1))
                   3054:                {
                   3055:                  error_with_decl (decl,
                   3056:                                   "conflicting language contexts for declaration of `%s';");
                   3057:                  error_with_decl (TREE_VALUE (tmp),
                   3058:                                   "conflicts with previous declaration here");
                   3059:                }
                   3060:              if (TREE_CODE (TREE_VALUE (tmp)) != TEMPLATE_DECL
                   3061:                  && DECL_ASSEMBLER_NAME (TREE_VALUE (tmp)) == name)
                   3062:                return decl;
                   3063:            }
                   3064:        }
                   3065:     }
                   3066:   if (DECL_LANGUAGE (decl) == lang_c)
                   3067:     {
                   3068:       tree decls = glob;
                   3069:       while (decls && DECL_LANGUAGE (TREE_VALUE (decls)) == lang_cplusplus)
                   3070:        decls = TREE_CHAIN (decls);
                   3071:       if (decls)
                   3072:        {
                   3073:          error_with_decl (decl, "C-language function `%s' overloaded here");
                   3074:          error_with_decl (TREE_VALUE (decls), "Previous C-language version of this function was `%s'");
                   3075:        }
                   3076:     }
                   3077: 
                   3078:   if (forgettable
                   3079:       && ! flag_traditional
1.1.1.5 ! root     3080:       && (glob == NULL_TREE || TREE_PERMANENT (glob) == 1)
1.1.1.4   root     3081:       && !global_bindings_p ()
                   3082:       && !pseudo_global_level_p ())
1.1       root     3083:     overloads_to_forget = tree_cons (orig_name, glob, overloads_to_forget);
                   3084:   glob = tree_cons (orig_name, decl, glob);
                   3085:   IDENTIFIER_GLOBAL_VALUE (orig_name) = glob;
                   3086:   TREE_TYPE (glob) = unknown_type_node;
                   3087:   return decl;
                   3088: }
                   3089: 
                   3090: /* Generate an implicit declaration for identifier FUNCTIONID
                   3091:    as a function of type int ().  Print a warning if appropriate.  */
                   3092: 
                   3093: tree
                   3094: implicitly_declare (functionid)
                   3095:      tree functionid;
                   3096: {
                   3097:   register tree decl;
                   3098:   int temp = allocation_temporary_p ();
                   3099: 
                   3100:   push_obstacks_nochange ();
                   3101: 
                   3102:   /* Save the decl permanently so we can warn if definition follows.
                   3103:      In ANSI C, warn_implicit is usually false, so the saves little space.
                   3104:      But in C++, it's usually true, hence the extra code.  */
                   3105:   if (temp && (flag_traditional || !warn_implicit
                   3106:               || current_binding_level == global_binding_level))
                   3107:     end_temporary_allocation ();
                   3108: 
                   3109:   /* We used to reuse an old implicit decl here,
                   3110:      but this loses with inline functions because it can clobber
                   3111:      the saved decl chains.  */
1.1.1.5 ! root     3112:   decl = build_lang_decl (FUNCTION_DECL, functionid, default_function_type);
1.1       root     3113: 
1.1.1.4   root     3114:   DECL_EXTERNAL (decl) = 1;
1.1       root     3115:   TREE_PUBLIC (decl) = 1;
                   3116: 
                   3117:   /* ANSI standard says implicit declarations are in the innermost block.
                   3118:      So we record the decl in the standard fashion.
                   3119:      If flag_traditional is set, pushdecl does it top-level.  */
                   3120:   pushdecl (decl);
1.1.1.5 ! root     3121:   rest_of_decl_compilation (decl, NULL_PTR, 0, 0);
1.1       root     3122: 
                   3123:   if (warn_implicit
                   3124:       /* Only one warning per identifier.  */
1.1.1.5 ! root     3125:       && IDENTIFIER_IMPLICIT_DECL (functionid) == NULL_TREE)
1.1       root     3126:     {
1.1.1.3   root     3127:       pedwarn ("implicit declaration of function `%s'",
1.1       root     3128:               IDENTIFIER_POINTER (functionid));
                   3129:     }
                   3130: 
                   3131:   SET_IDENTIFIER_IMPLICIT_DECL (functionid, decl);
                   3132: 
                   3133:   pop_obstacks ();
                   3134: 
                   3135:   return decl;
                   3136: }
                   3137: 
                   3138: /* Return zero if the declaration NEWDECL is valid
                   3139:    when the declaration OLDDECL (assumed to be for the same name)
                   3140:    has already been seen.
                   3141:    Otherwise return an error message format string with a %s
                   3142:    where the identifier should go.  */
                   3143: 
                   3144: static char *
                   3145: redeclaration_error_message (newdecl, olddecl)
                   3146:      tree newdecl, olddecl;
                   3147: {
                   3148:   if (TREE_CODE (newdecl) == TYPE_DECL)
                   3149:     {
                   3150:       /* Because C++ can put things into name space for free,
                   3151:         constructs like "typedef struct foo { ... } foo"
                   3152:         would look like an erroneous redeclaration.  */
                   3153:       if (TREE_TYPE (olddecl) == TREE_TYPE (newdecl))
                   3154:        return 0;
                   3155:       else
                   3156:        return "redefinition of `%s'";
                   3157:     }
                   3158:   else if (TREE_CODE (newdecl) == FUNCTION_DECL)
                   3159:     {
1.1.1.4   root     3160:       /* If this is a pure function, its olddecl will actually be
                   3161:         the original initialization to `0' (which we force to call
                   3162:         abort()).  Don't complain about redefinition in this case.  */
                   3163:       if (DECL_LANG_SPECIFIC (olddecl) && DECL_ABSTRACT_VIRTUAL_P (olddecl))
                   3164:        return 0;
                   3165: 
1.1       root     3166:       /* Declarations of functions can insist on internal linkage
                   3167:         but they can't be inconsistent with internal linkage,
                   3168:         so there can be no error on that account.
                   3169:         However defining the same name twice is no good.  */
1.1.1.5 ! root     3170:       if (DECL_INITIAL (olddecl) != NULL_TREE
        !          3171:          && DECL_INITIAL (newdecl) != NULL_TREE
1.1       root     3172:          /* However, defining once as extern inline and a second
                   3173:             time in another way is ok.  */
1.1.1.4   root     3174:          && !(DECL_INLINE (olddecl) && DECL_EXTERNAL (olddecl)
                   3175:               && !(DECL_INLINE (newdecl) && DECL_EXTERNAL (newdecl))))
1.1       root     3176:        {
                   3177:          if (DECL_NAME (olddecl) == NULL_TREE)
                   3178:            return "`%s' not declared in class";
                   3179:          else
                   3180:            return "redefinition of `%s'";
                   3181:        }
                   3182:       return 0;
                   3183:     }
                   3184:   else if (current_binding_level == global_binding_level)
                   3185:     {
                   3186:       /* Objects declared at top level:  */
                   3187:       /* If at least one is a reference, it's ok.  */
1.1.1.4   root     3188:       if (DECL_EXTERNAL (newdecl) || DECL_EXTERNAL (olddecl))
1.1       root     3189:        return 0;
                   3190:       /* Reject two definitions.  */
1.1.1.5 ! root     3191:       if (DECL_INITIAL (olddecl) != NULL_TREE
        !          3192:          && DECL_INITIAL (newdecl) != NULL_TREE)
1.1       root     3193:        return "redefinition of `%s'";
                   3194:       /* Now we have two tentative defs, or one tentative and one real def.  */
                   3195:       /* Insist that the linkage match.  */
                   3196:       if (TREE_PUBLIC (olddecl) != TREE_PUBLIC (newdecl))
                   3197:        return "conflicting declarations of `%s'";
                   3198:       return 0;
                   3199:     }
                   3200:   else
                   3201:     {
                   3202:       /* Objects declared with block scope:  */
                   3203:       /* Reject two definitions, and reject a definition
                   3204:         together with an external reference.  */
1.1.1.4   root     3205:       if (!(DECL_EXTERNAL (newdecl) && DECL_EXTERNAL (olddecl)))
1.1       root     3206:        return "redeclaration of `%s'";
                   3207:       return 0;
                   3208:     }
                   3209: }
                   3210: 
                   3211: /* Get the LABEL_DECL corresponding to identifier ID as a label.
                   3212:    Create one if none exists so far for the current function.
                   3213:    This function is called for both label definitions and label references.  */
                   3214: 
                   3215: tree
                   3216: lookup_label (id)
                   3217:      tree id;
                   3218: {
                   3219:   register tree decl = IDENTIFIER_LABEL_VALUE (id);
                   3220: 
1.1.1.5 ! root     3221:   if ((decl == NULL_TREE
1.1       root     3222:       || DECL_SOURCE_LINE (decl) == 0)
                   3223:       && (named_label_uses == 0
                   3224:          || TREE_PURPOSE (named_label_uses) != current_binding_level->names
                   3225:          || TREE_VALUE (named_label_uses) != decl))
                   3226:     {
                   3227:       named_label_uses
                   3228:        = tree_cons (current_binding_level->names, decl, named_label_uses);
                   3229:       TREE_TYPE (named_label_uses) = (tree)current_binding_level;
                   3230:     }
                   3231: 
1.1.1.2   root     3232:   /* Use a label already defined or ref'd with this name.  */
1.1.1.5 ! root     3233:   if (decl != NULL_TREE)
1.1.1.2   root     3234:     {
                   3235:       /* But not if it is inherited and wasn't declared to be inheritable.  */
                   3236:       if (DECL_CONTEXT (decl) != current_function_decl
                   3237:          && ! C_DECLARED_LABEL_FLAG (decl))
                   3238:        return shadow_label (id);
                   3239:       return decl;
                   3240:     }
1.1       root     3241: 
                   3242:   decl = build_decl (LABEL_DECL, id, void_type_node);
                   3243: 
                   3244:   /* A label not explicitly declared must be local to where it's ref'd.  */
                   3245:   DECL_CONTEXT (decl) = current_function_decl;
                   3246: 
                   3247:   DECL_MODE (decl) = VOIDmode;
                   3248: 
                   3249:   /* Say where one reference is to the label,
                   3250:      for the sake of the error if it is not defined.  */
                   3251:   DECL_SOURCE_LINE (decl) = lineno;
                   3252:   DECL_SOURCE_FILE (decl) = input_filename;
                   3253: 
                   3254:   SET_IDENTIFIER_LABEL_VALUE (id, decl);
                   3255: 
                   3256:   named_labels = tree_cons (NULL_TREE, decl, named_labels);
                   3257:   TREE_VALUE (named_label_uses) = decl;
                   3258: 
                   3259:   return decl;
                   3260: }
                   3261: 
1.1.1.2   root     3262: /* Make a label named NAME in the current function,
                   3263:    shadowing silently any that may be inherited from containing functions
                   3264:    or containing scopes.
                   3265: 
                   3266:    Note that valid use, if the label being shadowed
                   3267:    comes from another scope in the same function,
                   3268:    requires calling declare_nonlocal_label right away.  */
                   3269: 
                   3270: tree
                   3271: shadow_label (name)
                   3272:      tree name;
                   3273: {
                   3274:   register tree decl = IDENTIFIER_LABEL_VALUE (name);
                   3275: 
1.1.1.5 ! root     3276:   if (decl != NULL_TREE)
1.1.1.2   root     3277:     {
                   3278:       shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels);
                   3279:       SET_IDENTIFIER_LABEL_VALUE (name, 0);
                   3280:       SET_IDENTIFIER_LABEL_VALUE (decl, 0);
                   3281:     }
                   3282: 
                   3283:   return lookup_label (name);
                   3284: }
                   3285: 
1.1       root     3286: /* Define a label, specifying the location in the source file.
                   3287:    Return the LABEL_DECL node for the label, if the definition is valid.
                   3288:    Otherwise return 0.  */
                   3289: 
                   3290: tree
                   3291: define_label (filename, line, name)
                   3292:      char *filename;
                   3293:      int line;
                   3294:      tree name;
                   3295: {
                   3296:   tree decl = lookup_label (name);
                   3297: 
                   3298:   /* After labels, make any new cleanups go into their
                   3299:      own new (temporary) binding contour.  */
                   3300:   current_binding_level->more_cleanups_ok = 0;
                   3301: 
1.1.1.2   root     3302:   /* If label with this name is known from an outer context, shadow it.  */
1.1.1.5 ! root     3303:   if (decl != NULL_TREE && DECL_CONTEXT (decl) != current_function_decl)
1.1.1.2   root     3304:     {
                   3305:       shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels);
                   3306:       SET_IDENTIFIER_LABEL_VALUE (name, 0);
                   3307:       decl = lookup_label (name);
                   3308:     }
                   3309: 
1.1.1.5 ! root     3310:   if (DECL_INITIAL (decl) != NULL_TREE)
1.1       root     3311:     {
                   3312:       error_with_decl (decl, "duplicate label `%s'");
                   3313:       return 0;
                   3314:     }
                   3315:   else
                   3316:     {
                   3317:       tree uses, prev;
                   3318: 
                   3319:       /* Mark label as having been defined.  */
                   3320:       DECL_INITIAL (decl) = error_mark_node;
                   3321:       /* Say where in the source.  */
                   3322:       DECL_SOURCE_FILE (decl) = filename;
                   3323:       DECL_SOURCE_LINE (decl) = line;
                   3324: 
1.1.1.5 ! root     3325:       for (prev = NULL_TREE, uses = named_label_uses;
1.1       root     3326:           uses;
                   3327:           prev = uses, uses = TREE_CHAIN (uses))
                   3328:        if (TREE_VALUE (uses) == decl)
                   3329:          {
                   3330:            struct binding_level *b = current_binding_level;
1.1.1.5 ! root     3331:            while (b)
1.1       root     3332:              {
                   3333:                tree new_decls = b->names;
                   3334:                tree old_decls = ((tree)b == TREE_TYPE (uses)
                   3335:                                  ? TREE_PURPOSE (uses) : NULL_TREE);
                   3336:                while (new_decls != old_decls)
                   3337:                  {
                   3338:                    if (TREE_CODE (new_decls) == VAR_DECL
                   3339:                        /* Don't complain about crossing initialization
1.1.1.5 ! root     3340:                           of internal entities.  They can't be accessed,
1.1       root     3341:                           and they should be cleaned up
                   3342:                           by the time we get to the label.  */
1.1.1.5 ! root     3343:                        && DECL_SOURCE_LINE (new_decls) != 0
1.1       root     3344:                        && ((DECL_INITIAL (new_decls) != NULL_TREE
                   3345:                             && DECL_INITIAL (new_decls) != error_mark_node)
                   3346:                            || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (new_decls))))
                   3347:                      {
                   3348:                        if (IDENTIFIER_ERROR_LOCUS (decl) == NULL_TREE)
                   3349:                          error_with_decl (decl, "invalid jump to label `%s'");
                   3350:                        SET_IDENTIFIER_ERROR_LOCUS (decl, current_function_decl);
                   3351:                        error_with_decl (new_decls, "crosses initialization of `%s'");
                   3352:                      }
                   3353:                    new_decls = TREE_CHAIN (new_decls);
                   3354:                  }
                   3355:                if ((tree)b == TREE_TYPE (uses))
                   3356:                  break;
                   3357:                b = b->level_chain;
                   3358:              }
                   3359: 
                   3360:            if (prev)
                   3361:              TREE_CHAIN (prev) = TREE_CHAIN (uses);
                   3362:            else
                   3363:              named_label_uses = TREE_CHAIN (uses);
                   3364:          }
                   3365:       current_function_return_value = NULL_TREE;
                   3366:       return decl;
                   3367:     }
                   3368: }
                   3369: 
                   3370: /* Same, but for CASE labels.  If DECL is NULL_TREE, it's the default.  */
1.1.1.5 ! root     3371: /* XXX Note decl is never actually used. (bpk) */
1.1       root     3372: void
                   3373: define_case_label (decl)
                   3374:      tree decl;
                   3375: {
                   3376:   tree cleanup = last_cleanup_this_contour ();
                   3377:   if (cleanup)
                   3378:     {
                   3379:       static int explained = 0;
                   3380:       error_with_decl (TREE_PURPOSE (cleanup), "destructor needed for `%s'");
                   3381:       error ("where case label appears here");
                   3382:       if (!explained)
                   3383:        {
                   3384:          error ("(enclose actions of previous case statements requiring");
                   3385:          error ("destructors in their own binding contours.)");
                   3386:          explained = 1;
                   3387:        }
                   3388:     }
                   3389: 
                   3390:   /* After labels, make any new cleanups go into their
                   3391:      own new (temporary) binding contour.  */
                   3392: 
                   3393:   current_binding_level->more_cleanups_ok = 0;
                   3394:   current_function_return_value = NULL_TREE;
                   3395: }
                   3396: 
                   3397: /* Return the list of declarations of the current level.
                   3398:    Note that this list is in reverse order unless/until
                   3399:    you nreverse it; and when you do nreverse it, you must
                   3400:    store the result back using `storedecls' or you will lose.  */
                   3401: 
                   3402: tree
                   3403: getdecls ()
                   3404: {
                   3405:   return current_binding_level->names;
                   3406: }
                   3407: 
                   3408: /* Return the list of type-tags (for structs, etc) of the current level.  */
                   3409: 
                   3410: tree
                   3411: gettags ()
                   3412: {
                   3413:   return current_binding_level->tags;
                   3414: }
                   3415: 
                   3416: /* Store the list of declarations of the current level.
                   3417:    This is done for the parameter declarations of a function being defined,
                   3418:    after they are modified in the light of any missing parameters.  */
                   3419: 
                   3420: static void
                   3421: storedecls (decls)
                   3422:      tree decls;
                   3423: {
                   3424:   current_binding_level->names = decls;
                   3425: }
                   3426: 
                   3427: /* Similarly, store the list of tags of the current level.  */
                   3428: 
                   3429: static void
                   3430: storetags (tags)
                   3431:      tree tags;
                   3432: {
                   3433:   current_binding_level->tags = tags;
                   3434: }
                   3435: 
                   3436: /* Given NAME, an IDENTIFIER_NODE,
                   3437:    return the structure (or union or enum) definition for that name.
                   3438:    Searches binding levels from BINDING_LEVEL up to the global level.
                   3439:    If THISLEVEL_ONLY is nonzero, searches only the specified context
                   3440:    (but skips any tag-transparent contexts to find one that is
                   3441:    meaningful for tags).
                   3442:    FORM says which kind of type the caller wants;
                   3443:    it is RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE.
                   3444:    If the wrong kind of type is found, and it's not a template, an error is
                   3445:    reported.  */
                   3446: 
                   3447: static tree
                   3448: lookup_tag (form, name, binding_level, thislevel_only)
                   3449:      enum tree_code form;
                   3450:      struct binding_level *binding_level;
                   3451:      tree name;
                   3452:      int thislevel_only;
                   3453: {
                   3454:   register struct binding_level *level;
                   3455: 
                   3456:   for (level = binding_level; level; level = level->level_chain)
                   3457:     {
                   3458:       register tree tail;
1.1.1.2   root     3459:       if (ANON_AGGRNAME_P (name))
                   3460:        for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
                   3461:          {
                   3462:            /* There's no need for error checking here, because
                   3463:               anon names are unique throughout the compilation.  */
1.1.1.3   root     3464:            if (TYPE_IDENTIFIER (TREE_VALUE (tail)) == name)
1.1       root     3465:              return TREE_VALUE (tail);
1.1.1.2   root     3466:          }
                   3467:       else
                   3468:        for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
                   3469:          {
                   3470:            if (TREE_PURPOSE (tail) == name)
                   3471:              {
                   3472:                enum tree_code code = TREE_CODE (TREE_VALUE (tail));
                   3473:                /* Should tighten this up; it'll probably permit
                   3474:                   UNION_TYPE and a struct template, for example.  */
                   3475:                if (code != form
                   3476:                    && !(form != ENUMERAL_TYPE
                   3477:                         && (code == TEMPLATE_DECL
                   3478:                             || code == UNINSTANTIATED_P_TYPE)))
                   3479:                           
                   3480:                  {
                   3481:                    /* Definition isn't the kind we were looking for.  */
                   3482:                    error ("`%s' defined as wrong kind of tag",
                   3483:                           IDENTIFIER_POINTER (name));
                   3484:                  }
                   3485:                return TREE_VALUE (tail);
                   3486:              }
                   3487:          }
1.1       root     3488:       if (thislevel_only && ! level->tag_transparent)
                   3489:        return NULL_TREE;
                   3490:       if (current_class_type && level->level_chain == global_binding_level)
                   3491:        {
                   3492:          /* Try looking in this class's tags before heading into
                   3493:             global binding level.  */
                   3494:          tree context = current_class_type;
                   3495:          while (context)
                   3496:            {
                   3497:              switch (TREE_CODE_CLASS (TREE_CODE (context)))
                   3498:                {
                   3499:                case 't':
                   3500:                  {
                   3501:                    tree these_tags = CLASSTYPE_TAGS (context);
1.1.1.2   root     3502:                    if (ANON_AGGRNAME_P (name))
                   3503:                      while (these_tags)
                   3504:                        {
1.1.1.3   root     3505:                          if (TYPE_IDENTIFIER (TREE_VALUE (these_tags))
1.1.1.2   root     3506:                              == name)
1.1       root     3507:                            return TREE_VALUE (tail);
1.1.1.2   root     3508:                          these_tags = TREE_CHAIN (these_tags);
                   3509:                        }
                   3510:                    else
                   3511:                      while (these_tags)
                   3512:                        {
                   3513:                          if (TREE_PURPOSE (these_tags) == name)
                   3514:                            {
                   3515:                              if (TREE_CODE (TREE_VALUE (these_tags)) != form)
                   3516:                                {
                   3517:                                  error ("`%s' defined as wrong kind of tag in class scope",
                   3518:                                         IDENTIFIER_POINTER (name));
                   3519:                                }
                   3520:                              return TREE_VALUE (tail);
                   3521:                            }
                   3522:                          these_tags = TREE_CHAIN (these_tags);
                   3523:                        }
1.1       root     3524:                    /* If this type is not yet complete, then don't
                   3525:                       look at its context.  */
                   3526:                    if (TYPE_SIZE (context) == NULL_TREE)
                   3527:                      goto no_context;
                   3528:                    /* Go to next enclosing type, if any.  */
                   3529:                    context = DECL_CONTEXT (TYPE_NAME (context));
                   3530:                    break;
                   3531:                  case 'd':
                   3532:                    context = DECL_CONTEXT (context);
                   3533:                    break;
                   3534:                  default:
1.1.1.3   root     3535:                    my_friendly_abort (10);
1.1       root     3536:                  }
                   3537:                  continue;
                   3538:                }
                   3539:            no_context:
                   3540:              break;
                   3541:            }
                   3542:        }
                   3543:     }
                   3544:   return NULL_TREE;
                   3545: }
                   3546: 
                   3547: void
                   3548: set_current_level_tags_transparency (tags_transparent)
1.1.1.4   root     3549:      int tags_transparent;
1.1       root     3550: {
                   3551:   current_binding_level->tag_transparent = tags_transparent;
                   3552: }
                   3553: 
                   3554: /* Given a type, find the tag that was defined for it and return the tag name.
                   3555:    Otherwise return 0.  However, the value can never be 0
                   3556:    in the cases in which this is used.
                   3557: 
                   3558:    C++: If NAME is non-zero, this is the new name to install.  This is
                   3559:    done when replacing anonymous tags with real tag names.  */
                   3560: 
                   3561: static tree
                   3562: lookup_tag_reverse (type, name)
                   3563:      tree type;
                   3564:      tree name;
                   3565: {
                   3566:   register struct binding_level *level;
                   3567: 
                   3568:   for (level = current_binding_level; level; level = level->level_chain)
                   3569:     {
                   3570:       register tree tail;
                   3571:       for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
                   3572:        {
                   3573:          if (TREE_VALUE (tail) == type)
                   3574:            {
                   3575:              if (name)
                   3576:                TREE_PURPOSE (tail) = name;
                   3577:              return TREE_PURPOSE (tail);
                   3578:            }
                   3579:        }
                   3580:     }
                   3581:   return NULL_TREE;
                   3582: }
                   3583: 
                   3584: /* Given type TYPE which was not declared in C++ language context,
1.1.1.2   root     3585:    attempt to find a name by which it is referred.  */
1.1       root     3586: tree
                   3587: typedecl_for_tag (tag)
                   3588:      tree tag;
                   3589: {
                   3590:   struct binding_level *b = current_binding_level;
                   3591: 
                   3592:   if (TREE_CODE (TYPE_NAME (tag)) == TYPE_DECL)
                   3593:     return TYPE_NAME (tag);
                   3594: 
                   3595:   while (b)
                   3596:     {
                   3597:       tree decls = b->names;
                   3598:       while (decls)
                   3599:        {
                   3600:          if (TREE_CODE (decls) == TYPE_DECL && TREE_TYPE (decls) == tag)
                   3601:            break;
                   3602:          decls = TREE_CHAIN (decls);
                   3603:        }
                   3604:       if (decls)
                   3605:        return decls;
                   3606:       b = b->level_chain;
                   3607:     }
                   3608:   return NULL_TREE;
                   3609: }
                   3610: 
                   3611: /* Called when we must retroactively globalize a type we previously
1.1.1.2   root     3612:    thought needed to be nested.  This happens, for example, when
1.1       root     3613:    a `friend class' declaration is seen for an undefined type.  */
                   3614: 
                   3615: static void
                   3616: globalize_nested_type (type)
                   3617:      tree type;
                   3618: {
                   3619:   tree t, prev = NULL_TREE, d = TYPE_NAME (type);
                   3620:   struct binding_level *b;
                   3621: 
1.1.1.4   root     3622:   my_friendly_assert (TREE_CODE (d) == TYPE_DECL, 144);
1.1       root     3623:   /* If the type value has already been globalized, then we're set.  */
                   3624:   if (IDENTIFIER_GLOBAL_VALUE (DECL_NAME (d)) == d)
                   3625:     return;
                   3626:   if (IDENTIFIER_HAS_TYPE_VALUE (DECL_NAME (d)))
                   3627:     {
                   3628:       /* If this type already made it into the global tags,
                   3629:         silently return.  */
                   3630:       if (value_member (type, global_binding_level->tags))
                   3631:        return;
                   3632:     }
                   3633: 
                   3634:   set_identifier_type_value (DECL_NESTED_TYPENAME (d), NULL_TREE);
                   3635:   DECL_NESTED_TYPENAME (d) = DECL_NAME (d);
                   3636:   DECL_CONTEXT (d) = NULL_TREE;
                   3637:   if (class_binding_level)
                   3638:     b = class_binding_level;
                   3639:   else
                   3640:     b = current_binding_level;
                   3641:   while (b != global_binding_level)
                   3642:     {
                   3643:       prev = NULL_TREE;
                   3644:       if (b->parm_flag == 2)
                   3645:        for (t = b->tags; t != NULL_TREE; prev = t, t = TREE_CHAIN (t))
                   3646:          if (TREE_VALUE (t) == type)
                   3647:            goto found;
                   3648:       b = b->level_chain;
                   3649:     }
                   3650:   /* We failed to find this tag anywhere up the binding chains.
                   3651:      B is now the global binding level... check there.  */
                   3652:   prev = NULL_TREE;
                   3653:   if (b->parm_flag == 2)
                   3654:     for (t = b->tags; t != NULL_TREE; prev = t, t = TREE_CHAIN (t))
                   3655:       if (TREE_VALUE (t) == type)
                   3656:        goto foundglobal;
                   3657:   /* It wasn't in global scope either, so this is an anonymous forward ref
                   3658:      of some kind; let it happen.  */
                   3659:   return;
                   3660: 
                   3661: foundglobal:
                   3662:   print_node_brief (stderr, "Tried to globalize already-global type ",
                   3663:                    type, 0);
1.1.1.3   root     3664:   my_friendly_abort (11);
1.1       root     3665: 
                   3666: found:
                   3667:   /* Pull the tag out of the nested binding contour.  */
                   3668:   if (prev)
                   3669:     TREE_CHAIN (prev) = TREE_CHAIN (t);
                   3670:   else
                   3671:     b->tags = TREE_CHAIN (t);
                   3672:   
                   3673:   set_identifier_type_value (TREE_PURPOSE (t), TREE_VALUE (t));
                   3674:   global_binding_level->tags
                   3675:     = perm_tree_cons (TREE_PURPOSE (t), TREE_VALUE (t),
                   3676:                      global_binding_level->tags);
                   3677: 
                   3678:   /* Pull the tag out of the class's tags (if there).
                   3679:      It won't show up if it appears e.g. in a parameter declaration
                   3680:      or definition of a member function of this type.  */
                   3681:   if (current_class_type != NULL_TREE)
                   3682:     {
                   3683:       for (t = CLASSTYPE_TAGS (current_class_type), prev = NULL_TREE;
                   3684:           t != NULL_TREE;
                   3685:           prev = t, t = TREE_CHAIN (t))
                   3686:        if (TREE_VALUE (t) == type)
                   3687:          break;
                   3688: 
                   3689:       if (t != NULL_TREE)
                   3690:        {
                   3691:          if (prev)
                   3692:            TREE_CHAIN (prev) = TREE_CHAIN (t);
                   3693:          else
                   3694:            CLASSTYPE_TAGS (current_class_type) = TREE_CHAIN (t);
                   3695:        }
                   3696:     }
                   3697: 
                   3698:   pushdecl_top_level (d);
                   3699: }
                   3700: 
                   3701: static void
                   3702: maybe_globalize_type (type)
                   3703:      tree type;
                   3704: {
                   3705:   if ((((TREE_CODE (type) == RECORD_TYPE
                   3706:         || TREE_CODE (type) == UNION_TYPE)
                   3707:        && ! TYPE_BEING_DEFINED (type))
                   3708:        || TREE_CODE (type) == ENUMERAL_TYPE)
                   3709:       && TYPE_SIZE (type) == NULL_TREE
                   3710:       /* This part is gross.  We keep calling here with types that
                   3711:         are instantiations of templates, when that type should is
                   3712:         global, or doesn't have the type decl established yet,
                   3713:         so globalizing will fail (because it won't find the type in any
                   3714:         non-global scope).  So we short-circuit that path.  */
                   3715:       && !(TYPE_NAME (type) != NULL_TREE
1.1.1.3   root     3716:           && TYPE_IDENTIFIER (type) != NULL_TREE
                   3717:           && ! IDENTIFIER_HAS_TYPE_VALUE (TYPE_IDENTIFIER (type)))
1.1       root     3718:       )
                   3719:     globalize_nested_type (type);
                   3720: }
                   3721: 
                   3722: /* Lookup TYPE in CONTEXT (a chain of nested types or a FUNCTION_DECL).
                   3723:    Return the type value, or NULL_TREE if not found.  */
                   3724: static tree
                   3725: lookup_nested_type (type, context)
                   3726:      tree type;
                   3727:      tree context;
                   3728: {
                   3729:   if (context == NULL_TREE)
                   3730:     return NULL_TREE;
                   3731:   while (context)
                   3732:     {
                   3733:       switch (TREE_CODE (context))
                   3734:        {
                   3735:        case TYPE_DECL:
                   3736:          {
                   3737:            tree ctype = TREE_TYPE (context);
                   3738:            tree match = value_member (type, CLASSTYPE_TAGS (ctype));
                   3739:            if (match)
                   3740:              return TREE_VALUE (match);
                   3741:            context = DECL_CONTEXT (context);
1.1.1.5 ! root     3742: 
        !          3743:            /* When we have a nested class whose member functions have
        !          3744:               local types (e.g., a set of enums), we'll arrive here
        !          3745:               with the DECL_CONTEXT as the actual RECORD_TYPE node for
        !          3746:               the enclosing class.  Instead, we want to make sure we
        !          3747:               come back in here with the TYPE_DECL, not the RECORD_TYPE.  */
        !          3748:            if (context && TREE_CODE (context) == RECORD_TYPE)
        !          3749:              context = TREE_CHAIN (context);
1.1       root     3750:          }
                   3751:          break;
                   3752:        case FUNCTION_DECL:
                   3753:          return TYPE_IDENTIFIER (type) ? lookup_name (TYPE_IDENTIFIER (type), 1) : NULL_TREE;
                   3754:          break;
                   3755:        default:
1.1.1.3   root     3756:          my_friendly_abort (12);
1.1       root     3757:        }
                   3758:     }
                   3759:   return NULL_TREE;
                   3760: }
                   3761: 
1.1.1.3   root     3762: /* Look up NAME in the current binding level and its superiors in the
                   3763:    namespace of variables, functions and typedefs.  Return a ..._DECL
                   3764:    node of some kind representing its definition if there is only one
                   3765:    such declaration, or return a TREE_LIST with all the overloaded
                   3766:    definitions if there are many, or return 0 if it is undefined.
1.1       root     3767: 
                   3768:    If PREFER_TYPE is > 0, we prefer TYPE_DECLs.
                   3769:    If PREFER_TYPE is = 0, we prefer non-TYPE_DECLs.
                   3770:    If PREFER_TYPE is < 0, we arbitrate according to lexical context.  */
                   3771: 
                   3772: tree
                   3773: lookup_name (name, prefer_type)
                   3774:      tree name;
1.1.1.4   root     3775:      int prefer_type;
1.1       root     3776: {
                   3777:   register tree val;
                   3778: 
                   3779:   if (current_binding_level != global_binding_level
                   3780:       && IDENTIFIER_LOCAL_VALUE (name))
                   3781:     val = IDENTIFIER_LOCAL_VALUE (name);
                   3782:   /* In C++ class fields are between local and global scope,
                   3783:      just before the global scope.  */
                   3784:   else if (current_class_type)
                   3785:     {
                   3786:       val = IDENTIFIER_CLASS_VALUE (name);
                   3787:       if (val == NULL_TREE
1.1.1.5 ! root     3788:          && TYPE_SIZE (current_class_type) == NULL_TREE
1.1       root     3789:          && CLASSTYPE_LOCAL_TYPEDECLS (current_class_type))
                   3790:        {
                   3791:          /* Try to find values from base classes
                   3792:             if we are presently defining a type.
                   3793:             We are presently only interested in TYPE_DECLs.  */
1.1.1.5 ! root     3794:          val = lookup_field (current_class_type, name, 0, prefer_type < 0);
1.1       root     3795:          if (val == error_mark_node)
                   3796:            return val;
                   3797:          if (val && TREE_CODE (val) != TYPE_DECL)
                   3798:            val = NULL_TREE;
                   3799:        }
1.1.1.5 ! root     3800: 
        !          3801:       /* yylex() calls this with -2, since we should never start digging for
        !          3802:         the nested name at the point where we haven't even, for example,
        !          3803:         created the COMPONENT_REF or anything like that.  */
1.1       root     3804:       if (val == NULL_TREE)
1.1.1.5 ! root     3805:        val = lookup_nested_field (name, prefer_type != -2);
        !          3806: 
1.1.1.4   root     3807:       if (val == NULL_TREE)
1.1       root     3808:        val = IDENTIFIER_GLOBAL_VALUE (name);
                   3809:     }
                   3810:   else
                   3811:     val = IDENTIFIER_GLOBAL_VALUE (name);
                   3812: 
                   3813:   if (val)
                   3814:     {
                   3815:       extern int looking_for_typename;
                   3816: 
                   3817:       /* Arbitrate between finding a TYPE_DECL and finding
                   3818:         other kinds of _DECLs.  */
                   3819:       if (TREE_CODE (val) == TYPE_DECL || looking_for_typename < 0)
                   3820:        return val;
                   3821: 
                   3822:       if (IDENTIFIER_HAS_TYPE_VALUE (name))
                   3823:        {
                   3824:          register tree val_as_type = TYPE_NAME (IDENTIFIER_TYPE_VALUE (name));
                   3825: 
                   3826:          if (val == val_as_type || prefer_type > 0
                   3827:              || looking_for_typename > 0)
                   3828:            return val_as_type;
                   3829:          if (prefer_type == 0)
                   3830:            return val;
                   3831:          return arbitrate_lookup (name, val, val_as_type);
                   3832:        }
                   3833:       if (TREE_TYPE (val) == error_mark_node)
                   3834:        return error_mark_node;
                   3835:     }
                   3836: 
                   3837:   return val;
                   3838: }
                   3839: 
                   3840: /* Similar to `lookup_name' but look only at current binding level.  */
                   3841: 
1.1.1.5 ! root     3842: tree
1.1       root     3843: lookup_name_current_level (name)
                   3844:      tree name;
                   3845: {
                   3846:   register tree t;
                   3847: 
                   3848:   if (current_binding_level == global_binding_level)
                   3849:     return IDENTIFIER_GLOBAL_VALUE (name);
                   3850: 
1.1.1.5 ! root     3851:   if (IDENTIFIER_LOCAL_VALUE (name) == NULL_TREE)
1.1       root     3852:     return 0;
                   3853: 
                   3854:   for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
                   3855:     if (DECL_NAME (t) == name)
                   3856:       break;
                   3857: 
                   3858:   return t;
                   3859: }
                   3860: 
1.1.1.4   root     3861: /* Arrange for the user to get a source line number, even when the
                   3862:    compiler is going down in flames, so that she at least has a
                   3863:    chance of working around problems in the compiler.  We used to
                   3864:    call error(), but that let the segmentation fault continue
                   3865:    through; now, it's much more passive by asking them to send the
                   3866:    maintainers mail about the problem.  */
                   3867: 
1.1.1.5 ! root     3868: static void
        !          3869: sigsegv (sig)
        !          3870:      int sig;
1.1.1.4   root     3871: {
                   3872:   signal (SIGSEGV, SIG_DFL);
1.1.1.5 ! root     3873: #ifdef SIGIOT
        !          3874:   signal (SIGIOT, SIG_DFL);
        !          3875: #endif
        !          3876: #ifdef SIGILL
        !          3877:   signal (SIGILL, SIG_DFL);
        !          3878: #endif
        !          3879: #ifdef SIGABRT
        !          3880:   signal (SIGABRT, SIG_DFL);
        !          3881: #endif
1.1.1.4   root     3882:   my_friendly_abort (0);
                   3883: }
                   3884: 
1.1       root     3885: /* Array for holding types considered "built-in".  These types
                   3886:    are output in the module in which `main' is defined.  */
                   3887: static tree *builtin_type_tdescs_arr;
                   3888: static int builtin_type_tdescs_len, builtin_type_tdescs_max;
                   3889: 
                   3890: /* Push the declarations of builtin types into the namespace.
                   3891:    RID_INDEX, if < RID_MAX is the index of the builtin type
                   3892:    in the array RID_POINTERS.  NAME is the name used when looking
                   3893:    up the builtin type.  TYPE is the _TYPE node for the builtin type.  */
                   3894: 
                   3895: static void
                   3896: record_builtin_type (rid_index, name, type)
                   3897:      enum rid rid_index;
                   3898:      char *name;
                   3899:      tree type;
                   3900: {
                   3901:   tree rname = NULL_TREE, tname = NULL_TREE;
                   3902:   tree tdecl;
                   3903: 
1.1.1.2   root     3904:   if ((int) rid_index < (int) RID_MAX)
1.1       root     3905:     rname = ridpointers[(int) rid_index];
                   3906:   if (name)
                   3907:     tname = get_identifier (name);
                   3908: 
                   3909:   if (tname)
                   3910:     {
1.1.1.2   root     3911: #if 0 /* not yet, should get fixed properly later */
                   3912:       tdecl = pushdecl (make_type_decl (tname, type));
                   3913: #else
1.1       root     3914:       tdecl = pushdecl (build_decl (TYPE_DECL, tname, type));
1.1.1.2   root     3915: #endif
1.1       root     3916:       set_identifier_type_value (tname, NULL_TREE);
1.1.1.2   root     3917:       if ((int) rid_index < (int) RID_MAX)
1.1       root     3918:        IDENTIFIER_GLOBAL_VALUE (tname) = tdecl;
                   3919:     }
                   3920:   if (rname != NULL_TREE)
                   3921:     {
                   3922:       if (tname != NULL_TREE)
                   3923:        {
                   3924:          set_identifier_type_value (rname, NULL_TREE);
                   3925:          IDENTIFIER_GLOBAL_VALUE (rname) = tdecl;
                   3926:        }
                   3927:       else
                   3928:        {
1.1.1.2   root     3929: #if 0 /* not yet, should get fixed properly later */
                   3930:          tdecl = pushdecl (make_type_decl (rname, type));
                   3931: #else
1.1       root     3932:          tdecl = pushdecl (build_decl (TYPE_DECL, rname, type));
1.1.1.2   root     3933: #endif
1.1       root     3934:          set_identifier_type_value (rname, NULL_TREE);
                   3935:        }
                   3936:     }
                   3937: 
                   3938:   if (flag_dossier)
                   3939:     {
                   3940:       if (builtin_type_tdescs_len+5 >= builtin_type_tdescs_max)
                   3941:        {
                   3942:          builtin_type_tdescs_max *= 2;
                   3943:          builtin_type_tdescs_arr
                   3944:            = (tree *)xrealloc (builtin_type_tdescs_arr,
                   3945:                                builtin_type_tdescs_max * sizeof (tree));
                   3946:        }
                   3947:       builtin_type_tdescs_arr[builtin_type_tdescs_len++] = type;
                   3948:       if (TREE_CODE (type) != POINTER_TYPE)
                   3949:        {
                   3950:          builtin_type_tdescs_arr[builtin_type_tdescs_len++]
                   3951:            = build_pointer_type (type);
                   3952:          builtin_type_tdescs_arr[builtin_type_tdescs_len++]
                   3953:            = build_type_variant (TYPE_POINTER_TO (type), 1, 0);
                   3954:        }
                   3955:       if (TREE_CODE (type) != VOID_TYPE)
                   3956:        {
                   3957:          builtin_type_tdescs_arr[builtin_type_tdescs_len++]
                   3958:            = build_reference_type (type);
                   3959:          builtin_type_tdescs_arr[builtin_type_tdescs_len++]
                   3960:            = build_type_variant (TYPE_REFERENCE_TO (type), 1, 0);
                   3961:        }
                   3962:     }
                   3963: }
                   3964: 
                   3965: static void
                   3966: output_builtin_tdesc_entries ()
                   3967: {
                   3968:   extern struct obstack permanent_obstack;
                   3969: 
                   3970:   /* If there's more than one main in this file, don't crash.  */
                   3971:   if (builtin_type_tdescs_arr == 0)
                   3972:     return;
                   3973: 
                   3974:   push_obstacks (&permanent_obstack, &permanent_obstack);
                   3975:   while (builtin_type_tdescs_len > 0)
                   3976:     {
                   3977:       tree type = builtin_type_tdescs_arr[--builtin_type_tdescs_len];
                   3978:       tree tdesc = build_t_desc (type, 0);
                   3979:       TREE_ASM_WRITTEN (tdesc) = 0;
                   3980:       build_t_desc (type, 2);
                   3981:     }
                   3982:   free (builtin_type_tdescs_arr);
                   3983:   builtin_type_tdescs_arr = 0;
                   3984:   pop_obstacks ();
                   3985: }
                   3986: 
                   3987: /* Push overloaded decl, in global scope, with one argument so it
                   3988:    can be used as a callback from define_function.  */
                   3989: static void
                   3990: push_overloaded_decl_1 (x)
                   3991:      tree x;
                   3992: {
                   3993:   push_overloaded_decl (x, 0);
                   3994: }
                   3995: 
                   3996: /* Create the predefined scalar types of C,
                   3997:    and some nodes representing standard constants (0, 1, (void *)0).
                   3998:    Initialize the global binding level.
                   3999:    Make definitions for built-in primitive functions.  */
                   4000: 
                   4001: void
                   4002: init_decl_processing ()
                   4003: {
1.1.1.5 ! root     4004:   tree decl;
1.1       root     4005:   register tree endlink, int_endlink, double_endlink, ptr_endlink;
                   4006:   tree fields[20];
                   4007:   /* Either char* or void*.  */
                   4008:   tree traditional_ptr_type_node;
                   4009:   /* Data type of memcpy.  */
                   4010:   tree memcpy_ftype;
                   4011:   int wchar_type_size;
                   4012: 
                   4013:   /* Have to make these distinct before we try using them.  */
                   4014:   lang_name_cplusplus = get_identifier ("C++");
                   4015:   lang_name_c = get_identifier ("C");
                   4016: 
                   4017:   /* Initially, C.  */
                   4018:   current_lang_name = lang_name_c;
                   4019: 
                   4020:   current_function_decl = NULL_TREE;
                   4021:   named_labels = NULL_TREE;
                   4022:   named_label_uses = NULL_TREE;
                   4023:   current_binding_level = NULL_BINDING_LEVEL;
                   4024:   free_binding_level = NULL_BINDING_LEVEL;
                   4025: 
1.1.1.4   root     4026:   /* Because most segmentation signals can be traced back into user
                   4027:      code, catch them and at least give the user a chance of working
                   4028:      around compiler bugs. */
                   4029:   signal (SIGSEGV, sigsegv);
                   4030: 
1.1.1.5 ! root     4031:   /* We will also catch aborts in the back-end through sigsegv and give the
        !          4032:      user a chance to see where the error might be, and to defeat aborts in
        !          4033:      the back-end when there have been errors previously in their code. */
        !          4034: #ifdef SIGIOT
        !          4035:   signal (SIGIOT, sigsegv);
        !          4036: #endif
        !          4037: #ifdef SIGILL
        !          4038:   signal (SIGILL, sigsegv);
        !          4039: #endif
        !          4040: #ifdef SIGABRT
        !          4041:   signal (SIGABRT, sigsegv);
        !          4042: #endif
        !          4043: 
1.1       root     4044:   gcc_obstack_init (&decl_obstack);
                   4045:   if (flag_dossier)
                   4046:     {
                   4047:       builtin_type_tdescs_max = 100;
                   4048:       builtin_type_tdescs_arr = (tree *)xmalloc (100 * sizeof (tree));
                   4049:     }
                   4050: 
                   4051:   /* Must lay these out before anything else gets laid out.  */
                   4052:   error_mark_node = make_node (ERROR_MARK);
                   4053:   TREE_PERMANENT (error_mark_node) = 1;
                   4054:   TREE_TYPE (error_mark_node) = error_mark_node;
                   4055:   error_mark_list = build_tree_list (error_mark_node, error_mark_node);
                   4056:   TREE_TYPE (error_mark_list) = error_mark_node;
                   4057: 
                   4058:   pushlevel (0);       /* make the binding_level structure for global names.  */
                   4059:   global_binding_level = current_binding_level;
                   4060: 
                   4061:   this_identifier = get_identifier (THIS_NAME);
                   4062:   in_charge_identifier = get_identifier (IN_CHARGE_NAME);
                   4063: 
                   4064:   /* Define `int' and `char' first so that dbx will output them first.  */
                   4065: 
                   4066:   integer_type_node = make_signed_type (INT_TYPE_SIZE);
1.1.1.5 ! root     4067:   record_builtin_type (RID_INT, NULL_PTR, integer_type_node);
1.1       root     4068: 
                   4069:   /* Define `char', which is like either `signed char' or `unsigned char'
                   4070:      but not the same as either.  */
                   4071: 
                   4072:   char_type_node =
                   4073:     (flag_signed_char
                   4074:      ? make_signed_type (CHAR_TYPE_SIZE)
                   4075:      : make_unsigned_type (CHAR_TYPE_SIZE));
                   4076:   record_builtin_type (RID_CHAR, "char", char_type_node);
                   4077: 
                   4078:   long_integer_type_node = make_signed_type (LONG_TYPE_SIZE);
                   4079:   record_builtin_type (RID_LONG, "long int", long_integer_type_node);
                   4080: 
                   4081:   unsigned_type_node = make_unsigned_type (INT_TYPE_SIZE);
                   4082:   record_builtin_type (RID_UNSIGNED, "unsigned int", unsigned_type_node);
                   4083: 
                   4084:   long_unsigned_type_node = make_unsigned_type (LONG_TYPE_SIZE);
                   4085:   record_builtin_type (RID_MAX, "long unsigned int", long_unsigned_type_node);
                   4086:   record_builtin_type (RID_MAX, "unsigned long", long_unsigned_type_node);
                   4087: 
                   4088:   /* `unsigned long' is the standard type for sizeof.
                   4089:      Traditionally, use a signed type.
                   4090:      Note that stddef.h uses `unsigned long',
                   4091:      and this must agree, even of long and int are the same size.  */
                   4092:   if (flag_traditional)
                   4093:     sizetype = long_integer_type_node;
                   4094:   else
                   4095:     sizetype
                   4096:       = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (SIZE_TYPE)));
                   4097: 
                   4098:   ptrdiff_type_node
                   4099:     = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (PTRDIFF_TYPE)));
                   4100: 
                   4101:   TREE_TYPE (TYPE_SIZE (integer_type_node)) = sizetype;
                   4102:   TREE_TYPE (TYPE_SIZE (char_type_node)) = sizetype;
                   4103:   TREE_TYPE (TYPE_SIZE (unsigned_type_node)) = sizetype;
                   4104:   TREE_TYPE (TYPE_SIZE (long_unsigned_type_node)) = sizetype;
                   4105:   TREE_TYPE (TYPE_SIZE (long_integer_type_node)) = sizetype;
                   4106: 
                   4107:   short_integer_type_node = make_signed_type (SHORT_TYPE_SIZE);
                   4108:   record_builtin_type (RID_SHORT, "short int", short_integer_type_node);
                   4109:   long_long_integer_type_node = make_signed_type (LONG_LONG_TYPE_SIZE);
                   4110:   record_builtin_type (RID_MAX, "long long int", long_long_integer_type_node);
                   4111:   short_unsigned_type_node = make_unsigned_type (SHORT_TYPE_SIZE);
                   4112:   record_builtin_type (RID_MAX, "short unsigned int", short_unsigned_type_node);
                   4113:   record_builtin_type (RID_MAX, "unsigned short", short_unsigned_type_node);
                   4114:   long_long_unsigned_type_node = make_unsigned_type (LONG_LONG_TYPE_SIZE);
                   4115:   record_builtin_type (RID_MAX, "long long unsigned int", long_long_unsigned_type_node);
                   4116:   record_builtin_type (RID_MAX, "long long unsigned", long_long_unsigned_type_node);
                   4117: 
                   4118:   /* Define both `signed char' and `unsigned char'.  */
                   4119:   signed_char_type_node = make_signed_type (CHAR_TYPE_SIZE);
                   4120:   record_builtin_type (RID_MAX, "signed char", signed_char_type_node);
                   4121:   unsigned_char_type_node = make_unsigned_type (CHAR_TYPE_SIZE);
                   4122:   record_builtin_type (RID_MAX, "unsigned char", unsigned_char_type_node);
                   4123: 
1.1.1.4   root     4124:   /* These are types that type_for_size and type_for_mode use.  */
                   4125:   intQI_type_node = make_signed_type (GET_MODE_BITSIZE (QImode));
                   4126:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intQI_type_node));
                   4127:   intHI_type_node = make_signed_type (GET_MODE_BITSIZE (HImode));
                   4128:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intHI_type_node));
                   4129:   intSI_type_node = make_signed_type (GET_MODE_BITSIZE (SImode));
                   4130:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intSI_type_node));
                   4131:   intDI_type_node = make_signed_type (GET_MODE_BITSIZE (DImode));
                   4132:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intDI_type_node));
                   4133:   unsigned_intQI_type_node = make_unsigned_type (GET_MODE_BITSIZE (QImode));
                   4134:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intQI_type_node));
                   4135:   unsigned_intHI_type_node = make_unsigned_type (GET_MODE_BITSIZE (HImode));
                   4136:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intHI_type_node));
                   4137:   unsigned_intSI_type_node = make_unsigned_type (GET_MODE_BITSIZE (SImode));
                   4138:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intSI_type_node));
                   4139:   unsigned_intDI_type_node = make_unsigned_type (GET_MODE_BITSIZE (DImode));
                   4140:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intDI_type_node));
                   4141: 
1.1       root     4142:   float_type_node = make_node (REAL_TYPE);
                   4143:   TYPE_PRECISION (float_type_node) = FLOAT_TYPE_SIZE;
1.1.1.5 ! root     4144:   record_builtin_type (RID_FLOAT, NULL, float_type_node);
1.1       root     4145:   layout_type (float_type_node);
                   4146: 
                   4147:   double_type_node = make_node (REAL_TYPE);
                   4148:   if (flag_short_double)
                   4149:     TYPE_PRECISION (double_type_node) = FLOAT_TYPE_SIZE;
                   4150:   else
                   4151:     TYPE_PRECISION (double_type_node) = DOUBLE_TYPE_SIZE;
1.1.1.5 ! root     4152:   record_builtin_type (RID_DOUBLE, NULL, double_type_node);
1.1       root     4153:   layout_type (double_type_node);
                   4154: 
                   4155:   long_double_type_node = make_node (REAL_TYPE);
                   4156:   TYPE_PRECISION (long_double_type_node) = LONG_DOUBLE_TYPE_SIZE;
                   4157:   record_builtin_type (RID_MAX, "long double", long_double_type_node);
                   4158:   layout_type (long_double_type_node);
                   4159: 
                   4160:   integer_zero_node = build_int_2 (0, 0);
                   4161:   TREE_TYPE (integer_zero_node) = integer_type_node;
                   4162:   integer_one_node = build_int_2 (1, 0);
                   4163:   TREE_TYPE (integer_one_node) = integer_type_node;
                   4164:   integer_two_node = build_int_2 (2, 0);
                   4165:   TREE_TYPE (integer_two_node) = integer_type_node;
                   4166:   integer_three_node = build_int_2 (3, 0);
                   4167:   TREE_TYPE (integer_three_node) = integer_type_node;
                   4168:   empty_init_node = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE);
                   4169: 
                   4170:   /* These are needed by stor-layout.c.  */
                   4171:   size_zero_node = size_int (0);
                   4172:   size_one_node = size_int (1);
                   4173: 
                   4174:   void_type_node = make_node (VOID_TYPE);
1.1.1.5 ! root     4175:   record_builtin_type (RID_VOID, NULL, void_type_node);
1.1       root     4176:   layout_type (void_type_node); /* Uses integer_zero_node.  */
                   4177:   void_list_node = build_tree_list (NULL_TREE, void_type_node);
                   4178:   TREE_PARMLIST (void_list_node) = 1;
                   4179: 
                   4180:   null_pointer_node = build_int_2 (0, 0);
                   4181:   TREE_TYPE (null_pointer_node) = build_pointer_type (void_type_node);
                   4182:   layout_type (TREE_TYPE (null_pointer_node));
                   4183: 
                   4184:   /* Used for expressions that do nothing, but are not errors.  */
                   4185:   void_zero_node = build_int_2 (0, 0);
                   4186:   TREE_TYPE (void_zero_node) = void_type_node;
                   4187: 
                   4188:   string_type_node = build_pointer_type (char_type_node);
                   4189:   const_string_type_node = build_pointer_type (build_type_variant (char_type_node, 1, 0));
1.1.1.5 ! root     4190:   record_builtin_type (RID_MAX, NULL, string_type_node);
1.1       root     4191: 
                   4192:   /* make a type for arrays of 256 characters.
                   4193:      256 is picked randomly because we have a type for integers from 0 to 255.
                   4194:      With luck nothing will ever really depend on the length of this
                   4195:      array type.  */
                   4196:   char_array_type_node
                   4197:     = build_array_type (char_type_node, unsigned_char_type_node);
                   4198:   /* Likewise for arrays of ints.  */
                   4199:   int_array_type_node
                   4200:     = build_array_type (integer_type_node, unsigned_char_type_node);
                   4201: 
                   4202:   /* This is just some anonymous class type.  Nobody should ever
                   4203:      need to look inside this envelope.  */
                   4204:   class_star_type_node = build_pointer_type (make_lang_type (RECORD_TYPE));
                   4205: 
                   4206:   default_function_type
                   4207:     = build_function_type (integer_type_node, NULL_TREE);
                   4208:   build_pointer_type (default_function_type);
                   4209: 
                   4210:   ptr_type_node = build_pointer_type (void_type_node);
                   4211:   const_ptr_type_node = build_pointer_type (build_type_variant (void_type_node, 1, 0));
1.1.1.5 ! root     4212:   record_builtin_type (RID_MAX, NULL, ptr_type_node);
1.1       root     4213:   endlink = void_list_node;
                   4214:   int_endlink = tree_cons (NULL_TREE, integer_type_node, endlink);
                   4215:   double_endlink = tree_cons (NULL_TREE, double_type_node, endlink);
                   4216:   ptr_endlink = tree_cons (NULL_TREE, ptr_type_node, endlink);
                   4217: 
                   4218:   double_ftype_double
                   4219:     = build_function_type (double_type_node, double_endlink);
                   4220: 
                   4221:   double_ftype_double_double
                   4222:     = build_function_type (double_type_node,
                   4223:                           tree_cons (NULL_TREE, double_type_node, double_endlink));
                   4224: 
                   4225:   int_ftype_int
                   4226:     = build_function_type (integer_type_node, int_endlink);
                   4227: 
                   4228:   long_ftype_long
                   4229:     = build_function_type (long_integer_type_node,
                   4230:                           tree_cons (NULL_TREE, long_integer_type_node, endlink));
                   4231: 
                   4232:   void_ftype_ptr_ptr_int
                   4233:     = build_function_type (void_type_node,
                   4234:                           tree_cons (NULL_TREE, ptr_type_node,
                   4235:                                      tree_cons (NULL_TREE, ptr_type_node,
                   4236:                                                 int_endlink)));
                   4237: 
                   4238:   int_ftype_cptr_cptr_sizet
                   4239:     = build_function_type (integer_type_node,
                   4240:                           tree_cons (NULL_TREE, const_ptr_type_node,
                   4241:                                      tree_cons (NULL_TREE, const_ptr_type_node,
                   4242:                                                 tree_cons (NULL_TREE,
                   4243:                                                            sizetype,
                   4244:                                                            endlink))));
                   4245: 
                   4246:   void_ftype_ptr_int_int
                   4247:     = build_function_type (void_type_node,
                   4248:                           tree_cons (NULL_TREE, ptr_type_node,
                   4249:                                      tree_cons (NULL_TREE, integer_type_node,
                   4250:                                                 int_endlink)));
                   4251: 
                   4252:   string_ftype_ptr_ptr         /* strcpy prototype */
                   4253:     = build_function_type (string_type_node,
                   4254:                           tree_cons (NULL_TREE, string_type_node,
                   4255:                                      tree_cons (NULL_TREE,
                   4256:                                                 const_string_type_node,
                   4257:                                                 endlink)));
                   4258: 
                   4259:   int_ftype_string_string      /* strcmp prototype */
                   4260:     = build_function_type (integer_type_node,
                   4261:                           tree_cons (NULL_TREE, const_string_type_node,
                   4262:                                      tree_cons (NULL_TREE,
                   4263:                                                 const_string_type_node,
                   4264:                                                 endlink)));
                   4265: 
                   4266:   sizet_ftype_string           /* strlen prototype */
                   4267:     = build_function_type (sizetype,
                   4268:                           tree_cons (NULL_TREE, const_string_type_node,
                   4269:                                      endlink));
                   4270: 
                   4271:   traditional_ptr_type_node
                   4272:     = (flag_traditional ? string_type_node : ptr_type_node);
                   4273: 
                   4274:   memcpy_ftype /* memcpy prototype */
                   4275:     = build_function_type (traditional_ptr_type_node,
                   4276:                           tree_cons (NULL_TREE, ptr_type_node,
                   4277:                                      tree_cons (NULL_TREE, const_ptr_type_node,
                   4278:                                                 tree_cons (NULL_TREE,
                   4279:                                                            sizetype,
                   4280:                                                            endlink))));
                   4281: 
                   4282: #ifdef VTABLE_USES_MASK
                   4283:   /* This is primarily for virtual function definition.  We
                   4284:      declare an array of `void *', which can later be
                   4285:      converted to the appropriate function pointer type.
                   4286:      To do pointers to members, we need a mask which can
                   4287:      distinguish an index value into a virtual function table
                   4288:      from an address.  */
1.1.1.4   root     4289:   vtbl_mask = build_int_2 (~((HOST_WIDE_INT) VINDEX_MAX - 1), -1);
1.1       root     4290: #endif
                   4291: 
                   4292:   vtbl_type_node
                   4293:     = build_array_type (ptr_type_node, NULL_TREE);
                   4294:   layout_type (vtbl_type_node);
                   4295:   vtbl_type_node = build_type_variant (vtbl_type_node, 1, 0);
1.1.1.5 ! root     4296:   record_builtin_type (RID_MAX, NULL, vtbl_type_node);
1.1       root     4297: 
1.1.1.4   root     4298:   builtin_function ("__builtin_constant_p", int_ftype_int,
1.1.1.5 ! root     4299:                    BUILT_IN_CONSTANT_P, NULL_PTR);
1.1       root     4300: 
                   4301:   builtin_function ("__builtin_alloca",
                   4302:                    build_function_type (ptr_type_node,
                   4303:                                         tree_cons (NULL_TREE,
                   4304:                                                    sizetype,
                   4305:                                                    endlink)),
                   4306:                    BUILT_IN_ALLOCA, "alloca");
                   4307: #if 0
                   4308:   builtin_function ("alloca",
                   4309:                    build_function_type (ptr_type_node,
                   4310:                                         tree_cons (NULL_TREE,
                   4311:                                                    sizetype,
                   4312:                                                    endlink)),
1.1.1.5 ! root     4313:                    BUILT_IN_ALLOCA, NULL_PTR);
1.1       root     4314: #endif
                   4315: 
1.1.1.5 ! root     4316:   builtin_function ("__builtin_abs", int_ftype_int,
        !          4317:                    BUILT_IN_ABS, NULL_PTR);
        !          4318:   builtin_function ("__builtin_fabs", double_ftype_double,
        !          4319:                    BUILT_IN_FABS, NULL_PTR);
        !          4320:   builtin_function ("__builtin_labs", long_ftype_long,
        !          4321:                    BUILT_IN_LABS, NULL_PTR);
        !          4322:   builtin_function ("__builtin_ffs", int_ftype_int,
        !          4323:                    BUILT_IN_FFS, NULL_PTR);
        !          4324:   builtin_function ("__builtin_fsqrt", double_ftype_double,
        !          4325:                    BUILT_IN_FSQRT, NULL_PTR);
        !          4326:   builtin_function ("__builtin_sin", double_ftype_double, 
        !          4327:                    BUILT_IN_SIN, "sin");
        !          4328:   builtin_function ("__builtin_cos", double_ftype_double, 
        !          4329:                    BUILT_IN_COS, "cos");
1.1.1.4   root     4330:   builtin_function ("__builtin_saveregs",
                   4331:                    build_function_type (ptr_type_node, NULL_TREE),
1.1.1.5 ! root     4332:                    BUILT_IN_SAVEREGS, NULL_PTR);
        !          4333: /* EXPAND_BUILTIN_VARARGS is obsolete.  */
        !          4334: #if 0
1.1       root     4335:   builtin_function ("__builtin_varargs",
                   4336:                    build_function_type (ptr_type_node,
                   4337:                                         tree_cons (NULL_TREE,
                   4338:                                                    integer_type_node,
                   4339:                                                    endlink)),
1.1.1.5 ! root     4340:                    BUILT_IN_VARARGS, NULL_PTR);
1.1       root     4341: #endif
                   4342:   builtin_function ("__builtin_classify_type", default_function_type,
1.1.1.5 ! root     4343:                    BUILT_IN_CLASSIFY_TYPE, NULL_PTR);
1.1       root     4344:   builtin_function ("__builtin_next_arg",
                   4345:                    build_function_type (ptr_type_node, endlink),
1.1.1.5 ! root     4346:                    BUILT_IN_NEXT_ARG, NULL_PTR);
        !          4347:   builtin_function ("__builtin_args_info",
        !          4348:                    build_function_type (integer_type_node,
        !          4349:                                         tree_cons (NULL_TREE,
        !          4350:                                                    integer_type_node,
        !          4351:                                                    endlink)),
        !          4352:                    BUILT_IN_ARGS_INFO, NULL_PTR);
1.1       root     4353: 
                   4354:   /* Currently under experimentation.  */
                   4355:   builtin_function ("__builtin_memcpy", memcpy_ftype,
                   4356:                    BUILT_IN_MEMCPY, "memcpy");
                   4357:   builtin_function ("__builtin_memcmp", int_ftype_cptr_cptr_sizet,
                   4358:                    BUILT_IN_MEMCMP, "memcmp");
                   4359:   builtin_function ("__builtin_strcmp", int_ftype_string_string,
                   4360:                    BUILT_IN_STRCMP, "strcmp");
                   4361:   builtin_function ("__builtin_strcpy", string_ftype_ptr_ptr,
                   4362:                    BUILT_IN_STRCPY, "strcpy");
                   4363:   builtin_function ("__builtin_strlen", sizet_ftype_string,
                   4364:                    BUILT_IN_STRLEN, "strlen");
1.1.1.5 ! root     4365: 
        !          4366:   if (!flag_no_builtin)
        !          4367:     {
        !          4368: #if 0 /* These do not work well with libg++.  */
        !          4369:       builtin_function ("abs", int_ftype_int, BUILT_IN_ABS, NULL_PTR);
        !          4370:       builtin_function ("fabs", double_ftype_double, BUILT_IN_FABS, NULL_PTR);
        !          4371:       builtin_function ("labs", long_ftype_long, BUILT_IN_LABS, NULL_PTR);
        !          4372: #endif
        !          4373:       builtin_function ("memcpy", memcpy_ftype, BUILT_IN_MEMCPY, NULL_PTR);
        !          4374:       builtin_function ("memcmp", int_ftype_cptr_cptr_sizet, BUILT_IN_MEMCMP,
        !          4375:                        NULL_PTR);
        !          4376:       builtin_function ("strcmp", int_ftype_string_string, BUILT_IN_STRCMP, NULL_PTR);
        !          4377:       builtin_function ("strcpy", string_ftype_ptr_ptr, BUILT_IN_STRCPY, NULL_PTR);
        !          4378:       builtin_function ("strlen", sizet_ftype_string, BUILT_IN_STRLEN, NULL_PTR);
        !          4379:       builtin_function ("sin", double_ftype_double, BUILT_IN_SIN, NULL_PTR);
        !          4380:       builtin_function ("cos", double_ftype_double, BUILT_IN_COS, NULL_PTR);
        !          4381:     }
1.1       root     4382: 
                   4383: #if 0
                   4384:   /* Support for these has not been written in either expand_builtin
                   4385:      or build_function_call.  */
                   4386:   builtin_function ("__builtin_div", default_ftype, BUILT_IN_DIV, 0);
                   4387:   builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV, 0);
                   4388:   builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR, 0);
                   4389:   builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL, 0);
                   4390:   builtin_function ("__builtin_fmod", double_ftype_double_double, BUILT_IN_FMOD, 0);
                   4391:   builtin_function ("__builtin_frem", double_ftype_double_double, BUILT_IN_FREM, 0);
                   4392:   builtin_function ("__builtin_memset", ptr_ftype_ptr_int_int, BUILT_IN_MEMSET, 0);
                   4393:   builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP, 0);
                   4394:   builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN, 0);
                   4395: #endif
                   4396: 
                   4397:   /* C++ extensions */
                   4398: 
                   4399:   unknown_type_node = make_node (UNKNOWN_TYPE);
1.1.1.2   root     4400: #if 0 /* not yet, should get fixed properly later */
                   4401:   pushdecl (make_type_decl (get_identifier ("unknown type"),
                   4402:                       unknown_type_node));
                   4403: #else
1.1.1.5 ! root     4404:   decl = pushdecl (build_decl (TYPE_DECL, get_identifier ("unknown type"),
1.1       root     4405:                        unknown_type_node));
1.1.1.5 ! root     4406:   /* Make sure the "unknown type" typedecl gets ignored for debug info.  */
        !          4407:   DECL_IGNORED_P (decl) = 1;
1.1.1.2   root     4408: #endif
1.1       root     4409:   TYPE_SIZE (unknown_type_node) = TYPE_SIZE (void_type_node);
                   4410:   TYPE_ALIGN (unknown_type_node) = 1;
                   4411:   TYPE_MODE (unknown_type_node) = TYPE_MODE (void_type_node);
                   4412:   /* Indirecting an UNKNOWN_TYPE node yields an UNKNOWN_TYPE node.  */
                   4413:   TREE_TYPE (unknown_type_node) = unknown_type_node;
                   4414:   /* Looking up TYPE_POINTER_TO and TYPE_REFERENCE_TO yield the same result.  */
                   4415:   TYPE_POINTER_TO (unknown_type_node) = unknown_type_node;
                   4416:   TYPE_REFERENCE_TO (unknown_type_node) = unknown_type_node;
                   4417: 
1.1.1.4   root     4418:   /* This is special for C++ so functions can be overloaded. */
                   4419:   wchar_type_node
                   4420:     = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (WCHAR_TYPE)));
                   4421:   wchar_type_size = TYPE_PRECISION (wchar_type_node);
                   4422:   signed_wchar_type_node = make_signed_type (wchar_type_size);
                   4423:   unsigned_wchar_type_node = make_unsigned_type (wchar_type_size);
                   4424:   wchar_type_node
                   4425:     = TREE_UNSIGNED (wchar_type_node)
                   4426:       ? unsigned_wchar_type_node
                   4427:       : signed_wchar_type_node;
                   4428:   record_builtin_type (RID_WCHAR, "__wchar_t", wchar_type_node);
                   4429: 
                   4430:   /* This is for wide string constants.  */
                   4431:   wchar_array_type_node
                   4432:     = build_array_type (wchar_type_node, unsigned_char_type_node);
                   4433: 
1.1       root     4434:   /* This is a hack that should go away when we deliver the
                   4435:      real gc code.  */
                   4436:   if (flag_gc)
                   4437:     {
                   4438:       builtin_function ("__gc_main", default_function_type, NOT_BUILT_IN, 0);
                   4439:       pushdecl (lookup_name (get_identifier ("__gc_main"), 0));
                   4440:     }
                   4441: 
                   4442:   /* Simplify life by making a "vtable_entry_type".  Give its
                   4443:      fields names so that the debugger can use them.  */
                   4444: 
                   4445:   vtable_entry_type = make_lang_type (RECORD_TYPE);
                   4446:   fields[0] = build_lang_field_decl (FIELD_DECL, get_identifier (VTABLE_DELTA_NAME), short_integer_type_node);
                   4447:   fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier (VTABLE_INDEX_NAME), short_integer_type_node);
                   4448:   fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier (VTABLE_PFN_NAME), ptr_type_node);
                   4449:   finish_builtin_type (vtable_entry_type, VTBL_PTR_TYPE, fields, 2,
                   4450:                       double_type_node);
                   4451: 
                   4452:   /* Make this part of an invisible union.  */
                   4453:   fields[3] = copy_node (fields[2]);
                   4454:   TREE_TYPE (fields[3]) = short_integer_type_node;
                   4455:   DECL_NAME (fields[3]) = get_identifier (VTABLE_DELTA2_NAME);
                   4456:   DECL_MODE (fields[3]) = TYPE_MODE (short_integer_type_node);
                   4457:   DECL_SIZE (fields[3]) = TYPE_SIZE (short_integer_type_node);
                   4458:   TREE_UNSIGNED (fields[3]) = 0;
                   4459:   TREE_CHAIN (fields[2]) = fields[3];
                   4460:   vtable_entry_type = build_type_variant (vtable_entry_type, 1, 0);
                   4461:   record_builtin_type (RID_MAX, VTBL_PTR_TYPE, vtable_entry_type);
                   4462: 
                   4463:   if (flag_dossier)
                   4464:     {
                   4465:       /* Must build __t_desc type.  Currently, type descriptors look like this:
                   4466: 
                   4467:         struct __t_desc
                   4468:         {
                   4469:            const char *name;
                   4470:           int size;
                   4471:           int bits;
                   4472:           struct __t_desc *points_to;
                   4473:           int ivars_count, meths_count;
                   4474:           struct __i_desc *ivars[];
                   4475:           struct __m_desc *meths[];
                   4476:           struct __t_desc *parents[];
                   4477:           struct __t_desc *vbases[];
                   4478:           int offsets[];
                   4479:         };
                   4480: 
                   4481:         ...as per Linton's paper.  */
                   4482: 
                   4483:       __t_desc_type_node = make_lang_type (RECORD_TYPE);
                   4484:       __i_desc_type_node = make_lang_type (RECORD_TYPE);
                   4485:       __m_desc_type_node = make_lang_type (RECORD_TYPE);
                   4486:       __t_desc_array_type = build_array_type (TYPE_POINTER_TO (__t_desc_type_node), NULL_TREE);
                   4487:       __i_desc_array_type = build_array_type (TYPE_POINTER_TO (__i_desc_type_node), NULL_TREE);
                   4488:       __m_desc_array_type = build_array_type (TYPE_POINTER_TO (__m_desc_type_node), NULL_TREE);
                   4489: 
                   4490:       fields[0] = build_lang_field_decl (FIELD_DECL, get_identifier ("name"),
                   4491:                                         string_type_node);
                   4492:       fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier ("size"),
                   4493:                                         unsigned_type_node);
                   4494:       fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier ("bits"),
                   4495:                                         unsigned_type_node);
                   4496:       fields[3] = build_lang_field_decl (FIELD_DECL, get_identifier ("points_to"),
                   4497:                                         TYPE_POINTER_TO (__t_desc_type_node));
                   4498:       fields[4] = build_lang_field_decl (FIELD_DECL,
                   4499:                                         get_identifier ("ivars_count"),
                   4500:                                         integer_type_node);
                   4501:       fields[5] = build_lang_field_decl (FIELD_DECL,
                   4502:                                         get_identifier ("meths_count"),
                   4503:                                         integer_type_node);
                   4504:       fields[6] = build_lang_field_decl (FIELD_DECL, get_identifier ("ivars"),
                   4505:                                         build_pointer_type (__i_desc_array_type));
                   4506:       fields[7] = build_lang_field_decl (FIELD_DECL, get_identifier ("meths"),
                   4507:                                         build_pointer_type (__m_desc_array_type));
                   4508:       fields[8] = build_lang_field_decl (FIELD_DECL, get_identifier ("parents"),
                   4509:                                         build_pointer_type (__t_desc_array_type));
                   4510:       fields[9] = build_lang_field_decl (FIELD_DECL, get_identifier ("vbases"),
                   4511:                                         build_pointer_type (__t_desc_array_type));
                   4512:       fields[10] = build_lang_field_decl (FIELD_DECL, get_identifier ("offsets"),
                   4513:                                         build_pointer_type (integer_type_node));
                   4514:       finish_builtin_type (__t_desc_type_node, "__t_desc", fields, 10, integer_type_node);
                   4515: 
                   4516:       /* ivar descriptors look like this:
                   4517: 
                   4518:         struct __i_desc
                   4519:         {
                   4520:           const char *name;
                   4521:           int offset;
                   4522:           struct __t_desc *type;
                   4523:         };
                   4524:       */
                   4525: 
                   4526:       fields[0] = build_lang_field_decl (FIELD_DECL, get_identifier ("name"),
                   4527:                                         string_type_node);
                   4528:       fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier ("offset"),
                   4529:                                         integer_type_node);
                   4530:       fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier ("type"),
                   4531:                                         TYPE_POINTER_TO (__t_desc_type_node));
                   4532:       finish_builtin_type (__i_desc_type_node, "__i_desc", fields, 2, integer_type_node);
                   4533: 
                   4534:       /* method descriptors look like this:
                   4535: 
                   4536:         struct __m_desc
                   4537:         {
                   4538:           const char *name;
                   4539:           int vindex;
                   4540:           struct __t_desc *vcontext;
                   4541:           struct __t_desc *return_type;
                   4542:           void (*address)();
                   4543:           short parm_count;
                   4544:           short required_parms;
                   4545:           struct __t_desc *parm_types[];
                   4546:         };
                   4547:       */
                   4548: 
                   4549:       fields[0] = build_lang_field_decl (FIELD_DECL, get_identifier ("name"),
                   4550:                                         string_type_node);
                   4551:       fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier ("vindex"),
                   4552:                                         integer_type_node);
                   4553:       fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier ("vcontext"),
                   4554:                                         TYPE_POINTER_TO (__t_desc_type_node));
                   4555:       fields[3] = build_lang_field_decl (FIELD_DECL, get_identifier ("return_type"),
                   4556:                                         TYPE_POINTER_TO (__t_desc_type_node));
                   4557:       fields[4] = build_lang_field_decl (FIELD_DECL, get_identifier ("address"),
                   4558:                                         build_pointer_type (default_function_type));
                   4559:       fields[5] = build_lang_field_decl (FIELD_DECL, get_identifier ("parm_count"),
                   4560:                                         short_integer_type_node);
                   4561:       fields[6] = build_lang_field_decl (FIELD_DECL, get_identifier ("required_parms"),
                   4562:                                         short_integer_type_node);
                   4563:       fields[7] = build_lang_field_decl (FIELD_DECL, get_identifier ("parm_types"),
                   4564:                                         build_pointer_type (build_array_type (TYPE_POINTER_TO (__t_desc_type_node), NULL_TREE)));
                   4565:       finish_builtin_type (__m_desc_type_node, "__m_desc", fields, 7, integer_type_node);
                   4566:     }
                   4567: 
                   4568:   /* Now, C++.  */
                   4569:   current_lang_name = lang_name_cplusplus;
                   4570:   if (flag_dossier)
                   4571:     {
                   4572:       int i = builtin_type_tdescs_len;
                   4573:       while (i > 0)
                   4574:        {
                   4575:          tree tdesc = build_t_desc (builtin_type_tdescs_arr[--i], 0);
                   4576:          TREE_ASM_WRITTEN (tdesc) = 1;
                   4577:          TREE_PUBLIC (TREE_OPERAND (tdesc, 0)) = 1;
                   4578:        }
                   4579:     }
                   4580: 
1.1.1.2   root     4581:   auto_function (ansi_opname[(int) NEW_EXPR],
                   4582:                 build_function_type (ptr_type_node,
                   4583:                                      tree_cons (NULL_TREE, sizetype,
                   4584:                                                 void_list_node)),
                   4585:                 NOT_BUILT_IN);
                   4586:   auto_function (ansi_opname[(int) DELETE_EXPR],
                   4587:                 build_function_type (void_type_node,
                   4588:                                      tree_cons (NULL_TREE, ptr_type_node,
                   4589:                                                 void_list_node)),
                   4590:                 NOT_BUILT_IN);
1.1       root     4591: 
                   4592:   abort_fndecl
                   4593:     = define_function ("abort",
                   4594:                       build_function_type (void_type_node, void_list_node),
                   4595:                       NOT_BUILT_IN, 0, 0);
                   4596: 
                   4597:   unhandled_exception_fndecl
                   4598:     = define_function ("__unhandled_exception",
                   4599:                       build_function_type (void_type_node, NULL_TREE),
                   4600:                       NOT_BUILT_IN, 0, 0);
                   4601: 
                   4602:   /* Perform other language dependent initializations.  */
                   4603:   init_class_processing ();
                   4604:   init_init_processing ();
                   4605:   init_search_processing ();
                   4606: 
                   4607:   if (flag_handle_exceptions)
                   4608:     {
                   4609:       if (flag_handle_exceptions == 2)
                   4610:        /* Too much trouble to inline all the trys needed for this.  */
                   4611:        flag_this_is_variable = 2;
                   4612:       init_exception_processing ();
                   4613:     }
                   4614:   if (flag_gc)
                   4615:     init_gc_processing ();
                   4616:   if (flag_no_inline)
                   4617:     flag_inline_functions = 0, flag_default_inline = 0;
                   4618:   if (flag_cadillac)
                   4619:     init_cadillac ();
                   4620: 
1.1.1.3   root     4621:   /* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__.  */
                   4622:   declare_function_name ();
                   4623: 
1.1       root     4624:   /* Warnings about failure to return values are too valuable to forego.  */
                   4625:   warn_return_type = 1;
                   4626: }
                   4627: 
                   4628: /* Make a definition for a builtin function named NAME and whose data type
                   4629:    is TYPE.  TYPE should be a function type with argument types.
                   4630:    FUNCTION_CODE tells later passes how to compile calls to this function.
                   4631:    See tree.h for its possible values.
                   4632: 
                   4633:    If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
                   4634:    the name to be called if we can't opencode the function.  */
                   4635: 
                   4636: tree
                   4637: define_function (name, type, function_code, pfn, library_name)
                   4638:      char *name;
                   4639:      tree type;
                   4640:      enum built_in_function function_code;
                   4641:      void (*pfn)();
                   4642:      char *library_name;
                   4643: {
                   4644:   tree decl = build_lang_decl (FUNCTION_DECL, get_identifier (name), type);
1.1.1.4   root     4645:   DECL_EXTERNAL (decl) = 1;
1.1       root     4646:   TREE_PUBLIC (decl) = 1;
                   4647: 
                   4648:   /* Since `pushdecl' relies on DECL_ASSEMBLER_NAME instead of DECL_NAME,
                   4649:      we cannot change DECL_ASSEMBLER_NAME until we have installed this
                   4650:      function in the namespace.  */
                   4651:   if (pfn) (*pfn) (decl);
                   4652:   if (library_name)
                   4653:     DECL_ASSEMBLER_NAME (decl) = get_identifier (library_name);
                   4654:   make_function_rtl (decl);
                   4655:   if (function_code != NOT_BUILT_IN)
                   4656:     {
                   4657:       DECL_BUILT_IN (decl) = 1;
                   4658:       DECL_SET_FUNCTION_CODE (decl, function_code);
                   4659:     }
                   4660:   return decl;
                   4661: }
                   4662: 
                   4663: /* Called when a declaration is seen that contains no names to declare.
                   4664:    If its type is a reference to a structure, union or enum inherited
                   4665:    from a containing scope, shadow that tag name for the current scope
                   4666:    with a forward reference.
                   4667:    If its type defines a new named structure or union
                   4668:    or defines an enum, it is valid but we need not do anything here.
                   4669:    Otherwise, it is an error.
                   4670: 
                   4671:    C++: may have to grok the declspecs to learn about static,
                   4672:    complain for anonymous unions.  */
                   4673: 
                   4674: void
                   4675: shadow_tag (declspecs)
                   4676:      tree declspecs;
                   4677: {
                   4678:   int found_tag = 0;
                   4679:   int warned = 0;
                   4680:   register tree link;
                   4681:   register enum tree_code code, ok_code = ERROR_MARK;
                   4682:   register tree t = NULL_TREE;
                   4683: 
                   4684:   for (link = declspecs; link; link = TREE_CHAIN (link))
                   4685:     {
                   4686:       register tree value = TREE_VALUE (link);
                   4687: 
                   4688:       code = TREE_CODE (value);
                   4689:       if (IS_AGGR_TYPE_CODE (code) || code == ENUMERAL_TYPE)
                   4690:        /* Used to test also that TYPE_SIZE (value) != 0.
                   4691:           That caused warning for `struct foo;' at top level in the file.  */
                   4692:        {
                   4693:          register tree name = TYPE_NAME (value);
                   4694: 
                   4695:          if (name == NULL_TREE)
                   4696:            name = lookup_tag_reverse (value, NULL_TREE);
                   4697: 
                   4698:          if (name && TREE_CODE (name) == TYPE_DECL)
                   4699:            name = DECL_NAME (name);
                   4700: 
                   4701:          if (class_binding_level)
                   4702:            t = lookup_tag (code, name, class_binding_level, 1);
                   4703:          else
                   4704:            t = lookup_tag (code, name, current_binding_level, 1);
                   4705: 
1.1.1.5 ! root     4706:          if (t == NULL_TREE)
1.1       root     4707:            {
                   4708:              push_obstacks (&permanent_obstack, &permanent_obstack);
                   4709:              if (IS_AGGR_TYPE_CODE (code))
                   4710:                t = make_lang_type (code);
                   4711:              else
                   4712:                t = make_node (code);
                   4713:              pushtag (name, t);
                   4714:              pop_obstacks ();
                   4715:              ok_code = code;
                   4716:              break;
                   4717:            }
1.1.1.5 ! root     4718:          else if (name != NULL_TREE || code == ENUMERAL_TYPE)
1.1       root     4719:            ok_code = code;
                   4720: 
                   4721:          if (ok_code != ERROR_MARK)
                   4722:            found_tag++;
                   4723:          else
                   4724:            {
                   4725:              if (!warned)
1.1.1.5 ! root     4726:                pedwarn ("useless keyword or type name in declaration");
1.1       root     4727:              warned = 1;
                   4728:            }
                   4729:        }
                   4730:     }
                   4731: 
                   4732:   /* This is where the variables in an anonymous union are
                   4733:      declared.  An anonymous union declaration looks like:
                   4734:      union { ... } ;
                   4735:      because there is no declarator after the union, the parser
                   4736:      sends that declaration here.  */
                   4737:   if (ok_code == UNION_TYPE
                   4738:       && t != NULL_TREE
                   4739:       && ((TREE_CODE (TYPE_NAME (t)) == IDENTIFIER_NODE
                   4740:           && ANON_AGGRNAME_P (TYPE_NAME (t)))
                   4741:          || (TREE_CODE (TYPE_NAME (t)) == TYPE_DECL
1.1.1.4   root     4742:              && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t)))))
1.1       root     4743:     {
1.1.1.4   root     4744:       /* ANSI C++ June 5 1992 WP 9.5.3.  Anonymous unions may not have
                   4745:         function members.  */
                   4746:       if (TYPE_FIELDS (t))
                   4747:        {
                   4748:          tree decl = grokdeclarator (NULL_TREE, declspecs, NORMAL, 0, NULL_TREE);
                   4749:          finish_anon_union (decl);
                   4750:        }
                   4751:       else
                   4752:        error ("anonymous union cannot have a function member");
1.1       root     4753:     }
                   4754:   else if (ok_code == RECORD_TYPE
                   4755:           && found_tag == 1
                   4756:           && TYPE_LANG_SPECIFIC (t)
                   4757:           && CLASSTYPE_DECLARED_EXCEPTION (t))
                   4758:     {
                   4759:       if (TYPE_SIZE (t))
                   4760:        error_with_aggr_type (t, "redeclaration of exception `%s'");
                   4761:       else
                   4762:        {
                   4763:          tree ename, decl;
                   4764: 
                   4765:          push_obstacks (&permanent_obstack, &permanent_obstack);
                   4766: 
                   4767:          pushclass (t, 0);
                   4768:          finish_exception (t, NULL_TREE);
                   4769: 
                   4770:          ename = TYPE_NAME (t);
                   4771:          if (TREE_CODE (ename) == TYPE_DECL)
                   4772:            ename = DECL_NAME (ename);
                   4773:          decl = build_lang_field_decl (VAR_DECL, ename, t);
                   4774:          finish_exception_decl (current_class_name, decl);
                   4775:          end_exception_decls ();
                   4776: 
                   4777:          pop_obstacks ();
                   4778:        }
                   4779:     }
                   4780:   else if (!warned && found_tag > 1)
                   4781:     warning ("multiple types in one declaration");
                   4782: }
                   4783: 
                   4784: /* Decode a "typename", such as "int **", returning a ..._TYPE node.  */
                   4785: 
                   4786: tree
                   4787: groktypename (typename)
                   4788:      tree typename;
                   4789: {
                   4790:   if (TREE_CODE (typename) != TREE_LIST)
                   4791:     return typename;
                   4792:   return grokdeclarator (TREE_VALUE (typename),
                   4793:                         TREE_PURPOSE (typename),
                   4794:                         TYPENAME, 0, NULL_TREE);
                   4795: }
                   4796: 
                   4797: /* Decode a declarator in an ordinary declaration or data definition.
                   4798:    This is called as soon as the type information and variable name
                   4799:    have been parsed, before parsing the initializer if any.
                   4800:    Here we create the ..._DECL node, fill in its type,
                   4801:    and put it on the list of decls for the current context.
                   4802:    The ..._DECL node is returned as the value.
                   4803: 
                   4804:    Exception: for arrays where the length is not specified,
                   4805:    the type is left null, to be filled in by `finish_decl'.
                   4806: 
                   4807:    Function definitions do not come here; they go to start_function
                   4808:    instead.  However, external and forward declarations of functions
                   4809:    do go through here.  Structure field declarations are done by
                   4810:    grokfield and not through here.  */
                   4811: 
                   4812: /* Set this to zero to debug not using the temporary obstack
                   4813:    to parse initializers.  */
                   4814: int debug_temp_inits = 1;
                   4815: 
                   4816: tree
                   4817: start_decl (declarator, declspecs, initialized, raises)
                   4818:      tree declspecs, declarator;
                   4819:      int initialized;
                   4820:      tree raises;
                   4821: {
1.1.1.4   root     4822:   register tree decl;
1.1       root     4823:   register tree type, tem;
                   4824:   tree context;
1.1.1.4   root     4825:   extern int have_extern_spec;
                   4826:   extern int used_extern_spec;
1.1       root     4827: 
                   4828:   int init_written = initialized;
                   4829: 
1.1.1.4   root     4830:   /* This should only be done once on the top most decl. */
                   4831:   if (have_extern_spec && !used_extern_spec)
                   4832:     {
                   4833:       declspecs = decl_tree_cons (NULL_TREE, get_identifier ("extern"), declspecs);
                   4834:       used_extern_spec = 1;
                   4835:     }
                   4836: 
                   4837:   decl = grokdeclarator (declarator, declspecs, NORMAL, initialized, raises);
                   4838:   if (decl == NULL_TREE || decl == void_type_node)
                   4839:     return NULL_TREE;
1.1       root     4840: 
                   4841:   type = TREE_TYPE (decl);
                   4842: 
                   4843:   /* Don't lose if destructors must be executed at file-level.  */
                   4844:   if (TREE_STATIC (decl)
                   4845:       && TYPE_NEEDS_DESTRUCTOR (type)
1.1.1.5 ! root     4846:       && !TREE_PERMANENT (decl))
1.1       root     4847:     {
                   4848:       push_obstacks (&permanent_obstack, &permanent_obstack);
                   4849:       decl = copy_node (decl);
                   4850:       if (TREE_CODE (type) == ARRAY_TYPE)
                   4851:        {
                   4852:          tree itype = TYPE_DOMAIN (type);
                   4853:          if (itype && ! TREE_PERMANENT (itype))
                   4854:            {
                   4855:              itype = build_index_type (copy_to_permanent (TYPE_MAX_VALUE (itype)));
                   4856:              type = build_cplus_array_type (TREE_TYPE (type), itype);
                   4857:              TREE_TYPE (decl) = type;
                   4858:            }
                   4859:        }
                   4860:       pop_obstacks ();
                   4861:     }
                   4862: 
                   4863:   /* Interesting work for this is done in `finish_exception_decl'.  */
                   4864:   if (TREE_CODE (type) == RECORD_TYPE
                   4865:       && CLASSTYPE_DECLARED_EXCEPTION (type))
                   4866:     return decl;
                   4867: 
                   4868:   /* Corresponding pop_obstacks is done in `finish_decl'.  */
                   4869:   push_obstacks_nochange ();
                   4870: 
1.1.1.4   root     4871:   context
                   4872:     = (TREE_CODE (decl) == FUNCTION_DECL && DECL_VIRTUAL_P (decl))
                   4873:       ? DECL_CLASS_CONTEXT (decl)
                   4874:       : DECL_CONTEXT (decl);
1.1       root     4875: 
                   4876:   if (processing_template_decl)
                   4877:     {
                   4878:       tree d;
                   4879:       if (TREE_CODE (decl) == FUNCTION_DECL)
                   4880:         {
                   4881:           /* Declarator is a call_expr; extract arguments from it, since
                   4882:              grokdeclarator didn't do it.  */
                   4883:           tree args;
                   4884:           args = copy_to_permanent (last_function_parms);
                   4885:           if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE)
                   4886:             {
1.1.1.2   root     4887:              tree t = TREE_TYPE (decl);
1.1       root     4888:               tree decl;
                   4889:              
                   4890:               t = TYPE_METHOD_BASETYPE (t); /* type method belongs to */
1.1.1.2   root     4891:              if (TREE_CODE (t) != UNINSTANTIATED_P_TYPE)
                   4892:                {
                   4893:                  t = build_pointer_type (t); /* base type of `this' */
1.1.1.3   root     4894: #if 1
                   4895:                  /* I suspect this is wrong. */
1.1.1.2   root     4896:                  t = build_type_variant (t, flag_this_is_variable <= 0,
                   4897:                                          0); /* type of `this' */
1.1.1.3   root     4898: #else
                   4899:                  t = build_type_variant (t, 0, 0); /* type of `this' */
                   4900: #endif
1.1.1.2   root     4901:                  t = build (PARM_DECL, t, this_identifier);
                   4902:                  TREE_CHAIN (t) = args;
                   4903:                  args = t;
                   4904:                }
1.1       root     4905:            }
                   4906:           DECL_ARGUMENTS (decl) = args;
                   4907:         }
                   4908:       d = build_lang_decl (TEMPLATE_DECL, DECL_NAME (decl), TREE_TYPE (decl));
                   4909:       TREE_PUBLIC (d) = TREE_PUBLIC (decl) = 0;
                   4910:       TREE_STATIC (d) = TREE_STATIC (decl);
1.1.1.4   root     4911:       DECL_EXTERNAL (d) = (DECL_EXTERNAL (decl)
                   4912:                           && !(context && !DECL_THIS_EXTERN (decl)));
1.1       root     4913:       DECL_TEMPLATE_RESULT (d) = decl;
                   4914:       DECL_OVERLOADED (d) = 1;
                   4915:       decl = d;
                   4916:     }
                   4917: 
                   4918:   if (context && TYPE_SIZE (context) != NULL_TREE)
                   4919:     {
                   4920:       /* If it was not explicitly declared `extern',
1.1.1.4   root     4921:         revoke any previous claims of DECL_EXTERNAL.  */
                   4922:       if (DECL_THIS_EXTERN (decl) == 0)
                   4923:        DECL_EXTERNAL (decl) = 0;
1.1       root     4924:       if (DECL_LANG_SPECIFIC (decl))
                   4925:        DECL_IN_AGGR_P (decl) = 0;
                   4926:       pushclass (context, 2);
                   4927:     }
                   4928: 
                   4929:   /* If this type of object needs a cleanup, and control may
                   4930:      jump past it, make a new binding level so that it is cleaned
                   4931:      up only when it is initialized first.  */
                   4932:   if (TYPE_NEEDS_DESTRUCTOR (type)
                   4933:       && current_binding_level->more_cleanups_ok == 0)
                   4934:     pushlevel_temporary (1);
                   4935: 
                   4936:   if (initialized)
                   4937:     /* Is it valid for this decl to have an initializer at all?
                   4938:        If not, set INITIALIZED to zero, which will indirectly
                   4939:        tell `finish_decl' to ignore the initializer once it is parsed.  */
                   4940:     switch (TREE_CODE (decl))
                   4941:       {
                   4942:       case TYPE_DECL:
                   4943:        /* typedef foo = bar  means give foo the same type as bar.
                   4944:           We haven't parsed bar yet, so `finish_decl' will fix that up.
                   4945:           Any other case of an initialization in a TYPE_DECL is an error.  */
                   4946:        if (pedantic || list_length (declspecs) > 1)
                   4947:          {
                   4948:            error ("typedef `%s' is initialized",
                   4949:                   IDENTIFIER_POINTER (DECL_NAME (decl)));
                   4950:            initialized = 0;
                   4951:          }
                   4952:        break;
                   4953: 
                   4954:       case FUNCTION_DECL:
                   4955:        error ("function `%s' is initialized like a variable",
                   4956:               IDENTIFIER_POINTER (DECL_NAME (decl)));
                   4957:        initialized = 0;
                   4958:        break;
                   4959: 
                   4960:       default:
                   4961:        /* Don't allow initializations for incomplete types
                   4962:           except for arrays which might be completed by the initialization.  */
1.1.1.5 ! root     4963:        if (TYPE_SIZE (type) != NULL_TREE)
1.1       root     4964:          ;                     /* A complete type is ok.  */
                   4965:        else if (TREE_CODE (type) != ARRAY_TYPE)
                   4966:          {
                   4967:            error ("variable `%s' has initializer but incomplete type",
                   4968:                   IDENTIFIER_POINTER (DECL_NAME (decl)));
                   4969:            initialized = 0;
                   4970:          }
1.1.1.5 ! root     4971:        else if (TYPE_SIZE (TREE_TYPE (type)) == NULL_TREE)
1.1       root     4972:          {
                   4973:            error ("elements of array `%s' have incomplete type",
                   4974:                   IDENTIFIER_POINTER (DECL_NAME (decl)));
                   4975:            initialized = 0;
                   4976:          }
                   4977:       }
                   4978: 
                   4979:   if (!initialized
                   4980:       && TREE_CODE (decl) != TYPE_DECL
                   4981:       && TREE_CODE (decl) != TEMPLATE_DECL
1.1.1.4   root     4982:       && IS_AGGR_TYPE (type) && ! DECL_EXTERNAL (decl))
1.1       root     4983:     {
1.1.1.5 ! root     4984:       if (TYPE_SIZE (type) == NULL_TREE)
1.1       root     4985:        {
                   4986:          error ("aggregate `%s' has incomplete type and cannot be initialized",
                   4987:                 IDENTIFIER_POINTER (DECL_NAME (decl)));
                   4988:          /* Change the type so that assemble_variable will give
                   4989:             DECL an rtl we can live with: (mem (const_int 0)).  */
                   4990:          TREE_TYPE (decl) = error_mark_node;
                   4991:          type = error_mark_node;
                   4992:        }
                   4993:       else
                   4994:        {
                   4995:          /* If any base type in the hierarchy of TYPE needs a constructor,
                   4996:             then we set initialized to 1.  This way any nodes which are
                   4997:             created for the purposes of initializing this aggregate
                   4998:             will live as long as it does.  This is necessary for global
                   4999:             aggregates which do not have their initializers processed until
                   5000:             the end of the file.  */
                   5001:          initialized = TYPE_NEEDS_CONSTRUCTING (type);
                   5002:        }
                   5003:     }
                   5004: 
                   5005:   if (initialized)
                   5006:     {
                   5007:       if (current_binding_level != global_binding_level
1.1.1.4   root     5008:          && DECL_EXTERNAL (decl))
1.1       root     5009:        warning ("declaration of `%s' has `extern' and is initialized",
                   5010:                 IDENTIFIER_POINTER (DECL_NAME (decl)));
1.1.1.4   root     5011:       DECL_EXTERNAL (decl) = 0;
1.1       root     5012:       if (current_binding_level == global_binding_level)
                   5013:        TREE_STATIC (decl) = 1;
                   5014: 
                   5015:       /* Tell `pushdecl' this is an initialized decl
                   5016:         even though we don't yet have the initializer expression.
                   5017:         Also tell `finish_decl' it may store the real initializer.  */
                   5018:       DECL_INITIAL (decl) = error_mark_node;
                   5019:     }
                   5020: 
                   5021:   /* Add this decl to the current binding level, but not if it
                   5022:      comes from another scope, e.g. a static member variable.
                   5023:      TEM may equal DECL or it may be a previous decl of the same name.  */
                   5024:   if ((TREE_CODE (decl) != PARM_DECL && DECL_CONTEXT (decl) != NULL_TREE)
                   5025:       || (TREE_CODE (decl) == TEMPLATE_DECL && !global_bindings_p ())
                   5026:       || TREE_CODE (type) == LANG_TYPE)
                   5027:     tem = decl;
                   5028:   else
                   5029:     {
                   5030:       tem = pushdecl (decl);
                   5031:       if (TREE_CODE (tem) == TREE_LIST)
                   5032:        {
                   5033:          tree tem2 = value_member (decl, tem);
                   5034:          if (tem2 != NULL_TREE)
                   5035:            tem = TREE_VALUE (tem2);
                   5036:          else
                   5037:            {
                   5038:              while (tem && ! decls_match (decl, TREE_VALUE (tem)))
                   5039:                tem = TREE_CHAIN (tem);
                   5040:              if (tem == NULL_TREE)
                   5041:                tem = decl;
                   5042:              else
                   5043:                tem = TREE_VALUE (tem);
                   5044:            }
                   5045:        }
                   5046:     }
                   5047: 
                   5048: #if 0
                   5049:   /* We don't do this yet for GNU C++.  */
                   5050:   /* For a local variable, define the RTL now.  */
                   5051:   if (current_binding_level != global_binding_level
                   5052:       /* But not if this is a duplicate decl
                   5053:         and we preserved the rtl from the previous one
                   5054:         (which may or may not happen).  */
1.1.1.5 ! root     5055:       && DECL_RTL (tem) == NULL_RTX)
1.1       root     5056:     {
1.1.1.5 ! root     5057:       if (TYPE_SIZE (TREE_TYPE (tem)) != NULL_TREE)
1.1       root     5058:        expand_decl (tem);
                   5059:       else if (TREE_CODE (TREE_TYPE (tem)) == ARRAY_TYPE
1.1.1.5 ! root     5060:               && DECL_INITIAL (tem) != NULL_TREE)
1.1       root     5061:        expand_decl (tem);
                   5062:     }
                   5063: #endif
                   5064: 
                   5065:   if (TREE_CODE (decl) == FUNCTION_DECL && DECL_OVERLOADED (decl))
                   5066:     /* @@ Also done in start_function.  */
                   5067:     tem = push_overloaded_decl (tem, 1);
                   5068:   else if (TREE_CODE (decl) == TEMPLATE_DECL)
                   5069:     {
                   5070:       tree result = DECL_TEMPLATE_RESULT (decl);
                   5071:       if (DECL_CONTEXT (result) != NULL_TREE)
                   5072:        {
1.1.1.4   root     5073:           tree type;
1.1       root     5074:           type = DECL_CONTEXT (result);
1.1.1.4   root     5075:           my_friendly_assert (TREE_CODE (type) == UNINSTANTIATED_P_TYPE, 145);
1.1       root     5076:           if (/* TREE_CODE (result) == VAR_DECL */ 1)
                   5077:             {
                   5078: #if 0
                   5079:               tree tmpl = UPT_TEMPLATE (type);
                   5080:              
                   5081:              fprintf (stderr, "%s:%d: adding ", __FILE__, __LINE__);
                   5082:              print_node_brief (stderr, "", DECL_NAME (tem), 0);
                   5083:              fprintf (stderr, " to class %s\n",
                   5084:                       IDENTIFIER_POINTER (DECL_NAME (tmpl)));
                   5085:               DECL_TEMPLATE_MEMBERS (tmpl)
                   5086:                 = perm_tree_cons (DECL_NAME (tem), tem,
                   5087:                                  DECL_TEMPLATE_MEMBERS (tmpl));
                   5088: #endif
                   5089:              return tem;
                   5090:            }
1.1.1.3   root     5091:           my_friendly_abort (13);
1.1       root     5092:         }
                   5093:       else if (TREE_CODE (result) == FUNCTION_DECL)
                   5094:         tem = push_overloaded_decl (tem, 0);
1.1.1.2   root     5095:       else if (TREE_CODE (result) == VAR_DECL
                   5096:               || TREE_CODE (result) == TYPE_DECL)
1.1       root     5097:        {
1.1.1.5 ! root     5098:          error ("invalid template `%s'",
        !          5099:                 IDENTIFIER_POINTER (DECL_NAME (result)));
1.1.1.4   root     5100:          return NULL_TREE;
1.1       root     5101:        }
                   5102:       else
1.1.1.3   root     5103:        my_friendly_abort (14);
1.1       root     5104:     }
                   5105: 
                   5106:   if (init_written
                   5107:       && ! (TREE_CODE (tem) == PARM_DECL
                   5108:            || (TREE_READONLY (tem)
                   5109:                && (TREE_CODE (tem) == VAR_DECL
                   5110:                    || TREE_CODE (tem) == FIELD_DECL))))
                   5111:     {
                   5112:       /* When parsing and digesting the initializer,
                   5113:         use temporary storage.  Do this even if we will ignore the value.  */
                   5114:       if (current_binding_level == global_binding_level && debug_temp_inits)
                   5115:        {
                   5116:          if (TYPE_NEEDS_CONSTRUCTING (type) || TREE_CODE (type) == REFERENCE_TYPE)
                   5117:            /* In this case, the initializer must lay down in permanent
                   5118:               storage, since it will be saved until `finish_file' is run.   */
                   5119:            ;
                   5120:          else
                   5121:            temporary_allocation ();
                   5122:        }
                   5123:     }
                   5124: 
                   5125:   if (flag_cadillac)
                   5126:     cadillac_start_decl (tem);
                   5127: 
                   5128:   return tem;
                   5129: }
                   5130: 
                   5131: static void
                   5132: make_temporary_for_reference (decl, ctor_call, init, cleanupp)
                   5133:      tree decl, ctor_call, init;
                   5134:      tree *cleanupp;
                   5135: {
                   5136:   tree type = TREE_TYPE (decl);
                   5137:   tree target_type = TREE_TYPE (type);
                   5138:   tree tmp, tmp_addr;
                   5139: 
                   5140:   if (ctor_call)
                   5141:     {
                   5142:       tmp_addr = TREE_VALUE (TREE_OPERAND (ctor_call, 1));
                   5143:       if (TREE_CODE (tmp_addr) == NOP_EXPR)
                   5144:        tmp_addr = TREE_OPERAND (tmp_addr, 0);
1.1.1.4   root     5145:       my_friendly_assert (TREE_CODE (tmp_addr) == ADDR_EXPR, 146);
1.1       root     5146:       tmp = TREE_OPERAND (tmp_addr, 0);
                   5147:     }
                   5148:   else
                   5149:     {
                   5150:       tmp = get_temp_name (target_type,
                   5151:                           current_binding_level == global_binding_level);
                   5152:       tmp_addr = build_unary_op (ADDR_EXPR, tmp, 0);
                   5153:     }
                   5154: 
                   5155:   TREE_TYPE (tmp_addr) = build_pointer_type (target_type);
                   5156:   DECL_INITIAL (decl) = convert (TYPE_POINTER_TO (target_type), tmp_addr);
                   5157:   TREE_TYPE (DECL_INITIAL (decl)) = type;
                   5158:   if (TYPE_NEEDS_CONSTRUCTING (target_type))
                   5159:     {
                   5160:       if (current_binding_level == global_binding_level)
                   5161:        {
                   5162:          /* lay this variable out now.  Otherwise `output_addressed_constants'
                   5163:             gets confused by its initializer.  */
1.1.1.5 ! root     5164:          make_decl_rtl (tmp, NULL_PTR, 1);
1.1       root     5165:          static_aggregates = perm_tree_cons (init, tmp, static_aggregates);
                   5166:        }
                   5167:       else
                   5168:        {
                   5169:          if (ctor_call != NULL_TREE)
                   5170:            init = ctor_call;
                   5171:          else
                   5172:            init = build_method_call (tmp, constructor_name (target_type),
                   5173:                                      build_tree_list (NULL_TREE, init),
                   5174:                                      NULL_TREE, LOOKUP_NORMAL);
                   5175:          DECL_INITIAL (decl) = build (COMPOUND_EXPR, type, init,
                   5176:                                       DECL_INITIAL (decl));
                   5177:          *cleanupp = maybe_build_cleanup (tmp);
                   5178:        }
                   5179:     }
                   5180:   else
                   5181:     {
                   5182:       DECL_INITIAL (tmp) = init;
                   5183:       TREE_STATIC (tmp) = current_binding_level == global_binding_level;
                   5184:       finish_decl (tmp, init, 0, 0);
                   5185:     }
                   5186:   if (TREE_STATIC (tmp))
                   5187:     preserve_initializer ();
                   5188: }
                   5189: 
                   5190: /* Handle initialization of references.
                   5191:    These three arguments from from `finish_decl', and have the
                   5192:    same meaning here that they do there.  */
1.1.1.3   root     5193: /* quotes on semantics can be found in ARM 8.4.3. */
1.1       root     5194: static void
                   5195: grok_reference_init (decl, type, init, cleanupp)
                   5196:      tree decl, type, init;
                   5197:      tree *cleanupp;
                   5198: {
1.1.1.5 ! root     5199:   char *errstr = NULL;
1.1       root     5200:   int is_reference;
                   5201:   tree tmp;
                   5202:   tree this_ptr_type, actual_init;
                   5203: 
                   5204:   if (init == NULL_TREE)
                   5205:     {
1.1.1.5 ! root     5206:       if (DECL_LANG_SPECIFIC (decl) == 0
        !          5207:          || DECL_IN_AGGR_P (decl) == 0)
1.1       root     5208:        {
                   5209:          error ("variable declared as reference not initialized");
                   5210:          if (TREE_CODE (decl) == VAR_DECL)
                   5211:            SET_DECL_REFERENCE_SLOT (decl, error_mark_node);
                   5212:        }
                   5213:       return;
                   5214:     }
                   5215: 
                   5216:   if (TREE_CODE (init) == TREE_LIST)
                   5217:     init = build_compound_expr (init);
                   5218:   is_reference = TREE_CODE (TREE_TYPE (init)) == REFERENCE_TYPE;
                   5219:   tmp = is_reference ? convert_from_reference (init) : init;
                   5220: 
                   5221:   if (is_reference)
                   5222:     {
                   5223:       if (! comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (type)),
                   5224:                       TYPE_MAIN_VARIANT (TREE_TYPE (tmp)), 0))
                   5225:        errstr = "initialization of `%s' from dissimilar reference type";
                   5226:       else if (TYPE_READONLY (TREE_TYPE (type))
                   5227:               >= TYPE_READONLY (TREE_TYPE (TREE_TYPE (init))))
                   5228:        {
                   5229:          is_reference = 0;
                   5230:          init = tmp;
                   5231:        }
                   5232:     }
                   5233:   else
                   5234:     {
                   5235:       if (TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE
                   5236:          && TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE)
                   5237:        {
                   5238:          /* Note: default conversion is only called in very
                   5239:             special cases.  */
                   5240:          init = default_conversion (init);
                   5241:        }
1.1.1.4   root     5242:       if (TREE_CODE (TREE_TYPE (type)) == TREE_CODE (TREE_TYPE (init)))
1.1       root     5243:        {
1.1.1.4   root     5244:          if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (type)),
                   5245:                         TYPE_MAIN_VARIANT (TREE_TYPE (init)), 0))
                   5246:            {
                   5247:              /* This section implements ANSI C++ June 5 1992 WP 8.4.3.5. */
                   5248: 
                   5249:              /* A reference to a volatile T cannot be initialized with
                   5250:                 a const T, and vice-versa.  */
                   5251:              if (TYPE_VOLATILE (TREE_TYPE (type)) && TREE_READONLY (init))
                   5252:                errstr = "cannot initialize a reference to a volatile T with a const T";
                   5253:              else if (TYPE_READONLY (TREE_TYPE (type)) && TREE_THIS_VOLATILE (init))
                   5254:                errstr = "cannot initialize a reference to a const T with a volatile T";
                   5255:              /* A reference to a plain T can be initialized only with
                   5256:                 a plain T.  */
                   5257:              else if (!TYPE_VOLATILE (TREE_TYPE (type))
                   5258:                       && !TYPE_READONLY (TREE_TYPE (type)))
                   5259:                {
                   5260:                  if (TREE_READONLY (init))
                   5261:                    errstr = "cannot initialize a reference to T with a const T";
                   5262:                  else if (TREE_THIS_VOLATILE (init))
                   5263:                    errstr = "cannot initialize a reference to T with a volatile T";
                   5264:                }
                   5265:            }
                   5266:          else
                   5267:            init = convert (TREE_TYPE (type), init);
1.1       root     5268:        }
                   5269:       else if (init != error_mark_node
                   5270:               && ! comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (type)),
                   5271:                               TYPE_MAIN_VARIANT (TREE_TYPE (init)), 0))
                   5272:        errstr = "invalid type conversion for reference";
                   5273:     }
                   5274: 
                   5275:   if (errstr)
                   5276:     {
                   5277:       /* Things did not go smoothly; look for operator& type conversion.  */
                   5278:       if (IS_AGGR_TYPE (TREE_TYPE (tmp)))
                   5279:        {
                   5280:          tmp = build_type_conversion (CONVERT_EXPR, type, init, 0);
                   5281:          if (tmp != NULL_TREE)
                   5282:            {
                   5283:              init = tmp;
                   5284:              if (tmp == error_mark_node)
                   5285:                errstr = "ambiguous pointer conversion";
                   5286:              else
1.1.1.5 ! root     5287:                errstr = NULL;
1.1       root     5288:              is_reference = 1;
                   5289:            }
                   5290:          else
                   5291:            {
                   5292:              tmp = build_type_conversion (CONVERT_EXPR, TREE_TYPE (type), init, 0);
                   5293:              if (tmp != NULL_TREE)
                   5294:                {
                   5295:                  init = tmp;
                   5296:                  if (tmp == error_mark_node)
                   5297:                    errstr = "ambiguous pointer conversion";
                   5298:                  else
1.1.1.5 ! root     5299:                    errstr = NULL;
1.1       root     5300:                  is_reference = 0;
                   5301:                }
                   5302:            }
                   5303:        }
                   5304:       /* Look for constructor.  */
                   5305:       else if (IS_AGGR_TYPE (TREE_TYPE (type))
                   5306:               && TYPE_HAS_CONSTRUCTOR (TREE_TYPE (type)))
                   5307:        {
                   5308:          tmp = get_temp_name (TREE_TYPE (type),
                   5309:                               current_binding_level == global_binding_level);
                   5310:          tmp = build_method_call (tmp, constructor_name (TREE_TYPE (type)),
                   5311:                                   build_tree_list (NULL_TREE, init),
                   5312:                                   NULL_TREE, LOOKUP_NORMAL);
                   5313:          if (tmp == NULL_TREE || tmp == error_mark_node)
                   5314:            {
                   5315:              if (TREE_CODE (decl) == VAR_DECL)
                   5316:                SET_DECL_REFERENCE_SLOT (decl, error_mark_node);
                   5317:              error_with_decl (decl, "constructor failed to build reference initializer");
                   5318:              return;
                   5319:            }
                   5320:          make_temporary_for_reference (decl, tmp, init, cleanupp);
                   5321:          goto done;
                   5322:        }
                   5323:     }
                   5324: 
                   5325:   if (errstr)
                   5326:     {
                   5327:       error_with_decl (decl, errstr);
                   5328:       if (TREE_CODE (decl) == VAR_DECL)
                   5329:        SET_DECL_REFERENCE_SLOT (decl, error_mark_node);
                   5330:       return;
                   5331:     }
                   5332: 
1.1.1.2   root     5333:   /* In the case of initialization, it is permissible
1.1       root     5334:      to assign one reference to another.  */
                   5335:   this_ptr_type = build_pointer_type (TREE_TYPE (type));
                   5336: 
                   5337:   if (is_reference)
                   5338:     {
                   5339:       if (TREE_SIDE_EFFECTS (init))
                   5340:        DECL_INITIAL (decl) = save_expr (init);
                   5341:       else
                   5342:        DECL_INITIAL (decl) = init;
                   5343:     }
                   5344:   else if (lvalue_p (init))
                   5345:     {
                   5346:       tmp = build_unary_op (ADDR_EXPR, init, 0);
                   5347:       if (TREE_CODE (tmp) == ADDR_EXPR
                   5348:          && TREE_CODE (TREE_OPERAND (tmp, 0)) == WITH_CLEANUP_EXPR)
                   5349:        {
                   5350:          /* Associate the cleanup with the reference so that we
                   5351:             don't get burned by "aggressive" cleanup policy.  */
                   5352:          *cleanupp = TREE_OPERAND (TREE_OPERAND (tmp, 0), 2);
                   5353:          TREE_OPERAND (TREE_OPERAND (tmp, 0), 2) = error_mark_node;
                   5354:        }
                   5355:       if (IS_AGGR_TYPE (TREE_TYPE (this_ptr_type)))
                   5356:        DECL_INITIAL (decl) = convert_pointer_to (TREE_TYPE (this_ptr_type), tmp);
                   5357:       else
                   5358:        DECL_INITIAL (decl) = convert (this_ptr_type, tmp);
                   5359: 
                   5360:       DECL_INITIAL (decl) = save_expr (DECL_INITIAL (decl));
                   5361:       if (DECL_INITIAL (decl) == current_class_decl)
                   5362:        DECL_INITIAL (decl) = copy_node (current_class_decl);
                   5363:       TREE_TYPE (DECL_INITIAL (decl)) = type;
                   5364:     }
                   5365:   else if ((actual_init = unary_complex_lvalue (ADDR_EXPR, init)))
                   5366:     {
                   5367:       /* The initializer for this decl goes into its
                   5368:         DECL_REFERENCE_SLOT.  Make sure that we can handle
                   5369:         multiple evaluations without ill effect.  */
                   5370:       if (TREE_CODE (actual_init) == ADDR_EXPR
                   5371:          && TREE_CODE (TREE_OPERAND (actual_init, 0)) == TARGET_EXPR)
                   5372:        actual_init = save_expr (actual_init);
                   5373:       DECL_INITIAL (decl) = convert_pointer_to (TREE_TYPE (this_ptr_type), actual_init);
                   5374:       DECL_INITIAL (decl) = save_expr (DECL_INITIAL (decl));
                   5375:       TREE_TYPE (DECL_INITIAL (decl)) = type;
                   5376:     }
                   5377:   else if (TYPE_READONLY (TREE_TYPE (type)))
                   5378:     /* Section 8.4.3 allows us to make a temporary for
                   5379:        the initialization of const&.  */
                   5380:     make_temporary_for_reference (decl, NULL_TREE, init, cleanupp);
                   5381:   else
                   5382:     {
                   5383:       error_with_decl (decl, "type mismatch in initialization of `%s' (use `const')");
                   5384:       DECL_INITIAL (decl) = error_mark_node;
                   5385:     }
                   5386: 
                   5387:  done:
                   5388:   /* ?? Can this be optimized in some cases to
                   5389:      hand back the DECL_INITIAL slot??  */
                   5390:   if (TYPE_SIZE (TREE_TYPE (type)))
                   5391:     {
                   5392:       init = convert_from_reference (decl);
                   5393:       if (TREE_PERMANENT (decl))
                   5394:        init = copy_to_permanent (init);
                   5395:       SET_DECL_REFERENCE_SLOT (decl, init);
                   5396:     }
                   5397: 
                   5398:   if (TREE_STATIC (decl) && ! TREE_CONSTANT (DECL_INITIAL (decl)))
                   5399:     {
                   5400:       expand_static_init (decl, DECL_INITIAL (decl));
1.1.1.5 ! root     5401:       DECL_INITIAL (decl) = NULL_TREE;
1.1       root     5402:     }
                   5403: }
                   5404: 
                   5405: /* Finish processing of a declaration;
                   5406:    install its line number and initial value.
                   5407:    If the length of an array type is not known before,
                   5408:    it must be determined now, from the initial value, or it is an error.
                   5409: 
                   5410:    Call `pop_obstacks' iff NEED_POP is nonzero.
                   5411: 
                   5412:    For C++, `finish_decl' must be fairly evasive:  it must keep initializers
                   5413:    for aggregates that have constructors alive on the permanent obstack,
                   5414:    so that the global initializing functions can be written at the end.
                   5415: 
                   5416:    INIT0 holds the value of an initializer that should be allowed to escape
                   5417:    the normal rules.
                   5418: 
1.1.1.2   root     5419:    For functions that take default parameters, DECL points to its
1.1.1.3   root     5420:    "maximal" instantiation.  `finish_decl' must then also declared its
1.1       root     5421:    subsequently lower and lower forms of instantiation, checking for
                   5422:    ambiguity as it goes.  This can be sped up later.  */
                   5423: 
                   5424: void
                   5425: finish_decl (decl, init, asmspec_tree, need_pop)
                   5426:      tree decl, init;
                   5427:      tree asmspec_tree;
                   5428:      int need_pop;
                   5429: {
                   5430:   register tree type;
                   5431:   tree cleanup = NULL_TREE, ttype;
                   5432:   int was_incomplete;
                   5433:   int temporary = allocation_temporary_p ();
1.1.1.5 ! root     5434:   char *asmspec = NULL;
1.1       root     5435:   int was_readonly = 0;
                   5436: 
                   5437:   /* If this is 0, then we did not change obstacks.  */
                   5438:   if (! decl)
                   5439:     {
                   5440:       if (init)
                   5441:        error ("assignment (not initialization) in declaration");
                   5442:       return;
                   5443:     }
                   5444: 
                   5445:   if (asmspec_tree)
                   5446:     {
                   5447:       asmspec = TREE_STRING_POINTER (asmspec_tree);
                   5448:       /* Zero out old RTL, since we will rewrite it.  */
1.1.1.5 ! root     5449:       DECL_RTL (decl) = NULL_RTX;
1.1       root     5450:     }
                   5451: 
                   5452:   /* If the type of the thing we are declaring either has
                   5453:      a constructor, or has a virtual function table pointer,
                   5454:      AND its initialization was accepted by `start_decl',
                   5455:      then we stayed on the permanent obstack through the
                   5456:      declaration, otherwise, changed obstacks as GCC would.  */
                   5457: 
                   5458:   type = TREE_TYPE (decl);
                   5459: 
1.1.1.5 ! root     5460:   was_incomplete = (DECL_SIZE (decl) == NULL_TREE);
1.1       root     5461: 
                   5462:   /* Take care of TYPE_DECLs up front.  */
                   5463:   if (TREE_CODE (decl) == TYPE_DECL)
                   5464:     {
                   5465:       if (init && DECL_INITIAL (decl))
                   5466:        {
                   5467:          /* typedef foo = bar; store the type of bar as the type of foo.  */
                   5468:          TREE_TYPE (decl) = type = TREE_TYPE (init);
1.1.1.5 ! root     5469:          DECL_INITIAL (decl) = init = NULL_TREE;
1.1       root     5470:        }
1.1.1.4   root     5471:       if (IS_AGGR_TYPE (type) && DECL_NAME (decl))
1.1       root     5472:        {
                   5473:          if (TREE_TYPE (DECL_NAME (decl)) && TREE_TYPE (decl) != type)
                   5474:            warning ("shadowing previous type declaration of `%s'",
                   5475:                     IDENTIFIER_POINTER (DECL_NAME (decl)));
                   5476:          set_identifier_type_value (DECL_NAME (decl), type);
                   5477:          CLASSTYPE_GOT_SEMICOLON (type) = 1;
                   5478:        }
                   5479:       GNU_xref_decl (current_function_decl, decl);
1.1.1.5 ! root     5480:       rest_of_decl_compilation (decl, NULL_PTR,
        !          5481:                                DECL_CONTEXT (decl) == NULL_TREE, 0);
1.1       root     5482:       goto finish_end;
                   5483:     }
1.1.1.4   root     5484:   if (type != error_mark_node && IS_AGGR_TYPE (type)
                   5485:       && CLASSTYPE_DECLARED_EXCEPTION (type))
1.1       root     5486:     {
                   5487:       finish_exception_decl (NULL_TREE, decl);
                   5488:       CLASSTYPE_GOT_SEMICOLON (type) = 1;
                   5489:       goto finish_end;
                   5490:     }
                   5491:   if (TREE_CODE (decl) != FUNCTION_DECL)
                   5492:     {
                   5493:       ttype = target_type (type);
                   5494: #if 0 /* WTF?  -KR
                   5495:         Leave this out until we can figure out why it was
                   5496:         needed/desirable in the first place.  Then put a comment
                   5497:         here explaining why.  Or just delete the code if no ill
                   5498:         effects arise.  */
                   5499:       if (TYPE_NAME (ttype)
                   5500:          && TREE_CODE (TYPE_NAME (ttype)) == TYPE_DECL
                   5501:          && ANON_AGGRNAME_P (TYPE_IDENTIFIER (ttype)))
                   5502:        {
                   5503:          tree old_id = TYPE_IDENTIFIER (ttype);
                   5504:          char *newname = (char *)alloca (IDENTIFIER_LENGTH (old_id) + 2);
                   5505:          /* Need to preserve template data for UPT nodes.  */
                   5506:          tree old_template = IDENTIFIER_TEMPLATE (old_id);
                   5507:          newname[0] = '_';
                   5508:          bcopy (IDENTIFIER_POINTER (old_id), newname + 1,
                   5509:                 IDENTIFIER_LENGTH (old_id) + 1);
                   5510:          old_id = get_identifier (newname);
                   5511:          lookup_tag_reverse (ttype, old_id);
                   5512:          TYPE_IDENTIFIER (ttype) = old_id;
                   5513:          IDENTIFIER_TEMPLATE (old_id) = old_template;
                   5514:        }
                   5515: #endif
                   5516:     }
                   5517: 
1.1.1.4   root     5518:   if (! DECL_EXTERNAL (decl) && TREE_READONLY (decl)
1.1       root     5519:       && TYPE_NEEDS_CONSTRUCTING (type))
                   5520:     {
                   5521: 
                   5522:       /* Currently, GNU C++ puts constants in text space, making them
                   5523:         impossible to initialize.  In the future, one would hope for
                   5524:         an operating system which understood the difference between
                   5525:         initialization and the running of a program.  */
                   5526:       was_readonly = 1;
                   5527:       TREE_READONLY (decl) = 0;
                   5528:     }
                   5529: 
                   5530:   if (TREE_CODE (decl) == FIELD_DECL)
                   5531:     {
                   5532:       if (init && init != error_mark_node)
1.1.1.4   root     5533:        my_friendly_assert (TREE_PERMANENT (init), 147);
1.1       root     5534: 
                   5535:       if (asmspec)
                   5536:        {
                   5537:          /* This must override the asm specifier which was placed
                   5538:             by grokclassfn.  Lay this out fresh.
                   5539:             
                   5540:             @@ Should emit an error if this redefines an asm-specified
                   5541:             @@ name, or if we have already used the function's name.  */
1.1.1.5 ! root     5542:          DECL_RTL (TREE_TYPE (decl)) = NULL_RTX;
1.1       root     5543:          DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
                   5544:          make_decl_rtl (decl, asmspec, 0);
                   5545:        }
                   5546:     }
                   5547:   /* If `start_decl' didn't like having an initialization, ignore it now.  */
1.1.1.5 ! root     5548:   else if (init != NULL_TREE && DECL_INITIAL (decl) == NULL_TREE)
        !          5549:     init = NULL_TREE;
1.1.1.4   root     5550:   else if (DECL_EXTERNAL (decl))
1.1       root     5551:     ;
                   5552:   else if (TREE_CODE (type) == REFERENCE_TYPE)
                   5553:     {
                   5554:       grok_reference_init (decl, type, init, &cleanup);
1.1.1.5 ! root     5555:       init = NULL_TREE;
1.1       root     5556:     }
                   5557: 
                   5558:   GNU_xref_decl (current_function_decl, decl);
                   5559: 
1.1.1.4   root     5560:   if (TREE_CODE (decl) == FIELD_DECL || DECL_EXTERNAL (decl))
1.1       root     5561:     ;
                   5562:   else if (TREE_CODE (decl) == CONST_DECL)
                   5563:     {
1.1.1.4   root     5564:       my_friendly_assert (TREE_CODE (decl) != REFERENCE_TYPE, 148);
1.1       root     5565: 
                   5566:       DECL_INITIAL (decl) = init;
                   5567: 
                   5568:       /* This will keep us from needing to worry about our obstacks.  */
1.1.1.5 ! root     5569:       my_friendly_assert (init != NULL_TREE, 149);
        !          5570:       init = NULL_TREE;
1.1       root     5571:     }
                   5572:   else if (init)
                   5573:     {
                   5574:       if (TYPE_NEEDS_CONSTRUCTING (type))
                   5575:        {
                   5576:          if (TREE_CODE (type) == ARRAY_TYPE)
1.1.1.5 ! root     5577:            init = digest_init (type, init, (tree *) 0);
1.1       root     5578:          else if (TREE_CODE (init) == CONSTRUCTOR
                   5579:                   && CONSTRUCTOR_ELTS (init) != NULL_TREE)
                   5580:            {
                   5581:              error_with_decl (decl, "`%s' must be initialized by constructor, not by `{...}'");
                   5582:              init = error_mark_node;
                   5583:            }
                   5584: #if 0
                   5585:          /* fix this in `build_functional_cast' instead.
                   5586:             Here's the trigger code:
                   5587: 
                   5588:                struct ostream
                   5589:                {
                   5590:                  ostream ();
                   5591:                  ostream (int, char *);
                   5592:                  ostream (char *);
                   5593:                  operator char *();
                   5594:                  ostream (void *);
                   5595:                  operator void *();
                   5596:                  operator << (int);
                   5597:                };
                   5598:                int buf_size = 1024;
                   5599:                static char buf[buf_size];
                   5600:                const char *debug(int i) {
                   5601:                  char *b = &buf[0];
                   5602:                  ostream o = ostream(buf_size, b);
                   5603:                  o << i;
                   5604:                  return buf;
                   5605:                }
                   5606:                */
                   5607: 
                   5608:          else if (TREE_CODE (init) == TARGET_EXPR
                   5609:                   && TREE_CODE (TREE_OPERAND (init, 1) == NEW_EXPR))
                   5610:            {
                   5611:              /* User wrote something like `foo x = foo (args)'  */
1.1.1.4   root     5612:              my_friendly_assert (TREE_CODE (TREE_OPERAND (init, 0)) == VAR_DECL, 150);
                   5613:              my_friendly_assert (DECL_NAME (TREE_OPERAND (init, 0)) == NULL_TREE, 151);
1.1       root     5614: 
                   5615:              /* User wrote exactly `foo x = foo (args)'  */
                   5616:              if (TYPE_MAIN_VARIANT (type) == TREE_TYPE (init))
                   5617:                {
                   5618:                  init = build (CALL_EXPR, TREE_TYPE (init),
                   5619:                                TREE_OPERAND (TREE_OPERAND (init, 1), 0),
                   5620:                                TREE_OPERAND (TREE_OPERAND (init, 1), 1), 0);
                   5621:                  TREE_SIDE_EFFECTS (init) = 1;
                   5622:                }
                   5623:            }
                   5624: #endif
                   5625: 
                   5626:          /* We must hide the initializer so that expand_decl
                   5627:             won't try to do something it does not understand.  */
                   5628:          if (current_binding_level == global_binding_level)
                   5629:            {
1.1.1.5 ! root     5630:              tree value = digest_init (type, empty_init_node, (tree *) 0);
1.1       root     5631:              DECL_INITIAL (decl) = value;
                   5632:            }
                   5633:          else
                   5634:            DECL_INITIAL (decl) = error_mark_node;
                   5635:        }
                   5636:       else
                   5637:        {
                   5638:          if (TREE_CODE (init) != TREE_VEC)
                   5639:            init = store_init_value (decl, init);
                   5640: 
                   5641:          if (init)
                   5642:            /* Don't let anyone try to initialize this variable
                   5643:               until we are ready to do so.  */
                   5644:            DECL_INITIAL (decl) = error_mark_node;
                   5645:        }
                   5646:     }
                   5647:   else if (TREE_CODE_CLASS (TREE_CODE (type)) == 't'
                   5648:           && (IS_AGGR_TYPE (type) || TYPE_NEEDS_CONSTRUCTING (type)))
                   5649:     {
                   5650:       tree ctype = type;
                   5651:       while (TREE_CODE (ctype) == ARRAY_TYPE)
                   5652:        ctype = TREE_TYPE (ctype);
                   5653:       if (! TYPE_NEEDS_CONSTRUCTOR (ctype))
                   5654:        {
                   5655:          if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (ctype))
                   5656:            error_with_decl (decl, "structure `%s' with uninitialized const members");
                   5657:          if (CLASSTYPE_REF_FIELDS_NEED_INIT (ctype))
                   5658:            error_with_decl (decl, "structure `%s' with uninitialized reference members");
                   5659:        }
                   5660: 
                   5661:       if (TREE_CODE (decl) == VAR_DECL
                   5662:          && !TYPE_NEEDS_CONSTRUCTING (type)
                   5663:          && (TYPE_READONLY (type) || TREE_READONLY (decl)))
                   5664:        error_with_decl (decl, "uninitialized const `%s'");
                   5665: 
                   5666:       /* Initialize variables in need of static initialization
                   5667:         with `empty_init_node' to keep assemble_variable from putting them
                   5668:         in the wrong program space.  (Common storage is okay for non-public
                   5669:         uninitialized data; the linker can't match it with storage from other
                   5670:         files, and we may save some disk space.)  */
                   5671:       if (flag_pic == 0
                   5672:          && TREE_STATIC (decl)
                   5673:          && TREE_PUBLIC (decl)
1.1.1.4   root     5674:          && ! DECL_EXTERNAL (decl)
1.1       root     5675:          && TREE_CODE (decl) == VAR_DECL
                   5676:          && TYPE_NEEDS_CONSTRUCTING (type)
1.1.1.5 ! root     5677:          && (DECL_INITIAL (decl) == NULL_TREE
1.1       root     5678:              || DECL_INITIAL (decl) == error_mark_node))
                   5679:        {
1.1.1.5 ! root     5680:          tree value = digest_init (type, empty_init_node, (tree *) 0);
1.1       root     5681:          DECL_INITIAL (decl) = value;
                   5682:        }
                   5683:     }
                   5684:   else if (TREE_CODE (decl) == VAR_DECL
                   5685:           && TREE_CODE (type) != REFERENCE_TYPE
                   5686:           && (TYPE_READONLY (type) || TREE_READONLY (decl)))
                   5687:     {
1.1.1.4   root     5688:       /* ``Unless explicitly declared extern, a const object does not have
1.1.1.5 ! root     5689:         external linkage and must be initialized. ($8.4; $12.1)'' ARM 7.1.6
        !          5690:         However, if it's `const int foo = 1; const int foo;', don't complain
        !          5691:         about the second decl, since it does have an initializer before.  */
        !          5692:       if (! DECL_INITIAL (decl) && (!pedantic || !current_class_type))
        !          5693:        error_with_decl (decl, "uninitialized const `%s'");
1.1       root     5694:     }
                   5695: 
                   5696:   /* For top-level declaration, the initial value was read in
                   5697:      the temporary obstack.  MAXINDEX, rtl, etc. to be made below
                   5698:      must go in the permanent obstack; but don't discard the
                   5699:      temporary data yet.  */
                   5700: 
                   5701:   if (current_binding_level == global_binding_level && temporary)
                   5702:     end_temporary_allocation ();
                   5703: 
                   5704:   /* Deduce size of array from initialization, if not already known.  */
                   5705: 
                   5706:   if (TREE_CODE (type) == ARRAY_TYPE
1.1.1.5 ! root     5707:       && TYPE_DOMAIN (type) == NULL_TREE
1.1       root     5708:       && TREE_CODE (decl) != TYPE_DECL)
                   5709:     {
                   5710:       int do_default
                   5711:        = (TREE_STATIC (decl)
                   5712:           /* Even if pedantic, an external linkage array
                   5713:              may have incomplete type at first.  */
1.1.1.4   root     5714:           ? pedantic && DECL_EXTERNAL (decl)
                   5715:           : !DECL_EXTERNAL (decl));
1.1       root     5716:       tree initializer = init ? init : DECL_INITIAL (decl);
                   5717:       int failure = complete_array_type (type, initializer, do_default);
                   5718: 
                   5719:       if (failure == 1)
                   5720:        error_with_decl (decl, "initializer fails to determine size of `%s'");
                   5721: 
                   5722:       if (failure == 2)
                   5723:        {
                   5724:          if (do_default)
                   5725:            error_with_decl (decl, "array size missing in `%s'");
                   5726:          else if (!pedantic && TREE_STATIC (decl))
1.1.1.4   root     5727:            DECL_EXTERNAL (decl) = 1;
1.1       root     5728:        }
                   5729: 
1.1.1.5 ! root     5730:       if (pedantic && TYPE_DOMAIN (type) != NULL_TREE
1.1       root     5731:          && tree_int_cst_lt (TYPE_MAX_VALUE (TYPE_DOMAIN (type)),
                   5732:                              integer_zero_node))
                   5733:        error_with_decl (decl, "zero-size array `%s'");
                   5734: 
                   5735:       layout_decl (decl, 0);
                   5736:     }
                   5737: 
                   5738:   if (TREE_CODE (decl) == VAR_DECL)
                   5739:     {
1.1.1.5 ! root     5740:       if (TREE_STATIC (decl) && DECL_SIZE (decl) == NULL_TREE)
1.1       root     5741:        {
                   5742:          /* A static variable with an incomplete type:
                   5743:             that is an error if it is initialized or `static'.
                   5744:             Otherwise, let it through, but if it is not `extern'
                   5745:             then it may cause an error message later.  */
1.1.1.5 ! root     5746:          if (!DECL_EXTERNAL (decl) || DECL_INITIAL (decl) != NULL_TREE)
1.1       root     5747:            error_with_decl (decl, "storage size of `%s' isn't known");
1.1.1.5 ! root     5748:          init = NULL_TREE;
1.1       root     5749:        }
1.1.1.5 ! root     5750:       else if (!DECL_EXTERNAL (decl) && DECL_SIZE (decl) == NULL_TREE)
1.1       root     5751:        {
1.1.1.5 ! root     5752:          /* An automatic variable with an incomplete type: that is an error.
        !          5753:             Don't talk about array types here, since we took care of that
        !          5754:             message in grokdeclarator.  */
1.1       root     5755:          error_with_decl (decl, "storage size of `%s' isn't known");
                   5756:          TREE_TYPE (decl) = error_mark_node;
                   5757:        }
1.1.1.4   root     5758:       else if (!DECL_EXTERNAL (decl) && IS_AGGR_TYPE (ttype))
1.1       root     5759:        /* Let debugger know it should output info for this type.  */
                   5760:        note_debug_info_needed (ttype);
                   5761: 
1.1.1.4   root     5762:       if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl))
1.1.1.5 ! root     5763:          && DECL_SIZE (decl) != NULL_TREE
        !          5764:          && ! TREE_CONSTANT (DECL_SIZE (decl)))
1.1       root     5765:        error_with_decl (decl, "storage size of `%s' isn't constant");
                   5766: 
1.1.1.4   root     5767:       if (!DECL_EXTERNAL (decl) && TYPE_NEEDS_DESTRUCTOR (type))
1.1       root     5768:        {
                   5769:          int yes = suspend_momentary ();
                   5770: 
                   5771:          /* If INIT comes from a functional cast, use the cleanup
                   5772:             we built for that.  Otherwise, make our own cleanup.  */
                   5773:          if (init && TREE_CODE (init) == WITH_CLEANUP_EXPR
                   5774:              && comptypes (TREE_TYPE (decl), TREE_TYPE (init), 1))
                   5775:            {
                   5776:              cleanup = TREE_OPERAND (init, 2);
                   5777:              init = TREE_OPERAND (init, 0);
                   5778:              current_binding_level->have_cleanups = 1;
                   5779:              current_binding_level->more_exceptions_ok = 0;
                   5780:            }
                   5781:          else
                   5782:            cleanup = maybe_build_cleanup (decl);
                   5783:          resume_momentary (yes);
                   5784:        }
                   5785:     }
                   5786:   /* PARM_DECLs get cleanups, too.  */
                   5787:   else if (TREE_CODE (decl) == PARM_DECL && TYPE_NEEDS_DESTRUCTOR (type))
                   5788:     {
                   5789:       if (temporary)
                   5790:        end_temporary_allocation ();
                   5791:       cleanup = maybe_build_cleanup (decl);
                   5792:       if (temporary)
                   5793:        resume_temporary_allocation ();
                   5794:     }
                   5795: 
                   5796:   /* Output the assembler code and/or RTL code for variables and functions,
                   5797:      unless the type is an undefined structure or union.
                   5798:      If not, it will get done when the type is completed.  */
                   5799: 
                   5800:   if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL
                   5801:       || TREE_CODE (decl) == RESULT_DECL)
                   5802:     {
                   5803:       int toplev = current_binding_level == global_binding_level;
                   5804:       int was_temp
                   5805:        = ((flag_traditional
                   5806:            || (TREE_STATIC (decl) && TYPE_NEEDS_DESTRUCTOR (type)))
                   5807:           && allocation_temporary_p ());
                   5808: 
                   5809:       if (was_temp)
                   5810:        end_temporary_allocation ();
                   5811: 
                   5812:       /* If we are in need of a cleanup, get out of any implicit
                   5813:         handlers that have been established so far.  */
                   5814:       if (cleanup && current_binding_level->parm_flag == 3)
                   5815:        {
                   5816:          pop_implicit_try_blocks (decl);
                   5817:          current_binding_level->more_exceptions_ok = 0;
                   5818:        }
                   5819: 
                   5820:       if (TREE_CODE (decl) == VAR_DECL
                   5821:          && current_binding_level != global_binding_level
                   5822:          && ! TREE_STATIC (decl)
                   5823:          && type_needs_gc_entry (type))
                   5824:        DECL_GC_OFFSET (decl) = size_int (++current_function_obstack_index);
                   5825: 
                   5826:       if (TREE_CODE (decl) == VAR_DECL && DECL_VIRTUAL_P (decl))
1.1.1.5 ! root     5827:        make_decl_rtl (decl, NULL_PTR, toplev);
1.1       root     5828:       else if (TREE_CODE (decl) == VAR_DECL
                   5829:               && TREE_READONLY (decl)
1.1.1.5 ! root     5830:               && DECL_INITIAL (decl) != NULL_TREE
1.1       root     5831:               && DECL_INITIAL (decl) != error_mark_node
                   5832:               && DECL_INITIAL (decl) != empty_init_node)
                   5833:        {
                   5834:          DECL_INITIAL (decl) = save_expr (DECL_INITIAL (decl));
                   5835: 
                   5836:          if (asmspec)
                   5837:            DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
                   5838: 
                   5839:          if (! toplev
                   5840:              && TREE_STATIC (decl)
                   5841:              && ! TREE_SIDE_EFFECTS (decl)
                   5842:              && ! TREE_PUBLIC (decl)
1.1.1.4   root     5843:              && ! DECL_EXTERNAL (decl)
1.1       root     5844:              && ! TYPE_NEEDS_DESTRUCTOR (type)
                   5845:              && DECL_MODE (decl) != BLKmode)
                   5846:            {
                   5847:              /* If this variable is really a constant, then fill its DECL_RTL
                   5848:                 slot with something which won't take up storage.
                   5849:                 If something later should take its address, we can always give
                   5850:                 it legitimate RTL at that time.  */
1.1.1.4   root     5851:              DECL_RTL (decl) = gen_reg_rtx (DECL_MODE (decl));
1.1       root     5852:              store_expr (DECL_INITIAL (decl), DECL_RTL (decl), 0);
                   5853:              TREE_ASM_WRITTEN (decl) = 1;
                   5854:            }
                   5855:          else if (toplev)
                   5856:            {
                   5857:              /* Keep GCC from complaining that this variable
                   5858:                 is defined but never used.  */
1.1.1.4   root     5859:              TREE_USED (decl) = 1;
1.1       root     5860:              /* If this is a static const, change its apparent linkage
                   5861:                 if it belongs to a #pragma interface.  */
1.1.1.4   root     5862:              if (TREE_STATIC (decl) && !interface_unknown)
1.1       root     5863:                {
1.1.1.4   root     5864:                  TREE_PUBLIC (decl) = 1;
                   5865:                  DECL_EXTERNAL (decl) = interface_only;
1.1       root     5866:                }
                   5867:              make_decl_rtl (decl, asmspec, toplev);
                   5868:            }
                   5869:          else
                   5870:            rest_of_decl_compilation (decl, asmspec, toplev, 0);
                   5871:        }
                   5872:       else if (TREE_CODE (decl) == VAR_DECL
                   5873:               && DECL_LANG_SPECIFIC (decl)
                   5874:               && DECL_IN_AGGR_P (decl))
                   5875:        {
                   5876:          if (TREE_STATIC (decl))
1.1.1.5 ! root     5877:            if (init == NULL_TREE
1.1       root     5878: #ifdef DEFAULT_STATIC_DEFS
                   5879:                /* If this code is dead, then users must
                   5880:                   explicitly declare static member variables
                   5881:                   outside the class def'n as well.  */
                   5882:                && TYPE_NEEDS_CONSTRUCTING (type)
                   5883: #endif
                   5884:                )
                   5885:              {
1.1.1.4   root     5886:                DECL_EXTERNAL (decl) = 1;
1.1       root     5887:                make_decl_rtl (decl, asmspec, 1);
                   5888:              }
                   5889:            else
                   5890:              rest_of_decl_compilation (decl, asmspec, toplev, 0);
                   5891:          else
                   5892:            /* Just a constant field.  Should not need any rtl.  */
                   5893:            goto finish_end0;
                   5894:        }
                   5895:       else
                   5896:        rest_of_decl_compilation (decl, asmspec, toplev, 0);
                   5897: 
                   5898:       if (was_temp)
                   5899:        resume_temporary_allocation ();
                   5900: 
1.1.1.4   root     5901:       if (type != error_mark_node
                   5902:          && TYPE_LANG_SPECIFIC (type)
                   5903:          && CLASSTYPE_ABSTRACT_VIRTUALS (type))
1.1       root     5904:        abstract_virtuals_error (decl, type);
1.1.1.3   root     5905:       else if ((TREE_CODE (type) == FUNCTION_TYPE
                   5906:                || TREE_CODE (type) == METHOD_TYPE)
1.1       root     5907:               && TYPE_LANG_SPECIFIC (TREE_TYPE (type))
                   5908:               && CLASSTYPE_ABSTRACT_VIRTUALS (TREE_TYPE (type)))
                   5909:        abstract_virtuals_error (decl, TREE_TYPE (type));
                   5910: 
                   5911:       if (TREE_CODE (decl) == FUNCTION_DECL)
                   5912:        {
                   5913:          /* C++: Handle overloaded functions with default parameters.  */
                   5914:          if (DECL_OVERLOADED (decl))
                   5915:            {
                   5916:              tree parmtypes = TYPE_ARG_TYPES (type);
                   5917:              tree prev = NULL_TREE;
1.1.1.2   root     5918:              tree original_name = DECL_NAME (decl);
1.1       root     5919:              struct lang_decl *tmp_lang_decl = DECL_LANG_SPECIFIC (decl);
1.1.1.2   root     5920:              /* All variants will share an uncollectible lang_decl.  */
1.1       root     5921:              copy_decl_lang_specific (decl);
                   5922: 
                   5923:              while (parmtypes && parmtypes != void_list_node)
                   5924:                {
                   5925:                  if (TREE_PURPOSE (parmtypes))
                   5926:                    {
                   5927:                      tree fnname, fndecl;
                   5928:                      tree *argp = prev
                   5929:                        ? & TREE_CHAIN (prev)
                   5930:                          : & TYPE_ARG_TYPES (type);
                   5931: 
                   5932:                      *argp = NULL_TREE;
                   5933:                      fnname = build_decl_overload (original_name, TYPE_ARG_TYPES (type), 0);
                   5934:                      *argp = parmtypes;
                   5935:                      fndecl = build_decl (FUNCTION_DECL, fnname, type);
1.1.1.4   root     5936:                      DECL_EXTERNAL (fndecl) = DECL_EXTERNAL (decl);
1.1       root     5937:                      TREE_PUBLIC (fndecl) = TREE_PUBLIC (decl);
1.1.1.4   root     5938:                      DECL_INLINE (fndecl) = DECL_INLINE (decl);
1.1       root     5939:                      /* Keep G++ from thinking this function is unused.
                   5940:                         It is only used to speed up search in name space.  */
                   5941:                      TREE_USED (fndecl) = 1;
                   5942:                      TREE_ASM_WRITTEN (fndecl) = 1;
                   5943:                      DECL_INITIAL (fndecl) = NULL_TREE;
                   5944:                      DECL_LANG_SPECIFIC (fndecl) = DECL_LANG_SPECIFIC (decl);
                   5945:                      fndecl = pushdecl (fndecl);
                   5946:                      DECL_INITIAL (fndecl) = error_mark_node;
                   5947:                      DECL_RTL (fndecl) = DECL_RTL (decl);
                   5948:                    }
                   5949:                  prev = parmtypes;
                   5950:                  parmtypes = TREE_CHAIN (parmtypes);
                   5951:                }
                   5952:              DECL_LANG_SPECIFIC (decl) = tmp_lang_decl;
                   5953:            }
                   5954:        }
1.1.1.4   root     5955:       else if (DECL_EXTERNAL (decl))
1.1       root     5956:        ;
                   5957:       else if (TREE_STATIC (decl) && type != error_mark_node)
                   5958:        {
                   5959:          /* Cleanups for static variables are handled by `finish_file'.  */
                   5960:          if (TYPE_NEEDS_CONSTRUCTING (type) || init != NULL_TREE)
                   5961:            expand_static_init (decl, init);
1.1.1.4   root     5962:          else if (TYPE_NEEDS_DESTRUCTOR (type))
                   5963:            static_aggregates = perm_tree_cons (NULL_TREE, decl,
                   5964:                                                static_aggregates);
1.1       root     5965: 
                   5966:          /* Make entry in appropriate vector.  */
                   5967:          if (flag_gc && type_needs_gc_entry (type))
                   5968:            build_static_gc_entry (decl, type);
                   5969:        }
                   5970:       else if (current_binding_level != global_binding_level)
                   5971:        {
                   5972:          /* This is a declared decl which must live until the
                   5973:             end of the binding contour.  It may need a cleanup.  */
                   5974: 
                   5975:          /* Recompute the RTL of a local array now
                   5976:             if it used to be an incomplete type.  */
                   5977:          if (was_incomplete && ! TREE_STATIC (decl))
                   5978:            {
                   5979:              /* If we used it already as memory, it must stay in memory.  */
                   5980:              TREE_ADDRESSABLE (decl) = TREE_USED (decl);
                   5981:              /* If it's still incomplete now, no init will save it.  */
1.1.1.5 ! root     5982:              if (DECL_SIZE (decl) == NULL_TREE)
        !          5983:                DECL_INITIAL (decl) = NULL_TREE;
1.1       root     5984:              expand_decl (decl);
                   5985:            }
                   5986:          else if (! TREE_ASM_WRITTEN (decl)
1.1.1.5 ! root     5987:                   && (TYPE_SIZE (type) != NULL_TREE
        !          5988:                       || TREE_CODE (type) == ARRAY_TYPE))
1.1       root     5989:            {
                   5990:              /* Do this here, because we did not expand this decl's
                   5991:                 rtl in start_decl.  */
1.1.1.5 ! root     5992:              if (DECL_RTL (decl) == NULL_RTX)
1.1       root     5993:                expand_decl (decl);
                   5994:              else if (cleanup)
                   5995:                {
                   5996:                  expand_decl_cleanup (NULL_TREE, cleanup);
                   5997:                  /* Cleanup used up here.  */
1.1.1.5 ! root     5998:                  cleanup = NULL_TREE;
1.1       root     5999:                }
                   6000:            }
                   6001: 
                   6002:          if (DECL_SIZE (decl) && type != error_mark_node)
                   6003:            {
                   6004:              /* Compute and store the initial value.  */
                   6005:              expand_decl_init (decl);
                   6006: 
                   6007:              if (init || TYPE_NEEDS_CONSTRUCTING (type))
                   6008:                {
                   6009:                  emit_line_note (DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
                   6010:                  expand_aggr_init (decl, init, 0);
                   6011:                }
                   6012: 
                   6013:              /* Set this to 0 so we can tell whether an aggregate
                   6014:                 which was initialized was ever used.  */
                   6015:              if (TYPE_NEEDS_CONSTRUCTING (type))
                   6016:                TREE_USED (decl) = 0;
                   6017: 
                   6018:              /* Store the cleanup, if there was one.  */
                   6019:              if (cleanup)
                   6020:                {
                   6021:                  if (! expand_decl_cleanup (decl, cleanup))
                   6022:                    error_with_decl (decl, "parser lost in parsing declaration of `%s'");
                   6023:                }
                   6024:            }
                   6025:        }
                   6026:     finish_end0:
                   6027: 
                   6028:       /* Undo call to `pushclass' that was done in `start_decl'
                   6029:         due to initialization of qualified member variable.
                   6030:         I.e., Foo::x = 10;  */
                   6031:       {
                   6032:        tree context = DECL_CONTEXT (decl);
                   6033:        if (context
1.1.1.4   root     6034:            && TREE_CODE_CLASS (TREE_CODE (context)) == 't'
1.1       root     6035:            && (TREE_CODE (decl) == VAR_DECL
                   6036:                /* We also have a pushclass done that we need to undo here
                   6037:                   if we're at top level and declare a method.  */
                   6038:                || (TREE_CODE (decl) == FUNCTION_DECL
                   6039:                    /* If size hasn't been set, we're still defining it,
                   6040:                       and therefore inside the class body; don't pop
                   6041:                       the binding level..  */
1.1.1.5 ! root     6042:                    && TYPE_SIZE (context) != NULL_TREE
1.1       root     6043:                    /* The binding level gets popped elsewhere for a
                   6044:                       friend declaration inside another class.  */
1.1.1.3   root     6045:                    && TYPE_IDENTIFIER (context) == current_class_name
1.1       root     6046:                    )))
                   6047:          popclass (1);
                   6048:       }
                   6049:     }
                   6050: 
                   6051:  finish_end:
                   6052: 
                   6053:   if (need_pop)
                   6054:     {
                   6055:       /* Resume permanent allocation, if not within a function.  */
                   6056:       /* The corresponding push_obstacks_nochange is in start_decl,
                   6057:         start_method, groktypename, and in grokfield.  */
                   6058:       pop_obstacks ();
                   6059:     }
                   6060: 
                   6061:   if (was_readonly)
                   6062:     TREE_READONLY (decl) = 1;
                   6063: 
                   6064:   if (flag_cadillac)
                   6065:     cadillac_finish_decl (decl);
                   6066: }
                   6067: 
                   6068: static void
                   6069: expand_static_init (decl, init)
                   6070:      tree decl;
                   6071:      tree init;
                   6072: {
                   6073:   tree oldstatic = value_member (decl, static_aggregates);
                   6074:   if (oldstatic)
                   6075:     {
                   6076:       if (TREE_PURPOSE (oldstatic))
                   6077:        error_with_decl (decl, "multiple initializations given for `%s'");
                   6078:     }
                   6079:   else if (current_binding_level != global_binding_level)
                   6080:     {
                   6081:       /* Emit code to perform this initialization but once.  */
                   6082:       tree temp;
                   6083: 
                   6084:       /* Remember this information until end of file. */
                   6085:       push_obstacks (&permanent_obstack, &permanent_obstack);
                   6086: 
                   6087:       /* Emit code to perform this initialization but once.  */
                   6088:       temp = get_temp_name (integer_type_node, 1);
1.1.1.5 ! root     6089:       rest_of_decl_compilation (temp, NULL_PTR, 0, 0);
1.1       root     6090:       expand_start_cond (build_binary_op (EQ_EXPR, temp,
1.1.1.5 ! root     6091:                                          integer_zero_node, 1), 0);
1.1       root     6092:       expand_assignment (temp, integer_one_node, 0, 0);
                   6093:       if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
                   6094:        {
                   6095:          expand_aggr_init (decl, init, 0);
                   6096:          do_pending_stack_adjust ();
                   6097:        }
                   6098:       else
                   6099:        expand_assignment (decl, init, 0, 0);
                   6100:       expand_end_cond ();
                   6101:       if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (decl)))
                   6102:        {
                   6103:          static_aggregates = perm_tree_cons (temp, decl, static_aggregates);
                   6104:          TREE_STATIC (static_aggregates) = 1;
                   6105:        }
                   6106: 
                   6107:       /* Resume old (possibly temporary) allocation. */
                   6108:       pop_obstacks ();
                   6109:     }
                   6110:   else
                   6111:     {
                   6112:       /* This code takes into account memory allocation
                   6113:         policy of `start_decl'.  Namely, if TYPE_NEEDS_CONSTRUCTING
                   6114:         does not hold for this object, then we must make permanent
                   6115:         the storage currently in the temporary obstack.  */
                   6116:       if (! TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
                   6117:        preserve_initializer ();
                   6118:       static_aggregates = perm_tree_cons (init, decl, static_aggregates);
                   6119:     }
                   6120: }
                   6121: 
                   6122: /* Make TYPE a complete type based on INITIAL_VALUE.
1.1.1.2   root     6123:    Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered,
1.1       root     6124:    2 if there was no information (in which case assume 1 if DO_DEFAULT).  */
                   6125: 
                   6126: int
                   6127: complete_array_type (type, initial_value, do_default)
1.1.1.5 ! root     6128:      tree type, initial_value;
1.1       root     6129:      int do_default;
                   6130: {
                   6131:   register tree maxindex = NULL_TREE;
                   6132:   int value = 0;
                   6133: 
                   6134:   if (initial_value)
                   6135:     {
                   6136:       /* Note MAXINDEX  is really the maximum index,
                   6137:         one less than the size.  */
                   6138:       if (TREE_CODE (initial_value) == STRING_CST)
                   6139:        maxindex = build_int_2 (TREE_STRING_LENGTH (initial_value) - 1, 0);
                   6140:       else if (TREE_CODE (initial_value) == CONSTRUCTOR)
                   6141:        {
                   6142:          register int nelts
                   6143:            = list_length (CONSTRUCTOR_ELTS (initial_value));
                   6144:          maxindex = build_int_2 (nelts - 1, 0);
                   6145:        }
                   6146:       else
                   6147:        {
                   6148:          /* Make an error message unless that happened already.  */
                   6149:          if (initial_value != error_mark_node)
                   6150:            value = 1;
                   6151: 
                   6152:          /* Prevent further error messages.  */
                   6153:          maxindex = build_int_2 (1, 0);
                   6154:        }
                   6155:     }
                   6156: 
                   6157:   if (!maxindex)
                   6158:     {
                   6159:       if (do_default)
                   6160:        maxindex = build_int_2 (1, 0);
                   6161:       value = 2;
                   6162:     }
                   6163: 
                   6164:   if (maxindex)
                   6165:     {
                   6166:       TYPE_DOMAIN (type) = build_index_type (maxindex);
                   6167:       if (!TREE_TYPE (maxindex))
                   6168:        TREE_TYPE (maxindex) = TYPE_DOMAIN (type);
                   6169:     }
                   6170: 
                   6171:   /* Lay out the type now that we can get the real answer.  */
                   6172: 
                   6173:   layout_type (type);
                   6174: 
                   6175:   return value;
                   6176: }
                   6177: 
                   6178: /* Return zero if something is declared to be a member of type
                   6179:    CTYPE when in the context of CUR_TYPE.  STRING is the error
                   6180:    message to print in that case.  Otherwise, quietly return 1.  */
                   6181: static int
                   6182: member_function_or_else (ctype, cur_type, string)
                   6183:      tree ctype, cur_type;
                   6184:      char *string;
                   6185: {
                   6186:   if (ctype && ctype != cur_type)
                   6187:     {
                   6188:       error (string, TYPE_NAME_STRING (ctype));
                   6189:       return 0;
                   6190:     }
                   6191:   return 1;
                   6192: }
                   6193: 
                   6194: /* Subroutine of `grokdeclarator'.  */
                   6195: 
                   6196: /* CTYPE is class type, or null if non-class.
                   6197:    TYPE is type this FUNCTION_DECL should have, either FUNCTION_TYPE
                   6198:    or METHOD_TYPE.
                   6199:    DECLARATOR is the function's name.
                   6200:    VIRTUALP is truthvalue of whether the function is virtual or not.
                   6201:    FLAGS are to be passed through to `grokclassfn'.
                   6202:    QUALS are qualifiers indicating whether the function is `const'
                   6203:    or `volatile'.
                   6204:    RAISES is a list of exceptions that this function can raise.
                   6205:    CHECK is 1 if we must find this method in CTYPE, 0 if we should
                   6206:    not look, and -1 if we should not call `grokclassfn' at all.  */
                   6207: static tree
1.1.1.5 ! root     6208: grokfndecl (ctype, type, declarator, virtualp, flags, quals, raises, check, publicp)
1.1       root     6209:      tree ctype, type;
                   6210:      tree declarator;
                   6211:      int virtualp;
                   6212:      enum overload_flags flags;
                   6213:      tree quals, raises;
1.1.1.5 ! root     6214:      int check, publicp;
1.1       root     6215: {
                   6216:   tree cname, decl;
                   6217:   int staticp = ctype && TREE_CODE (type) == FUNCTION_TYPE;
                   6218: 
                   6219:   if (ctype)
                   6220:     cname = TREE_CODE (TYPE_NAME (ctype)) == TYPE_DECL
                   6221:       ? TYPE_IDENTIFIER (ctype) : TYPE_NAME (ctype);
                   6222:   else
                   6223:     cname = NULL_TREE;
                   6224: 
                   6225:   if (raises)
                   6226:     {
                   6227:       type = build_exception_variant (ctype, type, raises);
                   6228:       raises = TYPE_RAISES_EXCEPTIONS (type);
                   6229:     }
                   6230:   decl = build_lang_decl (FUNCTION_DECL, declarator, type);
1.1.1.4   root     6231:   /* propagate volatile out from type to decl */
                   6232:   if (TYPE_VOLATILE (type))
                   6233:       TREE_THIS_VOLATILE (decl) = 1;
1.1.1.5 ! root     6234: 
        !          6235:   /* Should probably propagate const out from type to decl I bet (mrs).  */
1.1       root     6236:   if (staticp)
                   6237:     {
                   6238:       DECL_STATIC_FUNCTION_P (decl) = 1;
                   6239:       DECL_CONTEXT (decl) = ctype;
                   6240:       DECL_CLASS_CONTEXT (decl) = ctype;
                   6241:     }
1.1.1.5 ! root     6242: 
        !          6243:   if (publicp)
        !          6244:     TREE_PUBLIC (decl) = 1;
        !          6245: 
1.1.1.4   root     6246:   DECL_EXTERNAL (decl) = 1;
1.1       root     6247:   if (quals != NULL_TREE && TREE_CODE (type) == FUNCTION_TYPE)
                   6248:     {
                   6249:       error ("functions cannot have method qualifiers");
                   6250:       quals = NULL_TREE;
                   6251:     }
                   6252: 
1.1.1.4   root     6253:   /* Only two styles of delete's are valid. */
                   6254:   if (declarator == ansi_opname[(int) DELETE_EXPR])
                   6255:     {
                   6256:       tree args = TYPE_ARG_TYPES (type);
                   6257:       int style1, style2;
                   6258: 
                   6259:       if (ctype && args && TREE_CODE (type) == METHOD_TYPE)
                   6260:        /* remove this */
                   6261:        args = TREE_CHAIN (args);
                   6262:      
                   6263:       style1 = type_list_equal (args,
                   6264:                                tree_cons (NULL_TREE, ptr_type_node,
                   6265:                                           void_list_node));
                   6266:       style2 = style1 != 0 ? 0 :
                   6267:        type_list_equal (args,
                   6268:                         tree_cons (NULL_TREE, ptr_type_node,
                   6269:                                    tree_cons (NULL_TREE, sizetype,
                   6270:                                               void_list_node)));
                   6271: 
                   6272:       if (ctype == NULL_TREE)
                   6273:        {
                   6274:          if (! style1)
                   6275:            /* ANSI C++ June 5 1992 WP 12.5.5.2 */
                   6276:            error ("global operator delete must be declared as taking a single argument of type void*");
                   6277:        }
                   6278:       else
                   6279:        if (! style1 && ! style2)
                   6280:          /* ANSI C++ June 5 1992 WP 12.5.4.1 */
                   6281:          error ("operator delete cannot be overloaded");
                   6282:     }
1.1.1.5 ! root     6283:   else if (DECL_NAME (decl) == ansi_opname[(int) POSTINCREMENT_EXPR]
        !          6284:           || DECL_NAME (decl) == ansi_opname[(int) POSTDECREMENT_EXPR])
        !          6285:     {
        !          6286:       /* According to ARM $13.4.7, postfix operator++ must take an int as
        !          6287:         its second argument.  */
        !          6288:       tree parmtypes, argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
        !          6289: 
        !          6290:       if (argtypes)
        !          6291:        {
        !          6292:          parmtypes = TREE_CHAIN (argtypes);
        !          6293:          if (parmtypes != NULL_TREE
        !          6294:              && TREE_VALUE (parmtypes) != void_type_node
        !          6295:              && TREE_VALUE (parmtypes) != integer_type_node)
        !          6296:            error ("postfix operator%s may only take `int' as its argument",
        !          6297:                   POSTINCREMENT_EXPR ? "++" : "--");
        !          6298:        }
        !          6299:     }
1.1.1.4   root     6300: 
1.1       root     6301:   /* Caller will do the rest of this.  */
                   6302:   if (check < 0)
                   6303:     return decl;
                   6304: 
                   6305:   if (flags == NO_SPECIAL && ctype && constructor_name (cname) == declarator)
                   6306:     {
                   6307:       tree tmp;
                   6308:       /* Just handle constructors here.  We could do this
                   6309:         inside the following if stmt, but I think
                   6310:         that the code is more legible by breaking this
                   6311:         case out.  See comments below for what each of
                   6312:         the following calls is supposed to do.  */
                   6313:       DECL_CONSTRUCTOR_P (decl) = 1;
                   6314: 
                   6315:       grokclassfn (ctype, declarator, decl, flags, quals);
                   6316:       if (check)
1.1.1.5 ! root     6317:        check_classfn (ctype, declarator, decl);
1.1       root     6318:       grok_ctor_properties (ctype, decl);
                   6319:       if (check == 0)
                   6320:        {
                   6321:          /* FIXME: this should only need to look at IDENTIFIER_GLOBAL_VALUE.  */
                   6322:          tmp = lookup_name (DECL_ASSEMBLER_NAME (decl), 0);
1.1.1.5 ! root     6323:          if (tmp == NULL_TREE)
1.1       root     6324:            IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (decl)) = decl;
                   6325:          else if (TREE_CODE (tmp) != TREE_CODE (decl))
1.1.1.2   root     6326:            error_with_decl (decl, "inconsistent declarations for `%s'");
1.1       root     6327:          else
                   6328:            {
                   6329:              duplicate_decls (decl, tmp);
                   6330:              decl = tmp;
1.1.1.5 ! root     6331:              /* avoid creating circularities.  */
        !          6332:              DECL_CHAIN (decl) = NULL_TREE;
1.1       root     6333:            }
1.1.1.5 ! root     6334:          make_decl_rtl (decl, NULL_PTR, 1);
1.1       root     6335:        }
                   6336:     }
                   6337:   else
                   6338:     {
                   6339:       tree tmp;
                   6340: 
                   6341:       /* Function gets the ugly name, field gets the nice one.
                   6342:         This call may change the type of the function (because
1.1.1.4   root     6343:         of default parameters)!  */
1.1       root     6344:       if (ctype != NULL_TREE)
                   6345:        grokclassfn (ctype, cname, decl, flags, quals);
                   6346: 
                   6347:       if (IDENTIFIER_OPNAME_P (DECL_NAME (decl)))
1.1.1.4   root     6348:        grok_op_properties (decl, virtualp);
1.1       root     6349: 
                   6350:       if (ctype != NULL_TREE && check)
1.1.1.5 ! root     6351:        check_classfn (ctype, cname, decl);
1.1       root     6352: 
                   6353:       if (ctype == NULL_TREE || check)
                   6354:        return decl;
                   6355: 
                   6356:       /* Now install the declaration of this function so that
                   6357:         others may find it (esp. its DECL_FRIENDLIST).
                   6358:         Pretend we are at top level, we will get true
                   6359:         reference later, perhaps.
                   6360: 
                   6361:         FIXME: This should only need to look at IDENTIFIER_GLOBAL_VALUE.  */
                   6362:       tmp = lookup_name (DECL_ASSEMBLER_NAME (decl), 0);
1.1.1.5 ! root     6363:       if (tmp == NULL_TREE)
1.1       root     6364:        IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (decl)) = decl;
                   6365:       else if (TREE_CODE (tmp) != TREE_CODE (decl))
1.1.1.2   root     6366:        error_with_decl (decl, "inconsistent declarations for `%s'");
1.1       root     6367:       else
                   6368:        {
                   6369:          duplicate_decls (decl, tmp);
                   6370:          decl = tmp;
1.1.1.5 ! root     6371:          /* avoid creating circularities.  */
        !          6372:          DECL_CHAIN (decl) = NULL_TREE;
1.1       root     6373:        }
1.1.1.5 ! root     6374:       make_decl_rtl (decl, NULL_PTR, 1);
1.1       root     6375: 
                   6376:       /* If this declaration supersedes the declaration of
                   6377:         a method declared virtual in the base class, then
                   6378:         mark this field as being virtual as well.  */
                   6379:       {
                   6380:        tree binfos = BINFO_BASETYPES (TYPE_BINFO (ctype));
                   6381:        int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0;
                   6382: 
                   6383:        for (i = 0; i < n_baselinks; i++)
                   6384:          {
1.1.1.4   root     6385:            tree base_binfo = TREE_VEC_ELT (binfos, i);
                   6386:            if (TYPE_VIRTUAL_P (BINFO_TYPE (base_binfo)) || flag_all_virtual == 1)
1.1       root     6387:              {
1.1.1.4   root     6388:                tmp = get_first_matching_virtual (base_binfo, decl,
1.1       root     6389:                                                  flags == DTOR_FLAG);
                   6390:                if (tmp)
                   6391:                  {
                   6392:                    /* The TMP we really want is the one from the deepest
                   6393:                       baseclass on this path, taking care not to
                   6394:                       duplicate if we have already found it (via another
                   6395:                       path to its virtual baseclass.  */
                   6396:                    if (staticp)
                   6397:                      {
                   6398:                        error_with_decl (decl, "method `%s' may not be declared static");
                   6399:                        error_with_decl (tmp, "(since `%s' declared virtual in base class.)");
                   6400:                        break;
                   6401:                      }
                   6402:                    virtualp = 1;
                   6403: 
1.1.1.4   root     6404:                    if ((TYPE_USES_VIRTUAL_BASECLASSES (BINFO_TYPE (base_binfo))
1.1       root     6405:                         || TYPE_USES_MULTIPLE_INHERITANCE (ctype))
1.1.1.4   root     6406:                        && BINFO_TYPE (base_binfo) != DECL_CONTEXT (tmp))
1.1       root     6407:                      tmp = get_first_matching_virtual (TYPE_BINFO (DECL_CONTEXT (tmp)),
                   6408:                                                        decl, flags == DTOR_FLAG);
                   6409:                    if (value_member (tmp, DECL_VINDEX (decl)) == NULL_TREE)
                   6410:                      {
                   6411:                        /* The argument types may have changed... */
                   6412:                        tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
                   6413:                        tree base_variant = TREE_TYPE (TREE_VALUE (argtypes));
                   6414: 
                   6415:                        argtypes = commonparms (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (tmp))),
                   6416:                                                TREE_CHAIN (argtypes));
                   6417:                        /* But the return type has not.  */
                   6418:                        type = build_cplus_method_type (base_variant, TREE_TYPE (type), argtypes);
                   6419:                        if (raises)
                   6420:                          {
                   6421:                            type = build_exception_variant (ctype, type, raises);
                   6422:                            raises = TYPE_RAISES_EXCEPTIONS (type);
                   6423:                          }
                   6424:                        TREE_TYPE (decl) = type;
                   6425:                        DECL_VINDEX (decl)
                   6426:                          = tree_cons (NULL_TREE, tmp, DECL_VINDEX (decl));
                   6427:                      }
                   6428:                  }
                   6429:              }
                   6430:          }
                   6431:       }
                   6432:       if (virtualp)
                   6433:        {
                   6434:          if (DECL_VINDEX (decl) == NULL_TREE)
                   6435:            DECL_VINDEX (decl) = error_mark_node;
                   6436:          IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)) = 1;
                   6437:          if (ctype && CLASSTYPE_VTABLE_NEEDS_WRITING (ctype)
1.1.1.4   root     6438:              /* If this function is derived from a template, don't
                   6439:                 make it public.  This shouldn't be here, but there's
                   6440:                 no good way to override the interface pragmas for one
                   6441:                 function or class only.  Bletch.  */
                   6442:              && IDENTIFIER_TEMPLATE (TYPE_IDENTIFIER (ctype)) == NULL_TREE
1.1       root     6443:              && (write_virtuals == 2
                   6444:                  || (write_virtuals == 3
                   6445:                      && ! CLASSTYPE_INTERFACE_UNKNOWN (ctype))))
                   6446:            TREE_PUBLIC (decl) = 1;
                   6447:        }
                   6448:     }
                   6449:   return decl;
                   6450: }
                   6451: 
                   6452: static tree
1.1.1.5 ! root     6453: grokvardecl (type, declarator, specbits, initialized)
        !          6454:      tree type;
1.1       root     6455:      tree declarator;
1.1.1.5 ! root     6456:      RID_BIT_TYPE specbits;
        !          6457:      int initialized;
1.1       root     6458: {
                   6459:   tree decl;
                   6460: 
1.1.1.5 ! root     6461:   /* This implements the "one definition rule" for global variables.
        !          6462:      Note that declarator can come in as null when we're doing work
        !          6463:      on an anonymous union.  */
        !          6464:   if (declarator && IDENTIFIER_GLOBAL_VALUE (declarator)
        !          6465:       && current_binding_level == global_binding_level
        !          6466:       && TREE_STATIC (IDENTIFIER_GLOBAL_VALUE (declarator))
        !          6467:       && (! (specbits & RIDBIT (RID_EXTERN))
        !          6468:          || initialized))
        !          6469:     {
        !          6470:       error ("redefinition of `%s'", IDENTIFIER_POINTER (declarator));
        !          6471:       error_with_decl (IDENTIFIER_GLOBAL_VALUE (declarator),
        !          6472:                       "previously defined here");
        !          6473:     }
        !          6474: 
1.1       root     6475:   if (TREE_CODE (type) == OFFSET_TYPE)
                   6476:     {
                   6477:       /* If you declare a static member so that it
                   6478:         can be initialized, the code will reach here.  */
                   6479:       tree field = lookup_field (TYPE_OFFSET_BASETYPE (type),
1.1.1.4   root     6480:                                 declarator, 0, 0);
1.1       root     6481:       if (field == NULL_TREE || TREE_CODE (field) != VAR_DECL)
                   6482:        {
                   6483:          tree basetype = TYPE_OFFSET_BASETYPE (type);
                   6484:          error ("`%s' is not a static member of class `%s'",
                   6485:                 IDENTIFIER_POINTER (declarator),
                   6486:                 TYPE_NAME_STRING (basetype));
                   6487:          type = TREE_TYPE (type);
                   6488:          decl = build_lang_field_decl (VAR_DECL, declarator, type);
                   6489:          DECL_CONTEXT (decl) = basetype;
                   6490:          DECL_CLASS_CONTEXT (decl) = basetype;
                   6491:        }
                   6492:       else
                   6493:        {
                   6494:          tree f_type = TREE_TYPE (field);
                   6495:          tree o_type = TREE_TYPE (type);
                   6496: 
                   6497:          if (TYPE_SIZE (f_type) == NULL_TREE)
                   6498:            {
                   6499:              if (TREE_CODE (f_type) != TREE_CODE (o_type)
                   6500:                  || (TREE_CODE (f_type) == ARRAY_TYPE
                   6501:                      && TREE_TYPE (f_type) != TREE_TYPE (o_type)))
                   6502:                error ("redeclaration of type for `%s'",
                   6503:                       IDENTIFIER_POINTER (declarator));
1.1.1.2   root     6504:              else if (TYPE_SIZE (o_type) != NULL_TREE)
                   6505:                TREE_TYPE (field) = type;
1.1       root     6506:            }
                   6507:          else if (f_type != o_type)
                   6508:            error ("redeclaration of type for `%s'",
                   6509:                   IDENTIFIER_POINTER (declarator));
                   6510:          decl = field;
                   6511:          if (initialized && DECL_INITIAL (decl)
                   6512:              /* Complain about multiply-initialized
                   6513:                 member variables, but don't be faked
                   6514:                 out if initializer is faked up from `empty_init_node'.  */
                   6515:              && (TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR
                   6516:                  || CONSTRUCTOR_ELTS (DECL_INITIAL (decl)) != NULL_TREE))
                   6517:            error_with_aggr_type (DECL_CONTEXT (decl),
                   6518:                                  "multiple initializations of static member `%s::%s'",
                   6519:                                  IDENTIFIER_POINTER (DECL_NAME (decl)));
                   6520:        }
                   6521:     }
                   6522:   else decl = build_decl (VAR_DECL, declarator, type);
                   6523: 
1.1.1.5 ! root     6524:   if (specbits & RIDBIT (RID_EXTERN))
1.1       root     6525:     {
1.1.1.4   root     6526:       DECL_THIS_EXTERN (decl) = 1;
                   6527:       DECL_EXTERNAL (decl) = !initialized;
1.1       root     6528:     }
                   6529: 
                   6530:   /* In class context, static means one per class,
                   6531:      public visibility, and static storage.  */
1.1.1.5 ! root     6532:   if (DECL_FIELD_CONTEXT (decl) != NULL_TREE
1.1       root     6533:       && IS_AGGR_TYPE (DECL_FIELD_CONTEXT (decl)))
                   6534:     {
                   6535:       TREE_PUBLIC (decl) = 1;
                   6536:       TREE_STATIC (decl) = 1;
1.1.1.4   root     6537:       DECL_EXTERNAL (decl) = !initialized;
1.1       root     6538:     }
                   6539:   /* At top level, either `static' or no s.c. makes a definition
                   6540:      (perhaps tentative), and absence of `static' makes it public.  */
                   6541:   else if (current_binding_level == global_binding_level)
                   6542:     {
1.1.1.5 ! root     6543:       TREE_PUBLIC (decl) = ! (specbits & RIDBIT (RID_STATIC));
1.1.1.4   root     6544:       TREE_STATIC (decl) = ! DECL_EXTERNAL (decl);
1.1       root     6545:     }
                   6546:   /* Not at top level, only `static' makes a static definition.  */
                   6547:   else
                   6548:     {
1.1.1.5 ! root     6549:       TREE_STATIC (decl) = !! (specbits & RIDBIT (RID_STATIC));
1.1.1.4   root     6550:       TREE_PUBLIC (decl) = DECL_EXTERNAL (decl);
1.1       root     6551:     }
                   6552:   return decl;
                   6553: }
                   6554: 
                   6555: /* Given declspecs and a declarator,
                   6556:    determine the name and type of the object declared
                   6557:    and construct a ..._DECL node for it.
                   6558:    (In one case we can return a ..._TYPE node instead.
                   6559:     For invalid input we sometimes return 0.)
                   6560: 
                   6561:    DECLSPECS is a chain of tree_list nodes whose value fields
                   6562:     are the storage classes and type specifiers.
                   6563: 
                   6564:    DECL_CONTEXT says which syntactic context this declaration is in:
                   6565:      NORMAL for most contexts.  Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL.
                   6566:      FUNCDEF for a function definition.  Like NORMAL but a few different
                   6567:       error messages in each case.  Return value may be zero meaning
                   6568:       this definition is too screwy to try to parse.
                   6569:      MEMFUNCDEF for a function definition.  Like FUNCDEF but prepares to
                   6570:       handle member functions (which have FIELD context).
                   6571:       Return value may be zero meaning this definition is too screwy to
                   6572:       try to parse.
                   6573:      PARM for a parameter declaration (either within a function prototype
                   6574:       or before a function body).  Make a PARM_DECL, or return void_type_node.
                   6575:      TYPENAME if for a typename (in a cast or sizeof).
                   6576:       Don't make a DECL node; just return the ..._TYPE node.
                   6577:      FIELD for a struct or union field; make a FIELD_DECL.
                   6578:      BITFIELD for a field with specified width.
                   6579:    INITIALIZED is 1 if the decl has an initializer.
                   6580: 
                   6581:    In the TYPENAME case, DECLARATOR is really an absolute declarator.
                   6582:    It may also be so in the PARM case, for a prototype where the
                   6583:    argument type is specified but not the name.
                   6584: 
                   6585:    This function is where the complicated C meanings of `static'
1.1.1.2   root     6586:    and `extern' are interpreted.
1.1       root     6587: 
                   6588:    For C++, if there is any monkey business to do, the function which
                   6589:    calls this one must do it, i.e., prepending instance variables,
                   6590:    renaming overloaded function names, etc.
                   6591: 
                   6592:    Note that for this C++, it is an error to define a method within a class
                   6593:    which does not belong to that class.
                   6594: 
1.1.1.2   root     6595:    Except in the case where SCOPE_REFs are implicitly known (such as
1.1       root     6596:    methods within a class being redundantly qualified),
                   6597:    declarations which involve SCOPE_REFs are returned as SCOPE_REFs
                   6598:    (class_name::decl_name).  The caller must also deal with this.
                   6599: 
                   6600:    If a constructor or destructor is seen, and the context is FIELD,
1.1.1.2   root     6601:    then the type gains the attribute TREE_HAS_x.  If such a declaration
1.1       root     6602:    is erroneous, NULL_TREE is returned.
                   6603: 
                   6604:    QUALS is used only for FUNCDEF and MEMFUNCDEF cases.  For a member
                   6605:    function, these are the qualifiers to give to the `this' pointer.
                   6606: 
                   6607:    May return void_type_node if the declarator turned out to be a friend.
                   6608:    See grokfield for details.  */
                   6609: 
1.1.1.5 ! root     6610: enum return_types { return_normal, return_ctor, return_dtor, return_conversion };
1.1       root     6611: 
                   6612: tree
                   6613: grokdeclarator (declarator, declspecs, decl_context, initialized, raises)
                   6614:      tree declspecs;
                   6615:      tree declarator;
                   6616:      enum decl_context decl_context;
                   6617:      int initialized;
                   6618:      tree raises;
                   6619: {
                   6620:   extern int current_class_depth;
                   6621: 
1.1.1.5 ! root     6622:   RID_BIT_TYPE specbits = 0;
1.1       root     6623:   int nclasses = 0;
                   6624:   tree spec;
                   6625:   tree type = NULL_TREE;
                   6626:   int longlong = 0;
                   6627:   int constp;
                   6628:   int volatilep;
                   6629:   int virtualp, friendp, inlinep, staticp;
                   6630:   int explicit_int = 0;
                   6631:   int explicit_char = 0;
1.1.1.5 ! root     6632:   tree typedef_decl = NULL_TREE;
1.1       root     6633:   char *name;
1.1.1.5 ! root     6634:   tree typedef_type = NULL_TREE;
1.1       root     6635:   int funcdef_flag = 0;
                   6636:   enum tree_code innermost_code = ERROR_MARK;
                   6637:   int bitfield = 0;
1.1.1.4   root     6638:   int size_varies = 0;
1.1       root     6639:   /* Set this to error_mark_node for FIELD_DECLs we could not handle properly.
                   6640:      All FIELD_DECLs we build here have `init' put into their DECL_INITIAL.  */
1.1.1.5 ! root     6641:   tree init = NULL_TREE;
1.1       root     6642: 
                   6643:   /* Keep track of what sort of function is being processed
                   6644:      so that we can warn about default return values, or explicit
                   6645:      return values which do not match prescribed defaults.  */
                   6646:   enum return_types return_type = return_normal;
                   6647: 
                   6648:   tree dname = NULL_TREE;
                   6649:   tree ctype = current_class_type;
                   6650:   tree ctor_return_type = NULL_TREE;
                   6651:   enum overload_flags flags = NO_SPECIAL;
                   6652:   int seen_scope_ref = 0;
1.1.1.5 ! root     6653:   tree quals = NULL_TREE;
1.1       root     6654: 
                   6655:   if (decl_context == FUNCDEF)
                   6656:     funcdef_flag = 1, decl_context = NORMAL;
                   6657:   else if (decl_context == MEMFUNCDEF)
                   6658:     funcdef_flag = -1, decl_context = FIELD;
                   6659:   else if (decl_context == BITFIELD)
                   6660:     bitfield = 1, decl_context = FIELD;
                   6661: 
                   6662:   if (flag_traditional && allocation_temporary_p ())
                   6663:     end_temporary_allocation ();
                   6664: 
                   6665:   /* Look inside a declarator for the name being declared
                   6666:      and get it as a string, for an error message.  */
                   6667:   {
1.1.1.5 ! root     6668:     tree type, last = NULL_TREE;
1.1       root     6669:     register tree decl = declarator;
1.1.1.5 ! root     6670:     name = NULL;
1.1       root     6671: 
                   6672:     /* If we see something of the form `aggr_type xyzzy (a, b, c)'
                   6673:        it is either an old-style function declaration or a call to
                   6674:        a constructor.  The following conditional makes recognizes this
                   6675:        case as being a call to a constructor.  Too bad if it is not.  */
                   6676: 
                   6677:     /* For Doug Lea, also grok `aggr_type xyzzy (a, b, c)[10][10][10]'.  */
                   6678:     while (decl && TREE_CODE (decl) == ARRAY_REF)
                   6679:       {
                   6680:        last = decl;
                   6681:        decl = TREE_OPERAND (decl, 0);
                   6682:       }
                   6683: 
                   6684:     if (decl && declspecs
                   6685:         && TREE_CODE (decl) == CALL_EXPR
                   6686:         && TREE_OPERAND (decl, 0)
                   6687:         && (TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE
                   6688:            || TREE_CODE (TREE_OPERAND (decl, 0)) == SCOPE_REF))
                   6689:       {
                   6690:         type = TREE_CODE (TREE_VALUE (declspecs)) == IDENTIFIER_NODE
                   6691:           ? lookup_name (TREE_VALUE (declspecs), 1) :
                   6692:         (IS_AGGR_TYPE (TREE_VALUE (declspecs))
                   6693:          ? TYPE_NAME (TREE_VALUE (declspecs)) : NULL_TREE);
                   6694: 
                   6695:         if (type && TREE_CODE (type) == TYPE_DECL
                   6696:             && IS_AGGR_TYPE (TREE_TYPE (type))
                   6697:             && parmlist_is_exprlist (TREE_OPERAND (decl, 1)))
                   6698:           {
                   6699:             if (decl_context == FIELD
                   6700:                 && TREE_CHAIN (TREE_OPERAND (decl, 1)))
                   6701:               {
                   6702:                 /* That was an initializer list.  */
                   6703:                 sorry ("initializer lists for field declarations");
                   6704:                 decl = TREE_OPERAND (decl, 0);
                   6705:                if (last)
                   6706:                  {
                   6707:                    TREE_OPERAND (last, 0) = decl;
                   6708:                    decl = declarator;
                   6709:                  }
                   6710:                 declarator = decl;
                   6711:                 init = error_mark_node;
                   6712:                 goto bot;
                   6713:               }
                   6714:             else
                   6715:               {
                   6716:                init = TREE_OPERAND (decl, 1);
                   6717:                if (last)
                   6718:                  {
                   6719:                    TREE_OPERAND (last, 0) = TREE_OPERAND (decl, 0);
                   6720:                    if (pedantic && init)
1.1.1.3   root     6721:                      {
1.1       root     6722:                      error ("arrays cannot take initializers");
1.1.1.3   root     6723:                      init = error_mark_node;
                   6724:                    }
1.1       root     6725:                  }
                   6726:                else
                   6727:                  declarator = TREE_OPERAND (declarator, 0);
                   6728:                decl = start_decl (declarator, declspecs, 1, NULL_TREE);
                   6729:                finish_decl (decl, init, NULL_TREE, 1);
                   6730:                return 0;
                   6731:               }
                   6732:           }
                   6733: 
                   6734:         if (parmlist_is_random (TREE_OPERAND (decl, 1)))
                   6735:           {
                   6736:            decl = TREE_OPERAND (decl, 0);
                   6737:            if (TREE_CODE (decl) == SCOPE_REF)
                   6738:              {
                   6739:                if (TREE_COMPLEXITY (decl))
1.1.1.3   root     6740:                  my_friendly_abort (15);
1.1       root     6741:                decl = TREE_OPERAND (decl, 1);
                   6742:              }
                   6743:            if (TREE_CODE (decl) == IDENTIFIER_NODE)
                   6744:              name = IDENTIFIER_POINTER (decl);
                   6745:            if (name)
                   6746:              error ("bad parameter list specification for function `%s'",
                   6747:                     name);
                   6748:            else
                   6749:              error ("bad parameter list specification for function");
1.1.1.4   root     6750:             return void_type_node;
1.1       root     6751:           }
                   6752:       bot:
                   6753:         ;
                   6754:       }
                   6755:     else
                   6756:       /* It didn't look like we thought it would, leave the ARRAY_REFs on.  */
                   6757:       decl = declarator;
                   6758: 
                   6759:     while (decl)
                   6760:       switch (TREE_CODE (decl))
                   6761:         {
                   6762:        case COND_EXPR:
                   6763:          ctype = NULL_TREE;
                   6764:          decl = TREE_OPERAND (decl, 0);
                   6765:          break;
                   6766: 
                   6767:        case BIT_NOT_EXPR:      /* for C++ destructors!  */
                   6768:          {
                   6769:            tree name = TREE_OPERAND (decl, 0);
                   6770:            tree rename = NULL_TREE;
                   6771: 
1.1.1.4   root     6772:            my_friendly_assert (flags == NO_SPECIAL, 152);
1.1       root     6773:            flags = DTOR_FLAG;
                   6774:            return_type = return_dtor;
1.1.1.4   root     6775:            my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 153);
1.1       root     6776:            if (ctype == NULL_TREE)
                   6777:              {
                   6778:                if (current_class_type == NULL_TREE)
                   6779:                  {
                   6780:                    error ("destructors must be member functions");
                   6781:                    flags = NO_SPECIAL;
                   6782:                  }
                   6783:                else
                   6784:                  {
                   6785:                    tree t = constructor_name (current_class_name);
                   6786:                    if (t != name)
                   6787:                      rename = t;
                   6788:                  }
                   6789:              }
                   6790:            else
                   6791:              {
                   6792:                tree t = constructor_name (ctype);
                   6793:                if (t != name)
                   6794:                  rename = t;
                   6795:              }
                   6796: 
                   6797:            if (rename)
                   6798:              {
                   6799:                error ("destructor `%s' must match class name `%s'",
                   6800:                       IDENTIFIER_POINTER (name),
                   6801:                       IDENTIFIER_POINTER (rename));
                   6802:                TREE_OPERAND (decl, 0) = rename;
                   6803:              }
                   6804:            decl = name;
                   6805:          }
                   6806:          break;
                   6807: 
                   6808:        case ADDR_EXPR:         /* C++ reference declaration */
                   6809:          /* fall through */
                   6810:        case ARRAY_REF:
                   6811:        case INDIRECT_REF:
                   6812:          ctype = NULL_TREE;
                   6813:          innermost_code = TREE_CODE (decl);
                   6814:          decl = TREE_OPERAND (decl, 0);
                   6815:          break;
                   6816: 
                   6817:        case CALL_EXPR:
                   6818:          innermost_code = TREE_CODE (decl);
                   6819:          decl = TREE_OPERAND (decl, 0);
                   6820:          if (decl_context == FIELD && ctype == NULL_TREE)
                   6821:            ctype = current_class_type;
                   6822:          if (ctype != NULL_TREE
                   6823:              && decl != NULL_TREE && flags != DTOR_FLAG
                   6824:              && decl == constructor_name (ctype))
                   6825:            {
                   6826:              return_type = return_ctor;
                   6827:              ctor_return_type = ctype;
                   6828:            }
                   6829:          ctype = NULL_TREE;
                   6830:          break;
                   6831: 
                   6832:        case IDENTIFIER_NODE:
                   6833:          dname = decl;
                   6834:          name = IDENTIFIER_POINTER (decl);
1.1.1.5 ! root     6835:          decl = NULL_TREE;
1.1       root     6836:          break;
                   6837: 
                   6838:        case RECORD_TYPE:
                   6839:        case UNION_TYPE:
                   6840:        case ENUMERAL_TYPE:
                   6841:          /* Parse error puts this typespec where
                   6842:             a declarator should go.  */
                   6843:          error ("declarator name missing");
                   6844:          dname = TYPE_NAME (decl);
                   6845:          if (dname && TREE_CODE (dname) == TYPE_DECL)
                   6846:            dname = DECL_NAME (dname);
                   6847:          name = dname ? IDENTIFIER_POINTER (dname) : "<nameless>";
                   6848:          declspecs = temp_tree_cons (NULL_TREE, decl, declspecs);
1.1.1.5 ! root     6849:          decl = NULL_TREE;
1.1       root     6850:          break;
                   6851: 
                   6852:        case TYPE_EXPR:
1.1.1.4   root     6853:          if (ctype == NULL_TREE)
                   6854:            {
                   6855:              /* ANSI C++ June 5 1992 WP 12.3.2 only describes
                   6856:                 conversion functions in terms of being declared
                   6857:                 as a member function.  */
                   6858:              error ("operator `%s' must be declared as a member",
                   6859:                     IDENTIFIER_POINTER (TREE_VALUE (TREE_TYPE (decl))));
                   6860:              return NULL_TREE;
                   6861:            }
                   6862:              
1.1       root     6863:          ctype = NULL_TREE;
1.1.1.4   root     6864:          my_friendly_assert (flags == NO_SPECIAL, 154);
1.1       root     6865:          flags = TYPENAME_FLAG;
                   6866:          name = "operator <typename>";
                   6867:          /* Go to the absdcl.  */
                   6868:          decl = TREE_OPERAND (decl, 0);
                   6869:          return_type = return_conversion;
                   6870:          break;
                   6871: 
                   6872:          /* C++ extension */
                   6873:        case SCOPE_REF:
                   6874:          if (seen_scope_ref == 1)
                   6875:            error ("multiple `::' terms in declarator invalid");
                   6876:          seen_scope_ref += 1;
                   6877:          {
                   6878:            /* Perform error checking, and convert class names to types.
                   6879:               We may call grokdeclarator multiple times for the same
                   6880:               tree structure, so only do the conversion once.  In this
                   6881:               case, we have exactly what we want for `ctype'.  */
                   6882:            tree cname = TREE_OPERAND (decl, 0);
                   6883:            if (cname == NULL_TREE)
                   6884:              ctype = NULL_TREE;
                   6885:            /* Can't use IS_AGGR_TYPE because CNAME might not be a type.  */
                   6886:            else if (IS_AGGR_TYPE_CODE (TREE_CODE (cname))
                   6887:                     || TREE_CODE (cname) == UNINSTANTIATED_P_TYPE)
                   6888:              ctype = cname;
                   6889:            else if (! is_aggr_typedef (cname, 1))
                   6890:              {
1.1.1.5 ! root     6891:                TREE_OPERAND (decl, 0) = NULL_TREE;
1.1       root     6892:              }
                   6893:            /* Must test TREE_OPERAND (decl, 1), in case user gives
                   6894:               us `typedef (class::memfunc)(int); memfunc *memfuncptr;'  */
                   6895:            else if (TREE_OPERAND (decl, 1)
                   6896:                     && TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF)
                   6897:              {
                   6898:                TREE_OPERAND (decl, 0) = IDENTIFIER_TYPE_VALUE (cname);
                   6899:              }
                   6900:            else if (ctype == NULL_TREE)
                   6901:              {
                   6902:                ctype = IDENTIFIER_TYPE_VALUE (cname);
                   6903:                TREE_OPERAND (decl, 0) = ctype;
                   6904:              }
                   6905:            else if (TREE_COMPLEXITY (decl) == current_class_depth)
                   6906:              TREE_OPERAND (decl, 0) = ctype;
                   6907:            else
                   6908:              {
1.1.1.4   root     6909:                if (! UNIQUELY_DERIVED_FROM_P (IDENTIFIER_TYPE_VALUE (cname), ctype))
1.1       root     6910:                  {
                   6911:                    error ("type `%s' is not derived from type `%s'",
                   6912:                           IDENTIFIER_POINTER (cname),
                   6913:                           TYPE_NAME_STRING (ctype));
1.1.1.5 ! root     6914:                    TREE_OPERAND (decl, 0) = NULL_TREE;
1.1       root     6915:                  }
                   6916:                else
                   6917:                  {
                   6918:                    ctype = IDENTIFIER_TYPE_VALUE (cname);
                   6919:                    TREE_OPERAND (decl, 0) = ctype;
                   6920:                  }
                   6921:              }
                   6922: 
                   6923:            decl = TREE_OPERAND (decl, 1);
                   6924:            if (ctype)
                   6925:              {
                   6926:                if (TREE_CODE (decl) == IDENTIFIER_NODE
                   6927:                    && constructor_name (ctype) == decl)
                   6928:                  {
                   6929:                    return_type = return_ctor;
                   6930:                    ctor_return_type = ctype;
                   6931:                  }
                   6932:                else if (TREE_CODE (decl) == BIT_NOT_EXPR
                   6933:                         && TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE
                   6934:                         && constructor_name (ctype) == TREE_OPERAND (decl, 0))
                   6935:                  {
                   6936:                    return_type = return_dtor;
                   6937:                    ctor_return_type = ctype;
                   6938:                    flags = DTOR_FLAG;
                   6939:                    decl = TREE_OPERAND (decl, 0);
                   6940:                  }
                   6941:              }
                   6942:          }
                   6943:          break;
                   6944: 
                   6945:        case ERROR_MARK:
                   6946:          decl = NULL_TREE;
                   6947:          break;
                   6948: 
                   6949:        default:
1.1.1.5 ! root     6950:          my_friendly_abort (155);
1.1       root     6951:        }
1.1.1.5 ! root     6952:     if (name == NULL)
1.1       root     6953:       name = "type name";
                   6954:   }
                   6955: 
                   6956:   /* A function definition's declarator must have the form of
                   6957:      a function declarator.  */
                   6958: 
                   6959:   if (funcdef_flag && innermost_code != CALL_EXPR)
                   6960:     return 0;
                   6961: 
                   6962:   /* Anything declared one level down from the top level
                   6963:      must be one of the parameters of a function
                   6964:      (because the body is at least two levels down).  */
                   6965: 
                   6966:   /* This heuristic cannot be applied to C++ nodes! Fixed, however,
                   6967:      by not allowing C++ class definitions to specify their parameters
                   6968:      with xdecls (must be spec.d in the parmlist).
                   6969: 
                   6970:      Since we now wait to push a class scope until we are sure that
                   6971:      we are in a legitimate method context, we must set oldcname
                   6972:      explicitly (since current_class_name is not yet alive).  */
                   6973: 
                   6974:   if (decl_context == NORMAL
                   6975:       && current_binding_level->level_chain == global_binding_level)
                   6976:     decl_context = PARM;
                   6977: 
                   6978:   /* Look through the decl specs and record which ones appear.
                   6979:      Some typespecs are defined as built-in typenames.
                   6980:      Others, the ones that are modifiers of other types,
                   6981:      are represented by bits in SPECBITS: set the bits for
                   6982:      the modifiers that appear.  Storage class keywords are also in SPECBITS.
                   6983: 
                   6984:      If there is a typedef name or a type, store the type in TYPE.
                   6985:      This includes builtin typedefs such as `int'.
                   6986: 
                   6987:      Set EXPLICIT_INT if the type is `int' or `char' and did not
                   6988:      come from a user typedef.
                   6989: 
                   6990:      Set LONGLONG if `long' is mentioned twice.
                   6991: 
                   6992:      For C++, constructors and destructors have their own fast treatment.  */
                   6993: 
                   6994:   for (spec = declspecs; spec; spec = TREE_CHAIN (spec))
                   6995:     {
                   6996:       register int i;
                   6997:       register tree id = TREE_VALUE (spec);
                   6998: 
                   6999:       /* Certain parse errors slip through.  For example,
                   7000:         `int class;' is not caught by the parser. Try
                   7001:         weakly to recover here.  */
                   7002:       if (TREE_CODE (spec) != TREE_LIST)
                   7003:        return 0;
                   7004: 
                   7005:       if (TREE_CODE (id) == IDENTIFIER_NODE)
                   7006:        {
                   7007:          if (id == ridpointers[(int) RID_INT])
                   7008:            {
                   7009:              if (type)
                   7010:                error ("extraneous `int' ignored");
                   7011:              else
                   7012:                {
                   7013:                  explicit_int = 1;
                   7014:                  type = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (id));
                   7015:                }
                   7016:              goto found;
                   7017:            }
                   7018:          if (id == ridpointers[(int) RID_CHAR])
                   7019:            {
                   7020:              if (type)
                   7021:                error ("extraneous `char' ignored");
                   7022:              else
                   7023:                {
                   7024:                  explicit_char = 1;
                   7025:                  type = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (id));
                   7026:                }
                   7027:              goto found;
                   7028:            }
1.1.1.4   root     7029:          if (id == ridpointers[(int) RID_WCHAR])
                   7030:            {
                   7031:              if (type)
                   7032:                error ("extraneous `__wchar_t' ignored");
                   7033:              else
                   7034:                {
                   7035:                  type = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (id));
                   7036:                }
                   7037:              goto found;
                   7038:            }
1.1       root     7039:          /* C++ aggregate types.  */
                   7040:          if (IDENTIFIER_HAS_TYPE_VALUE (id))
                   7041:            {
                   7042:              if (type)
                   7043:                error ("multiple declarations `%s' and `%s'",
                   7044:                       IDENTIFIER_POINTER (type),
                   7045:                       IDENTIFIER_POINTER (id));
                   7046:              else
                   7047:                type = IDENTIFIER_TYPE_VALUE (id);
                   7048:              goto found;
                   7049:            }
                   7050: 
                   7051:          for (i = (int) RID_FIRST_MODIFIER; i < (int) RID_MAX; i++)
                   7052:            {
                   7053:              if (ridpointers[i] == id)
                   7054:                {
1.1.1.5 ! root     7055:                  if (i == (int) RID_LONG && (specbits & RIDBIT (i)))
1.1       root     7056:                    {
                   7057:                      if (pedantic)
1.1.1.3   root     7058:                        pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id));
                   7059:                      else if (longlong)
1.1.1.4   root     7060:                        error ("`long long long' is too long for GCC");
1.1       root     7061:                      else
                   7062:                        longlong = 1;
                   7063:                    }
1.1.1.5 ! root     7064:                  else if (specbits & RIDBIT (i))
1.1       root     7065:                    warning ("duplicate `%s'", IDENTIFIER_POINTER (id));
1.1.1.5 ! root     7066:                  specbits |= RIDBIT (i);
1.1       root     7067:                  goto found;
                   7068:                }
                   7069:            }
                   7070:        }
                   7071:       if (type)
                   7072:        error ("two or more data types in declaration of `%s'", name);
                   7073:       else if (TREE_CODE (id) == IDENTIFIER_NODE)
                   7074:        {
                   7075:          register tree t = lookup_name (id, 1);
                   7076:          if (!t || TREE_CODE (t) != TYPE_DECL)
                   7077:            error ("`%s' fails to be a typedef or built in type",
                   7078:                   IDENTIFIER_POINTER (id));
                   7079:          else
                   7080:            {
                   7081:              type = TREE_TYPE (t);
                   7082:              typedef_decl = t;
                   7083:            }
                   7084:        }
                   7085:       else if (TREE_CODE (id) != ERROR_MARK)
                   7086:        /* Can't change CLASS nodes into RECORD nodes here!  */
                   7087:        type = id;
                   7088: 
                   7089:     found: {}
                   7090:     }
                   7091: 
                   7092:   typedef_type = type;
                   7093: 
                   7094:   /* No type at all: default to `int', and set EXPLICIT_INT
                   7095:      because it was not a user-defined typedef.  */
                   7096: 
1.1.1.5 ! root     7097:   if (type == NULL_TREE)
1.1       root     7098:     {
                   7099:       explicit_int = -1;
                   7100:       if (return_type == return_dtor)
                   7101:        type = void_type_node;
                   7102:       else if (return_type == return_ctor)
                   7103:        type = TYPE_POINTER_TO (ctor_return_type);
                   7104:       else
                   7105:        {
                   7106:          if (funcdef_flag && explicit_warn_return_type
                   7107:              && return_type == return_normal
1.1.1.5 ! root     7108:              && ! (specbits & (RIDBIT (RID_SIGNED) | RIDBIT (RID_UNSIGNED)
        !          7109:                                | RIDBIT (RID_LONG) | RIDBIT (RID_SHORT))))
1.1       root     7110:            warn_about_return_type = 1;
                   7111:          /* Save warning until we know what is really going on.  */
                   7112:          type = integer_type_node;
                   7113:        }
                   7114:     }
                   7115:   else if (return_type == return_dtor)
                   7116:     {
                   7117:       error ("return type specification for destructor invalid");
                   7118:       type = void_type_node;
                   7119:     }
                   7120:   else if (return_type == return_ctor)
                   7121:     {
                   7122:       error ("return type specification for constructor invalid");
                   7123:       type = TYPE_POINTER_TO (ctor_return_type);
                   7124:     }
1.1.1.5 ! root     7125:   else if ((specbits & RIDBIT (RID_FRIEND))
1.1       root     7126:           && IS_AGGR_TYPE (type)
                   7127:           && ! TYPE_BEING_DEFINED (type)
                   7128:           && TYPE_SIZE (type) == NULL_TREE
                   7129:           && ! ANON_AGGRNAME_P (TYPE_IDENTIFIER (type))
1.1.1.4   root     7130:           && current_function_decl == NULL_TREE
                   7131:           && decl_context != PARM)
1.1       root     7132:     {
                   7133:       /* xref_tag will make friend class declarations look like
                   7134:         nested class declarations.  Retroactively change that
                   7135:         if the type has not yet been defined.
                   7136: 
                   7137:         ??? ANSI C++ doesn't say what to do in this case yet.  */
                   7138:       globalize_nested_type (type);
                   7139:     }
                   7140: 
                   7141:   ctype = NULL_TREE;
                   7142: 
                   7143:   /* Now process the modifiers that were specified
                   7144:      and check for invalid combinations.  */
                   7145: 
                   7146:   /* Long double is a special combination.  */
                   7147: 
1.1.1.5 ! root     7148:   if ((specbits & RIDBIT (RID_LONG))
1.1.1.4   root     7149:       && TYPE_MAIN_VARIANT (type) == double_type_node)
1.1       root     7150:     {
1.1.1.5 ! root     7151:       specbits &= ~ RIDBIT (RID_LONG);
1.1.1.4   root     7152:       type = build_type_variant (long_double_type_node, TYPE_READONLY (type),
                   7153:                                 TYPE_VOLATILE (type));
1.1       root     7154:     }
                   7155: 
                   7156:   /* Check all other uses of type modifiers.  */
                   7157: 
1.1.1.5 ! root     7158:   if (specbits & (RIDBIT (RID_UNSIGNED) | RIDBIT (RID_SIGNED)
        !          7159:                  | RIDBIT (RID_LONG) | RIDBIT (RID_SHORT)))
1.1       root     7160:     {
                   7161:       int ok = 0;
                   7162: 
                   7163:       if (TREE_CODE (type) == REAL_TYPE)
                   7164:        error ("short, signed or unsigned invalid for `%s'", name);
1.1.1.4   root     7165:       else if (TREE_CODE (type) != INTEGER_TYPE || type == wchar_type_node)
1.1       root     7166:        error ("long, short, signed or unsigned invalid for `%s'", name);
1.1.1.5 ! root     7167:       else if ((specbits & RIDBIT (RID_LONG))
        !          7168:               && (specbits & RIDBIT (RID_SHORT)))
1.1       root     7169:        error ("long and short specified together for `%s'", name);
1.1.1.5 ! root     7170:       else if (((specbits & RIDBIT (RID_LONG))
        !          7171:                || (specbits & RIDBIT (RID_SHORT)))
1.1       root     7172:               && explicit_char)
                   7173:        error ("long or short specified with char for `%s'", name);
1.1.1.5 ! root     7174:       else if (((specbits & RIDBIT (RID_LONG))
        !          7175:                || (specbits & RIDBIT (RID_SHORT)))
1.1       root     7176:               && TREE_CODE (type) == REAL_TYPE)
                   7177:        error ("long or short specified with floating type for `%s'", name);
1.1.1.5 ! root     7178:       else if ((specbits & RIDBIT (RID_SIGNED))
        !          7179:               && (specbits & RIDBIT (RID_UNSIGNED)))
1.1       root     7180:        error ("signed and unsigned given together for `%s'", name);
                   7181:       else
                   7182:        {
                   7183:          ok = 1;
                   7184:          if (!explicit_int && !explicit_char && pedantic)
                   7185:            {
                   7186:              pedwarn ("long, short, signed or unsigned used invalidly for `%s'",
                   7187:                       name);
                   7188:              if (flag_pedantic_errors)
                   7189:                ok = 0;
                   7190:            }
                   7191:        }
                   7192: 
                   7193:       /* Discard the type modifiers if they are invalid.  */
                   7194:       if (! ok)
                   7195:        {
1.1.1.5 ! root     7196:          specbits &= ~ (RIDBIT (RID_UNSIGNED) | RIDBIT (RID_SIGNED)
        !          7197:                         | RIDBIT (RID_LONG) | RIDBIT (RID_SHORT));
1.1       root     7198:          longlong = 0;
                   7199:        }
                   7200:     }
                   7201: 
                   7202:   /* Decide whether an integer type is signed or not.
                   7203:      Optionally treat bitfields as signed by default.  */
1.1.1.5 ! root     7204:   if ((specbits & RIDBIT (RID_UNSIGNED))
1.1       root     7205:       /* Traditionally, all bitfields are unsigned.  */
                   7206:       || (bitfield && flag_traditional)
                   7207:       || (bitfield && ! flag_signed_bitfields
                   7208:          && (explicit_int || explicit_char
                   7209:              /* A typedef for plain `int' without `signed'
                   7210:                 can be controlled just like plain `int'.  */
1.1.1.5 ! root     7211:              || ! (typedef_decl != NULL_TREE
1.1       root     7212:                    && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
                   7213:          && TREE_CODE (type) != ENUMERAL_TYPE
1.1.1.5 ! root     7214:          && !(specbits & RIDBIT (RID_SIGNED))))
1.1       root     7215:     {
                   7216:       if (longlong)
                   7217:        type = long_long_unsigned_type_node;
1.1.1.5 ! root     7218:       else if (specbits & RIDBIT (RID_LONG))
1.1       root     7219:        type = long_unsigned_type_node;
1.1.1.5 ! root     7220:       else if (specbits & RIDBIT (RID_SHORT))
1.1       root     7221:        type = short_unsigned_type_node;
                   7222:       else if (type == char_type_node)
                   7223:        type = unsigned_char_type_node;
                   7224:       else if (typedef_decl)
                   7225:        type = unsigned_type (type);
                   7226:       else
                   7227:        type = unsigned_type_node;
                   7228:     }
1.1.1.5 ! root     7229:   else if ((specbits & RIDBIT (RID_SIGNED))
1.1       root     7230:           && type == char_type_node)
                   7231:     type = signed_char_type_node;
                   7232:   else if (longlong)
                   7233:     type = long_long_integer_type_node;
1.1.1.5 ! root     7234:   else if (specbits & RIDBIT (RID_LONG))
1.1       root     7235:     type = long_integer_type_node;
1.1.1.5 ! root     7236:   else if (specbits & RIDBIT (RID_SHORT))
1.1       root     7237:     type = short_integer_type_node;
                   7238: 
                   7239:   /* Set CONSTP if this declaration is `const', whether by
                   7240:      explicit specification or via a typedef.
                   7241:      Likewise for VOLATILEP.  */
                   7242: 
1.1.1.5 ! root     7243:   constp = !! (specbits & RIDBIT (RID_CONST)) + TYPE_READONLY (type);
        !          7244:   volatilep = !! (specbits & RIDBIT (RID_VOLATILE)) + TYPE_VOLATILE (type);
1.1       root     7245:   staticp = 0;
1.1.1.5 ! root     7246:   inlinep = !! (specbits & RIDBIT (RID_INLINE));
1.1       root     7247:   if (constp > 1)
                   7248:     warning ("duplicate `const'");
                   7249:   if (volatilep > 1)
                   7250:     warning ("duplicate `volatile'");
1.1.1.5 ! root     7251:   virtualp = specbits & RIDBIT (RID_VIRTUAL);
        !          7252:   if (specbits & RIDBIT (RID_STATIC))
1.1       root     7253:     staticp = 1 + (decl_context == FIELD);
                   7254: 
                   7255:   if (virtualp && staticp == 2)
                   7256:     {
                   7257:       error ("member `%s' cannot be declared both virtual and static", name);
                   7258:       staticp = 0;
                   7259:     }
1.1.1.5 ! root     7260:   friendp = specbits & RIDBIT (RID_FRIEND);
        !          7261:   specbits &= ~ (RIDBIT (RID_VIRTUAL) | RIDBIT (RID_FRIEND));
1.1       root     7262: 
                   7263:   /* Warn if two storage classes are given. Default to `auto'.  */
                   7264: 
                   7265:   if (specbits)
                   7266:     {
1.1.1.5 ! root     7267:       if (specbits & RIDBIT (RID_STATIC)) nclasses++;
        !          7268:       if (specbits & RIDBIT (RID_EXTERN)) nclasses++;
1.1       root     7269:       if (decl_context == PARM && nclasses > 0)
                   7270:        error ("storage class specifiers invalid in parameter declarations");
1.1.1.5 ! root     7271:       if (specbits & RIDBIT (RID_TYPEDEF))
1.1       root     7272:        {
                   7273:          if (decl_context == PARM)
                   7274:            error ("typedef declaration invalid in parameter declaration");
                   7275:          nclasses++;
                   7276:        }
1.1.1.5 ! root     7277:       if (specbits & RIDBIT (RID_AUTO)) nclasses++;
        !          7278:       if (specbits & RIDBIT (RID_REGISTER)) nclasses++;
1.1       root     7279:     }
                   7280: 
                   7281:   /* Give error if `virtual' is used outside of class declaration.  */
                   7282:   if (virtualp && current_class_name == NULL_TREE)
                   7283:     {
                   7284:       error ("virtual outside class declaration");
                   7285:       virtualp = 0;
                   7286:     }
                   7287: 
                   7288:   /* Warn about storage classes that are invalid for certain
                   7289:      kinds of declarations (parameters, typenames, etc.).  */
                   7290: 
                   7291:   if (nclasses > 1)
                   7292:     error ("multiple storage classes in declaration of `%s'", name);
                   7293:   else if (decl_context != NORMAL && nclasses > 0)
                   7294:     {
                   7295:       if (decl_context == PARM
1.1.1.5 ! root     7296:          && ((specbits & RIDBIT (RID_REGISTER)) | RIDBIT (RID_AUTO)))
1.1       root     7297:        ;
1.1.1.5 ! root     7298:       else if ((decl_context == FIELD
        !          7299:                || decl_context == TYPENAME)
        !          7300:               && (specbits & RIDBIT (RID_TYPEDEF)))
1.1       root     7301:        {
                   7302:          /* A typedef which was made in a class's scope.  */
                   7303:          tree loc_typedecl;
                   7304:          register int i = sizeof (struct lang_decl_flags) / sizeof (int);
                   7305:          register int *pi;
1.1.1.5 ! root     7306:          struct binding_level *local_binding_level;
1.1       root     7307: 
                   7308:          /* keep `grokdeclarator' from thinking we are in PARM context.  */
                   7309:          pushlevel (0);
1.1.1.5 ! root     7310:          /* poplevel_class may be called by grokdeclarator which is called in
        !          7311:             start_decl which is called below. In this case, our pushed level
        !          7312:             may vanish and poplevel mustn't be called. So remember what we
        !          7313:             have pushed and pop only if that is matched by 
        !          7314:             current_binding_level later. [email protected] */
        !          7315:          local_binding_level = current_binding_level;
        !          7316: 
1.1       root     7317:          loc_typedecl = start_decl (declarator, declspecs, initialized, NULL_TREE);
                   7318: 
                   7319:          pi = (int *) permalloc (sizeof (struct lang_decl_flags));
                   7320:          while (i > 0)
                   7321:            pi[--i] = 0;
                   7322:          DECL_LANG_SPECIFIC (loc_typedecl) = (struct lang_decl *) pi;
1.1.1.4   root     7323:          /* This poplevel conflicts with the popclass over in
                   7324:             grokdeclarator.  See ``This popclass conflicts'' */
1.1.1.5 ! root     7325:          if (current_binding_level == local_binding_level)
        !          7326:            poplevel (0, 0, 0);
1.1       root     7327: 
                   7328: #if 0
                   7329:          if (TREE_CODE (TREE_TYPE (loc_typedecl)) == ENUMERAL_TYPE)
                   7330:            {
                   7331:              tree ref = lookup_tag (ENUMERAL_TYPE, DECL_NAME (loc_typedecl), current_binding_level, 0);
                   7332:              if (! ref)
                   7333:                pushtag (DECL_NAME (loc_typedecl), TREE_TYPE (loc_typedecl));
                   7334:            }
                   7335: #endif
1.1.1.5 ! root     7336: 
        !          7337:          /* We used to check for a typedef hiding a previous decl in
        !          7338:             class scope, but delete_duplicate_fields_1 will now do
        !          7339:             that for us in the proper place.  */
        !          7340: 
        !          7341:          /* We reset loc_typedecl because the IDENTIFIER_CLASS_NAME is
        !          7342:             set by pushdecl_class_level.  */
        !          7343:          loc_typedecl = pushdecl_class_level (loc_typedecl);
        !          7344: 
1.1       root     7345:          return loc_typedecl;
                   7346:        }
1.1.1.3   root     7347:       else if (decl_context == FIELD
1.1.1.4   root     7348:               /* C++ allows static class elements  */
1.1.1.5 ! root     7349:               && (specbits & RIDBIT (RID_STATIC)))
1.1.1.4   root     7350:        /* C++ also allows inlines and signed and unsigned elements,
                   7351:           but in those cases we don't come in here.  */
1.1.1.3   root     7352:        ;
1.1       root     7353:       else
                   7354:        {
1.1.1.4   root     7355:          if (decl_context == FIELD)
                   7356:            {
                   7357:              tree tmp = TREE_OPERAND (declarator, 0);
                   7358:              register int op = IDENTIFIER_OPNAME_P (tmp);
                   7359:              error ("storage class specified for %s `%s'",
                   7360:                     op ? "member operator" : "structure field",
                   7361:                     op ? operator_name_string (tmp) : name);
                   7362:            }
                   7363:          else
                   7364:            error ((decl_context == PARM
                   7365:                    ? "storage class specified for parameter `%s'"
                   7366:                    : "storage class specified for typename"), name);
1.1.1.5 ! root     7367:          specbits &= ~ (RIDBIT (RID_REGISTER) | RIDBIT (RID_AUTO)
        !          7368:                         | RIDBIT (RID_EXTERN));
1.1       root     7369:        }
                   7370:     }
1.1.1.5 ! root     7371:   else if ((specbits & RIDBIT (RID_EXTERN)) && initialized && !funcdef_flag)
1.1       root     7372:     {
1.1.1.4   root     7373:       if (current_binding_level == global_binding_level)
1.1.1.5 ! root     7374:        {
        !          7375:          /* It's common practice (and completely legal) to have a const
        !          7376:             be initialized and declared extern.  */
        !          7377:          if (! constp)
        !          7378:            warning ("`%s' initialized and declared `extern'", name);
        !          7379:        }
1.1.1.4   root     7380:       else
                   7381:        error ("`%s' has both `extern' and initializer", name);
1.1       root     7382:     }
1.1.1.5 ! root     7383:   else if ((specbits & RIDBIT (RID_EXTERN)) && funcdef_flag
1.1       root     7384:           && current_binding_level != global_binding_level)
                   7385:     error ("nested function `%s' declared `extern'", name);
                   7386:   else if (current_binding_level == global_binding_level)
                   7387:     {
1.1.1.5 ! root     7388:       if (specbits & RIDBIT (RID_AUTO))
1.1       root     7389:        error ("top-level declaration of `%s' specifies `auto'", name);
                   7390: #if 0
1.1.1.5 ! root     7391:       if (specbits & RIDBIT (RID_REGISTER))
1.1       root     7392:        error ("top-level declaration of `%s' specifies `register'", name);
                   7393: #endif
                   7394: #if 0
                   7395:       /* I'm not sure under what circumstances we should turn
                   7396:         on the extern bit, and under what circumstances we should
                   7397:         warn if other bits are turned on.  */
                   7398:       if (decl_context == NORMAL
1.1.1.5 ! root     7399:          && ! (specbits & RIDBIT (RID_EXTERN))
1.1       root     7400:          && ! root_lang_context_p ())
                   7401:        {
1.1.1.5 ! root     7402:          specbits |= RIDBIT (RID_EXTERN);
1.1       root     7403:        }
                   7404: #endif
                   7405:     }
                   7406: 
                   7407:   /* Now figure out the structure of the declarator proper.
                   7408:      Descend through it, creating more complex types, until we reach
                   7409:      the declared identifier (or NULL_TREE, in an absolute declarator).  */
                   7410: 
                   7411:   while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE)
                   7412:     {
                   7413:       /* Each level of DECLARATOR is either an ARRAY_REF (for ...[..]),
                   7414:         an INDIRECT_REF (for *...),
                   7415:         a CALL_EXPR (for ...(...)),
                   7416:         an identifier (for the name being declared)
                   7417:         or a null pointer (for the place in an absolute declarator
                   7418:         where the name was omitted).
                   7419:         For the last two cases, we have just exited the loop.
                   7420: 
                   7421:         For C++ it could also be
                   7422:         a SCOPE_REF (for class :: ...).  In this case, we have converted
                   7423:         sensible names to types, and those are the values we use to
                   7424:         qualify the member name.
                   7425:         an ADDR_EXPR (for &...),
                   7426:         a BIT_NOT_EXPR (for destructors)
                   7427:         a TYPE_EXPR (for operator typenames)
                   7428: 
                   7429:         At this point, TYPE is the type of elements of an array,
                   7430:         or for a function to return, or for a pointer to point to.
                   7431:         After this sequence of ifs, TYPE is the type of the
                   7432:         array or function or pointer, and DECLARATOR has had its
                   7433:         outermost layer removed.  */
                   7434: 
                   7435:       if (TREE_CODE (type) == ERROR_MARK)
                   7436:        {
                   7437:          if (TREE_CODE (declarator) == SCOPE_REF)
                   7438:            declarator = TREE_OPERAND (declarator, 1);
                   7439:          else
                   7440:            declarator = TREE_OPERAND (declarator, 0);
                   7441:          continue;
                   7442:        }
                   7443:       if (quals != NULL_TREE
                   7444:          && (declarator == NULL_TREE
                   7445:              || TREE_CODE (declarator) != SCOPE_REF))
                   7446:        {
                   7447:          if (ctype == NULL_TREE && TREE_CODE (type) == METHOD_TYPE)
                   7448:            ctype = TYPE_METHOD_BASETYPE (type);
                   7449:          if (ctype != NULL_TREE)
                   7450:            {
1.1.1.2   root     7451: #if 0 /* not yet, should get fixed properly later */
                   7452:              tree dummy = make_type_decl (NULL_TREE, type);
                   7453: #else
1.1       root     7454:              tree dummy = build_decl (TYPE_DECL, NULL_TREE, type);
1.1.1.2   root     7455: #endif
1.1       root     7456:              ctype = grok_method_quals (ctype, dummy, quals);
                   7457:              type = TREE_TYPE (dummy);
                   7458:              quals = NULL_TREE;
                   7459:            }
                   7460:        }
                   7461:       switch (TREE_CODE (declarator))
                   7462:        {
                   7463:        case ARRAY_REF:
                   7464:          maybe_globalize_type (type);
                   7465:          {
                   7466:            register tree itype = NULL_TREE;
                   7467:            register tree size = TREE_OPERAND (declarator, 1);
                   7468: 
                   7469:            declarator = TREE_OPERAND (declarator, 0);
                   7470: 
                   7471:            /* Check for some types that there cannot be arrays of.  */
                   7472: 
1.1.1.4   root     7473:            if (TYPE_MAIN_VARIANT (type) == void_type_node)
1.1       root     7474:              {
                   7475:                error ("declaration of `%s' as array of voids", name);
                   7476:                type = error_mark_node;
                   7477:              }
                   7478: 
                   7479:            if (TREE_CODE (type) == FUNCTION_TYPE)
                   7480:              {
                   7481:                error ("declaration of `%s' as array of functions", name);
                   7482:                type = error_mark_node;
                   7483:              }
                   7484: 
1.1.1.5 ! root     7485:            /* ARM $8.4.3: Since you can't have a pointer to a reference,
        !          7486:               you can't have arrays of references.  If we allowed them,
        !          7487:               then we'd be saying x[i] is legal for an array x, but
        !          7488:               then you'd have to ask: what does `*(x + i)' mean?  */
        !          7489:            if (TREE_CODE (type) == REFERENCE_TYPE)
        !          7490:              error ("declaration of `%s' as array of references", name);
        !          7491: 
1.1       root     7492:            if (size == error_mark_node)
                   7493:              type = error_mark_node;
                   7494: 
                   7495:            if (type == error_mark_node)
                   7496:              continue;
                   7497: 
                   7498:            if (size)
                   7499:              {
                   7500:                /* Must suspend_momentary here because the index
                   7501:                   type may need to live until the end of the function.
                   7502:                   For example, it is used in the declaration of a
                   7503:                   variable which requires destructing at the end of
                   7504:                   the function; then build_vec_delete will need this
                   7505:                   value.  */
                   7506:                int yes = suspend_momentary ();
                   7507:                /* might be a cast */
                   7508:                if (TREE_CODE (size) == NOP_EXPR
                   7509:                    && TREE_TYPE (size) == TREE_TYPE (TREE_OPERAND (size, 0)))
                   7510:                  size = TREE_OPERAND (size, 0);
                   7511: 
                   7512:                /* If this is a template parameter, it'll be constant, but
                   7513:                   we don't know what the value is yet.  */
                   7514:                if (TREE_CODE (size) == TEMPLATE_CONST_PARM)
                   7515:                  goto dont_grok_size;
                   7516: 
                   7517:                if (TREE_CODE (TREE_TYPE (size)) != INTEGER_TYPE
                   7518:                    && TREE_CODE (TREE_TYPE (size)) != ENUMERAL_TYPE)
                   7519:                  {
                   7520:                    error ("size of array `%s' has non-integer type", name);
                   7521:                    size = integer_one_node;
                   7522:                  }
                   7523:                if (TREE_READONLY_DECL_P (size))
                   7524:                  size = decl_constant_value (size);
                   7525:                if (pedantic && integer_zerop (size))
1.1.1.3   root     7526:                  pedwarn ("ANSI C++ forbids zero-size array `%s'", name);
1.1       root     7527:                if (TREE_CONSTANT (size))
                   7528:                  {
                   7529:                    if (INT_CST_LT (size, integer_zero_node))
                   7530:                      {
                   7531:                        error ("size of array `%s' is negative", name);
                   7532:                        size = integer_one_node;
                   7533:                      }
                   7534:                    itype = build_index_type (size_binop (MINUS_EXPR, size,
                   7535:                                                          integer_one_node));
                   7536:                  }
                   7537:                else
                   7538:                  {
                   7539:                    if (pedantic)
1.1.1.3   root     7540:                      pedwarn ("ANSI C++ forbids variable-size array `%s'", name);
1.1       root     7541:                  dont_grok_size:
1.1.1.5 ! root     7542:                    itype =
        !          7543:                      build_binary_op (MINUS_EXPR, size, integer_one_node, 1);
1.1.1.4   root     7544:                    /* Make sure the array size remains visibly nonconstant
                   7545:                       even if it is (eg) a const variable with known value.  */
                   7546:                    size_varies = 1;
                   7547:                    itype = variable_size (itype);
1.1       root     7548:                    itype = build_index_type (itype);
                   7549:                  }
                   7550:                resume_momentary (yes);
                   7551:              }
                   7552: 
                   7553:            /* Build the array type itself.
                   7554:               Merge any constancy or volatility into the target type.  */
                   7555: 
                   7556:            if (constp || volatilep)
                   7557:              type = build_type_variant (type, constp, volatilep);
                   7558: 
                   7559:            type = build_cplus_array_type (type, itype);
                   7560:            ctype = NULL_TREE;
                   7561:          }
                   7562:          break;
                   7563: 
                   7564:        case CALL_EXPR:
                   7565:          maybe_globalize_type (type);
                   7566:          {
                   7567:            tree arg_types;
                   7568: 
                   7569:            /* Declaring a function type.
                   7570:               Make sure we have a valid type for the function to return.  */
1.1.1.3   root     7571: #if 0
1.1       root     7572:            /* Is this an error?  Should they be merged into TYPE here?  */
                   7573:            if (pedantic && (constp || volatilep))
1.1.1.3   root     7574:              pedwarn ("function declared to return const or volatile result");
                   7575: #else
                   7576:            /* Merge any constancy or volatility into the target type
                   7577:               for the pointer.  */
                   7578: 
                   7579:            if (constp || volatilep)
                   7580:              {
                   7581:                type = build_type_variant (type, constp, volatilep);
                   7582:                if (IS_AGGR_TYPE (type))
                   7583:                  build_pointer_type (type);
                   7584:                constp = 0;
                   7585:                volatilep = 0;
                   7586:              }
                   7587: #endif
1.1       root     7588: 
                   7589:            /* Warn about some types functions can't return.  */
                   7590: 
                   7591:            if (TREE_CODE (type) == FUNCTION_TYPE)
                   7592:              {
                   7593:                error ("`%s' declared as function returning a function", name);
                   7594:                type = integer_type_node;
                   7595:              }
                   7596:            if (TREE_CODE (type) == ARRAY_TYPE)
                   7597:              {
                   7598:                error ("`%s' declared as function returning an array", name);
                   7599:                type = integer_type_node;
                   7600:              }
                   7601: 
                   7602:            if (ctype == NULL_TREE
                   7603:                && decl_context == FIELD
                   7604:                && (friendp == 0 || dname == current_class_name))
                   7605:              ctype = current_class_type;
                   7606: 
                   7607:            if (ctype && flags == TYPENAME_FLAG)
                   7608:              TYPE_HAS_CONVERSION (ctype) = 1;
                   7609:            if (ctype && constructor_name (ctype) == dname)
                   7610:              {
                   7611:                /* We are within a class's scope. If our declarator name
                   7612:                   is the same as the class name, and we are defining
                   7613:                   a function, then it is a constructor/destructor, and
                   7614:                   therefore returns a void type.  */
                   7615: 
                   7616:                if (flags == DTOR_FLAG)
                   7617:                  {
1.1.1.4   root     7618:                    /* ANSI C++ June 5 1992 WP 12.4.1.  A destructor may
                   7619:                       not be declared const or volatile.  A destructor
                   7620:                       may not be static.  */
1.1       root     7621:                    if (staticp == 2)
                   7622:                      error ("destructor cannot be static member function");
1.1.1.4   root     7623:                    if (TYPE_READONLY (type))
1.1       root     7624:                      {
1.1.1.4   root     7625:                        error ("destructors cannot be declared `const'");
                   7626:                        return void_type_node;
1.1       root     7627:                      }
1.1.1.4   root     7628:                    if (TYPE_VOLATILE (type))
1.1       root     7629:                      {
1.1.1.4   root     7630:                        error ("destructors cannot be declared `volatile'");
                   7631:                        return void_type_node;
1.1       root     7632:                      }
                   7633:                    if (decl_context == FIELD)
                   7634:                      {
                   7635:                        if (! member_function_or_else (ctype, current_class_type,
1.1.1.4   root     7636:                                                       "destructor for alien class `%s' cannot be a member"))
                   7637:                          return void_type_node;
1.1       root     7638:                      }
                   7639:                  }
1.1.1.4   root     7640:                else            /* it's a constructor. */
1.1       root     7641:                  {
1.1.1.4   root     7642:                    /* ANSI C++ June 5 1992 WP 12.1.2.  A constructor may
                   7643:                       not be declared const or volatile.  A constructor may
                   7644:                       not be virtual.  A constructor may not be static.  */
1.1       root     7645:                    if (staticp == 2)
                   7646:                      error ("constructor cannot be static member function");
1.1.1.3   root     7647:                    if (virtualp)
1.1       root     7648:                      {
1.1.1.3   root     7649:                        pedwarn ("constructors cannot be declared virtual");
1.1       root     7650:                        virtualp = 0;
                   7651:                      }
1.1.1.4   root     7652:                    if (TYPE_READONLY (type))
                   7653:                      {
                   7654:                        error ("constructors cannot be declared `const'");
                   7655:                        return void_type_node;
                   7656:                      }
                   7657:                    if (TYPE_VOLATILE (type))
                   7658:                      {
                   7659:                        error ("constructors cannot be declared `volatile'");
                   7660:                        return void_type_node;
                   7661:                      }
1.1.1.5 ! root     7662:                    if (specbits & ~(RIDBIT (RID_INLINE)|RIDBIT (RID_STATIC)))
1.1.1.3   root     7663:                      error ("return value type specifier for constructor ignored");
1.1       root     7664:                    type = TYPE_POINTER_TO (ctype);
                   7665:                    if (decl_context == FIELD)
                   7666:                      {
                   7667:                        if (! member_function_or_else (ctype, current_class_type,
                   7668:                                                       "constructor for alien class `%s' cannot be member"))
1.1.1.4   root     7669:                          return void_type_node;
1.1       root     7670:                        TYPE_HAS_CONSTRUCTOR (ctype) = 1;
1.1.1.5 ! root     7671:                        if (return_type != return_ctor)
        !          7672:                          return NULL_TREE;
1.1       root     7673:                      }
                   7674:                  }
                   7675:                if (decl_context == FIELD)
                   7676:                  staticp = 0;
                   7677:              }
                   7678:            else if (friendp && virtualp)
                   7679:              {
                   7680:                /* Cannot be both friend and virtual.  */
                   7681:                error ("virtual functions cannot be friends");
1.1.1.5 ! root     7682:                specbits &= ~ RIDBIT (RID_FRIEND);
1.1       root     7683:              }
                   7684: 
                   7685:            if (decl_context == NORMAL && friendp)
                   7686:              error ("friend declaration not in class definition");
                   7687: 
                   7688:            /* Pick up type qualifiers which should be applied to `this'.  */
                   7689:            quals = TREE_OPERAND (declarator, 2);
                   7690: 
                   7691:            /* Traditionally, declaring return type float means double.  */
                   7692: 
1.1.1.4   root     7693:            if (flag_traditional
                   7694:                && TYPE_MAIN_VARIANT (type) == float_type_node)
                   7695:              {
                   7696:                type = build_type_variant (double_type_node,
                   7697:                                           TYPE_READONLY (type),
                   7698:                                           TYPE_VOLATILE (type));
                   7699:              }
1.1       root     7700: 
                   7701:            /* Construct the function type and go to the next
                   7702:               inner layer of declarator.  */
                   7703: 
                   7704:            {
                   7705:              int funcdef_p;
                   7706:              tree inner_parms = TREE_OPERAND (declarator, 1);
                   7707:              tree inner_decl = TREE_OPERAND (declarator, 0);
                   7708: 
                   7709:              declarator = TREE_OPERAND (declarator, 0);
                   7710: 
                   7711:              if (inner_decl && TREE_CODE (inner_decl) == SCOPE_REF)
                   7712:                inner_decl = TREE_OPERAND (inner_decl, 1);
                   7713: 
                   7714:              /* Say it's a definition only for the CALL_EXPR
                   7715:                 closest to the identifier.  */
                   7716:              funcdef_p =
                   7717:                (inner_decl &&
                   7718:                 (TREE_CODE (inner_decl) == IDENTIFIER_NODE
                   7719:                  || TREE_CODE (inner_decl) == TYPE_EXPR)) ? funcdef_flag : 0;
                   7720: 
                   7721:              arg_types = grokparms (inner_parms, funcdef_p);
                   7722:            }
                   7723: 
                   7724:            if (declarator)
                   7725:              {
1.1.1.4   root     7726:                /* Get past destructors, etc.
1.1       root     7727:                   We know we have one because FLAGS will be non-zero.
                   7728: 
                   7729:                   Complain about improper parameter lists here.  */
                   7730:                if (TREE_CODE (declarator) == BIT_NOT_EXPR)
                   7731:                  {
                   7732:                    declarator = TREE_OPERAND (declarator, 0);
                   7733: 
                   7734:                    if (strict_prototype == 0 && arg_types == NULL_TREE)
                   7735:                      arg_types = void_list_node;
                   7736:                    else if (arg_types == NULL_TREE
                   7737:                             || arg_types != void_list_node)
                   7738:                      {
                   7739:                        error ("destructors cannot be specified with parameters");
                   7740:                        arg_types = void_list_node;
                   7741:                      }
                   7742:                  }
                   7743:              }
1.1.1.3   root     7744:            /* the top level const or volatile is attached semantically only
                   7745:               to the function not the actual type. */
                   7746:            if (TYPE_READONLY (type) || TYPE_VOLATILE (type))
                   7747:              {
                   7748:                int constp = TYPE_READONLY (type);
                   7749:                int volatilep = TYPE_VOLATILE (type);
                   7750:                type = build_function_type (TYPE_MAIN_VARIANT (type),
                   7751:                                            flag_traditional
                   7752:                                            ? 0
                   7753:                                            : arg_types);
                   7754:                type = build_type_variant (type, constp, volatilep);
                   7755:              }
                   7756:            else
                   7757:              type = build_function_type (type,
                   7758:                                          flag_traditional
                   7759:                                          ? 0
                   7760:                                          : arg_types);
1.1       root     7761:          }
                   7762:          break;
                   7763: 
                   7764:        case ADDR_EXPR:
                   7765:        case INDIRECT_REF:
                   7766:          maybe_globalize_type (type);
                   7767: 
                   7768:          /* Filter out pointers-to-references and references-to-references.
                   7769:             We can get these if a TYPE_DECL is used.  */
                   7770: 
                   7771:          if (TREE_CODE (type) == REFERENCE_TYPE)
                   7772:            {
                   7773:              error ("cannot declare %s to references",
                   7774:                     TREE_CODE (declarator) == ADDR_EXPR
                   7775:                     ? "references" : "pointers");
                   7776:              declarator = TREE_OPERAND (declarator, 0);
                   7777:              continue;
                   7778:            }
                   7779: 
                   7780:          /* Merge any constancy or volatility into the target type
                   7781:             for the pointer.  */
                   7782: 
                   7783:          if (constp || volatilep)
                   7784:            {
                   7785:              type = build_type_variant (type, constp, volatilep);
                   7786:              if (IS_AGGR_TYPE (type))
                   7787:                build_pointer_type (type);
1.1.1.2   root     7788:              constp = 0;
                   7789:              volatilep = 0;
1.1       root     7790:            }
                   7791: 
                   7792:          if (TREE_CODE (declarator) == ADDR_EXPR)
                   7793:            {
                   7794:              if (TREE_CODE (type) == FUNCTION_TYPE)
                   7795:                {
                   7796:                  error ("cannot declare references to functions; use pointer to function instead");
                   7797:                  type = build_pointer_type (type);
                   7798:                }
                   7799:              else
                   7800:                {
                   7801:                  if (TYPE_MAIN_VARIANT (type) == void_type_node)
                   7802:                    error ("invalid type: `void &'");
                   7803:                  else
                   7804:                    type = build_reference_type (type);
                   7805:                }
                   7806:            }
                   7807:          else
                   7808:            type = build_pointer_type (type);
                   7809: 
                   7810:          /* Process a list of type modifier keywords (such as
                   7811:             const or volatile) that were given inside the `*' or `&'.  */
                   7812: 
                   7813:          if (TREE_TYPE (declarator))
                   7814:            {
                   7815:              register tree typemodlist;
                   7816:              int erred = 0;
                   7817:              for (typemodlist = TREE_TYPE (declarator); typemodlist;
                   7818:                   typemodlist = TREE_CHAIN (typemodlist))
                   7819:                {
                   7820:                  if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_CONST])
                   7821:                    constp++;
                   7822:                  else if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_VOLATILE])
                   7823:                    volatilep++;
                   7824:                  else if (!erred)
                   7825:                    {
                   7826:                      erred = 1;
                   7827:                      error ("invalid type modifier within %s declarator",
                   7828:                             TREE_CODE (declarator) == ADDR_EXPR
                   7829:                             ? "reference" : "pointer");
                   7830:                    }
                   7831:                }
                   7832:              if (constp > 1)
                   7833:                warning ("duplicate `const'");
                   7834:              if (volatilep > 1)
                   7835:                warning ("duplicate `volatile'");
                   7836:            }
                   7837:          declarator = TREE_OPERAND (declarator, 0);
                   7838:          ctype = NULL_TREE;
                   7839:          break;
                   7840: 
                   7841:        case SCOPE_REF:
                   7842:          {
                   7843:            /* We have converted type names to NULL_TREE if the
                   7844:               name was bogus, or to a _TYPE node, if not.
                   7845: 
                   7846:               The variable CTYPE holds the type we will ultimately
                   7847:               resolve to.  The code here just needs to build
                   7848:               up appropriate member types.  */
                   7849:            tree sname = TREE_OPERAND (declarator, 1);
1.1.1.4   root     7850:            /* Destructors can have their visibilities changed as well.  */
                   7851:            if (TREE_CODE (sname) == BIT_NOT_EXPR)
                   7852:              sname = TREE_OPERAND (sname, 0);
1.1       root     7853: 
                   7854:            if (TREE_COMPLEXITY (declarator) == 0)
                   7855:              /* This needs to be here, in case we are called
                   7856:                 multiple times.  */ ;
1.1.1.3   root     7857:            else if (friendp && (TREE_COMPLEXITY (declarator) < 2))
                   7858:              /* don't fall out into global scope. Hides real bug? --eichin */ ;
1.1       root     7859:            else if (TREE_COMPLEXITY (declarator) == current_class_depth)
                   7860:              {
                   7861:                TREE_COMPLEXITY (declarator) -= 1;
1.1.1.4   root     7862:                /* This popclass conflicts with the poplevel over in
                   7863:                   grokdeclarator.  See ``This poplevel conflicts'' */
1.1       root     7864:                popclass (1);
                   7865:              }
                   7866:            else
1.1.1.3   root     7867:              my_friendly_abort (16);
1.1       root     7868: 
                   7869:            if (TREE_OPERAND (declarator, 0) == NULL_TREE)
                   7870:              {
                   7871:                /* We had a reference to a global decl, or
                   7872:                   perhaps we were given a non-aggregate typedef,
                   7873:                   in which case we cleared this out, and should just
                   7874:                   keep going as though it wasn't there.  */
                   7875:                declarator = sname;
                   7876:                continue;
                   7877:              }
                   7878:            ctype = TREE_OPERAND (declarator, 0);
                   7879: 
                   7880:            if (sname == NULL_TREE)
                   7881:              goto done_scoping;
                   7882: 
                   7883:            if (TREE_CODE (sname) == IDENTIFIER_NODE)
                   7884:              {
                   7885:                /* This is the `standard' use of the scoping operator:
                   7886:                   basetype :: member .  */
                   7887: 
1.1.1.4   root     7888:                if (TYPE_MAIN_VARIANT (ctype) == current_class_type || friendp)
                   7889:                  {
                   7890:                    if (TREE_CODE (type) == FUNCTION_TYPE)
                   7891:                      type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep),
                   7892:                                                      TREE_TYPE (type), TYPE_ARG_TYPES (type));
                   7893:                    else
                   7894:                      {
                   7895:                        if (TYPE_MAIN_VARIANT (ctype) != current_class_type)
                   7896:                          {
                   7897:                            error ("cannot declare member `%s::%s' within this class",
                   7898:                                   TYPE_NAME_STRING (ctype), name);
                   7899:                            return void_type_node;
                   7900:                          }
                   7901:                        else if (extra_warnings)
                   7902:                          warning ("extra qualification `%s' on member `%s' ignored",
                   7903:                                   TYPE_NAME_STRING (ctype), name);
                   7904:                        type = build_offset_type (ctype, type);
                   7905:                      }
                   7906:                  }
1.1.1.5 ! root     7907:                else if (TYPE_SIZE (ctype) != NULL_TREE
        !          7908:                         || (specbits & RIDBIT (RID_TYPEDEF)))
1.1       root     7909:                  {
                   7910:                    tree t;
                   7911:                    /* have to move this code elsewhere in this function.
                   7912:                       this code is used for i.e., typedef int A::M; M *pm; */
                   7913: 
1.1.1.4   root     7914:                    if (explicit_int == -1 && decl_context == FIELD
                   7915:                        && funcdef_flag == 0)
1.1       root     7916:                      {
1.1.1.4   root     7917:                        /* The code in here should only be used to build
                   7918:                           stuff that will be grokked as visibility decls.  */
                   7919:                        t = lookup_field (ctype, sname, 0, 0);
1.1       root     7920:                        if (t)
                   7921:                          {
                   7922:                            t = build_lang_field_decl (FIELD_DECL, build_nt (SCOPE_REF, ctype, t), type);
                   7923:                            DECL_INITIAL (t) = init;
                   7924:                            return t;
                   7925:                          }
                   7926:                        /* No such field, try member functions.  */
                   7927:                        t = lookup_fnfields (TYPE_BINFO (ctype), sname, 0);
                   7928:                        if (t)
                   7929:                          {
                   7930:                            if (flags == DTOR_FLAG)
                   7931:                              t = TREE_VALUE (t);
                   7932:                            else if (CLASSTYPE_METHOD_VEC (ctype)
                   7933:                                     && TREE_VALUE (t) == TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (ctype), 0))
                   7934:                              {
                   7935:                                /* Don't include destructor with constructors.  */
                   7936:                                t = DECL_CHAIN (TREE_VALUE (t));
                   7937:                                if (t == NULL_TREE)
                   7938:                                  error ("class `%s' does not have any constructors", IDENTIFIER_POINTER (sname));
                   7939:                                t = build_tree_list (NULL_TREE, t);
                   7940:                              }
                   7941:                            t = build_lang_field_decl (FIELD_DECL, build_nt (SCOPE_REF, ctype, t), type);
                   7942:                            DECL_INITIAL (t) = init;
                   7943:                            return t;
                   7944:                          }
                   7945: 
                   7946:                        if (flags == TYPENAME_FLAG)
                   7947:                          error_with_aggr_type (ctype, "type conversion is not a member of structure `%s'");
                   7948:                        else
                   7949:                          error ("field `%s' is not a member of structure `%s'",
                   7950:                                 IDENTIFIER_POINTER (sname),
                   7951:                                 TYPE_NAME_STRING (ctype));
                   7952:                      }
                   7953:                    if (TREE_CODE (type) == FUNCTION_TYPE)
1.1.1.2   root     7954:                      type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep),
                   7955:                                                      TREE_TYPE (type), TYPE_ARG_TYPES (type));
1.1       root     7956:                    else
1.1.1.4   root     7957:                      {
                   7958:                        if (current_class_type)
                   7959:                          {
                   7960:                            if (TYPE_MAIN_VARIANT (ctype) != current_class_type)
                   7961:                              {
                   7962:                                error ("cannot declare member `%s::%s' within this class",
                   7963:                                       TYPE_NAME_STRING (ctype), name);
                   7964:                              return void_type_node;
                   7965:                              }
                   7966:                            else if (extra_warnings)
                   7967:                              warning ("extra qualification `%s' on member `%s' ignored",
                   7968:                                       TYPE_NAME_STRING (ctype), name);
                   7969:                          }
                   7970:                        type = build_offset_type (ctype, type);
                   7971:                      }
1.1       root     7972:                  }
                   7973:                else if (uses_template_parms (ctype))
                   7974:                  {
                   7975:                     enum tree_code c;
                   7976:                     if (TREE_CODE (type) == FUNCTION_TYPE)
                   7977:                      {
1.1.1.2   root     7978:                        type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep),
1.1       root     7979:                                                        TREE_TYPE (type),
                   7980:                                                        TYPE_ARG_TYPES (type));
                   7981:                        c = FUNCTION_DECL;
                   7982:                      }
                   7983:                  }
                   7984:                else
                   7985:                  sorry ("structure `%s' not yet defined",
                   7986:                         TYPE_NAME_STRING (ctype));
                   7987:                declarator = sname;
                   7988:              }
                   7989:            else if (TREE_CODE (sname) == TYPE_EXPR)
                   7990:              {
                   7991:                /* A TYPE_EXPR will change types out from under us.
                   7992:                   So do the TYPE_EXPR now, and make this SCOPE_REF
                   7993:                   inner to the TYPE_EXPR's CALL_EXPR.
                   7994: 
                   7995:                   This does not work if we don't get a CALL_EXPR back.
                   7996:                   I did not think about error recovery, hence the
1.1.1.5 ! root     7997:                   my_friendly_abort.  */
1.1       root     7998: 
                   7999:                /* Get the CALL_EXPR.  */
                   8000:                sname = grokoptypename (sname, 0);
1.1.1.4   root     8001:                my_friendly_assert (TREE_CODE (sname) == CALL_EXPR, 157);
1.1       root     8002:                type = TREE_TYPE (TREE_OPERAND (sname, 0));
                   8003:                /* Scope the CALL_EXPR's name.  */
                   8004:                TREE_OPERAND (declarator, 1) = TREE_OPERAND (sname, 0);
                   8005:                /* Put the SCOPE_EXPR in the CALL_EXPR's innermost position.  */
                   8006:                TREE_OPERAND (sname, 0) = declarator;
                   8007:                /* Now work from the CALL_EXPR.  */
                   8008:                declarator = sname;
                   8009:                continue;
                   8010:              }
                   8011:            else if (TREE_CODE (sname) == SCOPE_REF)
1.1.1.3   root     8012:              my_friendly_abort (17);
1.1       root     8013:            else
                   8014:              {
                   8015:              done_scoping:
                   8016:                declarator = TREE_OPERAND (declarator, 1);
                   8017:                if (declarator && TREE_CODE (declarator) == CALL_EXPR)
                   8018:                  /* In this case, we will deal with it later.  */
                   8019:                  ;
                   8020:                else
                   8021:                  {
                   8022:                    if (TREE_CODE (type) == FUNCTION_TYPE)
1.1.1.2   root     8023:                      type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep), TREE_TYPE (type), TYPE_ARG_TYPES (type));
1.1       root     8024:                    else
1.1.1.2   root     8025:                      type = build_offset_type (ctype, type);
1.1       root     8026:                  }
                   8027:              }
                   8028:          }
                   8029:          break;
                   8030: 
                   8031:        case BIT_NOT_EXPR:
                   8032:          declarator = TREE_OPERAND (declarator, 0);
                   8033:          break;
                   8034: 
                   8035:        case TYPE_EXPR:
                   8036:          declarator = grokoptypename (declarator, 0);
                   8037:          if (explicit_int != -1)
1.1.1.5 ! root     8038:            if (comp_target_types (type,
        !          8039:                                   TREE_TYPE (TREE_OPERAND (declarator, 0)),
        !          8040:                                   1) == 0)
1.1       root     8041:              error ("type conversion function declared to return incongruent type");
                   8042:            else
1.1.1.3   root     8043:              pedwarn ("return type specified for type conversion function");
1.1       root     8044:          type = TREE_TYPE (TREE_OPERAND (declarator, 0));
                   8045:          maybe_globalize_type (type);
                   8046:          break;
                   8047: 
                   8048:        case RECORD_TYPE:
                   8049:        case UNION_TYPE:
                   8050:        case ENUMERAL_TYPE:
1.1.1.5 ! root     8051:          declarator = NULL_TREE;
1.1       root     8052:          break;
                   8053: 
                   8054:        case ERROR_MARK:
1.1.1.5 ! root     8055:          declarator = NULL_TREE;
1.1       root     8056:          break;
                   8057: 
                   8058:        default:
1.1.1.5 ! root     8059:          my_friendly_abort (158);
1.1       root     8060:        }
                   8061:     }
                   8062: 
                   8063:   /* Now TYPE has the actual type.  */
                   8064: 
                   8065:   /* If this is declaring a typedef name, return a TYPE_DECL.  */
                   8066: 
1.1.1.5 ! root     8067:   if (specbits & RIDBIT (RID_TYPEDEF))
1.1       root     8068:     {
                   8069:       tree decl;
                   8070: 
                   8071:       /* Note that the grammar rejects storage classes
                   8072:         in typenames, fields or parameters.  */
                   8073:       if (constp || volatilep)
                   8074:        type = build_type_variant (type, constp, volatilep);
                   8075: 
                   8076:       /* If the user declares "struct {...} foo" then `foo' will have
                   8077:         an anonymous name.  Fill that name in now.  Nothing can
                   8078:         refer to it, so nothing needs know about the name change.
                   8079:         The TYPE_NAME field was filled in by build_struct_xref.  */
                   8080:       if (TYPE_NAME (type)
                   8081:          && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
                   8082:          && ANON_AGGRNAME_P (TYPE_IDENTIFIER (type)))
                   8083:        {
                   8084:          /* replace the anonymous name with the real name everywhere.  */
                   8085:          lookup_tag_reverse (type, declarator);
                   8086:          TYPE_IDENTIFIER (type) = declarator;
                   8087:        }
                   8088: 
1.1.1.2   root     8089: #if 0 /* not yet, should get fixed properly later */
                   8090:       decl = make_type_decl (declarator, type);
                   8091: #else
1.1       root     8092:       decl = build_decl (TYPE_DECL, declarator, type);
1.1.1.2   root     8093: #endif
1.1       root     8094:       if (quals)
                   8095:        {
                   8096:          if (ctype == NULL_TREE)
                   8097:            {
                   8098:              if (TREE_CODE (type) != METHOD_TYPE)
                   8099:                error_with_decl (decl, "invalid type qualifier for non-method type");
                   8100:              else
                   8101:                ctype = TYPE_METHOD_BASETYPE (type);
                   8102:            }
                   8103:          if (ctype != NULL_TREE)
                   8104:            grok_method_quals (ctype, decl, quals);
                   8105:        }
                   8106: 
1.1.1.5 ! root     8107:       if ((specbits & RIDBIT (RID_SIGNED))
1.1       root     8108:          || (typedef_decl && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
                   8109:        C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1;
                   8110: 
                   8111:       return decl;
                   8112:     }
                   8113: 
                   8114:   /* Detect the case of an array type of unspecified size
                   8115:      which came, as such, direct from a typedef name.
                   8116:      We must copy the type, so that each identifier gets
                   8117:      a distinct type, so that each identifier's size can be
                   8118:      controlled separately by its own initializer.  */
                   8119: 
                   8120:   if (type == typedef_type && TREE_CODE (type) == ARRAY_TYPE
1.1.1.5 ! root     8121:       && TYPE_DOMAIN (type) == NULL_TREE)
1.1       root     8122:     {
                   8123:       type = build_cplus_array_type (TREE_TYPE (type), TYPE_DOMAIN (type));
                   8124:     }
                   8125: 
                   8126:   /* If this is a type name (such as, in a cast or sizeof),
                   8127:      compute the type and return it now.  */
                   8128: 
                   8129:   if (decl_context == TYPENAME)
                   8130:     {
                   8131:       /* Note that the grammar rejects storage classes
                   8132:         in typenames, fields or parameters.  */
                   8133:       if (constp || volatilep)
                   8134:        type = build_type_variant (type, constp, volatilep);
                   8135: 
                   8136:       /* Special case: "friend class foo" looks like a TYPENAME context.  */
                   8137:       if (friendp)
                   8138:        {
                   8139:          /* A friendly class?  */
1.1.1.4   root     8140:          if (current_class_type)
                   8141:            make_friend_class (current_class_type, TYPE_MAIN_VARIANT (type));
                   8142:          else
                   8143:            error("trying to make class `%s' a friend of global scope",
                   8144:                  TYPE_NAME_STRING (type));
1.1       root     8145:          type = void_type_node;
                   8146:        }
                   8147:       else if (quals)
                   8148:        {
1.1.1.2   root     8149: #if 0 /* not yet, should get fixed properly later */
                   8150:          tree dummy = make_type_decl (declarator, type);
                   8151: #else
1.1       root     8152:          tree dummy = build_decl (TYPE_DECL, declarator, type);
1.1.1.2   root     8153: #endif
1.1       root     8154:          if (ctype == NULL_TREE)
                   8155:            {
1.1.1.4   root     8156:              my_friendly_assert (TREE_CODE (type) == METHOD_TYPE, 159);
1.1       root     8157:              ctype = TYPE_METHOD_BASETYPE (type);
                   8158:            }
                   8159:          grok_method_quals (ctype, dummy, quals);
                   8160:          type = TREE_TYPE (dummy);
                   8161:        }
                   8162: 
                   8163:       return type;
                   8164:     }
                   8165: 
                   8166:   /* `void' at top level (not within pointer)
                   8167:      is allowed only in typedefs or type names.
                   8168:      We don't complain about parms either, but that is because
                   8169:      a better error message can be made later.  */
                   8170: 
1.1.1.4   root     8171:   if (TYPE_MAIN_VARIANT (type) == void_type_node && decl_context != PARM)
1.1       root     8172:     {
                   8173:       if (declarator != NULL_TREE
                   8174:          && TREE_CODE (declarator) == IDENTIFIER_NODE)
1.1.1.5 ! root     8175:        {
        !          8176:          if (IDENTIFIER_OPNAME_P (declarator))
        !          8177:            error ("operator `%s' declared void",
        !          8178:                   operator_name_string (declarator));
        !          8179:          else
        !          8180:            error ("variable or field `%s' declared void", name);
        !          8181:        }
1.1       root     8182:       else
                   8183:        error ("variable or field declared void");
                   8184:       type = integer_type_node;
                   8185:     }
                   8186: 
                   8187:   /* Now create the decl, which may be a VAR_DECL, a PARM_DECL
                   8188:      or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE.  */
                   8189: 
                   8190:   {
                   8191:     register tree decl;
                   8192: 
                   8193:     if (decl_context == PARM)
                   8194:       {
                   8195:        tree parmtype = type;
                   8196: 
                   8197:        if (ctype)
                   8198:          error ("cannot use `::' in parameter declaration");
1.1.1.5 ! root     8199:        bad_specifiers ("parameter", virtualp, quals != NULL_TREE,
        !          8200:                        friendp, raises != NULL_TREE);
1.1       root     8201: 
                   8202:        /* A parameter declared as an array of T is really a pointer to T.
                   8203:           One declared as a function is really a pointer to a function.
                   8204:           One declared as a member is really a pointer to member.
                   8205: 
                   8206:           Don't be misled by references.  */
                   8207: 
                   8208:        if (TREE_CODE (type) == REFERENCE_TYPE)
                   8209:          type = TREE_TYPE (type);
                   8210: 
                   8211:        if (TREE_CODE (type) == ARRAY_TYPE)
                   8212:          {
                   8213:            if (parmtype == type)
                   8214:              {
                   8215:                /* Transfer const-ness of array into that of type
                   8216:                   pointed to.  */
                   8217:                type = build_pointer_type
                   8218:                  (build_type_variant (TREE_TYPE (type), constp, volatilep));
                   8219:                volatilep = constp = 0;
                   8220:              }
                   8221:            else
                   8222:              type = build_pointer_type (TREE_TYPE (type));
                   8223:          }
                   8224:        else if (TREE_CODE (type) == FUNCTION_TYPE)
                   8225:          type = build_pointer_type (type);
                   8226:        else if (TREE_CODE (type) == OFFSET_TYPE)
                   8227:          type = build_pointer_type (type);
                   8228: 
                   8229:        if (TREE_CODE (parmtype) == REFERENCE_TYPE)
                   8230:          {
                   8231:            /* Transfer const-ness of reference into that of type pointed to.  */
1.1.1.4   root     8232:            type = build_type_variant (build_reference_type (type), constp, volatilep);
1.1       root     8233:            constp = volatilep = 0;
                   8234:          }
                   8235: 
                   8236:        decl = build_decl (PARM_DECL, declarator, type);
                   8237: 
                   8238:        /* Compute the type actually passed in the parmlist,
                   8239:           for the case where there is no prototype.
                   8240:           (For example, shorts and chars are passed as ints.)
                   8241:           When there is a prototype, this is overridden later.  */
                   8242: 
                   8243:        DECL_ARG_TYPE (decl) = type;
1.1.1.4   root     8244:        if (TYPE_MAIN_VARIANT (type) == float_type_node)
                   8245:          DECL_ARG_TYPE (decl) = build_type_variant (double_type_node,
                   8246:                                                     TYPE_READONLY (type),
                   8247:                                                     TYPE_VOLATILE (type));
                   8248:        else if (C_PROMOTING_INTEGER_TYPE_P (type))
                   8249:          {
                   8250:            tree argtype;
                   8251: 
                   8252:            /* Retain unsignedness if traditional or if not really
                   8253:               getting wider.  */
                   8254:            if (TREE_UNSIGNED (type)
                   8255:                && (flag_traditional
                   8256:                    || TYPE_PRECISION (type)
                   8257:                        == TYPE_PRECISION (integer_type_node)))
                   8258:              argtype = unsigned_type_node;
                   8259:            else
                   8260:              argtype = integer_type_node;
                   8261:            DECL_ARG_TYPE (decl) = build_type_variant (argtype,
                   8262:                                                       TYPE_READONLY (type),
                   8263:                                                       TYPE_VOLATILE (type));
                   8264:          }
1.1       root     8265:       }
                   8266:     else if (decl_context == FIELD)
                   8267:       {
                   8268:        if (type == error_mark_node)
                   8269:          {
                   8270:            /* Happens when declaring arrays of sizes which
                   8271:               are error_mark_node, for example.  */
                   8272:            decl = NULL_TREE;
                   8273:          }
                   8274:        else if (TREE_CODE (type) == FUNCTION_TYPE)
                   8275:          {
1.1.1.5 ! root     8276:            int publicp = 0;
        !          8277: 
1.1       root     8278:            if (friendp == 0)
                   8279:              {
                   8280:                if (ctype == NULL_TREE)
                   8281:                  ctype = current_class_type;
1.1.1.4   root     8282: 
                   8283:                if (ctype == NULL_TREE)
                   8284:                  {
                   8285:                    register int op = IDENTIFIER_OPNAME_P (declarator);
                   8286:                    error ("can't make %s `%s' into a method -- not in a class",
                   8287:                           op ? "operator" : "function",
                   8288:                           op ? operator_name_string (declarator) : IDENTIFIER_POINTER (declarator));
                   8289:                    return void_type_node;
                   8290:                  }
                   8291: 
                   8292:                /* ``A union may [ ... ] not [ have ] virtual functions.''
                   8293:                   ARM 9.5 */
                   8294:                if (virtualp && TREE_CODE (ctype) == UNION_TYPE)
                   8295:                  {
                   8296:                    error ("function `%s' declared virtual inside a union",
                   8297:                           IDENTIFIER_POINTER (declarator));
                   8298:                    return void_type_node;
                   8299:                  }
                   8300: 
1.1       root     8301:                /* Don't convert type of operators new and delete to
                   8302:                   METHOD_TYPE; they remain FUNCTION_TYPEs.  */
                   8303:                if (staticp < 2
1.1.1.2   root     8304:                    && declarator != ansi_opname[(int) NEW_EXPR]
                   8305:                    && declarator != ansi_opname[(int) DELETE_EXPR])
                   8306:                  type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep),
                   8307:                                                  TREE_TYPE (type), TYPE_ARG_TYPES (type));
1.1       root     8308:              }
1.1.1.5 ! root     8309: 
        !          8310:            /* Tell grokfndecl if it needs to set TREE_PUBLIC on the node.  */
        !          8311:            publicp = ((specbits & RIDBIT (RID_EXTERN))
        !          8312:                       || (ctype != NULL_TREE && funcdef_flag >= 0)
        !          8313: #if 0
        !          8314:                       /* These are replicated in each object, so we shouldn't
        !          8315:                          set TREE_PUBLIC. */
        !          8316:                       || (friendp
        !          8317:                           && !(specbits & RIDBIT (RID_STATIC))
        !          8318:                           && !(specbits & RIDBIT (RID_INLINE)))
        !          8319: #endif
        !          8320:                       );
        !          8321:            decl = grokfndecl (ctype, type, declarator,
        !          8322:                               virtualp, flags, quals,
        !          8323:                               raises, friendp ? -1 : 0, publicp);
1.1.1.4   root     8324:            DECL_INLINE (decl) = inlinep;
1.1       root     8325:          }
                   8326:        else if (TREE_CODE (type) == METHOD_TYPE)
                   8327:          {
1.1.1.5 ! root     8328:            /* All method decls are public, so tell grokfndecl to set
        !          8329:               TREE_PUBLIC, also.  */
        !          8330:            decl = grokfndecl (ctype, type, declarator,
        !          8331:                               virtualp, flags, quals,
        !          8332:                               raises, friendp ? -1 : 0, 1);
1.1.1.4   root     8333:            DECL_INLINE (decl) = inlinep;
1.1       root     8334:          }
                   8335:        else if (TREE_CODE (type) == RECORD_TYPE
                   8336:                 && CLASSTYPE_DECLARED_EXCEPTION (type))
                   8337:          {
                   8338:            /* Handle a class-local exception declaration.  */
                   8339:            decl = build_lang_field_decl (VAR_DECL, declarator, type);
                   8340:            if (ctype == NULL_TREE)
                   8341:              ctype = current_class_type;
                   8342:            finish_exception_decl (TREE_CODE (TYPE_NAME (ctype)) == TYPE_DECL
                   8343:                                   ? TYPE_IDENTIFIER (ctype) : TYPE_NAME (ctype), decl);
                   8344:            return void_type_node;
                   8345:          }
1.1.1.5 ! root     8346:        else if (TYPE_SIZE (type) == NULL_TREE && !staticp
1.1       root     8347:                 && (TREE_CODE (type) != ARRAY_TYPE || initialized == 0))
                   8348:          {
                   8349:            if (declarator)
                   8350:              error ("field `%s' has incomplete type",
                   8351:                     IDENTIFIER_POINTER (declarator));
                   8352:            else
                   8353:              error ("field has incomplete type");
1.1.1.5 ! root     8354: 
        !          8355:            /* If we're instantiating a template, tell them which
        !          8356:               instantiation made the field's type be incomplete.  */
        !          8357:            if (current_class_type
        !          8358:                && IDENTIFIER_TEMPLATE (current_class_type)
        !          8359:                && declspecs && TREE_VALUE (declspecs)
        !          8360:                && TREE_TYPE (TREE_VALUE (declspecs)) == type)
        !          8361:              error ("  in instantiation of template `%s'",
        !          8362:                     TYPE_NAME_STRING (current_class_type));
        !          8363:                
1.1       root     8364:            type = error_mark_node;
                   8365:            decl = NULL_TREE;
                   8366:          }
                   8367:        else
                   8368:          {
                   8369:            if (friendp)
                   8370:              {
                   8371:                if (declarator)
                   8372:                  error ("`%s' is neither function nor method; cannot be declared friend",
                   8373:                         IDENTIFIER_POINTER (declarator));
                   8374:                else
                   8375:                  {
                   8376:                    error ("invalid friend declaration");
                   8377:                    return void_type_node;
                   8378:                  }
                   8379:                friendp = 0;
                   8380:              }
                   8381:            decl = NULL_TREE;
                   8382:          }
                   8383: 
                   8384:        if (friendp)
                   8385:          {
1.1.1.5 ! root     8386:            tree t;
        !          8387: 
1.1       root     8388:            /* Friends are treated specially.  */
                   8389:            if (ctype == current_class_type)
                   8390:              warning ("member functions are implicitly friends of their class");
1.1.1.5 ! root     8391:            else if (decl && (t = DECL_NAME (decl)))
        !          8392:              {
        !          8393:                /* ARM $13.4.3 */
        !          8394:                if (t == ansi_opname[(int) MODIFY_EXPR])
        !          8395:                  pedwarn ("operator `=' must be a member function");
        !          8396:                else
        !          8397:                  return do_friend (ctype, declarator, decl,
        !          8398:                                    last_function_parms, flags, quals);
        !          8399:              }
1.1       root     8400:            else return void_type_node;
                   8401:          }
                   8402: 
                   8403:        /* Structure field.  It may not be a function, except for C++ */
                   8404: 
1.1.1.5 ! root     8405:        if (decl == NULL_TREE)
1.1       root     8406:          {
1.1.1.5 ! root     8407:            bad_specifiers ("field", virtualp, quals != NULL_TREE,
        !          8408:                            friendp, raises != NULL_TREE);
1.1       root     8409: 
1.1.1.4   root     8410:            /* ANSI C++ June 5 1992 WP 9.2.2 and 9.4.2.  A member-declarator
                   8411:               cannot have an initializer, and a static member declaration must
                   8412:               be defined elsewhere.  */
                   8413:            if (initialized)
                   8414:              {
                   8415:                if (staticp)
                   8416:                  error ("static member `%s' must be defined separately from its declaration",
                   8417:                          IDENTIFIER_POINTER (declarator));
                   8418:                /* Note that initialization of const members is not
                   8419:                   mentioned in the ARM or draft ANSI standard explicitly,
                   8420:                   and it appears to be in common practice.  However,
                   8421:                   reading the draft section 9.2.2, it does say that a
                   8422:                   member declarator can't have an initializer--it does
                   8423:                   not except constant members, which also qualify as
                   8424:                   member-declarators.  */
1.1.1.5 ! root     8425:                else if (!pedantic && (!constp || flag_ansi))
        !          8426:                  warning ("ANSI C++ forbids initialization of %s `%s'",
        !          8427:                           constp ? "const member" : "member",
        !          8428:                           IDENTIFIER_POINTER (declarator));
1.1.1.4   root     8429:              }
                   8430: 
1.1       root     8431:            if (staticp || (constp && initialized))
                   8432:              {
                   8433:                /* C++ allows static class members.
                   8434:                   All other work for this is done by grokfield.
                   8435:                   This VAR_DECL is built by build_lang_field_decl.
                   8436:                   All other VAR_DECLs are built by build_decl.  */
                   8437:                decl = build_lang_field_decl (VAR_DECL, declarator, type);
                   8438:                if (staticp || TREE_CODE (type) == ARRAY_TYPE)
                   8439:                  TREE_STATIC (decl) = 1;
                   8440:                /* In class context, static means public visibility.  */
                   8441:                TREE_PUBLIC (decl) = 1;
1.1.1.4   root     8442:                DECL_EXTERNAL (decl) = !initialized;
1.1       root     8443:              }
                   8444:            else
                   8445:              decl = build_lang_field_decl (FIELD_DECL, declarator, type);
                   8446:          }
                   8447:       }
                   8448:     else if (TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE)
                   8449:       {
                   8450:        int was_overloaded = 0;
                   8451:        tree original_name = declarator;
1.1.1.5 ! root     8452:        int publicp = 0;
1.1       root     8453: 
                   8454:        if (! declarator) return NULL_TREE;
                   8455: 
1.1.1.5 ! root     8456:        if (specbits & (RIDBIT (RID_AUTO) | RIDBIT (RID_REGISTER)))
1.1       root     8457:          error ("invalid storage class for function `%s'", name);
                   8458:        /* Function declaration not at top level.
                   8459:           Storage classes other than `extern' are not allowed
                   8460:           and `extern' makes no difference.  */
                   8461:        if (current_binding_level != global_binding_level
1.1.1.5 ! root     8462:            && (specbits & (RIDBIT (RID_STATIC) | RIDBIT (RID_INLINE)))
1.1       root     8463:            && pedantic)
1.1.1.3   root     8464:          pedwarn ("invalid storage class for function `%s'", name);
1.1       root     8465: 
                   8466:        if (ctype == NULL_TREE)
                   8467:          {
                   8468:            if (virtualp)
                   8469:              {
                   8470:                error ("virtual non-class function `%s'", name);
                   8471:                virtualp = 0;
                   8472:              }
1.1.1.5 ! root     8473: 
        !          8474:            /* ARM $13.4.3 */
        !          8475:            /* XXX: It's likely others should also be forbidden.  (bpk) */
        !          8476:            if (declarator == ansi_opname[(int) MODIFY_EXPR])
        !          8477:              warning ("operator `=' must be a member function");
        !          8478: 
1.1       root     8479:            if (current_lang_name == lang_name_cplusplus
                   8480:                && ! (IDENTIFIER_LENGTH (original_name) == 4
                   8481:                      && IDENTIFIER_POINTER (original_name)[0] == 'm'
                   8482:                      && strcmp (IDENTIFIER_POINTER (original_name), "main") == 0)
                   8483:                && ! (IDENTIFIER_LENGTH (original_name) > 10
                   8484:                      && IDENTIFIER_POINTER (original_name)[0] == '_'
                   8485:                      && IDENTIFIER_POINTER (original_name)[1] == '_'
                   8486:                      && strncmp (IDENTIFIER_POINTER (original_name)+2, "builtin_", 8) == 0))
                   8487:              {
                   8488:                /* Plain overloading: will not be grok'd by grokclassfn.  */
1.1.1.2   root     8489:                declarator = build_decl_overload (dname, TYPE_ARG_TYPES (type), 0);
1.1       root     8490:                was_overloaded = 1;
                   8491:              }
                   8492:          }
                   8493:        else if (TREE_CODE (type) == FUNCTION_TYPE && staticp < 2)
1.1.1.2   root     8494:          type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep),
                   8495:                                          TREE_TYPE (type), TYPE_ARG_TYPES (type));
1.1.1.5 ! root     8496: 
        !          8497:        /* Record presence of `static'.  In C++, `inline' is like `static'.
        !          8498:           Methods of classes should be public, unless we're dropping them
        !          8499:           into some other file, so we don't clear TREE_PUBLIC for them.  */
        !          8500:        publicp
        !          8501:          = ((ctype
        !          8502:              && ! CLASSTYPE_INTERFACE_UNKNOWN (ctype)
        !          8503:              && ! CLASSTYPE_INTERFACE_ONLY (ctype))
        !          8504:            || !(specbits & (RIDBIT (RID_STATIC)
        !          8505:                             | RIDBIT (RID_INLINE))));
        !          8506: 
        !          8507:        decl = grokfndecl (ctype, type, original_name,
        !          8508:                           virtualp, flags, quals,
1.1       root     8509:                           raises,
1.1.1.5 ! root     8510:                           processing_template_decl ? 0 : friendp ? 2 : 1,
        !          8511:                           publicp);
        !          8512: 
1.1       root     8513:        if (ctype == NULL_TREE)
                   8514:          DECL_ASSEMBLER_NAME (decl) = declarator;
1.1.1.5 ! root     8515: 
1.1.1.4   root     8516:        if (staticp == 1)
1.1       root     8517:          {
1.1.1.4   root     8518:            int illegal_static = 0;
                   8519: 
1.1.1.5 ! root     8520:            /* Don't allow a static member function in a class, and forbid
        !          8521:               declaring main to be static.  */
1.1.1.4   root     8522:            if (TREE_CODE (type) == METHOD_TYPE)
                   8523:              {
                   8524:                error_with_decl (decl,
                   8525:                                 "cannot declare member function `%s' to have static linkage");
                   8526:                illegal_static = 1;
                   8527:              }
                   8528:            else if (! was_overloaded
                   8529:                     && ! ctype
1.1.1.5 ! root     8530:                     && IDENTIFIER_LENGTH (original_name) == 4
        !          8531:                     && IDENTIFIER_POINTER (original_name)[0] == 'm'
1.1.1.4   root     8532:                     && ! strcmp (IDENTIFIER_POINTER (original_name), "main"))
                   8533:              {
                   8534:                error ("cannot declare function `main' to have static linkage");
                   8535:                illegal_static = 1;
                   8536:              }
                   8537: 
                   8538:            if (illegal_static)
                   8539:              {
                   8540:                staticp = 0;
1.1.1.5 ! root     8541:                specbits &= ~ RIDBIT (RID_STATIC);
1.1.1.4   root     8542:              }
1.1       root     8543:          }
                   8544: 
                   8545:        /* Record presence of `inline', if it is reasonable.  */
                   8546:        if (inlinep)
                   8547:          {
                   8548:            tree last = tree_last (TYPE_ARG_TYPES (type));
                   8549: 
                   8550:            if (! was_overloaded
                   8551:                && ! ctype
                   8552:                && ! strcmp (IDENTIFIER_POINTER (original_name), "main"))
                   8553:              warning ("cannot inline function `main'");
                   8554:            else if (last && last != void_list_node)
                   8555:              warning ("inline declaration ignored for function with `...'");
                   8556:            else
                   8557:              /* Assume that otherwise the function can be inlined.  */
1.1.1.4   root     8558:              DECL_INLINE (decl) = 1;
1.1       root     8559: 
1.1.1.5 ! root     8560:            if (specbits & RIDBIT (RID_EXTERN))
1.1.1.4   root     8561:              {
                   8562:                current_extern_inline = 1;
                   8563:                if (pedantic)
                   8564:                  error ("ANSI C++ does not permit `extern inline'");
                   8565:                else if (flag_ansi)
                   8566:                  warning ("ANSI C++ does not permit `extern inline'");
                   8567:              }
1.1       root     8568:          }
                   8569:        if (was_overloaded)
                   8570:          DECL_OVERLOADED (decl) = 1;
                   8571:       }
                   8572:     else
                   8573:       {
                   8574:        /* It's a variable.  */
                   8575: 
1.1.1.5 ! root     8576:        bad_specifiers ("variable", virtualp, quals != NULL_TREE,
        !          8577:                        friendp, raises != NULL_TREE);
1.1       root     8578:        if (inlinep)
                   8579:          warning ("variable declared `inline'");
                   8580: 
                   8581:        /* An uninitialized decl with `extern' is a reference.  */
1.1.1.5 ! root     8582:        decl = grokvardecl (type, declarator, specbits, initialized);
1.1.1.4   root     8583:        if (ctype)
1.1       root     8584:          {
1.1.1.4   root     8585:            if (staticp == 1)
                   8586:              {
                   8587:                error ("cannot declare member `%s' to have static linkage",
                   8588:                       lang_printable_name (decl));
                   8589:                staticp = 0;
1.1.1.5 ! root     8590:                specbits &= ~ RIDBIT (RID_STATIC);
1.1.1.4   root     8591:              }
1.1.1.5 ! root     8592:            if (specbits & RIDBIT (RID_EXTERN))
1.1.1.4   root     8593:              {
                   8594:                error ("cannot explicitly declare member `%s' to have extern linkage",
                   8595:                       lang_printable_name (decl));
1.1.1.5 ! root     8596:                specbits &= ~ RIDBIT (RID_EXTERN);
1.1.1.4   root     8597:              }
1.1       root     8598:          }
                   8599:       }
                   8600: 
                   8601:     /* Record `register' declaration for warnings on &
                   8602:        and in case doing stupid register allocation.  */
                   8603: 
1.1.1.5 ! root     8604:     if (specbits & RIDBIT (RID_REGISTER))
1.1.1.4   root     8605:       DECL_REGISTER (decl) = 1;
1.1       root     8606: 
                   8607:     /* Record constancy and volatility.  */
                   8608: 
                   8609:     if (constp)
                   8610:       TREE_READONLY (decl) = TREE_CODE (type) != REFERENCE_TYPE;
                   8611:     if (volatilep)
                   8612:       {
                   8613:        TREE_SIDE_EFFECTS (decl) = 1;
                   8614:        TREE_THIS_VOLATILE (decl) = 1;
                   8615:       }
                   8616: 
                   8617:     return decl;
                   8618:   }
                   8619: }
                   8620: 
                   8621: /* Tell if a parmlist/exprlist looks like an exprlist or a parmlist.
                   8622:    An empty exprlist is a parmlist.  An exprlist which
                   8623:    contains only identifiers at the global level
                   8624:    is a parmlist.  Otherwise, it is an exprlist.  */
                   8625: int
                   8626: parmlist_is_exprlist (exprs)
                   8627:      tree exprs;
                   8628: {
                   8629:   if (exprs == NULL_TREE || TREE_PARMLIST (exprs))
                   8630:     return 0;
                   8631: 
                   8632:   if (current_binding_level == global_binding_level)
                   8633:     {
                   8634:       /* At the global level, if these are all identifiers,
                   8635:         then it is a parmlist.  */
                   8636:       while (exprs)
                   8637:        {
                   8638:          if (TREE_CODE (TREE_VALUE (exprs)) != IDENTIFIER_NODE)
                   8639:            return 1;
                   8640:          exprs = TREE_CHAIN (exprs);
                   8641:        }
                   8642:       return 0;
                   8643:     }
                   8644:   return 1;
                   8645: }
                   8646: 
                   8647: /* Make sure that the this list of PARMS has a chance of being
                   8648:    grokked by `grokparms'.
                   8649: 
                   8650:    @@ This is really weak, but the grammar does not allow us
                   8651:    @@ to easily reject things that this has to catch as syntax errors.  */
                   8652: static int
                   8653: parmlist_is_random (parms)
                   8654:      tree parms;
                   8655: {
                   8656:   if (parms == NULL_TREE)
                   8657:     return 0;
                   8658: 
                   8659:   if (TREE_CODE (parms) != TREE_LIST)
                   8660:     return 1;
                   8661: 
                   8662:   while (parms)
                   8663:     {
                   8664:       if (parms == void_list_node)
                   8665:        return 0;
                   8666: 
                   8667:       if (TREE_CODE (TREE_VALUE (parms)) != TREE_LIST)
                   8668:        return 1;
                   8669:       /* Don't get faked out by overloaded functions, which
                   8670:         masquerade as TREE_LISTs!  */
                   8671:       if (TREE_TYPE (TREE_VALUE (parms)) == unknown_type_node)
                   8672:        return 1;
                   8673:       parms = TREE_CHAIN (parms);
                   8674:     }
                   8675:   return 0;
                   8676: }
                   8677: 
                   8678: /* Subroutine of `grokparms'.  In a fcn definition, arg types must
                   8679:    be complete.
                   8680: 
                   8681:    C++: also subroutine of `start_function'.  */
                   8682: static void
                   8683: require_complete_types_for_parms (parms)
                   8684:      tree parms;
                   8685: {
                   8686:   while (parms)
                   8687:     {
                   8688:       tree type = TREE_TYPE (parms);
1.1.1.5 ! root     8689:       if (TYPE_SIZE (type) == NULL_TREE)
1.1       root     8690:        {
                   8691:          if (DECL_NAME (parms))
                   8692:            error ("parameter `%s' has incomplete type",
                   8693:                   IDENTIFIER_POINTER (DECL_NAME (parms)));
                   8694:          else
                   8695:            error ("parameter has incomplete type");
                   8696:          TREE_TYPE (parms) = error_mark_node;
                   8697:        }
                   8698: #if 0
                   8699:       /* If the arg types are incomplete in a declaration,
                   8700:         they must include undefined tags.
                   8701:         These tags can never be defined in the scope of the declaration,
                   8702:         so the types can never be completed,
                   8703:         and no call can be compiled successfully.  */
                   8704:       /* This is not the right behavior for C++, but not having
                   8705:         it is also probably wrong.  */
                   8706:       else
                   8707:        {
                   8708:          /* Now warn if is a pointer to an incomplete type.  */
                   8709:          while (TREE_CODE (type) == POINTER_TYPE
                   8710:                 || TREE_CODE (type) == REFERENCE_TYPE)
                   8711:            type = TREE_TYPE (type);
                   8712:          type = TYPE_MAIN_VARIANT (type);
1.1.1.5 ! root     8713:          if (TYPE_SIZE (type) == NULL_TREE)
1.1       root     8714:            {
1.1.1.5 ! root     8715:              if (DECL_NAME (parm) != NULL_TREE)
1.1       root     8716:                warning ("parameter `%s' points to incomplete type",
                   8717:                         IDENTIFIER_POINTER (DECL_NAME (parm)));
                   8718:              else
                   8719:                warning ("parameter points to incomplete type");
                   8720:            }
                   8721:        }
                   8722: #endif
                   8723:       parms = TREE_CHAIN (parms);
                   8724:     }
                   8725: }
                   8726: 
                   8727: /* Decode the list of parameter types for a function type.
                   8728:    Given the list of things declared inside the parens,
                   8729:    return a list of types.
                   8730: 
                   8731:    The list we receive can have three kinds of elements:
                   8732:    an IDENTIFIER_NODE for names given without types,
                   8733:    a TREE_LIST node for arguments given as typespecs or names with typespecs,
                   8734:    or void_type_node, to mark the end of an argument list
                   8735:    when additional arguments are not permitted (... was not used).
                   8736: 
                   8737:    FUNCDEF_FLAG is nonzero for a function definition, 0 for
                   8738:    a mere declaration.  A nonempty identifier-list gets an error message
                   8739:    when FUNCDEF_FLAG is zero.
                   8740:    If FUNCDEF_FLAG is 1, then parameter types must be complete.
                   8741:    If FUNCDEF_FLAG is -1, then parameter types may be incomplete.
                   8742: 
                   8743:    If all elements of the input list contain types,
                   8744:    we return a list of the types.
                   8745:    If all elements contain no type (except perhaps a void_type_node
                   8746:    at the end), we return a null list.
                   8747:    If some have types and some do not, it is an error, and we
                   8748:    return a null list.
                   8749: 
                   8750:    Also set last_function_parms to either
                   8751:    a list of names (IDENTIFIER_NODEs) or a chain of PARM_DECLs.
                   8752:    A list of names is converted to a chain of PARM_DECLs
                   8753:    by store_parm_decls so that ultimately it is always a chain of decls.
                   8754: 
1.1.1.2   root     8755:    Note that in C++, parameters can take default values.  These default
1.1       root     8756:    values are in the TREE_PURPOSE field of the TREE_LIST.  It is
                   8757:    an error to specify default values which are followed by parameters
                   8758:    that have no default values, or an ELLIPSES.  For simplicities sake,
                   8759:    only parameters which are specified with their types can take on
                   8760:    default values.  */
                   8761: 
                   8762: static tree
                   8763: grokparms (first_parm, funcdef_flag)
                   8764:      tree first_parm;
                   8765:      int funcdef_flag;
                   8766: {
                   8767:   tree result = NULL_TREE;
                   8768:   tree decls = NULL_TREE;
                   8769: 
1.1.1.5 ! root     8770:   if (first_parm != NULL_TREE
1.1       root     8771:       && TREE_CODE (TREE_VALUE (first_parm)) == IDENTIFIER_NODE)
                   8772:     {
                   8773:       if (! funcdef_flag)
                   8774:        warning ("parameter names (without types) in function declaration");
                   8775:       last_function_parms = first_parm;
1.1.1.5 ! root     8776:       return NULL_TREE;
1.1       root     8777:     }
                   8778:   else
                   8779:     {
                   8780:       /* Types were specified.  This is a list of declarators
                   8781:         each represented as a TREE_LIST node.  */
                   8782:       register tree parm, chain;
                   8783:       int any_init = 0, any_error = 0, saw_void = 0;
                   8784: 
                   8785:       if (first_parm != NULL_TREE)
                   8786:        {
                   8787:          tree last_result = NULL_TREE;
                   8788:          tree last_decl = NULL_TREE;
                   8789: 
                   8790:          for (parm = first_parm; parm != NULL_TREE; parm = chain)
                   8791:            {
                   8792:              tree type, list_node = parm;
                   8793:              register tree decl = TREE_VALUE (parm);
                   8794:              tree init = TREE_PURPOSE (parm);
                   8795: 
                   8796:              chain = TREE_CHAIN (parm);
                   8797:              /* @@ weak defense against parse errors.  */
                   8798:              if (decl != void_type_node && TREE_CODE (decl) != TREE_LIST)
                   8799:                {
                   8800:                  /* Give various messages as the need arises.  */
                   8801:                  if (TREE_CODE (decl) == STRING_CST)
                   8802:                    error ("invalid string constant `%s'",
                   8803:                           TREE_STRING_POINTER (decl));
                   8804:                  else if (TREE_CODE (decl) == INTEGER_CST)
                   8805:                    error ("invalid integer constant in parameter list, did you forget to give parameter name?");
                   8806:                  continue;
                   8807:                }
                   8808: 
                   8809:              if (decl != void_type_node)
                   8810:                {
                   8811:                  /* @@ May need to fetch out a `raises' here.  */
                   8812:                  decl = grokdeclarator (TREE_VALUE (decl),
                   8813:                                         TREE_PURPOSE (decl),
1.1.1.4   root     8814:                                         PARM, init != NULL_TREE, NULL_TREE);
                   8815:                  if (! decl)
                   8816:                    continue;
1.1       root     8817:                  type = TREE_TYPE (decl);
1.1.1.4   root     8818:                  if (TYPE_MAIN_VARIANT (type) == void_type_node)
1.1       root     8819:                    decl = void_type_node;
                   8820:                  else if (TREE_CODE (type) == METHOD_TYPE)
                   8821:                    {
                   8822:                      if (DECL_NAME (decl))
                   8823:                        /* Cannot use `error_with_decl' here because
                   8824:                           we don't have DECL_CONTEXT set up yet.  */
                   8825:                        error ("parameter `%s' invalidly declared method type",
                   8826:                               IDENTIFIER_POINTER (DECL_NAME (decl)));
                   8827:                      else
                   8828:                        error ("parameter invalidly declared method type");
                   8829:                      type = build_pointer_type (type);
                   8830:                      TREE_TYPE (decl) = type;
                   8831:                    }
                   8832:                  else if (TREE_CODE (type) == OFFSET_TYPE)
                   8833:                    {
                   8834:                      if (DECL_NAME (decl))
                   8835:                        error ("parameter `%s' invalidly declared offset type",
                   8836:                               IDENTIFIER_POINTER (DECL_NAME (decl)));
                   8837:                      else
                   8838:                        error ("parameter invalidly declared offset type");
                   8839:                      type = build_pointer_type (type);
                   8840:                      TREE_TYPE (decl) = type;
                   8841:                    }
                   8842:                   else if (TREE_CODE (type) == RECORD_TYPE
                   8843:                            && TYPE_LANG_SPECIFIC (type)
                   8844:                            && CLASSTYPE_ABSTRACT_VIRTUALS (type))
                   8845:                     {
                   8846:                       abstract_virtuals_error (decl, type);
                   8847:                       any_error = 1;  /* seems like a good idea */
                   8848:                     }
                   8849:                }
                   8850: 
                   8851:              if (decl == void_type_node)
                   8852:                {
                   8853:                  if (result == NULL_TREE)
                   8854:                    {
                   8855:                      result = void_list_node;
                   8856:                      last_result = result;
                   8857:                    }
                   8858:                  else
                   8859:                    {
                   8860:                      TREE_CHAIN (last_result) = void_list_node;
                   8861:                      last_result = void_list_node;
                   8862:                    }
                   8863:                  saw_void = 1;
                   8864:                  if (chain
                   8865:                      && (chain != void_list_node || TREE_CHAIN (chain)))
                   8866:                    error ("`void' in parameter list must be entire list");
                   8867:                  break;
                   8868:                }
                   8869: 
                   8870:              /* Since there is a prototype, args are passed in their own types.  */
                   8871:              DECL_ARG_TYPE (decl) = TREE_TYPE (decl);
                   8872: #ifdef PROMOTE_PROTOTYPES
1.1.1.4   root     8873:              if (C_PROMOTING_INTEGER_TYPE_P (type))
1.1       root     8874:                DECL_ARG_TYPE (decl) = integer_type_node;
                   8875: #endif
                   8876:              if (!any_error)
                   8877:                {
                   8878:                  if (init)
                   8879:                    {
                   8880:                      any_init++;
                   8881:                      if (TREE_CODE (init) == SAVE_EXPR)
                   8882:                        PARM_DECL_EXPR (init) = 1;
1.1.1.4   root     8883:                      else if (TREE_CODE (init) == VAR_DECL)
                   8884:                        {
                   8885:                          if (IDENTIFIER_LOCAL_VALUE (DECL_NAME (init)))
                   8886:                            {
                   8887:                              /* ``Local variables may not be used in default
                   8888:                                 argument expressions.'' dpANSI C++ 8.2.6 */
                   8889:                              /* If extern int i; within a function is not
                   8890:                                 considered a local variable, then this code is
                   8891:                                 wrong. */
                   8892:                              error_with_decl (init, "local variable `%s' may not be used as a default argument");
                   8893:                              any_error = 1;
                   8894:                            }
                   8895:                          else if (TREE_READONLY_DECL_P (init))
                   8896:                            init = decl_constant_value (init);
                   8897:                        }
1.1       root     8898:                      else
                   8899:                        init = require_instantiated_type (type, init, integer_zero_node);
                   8900:                    }
                   8901:                  else if (any_init)
                   8902:                    {
                   8903:                      error ("all trailing parameters must have default arguments");
                   8904:                      any_error = 1;
                   8905:                    }
                   8906:                }
                   8907:              else
                   8908:                init = NULL_TREE;
                   8909: 
                   8910:              if (decls == NULL_TREE)
                   8911:                {
                   8912:                  decls = decl;
                   8913:                  last_decl = decls;
                   8914:                }
                   8915:              else
                   8916:                {
                   8917:                  TREE_CHAIN (last_decl) = decl;
                   8918:                  last_decl = decl;
                   8919:                }
                   8920:              if (TREE_PERMANENT (list_node))
                   8921:                {
                   8922:                  TREE_PURPOSE (list_node) = init;
                   8923:                  TREE_VALUE (list_node) = type;
1.1.1.5 ! root     8924:                  TREE_CHAIN (list_node) = NULL_TREE;
1.1       root     8925:                }
                   8926:              else
                   8927:                list_node = saveable_tree_cons (init, type, NULL_TREE);
                   8928:              if (result == NULL_TREE)
                   8929:                {
                   8930:                  result = list_node;
                   8931:                  last_result = result;
                   8932:                }
                   8933:              else
                   8934:                {
                   8935:                  TREE_CHAIN (last_result) = list_node;
                   8936:                  last_result = list_node;
                   8937:                }
                   8938:            }
                   8939:          if (last_result)
                   8940:            TREE_CHAIN (last_result) = NULL_TREE;
                   8941:          /* If there are no parameters, and the function does not end
                   8942:             with `...', then last_decl will be NULL_TREE.  */
                   8943:          if (last_decl != NULL_TREE)
                   8944:            TREE_CHAIN (last_decl) = NULL_TREE;
                   8945:        }
                   8946:     }
                   8947: 
                   8948:   last_function_parms = decls;
                   8949: 
                   8950:   /* In a fcn definition, arg types must be complete.  */
                   8951:   if (funcdef_flag > 0)
                   8952:     require_complete_types_for_parms (last_function_parms);
                   8953: 
                   8954:   return result;
                   8955: }
                   8956: 
                   8957: /* These memoizing functions keep track of special properties which
                   8958:    a class may have.  `grok_ctor_properties' notices whether a class
                   8959:    has a constructor of the for X(X&), and also complains
                   8960:    if the class has a constructor of the form X(X).
                   8961:    `grok_op_properties' takes notice of the various forms of
                   8962:    operator= which are defined, as well as what sorts of type conversion
                   8963:    may apply.  Both functions take a FUNCTION_DECL as an argument.  */
                   8964: void
                   8965: grok_ctor_properties (ctype, decl)
                   8966:      tree ctype, decl;
                   8967: {
                   8968:   tree parmtypes = FUNCTION_ARG_CHAIN (decl);
                   8969:   tree parmtype = parmtypes ? TREE_VALUE (parmtypes) : void_type_node;
                   8970: 
1.1.1.4   root     8971:   if (parmtypes && TREE_CHAIN (parmtypes)
                   8972:       && TREE_CODE (TREE_VALUE (TREE_CHAIN (parmtypes))) == REFERENCE_TYPE
                   8973:       && TYPE_USES_VIRTUAL_BASECLASSES (TREE_TYPE (TREE_VALUE (TREE_CHAIN (parmtypes)))))
                   8974:     {
                   8975:       parmtypes = TREE_CHAIN (parmtypes);
                   8976:       parmtype = TREE_VALUE (parmtypes);
                   8977:     }
                   8978: 
1.1       root     8979:   if (TREE_CODE (parmtype) == REFERENCE_TYPE
                   8980:       && TYPE_MAIN_VARIANT (TREE_TYPE (parmtype)) == ctype)
                   8981:     {
                   8982:       if (TREE_CHAIN (parmtypes) == NULL_TREE
                   8983:          || TREE_CHAIN (parmtypes) == void_list_node
                   8984:          || TREE_PURPOSE (TREE_CHAIN (parmtypes)))
                   8985:        {
                   8986:          TYPE_HAS_INIT_REF (ctype) = 1;
                   8987:          TYPE_GETS_INIT_REF (ctype) = 1;
                   8988:          if (TYPE_READONLY (TREE_TYPE (parmtype)))
                   8989:            TYPE_GETS_CONST_INIT_REF (ctype) = 1;
                   8990:        }
                   8991:       else
                   8992:        TYPE_GETS_INIT_AGGR (ctype) = 1;
                   8993:     }
                   8994:   else if (TYPE_MAIN_VARIANT (parmtype) == ctype)
                   8995:     {
                   8996:       if (TREE_CHAIN (parmtypes) != NULL_TREE
                   8997:          && TREE_CHAIN (parmtypes) == void_list_node)
                   8998:        error ("invalid constructor; you probably meant `%s (%s&)'",
                   8999:               TYPE_NAME_STRING (ctype),
                   9000:               TYPE_NAME_STRING (ctype));
                   9001:       SET_IDENTIFIER_ERROR_LOCUS (DECL_NAME (decl), ctype);
                   9002:       TYPE_GETS_INIT_AGGR (ctype) = 1;
                   9003:     }
                   9004:   else if (TREE_CODE (parmtype) == VOID_TYPE
                   9005:           || TREE_PURPOSE (parmtypes) != NULL_TREE)
                   9006:     TYPE_HAS_DEFAULT_CONSTRUCTOR (ctype) = 1;
                   9007: }
                   9008: 
1.1.1.5 ! root     9009: /* Do a little sanity-checking on how they declared their operator.  */
1.1       root     9010: static void
1.1.1.4   root     9011: grok_op_properties (decl, virtualp)
1.1       root     9012:      tree decl;
1.1.1.4   root     9013:      int virtualp;
1.1       root     9014: {
                   9015:   tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
                   9016: 
                   9017:   if (DECL_STATIC_FUNCTION_P (decl))
                   9018:     {
1.1.1.2   root     9019:       if (DECL_NAME (decl) == ansi_opname[(int) NEW_EXPR])
1.1       root     9020:        {
1.1.1.4   root     9021:          if (virtualp)
                   9022:            error ("`operator new' cannot be declared virtual");
                   9023: 
1.1       root     9024:          /* Take care of function decl if we had syntax errors.  */
                   9025:          if (argtypes == NULL_TREE)
1.1.1.4   root     9026:            TREE_TYPE (decl) =
                   9027:              build_function_type (ptr_type_node,
                   9028:                                   hash_tree_chain (integer_type_node,
                   9029:                                                    void_list_node));
                   9030:          else
1.1.1.5 ! root     9031:            decl = coerce_new_type (TREE_TYPE (decl));
1.1       root     9032:        }
1.1.1.2   root     9033:       else if (DECL_NAME (decl) == ansi_opname[(int) DELETE_EXPR])
1.1       root     9034:        {
1.1.1.4   root     9035:          if (virtualp)
                   9036:            error ("`operator delete' cannot be declared virtual");
                   9037: 
1.1       root     9038:          if (argtypes == NULL_TREE)
1.1.1.4   root     9039:            TREE_TYPE (decl) =
                   9040:              build_function_type (void_type_node,
                   9041:                                   hash_tree_chain (ptr_type_node,
                   9042:                                                    void_list_node));
                   9043:          else
1.1.1.5 ! root     9044:            decl = coerce_delete_type (TREE_TYPE (decl));
1.1       root     9045:        }
                   9046:       else
                   9047:        error_with_decl (decl, "`%s' cannot be a static member function");
                   9048:     }
1.1.1.2   root     9049:   else if (DECL_NAME (decl) == ansi_opname[(int) MODIFY_EXPR])
1.1       root     9050:     {
1.1.1.4   root     9051:       tree parmtypes;
                   9052:       tree parmtype;
                   9053: 
                   9054:       if (argtypes == NULL_TREE)
                   9055:        {
                   9056:          error_with_decl (decl, "too few arguments to `%s'");
                   9057:          return;
                   9058:        }
                   9059:       parmtypes = TREE_CHAIN (argtypes);
                   9060:       parmtype = parmtypes ? TREE_VALUE (parmtypes) : void_type_node;
1.1       root     9061: 
                   9062:       if (TREE_CODE (parmtype) == REFERENCE_TYPE
                   9063:          && TREE_TYPE (parmtype) == current_class_type)
                   9064:        {
                   9065:          TYPE_HAS_ASSIGN_REF (current_class_type) = 1;
                   9066:          TYPE_GETS_ASSIGN_REF (current_class_type) = 1;
                   9067:          if (TYPE_READONLY (TREE_TYPE (parmtype)))
                   9068:            TYPE_GETS_CONST_INIT_REF (current_class_type) = 1;
                   9069:        }
                   9070:     }
                   9071: }
                   9072: 
                   9073: /* Get the struct, enum or union (CODE says which) with tag NAME.
                   9074:    Define the tag as a forward-reference if it is not defined.
                   9075: 
                   9076:    C++: If a class derivation is given, process it here, and report
                   9077:    an error if multiple derivation declarations are not identical.
                   9078: 
                   9079:    If this is a definition, come in through xref_tag and only look in
                   9080:    the current frame for the name (since C++ allows new names in any
1.1.1.5 ! root     9081:    scope.)  */
1.1       root     9082: 
                   9083: /* avoid rewriting all callers of xref_tag */
                   9084: static int xref_next_defn = 0;
                   9085: 
                   9086: tree
                   9087: xref_defn_tag (code_type_node, name, binfo)
                   9088:      tree code_type_node;
                   9089:      tree name, binfo;
                   9090: {
                   9091:   tree rv, ncp;
                   9092:   xref_next_defn = 1;
                   9093: 
                   9094:   if (class_binding_level)
                   9095:     {
                   9096:       tree n1;
                   9097:       char *buf;
                   9098:       /* we need to build a new IDENTIFIER_NODE for name which nukes
                   9099:        * the pieces... */
                   9100:       n1 = IDENTIFIER_LOCAL_VALUE (current_class_name);
                   9101:       if (n1)
                   9102:        n1 = DECL_NAME (n1);
                   9103:       else
                   9104:        n1 = current_class_name;
                   9105:       
                   9106:       buf = (char *) alloca (4 + IDENTIFIER_LENGTH (n1)
                   9107:                             + IDENTIFIER_LENGTH (name));
                   9108:       
                   9109:       sprintf (buf, "%s::%s", IDENTIFIER_POINTER (n1),
                   9110:               IDENTIFIER_POINTER (name));
                   9111:       ncp = get_identifier (buf);
                   9112: #ifdef SPEW_DEBUG
1.1.1.4   root     9113:       if (spew_debug)
                   9114:        printf("*** %s ***\n", IDENTIFIER_POINTER (ncp));
1.1       root     9115: #endif
                   9116: #if 0
                   9117:       IDENTIFIER_LOCAL_VALUE (name) =
                   9118:        build_lang_decl (TYPE_DECL, ncp, NULL_TREE);
                   9119: #endif
                   9120:       rv = xref_tag (code_type_node, name, binfo);
                   9121:       pushdecl_top_level (build_lang_decl (TYPE_DECL, ncp, rv));
                   9122:     }
                   9123:   else
                   9124:     {
                   9125:       rv = xref_tag (code_type_node, name, binfo);
                   9126:     }
                   9127:   xref_next_defn = 0;
                   9128:   return rv;
                   9129: }
                   9130: 
                   9131: tree
                   9132: xref_tag (code_type_node, name, binfo)
                   9133:      tree code_type_node;
                   9134:      tree name, binfo;
                   9135: {
                   9136:   enum tag_types tag_code;
                   9137:   enum tree_code code;
                   9138:   int temp = 0;
                   9139:   int i, len;
                   9140:   register tree ref;
                   9141:   struct binding_level *b
                   9142:     = (class_binding_level ? class_binding_level : current_binding_level);
                   9143: 
                   9144:   tag_code = (enum tag_types) TREE_INT_CST_LOW (code_type_node);
                   9145:   switch (tag_code)
                   9146:     {
                   9147:     case record_type:
                   9148:     case class_type:
                   9149:     case exception_type:
                   9150:       code = RECORD_TYPE;
                   9151:       len = list_length (binfo);
                   9152:       break;
                   9153:     case union_type:
                   9154:       code = UNION_TYPE;
                   9155:       if (binfo)
                   9156:        {
                   9157:          error ("derived union `%s' invalid", IDENTIFIER_POINTER (name));
                   9158:          binfo = NULL_TREE;
                   9159:        }
                   9160:       len = 0;
                   9161:       break;
                   9162:     case enum_type:
                   9163:       code = ENUMERAL_TYPE;
                   9164:       break;
                   9165:     default:
1.1.1.3   root     9166:       my_friendly_abort (18);
1.1       root     9167:     }
                   9168: 
                   9169:   /* If a cross reference is requested, look up the type
                   9170:      already defined for this tag and return it.  */
                   9171:   if (xref_next_defn)
                   9172:     {
                   9173:       /* If we know we are defining this tag, only look it up in this scope
                   9174:        * and don't try to find it as a type. */
                   9175:       xref_next_defn = 0;
                   9176:       ref = lookup_tag (code, name, b, 1);
                   9177:     }
                   9178:   else
                   9179:     {
                   9180:       ref = lookup_tag (code, name, b, 0);
                   9181: 
                   9182:       if (! ref)
                   9183:        {
                   9184:          /* Try finding it as a type declaration.  If that wins, use it.  */
                   9185:          ref = lookup_name (name, 1);
                   9186:          if (ref && TREE_CODE (ref) == TYPE_DECL
                   9187:              && TREE_CODE (TREE_TYPE (ref)) == code)
                   9188:            ref = TREE_TYPE (ref);
                   9189:          else
                   9190:            ref = NULL_TREE;
                   9191:        }
                   9192:     }
                   9193: 
                   9194:   push_obstacks_nochange ();
                   9195: 
                   9196:   if (! ref)
                   9197:     {
                   9198:       /* If no such tag is yet defined, create a forward-reference node
                   9199:         and record it as the "definition".
                   9200:         When a real declaration of this type is found,
                   9201:         the forward-reference will be altered into a real type.  */
                   9202: 
                   9203:       /* In C++, since these migrate into the global scope, we must
                   9204:         build them on the permanent obstack.  */
                   9205: 
                   9206:       temp = allocation_temporary_p ();
                   9207:       if (temp)
                   9208:        end_temporary_allocation ();
                   9209: 
                   9210:       if (code == ENUMERAL_TYPE)
                   9211:        {
                   9212:          ref = make_node (ENUMERAL_TYPE);
                   9213: 
                   9214:          /* Give the type a default layout like unsigned int
                   9215:             to avoid crashing if it does not get defined.  */
1.1.1.4   root     9216:          TYPE_MODE (ref) = TYPE_MODE (unsigned_type_node);
1.1       root     9217:          TYPE_ALIGN (ref) = TYPE_ALIGN (unsigned_type_node);
                   9218:          TREE_UNSIGNED (ref) = 1;
                   9219:          TYPE_PRECISION (ref) = TYPE_PRECISION (unsigned_type_node);
                   9220:          TYPE_MIN_VALUE (ref) = TYPE_MIN_VALUE (unsigned_type_node);
                   9221:          TYPE_MAX_VALUE (ref) = TYPE_MAX_VALUE (unsigned_type_node);
                   9222: 
                   9223:          /* Enable us to recognize when a type is created in class context.
                   9224:             To do nested classes correctly, this should probably be cleared
                   9225:             out when we leave this classes scope.  Currently this in only
                   9226:             done in `start_enum'.  */
                   9227: 
                   9228:          pushtag (name, ref);
                   9229:          if (flag_cadillac)
                   9230:            cadillac_start_enum (ref);
                   9231:        }
                   9232:       else if (tag_code == exception_type)
                   9233:        {
                   9234:          ref = make_lang_type (code);
                   9235:          /* Enable us to recognize when an exception type is created in
                   9236:             class context.  To do nested classes correctly, this should
                   9237:             probably be cleared out when we leave this class's scope.  */
                   9238:          CLASSTYPE_DECLARED_EXCEPTION (ref) = 1;
                   9239:          pushtag (name, ref);
                   9240:          if (flag_cadillac)
                   9241:            cadillac_start_struct (ref);
                   9242:        }
                   9243:       else
                   9244:        {
                   9245:          extern tree pending_vtables;
                   9246:          struct binding_level *old_b = class_binding_level;
                   9247:          int needs_writing;
                   9248: 
                   9249:          ref = make_lang_type (code);
                   9250: 
                   9251:          /* Record how to set the visibility of this class's
                   9252:             virtual functions.  If write_virtuals == 2 or 3, then
                   9253:             inline virtuals are ``extern inline''.  */
                   9254:          switch (write_virtuals)
                   9255:            {
                   9256:            case 0:
                   9257:            case 1:
                   9258:              needs_writing = 1;
                   9259:              break;
                   9260:            case 2:
                   9261:              needs_writing = !! value_member (name, pending_vtables);
                   9262:              break;
                   9263:            case 3:
                   9264:              needs_writing
                   9265:                = ! (CLASSTYPE_INTERFACE_ONLY (ref) || CLASSTYPE_INTERFACE_UNKNOWN (ref));
                   9266:              break;
                   9267:            default:
                   9268:              needs_writing = 0;
                   9269:            }
                   9270: 
                   9271:          CLASSTYPE_VTABLE_NEEDS_WRITING (ref) = needs_writing;
                   9272: 
                   9273: #ifdef NONNESTED_CLASSES
                   9274:          /* Class types don't nest the way enums do.  */
1.1.1.5 ! root     9275:          class_binding_level = (struct binding_level *)0;
1.1       root     9276: #endif
                   9277:          pushtag (name, ref);
                   9278:          class_binding_level = old_b;
                   9279: 
                   9280:          if (flag_cadillac)
                   9281:            cadillac_start_struct (ref);
                   9282:        }
                   9283:     }
                   9284:   else
                   9285:     {
                   9286:       if (IS_AGGR_TYPE_CODE (code))
                   9287:        {
                   9288:          if (IS_AGGR_TYPE (ref)
                   9289:              && ((tag_code == exception_type)
                   9290:                  != (CLASSTYPE_DECLARED_EXCEPTION (ref) == 1)))
                   9291:            {
                   9292:              error ("type `%s' is both exception and aggregate type",
                   9293:                     IDENTIFIER_POINTER (name));
                   9294:              CLASSTYPE_DECLARED_EXCEPTION (ref) = (tag_code == exception_type);
                   9295:            }
                   9296:        }
                   9297: 
                   9298:       /* If it no longer looks like a nested type, make sure it's
                   9299:         in global scope.  */
                   9300:       if (b == global_binding_level && !class_binding_level
                   9301:          && IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE)
                   9302:        IDENTIFIER_GLOBAL_VALUE (name) = TYPE_NAME (ref);
                   9303: 
                   9304:       if (binfo)
                   9305:        {
                   9306:          tree tt1 = binfo;
                   9307:          tree tt2 = TYPE_BINFO_BASETYPES (ref);
                   9308: 
                   9309:          if (TYPE_BINFO_BASETYPES (ref))
                   9310:            for (i = 0; tt1; i++, tt1 = TREE_CHAIN (tt1))
                   9311:              if (TREE_VALUE (tt1) != TYPE_IDENTIFIER (BINFO_TYPE (TREE_VEC_ELT (tt2, i))))
                   9312:                {
                   9313:                  error ("redeclaration of derivation chain of type `%s'",
                   9314:                         IDENTIFIER_POINTER (name));
                   9315:                  break;
                   9316:                }
                   9317: 
                   9318:          if (tt1 == NULL_TREE)
                   9319:            /* The user told us something we already knew.  */
                   9320:            goto just_return;
                   9321: 
                   9322:          /* In C++, since these migrate into the global scope, we must
                   9323:             build them on the permanent obstack.  */
                   9324:          end_temporary_allocation ();
                   9325:        }
                   9326:     }
                   9327: 
                   9328:   if (binfo)
                   9329:     {
                   9330:       /* In the declaration `A : X, Y, ... Z' we mark all the types
                   9331:         (A, X, Y, ..., Z) so we can check for duplicates.  */
                   9332:       tree binfos;
                   9333: 
                   9334:       SET_CLASSTYPE_MARKED (ref);
                   9335:       BINFO_BASETYPES (TYPE_BINFO (ref)) = binfos = make_tree_vec (len);
                   9336: 
                   9337:       for (i = 0; binfo; binfo = TREE_CHAIN (binfo))
                   9338:        {
                   9339:          /* The base of a derived struct is public.  */
                   9340:          int via_public = (tag_code != class_type
                   9341:                            || TREE_PURPOSE (binfo) == (tree)visibility_public
                   9342:                            || TREE_PURPOSE (binfo) == (tree)visibility_public_virtual);
1.1.1.4   root     9343:          int via_protected = TREE_PURPOSE (binfo) == (tree)visibility_protected;
1.1       root     9344:          int via_virtual = (TREE_PURPOSE (binfo) == (tree)visibility_private_virtual
                   9345:                             || TREE_PURPOSE (binfo) == (tree)visibility_public_virtual
                   9346:                             || TREE_PURPOSE (binfo) == (tree)visibility_default_virtual);
                   9347:          tree basetype = TREE_TYPE (TREE_VALUE (binfo));
1.1.1.4   root     9348:          tree base_binfo;
1.1       root     9349: 
                   9350:          GNU_xref_hier (IDENTIFIER_POINTER (name),
                   9351:                         IDENTIFIER_POINTER (TREE_VALUE (binfo)),
                   9352:                         via_public, via_virtual, 0);
                   9353: 
                   9354:          if (basetype && TREE_CODE (basetype) == TYPE_DECL)
                   9355:            basetype = TREE_TYPE (basetype);
                   9356:          if (!basetype || TREE_CODE (basetype) != RECORD_TYPE)
                   9357:            {
                   9358:              error ("base type `%s' fails to be a struct or class type",
                   9359:                     IDENTIFIER_POINTER (TREE_VALUE (binfo)));
                   9360:              continue;
                   9361:            }
1.1.1.5 ! root     9362: #if 1
        !          9363:          /* This code replaces similar code in layout_basetypes.  */
        !          9364:          else if (TYPE_SIZE (basetype) == NULL_TREE)
1.1       root     9365:            {
                   9366:              error_with_aggr_type (basetype, "base class `%s' has incomplete type");
                   9367:              continue;
                   9368:            }
                   9369: #endif
                   9370:          else
                   9371:            {
                   9372:              if (CLASSTYPE_MARKED (basetype))
                   9373:                {
                   9374:                  if (basetype == ref)
                   9375:                    error_with_aggr_type (basetype, "recursive type `%s' undefined");
                   9376:                  else
                   9377:                    error_with_aggr_type (basetype, "duplicate base type `%s' invalid");
                   9378:                  continue;
                   9379:                }
                   9380: 
1.1.1.4   root     9381:              /* Note that the BINFO records which describe individual
                   9382:                 inheritances are *not* shared in the lattice!  They
                   9383:                 cannot be shared because a given baseclass may be
1.1.1.5 ! root     9384:                 inherited with different `accessibility' by different
1.1.1.4   root     9385:                 derived classes.  (Each BINFO record describing an
                   9386:                 individual inheritance contains flags which say what
1.1.1.5 ! root     9387:                 the `accessibility' of that particular inheritance is.)  */
1.1.1.4   root     9388:   
                   9389:              base_binfo = make_binfo (integer_zero_node, basetype,
                   9390:                                  TYPE_BINFO_VTABLE (basetype),
                   9391:                                  TYPE_BINFO_VIRTUALS (basetype), 0);
                   9392:  
                   9393:              TREE_VEC_ELT (binfos, i) = base_binfo;
                   9394:              TREE_VIA_PUBLIC (base_binfo) = via_public;
                   9395:              TREE_VIA_PROTECTED (base_binfo) = via_protected;
                   9396:              TREE_VIA_VIRTUAL (base_binfo) = via_virtual;
1.1       root     9397: 
                   9398:              SET_CLASSTYPE_MARKED (basetype);
                   9399: #if 0
                   9400: /* XYZZY TEST VIRTUAL BASECLASSES */
1.1.1.5 ! root     9401: if (CLASSTYPE_N_BASECLASSES (basetype) == NULL_TREE
1.1       root     9402:     && TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype)
                   9403:     && via_virtual == 0)
                   9404:   {
                   9405:     warning ("making type `%s' a virtual baseclass",
                   9406:             TYPE_NAME_STRING (basetype));
                   9407:     via_virtual = 1;
                   9408:   }
                   9409: #endif
                   9410:              /* We are free to modify these bits because they are meaningless
                   9411:                 at top level, and BASETYPE is a top-level type.  */
                   9412:              if (via_virtual || TYPE_USES_VIRTUAL_BASECLASSES (basetype))
                   9413:                {
                   9414:                  TYPE_USES_VIRTUAL_BASECLASSES (ref) = 1;
                   9415:                  TYPE_USES_COMPLEX_INHERITANCE (ref) = 1;
                   9416:                }
                   9417: 
                   9418:              TYPE_GETS_ASSIGNMENT (ref) |= TYPE_GETS_ASSIGNMENT (basetype);
                   9419:              TYPE_OVERLOADS_METHOD_CALL_EXPR (ref) |= TYPE_OVERLOADS_METHOD_CALL_EXPR (basetype);
                   9420:              TREE_GETS_NEW (ref) |= TREE_GETS_NEW (basetype);
                   9421:              TREE_GETS_DELETE (ref) |= TREE_GETS_DELETE (basetype);
                   9422:              CLASSTYPE_LOCAL_TYPEDECLS (ref) |= CLASSTYPE_LOCAL_TYPEDECLS (basetype);
                   9423:              i += 1;
                   9424:            }
                   9425:        }
                   9426:       if (i)
                   9427:        TREE_VEC_LENGTH (binfos) = i;
                   9428:       else
                   9429:        BINFO_BASETYPES (TYPE_BINFO (ref)) = NULL_TREE;
                   9430: 
                   9431:       if (i > 1)
                   9432:        TYPE_USES_MULTIPLE_INHERITANCE (ref) = 1;
                   9433:       else if (i == 1)
                   9434:        TYPE_USES_MULTIPLE_INHERITANCE (ref)
                   9435:          = TYPE_USES_MULTIPLE_INHERITANCE (BINFO_TYPE (TREE_VEC_ELT (binfos, 0)));
                   9436:       if (TYPE_USES_MULTIPLE_INHERITANCE (ref))
                   9437:        TYPE_USES_COMPLEX_INHERITANCE (ref) = 1;
                   9438: 
                   9439:       /* Unmark all the types.  */
                   9440:       while (--i >= 0)
                   9441:        CLEAR_CLASSTYPE_MARKED (BINFO_TYPE (TREE_VEC_ELT (binfos, i)));
                   9442:       CLEAR_CLASSTYPE_MARKED (ref);
                   9443:     }
                   9444: 
                   9445:  just_return:
                   9446: 
                   9447:   /* Until the type is defined, tentatively accept whatever
                   9448:      structure tag the user hands us.  */
                   9449:   if (TYPE_SIZE (ref) == NULL_TREE
                   9450:       && ref != current_class_type
                   9451:       /* Have to check this, in case we have contradictory tag info.  */
                   9452:       && IS_AGGR_TYPE_CODE (TREE_CODE (ref)))
                   9453:     {
                   9454:       if (tag_code == class_type)
                   9455:        CLASSTYPE_DECLARED_CLASS (ref) = 1;
                   9456:       else if (tag_code == record_type)
                   9457:        CLASSTYPE_DECLARED_CLASS (ref) = 0;
                   9458:     }
                   9459: 
                   9460:   pop_obstacks ();
                   9461: 
                   9462:   return ref;
                   9463: }
                   9464: 
1.1.1.5 ! root     9465: static tree current_local_enum = NULL_TREE;
        !          9466: 
1.1       root     9467: /* Begin compiling the definition of an enumeration type.
                   9468:    NAME is its name (or null if anonymous).
                   9469:    Returns the type object, as yet incomplete.
                   9470:    Also records info about it so that build_enumerator
                   9471:    may be used to declare the individual values as they are read.  */
                   9472: 
                   9473: tree
                   9474: start_enum (name)
                   9475:      tree name;
                   9476: {
1.1.1.5 ! root     9477:   register tree enumtype = NULL_TREE;
1.1       root     9478:   struct binding_level *b
                   9479:     = (class_binding_level ? class_binding_level : current_binding_level);
                   9480: 
                   9481:   /* If this is the real definition for a previous forward reference,
                   9482:      fill in the contents in the same object that used to be the
                   9483:      forward reference.  */
                   9484: 
1.1.1.5 ! root     9485:   if (name != NULL_TREE)
1.1       root     9486:     enumtype = lookup_tag (ENUMERAL_TYPE, name, b, 1);
                   9487: 
1.1.1.5 ! root     9488:   if (enumtype == NULL_TREE || TREE_CODE (enumtype) != ENUMERAL_TYPE)
1.1       root     9489:     {
                   9490:       enumtype = make_node (ENUMERAL_TYPE);
                   9491:       pushtag (name, enumtype);
                   9492:     }
                   9493: 
1.1.1.5 ! root     9494:   if (current_class_type)
        !          9495:     TREE_ADDRESSABLE (b->tags) = 1;
        !          9496:   current_local_enum = NULL_TREE;
        !          9497: 
        !          9498:   if (TYPE_VALUES (enumtype) != NULL_TREE)
1.1       root     9499:     {
                   9500:       /* This enum is a named one that has been declared already.  */
                   9501:       error ("redeclaration of `enum %s'", IDENTIFIER_POINTER (name));
                   9502: 
                   9503:       /* Completely replace its old definition.
                   9504:         The old enumerators remain defined, however.  */
1.1.1.5 ! root     9505:       TYPE_VALUES (enumtype) = NULL_TREE;
1.1       root     9506:     }
                   9507: 
                   9508:   /* Initially, set up this enum as like `int'
                   9509:      so that we can create the enumerators' declarations and values.
                   9510:      Later on, the precision of the type may be changed and
                   9511:      it may be laid out again.  */
                   9512: 
                   9513:   TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node);
1.1.1.5 ! root     9514:   TYPE_SIZE (enumtype) = NULL_TREE;
1.1       root     9515:   fixup_unsigned_type (enumtype);
                   9516: 
                   9517:   /* We copy this value because enumerated type constants
                   9518:      are really of the type of the enumerator, not integer_type_node.  */
                   9519:   enum_next_value = copy_node (integer_zero_node);
                   9520: 
                   9521:   GNU_xref_decl (current_function_decl, enumtype);
                   9522:   return enumtype;
                   9523: }
                   9524: 
                   9525: /* After processing and defining all the values of an enumeration type,
                   9526:    install their decls in the enumeration type and finish it off.
                   9527:    ENUMTYPE is the type object and VALUES a list of name-value pairs.
                   9528:    Returns ENUMTYPE.  */
                   9529: 
                   9530: tree
                   9531: finish_enum (enumtype, values)
                   9532:      register tree enumtype, values;
                   9533: {
                   9534:   register tree pair;
1.1.1.4   root     9535:   register HOST_WIDE_INT maxvalue = 0;
                   9536:   register HOST_WIDE_INT minvalue = 0;
                   9537:   register HOST_WIDE_INT i;
1.1       root     9538: 
                   9539:   TYPE_VALUES (enumtype) = values;
                   9540: 
                   9541:   /* Calculate the maximum value of any enumerator in this type.  */
                   9542: 
                   9543:   if (values)
                   9544:     {
                   9545:       /* Speed up the main loop by performing some precalculations */
                   9546: 
1.1.1.4   root     9547:       HOST_WIDE_INT value = TREE_INT_CST_LOW (TREE_VALUE (values));
1.1       root     9548:       TREE_TYPE (TREE_VALUE (values)) = enumtype;
                   9549:       minvalue = maxvalue = value;
                   9550:       
                   9551:       for (pair = TREE_CHAIN (values); pair; pair = TREE_CHAIN (pair))
                   9552:        {
                   9553:          value = TREE_INT_CST_LOW (TREE_VALUE (pair));
                   9554:          if (value > maxvalue)
                   9555:            maxvalue = value;
                   9556:          else if (value < minvalue)
                   9557:            minvalue = value;
                   9558:          TREE_TYPE (TREE_VALUE (pair)) = enumtype;
                   9559:        }
                   9560:     }
                   9561: 
                   9562:   if (flag_short_enums)
                   9563:     {
                   9564:       /* Determine the precision this type needs, lay it out, and define it.  */
                   9565: 
                   9566:       for (i = maxvalue; i; i >>= 1)
                   9567:        TYPE_PRECISION (enumtype)++;
                   9568: 
                   9569:       if (!TYPE_PRECISION (enumtype))
                   9570:        TYPE_PRECISION (enumtype) = 1;
                   9571: 
                   9572:       /* Cancel the laying out previously done for the enum type,
                   9573:         so that fixup_unsigned_type will do it over.  */
1.1.1.5 ! root     9574:       TYPE_SIZE (enumtype) = NULL_TREE;
1.1       root     9575: 
                   9576:       fixup_unsigned_type (enumtype);
                   9577:     }
                   9578: 
                   9579:   TREE_INT_CST_LOW (TYPE_MAX_VALUE (enumtype)) = maxvalue;
                   9580: 
                   9581:   /* An enum can have some negative values; then it is signed.  */
                   9582:   if (minvalue < 0)
                   9583:     {
                   9584:       TREE_INT_CST_LOW (TYPE_MIN_VALUE (enumtype)) = minvalue;
                   9585:       TREE_INT_CST_HIGH (TYPE_MIN_VALUE (enumtype)) = -1;
                   9586:       TREE_UNSIGNED (enumtype) = 0;
                   9587:     }
                   9588:   if (flag_cadillac)
                   9589:     cadillac_finish_enum (enumtype);
                   9590: 
                   9591:   /* Finish debugging output for this type.  */
1.1.1.4   root     9592: #if 0
                   9593:   /* @@ Do we ever generate generate ENUMERAL_TYPE nodes for which debugging
                   9594:      information should *not* be generated?  I think not.  */
1.1       root     9595:   if (! DECL_IGNORED_P (TYPE_NAME (enumtype)))
1.1.1.4   root     9596: #endif
1.1       root     9597:     rest_of_type_compilation (enumtype, global_bindings_p ());
                   9598: 
                   9599:   return enumtype;
                   9600: }
                   9601: 
                   9602: /* Build and install a CONST_DECL for one value of the
                   9603:    current enumeration type (one that was begun with start_enum).
                   9604:    Return a tree-list containing the name and its value.
                   9605:    Assignment of sequential values by default is handled here.  */
                   9606: 
                   9607: tree
                   9608: build_enumerator (name, value)
                   9609:      tree name, value;
                   9610: {
                   9611:   tree decl, result;
                   9612:   /* Change this to zero if we find VALUE is not shareable.  */
                   9613:   int shareable = 1;
                   9614: 
1.1.1.5 ! root     9615:   /* Remove no-op casts from the value.  */
        !          9616:   if (value)
        !          9617:     STRIP_TYPE_NOPS (value);
        !          9618: 
1.1       root     9619:   /* Validate and default VALUE.  */
1.1.1.5 ! root     9620:   if (value != NULL_TREE)
1.1       root     9621:     {
                   9622:       if (TREE_READONLY_DECL_P (value))
                   9623:        {
                   9624:          value = decl_constant_value (value);
                   9625:          shareable = 0;
                   9626:        }
                   9627: 
                   9628:       if (TREE_CODE (value) != INTEGER_CST)
                   9629:        {
                   9630:          error ("enumerator value for `%s' not integer constant",
                   9631:                 IDENTIFIER_POINTER (name));
1.1.1.5 ! root     9632:          value = NULL_TREE;
1.1       root     9633:        }
                   9634:     }
                   9635:   /* The order of things is reversed here so that we
                   9636:      can check for possible sharing of enum values,
                   9637:      to keep that from happening.  */
                   9638:   /* Default based on previous value.  */
1.1.1.5 ! root     9639:   if (value == NULL_TREE)
1.1       root     9640:     value = enum_next_value;
                   9641: 
                   9642:   /* Remove no-op casts from the value.  */
1.1.1.4   root     9643:   if (value)
                   9644:     STRIP_TYPE_NOPS (value);
1.1       root     9645: 
                   9646:   /* Make up for hacks in cp-lex.c.  */
                   9647:   if (value == integer_zero_node)
                   9648:     value = build_int_2 (0, 0);
                   9649:   else if (value == integer_one_node)
                   9650:     value = build_int_2 (1, 0);
                   9651:   else if (TREE_CODE (value) == INTEGER_CST
                   9652:           && (shareable == 0
                   9653:               || TREE_CODE (TREE_TYPE (value)) == ENUMERAL_TYPE))
                   9654:     {
                   9655:       value = copy_node (value);
                   9656:       TREE_TYPE (value) = integer_type_node;
                   9657:     }
                   9658: 
                   9659:   result = saveable_tree_cons (name, value, NULL_TREE);
                   9660: 
                   9661:   /* C++ associates enums with global, function, or class declarations.  */
                   9662:   if (current_class_type == NULL_TREE || current_function_decl != NULL_TREE)
                   9663:     {
                   9664:       /* Create a declaration for the enum value name.  */
                   9665: 
                   9666:       decl = build_decl (CONST_DECL, name, integer_type_node);
                   9667:       DECL_INITIAL (decl) = value;
                   9668: 
                   9669:       pushdecl (decl);
                   9670:       GNU_xref_decl (current_function_decl, decl);
                   9671:     }
                   9672: 
1.1.1.5 ! root     9673:   if (current_class_type)
        !          9674:     {
        !          9675:       /* class-local enum declaration */
        !          9676:       decl = build_lang_field_decl (CONST_DECL, name, integer_type_node);
        !          9677:       DECL_INITIAL (decl) = value;
        !          9678:       TREE_READONLY (decl) = 1;
        !          9679:       pushdecl_class_level (decl);
        !          9680:       TREE_CHAIN (decl) = current_local_enum;
        !          9681:       current_local_enum = decl;
        !          9682:     }
        !          9683: 
1.1       root     9684:   /* Set basis for default for next value.  */
                   9685:   enum_next_value = build_binary_op_nodefault (PLUS_EXPR, value,
                   9686:                                               integer_one_node, PLUS_EXPR);
                   9687:   if (enum_next_value == integer_one_node)
                   9688:     enum_next_value = copy_node (enum_next_value);
                   9689: 
                   9690:   return result;
                   9691: }
                   9692: 
                   9693: tree
                   9694: grok_enum_decls (type, decl)
                   9695:      tree type, decl;
                   9696: {
1.1.1.5 ! root     9697:   tree d = current_local_enum;
        !          9698:   
        !          9699:   if (d == NULL_TREE)
1.1       root     9700:     return decl;
1.1.1.5 ! root     9701:   
        !          9702:   while (1)
1.1       root     9703:     {
1.1.1.5 ! root     9704:       TREE_TYPE (d) = type;
        !          9705:       if (TREE_CHAIN (d) == NULL_TREE)
        !          9706:        {
        !          9707:          TREE_CHAIN (d) = decl;
        !          9708:          break;
        !          9709:        }
        !          9710:       d = TREE_CHAIN (d);
1.1       root     9711:     }
1.1.1.5 ! root     9712: 
        !          9713:   decl = current_local_enum;
        !          9714:   current_local_enum = NULL_TREE;
        !          9715:   
1.1       root     9716:   return decl;
                   9717: }
                   9718: 
                   9719: /* Create the FUNCTION_DECL for a function definition.
                   9720:    DECLSPECS and DECLARATOR are the parts of the declaration;
                   9721:    they describe the function's name and the type it returns,
                   9722:    but twisted together in a fashion that parallels the syntax of C.
                   9723: 
                   9724:    This function creates a binding context for the function body
                   9725:    as well as setting up the FUNCTION_DECL in current_function_decl.
                   9726: 
                   9727:    Returns 1 on success.  If the DECLARATOR is not suitable for a function
                   9728:    (it defines a datum instead), we return 0, which tells
                   9729:    yyparse to report a parse error.
                   9730: 
                   9731:    For C++, we must first check whether that datum makes any sense.
1.1.1.4   root     9732:    For example, "class A local_a(1,2);" means that variable local_a
                   9733:    is an aggregate of type A, which should have a constructor
1.1       root     9734:    applied to it with the argument list [1, 2].
                   9735: 
                   9736:    @@ There is currently no way to retrieve the storage
                   9737:    @@ allocated to FUNCTION (or all of its parms) if we return
                   9738:    @@ something we had previously.  */
                   9739: 
                   9740: int
                   9741: start_function (declspecs, declarator, raises, pre_parsed_p)
                   9742:      tree declarator, declspecs, raises;
                   9743:      int pre_parsed_p;
                   9744: {
                   9745:   extern tree EHS_decl;
                   9746:   tree decl1, olddecl;
                   9747:   tree ctype = NULL_TREE;
                   9748:   tree fntype;
                   9749:   tree restype;
1.1.1.4   root     9750:   extern int have_extern_spec;
                   9751:   extern int used_extern_spec;
                   9752:   int doing_friend = 0;
1.1       root     9753: 
                   9754:   if (flag_handle_exceptions && EHS_decl == NULL_TREE)
                   9755:     init_exception_processing_1 ();
                   9756: 
                   9757:   /* Sanity check.  */
1.1.1.4   root     9758:   my_friendly_assert (TREE_VALUE (void_list_node) == void_type_node, 160);
                   9759:   my_friendly_assert (TREE_CHAIN (void_list_node) == NULL_TREE, 161);
1.1       root     9760: 
                   9761:   /* Assume, until we see it does. */
                   9762:   current_function_returns_value = 0;
                   9763:   current_function_returns_null = 0;
                   9764:   warn_about_return_type = 0;
                   9765:   current_extern_inline = 0;
                   9766:   current_function_assigns_this = 0;
                   9767:   current_function_just_assigned_this = 0;
                   9768:   current_function_parms_stored = 0;
1.1.1.5 ! root     9769:   original_result_rtx = NULL_RTX;
1.1       root     9770:   current_function_obstack_index = 0;
                   9771:   current_function_obstack_usage = 0;
                   9772: 
                   9773:   clear_temp_name ();
                   9774: 
1.1.1.4   root     9775:   /* This should only be done once on the top most decl. */
                   9776:   if (have_extern_spec && !used_extern_spec)
                   9777:     {
                   9778:       declspecs = decl_tree_cons (NULL_TREE, get_identifier ("extern"), declspecs);
                   9779:       used_extern_spec = 1;
                   9780:     }
                   9781: 
1.1       root     9782:   if (pre_parsed_p)
                   9783:     {
                   9784:       decl1 = declarator;
                   9785:       last_function_parms = DECL_ARGUMENTS (decl1);
1.1.1.5 ! root     9786:       last_function_parm_tags = NULL_TREE;
1.1       root     9787:       fntype = TREE_TYPE (decl1);
                   9788:       if (TREE_CODE (fntype) == METHOD_TYPE)
                   9789:        ctype = TYPE_METHOD_BASETYPE (fntype);
                   9790: 
1.1.1.4   root     9791:       /* ANSI C++ June 5 1992 WP 11.4.5.  A friend function defined in a
                   9792:         class is in the (lexical) scope of the class in which it is
                   9793:         defined.  */
                   9794:       if (!ctype && DECL_FRIEND_P (decl1))
                   9795:        {
                   9796:          ctype = TREE_TYPE (TREE_CHAIN (decl1));
1.1.1.5 ! root     9797: 
        !          9798:          /* CTYPE could be null here if we're dealing with a template;
        !          9799:             for example, `inline friend float foo()' inside a template
        !          9800:             will have no CTYPE set.  */
        !          9801:          if (ctype && TREE_CODE (ctype) != RECORD_TYPE)
1.1.1.4   root     9802:            ctype = NULL_TREE;
                   9803:          else
                   9804:            doing_friend = 1;
                   9805:        }
                   9806: 
1.1       root     9807:       if ( !(DECL_VINDEX (decl1)
                   9808:             && write_virtuals >= 2
                   9809:             && CLASSTYPE_VTABLE_NEEDS_WRITING (ctype)))
1.1.1.4   root     9810:        current_extern_inline = TREE_PUBLIC (decl1) && DECL_INLINE (decl1);
1.1       root     9811: 
                   9812:       raises = TYPE_RAISES_EXCEPTIONS (fntype);
                   9813: 
                   9814:       /* In a fcn definition, arg types must be complete.  */
                   9815:       require_complete_types_for_parms (last_function_parms);
                   9816:     }
                   9817:   else
                   9818:     {
                   9819:       decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1, raises);
                   9820:       /* If the declarator is not suitable for a function definition,
                   9821:         cause a syntax error.  */
1.1.1.5 ! root     9822:       if (decl1 == NULL_TREE || TREE_CODE (decl1) != FUNCTION_DECL) return 0;
1.1       root     9823: 
                   9824:       fntype = TREE_TYPE (decl1);
                   9825: 
                   9826:       restype = TREE_TYPE (fntype);
                   9827:       if (IS_AGGR_TYPE (restype)
                   9828:          && ! CLASSTYPE_GOT_SEMICOLON (restype))
                   9829:        {
                   9830:          error_with_aggr_type (restype, "semicolon missing after declaration of `%s'");
                   9831:          shadow_tag (build_tree_list (NULL_TREE, restype));
                   9832:          CLASSTYPE_GOT_SEMICOLON (restype) = 1;
                   9833:          if (TREE_CODE (fntype) == FUNCTION_TYPE)
                   9834:            fntype = build_function_type (integer_type_node,
                   9835:                                          TYPE_ARG_TYPES (fntype));
                   9836:          else
1.1.1.2   root     9837:            fntype = build_cplus_method_type (build_type_variant (TYPE_METHOD_BASETYPE (fntype), TREE_READONLY (decl1), TREE_SIDE_EFFECTS (decl1)),
1.1       root     9838:                                              integer_type_node,
                   9839:                                              TYPE_ARG_TYPES (fntype));
                   9840:          TREE_TYPE (decl1) = fntype;
                   9841:        }
                   9842: 
                   9843:       if (TREE_CODE (fntype) == METHOD_TYPE)
                   9844:        ctype = TYPE_METHOD_BASETYPE (fntype);
                   9845:       else if (IDENTIFIER_LENGTH (DECL_NAME (decl1)) == 4
                   9846:               && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (decl1)), "main")
                   9847:               && DECL_CONTEXT (decl1) == NULL_TREE)
                   9848:        {
1.1.1.4   root     9849:          /* If this doesn't return integer_type, complain.  */
                   9850:          if (TREE_TYPE (TREE_TYPE (decl1)) != integer_type_node)
1.1       root     9851:            {
                   9852:              warning ("return type for `main' changed to integer type");
                   9853:              TREE_TYPE (decl1) = fntype = default_function_type;
                   9854:            }
                   9855:          warn_about_return_type = 0;
                   9856:        }
                   9857:     }
                   9858: 
                   9859:   /* Warn if function was previously implicitly declared
                   9860:      (but not if we warned then).  */
1.1.1.5 ! root     9861:   if (! warn_implicit
        !          9862:       && IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)) != NULL_TREE)
1.1       root     9863:     warning_with_decl (IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)),
                   9864:                       "`%s' implicitly declared before its definition");
                   9865: 
                   9866:   current_function_decl = decl1;
                   9867: 
                   9868:   if (flag_cadillac)
                   9869:     cadillac_start_function (decl1);
                   9870:   else
                   9871:     announce_function (decl1);
                   9872: 
1.1.1.5 ! root     9873:   if (TYPE_SIZE (TREE_TYPE (fntype)) == NULL_TREE)
1.1       root     9874:     {
                   9875:       if (IS_AGGR_TYPE (TREE_TYPE (fntype)))
                   9876:        error_with_aggr_type (TREE_TYPE (fntype),
                   9877:                              "return-type `%s' is an incomplete type");
                   9878:       else
                   9879:        error ("return-type is an incomplete type");
                   9880: 
                   9881:       /* Make it return void instead, but don't change the
                   9882:         type of the DECL_RESULT, in case we have a named return value.  */
                   9883:       if (ctype)
                   9884:        TREE_TYPE (decl1)
1.1.1.5 ! root     9885:          = build_cplus_method_type (build_type_variant (ctype,
        !          9886:                                                         TREE_READONLY (decl1),
        !          9887:                                                         TREE_SIDE_EFFECTS (decl1)),
1.1       root     9888:                                     void_type_node,
                   9889:                                     FUNCTION_ARG_CHAIN (decl1));
                   9890:       else
                   9891:        TREE_TYPE (decl1)
                   9892:          = build_function_type (void_type_node,
                   9893:                                 TYPE_ARG_TYPES (TREE_TYPE (decl1)));
                   9894:       DECL_RESULT (decl1) = build_decl (RESULT_DECL, 0, TREE_TYPE (fntype));
                   9895:     }
                   9896: 
                   9897:   if (warn_about_return_type)
                   9898:     warning ("return-type defaults to `int'");
                   9899: 
                   9900:   /* Make the init_value nonzero so pushdecl knows this is not tentative.
                   9901:      error_mark_node is replaced below (in poplevel) with the BLOCK.  */
                   9902:   DECL_INITIAL (decl1) = error_mark_node;
                   9903: 
                   9904:   /* Didn't get anything from C.  */
1.1.1.5 ! root     9905:   olddecl = NULL_TREE;
1.1       root     9906: 
                   9907:   /* This function exists in static storage.
                   9908:      (This does not mean `static' in the C sense!)  */
                   9909:   TREE_STATIC (decl1) = 1;
                   9910: 
1.1.1.3   root     9911:   /* If this function belongs to an interface, it is public.
                   9912:      If it belongs to someone else's interface, it is also external.
1.1       root     9913:      It doesn't matter whether it's inline or not.  */
                   9914:   if (interface_unknown == 0)
                   9915:     {
1.1.1.3   root     9916:       TREE_PUBLIC (decl1) = 1;
1.1.1.5 ! root     9917:       DECL_EXTERNAL (decl1) = (interface_only
        !          9918:                               || (DECL_INLINE (decl1)
        !          9919:                                   && ! flag_implement_inlines));
1.1       root     9920:     }
                   9921:   else
                   9922:     /* This is a definition, not a reference.
1.1.1.4   root     9923:        So normally clear DECL_EXTERNAL.
1.1       root     9924:        However, `extern inline' acts like a declaration except for
1.1.1.4   root     9925:        defining how to inline.  So set DECL_EXTERNAL in that case.  */
                   9926:     DECL_EXTERNAL (decl1) = current_extern_inline;
1.1       root     9927: 
                   9928:   /* Now see if this is the implementation of a function
                   9929:      declared with "C" linkage.  */
1.1.1.5 ! root     9930:   if (ctype == NULL_TREE && current_lang_name == lang_name_cplusplus
        !          9931:       && !DECL_CONTEXT (decl1))
1.1       root     9932:     {
                   9933:       olddecl = lookup_name_current_level (DECL_NAME (decl1));
                   9934:       if (olddecl && TREE_CODE (olddecl) != FUNCTION_DECL)
                   9935:        olddecl = NULL_TREE;
                   9936:       if (olddecl && DECL_NAME (decl1) != DECL_NAME (olddecl))
                   9937:        {
                   9938:          /* Collision between user and internal naming scheme.  */
                   9939:          olddecl = lookup_name_current_level (DECL_ASSEMBLER_NAME (decl1));
                   9940:          if (olddecl == NULL_TREE)
                   9941:            olddecl = decl1;
                   9942:        }
                   9943:       if (olddecl && olddecl != decl1
                   9944:          && DECL_NAME (decl1) == DECL_NAME (olddecl))
                   9945:        {
                   9946:          if (TREE_CODE (olddecl) == FUNCTION_DECL
1.1.1.5 ! root     9947:              && decls_match (decl1, olddecl))
1.1       root     9948:            {
                   9949:              olddecl = DECL_MAIN_VARIANT (olddecl);
                   9950:              /* The following copy is needed to handle forcing a function's
                   9951:                 linkage to obey the linkage of the original decl.  */
                   9952:              DECL_ASSEMBLER_NAME (decl1) = DECL_ASSEMBLER_NAME (olddecl);
                   9953:              DECL_OVERLOADED (decl1) = DECL_OVERLOADED (olddecl);
                   9954:              if (DECL_INITIAL (olddecl))
                   9955:                redeclaration_error_message (decl1, olddecl);
                   9956:              if (! duplicate_decls (decl1, olddecl))
1.1.1.3   root     9957:                my_friendly_abort (19);
1.1       root     9958:              decl1 = olddecl;
                   9959:            }
                   9960:          else
                   9961:            olddecl = NULL_TREE;
                   9962:        }
                   9963:     }
                   9964: 
                   9965:   /* Record the decl so that the function name is defined.
                   9966:      If we already have a decl for this name, and it is a FUNCTION_DECL,
                   9967:      use the old decl.  */
                   9968: 
                   9969:   if (olddecl)
                   9970:     current_function_decl = olddecl;
                   9971:   else if (pre_parsed_p == 0)
                   9972:     {
                   9973:       current_function_decl = pushdecl (decl1);
                   9974:       if (TREE_CODE (current_function_decl) == TREE_LIST)
                   9975:        {
                   9976:          /* @@ revert to modified original declaration.  */
                   9977:          decl1 = DECL_MAIN_VARIANT (decl1);
                   9978:          current_function_decl = decl1;
                   9979:        }
                   9980:       else
                   9981:        {
                   9982:          decl1 = current_function_decl;
                   9983:          DECL_MAIN_VARIANT (decl1) = decl1;
                   9984:        }
                   9985:       fntype = TREE_TYPE (decl1);
                   9986:     }
                   9987:   else
                   9988:     current_function_decl = decl1;
                   9989: 
                   9990:   if (DECL_OVERLOADED (decl1))
                   9991:     decl1 = push_overloaded_decl (decl1, 1);
                   9992: 
1.1.1.5 ! root     9993:   if (ctype != NULL_TREE && DECL_STATIC_FUNCTION_P (decl1))
1.1       root     9994:     {
                   9995:       if (TREE_CODE (fntype) == METHOD_TYPE)
                   9996:        TREE_TYPE (decl1) = fntype
                   9997:          = build_function_type (TREE_TYPE (fntype),
                   9998:                                 TREE_CHAIN (TYPE_ARG_TYPES (fntype)));
                   9999:       last_function_parms = TREE_CHAIN (last_function_parms);
                   10000:       DECL_ARGUMENTS (decl1) = last_function_parms;
1.1.1.5 ! root     10001:       ctype = NULL_TREE;
1.1       root     10002:     }
                   10003:   restype = TREE_TYPE (fntype);
                   10004: 
                   10005:   pushlevel (0);
                   10006:   current_binding_level->parm_flag = 1;
                   10007: 
                   10008:   /* Save the parm names or decls from this function's declarator
                   10009:      where store_parm_decls will find them.  */
                   10010:   current_function_parms = last_function_parms;
                   10011:   current_function_parm_tags = last_function_parm_tags;
                   10012: 
                   10013:   GNU_xref_function (decl1, current_function_parms);
                   10014: 
                   10015:   make_function_rtl (decl1);
                   10016: 
                   10017:   if (ctype)
                   10018:     {
                   10019:       pushclass (ctype, 1);
1.1.1.4   root     10020: 
                   10021:       /* If we're compiling a friend function, neither of the variables
                   10022:         current_class_decl nor current_class_type will have values.  */
                   10023:       if (! doing_friend)
                   10024:        {
                   10025:          /* We know that this was set up by `grokclassfn'.
                   10026:             We do not wait until `store_parm_decls', since evil
                   10027:             parse errors may never get us to that point.  Here
                   10028:             we keep the consistency between `current_class_type'
                   10029:             and `current_class_decl'.  */
                   10030:          current_class_decl = last_function_parms;
                   10031:          my_friendly_assert (current_class_decl != NULL_TREE
                   10032:                  && TREE_CODE (current_class_decl) == PARM_DECL, 162);
                   10033:          if (TREE_CODE (TREE_TYPE (current_class_decl)) == POINTER_TYPE)
                   10034:            {
                   10035:              tree variant = TREE_TYPE (TREE_TYPE (current_class_decl));
                   10036:              if (CLASSTYPE_INST_VAR (ctype) == NULL_TREE)
                   10037:                {
                   10038:                  /* Can't call build_indirect_ref here, because it has special
                   10039:                     logic to return C_C_D given this argument.  */
                   10040:                  C_C_D = build1 (INDIRECT_REF, current_class_type, current_class_decl);
                   10041:                  CLASSTYPE_INST_VAR (ctype) = C_C_D;
                   10042:                }
                   10043:              else
                   10044:                {
                   10045:                  C_C_D = CLASSTYPE_INST_VAR (ctype);
                   10046:                  /* `current_class_decl' is different for every
                   10047:                     function we compile.  */
                   10048:                  TREE_OPERAND (C_C_D, 0) = current_class_decl;
                   10049:                }
                   10050:              TREE_READONLY (C_C_D) = TYPE_READONLY (variant);
                   10051:              TREE_SIDE_EFFECTS (C_C_D) = TYPE_VOLATILE (variant);
                   10052:              TREE_THIS_VOLATILE (C_C_D) = TYPE_VOLATILE (variant);
1.1       root     10053:            }
                   10054:          else
1.1.1.4   root     10055:            C_C_D = current_class_decl;
1.1       root     10056:        }
                   10057:     }
                   10058:   else
                   10059:     {
                   10060:       if (DECL_STATIC_FUNCTION_P (decl1))
                   10061:        pushclass (DECL_CONTEXT (decl1), 2);
                   10062:       else
                   10063:        push_memoized_context (0, 1);
                   10064:     }
                   10065: 
                   10066:   /* Allocate further tree nodes temporarily during compilation
                   10067:      of this function only.  Tiemann moved up here from bottom of fn.  */
                   10068:   temporary_allocation ();
                   10069: 
                   10070:   /* Promote the value to int before returning it.  */
1.1.1.4   root     10071:   if (C_PROMOTING_INTEGER_TYPE_P (restype))
                   10072:     {
                   10073:       /* It retains unsignedness if traditional or if it isn't
                   10074:         really getting wider.  */
                   10075:       if (TREE_UNSIGNED (restype)
                   10076:          && (flag_traditional
                   10077:              || TYPE_PRECISION (restype)
                   10078:                   == TYPE_PRECISION (integer_type_node)))
                   10079:        restype = unsigned_type_node;
                   10080:       else
                   10081:        restype = integer_type_node;
                   10082:     }
1.1       root     10083:   if (DECL_RESULT (decl1) == NULL_TREE)
                   10084:     DECL_RESULT (decl1) = build_decl (RESULT_DECL, 0, restype);
                   10085: 
                   10086:   if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl1)))
                   10087:     {
                   10088:       dtor_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
                   10089:       ctor_label = NULL_TREE;
                   10090:     }
                   10091:   else
                   10092:     {
                   10093:       dtor_label = NULL_TREE;
                   10094:       if (DECL_CONSTRUCTOR_P (decl1))
                   10095:        ctor_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
                   10096:     }
                   10097: 
                   10098:   /* If this fcn was already referenced via a block-scope `extern' decl
                   10099:      (or an implicit decl), propagate certain information about the usage.  */
                   10100:   if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (decl1)))
                   10101:     TREE_ADDRESSABLE (decl1) = 1;
                   10102: 
                   10103:   return 1;
                   10104: }
                   10105: 
                   10106: /* Store the parameter declarations into the current function declaration.
                   10107:    This is called after parsing the parameter declarations, before
                   10108:    digesting the body of the function.
                   10109: 
                   10110:    Also install to binding contour return value identifier, if any.  */
                   10111: 
                   10112: void
                   10113: store_parm_decls ()
                   10114: {
                   10115:   register tree fndecl = current_function_decl;
                   10116:   register tree parm;
                   10117:   int parms_have_cleanups = 0;
                   10118:   tree eh_decl;
                   10119: 
                   10120:   /* This is either a chain of PARM_DECLs (when a prototype is used).  */
                   10121:   tree specparms = current_function_parms;
                   10122: 
                   10123:   /* This is a list of types declared among parms in a prototype.  */
                   10124:   tree parmtags = current_function_parm_tags;
                   10125: 
                   10126:   /* This is a chain of any other decls that came in among the parm
                   10127:      declarations.  If a parm is declared with  enum {foo, bar} x;
                   10128:      then CONST_DECLs for foo and bar are put here.  */
1.1.1.5 ! root     10129:   tree nonparms = NULL_TREE;
1.1       root     10130: 
                   10131:   if (current_binding_level == global_binding_level)
                   10132:     fatal ("parse errors have confused me too much");
                   10133: 
                   10134:   /* Initialize RTL machinery.  */
                   10135:   init_function_start (fndecl, input_filename, lineno);
                   10136: 
1.1.1.3   root     10137:   /* Declare __FUNCTION__ and __PRETTY_FUNCTION__ for this function.  */
                   10138:   declare_function_name ();
                   10139: 
1.1       root     10140:   /* Create a binding level for the parms.  */
                   10141:   expand_start_bindings (0);
                   10142: 
                   10143:   /* Prepare to catch raises, if appropriate.  */
                   10144:   if (flag_handle_exceptions)
                   10145:     {
                   10146:       /* Get this cleanup to be run last, since it
                   10147:         is a call to `longjmp'.  */
                   10148:       setup_exception_throw_decl ();
                   10149:       eh_decl = current_binding_level->names;
                   10150:       current_binding_level->names = TREE_CHAIN (current_binding_level->names);
                   10151:     }
                   10152:   if (flag_handle_exceptions)
                   10153:     expand_start_try (integer_one_node, 0, 1);
                   10154: 
1.1.1.5 ! root     10155:   if (specparms != NULL_TREE)
1.1       root     10156:     {
                   10157:       /* This case is when the function was defined with an ANSI prototype.
                   10158:         The parms already have decls, so we need not do anything here
                   10159:         except record them as in effect
                   10160:         and complain if any redundant old-style parm decls were written.  */
                   10161: 
                   10162:       register tree next;
                   10163: 
                   10164:       /* Must clear this because it might contain TYPE_DECLs declared
                   10165:         at class level.  */
                   10166:       storedecls (NULL_TREE);
                   10167:       for (parm = nreverse (specparms); parm; parm = next)
                   10168:        {
                   10169:          next = TREE_CHAIN (parm);
                   10170:          if (TREE_CODE (parm) == PARM_DECL)
                   10171:            {
                   10172:              tree cleanup = maybe_build_cleanup (parm);
1.1.1.5 ! root     10173:              if (DECL_NAME (parm) == NULL_TREE)
1.1       root     10174:                {
                   10175: #if 0
                   10176:                  error_with_decl (parm, "parameter name omitted");
                   10177: #else
                   10178:                  /* for C++, this is not an error.  */
                   10179:                  pushdecl (parm);
                   10180: #endif
                   10181:                }
1.1.1.4   root     10182:              else if (TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == void_type_node)
1.1       root     10183:                error_with_decl (parm, "parameter `%s' declared void");
                   10184:              else
                   10185:                {
                   10186:                  /* Now fill in DECL_REFERENCE_SLOT for any of the parm decls.
                   10187:                     A parameter is assumed not to have any side effects.
                   10188:                     If this should change for any reason, then this
                   10189:                     will have to wrap the bashed reference type in a save_expr.
                   10190:                     
                   10191:                     Also, if the parameter type is declared to be an X
                   10192:                     and there is an X(X&) constructor, we cannot lay it
                   10193:                     into the stack (any more), so we make this parameter
                   10194:                     look like it is really of reference type.  Functions
                   10195:                     which pass parameters to this function will know to
                   10196:                     create a temporary in their frame, and pass a reference
                   10197:                     to that.  */
                   10198: 
                   10199:                  if (TREE_CODE (TREE_TYPE (parm)) == REFERENCE_TYPE
                   10200:                      && TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm))))
                   10201:                    SET_DECL_REFERENCE_SLOT (parm, convert_from_reference (parm));
                   10202: 
                   10203:                  pushdecl (parm);
                   10204:                }
                   10205:              if (cleanup)
                   10206:                {
                   10207:                  expand_decl (parm);
                   10208:                  expand_decl_cleanup (parm, cleanup);
                   10209:                  parms_have_cleanups = 1;
                   10210:                }
                   10211:            }
                   10212:          else
                   10213:            {
                   10214:              /* If we find an enum constant or a type tag,
                   10215:                 put it aside for the moment.  */
1.1.1.5 ! root     10216:              TREE_CHAIN (parm) = NULL_TREE;
1.1       root     10217:              nonparms = chainon (nonparms, parm);
                   10218:            }
                   10219:        }
                   10220: 
                   10221:       /* Get the decls in their original chain order
                   10222:         and record in the function.  This is all and only the
                   10223:         PARM_DECLs that were pushed into scope by the loop above.  */
                   10224:       DECL_ARGUMENTS (fndecl) = getdecls ();
                   10225: 
                   10226:       storetags (chainon (parmtags, gettags ()));
                   10227:     }
                   10228:   else
1.1.1.5 ! root     10229:     DECL_ARGUMENTS (fndecl) = NULL_TREE;
1.1       root     10230: 
                   10231:   /* Now store the final chain of decls for the arguments
                   10232:      as the decl-chain of the current lexical scope.
                   10233:      Put the enumerators in as well, at the front so that
                   10234:      DECL_ARGUMENTS is not modified.  */
                   10235: 
                   10236:   storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl)));
                   10237: 
                   10238:   /* Initialize the RTL code for the function.  */
1.1.1.5 ! root     10239:   DECL_SAVED_INSNS (fndecl) = NULL_RTX;
1.1       root     10240:   expand_function_start (fndecl, parms_have_cleanups);
                   10241: 
                   10242:   if (flag_handle_exceptions)
                   10243:     {
1.1.1.2   root     10244:       /* Make the throw decl visible at this level, just
1.1       root     10245:         not in the way of the parameters.  */
                   10246:       pushdecl (eh_decl);
                   10247:       expand_decl_init (eh_decl);
                   10248:     }
                   10249: 
                   10250:   /* Create a binding contour which can be used to catch
                   10251:      cleanup-generated temporaries.  Also, if the return value needs or
                   10252:      has initialization, deal with that now.  */
                   10253:   if (parms_have_cleanups)
                   10254:     {
                   10255:       pushlevel (0);
                   10256:       expand_start_bindings (0);
                   10257:     }
                   10258: 
                   10259:   current_function_parms_stored = 1;
                   10260: 
                   10261:   if (flag_gc)
                   10262:     {
                   10263:       maybe_gc_cleanup = build_tree_list (NULL_TREE, error_mark_node);
                   10264:       expand_decl_cleanup (NULL_TREE, maybe_gc_cleanup);
                   10265:     }
                   10266: 
                   10267:   /* If this function is `main', emit a call to `__main'
                   10268:      to run global initializers, etc.  */
                   10269:   if (DECL_NAME (fndecl)
                   10270:       && IDENTIFIER_LENGTH (DECL_NAME (fndecl)) == 4
                   10271:       && strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "main") == 0
                   10272:       && DECL_CONTEXT (fndecl) == NULL_TREE)
                   10273:     {
                   10274:       expand_main_function ();
                   10275: 
                   10276:       if (flag_gc)
                   10277:        expand_expr (build_function_call (lookup_name (get_identifier ("__gc_main"), 0), NULL_TREE),
                   10278:                     0, VOIDmode, 0);
                   10279: 
                   10280:       if (flag_dossier)
                   10281:        output_builtin_tdesc_entries ();
                   10282:     }
                   10283: }
                   10284: 
                   10285: /* Bind a name and initialization to the return value of
                   10286:    the current function.  */
                   10287: void
                   10288: store_return_init (return_id, init)
                   10289:      tree return_id, init;
                   10290: {
                   10291:   tree decl = DECL_RESULT (current_function_decl);
                   10292: 
                   10293:   if (pedantic)
1.1.1.2   root     10294:     /* Give this error as many times as there are occurrences,
1.1       root     10295:        so that users can use Emacs compilation buffers to find
                   10296:        and fix all such places.  */
                   10297:     error ("ANSI C++ does not permit named return values");
                   10298: 
                   10299:   if (return_id != NULL_TREE)
                   10300:     {
1.1.1.5 ! root     10301:       if (DECL_NAME (decl) == NULL_TREE)
1.1       root     10302:        {
                   10303:          DECL_NAME (decl) = return_id;
                   10304:          DECL_ASSEMBLER_NAME (decl) = return_id;
                   10305:        }
                   10306:       else
                   10307:        error ("return identifier `%s' already in place",
                   10308:               IDENTIFIER_POINTER (DECL_NAME (decl)));
                   10309:     }
                   10310: 
                   10311:   /* Can't let this happen for constructors.  */
                   10312:   if (DECL_CONSTRUCTOR_P (current_function_decl))
                   10313:     {
                   10314:       error ("can't redefine default return value for constructors");
                   10315:       return;
                   10316:     }
                   10317: 
                   10318:   /* If we have a named return value, put that in our scope as well.  */
1.1.1.5 ! root     10319:   if (DECL_NAME (decl) != NULL_TREE)
1.1       root     10320:     {
                   10321:       /* If this named return value comes in a register,
                   10322:         put it in a pseudo-register.  */
1.1.1.4   root     10323:       if (DECL_REGISTER (decl))
1.1       root     10324:        {
                   10325:          original_result_rtx = DECL_RTL (decl);
1.1.1.4   root     10326:          DECL_RTL (decl) = gen_reg_rtx (DECL_MODE (decl));
1.1       root     10327:        }
                   10328: 
                   10329:       /* Let `finish_decl' know that this initializer is ok.  */
                   10330:       DECL_INITIAL (decl) = init;
                   10331:       pushdecl (decl);
                   10332:       finish_decl (decl, init, 0, 0);
                   10333:     }
                   10334: }
                   10335: 
                   10336: /* Generate code for default X(X&) constructor.  */
                   10337: static void
                   10338: build_default_constructor (fndecl)
                   10339:      tree fndecl;
                   10340: {
                   10341:   int i = CLASSTYPE_N_BASECLASSES (current_class_type);
                   10342:   tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl));
                   10343:   tree fields = TYPE_FIELDS (current_class_type);
                   10344:   tree binfos = TYPE_BINFO_BASETYPES (current_class_type);
                   10345: 
                   10346:   if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
                   10347:     parm = TREE_CHAIN (parm);
                   10348:   parm = DECL_REFERENCE_SLOT (parm);
                   10349: 
                   10350:   while (--i >= 0)
                   10351:     {
                   10352:       tree basetype = TREE_VEC_ELT (binfos, i);
                   10353:       if (TYPE_GETS_INIT_REF (basetype))
                   10354:        {
                   10355:          tree name = TYPE_NAME (basetype);
                   10356:          if (TREE_CODE (name) == TYPE_DECL)
                   10357:            name = DECL_NAME (name);
                   10358:          current_base_init_list = tree_cons (name, parm, current_base_init_list);
                   10359:        }
                   10360:     }
                   10361:   for (; fields; fields = TREE_CHAIN (fields))
                   10362:     {
                   10363:       tree name, init;
                   10364:       if (TREE_STATIC (fields))
                   10365:        continue;
                   10366:       if (TREE_CODE (fields) != FIELD_DECL)
                   10367:        continue;
                   10368:       if (DECL_NAME (fields))
                   10369:        {
                   10370:          if (VFIELD_NAME_P (DECL_NAME (fields)))
                   10371:            continue;
                   10372:          if (VBASE_NAME_P (DECL_NAME (fields)))
                   10373:            continue;
                   10374: 
                   10375:          /* True for duplicate members.  */
                   10376:          if (IDENTIFIER_CLASS_VALUE (DECL_NAME (fields)) != fields)
                   10377:            continue;
                   10378:        }
                   10379: 
                   10380:       init = build (COMPONENT_REF, TREE_TYPE (fields), parm, fields);
                   10381: 
                   10382:       if (TREE_ANON_UNION_ELEM (fields))
                   10383:        name = build (COMPONENT_REF, TREE_TYPE (fields), C_C_D, fields);
                   10384:       else
                   10385:        {
                   10386:          name = DECL_NAME (fields);
                   10387:          init = build_tree_list (NULL_TREE, init);
                   10388:        }
                   10389: 
                   10390:       current_member_init_list
                   10391:        = tree_cons (name, init, current_member_init_list);
                   10392:     }
                   10393: }
                   10394: 
                   10395: 
                   10396: /* Finish up a function declaration and compile that function
                   10397:    all the way to assembler language output.  The free the storage
                   10398:    for the function definition.
                   10399: 
                   10400:    This is called after parsing the body of the function definition.
                   10401:    LINENO is the current line number.
                   10402: 
                   10403:    C++: CALL_POPLEVEL is non-zero if an extra call to poplevel
                   10404:    (and expand_end_bindings) must be made to take care of the binding
                   10405:    contour for the base initializers.  This is only relevant for
                   10406:    constructors.  */
                   10407: 
                   10408: void
                   10409: finish_function (lineno, call_poplevel)
                   10410:      int lineno;
                   10411:      int call_poplevel;
                   10412: {
                   10413:   register tree fndecl = current_function_decl;
1.1.1.5 ! root     10414:   tree fntype, ctype = NULL_TREE;
1.1.1.4   root     10415:   rtx head, last_parm_insn, mark;
1.1       root     10416:   extern int sets_exception_throw_decl;
                   10417:   /* Label to use if this function is supposed to return a value.  */
1.1.1.5 ! root     10418:   tree no_return_label = NULL_TREE;
        !          10419: 
        !          10420:   /* When we get some parse errors, we can end up without a
        !          10421:      current_function_decl, so cope.  */
        !          10422:   if (fndecl == NULL_TREE)
        !          10423:     return;
        !          10424: 
        !          10425:   fntype = TREE_TYPE (fndecl);
1.1       root     10426: 
                   10427: /*  TREE_READONLY (fndecl) = 1;
                   10428:     This caused &foo to be of type ptr-to-const-function
                   10429:     which then got a warning when stored in a ptr-to-function variable.  */
                   10430: 
                   10431:   /* This happens on strange parse errors.  */
                   10432:   if (! current_function_parms_stored)
                   10433:     {
                   10434:       call_poplevel = 0;
                   10435:       store_parm_decls ();
                   10436:     }
                   10437: 
1.1.1.4   root     10438:   if (write_symbols != NO_DEBUG && TREE_CODE (fntype) != METHOD_TYPE)
1.1       root     10439:     {
                   10440:       tree ttype = target_type (fntype);
                   10441:       tree parmdecl;
                   10442: 
                   10443:       if (IS_AGGR_TYPE (ttype))
                   10444:        /* Let debugger know it should output info for this type.  */
                   10445:        note_debug_info_needed (ttype);
                   10446: 
                   10447:       for (parmdecl = DECL_ARGUMENTS (fndecl); parmdecl; parmdecl = TREE_CHAIN (parmdecl))
                   10448:        {
                   10449:          ttype = target_type (TREE_TYPE (parmdecl));
                   10450:          if (IS_AGGR_TYPE (ttype))
                   10451:            /* Let debugger know it should output info for this type.  */
                   10452:            note_debug_info_needed (ttype);
                   10453:        }
                   10454:     }
                   10455: 
                   10456:   /* Clean house because we will need to reorder insns here.  */
                   10457:   do_pending_stack_adjust ();
                   10458: 
                   10459:   if (dtor_label)
                   10460:     {
                   10461:       tree binfo = TYPE_BINFO (current_class_type);
                   10462:       tree cond = integer_one_node;
                   10463:       tree exprstmt, vfields;
                   10464:       tree in_charge_node = lookup_name (in_charge_identifier, 0);
1.1.1.4   root     10465:       tree virtual_size;
1.1       root     10466:       int ok_to_optimize_dtor = 0;
                   10467: 
                   10468:       if (current_function_assigns_this)
                   10469:        cond = build (NE_EXPR, integer_type_node,
                   10470:                      current_class_decl, integer_zero_node);
                   10471:       else
                   10472:        {
                   10473:          int n_baseclasses = CLASSTYPE_N_BASECLASSES (current_class_type);
                   10474: 
                   10475:          /* If this destructor is empty, then we don't need to check
                   10476:             whether `this' is NULL in some cases.  */
                   10477:          mark = get_last_insn ();
1.1.1.4   root     10478:          last_parm_insn = get_first_nonparm_insn ();
1.1       root     10479: 
                   10480:          if ((flag_this_is_variable & 1) == 0)
                   10481:            ok_to_optimize_dtor = 1;
                   10482:          else if (mark == last_parm_insn)
                   10483:            ok_to_optimize_dtor
                   10484:              = (n_baseclasses == 0
                   10485:                 || (n_baseclasses == 1
                   10486:                     && TYPE_HAS_DESTRUCTOR (TYPE_BINFO_BASETYPE (current_class_type, 0))));
                   10487:        }
                   10488: 
                   10489:       /* These initializations might go inline.  Protect
                   10490:         the binding level of the parms.  */
                   10491:       pushlevel (0);
                   10492: 
                   10493:       if (current_function_assigns_this)
                   10494:        {
                   10495:          current_function_assigns_this = 0;
                   10496:          current_function_just_assigned_this = 0;
                   10497:        }
                   10498: 
                   10499:       /* Generate the code to call destructor on base class.
                   10500:         If this destructor belongs to a class with virtual
                   10501:         functions, then set the virtual function table
                   10502:         pointer to represent the type of our base class.  */
                   10503: 
                   10504:       /* This side-effect makes call to `build_delete' generate the
                   10505:         code we have to have at the end of this destructor.  */
                   10506:       TYPE_HAS_DESTRUCTOR (current_class_type) = 0;
                   10507: 
                   10508:       /* These are two cases where we cannot delegate deletion.  */
                   10509:       if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)
                   10510:          || TREE_GETS_DELETE (current_class_type))
                   10511:        exprstmt = build_delete (current_class_type, C_C_D, integer_zero_node,
                   10512:                                 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0, 0);
                   10513:       else
                   10514:        exprstmt = build_delete (current_class_type, C_C_D, in_charge_node,
                   10515:                                 LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0, 0);
                   10516: 
                   10517:       /* If we did not assign to this, then `this' is non-zero at
                   10518:         the end of a destructor.  As a special optimization, don't
                   10519:         emit test if this is an empty destructor.  If it does nothing,
                   10520:         it does nothing.  If it calls a base destructor, the base
                   10521:         destructor will perform the test.  */
                   10522: 
                   10523:       if (exprstmt != error_mark_node
                   10524:          && (TREE_CODE (exprstmt) != NOP_EXPR
                   10525:              || TREE_OPERAND (exprstmt, 0) != integer_zero_node
                   10526:              || TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)))
                   10527:        {
                   10528:          expand_label (dtor_label);
                   10529:          if (cond != integer_one_node)
                   10530:            expand_start_cond (cond, 0);
                   10531:          if (exprstmt != void_zero_node)
                   10532:            /* Don't call `expand_expr_stmt' if we're not going to do
                   10533:               anything, since -Wall will give a diagnostic.  */
                   10534:            expand_expr_stmt (exprstmt);
                   10535: 
                   10536:          /* Run destructor on all virtual baseclasses.  */
                   10537:          if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
                   10538:            {
                   10539:              tree vbases = nreverse (copy_list (CLASSTYPE_VBASECLASSES (current_class_type)));
                   10540:              expand_start_cond (build (BIT_AND_EXPR, integer_type_node,
                   10541:                                        in_charge_node, integer_two_node), 0);
                   10542:              while (vbases)
                   10543:                {
                   10544:                  if (TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (vbases)))
                   10545:                    {
                   10546:                      tree ptr = convert_pointer_to_vbase (vbases, current_class_decl);
                   10547:                      expand_expr_stmt (build_delete (TYPE_POINTER_TO (BINFO_TYPE (vbases)),
                   10548:                                                      ptr, integer_zero_node,
                   10549:                                                      LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_HAS_IN_CHARGE, 0, 0));
                   10550:                    }
                   10551:                  vbases = TREE_CHAIN (vbases);
                   10552:                }
                   10553:              expand_end_cond ();
                   10554:            }
                   10555: 
                   10556:          do_pending_stack_adjust ();
                   10557:          if (cond != integer_one_node)
                   10558:            expand_end_cond ();
                   10559:        }
                   10560: 
                   10561:       TYPE_HAS_DESTRUCTOR (current_class_type) = 1;
                   10562: 
1.1.1.4   root     10563:       virtual_size = c_sizeof (current_class_type);
                   10564: 
1.1       root     10565:       /* At the end, call delete if that's what's requested.  */
                   10566:       if (TREE_GETS_DELETE (current_class_type))
                   10567:        /* This NOP_EXPR means we are in a static call context.  */
1.1.1.4   root     10568:        exprstmt =
                   10569:          build_method_call
                   10570:            (build1 (NOP_EXPR,
                   10571:                     TYPE_POINTER_TO (current_class_type), error_mark_node),
                   10572:             ansi_opname[(int) DELETE_EXPR],
                   10573:             tree_cons (NULL_TREE, current_class_decl,
                   10574:                        build_tree_list (NULL_TREE, virtual_size)),
                   10575:             NULL_TREE, LOOKUP_NORMAL);
1.1       root     10576:       else if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
1.1.1.4   root     10577:        exprstmt = build_x_delete (ptr_type_node, current_class_decl, 0,
                   10578:                                   virtual_size);
1.1       root     10579:       else
1.1.1.5 ! root     10580:        exprstmt = NULL_TREE;
1.1       root     10581: 
                   10582:       if (exprstmt)
                   10583:        {
                   10584:          cond = build (BIT_AND_EXPR, integer_type_node,
                   10585:                        in_charge_node, integer_one_node);
                   10586:          expand_start_cond (cond, 0);
                   10587:          expand_expr_stmt (exprstmt);
                   10588:          expand_end_cond ();
                   10589:        }
                   10590: 
                   10591:       /* End of destructor.  */
                   10592:       poplevel (2, 0, 0);
                   10593: 
                   10594:       /* Back to the top of destructor.  */
                   10595:       /* Dont execute destructor code if `this' is NULL.  */
                   10596:       mark = get_last_insn ();
1.1.1.4   root     10597:       last_parm_insn = get_first_nonparm_insn ();
1.1.1.5 ! root     10598:       if (last_parm_insn == NULL_RTX)
1.1.1.4   root     10599:        last_parm_insn = mark;
                   10600:       else
                   10601:        last_parm_insn = previous_insn (last_parm_insn);
1.1       root     10602: 
                   10603:       /* Make all virtual function table pointers point to CURRENT_CLASS_TYPE's
                   10604:         virtual function tables.  */
                   10605:       if (CLASSTYPE_VFIELDS (current_class_type))
                   10606:        {
                   10607:          for (vfields = CLASSTYPE_VFIELDS (current_class_type);
                   10608:               TREE_CHAIN (vfields);
                   10609:               vfields = TREE_CHAIN (vfields))
1.1.1.4   root     10610:            {
                   10611:              tree vf_decl = current_class_decl;
                   10612:              /* ??? This may need to be a loop if there are multiple
                   10613:                 levels of replication.  */
                   10614:              if (VF_BINFO_VALUE (vfields))
                   10615:                vf_decl = convert_pointer_to (VF_BINFO_VALUE (vfields), vf_decl);
                   10616:              if (vf_decl != error_mark_node)
1.1.1.5 ! root     10617:                {
        !          10618:                  /* It is one of these two, or a combination...  */
        !          10619:                  /* basically speaking, I want to get down to the right
        !          10620:                     VF_BASETYPE_VALUE (vfields) */
        !          10621: #if 0
        !          10622:                  if (VF_NORMAL_VALUE (vfields) != VF_DERIVED_VALUE (vfields))
        !          10623:                    warning ("hum, wonder if I am doing the right thing");
        !          10624: #endif
        !          10625:                  expand_expr_stmt (build_virtual_init (binfo,
        !          10626:                                                        get_binfo (VF_BASETYPE_VALUE (vfields),
        !          10627:                                                                   get_binfo (VF_DERIVED_VALUE (vfields), binfo, 0), 0),
        !          10628:                                                        vf_decl));
        !          10629:                }
1.1.1.4   root     10630:            }
1.1       root     10631:          expand_expr_stmt (build_virtual_init (binfo, binfo,
                   10632:                                                current_class_decl));
                   10633:        }
                   10634:       if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
                   10635:        expand_expr_stmt (build_vbase_vtables_init (binfo, binfo,
                   10636:                                                    C_C_D, current_class_decl, 0));
                   10637:       if (! ok_to_optimize_dtor)
                   10638:        {
1.1.1.5 ! root     10639:          cond = build_binary_op (NE_EXPR,
        !          10640:                                  current_class_decl, integer_zero_node, 1);
1.1       root     10641:          expand_start_cond (cond, 0);
                   10642:        }
                   10643:       if (mark != get_last_insn ())
                   10644:        reorder_insns (next_insn (mark), get_last_insn (), last_parm_insn);
                   10645:       if (! ok_to_optimize_dtor)
1.1.1.4   root     10646:        expand_end_cond ();
1.1       root     10647:     }
                   10648:   else if (current_function_assigns_this)
                   10649:     {
                   10650:       /* Does not need to call emit_base_init, because
                   10651:         that is done (if needed) just after assignment to this
                   10652:         is seen.  */
                   10653: 
                   10654:       if (DECL_CONSTRUCTOR_P (current_function_decl))
                   10655:        {
                   10656:          expand_label (ctor_label);
                   10657:          ctor_label = NULL_TREE;
                   10658: 
                   10659:          if (call_poplevel)
                   10660:            {
                   10661:              tree decls = getdecls ();
                   10662:              if (flag_handle_exceptions == 2)
                   10663:                deactivate_exception_cleanups ();
1.1.1.5 ! root     10664:              expand_end_bindings (decls, decls != NULL_TREE, 0);
        !          10665:              poplevel (decls != NULL_TREE, 0, 0);
1.1       root     10666:            }
                   10667:          c_expand_return (current_class_decl);
                   10668:        }
1.1.1.4   root     10669:       else if (TYPE_MAIN_VARIANT (TREE_TYPE (
                   10670:                        DECL_RESULT (current_function_decl))) != void_type_node
1.1.1.5 ! root     10671:               && return_label != NULL_RTX)
1.1       root     10672:        no_return_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
                   10673: 
                   10674:       current_function_assigns_this = 0;
                   10675:       current_function_just_assigned_this = 0;
1.1.1.5 ! root     10676:       base_init_insns = NULL_RTX;
1.1       root     10677:     }
                   10678:   else if (DECL_CONSTRUCTOR_P (fndecl))
                   10679:     {
                   10680:       tree allocated_this;
                   10681:       tree cond, thenclause;
                   10682:       /* Allow constructor for a type to get a new instance of the object
                   10683:         using `build_new'.  */
                   10684:       tree abstract_virtuals = CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type);
                   10685:       CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type) = NULL_TREE;
                   10686: 
                   10687:       DECL_RETURNS_FIRST_ARG (fndecl) = 1;
                   10688: 
1.1.1.2   root     10689:       if (flag_this_is_variable > 0)
1.1       root     10690:        {
1.1.1.5 ! root     10691:          cond = build_binary_op (EQ_EXPR,
        !          10692:                                  current_class_decl, integer_zero_node, 1);
1.1       root     10693:          thenclause = build_modify_expr (current_class_decl, NOP_EXPR,
                   10694:                                          build_new (NULL_TREE, current_class_type, void_type_node, 0));
                   10695:          if (flag_handle_exceptions == 2)
                   10696:            {
                   10697:              tree cleanup, cleanup_deallocate;
1.1.1.4   root     10698:              tree virtual_size;
                   10699: 
                   10700:              /* This is the size of the virtual object pointed to by
                   10701:                 allocated_this.  In this case, it is simple.  */
                   10702:              virtual_size = c_sizeof (current_class_type);
1.1       root     10703: 
                   10704:              allocated_this = build_decl (VAR_DECL, NULL_TREE, ptr_type_node);
1.1.1.4   root     10705:              DECL_REGISTER (allocated_this) = 1;
1.1       root     10706:              DECL_INITIAL (allocated_this) = error_mark_node;
                   10707:              expand_decl (allocated_this);
                   10708:              expand_decl_init (allocated_this);
                   10709:              /* How we cleanup `this' if an exception was raised before
                   10710:                 we are ready to bail out.  */
                   10711:              cleanup = TREE_GETS_DELETE (current_class_type)
1.1.1.5 ! root     10712:                ? build_opfncall (DELETE_EXPR, LOOKUP_NORMAL, allocated_this, virtual_size, NULL_TREE)
1.1.1.4   root     10713:                  /* The size of allocated_this is wrong, and hence the
                   10714:                     second argument to operator delete will be wrong. */
                   10715:                  : build_delete (TREE_TYPE (allocated_this), allocated_this,
                   10716:                                  integer_three_node,
                   10717:                                  LOOKUP_NORMAL|LOOKUP_HAS_IN_CHARGE, 1, 0);
1.1       root     10718:              cleanup_deallocate
                   10719:                = build_modify_expr (current_class_decl, NOP_EXPR, integer_zero_node);
                   10720:              cleanup = tree_cons (NULL_TREE, cleanup,
                   10721:                                   build_tree_list (NULL_TREE, cleanup_deallocate));
                   10722: 
                   10723:              expand_decl_cleanup (allocated_this,
                   10724:                                   build (COND_EXPR, integer_type_node,
                   10725:                                          build (NE_EXPR, integer_type_node,
                   10726:                                                 allocated_this, integer_zero_node),
                   10727:                                          build_compound_expr (cleanup),
                   10728:                                          integer_zero_node));
                   10729:            }
                   10730:        }
                   10731:       else if (TREE_GETS_NEW (current_class_type))
                   10732:        /* Just check visibility here.  */
                   10733:        build_method_call (build1 (NOP_EXPR, TYPE_POINTER_TO (current_class_type), error_mark_node),
1.1.1.2   root     10734:                           ansi_opname[(int) NEW_EXPR],
1.1       root     10735:                           build_tree_list (NULL_TREE, integer_zero_node),
                   10736:                           NULL_TREE, LOOKUP_NORMAL);
                   10737: 
                   10738:       CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type) = abstract_virtuals;
                   10739: 
                   10740:       /* must keep the first insn safe.  */
1.1.1.4   root     10741:       head = get_insns ();
1.1       root     10742: 
                   10743:       /* this note will come up to the top with us.  */
                   10744:       mark = get_last_insn ();
                   10745: 
1.1.1.2   root     10746:       if (flag_this_is_variable > 0)
1.1       root     10747:        {
                   10748:          expand_start_cond (cond, 0);
                   10749:          expand_expr_stmt (thenclause);
                   10750:          if (flag_handle_exceptions == 2)
                   10751:            expand_assignment (allocated_this, current_class_decl, 0, 0);
                   10752:          expand_end_cond ();
                   10753:        }
                   10754: 
                   10755:       if (DECL_NAME (fndecl) == NULL_TREE
                   10756:          && TREE_CHAIN (DECL_ARGUMENTS (fndecl)) != NULL_TREE)
                   10757:        build_default_constructor (fndecl);
                   10758: 
                   10759:       /* Emit insns from `emit_base_init' which sets up virtual
                   10760:         function table pointer(s).  */
                   10761:       emit_insns (base_init_insns);
1.1.1.5 ! root     10762:       base_init_insns = NULL_RTX;
1.1       root     10763: 
                   10764:       /* This is where the body of the constructor begins.
                   10765:         If there were no insns in this function body, then the
                   10766:         last_parm_insn is also the last insn.
                   10767: 
                   10768:         If optimization is enabled, last_parm_insn may move, so
                   10769:         we don't hold on to it (across emit_base_init).  */
1.1.1.4   root     10770:       last_parm_insn = get_first_nonparm_insn ();
1.1.1.5 ! root     10771:       if (last_parm_insn == NULL_RTX) last_parm_insn = mark;
1.1.1.4   root     10772:       else last_parm_insn = previous_insn (last_parm_insn);
1.1       root     10773: 
                   10774:       if (mark != get_last_insn ())
                   10775:        reorder_insns (next_insn (mark), get_last_insn (), last_parm_insn);
                   10776: 
                   10777:       /* This is where the body of the constructor ends.  */
                   10778:       expand_label (ctor_label);
                   10779:       ctor_label = NULL_TREE;
                   10780:       if (flag_handle_exceptions == 2)
                   10781:        {
                   10782:          expand_assignment (allocated_this, integer_zero_node, 0, 0);
                   10783:          if (call_poplevel)
                   10784:            deactivate_exception_cleanups ();
                   10785:        }
                   10786: 
                   10787:       pop_implicit_try_blocks (NULL_TREE);
                   10788: 
                   10789:       if (call_poplevel)
                   10790:        {
                   10791:          expand_end_bindings (getdecls (), 1, 0);
                   10792:          poplevel (1, 1, 0);
                   10793:        }
                   10794: 
                   10795:       c_expand_return (current_class_decl);
                   10796: 
                   10797:       current_function_assigns_this = 0;
                   10798:       current_function_just_assigned_this = 0;
                   10799:     }
                   10800:   else if (IDENTIFIER_LENGTH (DECL_NAME (fndecl)) == 4
                   10801:           && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "main")
                   10802:           && DECL_CONTEXT (fndecl) == NULL_TREE)
                   10803:     {
                   10804:       /* Make it so that `main' always returns 0 by default.  */
                   10805: #ifdef VMS
                   10806:       c_expand_return (integer_one_node);
                   10807: #else
                   10808:       c_expand_return (integer_zero_node);
                   10809: #endif
                   10810:     }
1.1.1.5 ! root     10811:   else if (return_label != NULL_RTX
        !          10812:           && current_function_return_value == NULL_TREE
1.1       root     10813:           && ! DECL_NAME (DECL_RESULT (current_function_decl)))
                   10814:     no_return_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
                   10815: 
                   10816:   if (flag_gc)
                   10817:     expand_gc_prologue_and_epilogue ();
                   10818: 
                   10819:   /* That's the end of the vtable decl's life.  Need to mark it such
                   10820:      if doing stupid register allocation.
                   10821: 
                   10822:      Note that current_vtable_decl is really an INDIRECT_REF
                   10823:      on top of a VAR_DECL here.  */
                   10824:   if (obey_regdecls && current_vtable_decl)
                   10825:     use_variable (DECL_RTL (TREE_OPERAND (current_vtable_decl, 0)));
                   10826: 
                   10827:   /* If this function is supposed to return a value, ensure that
                   10828:      we do not fall into the cleanups by mistake.  The end of our
                   10829:      function will look like this:
                   10830: 
                   10831:        user code (may have return stmt somewhere)
                   10832:        goto no_return_label
                   10833:        cleanup_label:
                   10834:        cleanups
                   10835:        goto return_label
                   10836:        no_return_label:
                   10837:        NOTE_INSN_FUNCTION_END
                   10838:        return_label:
                   10839:        things for return
                   10840: 
                   10841:      If the user omits a return stmt in the USER CODE section, we
                   10842:      will have a control path which reaches NOTE_INSN_FUNCTION_END.
                   10843:      Otherwise, we won't.  */
                   10844:   if (no_return_label)
                   10845:     {
                   10846:       DECL_CONTEXT (no_return_label) = fndecl;
                   10847:       DECL_INITIAL (no_return_label) = error_mark_node;
                   10848:       DECL_SOURCE_FILE (no_return_label) = input_filename;
                   10849:       DECL_SOURCE_LINE (no_return_label) = lineno;
                   10850:       expand_goto (no_return_label);
                   10851:     }
                   10852: 
                   10853:   if (cleanup_label)
                   10854:     {
                   10855:       /* remove the binding contour which is used
                   10856:         to catch cleanup-generated temporaries.  */
                   10857:       expand_end_bindings (0, 0, 0);
                   10858:       poplevel (0, 0, 0);
                   10859:     }
                   10860: 
                   10861:   if (cleanup_label)
1.1.1.2   root     10862:     /* Emit label at beginning of cleanup code for parameters.  */
1.1       root     10863:     emit_label (cleanup_label);
                   10864: 
                   10865: #if 1
                   10866:   /* Cheap hack to get better code from GNU C++.  Remove when cse is fixed.  */
                   10867:   if (exception_throw_decl && sets_exception_throw_decl == 0)
                   10868:     expand_assignment (exception_throw_decl, integer_zero_node, 0, 0);
                   10869: #endif
                   10870: 
                   10871:   if (flag_handle_exceptions)
                   10872:     {
                   10873:       expand_end_try ();
                   10874:       expand_start_except (0, 0);
                   10875:       expand_end_except ();
                   10876:     }
                   10877:   expand_end_bindings (0, 0, 0);
                   10878: 
1.1.1.2   root     10879:   /* Get return value into register if that's where it's supposed to be.  */
1.1       root     10880:   if (original_result_rtx)
                   10881:     fixup_result_decl (DECL_RESULT (fndecl), original_result_rtx);
                   10882: 
                   10883:   /* Finish building code that will trigger warnings if users forget
                   10884:      to make their functions return values.  */
1.1.1.2   root     10885:   if (no_return_label || cleanup_label)
                   10886:     emit_jump (return_label);
1.1       root     10887:   if (no_return_label)
                   10888:     {
                   10889:       /* We don't need to call `expand_*_return' here because we
                   10890:         don't need any cleanups here--this path of code is only
                   10891:         for error checking purposes.  */
                   10892:       expand_label (no_return_label);
                   10893:     }
                   10894: 
                   10895:   /* reset scope for C++: if we were in the scope of a class,
                   10896:      then when we finish this function, we are not longer so.
                   10897:      This cannot be done until we know for sure that no more
                   10898:      class members will ever be referenced in this function
                   10899:      (i.e., calls to destructors).  */
                   10900:   if (current_class_name)
                   10901:     {
                   10902:       ctype = current_class_type;
                   10903:       popclass (1);
                   10904:     }
                   10905:   else
                   10906:     pop_memoized_context (1);
                   10907: 
                   10908:   /* Forget about all overloaded functions defined in
                   10909:      this scope which go away.  */
                   10910:   while (overloads_to_forget)
                   10911:     {
                   10912:       IDENTIFIER_GLOBAL_VALUE (TREE_PURPOSE (overloads_to_forget))
                   10913:        = TREE_VALUE (overloads_to_forget);
                   10914:       overloads_to_forget = TREE_CHAIN (overloads_to_forget);
                   10915:     }
                   10916: 
                   10917:   /* Generate rtl for function exit.  */
                   10918:   expand_function_end (input_filename, lineno);
                   10919: 
                   10920:   /* This must come after expand_function_end because cleanups might
                   10921:      have declarations (from inline functions) that need to go into
                   10922:      this function's blocks.  */
1.1.1.4   root     10923:   if (current_binding_level->parm_flag != 1)
                   10924:     my_friendly_abort (122);
1.1       root     10925:   poplevel (1, 0, 1);
                   10926: 
1.1.1.5 ! root     10927:   /* Must mark the RESULT_DECL as being in this function.  */
        !          10928:   DECL_CONTEXT (DECL_RESULT (fndecl)) = DECL_INITIAL (fndecl);
        !          10929: 
        !          10930:   /* Obey `register' declarations if `setjmp' is called in this fn.  */
        !          10931:   if (flag_traditional && current_function_calls_setjmp)
        !          10932:     setjmp_protect (DECL_INITIAL (fndecl));
        !          10933: 
1.1.1.4   root     10934:   /* Set the BLOCK_SUPERCONTEXT of the outermost function scope to point
                   10935:      to the FUNCTION_DECL node itself.  */
                   10936:   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
                   10937: 
1.1       root     10938:   /* So we can tell if jump_optimize sets it to 1.  */
                   10939:   can_reach_end = 0;
                   10940: 
                   10941:   /* ??? Compensate for Sun brain damage in dealing with data segments
                   10942:      of PIC code.  */
                   10943:   if (flag_pic
                   10944:       && (DECL_CONSTRUCTOR_P (fndecl)
                   10945:          || DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (fndecl)))
                   10946:       && CLASSTYPE_NEEDS_VIRTUAL_REINIT (TYPE_METHOD_BASETYPE (fntype)))
1.1.1.4   root     10947:     DECL_INLINE (fndecl) = 0;
1.1       root     10948: 
1.1.1.4   root     10949:   if (DECL_EXTERNAL (fndecl)
1.1       root     10950:       /* This function is just along for the ride.  If we can make
                   10951:         it inline, that's great.  Otherwise, just punt it.  */
1.1.1.4   root     10952:       && (DECL_INLINE (fndecl) == 0
1.1       root     10953:          || flag_no_inline
                   10954:          || function_cannot_inline_p (fndecl)))
                   10955:     {
                   10956:       extern int rtl_dump_and_exit;
                   10957:       int old_rtl_dump_and_exit = rtl_dump_and_exit;
1.1.1.4   root     10958:       int inline_spec = DECL_INLINE (fndecl);
1.1       root     10959: 
                   10960:       /* This throws away the code for FNDECL.  */
                   10961:       rtl_dump_and_exit = 1;
                   10962:       /* This throws away the memory of the code for FNDECL.  */
                   10963:       if (flag_no_inline)
1.1.1.4   root     10964:        DECL_INLINE (fndecl) = 0;
1.1       root     10965:       rest_of_compilation (fndecl);
                   10966:       rtl_dump_and_exit = old_rtl_dump_and_exit;
1.1.1.4   root     10967:       DECL_INLINE (fndecl) = inline_spec;
1.1       root     10968:     }
                   10969:   else
                   10970:     {
                   10971:       /* Run the optimizers and output the assembler code for this function.  */
                   10972:       rest_of_compilation (fndecl);
                   10973:     }
                   10974: 
                   10975:   if (ctype && TREE_ASM_WRITTEN (fndecl))
                   10976:     note_debug_info_needed (ctype);
                   10977: 
                   10978:   current_function_returns_null |= can_reach_end;
                   10979: 
                   10980:   /* Since we don't normally go through c_expand_return for constructors,
                   10981:      this normally gets the wrong value.
                   10982:      Also, named return values have their return codes emitted after
                   10983:      NOTE_INSN_FUNCTION_END, confusing jump.c.  */
1.1.1.5 ! root     10984:   if (DECL_CONSTRUCTOR_P (fndecl)
        !          10985:       || DECL_NAME (DECL_RESULT (fndecl)) != NULL_TREE)
1.1       root     10986:     current_function_returns_null = 0;
                   10987: 
                   10988:   if (TREE_THIS_VOLATILE (fndecl) && current_function_returns_null)
                   10989:     warning ("`volatile' function does return");
                   10990:   else if (warn_return_type && current_function_returns_null
1.1.1.4   root     10991:           && TYPE_MAIN_VARIANT (TREE_TYPE (fntype)) != void_type_node)
1.1       root     10992:     {
                   10993:       /* If this function returns non-void and control can drop through,
                   10994:         complain.  */
1.1.1.3   root     10995:       pedwarn ("control reaches end of non-void function");
1.1       root     10996:     }
                   10997:   /* With just -W, complain only if function returns both with
                   10998:      and without a value.  */
                   10999:   else if (extra_warnings
                   11000:           && current_function_returns_value && current_function_returns_null)
                   11001:     warning ("this function may return with or without a value");
                   11002: 
                   11003:   /* Free all the tree nodes making up this function.  */
                   11004:   /* Switch back to allocating nodes permanently
                   11005:      until we start another function.  */
                   11006:   permanent_allocation ();
                   11007: 
                   11008:   if (flag_cadillac)
                   11009:     cadillac_finish_function (fndecl);
                   11010: 
1.1.1.5 ! root     11011:   if (DECL_SAVED_INSNS (fndecl) == NULL_RTX)
1.1       root     11012:     {
                   11013:       /* Stop pointing to the local nodes about to be freed.  */
                   11014:       /* But DECL_INITIAL must remain nonzero so we know this
                   11015:         was an actual function definition.  */
                   11016:       DECL_INITIAL (fndecl) = error_mark_node;
                   11017:       if (! DECL_CONSTRUCTOR_P (fndecl)
                   11018:          || !TYPE_USES_VIRTUAL_BASECLASSES (TYPE_METHOD_BASETYPE (fntype)))
1.1.1.5 ! root     11019:        DECL_ARGUMENTS (fndecl) = NULL_TREE;
1.1       root     11020:     }
                   11021: 
                   11022:   /* Let the error reporting routines know that we're outside a function.  */
                   11023:   current_function_decl = NULL_TREE;
                   11024:   named_label_uses = NULL_TREE;
                   11025:   clear_anon_parm_name ();
                   11026: }
                   11027: 
                   11028: /* Create the FUNCTION_DECL for a function definition.
                   11029:    LINE1 is the line number that the definition absolutely begins on.
                   11030:    LINE2 is the line number that the name of the function appears on.
                   11031:    DECLSPECS and DECLARATOR are the parts of the declaration;
                   11032:    they describe the function's name and the type it returns,
                   11033:    but twisted together in a fashion that parallels the syntax of C.
                   11034: 
                   11035:    This function creates a binding context for the function body
                   11036:    as well as setting up the FUNCTION_DECL in current_function_decl.
                   11037: 
                   11038:    Returns a FUNCTION_DECL on success.
                   11039: 
                   11040:    If the DECLARATOR is not suitable for a function (it defines a datum
                   11041:    instead), we return 0, which tells yyparse to report a parse error.
                   11042: 
                   11043:    May return void_type_node indicating that this method is actually
                   11044:    a friend.  See grokfield for more details.
                   11045: 
                   11046:    Came here with a `.pushlevel' .
                   11047: 
                   11048:    DO NOT MAKE ANY CHANGES TO THIS CODE WITHOUT MAKING CORRESPONDING
                   11049:    CHANGES TO CODE IN `grokfield'.  */
                   11050: tree
                   11051: start_method (declspecs, declarator, raises)
                   11052:      tree declarator, declspecs, raises;
                   11053: {
                   11054:   tree fndecl = grokdeclarator (declarator, declspecs, MEMFUNCDEF, 0, raises);
                   11055: 
                   11056:   /* Something too ugly to handle.  */
1.1.1.5 ! root     11057:   if (fndecl == NULL_TREE)
        !          11058:     return NULL_TREE;
1.1       root     11059: 
                   11060:   /* Pass friends other than inline friend functions back.  */
1.1.1.4   root     11061:   if (TYPE_MAIN_VARIANT (fndecl) == void_type_node)
                   11062:     return fndecl;
1.1       root     11063: 
                   11064:   if (TREE_CODE (fndecl) != FUNCTION_DECL)
                   11065:     /* Not a function, tell parser to report parse error.  */
1.1.1.5 ! root     11066:     return NULL_TREE;
1.1       root     11067: 
                   11068:   if (DECL_IN_AGGR_P (fndecl))
                   11069:     {
                   11070:       if (IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (fndecl)) != current_class_type)
1.1.1.5 ! root     11071:        {
        !          11072:          if (DECL_CONTEXT (fndecl))
        !          11073:            error_with_decl (fndecl, "`%s' is already defined in class %s",
        !          11074:                             TYPE_NAME_STRING (DECL_CONTEXT (fndecl)));
        !          11075:        }
1.1       root     11076:       return void_type_node;
                   11077:     }
                   11078: 
                   11079:   /* If we're expanding a template, a function must be explicitly declared
                   11080:      inline if we're to compile it now.  If it isn't, we have to wait to see
                   11081:      whether it's needed, and whether an override exists.  */
                   11082:   if (flag_default_inline && !processing_template_defn)
1.1.1.4   root     11083:     DECL_INLINE (fndecl) = 1;
1.1       root     11084: 
                   11085:   /* We read in the parameters on the maybepermanent_obstack,
                   11086:      but we won't be getting back to them until after we
                   11087:      may have clobbered them.  So the call to preserve_data
                   11088:      will keep them safe.  */
                   11089:   preserve_data ();
                   11090: 
                   11091:   if (! DECL_FRIEND_P (fndecl))
                   11092:     {
                   11093:       if (DECL_CHAIN (fndecl) != NULL_TREE)
                   11094:        {
                   11095:          /* Need a fresh node here so that we don't get circularity
                   11096:             when we link these together.  If FNDECL was a friend, then
                   11097:             `pushdecl' does the right thing, which is nothing wrt its
                   11098:             current value of DECL_CHAIN.  */
                   11099:          fndecl = copy_node (fndecl);
                   11100:        }
1.1.1.5 ! root     11101:       if (TREE_CHAIN (fndecl))
        !          11102:        {
        !          11103:          fndecl = copy_node (fndecl);
        !          11104:          TREE_CHAIN (fndecl) = NULL_TREE;
        !          11105:        }
1.1       root     11106: 
                   11107:       if (DECL_CONSTRUCTOR_P (fndecl))
                   11108:        grok_ctor_properties (current_class_type, fndecl);
                   11109:       else if (IDENTIFIER_OPNAME_P (DECL_NAME (fndecl)))
1.1.1.4   root     11110:        grok_op_properties (fndecl, DECL_VIRTUAL_P (fndecl));
1.1       root     11111:     }
                   11112: 
1.1.1.5 ! root     11113:   finish_decl (fndecl, NULL_TREE, NULL_TREE, 0);
1.1       root     11114: 
                   11115:   /* Make a place for the parms */
                   11116:   pushlevel (0);
                   11117:   current_binding_level->parm_flag = 1;
                   11118:   
                   11119:   DECL_IN_AGGR_P (fndecl) = 1;
                   11120:   return fndecl;
                   11121: }
                   11122: 
                   11123: /* Go through the motions of finishing a function definition.
                   11124:    We don't compile this method until after the whole class has
                   11125:    been processed.
                   11126: 
                   11127:    FINISH_METHOD must return something that looks as though it
                   11128:    came from GROKFIELD (since we are defining a method, after all).
                   11129: 
                   11130:    This is called after parsing the body of the function definition.
                   11131:    STMTS is the chain of statements that makes up the function body.
                   11132: 
                   11133:    DECL is the ..._DECL that `start_method' provided.  */
                   11134: 
                   11135: tree
                   11136: finish_method (decl)
                   11137:      tree decl;
                   11138: {
                   11139:   register tree fndecl = decl;
                   11140:   tree old_initial;
1.1.1.4   root     11141:   tree context = DECL_CONTEXT (fndecl);
1.1       root     11142: 
                   11143:   register tree link;
                   11144: 
1.1.1.4   root     11145:   if (TYPE_MAIN_VARIANT (decl) == void_type_node)
1.1       root     11146:     return decl;
                   11147: 
                   11148: #ifdef DEBUG_CP_BINDING_LEVELS
                   11149:   indent_to (stderr, debug_bindings_indentation);
                   11150:   fprintf (stderr, "finish_method");
                   11151:   debug_bindings_indentation += 4;
                   11152: #endif
                   11153: 
                   11154:   old_initial = DECL_INITIAL (fndecl);
                   11155: 
                   11156:   /* Undo the level for the parms (from start_method).
                   11157:      This is like poplevel, but it causes nothing to be
                   11158:      saved.  Saving information here confuses symbol-table
                   11159:      output routines.  Besides, this information will
                   11160:      be correctly output when this method is actually
                   11161:      compiled.  */
                   11162: 
                   11163:   /* Clear out the meanings of the local variables of this level;
                   11164:      also record in each decl which block it belongs to.  */
                   11165: 
                   11166:   for (link = current_binding_level->names; link; link = TREE_CHAIN (link))
                   11167:     {
1.1.1.5 ! root     11168:       if (DECL_NAME (link) != NULL_TREE)
1.1       root     11169:        IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = 0;
1.1.1.4   root     11170:       my_friendly_assert (TREE_CODE (link) != FUNCTION_DECL, 163);
1.1.1.5 ! root     11171:       DECL_CONTEXT (link) = NULL_TREE;
1.1       root     11172:     }
                   11173: 
                   11174:   /* Restore all name-meanings of the outer levels
                   11175:      that were shadowed by this level.  */
                   11176: 
                   11177:   for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
                   11178:       IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
                   11179:   for (link = current_binding_level->class_shadowed;
                   11180:        link; link = TREE_CHAIN (link))
                   11181:     IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
                   11182:   for (link = current_binding_level->type_shadowed;
                   11183:        link; link = TREE_CHAIN (link))
                   11184:     IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
                   11185: 
1.1.1.5 ! root     11186:   GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level,
        !          11187:                      (HOST_WIDE_INT) current_binding_level->level_chain,
1.1       root     11188:                      current_binding_level->parm_flag,
                   11189:                      current_binding_level->keep,
                   11190:                      current_binding_level->tag_transparent);
                   11191: 
                   11192:   pop_binding_level ();
                   11193: 
                   11194:   DECL_INITIAL (fndecl) = old_initial;
1.1.1.4   root     11195: #if 0
                   11196:   /* tiemann would like this, but is causes String.cc to not compile. */
                   11197:   if (DECL_FRIEND_P (fndecl) || DECL_CONTEXT (fndecl) != current_class_type)
                   11198: #else
1.1       root     11199:   if (DECL_FRIEND_P (fndecl))
1.1.1.4   root     11200: #endif
1.1       root     11201:     {
                   11202:       CLASSTYPE_INLINE_FRIENDS (current_class_type)
                   11203:        = tree_cons (NULL_TREE, fndecl, CLASSTYPE_INLINE_FRIENDS (current_class_type));
                   11204:       decl = void_type_node;
                   11205:     }
1.1.1.4   root     11206: #if 0
                   11207:   /* Work in progress, 9/17/92. */
                   11208:   else if (context != current_class_type
                   11209:           && TREE_CHAIN (context) != NULL_TREE
                   11210:           && !DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl)))
                   11211:     {
                   11212:       /* Don't allow them to declare a function like this:
                   11213:        class A {
                   11214:        public:
                   11215:          class B {
                   11216:          public:
                   11217:            int f();
                   11218:          };
                   11219:          int B::f() {}
                   11220:        };
                   11221: 
                   11222:        Note we can get in here if it's a friend (in which case we'll
                   11223:        avoid lots of nasty cruft), or it's a destructor.  Compensate.
                   11224:       */
                   11225:       tree tmp = DECL_ARGUMENTS (TREE_CHAIN (context));
                   11226:       if (tmp
                   11227:          && TREE_CODE (tmp) == IDENTIFIER_NODE
                   11228:          && TREE_CHAIN (IDENTIFIER_GLOBAL_VALUE (tmp))
                   11229:          && TREE_CODE (TREE_CHAIN (IDENTIFIER_GLOBAL_VALUE (tmp))) == TYPE_DECL)
                   11230:        {
                   11231:          error_with_decl (decl,
                   11232:                           "qualified name used in declaration of `%s'");
                   11233:          /* Make this node virtually unusable in the end.  */
                   11234:          TREE_CHAIN (decl) = NULL_TREE;
                   11235:        }
                   11236:     }
                   11237: #endif
1.1       root     11238: 
                   11239: #ifdef DEBUG_CP_BINDING_LEVELS
                   11240:   debug_bindings_indentation -= 4;
                   11241: #endif
                   11242: 
                   11243:   return decl;
                   11244: }
                   11245: 
                   11246: /* Called when a new struct TYPE is defined.
                   11247:    If this structure or union completes the type of any previous
                   11248:    variable declaration, lay it out and output its rtl.  */
                   11249: 
                   11250: void
                   11251: hack_incomplete_structures (type)
                   11252:      tree type;
                   11253: {
                   11254:   tree decl;
                   11255: 
                   11256:   if (current_binding_level->n_incomplete == 0)
                   11257:     return;
                   11258: 
                   11259:   if (!type) /* Don't do this for class templates.  */
                   11260:     return;
                   11261: 
                   11262:   for (decl = current_binding_level->names; decl; decl = TREE_CHAIN (decl))
                   11263:     if (TREE_TYPE (decl) == type
                   11264:        || (TREE_TYPE (decl)
                   11265:            && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
                   11266:            && TREE_TYPE (TREE_TYPE (decl)) == type))
                   11267:       {
                   11268:        if (TREE_CODE (decl) == TYPE_DECL)
                   11269:          layout_type (TREE_TYPE (decl));
                   11270:        else
                   11271:          {
                   11272:            int toplevel = global_binding_level == current_binding_level;
1.1.1.4   root     11273:            if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
                   11274:                && TREE_TYPE (TREE_TYPE (decl)) == type)
                   11275:              layout_type (TREE_TYPE (decl));
1.1       root     11276:            layout_decl (decl, 0);
1.1.1.5 ! root     11277:            rest_of_decl_compilation (decl, NULL_PTR, toplevel, 0);
1.1       root     11278:            if (! toplevel)
                   11279:              {
                   11280:                expand_decl (decl);
                   11281:                expand_decl_cleanup (decl, maybe_build_cleanup (decl));
                   11282:                expand_decl_init (decl);
                   11283:              }
                   11284:          }
1.1.1.4   root     11285:        my_friendly_assert (current_binding_level->n_incomplete > 0, 164);
1.1       root     11286:        --current_binding_level->n_incomplete;
                   11287:       }
                   11288: }
                   11289: 
                   11290: /* Nonzero if presently building a cleanup.  Needed because
                   11291:    SAVE_EXPRs are not the right things to use inside of cleanups.
                   11292:    They are only ever evaluated once, where the cleanup
                   11293:    might be evaluated several times.  In this case, a later evaluation
                   11294:    of the cleanup might fill in the SAVE_EXPR_RTL, and it will
                   11295:    not be valid for an earlier cleanup.  */
                   11296: 
                   11297: int building_cleanup;
                   11298: 
                   11299: /* If DECL is of a type which needs a cleanup, build that cleanup here.
                   11300:    We don't build cleanups if just going for syntax checking, since
                   11301:    fixup_cleanups does not know how to not handle them.
                   11302: 
                   11303:    Don't build these on the momentary obstack; they must live
                   11304:    the life of the binding contour.  */
                   11305: tree
                   11306: maybe_build_cleanup (decl)
                   11307:      tree decl;
                   11308: {
                   11309:   tree type = TREE_TYPE (decl);
                   11310:   if (TYPE_NEEDS_DESTRUCTOR (type))
                   11311:     {
                   11312:       int temp = 0, flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR;
                   11313:       tree rval;
                   11314:       int old_building_cleanup = building_cleanup;
                   11315:       building_cleanup = 1;
                   11316: 
                   11317:       if (TREE_CODE (decl) != PARM_DECL)
                   11318:        temp = suspend_momentary ();
                   11319: 
                   11320:       if (TREE_CODE (type) == ARRAY_TYPE)
                   11321:        rval = decl;
                   11322:       else
                   11323:        {
                   11324:          mark_addressable (decl);
                   11325:          rval = build_unary_op (ADDR_EXPR, decl, 0);
                   11326:        }
                   11327: 
                   11328:       /* Optimize for space over speed here.  */
                   11329:       if (! TYPE_USES_VIRTUAL_BASECLASSES (type)
                   11330:          || flag_expensive_optimizations)
                   11331:        flags |= LOOKUP_NONVIRTUAL;
                   11332: 
                   11333:       /* Use TYPE_MAIN_VARIANT so we don't get a warning about
                   11334:         calling delete on a `const' variable.  */
                   11335:       if (TYPE_READONLY (TREE_TYPE (TREE_TYPE (rval))))
                   11336:        rval = build1 (NOP_EXPR, TYPE_POINTER_TO (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (rval)))), rval);
                   11337: 
                   11338:       rval = build_delete (TREE_TYPE (rval), rval, integer_two_node, flags, 0, 0);
                   11339: 
                   11340:       if (TYPE_USES_VIRTUAL_BASECLASSES (type)
                   11341:          && ! TYPE_HAS_DESTRUCTOR (type))
                   11342:        rval = build_compound_expr (tree_cons (NULL_TREE, rval,
                   11343:                                               build_tree_list (NULL_TREE, build_vbase_delete (type, decl))));
                   11344: 
                   11345:       current_binding_level->have_cleanups = 1;
                   11346:       current_binding_level->more_exceptions_ok = 0;
                   11347: 
                   11348:       if (TREE_CODE (decl) != PARM_DECL)
                   11349:        resume_momentary (temp);
                   11350: 
                   11351:       building_cleanup = old_building_cleanup;
                   11352: 
                   11353:       return rval;
                   11354:     }
                   11355:   return 0;
                   11356: }
                   11357: 
                   11358: /* Expand a C++ expression at the statement level.
                   11359:    This is needed to ferret out nodes which have UNKNOWN_TYPE.
                   11360:    The C++ type checker should get all of these out when
                   11361:    expressions are combined with other, type-providing, expressions,
                   11362:    leaving only orphan expressions, such as:
                   11363: 
                   11364:    &class::bar;                / / takes its address, but does nothing with it.
                   11365: 
                   11366:    */
                   11367: void
                   11368: cplus_expand_expr_stmt (exp)
                   11369:      tree exp;
                   11370: {
                   11371:   if (TREE_TYPE (exp) == unknown_type_node)
                   11372:     {
                   11373:       if (TREE_CODE (exp) == ADDR_EXPR || TREE_CODE (exp) == TREE_LIST)
                   11374:        error ("address of overloaded function with no contextual type information");
                   11375:       else if (TREE_CODE (exp) == COMPONENT_REF)
                   11376:        warning ("useless reference to a member function name, did you forget the ()?");
                   11377:     }
                   11378:   else
                   11379:     {
                   11380:       int remove_implicit_immediately = 0;
                   11381: 
                   11382:       if (TREE_CODE (exp) == FUNCTION_DECL)
1.1.1.2   root     11383:        {
                   11384:          warning_with_decl (exp, "reference, not call, to function `%s'");
                   11385:          warning ("at this point in file");
                   11386:        }
1.1       root     11387:       if (TREE_RAISES (exp))
                   11388:        {
1.1.1.4   root     11389:          my_friendly_assert (flag_handle_exceptions, 165);
1.1       root     11390:          if (flag_handle_exceptions == 2)
                   11391:            {
                   11392:              if (! current_binding_level->more_exceptions_ok)
                   11393:                {
                   11394:                  extern struct nesting *nesting_stack, *block_stack;
                   11395: 
                   11396:                  remove_implicit_immediately
                   11397:                    = (nesting_stack != block_stack);
                   11398:                  cplus_expand_start_try (1);
                   11399:                }
                   11400:              current_binding_level->have_exceptions = 1;
                   11401:            }
                   11402:        }
                   11403: 
                   11404:       expand_expr_stmt (break_out_cleanups (exp));
                   11405: 
                   11406:       if (remove_implicit_immediately)
                   11407:        pop_implicit_try_blocks (NULL_TREE);
                   11408:     }
                   11409: 
                   11410:   /* Clean up any pending cleanups.  This happens when a function call
                   11411:      returns a cleanup-needing value that nobody uses.  */
                   11412:   expand_cleanups_to (NULL_TREE);
                   11413: }
                   11414: 
                   11415: /* When a stmt has been parsed, this function is called.
                   11416: 
                   11417:    Currently, this function only does something within a
                   11418:    constructor's scope: if a stmt has just assigned to this,
                   11419:    and we are in a derived class, we call `emit_base_init'.  */
                   11420: 
                   11421: void
                   11422: finish_stmt ()
                   11423: {
                   11424:   extern struct nesting *cond_stack, *loop_stack, *case_stack;
                   11425: 
                   11426:   
                   11427:   if (current_function_assigns_this
                   11428:       || ! current_function_just_assigned_this)
                   11429:     return;
                   11430:   if (DECL_CONSTRUCTOR_P (current_function_decl))
                   11431:     {
                   11432:       /* Constructors must wait until we are out of control
                   11433:         zones before calling base constructors.  */
                   11434:       if (cond_stack || loop_stack || case_stack)
                   11435:        return;
                   11436:       emit_insns (base_init_insns);
                   11437:       check_base_init (current_class_type);
                   11438:     }
                   11439:   current_function_assigns_this = 1;
                   11440: 
                   11441:   if (flag_cadillac)
                   11442:     cadillac_finish_stmt ();
                   11443: }
                   11444: 
                   11445: void
                   11446: pop_implicit_try_blocks (decl)
                   11447:      tree decl;
                   11448: {
                   11449:   if (decl)
                   11450:     {
1.1.1.4   root     11451:       my_friendly_assert (current_binding_level->parm_flag == 3, 166);
1.1       root     11452:       current_binding_level->names = TREE_CHAIN (decl);
                   11453:     }
                   11454: 
                   11455:   while (current_binding_level->parm_flag == 3)
                   11456:     {
                   11457:       tree name = get_identifier ("(compiler error)");
                   11458:       tree orig_ex_type = current_exception_type;
                   11459:       tree orig_ex_decl = current_exception_decl;
                   11460:       tree orig_ex_obj = current_exception_object;
                   11461:       tree decl = cplus_expand_end_try (2);
                   11462: 
                   11463:       /* @@ It would be nice to make all these point
                   11464:         to exactly the same handler.  */
                   11465:       /* Start hidden EXCEPT.  */
                   11466:       cplus_expand_start_except (name, decl);
                   11467:       /* reraise ALL.  */
                   11468:       cplus_expand_reraise (NULL_TREE);
                   11469:       current_exception_type = orig_ex_type;
                   11470:       current_exception_decl = orig_ex_decl;
                   11471:       current_exception_object = orig_ex_obj;
                   11472:       /* This will reraise for us.  */
                   11473:       cplus_expand_end_except (error_mark_node);
                   11474:     }
                   11475: 
                   11476:   if (decl)
                   11477:     {
                   11478:       TREE_CHAIN (decl) = current_binding_level->names;
                   11479:       current_binding_level->names = decl;
                   11480:     }
                   11481: }
                   11482: 
                   11483: /* Push a cleanup onto the current binding contour that will cause
                   11484:    ADDR to be cleaned up, in the case that an exception propagates
                   11485:    through its binding contour.  */
                   11486: 
                   11487: void
                   11488: push_exception_cleanup (addr)
                   11489:      tree addr;
                   11490: {
                   11491:   tree decl = build_decl (VAR_DECL, get_identifier (EXCEPTION_CLEANUP_NAME), ptr_type_node);
                   11492:   tree cleanup;
                   11493: 
                   11494:   decl = pushdecl (decl);
1.1.1.4   root     11495:   DECL_REGISTER (decl) = 1;
1.1       root     11496:   store_init_value (decl, addr);
                   11497:   expand_decl (decl);
                   11498:   expand_decl_init (decl);
                   11499: 
                   11500:   cleanup = build (COND_EXPR, integer_type_node,
                   11501:                   build (NE_EXPR, integer_type_node,
                   11502:                          decl, integer_zero_node),
                   11503:                   build_delete (TREE_TYPE (addr), decl,
                   11504:                                 lookup_name (in_charge_identifier, 0),
                   11505:                                 LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0, 0),
                   11506:                   integer_zero_node);
                   11507:   expand_decl_cleanup (decl, cleanup);
                   11508: }
                   11509: 
                   11510: /* For each binding contour, emit code that deactivates the
                   11511:    exception cleanups.  All other cleanups are left as they were.  */
                   11512: 
                   11513: static void
                   11514: deactivate_exception_cleanups ()
                   11515: {
                   11516:   struct binding_level *b = current_binding_level;
                   11517:   tree xyzzy = get_identifier (EXCEPTION_CLEANUP_NAME);
                   11518:   while (b != class_binding_level)
                   11519:     {
                   11520:       if (b->parm_flag == 3)
                   11521:        {
                   11522:          tree decls = b->names;
                   11523:          while (decls)
                   11524:            {
                   11525:              if (DECL_NAME (decls) == xyzzy)
                   11526:                expand_assignment (decls, integer_zero_node, 0, 0);
                   11527:              decls = TREE_CHAIN (decls);
                   11528:            }
                   11529:        }
                   11530:       b = b->level_chain;
                   11531:     }
                   11532: }
1.1.1.4   root     11533: 
                   11534: /* Change a static member function definition into a FUNCTION_TYPE, instead
                   11535:    of the METHOD_TYPE that we create when it's originally parsed.  */
1.1.1.5 ! root     11536: void
1.1.1.4   root     11537: revert_static_member_fn (fn, decl, argtypes)
                   11538:      tree *fn, *decl, *argtypes;
                   11539: {
                   11540:   tree tmp, function = *fn;
                   11541: 
                   11542:   *argtypes = TREE_CHAIN (*argtypes);
                   11543:   tmp = build_function_type (TREE_TYPE (function), *argtypes);
                   11544:   tmp = build_type_variant (tmp, TYPE_READONLY (function),
                   11545:                            TYPE_VOLATILE (function));
                   11546:   tmp = build_exception_variant (TYPE_METHOD_BASETYPE (function), tmp,
                   11547:                                 TYPE_RAISES_EXCEPTIONS (function));
                   11548:   TREE_TYPE (*decl) = tmp;
                   11549:   *fn = tmp;
                   11550:   DECL_STATIC_FUNCTION_P (*decl) = 1;
                   11551: }

unix.superglobalmegacorp.com

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