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

1.1     ! root        1: /* Process declarations and variables for C compiler.
        !             2:    Copyright (C) 1988, 1992, 1993 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of GNU CC.
        !             5: 
        !             6: GNU CC is free software; you can redistribute it and/or modify
        !             7: it under the terms of the GNU General Public License as published by
        !             8: the Free Software Foundation; either version 2, or (at your option)
        !             9: any later version.
        !            10: 
        !            11: GNU CC is distributed in the hope that it will be useful,
        !            12: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            14: GNU General Public License for more details.
        !            15: 
        !            16: You should have received a copy of the GNU General Public License
        !            17: along with GNU CC; see the file COPYING.  If not, write to
        !            18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            19: 
        !            20: 
        !            21: /* Process declarations and symbol lookup for C front end.
        !            22:    Also constructs types; the standard scalar types at initialization,
        !            23:    and structure, union, array and enum types when they are declared.  */
        !            24: 
        !            25: /* ??? not all decl nodes are given the most useful possible
        !            26:    line numbers.  For example, the CONST_DECLs for enum values.  */
        !            27: 
        !            28: #include "config.h"
        !            29: #include "tree.h"
        !            30: #include "flags.h"
        !            31: #include "c-tree.h"
        !            32: #include "c-lex.h"
        !            33: #include <stdio.h>
        !            34: 
        !            35: /* In grokdeclarator, distinguish syntactic contexts of declarators.  */
        !            36: enum decl_context
        !            37: { NORMAL,                      /* Ordinary declaration */
        !            38:   FUNCDEF,                     /* Function definition */
        !            39:   PARM,                                /* Declaration of parm before function body */
        !            40:   FIELD,                       /* Declaration inside struct or union */
        !            41:   BITFIELD,                    /* Likewise but with specified width */
        !            42:   TYPENAME};                   /* Typename (inside cast or sizeof)  */
        !            43: 
        !            44: #ifndef CHAR_TYPE_SIZE
        !            45: #define CHAR_TYPE_SIZE BITS_PER_UNIT
        !            46: #endif
        !            47: 
        !            48: #ifndef SHORT_TYPE_SIZE
        !            49: #define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2))
        !            50: #endif
        !            51: 
        !            52: #ifndef INT_TYPE_SIZE
        !            53: #define INT_TYPE_SIZE BITS_PER_WORD
        !            54: #endif
        !            55: 
        !            56: #ifndef LONG_TYPE_SIZE
        !            57: #define LONG_TYPE_SIZE BITS_PER_WORD
        !            58: #endif
        !            59: 
        !            60: #ifndef LONG_LONG_TYPE_SIZE
        !            61: #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
        !            62: #endif
        !            63: 
        !            64: #ifndef WCHAR_UNSIGNED
        !            65: #define WCHAR_UNSIGNED 0
        !            66: #endif
        !            67: 
        !            68: #ifndef FLOAT_TYPE_SIZE
        !            69: #define FLOAT_TYPE_SIZE BITS_PER_WORD
        !            70: #endif
        !            71: 
        !            72: #ifndef DOUBLE_TYPE_SIZE
        !            73: #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
        !            74: #endif
        !            75: 
        !            76: #ifndef LONG_DOUBLE_TYPE_SIZE
        !            77: #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
        !            78: #endif
        !            79: 
        !            80: /* We let tm.h override the types used here, to handle trivial differences
        !            81:    such as the choice of unsigned int or long unsigned int for size_t.
        !            82:    When machines start needing nontrivial differences in the size type,
        !            83:    it would be best to do something here to figure out automatically
        !            84:    from other information what type to use.  */
        !            85: 
        !            86: #ifndef SIZE_TYPE
        !            87: #define SIZE_TYPE "long unsigned int"
        !            88: #endif
        !            89: 
        !            90: #ifndef PTRDIFF_TYPE
        !            91: #define PTRDIFF_TYPE "long int"
        !            92: #endif
        !            93: 
        !            94: #ifndef WCHAR_TYPE
        !            95: #define WCHAR_TYPE "int"
        !            96: #endif
        !            97: 
        !            98: /* a node which has tree code ERROR_MARK, and whose type is itself.
        !            99:    All erroneous expressions are replaced with this node.  All functions
        !           100:    that accept nodes as arguments should avoid generating error messages
        !           101:    if this node is one of the arguments, since it is undesirable to get
        !           102:    multiple error messages from one error in the input.  */
        !           103: 
        !           104: tree error_mark_node;
        !           105: 
        !           106: /* INTEGER_TYPE and REAL_TYPE nodes for the standard data types */
        !           107: 
        !           108: tree short_integer_type_node;
        !           109: tree integer_type_node;
        !           110: tree long_integer_type_node;
        !           111: tree long_long_integer_type_node;
        !           112: 
        !           113: tree short_unsigned_type_node;
        !           114: tree unsigned_type_node;
        !           115: tree long_unsigned_type_node;
        !           116: tree long_long_unsigned_type_node;
        !           117: 
        !           118: tree ptrdiff_type_node;
        !           119: 
        !           120: tree unsigned_char_type_node;
        !           121: tree signed_char_type_node;
        !           122: tree char_type_node;
        !           123: tree wchar_type_node;
        !           124: tree signed_wchar_type_node;
        !           125: tree unsigned_wchar_type_node;
        !           126: 
        !           127: tree float_type_node;
        !           128: tree double_type_node;
        !           129: tree long_double_type_node;
        !           130: 
        !           131: tree complex_integer_type_node;
        !           132: tree complex_float_type_node;
        !           133: tree complex_double_type_node;
        !           134: tree complex_long_double_type_node;
        !           135: 
        !           136: tree intQI_type_node;
        !           137: tree intHI_type_node;
        !           138: tree intSI_type_node;
        !           139: tree intDI_type_node;
        !           140: 
        !           141: tree unsigned_intQI_type_node;
        !           142: tree unsigned_intHI_type_node;
        !           143: tree unsigned_intSI_type_node;
        !           144: tree unsigned_intDI_type_node;
        !           145: 
        !           146: /* a VOID_TYPE node.  */
        !           147: 
        !           148: tree void_type_node;
        !           149: 
        !           150: /* Nodes for types `void *' and `const void *'.  */
        !           151: 
        !           152: tree ptr_type_node, const_ptr_type_node;
        !           153: 
        !           154: /* Nodes for types `char *' and `const char *'.  */
        !           155: 
        !           156: tree string_type_node, const_string_type_node;
        !           157: 
        !           158: /* Type `char[SOMENUMBER]'.
        !           159:    Used when an array of char is needed and the size is irrelevant.  */
        !           160: 
        !           161: tree char_array_type_node;
        !           162: 
        !           163: /* Type `int[SOMENUMBER]' or something like it.
        !           164:    Used when an array of int needed and the size is irrelevant.  */
        !           165: 
        !           166: tree int_array_type_node;
        !           167: 
        !           168: /* Type `wchar_t[SOMENUMBER]' or something like it.
        !           169:    Used when a wide string literal is created.  */
        !           170: 
        !           171: tree wchar_array_type_node;
        !           172: 
        !           173: /* type `int ()' -- used for implicit declaration of functions.  */
        !           174: 
        !           175: tree default_function_type;
        !           176: 
        !           177: /* function types `double (double)' and `double (double, double)', etc.  */
        !           178: 
        !           179: tree double_ftype_double, double_ftype_double_double;
        !           180: tree int_ftype_int, long_ftype_long;
        !           181: 
        !           182: /* Function type `void (void *, void *, int)' and similar ones */
        !           183: 
        !           184: tree void_ftype_ptr_ptr_int, int_ftype_ptr_ptr_int, void_ftype_ptr_int_int;
        !           185: 
        !           186: /* Function type `char *(char *, char *)' and similar ones */
        !           187: tree string_ftype_ptr_ptr, int_ftype_string_string;
        !           188: 
        !           189: /* Function type `int (const void *, const void *, size_t)' */
        !           190: tree int_ftype_cptr_cptr_sizet;
        !           191: 
        !           192: /* Two expressions that are constants with value zero.
        !           193:    The first is of type `int', the second of type `void *'.  */
        !           194: 
        !           195: tree integer_zero_node;
        !           196: tree null_pointer_node;
        !           197: 
        !           198: /* A node for the integer constant 1.  */
        !           199: 
        !           200: tree integer_one_node;
        !           201: 
        !           202: /* Nonzero if we have seen an invalid cross reference
        !           203:    to a struct, union, or enum, but not yet printed the message.  */
        !           204: 
        !           205: tree pending_invalid_xref;
        !           206: /* File and line to appear in the eventual error message.  */
        !           207: char *pending_invalid_xref_file;
        !           208: int pending_invalid_xref_line;
        !           209: 
        !           210: /* While defining an enum type, this is 1 plus the last enumerator
        !           211:    constant value.  Note that will do not have to save this or `enum_overflow'
        !           212:    around nested function definition since such a definition could only
        !           213:    occur in an enum value expression and we don't use these variables in
        !           214:    that case.  */
        !           215: 
        !           216: static tree enum_next_value;
        !           217: 
        !           218: /* Nonzero means that there was overflow computing enum_next_value.  */
        !           219: 
        !           220: static int enum_overflow;
        !           221: 
        !           222: /* Parsing a function declarator leaves a list of parameter names
        !           223:    or a chain or parameter decls here.  */
        !           224: 
        !           225: static tree last_function_parms;
        !           226: 
        !           227: /* Parsing a function declarator leaves here a chain of structure
        !           228:    and enum types declared in the parmlist.  */
        !           229: 
        !           230: static tree last_function_parm_tags;
        !           231: 
        !           232: /* After parsing the declarator that starts a function definition,
        !           233:    `start_function' puts here the list of parameter names or chain of decls.
        !           234:    `store_parm_decls' finds it here.  */
        !           235: 
        !           236: static tree current_function_parms;
        !           237: 
        !           238: /* Similar, for last_function_parm_tags.  */
        !           239: static tree current_function_parm_tags;
        !           240: 
        !           241: /* Similar, for the file and line that the prototype came from if this is
        !           242:    an old-style definition.  */
        !           243: static char *current_function_prototype_file;
        !           244: static int current_function_prototype_line;
        !           245: 
        !           246: /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
        !           247:    that have names.  Here so we can clear out their names' definitions
        !           248:    at the end of the function.  */
        !           249: 
        !           250: static tree named_labels;
        !           251: 
        !           252: /* A list of LABEL_DECLs from outer contexts that are currently shadowed.  */
        !           253: 
        !           254: static tree shadowed_labels;
        !           255: 
        !           256: /* Nonzero when store_parm_decls is called indicates a varargs function.
        !           257:    Value not meaningful after store_parm_decls.  */
        !           258: 
        !           259: static int c_function_varargs;
        !           260: 
        !           261: /* The FUNCTION_DECL for the function currently being compiled,
        !           262:    or 0 if between functions.  */
        !           263: tree current_function_decl;
        !           264: 
        !           265: /* Set to 0 at beginning of a function definition, set to 1 if
        !           266:    a return statement that specifies a return value is seen.  */
        !           267: 
        !           268: int current_function_returns_value;
        !           269: 
        !           270: /* Set to 0 at beginning of a function definition, set to 1 if
        !           271:    a return statement with no argument is seen.  */
        !           272: 
        !           273: int current_function_returns_null;
        !           274: 
        !           275: /* Set to nonzero by `grokdeclarator' for a function
        !           276:    whose return type is defaulted, if warnings for this are desired.  */
        !           277: 
        !           278: static int warn_about_return_type;
        !           279: 
        !           280: /* Nonzero when starting a function declared `extern inline'.  */
        !           281: 
        !           282: static int current_extern_inline;
        !           283: 
        !           284: /* For each binding contour we allocate a binding_level structure
        !           285:  * which records the names defined in that contour.
        !           286:  * Contours include:
        !           287:  *  0) the global one
        !           288:  *  1) one for each function definition,
        !           289:  *     where internal declarations of the parameters appear.
        !           290:  *  2) one for each compound statement,
        !           291:  *     to record its declarations.
        !           292:  *
        !           293:  * The current meaning of a name can be found by searching the levels from
        !           294:  * the current one out to the global one.
        !           295:  */
        !           296: 
        !           297: /* Note that the information in the `names' component of the global contour
        !           298:    is duplicated in the IDENTIFIER_GLOBAL_VALUEs of all identifiers.  */
        !           299: 
        !           300: struct binding_level
        !           301:   {
        !           302:     /* A chain of _DECL nodes for all variables, constants, functions,
        !           303:        and typedef types.  These are in the reverse of the order supplied.
        !           304:      */
        !           305:     tree names;
        !           306: 
        !           307:     /* A list of structure, union and enum definitions,
        !           308:      * for looking up tag names.
        !           309:      * It is a chain of TREE_LIST nodes, each of whose TREE_PURPOSE is a name,
        !           310:      * or NULL_TREE; and whose TREE_VALUE is a RECORD_TYPE, UNION_TYPE,
        !           311:      * or ENUMERAL_TYPE node.
        !           312:      */
        !           313:     tree tags;
        !           314: 
        !           315:     /* For each level, a list of shadowed outer-level local definitions
        !           316:        to be restored when this level is popped.
        !           317:        Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and
        !           318:        whose TREE_VALUE is its old definition (a kind of ..._DECL node).  */
        !           319:     tree shadowed;
        !           320: 
        !           321:     /* For each level (except not the global one),
        !           322:        a chain of BLOCK nodes for all the levels
        !           323:        that were entered and exited one level down.  */
        !           324:     tree blocks;
        !           325: 
        !           326:     /* The BLOCK node for this level, if one has been preallocated.
        !           327:        If 0, the BLOCK is allocated (if needed) when the level is popped.  */
        !           328:     tree this_block;
        !           329: 
        !           330:     /* The binding level which this one is contained in (inherits from).  */
        !           331:     struct binding_level *level_chain;
        !           332: 
        !           333:     /* Nonzero for the level that holds the parameters of a function.  */
        !           334:     char parm_flag;
        !           335: 
        !           336:     /* Nonzero if this level "doesn't exist" for tags.  */
        !           337:     char tag_transparent;
        !           338: 
        !           339:     /* Nonzero if sublevels of this level "don't exist" for tags.
        !           340:        This is set in the parm level of a function definition
        !           341:        while reading the function body, so that the outermost block
        !           342:        of the function body will be tag-transparent.  */
        !           343:     char subblocks_tag_transparent;
        !           344: 
        !           345:     /* Nonzero means make a BLOCK for this level regardless of all else.  */
        !           346:     char keep;
        !           347: 
        !           348:     /* Nonzero means make a BLOCK if this level has any subblocks.  */
        !           349:     char keep_if_subblocks;
        !           350: 
        !           351:     /* Number of decls in `names' that have incomplete 
        !           352:        structure or union types.  */
        !           353:     int n_incomplete;
        !           354: 
        !           355:     /* A list of decls giving the (reversed) specified order of parms,
        !           356:        not including any forward-decls in the parmlist.
        !           357:        This is so we can put the parms in proper order for assign_parms.  */
        !           358:     tree parm_order;
        !           359:   };
        !           360: 
        !           361: #define NULL_BINDING_LEVEL (struct binding_level *) NULL
        !           362:   
        !           363: /* The binding level currently in effect.  */
        !           364: 
        !           365: static struct binding_level *current_binding_level;
        !           366: 
        !           367: /* A chain of binding_level structures awaiting reuse.  */
        !           368: 
        !           369: static struct binding_level *free_binding_level;
        !           370: 
        !           371: /* The outermost binding level, for names of file scope.
        !           372:    This is created when the compiler is started and exists
        !           373:    through the entire run.  */
        !           374: 
        !           375: static struct binding_level *global_binding_level;
        !           376: 
        !           377: /* Binding level structures are initialized by copying this one.  */
        !           378: 
        !           379: static struct binding_level clear_binding_level
        !           380:   = {NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0};
        !           381: 
        !           382: /* Nonzero means unconditionally make a BLOCK for the next level pushed.  */
        !           383: 
        !           384: static int keep_next_level_flag;
        !           385: 
        !           386: /* Nonzero means make a BLOCK for the next level pushed
        !           387:    if it has subblocks.  */
        !           388: 
        !           389: static int keep_next_if_subblocks;
        !           390:   
        !           391: /* The chain of outer levels of label scopes.
        !           392:    This uses the same data structure used for binding levels,
        !           393:    but it works differently: each link in the chain records
        !           394:    saved values of named_labels and shadowed_labels for
        !           395:    a label binding level outside the current one.  */
        !           396: 
        !           397: static struct binding_level *label_level_chain;
        !           398: 
        !           399: /* Forward declarations.  */
        !           400: 
        !           401: static tree grokparms (), grokdeclarator ();
        !           402: tree pushdecl ();
        !           403: tree builtin_function ();
        !           404: void shadow_tag_warned ();
        !           405: 
        !           406: static tree lookup_tag ();
        !           407: static tree lookup_tag_reverse ();
        !           408: tree lookup_name_current_level ();
        !           409: static char *redeclaration_error_message ();
        !           410: static void layout_array_type ();
        !           411: 
        !           412: /* C-specific option variables.  */
        !           413: 
        !           414: /* Nonzero means allow type mismatches in conditional expressions;
        !           415:    just make their values `void'.   */
        !           416: 
        !           417: int flag_cond_mismatch;
        !           418: 
        !           419: /* Nonzero means give `double' the same size as `float'.  */
        !           420: 
        !           421: int flag_short_double;
        !           422: 
        !           423: /* Nonzero means don't recognize the keyword `asm'.  */
        !           424: 
        !           425: int flag_no_asm;
        !           426: 
        !           427: /* Nonzero means don't recognize any builtin functions.  */
        !           428: 
        !           429: int flag_no_builtin;
        !           430: 
        !           431: /* Nonzero means don't recognize the non-ANSI builtin functions.
        !           432:    -ansi sets this.  */
        !           433: 
        !           434: int flag_no_nonansi_builtin;
        !           435: 
        !           436: /* Nonzero means do some things the same way PCC does.  */
        !           437: 
        !           438: int flag_traditional;
        !           439: 
        !           440: /* Nonzero means to allow single precision math even if we're generally
        !           441:    being traditional. */
        !           442: int flag_allow_single_precision = 0;
        !           443: 
        !           444: /* Nonzero means to treat bitfields as signed unless they say `unsigned'.  */
        !           445: 
        !           446: int flag_signed_bitfields = 1;
        !           447: int explicit_flag_signed_bitfields = 0;
        !           448: 
        !           449: /* Nonzero means handle `#ident' directives.  0 means ignore them.  */
        !           450: 
        !           451: int flag_no_ident = 0;
        !           452: 
        !           453: /* Nonzero means warn about implicit declarations.  */
        !           454: 
        !           455: int warn_implicit;
        !           456: 
        !           457: /* Nonzero means give string constants the type `const char *'
        !           458:    to get extra warnings from them.  These warnings will be too numerous
        !           459:    to be useful, except in thoroughly ANSIfied programs.  */
        !           460: 
        !           461: int warn_write_strings;
        !           462: 
        !           463: /* Nonzero means warn about pointer casts that can drop a type qualifier
        !           464:    from the pointer target type.  */
        !           465: 
        !           466: int warn_cast_qual;
        !           467: 
        !           468: /* Warn about traditional constructs whose meanings changed in ANSI C.  */
        !           469: 
        !           470: int warn_traditional;
        !           471: 
        !           472: /* Nonzero means warn about sizeof(function) or addition/subtraction
        !           473:    of function pointers.  */
        !           474: 
        !           475: int warn_pointer_arith;
        !           476: 
        !           477: /* Nonzero means warn for non-prototype function decls
        !           478:    or non-prototyped defs without previous prototype.  */
        !           479: 
        !           480: int warn_strict_prototypes;
        !           481: 
        !           482: /* Nonzero means warn for any global function def
        !           483:    without separate previous prototype decl.  */
        !           484: 
        !           485: int warn_missing_prototypes;
        !           486: 
        !           487: /* Nonzero means warn about multiple (redundant) decls for the same single
        !           488:    variable or function.  */
        !           489: 
        !           490: int warn_redundant_decls = 0;
        !           491: 
        !           492: /* Nonzero means warn about extern declarations of objects not at
        !           493:    file-scope level and about *all* declarations of functions (whether
        !           494:    extern or static) not at file-scope level.  Note that we exclude
        !           495:    implicit function declarations.  To get warnings about those, use
        !           496:    -Wimplicit.  */
        !           497: 
        !           498: int warn_nested_externs = 0;
        !           499: 
        !           500: /* Warn about *printf or *scanf format/argument anomalies. */
        !           501: 
        !           502: int warn_format;
        !           503: 
        !           504: /* Warn about a subscript that has type char.  */
        !           505: 
        !           506: int warn_char_subscripts = 0;
        !           507: 
        !           508: /* Warn if a type conversion is done that might have confusing results.  */
        !           509: 
        !           510: int warn_conversion;
        !           511: 
        !           512: /* Warn if adding () is suggested.  */
        !           513: 
        !           514: int warn_parentheses;
        !           515: 
        !           516: /* Warn if initializer is not completely bracketed.  */
        !           517: 
        !           518: int warn_missing_braces;
        !           519: 
        !           520: /* Nonzero means `$' can be in an identifier.
        !           521:    See cccp.c for reasons why this breaks some obscure ANSI C programs.  */
        !           522: 
        !           523: #ifndef DOLLARS_IN_IDENTIFIERS
        !           524: #define DOLLARS_IN_IDENTIFIERS 1
        !           525: #endif
        !           526: int dollars_in_ident = DOLLARS_IN_IDENTIFIERS > 1;
        !           527: 
        !           528: #ifdef NeXT
        !           529: #ifdef HPPA
        !           530: extern void add_vararg_func(char *, char);
        !           531: #endif
        !           532: #endif
        !           533: 
        !           534: /* Decode the string P as a language-specific option for C.
        !           535:    Return 1 if it is recognized (and handle it);
        !           536:    return 0 if not recognized.  */
        !           537:    
        !           538: int
        !           539: c_decode_option (p)
        !           540:      char *p;
        !           541: {
        !           542:   if (!strcmp (p, "-ftraditional") || !strcmp (p, "-traditional"))
        !           543:     {
        !           544:       flag_traditional = 1;
        !           545:       flag_writable_strings = 1;
        !           546: #if DOLLARS_IN_IDENTIFIERS > 0
        !           547:       dollars_in_ident = 1;
        !           548: #endif
        !           549:     }
        !           550:   else if (!strcmp (p, "-fallow-single-precision"))
        !           551:     flag_allow_single_precision = 1;
        !           552:   else if (!strcmp (p, "-fnotraditional") || !strcmp (p, "-fno-traditional"))
        !           553:     {
        !           554:       flag_traditional = 0;
        !           555:       flag_writable_strings = 0;
        !           556:       dollars_in_ident = DOLLARS_IN_IDENTIFIERS > 1;
        !           557:     }
        !           558:   else if (!strcmp (p, "-fdollars-in-identifiers"))
        !           559:     {
        !           560: #if DOLLARS_IN_IDENTIFIERS > 0
        !           561:       dollars_in_ident = 1;
        !           562: #endif
        !           563:     }
        !           564:   else if (!strcmp (p, "-fnodollars-in-identifiers"))
        !           565:     dollars_in_ident = 0;
        !           566:   else if (!strcmp (p, "-fsigned-char"))
        !           567:     flag_signed_char = 1;
        !           568:   else if (!strcmp (p, "-funsigned-char"))
        !           569:     flag_signed_char = 0;
        !           570:   else if (!strcmp (p, "-fno-signed-char"))
        !           571:     flag_signed_char = 0;
        !           572:   else if (!strcmp (p, "-fno-unsigned-char"))
        !           573:     flag_signed_char = 1;
        !           574:   else if (!strcmp (p, "-fsigned-bitfields")
        !           575:           || !strcmp (p, "-fno-unsigned-bitfields"))
        !           576:     {
        !           577:       flag_signed_bitfields = 1;
        !           578:       explicit_flag_signed_bitfields = 1;
        !           579:     }
        !           580:   else if (!strcmp (p, "-funsigned-bitfields")
        !           581:           || !strcmp (p, "-fno-signed-bitfields"))
        !           582:     {
        !           583:       flag_signed_bitfields = 0;
        !           584:       explicit_flag_signed_bitfields = 1;
        !           585:     }
        !           586:   else if (!strcmp (p, "-fshort-enums"))
        !           587:     flag_short_enums = 1;
        !           588:   else if (!strcmp (p, "-fno-short-enums"))
        !           589:     flag_short_enums = 0;
        !           590:   else if (!strcmp (p, "-fcond-mismatch"))
        !           591:     flag_cond_mismatch = 1;
        !           592:   else if (!strcmp (p, "-fno-cond-mismatch"))
        !           593:     flag_cond_mismatch = 0;
        !           594:   else if (!strcmp (p, "-fshort-double"))
        !           595:     flag_short_double = 1;
        !           596:   else if (!strcmp (p, "-fno-short-double"))
        !           597:     flag_short_double = 0;
        !           598:   else if (!strcmp (p, "-fasm"))
        !           599:     flag_no_asm = 0;
        !           600:   else if (!strcmp (p, "-fno-asm"))
        !           601:     flag_no_asm = 1;
        !           602:   else if (!strcmp (p, "-fbuiltin"))
        !           603:     flag_no_builtin = 0;
        !           604:   else if (!strcmp (p, "-fno-builtin"))
        !           605:     flag_no_builtin = 1;
        !           606:   else if (!strcmp (p, "-fno-ident"))
        !           607:     flag_no_ident = 1;
        !           608:   else if (!strcmp (p, "-fident"))
        !           609:     flag_no_ident = 0;
        !           610:   else if (!strcmp (p, "-ansi"))
        !           611:     flag_no_asm = 1, flag_no_nonansi_builtin = 1, dollars_in_ident = 0;
        !           612:   else if (!strcmp (p, "-Wimplicit"))
        !           613:     warn_implicit = 1;
        !           614:   else if (!strcmp (p, "-Wno-implicit"))
        !           615:     warn_implicit = 0;
        !           616:   else if (!strcmp (p, "-Wwrite-strings"))
        !           617:     warn_write_strings = 1;
        !           618:   else if (!strcmp (p, "-Wno-write-strings"))
        !           619:     warn_write_strings = 0;
        !           620:   else if (!strcmp (p, "-Wcast-qual"))
        !           621:     warn_cast_qual = 1;
        !           622:   else if (!strcmp (p, "-Wno-cast-qual"))
        !           623:     warn_cast_qual = 0;
        !           624:   else if (!strcmp (p, "-Wpointer-arith"))
        !           625:     warn_pointer_arith = 1;
        !           626:   else if (!strcmp (p, "-Wno-pointer-arith"))
        !           627:     warn_pointer_arith = 0;
        !           628:   else if (!strcmp (p, "-Wstrict-prototypes"))
        !           629:     warn_strict_prototypes = 1;
        !           630:   else if (!strcmp (p, "-Wno-strict-prototypes"))
        !           631:     warn_strict_prototypes = 0;
        !           632:   else if (!strcmp (p, "-Wmissing-prototypes"))
        !           633:     warn_missing_prototypes = 1;
        !           634:   else if (!strcmp (p, "-Wno-missing-prototypes"))
        !           635:     warn_missing_prototypes = 0;
        !           636:   else if (!strcmp (p, "-Wredundant-decls"))
        !           637:     warn_redundant_decls = 1;
        !           638:   else if (!strcmp (p, "-Wno-redundant-decls"))
        !           639:     warn_redundant_decls = 0;
        !           640:   else if (!strcmp (p, "-Wnested-externs"))
        !           641:     warn_nested_externs = 1;
        !           642:   else if (!strcmp (p, "-Wno-nested-externs"))
        !           643:     warn_nested_externs = 0;
        !           644:   else if (!strcmp (p, "-Wtraditional"))
        !           645:     warn_traditional = 1;
        !           646:   else if (!strcmp (p, "-Wno-traditional"))
        !           647:     warn_traditional = 0;
        !           648:   else if (!strcmp (p, "-Wformat"))
        !           649:     warn_format = 1;
        !           650:   else if (!strcmp (p, "-Wno-format"))
        !           651:     warn_format = 0;
        !           652: #ifdef NEXT_SEMANTICS
        !           653:   else if (!strcmp (p, "-Wnoformat"))
        !           654:     warn_format = 0;
        !           655: #endif
        !           656:   else if (!strcmp (p, "-Wchar-subscripts"))
        !           657:     warn_char_subscripts = 1;
        !           658:   else if (!strcmp (p, "-Wno-char-subscripts"))
        !           659:     warn_char_subscripts = 0;
        !           660:   else if (!strcmp (p, "-Wconversion"))
        !           661:     warn_conversion = 1;
        !           662:   else if (!strcmp (p, "-Wno-conversion"))
        !           663:     warn_conversion = 0;
        !           664:   else if (!strcmp (p, "-Wparentheses"))
        !           665:     warn_parentheses = 1;
        !           666:   else if (!strcmp (p, "-Wno-parentheses"))
        !           667:     warn_parentheses = 0;
        !           668:   else if (!strcmp (p, "-Wreturn-type"))
        !           669:     warn_return_type = 1;
        !           670:   else if (!strcmp (p, "-Wno-return-type"))
        !           671:     warn_return_type = 0;
        !           672:   else if (!strcmp (p, "-Wcomment"))
        !           673:     ; /* cpp handles this one.  */
        !           674:   else if (!strcmp (p, "-Wno-comment"))
        !           675:     ; /* cpp handles this one.  */
        !           676:   else if (!strcmp (p, "-Wcomments"))
        !           677:     ; /* cpp handles this one.  */
        !           678:   else if (!strcmp (p, "-Wno-comments"))
        !           679:     ; /* cpp handles this one.  */
        !           680:   else if (!strcmp (p, "-Wtrigraphs"))
        !           681:     ; /* cpp handles this one.  */
        !           682:   else if (!strcmp (p, "-Wno-trigraphs"))
        !           683:     ; /* cpp handles this one.  */
        !           684:   else if (!strcmp (p, "-Wimport"))
        !           685:     ; /* cpp handles this one.  */
        !           686:   else if (!strcmp (p, "-Wno-import"))
        !           687:     ; /* cpp handles this one.  */
        !           688:   else if (!strcmp (p, "-Wmissing-braces"))
        !           689:     warn_missing_braces = 1;
        !           690:   else if (!strcmp (p, "-Wno-missing-braces"))
        !           691:     warn_missing_braces = 0;
        !           692:   else if (!strcmp (p, "-Wall"))
        !           693:     {
        !           694:       extra_warnings = 1;
        !           695:       /* We save the value of warn_uninitialized, since if they put
        !           696:         -Wuninitialized on the command line, we need to generate a
        !           697:         warning about not using it without also specifying -O.  */
        !           698:       if (warn_uninitialized != 1)
        !           699:        warn_uninitialized = 2;
        !           700:       warn_implicit = 1;
        !           701:       warn_return_type = 1;
        !           702:       warn_unused = 1;
        !           703:       warn_switch = 1;
        !           704:       warn_format = 1;
        !           705:       warn_char_subscripts = 1;
        !           706: #ifndef NEXT_SEMANTICS
        !           707:       warn_parentheses = 1;
        !           708: #endif
        !           709:       warn_missing_braces = 1;
        !           710:     }
        !           711:   else
        !           712: #ifdef NEXT_SEMANTICS
        !           713:     if (! strcmp (p, "-Wstyle"))
        !           714:     {
        !           715:       warn_parentheses = 1;
        !           716:     }
        !           717:   else
        !           718: #endif
        !           719:     return 0;
        !           720: 
        !           721:   return 1;
        !           722: }
        !           723: 
        !           724: /* Hooks for print_node.  */
        !           725: 
        !           726: void
        !           727: print_lang_decl (file, node, indent)
        !           728:      FILE *file;
        !           729:      tree node;
        !           730:      int indent;
        !           731: {
        !           732: }
        !           733: 
        !           734: void
        !           735: print_lang_type (file, node, indent)
        !           736:      FILE *file;
        !           737:      tree node;
        !           738:      int indent;
        !           739: {
        !           740: }
        !           741: 
        !           742: void
        !           743: print_lang_identifier (file, node, indent)
        !           744:      FILE *file;
        !           745:      tree node;
        !           746:      int indent;
        !           747: {
        !           748:   print_node (file, "global", IDENTIFIER_GLOBAL_VALUE (node), indent + 4);
        !           749:   print_node (file, "local", IDENTIFIER_LOCAL_VALUE (node), indent + 4);
        !           750:   print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4);
        !           751:   print_node (file, "implicit", IDENTIFIER_IMPLICIT_DECL (node), indent + 4);
        !           752:   print_node (file, "error locus", IDENTIFIER_ERROR_LOCUS (node), indent + 4);
        !           753:   print_node (file, "limbo value", IDENTIFIER_LIMBO_VALUE (node), indent + 4);
        !           754: }
        !           755: 
        !           756: /* Hook called at end of compilation to assume 1 elt
        !           757:    for a top-level array decl that wasn't complete before.  */
        !           758:    
        !           759: void
        !           760: finish_incomplete_decl (decl)
        !           761:      tree decl;
        !           762: {
        !           763:   if (TREE_CODE (decl) == VAR_DECL && TREE_TYPE (decl) != error_mark_node)
        !           764:     {
        !           765:       tree type = TREE_TYPE (decl);
        !           766:       if (TREE_CODE (type) == ARRAY_TYPE
        !           767:          && TYPE_DOMAIN (type) == 0
        !           768:          && TREE_CODE (decl) != TYPE_DECL)
        !           769:        {
        !           770:          complete_array_type (type, NULL_TREE, 1);
        !           771: 
        !           772:          layout_decl (decl, 0);
        !           773:        }
        !           774:     }
        !           775: }
        !           776: 
        !           777: /* Create a new `struct binding_level'.  */
        !           778: 
        !           779: static
        !           780: struct binding_level *
        !           781: make_binding_level ()
        !           782: {
        !           783:   /* NOSTRICT */
        !           784:   return (struct binding_level *) xmalloc (sizeof (struct binding_level));
        !           785: }
        !           786: 
        !           787: /* Nonzero if we are currently in the global binding level.  */
        !           788: 
        !           789: int
        !           790: global_bindings_p ()
        !           791: {
        !           792:   return current_binding_level == global_binding_level;
        !           793: }
        !           794: 
        !           795: void
        !           796: keep_next_level ()
        !           797: {
        !           798:   keep_next_level_flag = 1;
        !           799: }
        !           800: 
        !           801: /* Nonzero if the current level needs to have a BLOCK made.  */
        !           802: 
        !           803: int
        !           804: kept_level_p ()
        !           805: {
        !           806:   return ((current_binding_level->keep_if_subblocks
        !           807:           && current_binding_level->blocks != 0)
        !           808:          || current_binding_level->keep
        !           809:          || current_binding_level->names != 0
        !           810:          || (current_binding_level->tags != 0
        !           811:              && !current_binding_level->tag_transparent));
        !           812: }
        !           813: 
        !           814: /* Identify this binding level as a level of parameters.
        !           815:    DEFINITION_FLAG is 1 for a definition, 0 for a declaration.
        !           816:    But it turns out there is no way to pass the right value for
        !           817:    DEFINITION_FLAG, so we ignore it.  */
        !           818: 
        !           819: void
        !           820: declare_parm_level (definition_flag)
        !           821:      int definition_flag;
        !           822: {
        !           823:   current_binding_level->parm_flag = 1;
        !           824: }
        !           825: 
        !           826: /* Nonzero if currently making parm declarations.  */
        !           827: 
        !           828: int
        !           829: in_parm_level_p ()
        !           830: {
        !           831:   return current_binding_level->parm_flag;
        !           832: }
        !           833: 
        !           834: /* Enter a new binding level.
        !           835:    If TAG_TRANSPARENT is nonzero, do so only for the name space of variables,
        !           836:    not for that of tags.  */
        !           837: 
        !           838: void
        !           839: pushlevel (tag_transparent)
        !           840:      int tag_transparent;
        !           841: {
        !           842:   register struct binding_level *newlevel = NULL_BINDING_LEVEL;
        !           843: 
        !           844:   /* If this is the top level of a function,
        !           845:      just make sure that NAMED_LABELS is 0.  */
        !           846: 
        !           847:   if (current_binding_level == global_binding_level)
        !           848:     {
        !           849:       named_labels = 0;
        !           850:     }
        !           851: 
        !           852:   /* Reuse or create a struct for this binding level.  */
        !           853: 
        !           854:   if (free_binding_level)
        !           855:     {
        !           856:       newlevel = free_binding_level;
        !           857:       free_binding_level = free_binding_level->level_chain;
        !           858:     }
        !           859:   else
        !           860:     {
        !           861:       newlevel = make_binding_level ();
        !           862:     }
        !           863: 
        !           864:   /* Add this level to the front of the chain (stack) of levels that
        !           865:      are active.  */
        !           866: 
        !           867:   *newlevel = clear_binding_level;
        !           868:   newlevel->tag_transparent
        !           869:     = (tag_transparent
        !           870:        || (current_binding_level
        !           871:           ? current_binding_level->subblocks_tag_transparent
        !           872:           : 0));
        !           873:   newlevel->level_chain = current_binding_level;
        !           874:   current_binding_level = newlevel;
        !           875:   newlevel->keep = keep_next_level_flag;
        !           876:   keep_next_level_flag = 0;
        !           877:   newlevel->keep_if_subblocks = keep_next_if_subblocks;
        !           878:   keep_next_if_subblocks = 0;
        !           879: }
        !           880: 
        !           881: /* Exit a binding level.
        !           882:    Pop the level off, and restore the state of the identifier-decl mappings
        !           883:    that were in effect when this level was entered.
        !           884: 
        !           885:    If KEEP is nonzero, this level had explicit declarations, so
        !           886:    and create a "block" (a BLOCK node) for the level
        !           887:    to record its declarations and subblocks for symbol table output.
        !           888: 
        !           889:    If FUNCTIONBODY is nonzero, this level is the body of a function,
        !           890:    so create a block as if KEEP were set and also clear out all
        !           891:    label names.
        !           892: 
        !           893:    If REVERSE is nonzero, reverse the order of decls before putting
        !           894:    them into the BLOCK.  */
        !           895: 
        !           896: tree
        !           897: poplevel (keep, reverse, functionbody)
        !           898:      int keep;
        !           899:      int reverse;
        !           900:      int functionbody;
        !           901: {
        !           902:   register tree link;
        !           903:   /* The chain of decls was accumulated in reverse order.
        !           904:      Put it into forward order, just for cleanliness.  */
        !           905:   tree decls;
        !           906:   tree tags = current_binding_level->tags;
        !           907:   tree subblocks = current_binding_level->blocks;
        !           908:   tree block = 0;
        !           909:   tree decl;
        !           910:   int block_previously_created;
        !           911: 
        !           912:   keep |= current_binding_level->keep;
        !           913: 
        !           914:   /* This warning is turned off because it causes warnings for
        !           915:      declarations like `extern struct foo *x'.  */
        !           916: #if 0
        !           917:   /* Warn about incomplete structure types in this level.  */
        !           918:   for (link = tags; link; link = TREE_CHAIN (link))
        !           919:     if (TYPE_SIZE (TREE_VALUE (link)) == 0)
        !           920:       {
        !           921:        tree type = TREE_VALUE (link);
        !           922:        char *errmsg;
        !           923:        switch (TREE_CODE (type))
        !           924:          {
        !           925:          case RECORD_TYPE:
        !           926:            errmsg = "`struct %s' incomplete in scope ending here";
        !           927:            break;
        !           928:          case UNION_TYPE:
        !           929:            errmsg = "`union %s' incomplete in scope ending here";
        !           930:            break;
        !           931:          case ENUMERAL_TYPE:
        !           932:            errmsg = "`enum %s' incomplete in scope ending here";
        !           933:            break;
        !           934:          }
        !           935:        if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
        !           936:          error (errmsg, IDENTIFIER_POINTER (TYPE_NAME (type)));
        !           937:        else
        !           938:          /* If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL.  */
        !           939:          error (errmsg, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
        !           940:       }
        !           941: #endif /* 0 */
        !           942: 
        !           943:   /* Get the decls in the order they were written.
        !           944:      Usually current_binding_level->names is in reverse order.
        !           945:      But parameter decls were previously put in forward order.  */
        !           946: 
        !           947:   if (reverse)
        !           948:     current_binding_level->names
        !           949:       = decls = nreverse (current_binding_level->names);
        !           950:   else
        !           951:     decls = current_binding_level->names;
        !           952: 
        !           953:   /* Output any nested inline functions within this block
        !           954:      if they weren't already output.  */
        !           955: 
        !           956:   for (decl = decls; decl; decl = TREE_CHAIN (decl))
        !           957:     if (TREE_CODE (decl) == FUNCTION_DECL
        !           958:        && ! TREE_ASM_WRITTEN (decl)
        !           959:        && DECL_INITIAL (decl) != 0
        !           960:        && TREE_ADDRESSABLE (decl))
        !           961:       {
        !           962:        /* If this decl was copied from a file-scope decl
        !           963:           on account of a block-scope extern decl,
        !           964:           propagate TREE_ADDRESSABLE to the file-scope decl.  */
        !           965:        if (DECL_ABSTRACT_ORIGIN (decl) != 0)
        !           966:          TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
        !           967:        else
        !           968:          {
        !           969:            push_function_context ();
        !           970:            output_inline_function (decl);
        !           971:            pop_function_context ();
        !           972:          }
        !           973:       }
        !           974: 
        !           975:   /* If there were any declarations or structure tags in that level,
        !           976:      or if this level is a function body,
        !           977:      create a BLOCK to record them for the life of this function.  */
        !           978: 
        !           979:   block = 0;
        !           980:   block_previously_created = (current_binding_level->this_block != 0);
        !           981:   if (block_previously_created)
        !           982:     block = current_binding_level->this_block;
        !           983:   else if (keep || functionbody
        !           984:           || (current_binding_level->keep_if_subblocks && subblocks != 0))
        !           985:     block = make_node (BLOCK);
        !           986:   if (block != 0)
        !           987:     {
        !           988:       BLOCK_VARS (block) = decls;
        !           989:       BLOCK_TYPE_TAGS (block) = tags;
        !           990:       BLOCK_SUBBLOCKS (block) = subblocks;
        !           991:       remember_end_note (block);
        !           992:     }
        !           993: 
        !           994:   /* In each subblock, record that this is its superior.  */
        !           995: 
        !           996:   for (link = subblocks; link; link = TREE_CHAIN (link))
        !           997:     BLOCK_SUPERCONTEXT (link) = block;
        !           998: 
        !           999:   /* Clear out the meanings of the local variables of this level.  */
        !          1000: 
        !          1001:   for (link = decls; link; link = TREE_CHAIN (link))
        !          1002:     {
        !          1003:       if (DECL_NAME (link) != 0)
        !          1004:        {
        !          1005:          /* If the ident. was used or addressed via a local extern decl,
        !          1006:             don't forget that fact.  */
        !          1007:          if (DECL_EXTERNAL (link))
        !          1008:            {
        !          1009:              if (TREE_USED (link))
        !          1010:                TREE_USED (DECL_NAME (link)) = 1;
        !          1011:              if (TREE_ADDRESSABLE (link))
        !          1012:                TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
        !          1013:            }
        !          1014:          IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = 0;
        !          1015:        }
        !          1016:     }
        !          1017: 
        !          1018:   /* Restore all name-meanings of the outer levels
        !          1019:      that were shadowed by this level.  */
        !          1020: 
        !          1021:   for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
        !          1022:     IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
        !          1023: 
        !          1024:   /* If the level being exited is the top level of a function,
        !          1025:      check over all the labels, and clear out the current
        !          1026:      (function local) meanings of their names.  */
        !          1027: 
        !          1028:   if (functionbody)
        !          1029:     {
        !          1030:       /* If this is the top level block of a function,
        !          1031:         the vars are the function's parameters.
        !          1032:         Don't leave them in the BLOCK because they are
        !          1033:         found in the FUNCTION_DECL instead.  */
        !          1034: 
        !          1035:       BLOCK_VARS (block) = 0;
        !          1036: 
        !          1037:       /* Clear out the definitions of all label names,
        !          1038:         since their scopes end here,
        !          1039:         and add them to BLOCK_VARS.  */
        !          1040: 
        !          1041:       for (link = named_labels; link; link = TREE_CHAIN (link))
        !          1042:        {
        !          1043:          register tree label = TREE_VALUE (link);
        !          1044: 
        !          1045:          if (DECL_INITIAL (label) == 0)
        !          1046:            {
        !          1047:              error_with_decl (label, "label `%s' used but not defined");
        !          1048:              /* Avoid crashing later.  */
        !          1049:              define_label (input_filename, lineno,
        !          1050:                            DECL_NAME (label));
        !          1051:            }
        !          1052:          else if (warn_unused && !TREE_USED (label))
        !          1053:            warning_with_decl (label, "label `%s' defined but not used");
        !          1054:          IDENTIFIER_LABEL_VALUE (DECL_NAME (label)) = 0;
        !          1055: 
        !          1056:          /* Put the labels into the "variables" of the
        !          1057:             top-level block, so debugger can see them.  */
        !          1058:          TREE_CHAIN (label) = BLOCK_VARS (block);
        !          1059:          BLOCK_VARS (block) = label;
        !          1060:        }
        !          1061:     }
        !          1062: 
        !          1063:   /* Pop the current level, and free the structure for reuse.  */
        !          1064: 
        !          1065:   {
        !          1066:     register struct binding_level *level = current_binding_level;
        !          1067:     current_binding_level = current_binding_level->level_chain;
        !          1068: 
        !          1069:     level->level_chain = free_binding_level;
        !          1070:     free_binding_level = level;
        !          1071:   }
        !          1072: 
        !          1073:   /* Dispose of the block that we just made inside some higher level.  */
        !          1074:   if (functionbody)
        !          1075:     DECL_INITIAL (current_function_decl) = block;
        !          1076:   else if (block)
        !          1077:     {
        !          1078:       if (!block_previously_created)
        !          1079:         current_binding_level->blocks
        !          1080:           = chainon (current_binding_level->blocks, block);
        !          1081:     }
        !          1082:   /* If we did not make a block for the level just exited,
        !          1083:      any blocks made for inner levels
        !          1084:      (since they cannot be recorded as subblocks in that level)
        !          1085:      must be carried forward so they will later become subblocks
        !          1086:      of something else.  */
        !          1087:   else if (subblocks)
        !          1088:     current_binding_level->blocks
        !          1089:       = chainon (current_binding_level->blocks, subblocks);
        !          1090: 
        !          1091:   /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this
        !          1092:      binding contour so that they point to the appropriate construct, i.e.
        !          1093:      either to the current FUNCTION_DECL node, or else to the BLOCK node
        !          1094:      we just constructed.
        !          1095: 
        !          1096:      Note that for tagged types whose scope is just the formal parameter
        !          1097:      list for some function type specification, we can't properly set
        !          1098:      their TYPE_CONTEXTs here, because we don't have a pointer to the
        !          1099:      appropriate FUNCTION_TYPE node readily available to us.  For those
        !          1100:      cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set
        !          1101:      in `grokdeclarator' as soon as we have created the FUNCTION_TYPE
        !          1102:      node which will represent the "scope" for these "parameter list local"
        !          1103:      tagged types.
        !          1104:   */
        !          1105: 
        !          1106:   if (functionbody)
        !          1107:     for (link = tags; link; link = TREE_CHAIN (link))
        !          1108:       TYPE_CONTEXT (TREE_VALUE (link)) = current_function_decl;
        !          1109:   else if (block)
        !          1110:     for (link = tags; link; link = TREE_CHAIN (link))
        !          1111:       TYPE_CONTEXT (TREE_VALUE (link)) = block;
        !          1112: 
        !          1113:   if (block)
        !          1114:     TREE_USED (block) = 1;
        !          1115:   return block;
        !          1116: }
        !          1117: 
        !          1118: /* Delete the node BLOCK from the current binding level.
        !          1119:    This is used for the block inside a stmt expr ({...})
        !          1120:    so that the block can be reinserted where appropriate.  */
        !          1121: 
        !          1122: void
        !          1123: delete_block (block)
        !          1124:      tree block;
        !          1125: {
        !          1126:   tree t;
        !          1127:   if (current_binding_level->blocks == block)
        !          1128:     current_binding_level->blocks = TREE_CHAIN (block);
        !          1129:   for (t = current_binding_level->blocks; t;)
        !          1130:     {
        !          1131:       if (TREE_CHAIN (t) == block)
        !          1132:        TREE_CHAIN (t) = TREE_CHAIN (block);
        !          1133:       else
        !          1134:        t = TREE_CHAIN (t);
        !          1135:     }
        !          1136:   TREE_CHAIN (block) = NULL;
        !          1137:   /* Clear TREE_USED which is always set by poplevel.
        !          1138:      The flag is set again if insert_block is called.  */
        !          1139:   TREE_USED (block) = 0;
        !          1140: }
        !          1141: 
        !          1142: /* Insert BLOCK at the end of the list of subblocks of the
        !          1143:    current binding level.  This is used when a BIND_EXPR is expanded,
        !          1144:    to handle the BLOCK node inside the BIND_EXPR.  */
        !          1145: 
        !          1146: void
        !          1147: insert_block (block)
        !          1148:      tree block;
        !          1149: {
        !          1150:   TREE_USED (block) = 1;
        !          1151:   current_binding_level->blocks
        !          1152:     = chainon (current_binding_level->blocks, block);
        !          1153: }
        !          1154: 
        !          1155: /* Set the BLOCK node for the innermost scope
        !          1156:    (the one we are currently in).  */
        !          1157: 
        !          1158: void
        !          1159: set_block (block)
        !          1160:      register tree block;
        !          1161: {
        !          1162:   current_binding_level->this_block = block;
        !          1163: }
        !          1164: 
        !          1165: void
        !          1166: push_label_level ()
        !          1167: {
        !          1168:   register struct binding_level *newlevel;
        !          1169: 
        !          1170:   /* Reuse or create a struct for this binding level.  */
        !          1171: 
        !          1172:   if (free_binding_level)
        !          1173:     {
        !          1174:       newlevel = free_binding_level;
        !          1175:       free_binding_level = free_binding_level->level_chain;
        !          1176:     }
        !          1177:   else
        !          1178:     {
        !          1179:       newlevel = make_binding_level ();
        !          1180:     }
        !          1181: 
        !          1182:   /* Add this level to the front of the chain (stack) of label levels.  */
        !          1183: 
        !          1184:   newlevel->level_chain = label_level_chain;
        !          1185:   label_level_chain = newlevel;
        !          1186: 
        !          1187:   newlevel->names = named_labels;
        !          1188:   newlevel->shadowed = shadowed_labels;
        !          1189:   named_labels = 0;
        !          1190:   shadowed_labels = 0;
        !          1191: }
        !          1192: 
        !          1193: void
        !          1194: pop_label_level ()
        !          1195: {
        !          1196:   register struct binding_level *level = label_level_chain;
        !          1197:   tree link, prev;
        !          1198: 
        !          1199:   /* Clear out the definitions of the declared labels in this level.
        !          1200:      Leave in the list any ordinary, non-declared labels.  */
        !          1201:   for (link = named_labels, prev = 0; link;)
        !          1202:     {
        !          1203:       if (C_DECLARED_LABEL_FLAG (TREE_VALUE (link)))
        !          1204:        {
        !          1205:          if (DECL_SOURCE_LINE (TREE_VALUE (link)) == 0)
        !          1206:            {
        !          1207:              error_with_decl (TREE_VALUE (link),
        !          1208:                               "label `%s' used but not defined");
        !          1209:              /* Avoid crashing later.  */
        !          1210:              define_label (input_filename, lineno,
        !          1211:                            DECL_NAME (TREE_VALUE (link)));
        !          1212:            }
        !          1213:          else if (warn_unused && !TREE_USED (TREE_VALUE (link)))
        !          1214:            warning_with_decl (TREE_VALUE (link), 
        !          1215:                               "label `%s' defined but not used");
        !          1216:          IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link))) = 0;
        !          1217: 
        !          1218:          /* Delete this element from the list.  */
        !          1219:          link = TREE_CHAIN (link);
        !          1220:          if (prev)
        !          1221:            TREE_CHAIN (prev) = link;
        !          1222:          else
        !          1223:            named_labels = link;
        !          1224:        }
        !          1225:       else
        !          1226:        {
        !          1227:          prev = link;
        !          1228:          link = TREE_CHAIN (link);
        !          1229:        }
        !          1230:     }
        !          1231: 
        !          1232:   /* Bring back all the labels that were shadowed.  */
        !          1233:   for (link = shadowed_labels; link; link = TREE_CHAIN (link))
        !          1234:     if (DECL_NAME (TREE_VALUE (link)) != 0)
        !          1235:       IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link)))
        !          1236:        = TREE_VALUE (link);
        !          1237: 
        !          1238:   named_labels = chainon (named_labels, level->names);
        !          1239:   shadowed_labels = level->shadowed;
        !          1240: 
        !          1241:   /* Pop the current level, and free the structure for reuse.  */
        !          1242:   label_level_chain = label_level_chain->level_chain;
        !          1243:   level->level_chain = free_binding_level;
        !          1244:   free_binding_level = level;
        !          1245: }
        !          1246: 
        !          1247: /* Push a definition or a declaration of struct, union or enum tag "name".
        !          1248:    "type" should be the type node.
        !          1249:    We assume that the tag "name" is not already defined.
        !          1250: 
        !          1251:    Note that the definition may really be just a forward reference.
        !          1252:    In that case, the TYPE_SIZE will be zero.  */
        !          1253: 
        !          1254: void
        !          1255: pushtag (name, type)
        !          1256:      tree name, type;
        !          1257: {
        !          1258:   register struct binding_level *b;
        !          1259: 
        !          1260:   /* Find the proper binding level for this type tag.  */
        !          1261: 
        !          1262:   for (b = current_binding_level; b->tag_transparent; b = b->level_chain)
        !          1263:     continue;
        !          1264: 
        !          1265:   if (name)
        !          1266:     {
        !          1267:       /* Record the identifier as the type's name if it has none.  */
        !          1268: 
        !          1269:       if (TYPE_NAME (type) == 0)
        !          1270:        TYPE_NAME (type) = name;
        !          1271:     }
        !          1272: 
        !          1273:   if (b == global_binding_level)
        !          1274:     b->tags = perm_tree_cons (name, type, b->tags);
        !          1275:   else
        !          1276:     b->tags = saveable_tree_cons (name, type, b->tags);
        !          1277: 
        !          1278:   /* Create a fake NULL-named TYPE_DECL node whose TREE_TYPE will be the
        !          1279:      tagged type we just added to the current binding level.  This fake
        !          1280:      NULL-named TYPE_DECL node helps dwarfout.c to know when it needs
        !          1281:      to output a representation of a tagged type, and it also gives
        !          1282:      us a convenient place to record the "scope start" address for the
        !          1283:      tagged type.  */
        !          1284: 
        !          1285:   TYPE_STUB_DECL (type) = pushdecl (build_decl (TYPE_DECL, NULL_TREE, type));
        !          1286: }
        !          1287: 
        !          1288: /* Handle when a new declaration NEWDECL
        !          1289:    has the same name as an old one OLDDECL
        !          1290:    in the same binding contour.
        !          1291:    Prints an error message if appropriate.
        !          1292: 
        !          1293:    If safely possible, alter OLDDECL to look like NEWDECL, and return 1.
        !          1294:    Otherwise, return 0.  */
        !          1295: 
        !          1296: static int
        !          1297: duplicate_decls (newdecl, olddecl)
        !          1298:      register tree newdecl, olddecl;
        !          1299: {
        !          1300:   int types_match = comptypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl));
        !          1301:   int new_is_definition = (TREE_CODE (newdecl) == FUNCTION_DECL
        !          1302:                           && DECL_INITIAL (newdecl) != 0);
        !          1303:   tree oldtype = TREE_TYPE (olddecl);
        !          1304:   tree newtype = TREE_TYPE (newdecl);
        !          1305: 
        !          1306:   if (TREE_CODE (newtype) == ERROR_MARK
        !          1307:       || TREE_CODE (oldtype) == ERROR_MARK)
        !          1308:     types_match = 0;
        !          1309: 
        !          1310:   /* New decl is completely inconsistent with the old one =>
        !          1311:      tell caller to replace the old one.
        !          1312:      This is always an error except in the case of shadowing a builtin.  */
        !          1313:   if (TREE_CODE (olddecl) != TREE_CODE (newdecl))
        !          1314:     {
        !          1315:       if (TREE_CODE (olddecl) == FUNCTION_DECL
        !          1316:          && (DECL_BUILT_IN (olddecl)
        !          1317:              || DECL_BUILT_IN_NONANSI (olddecl)))
        !          1318:        {
        !          1319:          /* If you declare a built-in or predefined function name as static,
        !          1320:             the old definition is overridden,
        !          1321:             but optionally warn this was a bad choice of name.  */
        !          1322:          if (!TREE_PUBLIC (newdecl))
        !          1323:            {
        !          1324:              if (!warn_shadow)
        !          1325:                ;
        !          1326:              else if (DECL_BUILT_IN (olddecl))
        !          1327:                warning_with_decl (newdecl, "shadowing built-in function `%s'");
        !          1328:              else
        !          1329:                warning_with_decl (newdecl, "shadowing library function `%s'");
        !          1330:            }
        !          1331:          /* Likewise, if the built-in is not ansi, then programs can
        !          1332:             override it even globally without an error.  */
        !          1333:          else if (! DECL_BUILT_IN (olddecl))
        !          1334:            warning_with_decl (newdecl,
        !          1335:                               "library function `%s' declared as non-function");
        !          1336: 
        !          1337:          else if (DECL_BUILT_IN_NONANSI (olddecl))
        !          1338:            warning_with_decl (newdecl,
        !          1339:                               "built-in function `%s' declared as non-function");
        !          1340:          else
        !          1341:            warning_with_decl (newdecl,
        !          1342:                             "built-in function `%s' declared as non-function");
        !          1343:        }
        !          1344:       else
        !          1345:        {
        !          1346:          error_with_decl (newdecl, "`%s' redeclared as different kind of symbol");
        !          1347:          error_with_decl (olddecl, "previous declaration of `%s'");
        !          1348:        }
        !          1349: 
        !          1350:       return 0;
        !          1351:     }
        !          1352: 
        !          1353:   /* For real parm decl following a forward decl,
        !          1354:      return 1 so old decl will be reused.  */
        !          1355:   if (types_match && TREE_CODE (newdecl) == PARM_DECL
        !          1356:       && TREE_ASM_WRITTEN (olddecl) && ! TREE_ASM_WRITTEN (newdecl))
        !          1357:     return 1;
        !          1358: 
        !          1359:   /* The new declaration is the same kind of object as the old one.
        !          1360:      The declarations may partially match.  Print warnings if they don't
        !          1361:      match enough.  Ultimately, copy most of the information from the new
        !          1362:      decl to the old one, and keep using the old one.  */
        !          1363: 
        !          1364:   if (flag_traditional && TREE_CODE (newdecl) == FUNCTION_DECL
        !          1365:       && IDENTIFIER_IMPLICIT_DECL (DECL_NAME (newdecl)) == olddecl
        !          1366:       && DECL_INITIAL (olddecl) == 0)
        !          1367:     /* If -traditional, avoid error for redeclaring fcn
        !          1368:        after implicit decl.  */
        !          1369:     ;
        !          1370:   else if (TREE_CODE (olddecl) == FUNCTION_DECL
        !          1371:           && DECL_BUILT_IN (olddecl))
        !          1372:     {
        !          1373:       /* A function declaration for a built-in function.  */
        !          1374:       if (!TREE_PUBLIC (newdecl))
        !          1375:        {
        !          1376:          /* If you declare a built-in function name as static, the
        !          1377:             built-in definition is overridden,
        !          1378:             but optionally warn this was a bad choice of name.  */
        !          1379:          if (warn_shadow)
        !          1380:            warning_with_decl (newdecl, "shadowing built-in function `%s'");
        !          1381:          /* Discard the old built-in function.  */
        !          1382:          return 0;
        !          1383:        }
        !          1384:       else if (!types_match)
        !          1385:        {
        !          1386:           /* Accept the return type of the new declaration if same modes.  */
        !          1387:          tree oldreturntype = TREE_TYPE (TREE_TYPE (olddecl));
        !          1388:          tree newreturntype = TREE_TYPE (TREE_TYPE (newdecl));
        !          1389:           if (TYPE_MODE (oldreturntype) == TYPE_MODE (newreturntype))
        !          1390:             {
        !          1391:              /* Function types may be shared, so we can't just modify
        !          1392:                 the return type of olddecl's function type.  */
        !          1393:              tree newtype
        !          1394:                = build_function_type (newreturntype,
        !          1395:                                       TYPE_ARG_TYPES (TREE_TYPE (olddecl)));
        !          1396:              
        !          1397:               types_match = comptypes (TREE_TYPE (newdecl), newtype);
        !          1398:              if (types_match)
        !          1399:                TREE_TYPE (olddecl) = newtype;
        !          1400:            }
        !          1401:          /* Accept harmless mismatch in first argument type also.
        !          1402:             This is for ffs.  */
        !          1403:          if (TYPE_ARG_TYPES (TREE_TYPE (newdecl)) != 0
        !          1404:              && TYPE_ARG_TYPES (TREE_TYPE (olddecl)) != 0
        !          1405:              && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (newdecl))) != 0
        !          1406:              && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (olddecl))) != 0
        !          1407:              && (TYPE_MODE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (newdecl))))
        !          1408:                  ==
        !          1409:                  TYPE_MODE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (olddecl))))))
        !          1410:            {
        !          1411:              /* Function types may be shared, so we can't just modify
        !          1412:                 the return type of olddecl's function type.  */
        !          1413:              tree newtype
        !          1414:                = build_function_type (TREE_TYPE (TREE_TYPE (olddecl)),
        !          1415:                                       tree_cons (NULL_TREE, 
        !          1416:                                                  TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (newdecl))),
        !          1417:                                                  TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (olddecl)))));
        !          1418:              
        !          1419:               types_match = comptypes (TREE_TYPE (newdecl), newtype);
        !          1420:              if (types_match)
        !          1421:                TREE_TYPE (olddecl) = newtype;
        !          1422:            }
        !          1423:        }
        !          1424:       if (!types_match)
        !          1425:        {
        !          1426:          /* If types don't match for a built-in, throw away the built-in.  */
        !          1427:          warning_with_decl (newdecl, "conflicting types for built-in function `%s'");
        !          1428:          return 0;
        !          1429:        }
        !          1430:     }
        !          1431:   else if (TREE_CODE (olddecl) == FUNCTION_DECL
        !          1432:           && DECL_SOURCE_LINE (olddecl) == 0)
        !          1433:     {
        !          1434:       /* A function declaration for a predeclared function
        !          1435:         that isn't actually built in.  */
        !          1436:       if (!TREE_PUBLIC (newdecl))
        !          1437:        {
        !          1438:          /* If you declare it as static, the
        !          1439:             default definition is overridden.  */
        !          1440:          return 0;
        !          1441:        }
        !          1442:       else if (!types_match)
        !          1443:        {
        !          1444:          /* If the types don't match, preserve volatility indication.
        !          1445:             Later on, we will discard everything else about the
        !          1446:             default declaration.  */
        !          1447:          TREE_THIS_VOLATILE (newdecl) |= TREE_THIS_VOLATILE (olddecl);
        !          1448:        }
        !          1449:     }
        !          1450:   /* Permit char *foo () to match void *foo (...) if not pedantic,
        !          1451:      if one of them came from a system header file.  */
        !          1452:   else if (!types_match
        !          1453:           && TREE_CODE (olddecl) == FUNCTION_DECL
        !          1454:           && TREE_CODE (newdecl) == FUNCTION_DECL
        !          1455:           && TREE_CODE (TREE_TYPE (oldtype)) == POINTER_TYPE
        !          1456:           && TREE_CODE (TREE_TYPE (newtype)) == POINTER_TYPE
        !          1457:           && (DECL_IN_SYSTEM_HEADER (olddecl)
        !          1458:               || DECL_IN_SYSTEM_HEADER (newdecl))
        !          1459:           && ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (newtype))) == void_type_node
        !          1460:                && TYPE_ARG_TYPES (oldtype) == 0
        !          1461:                && self_promoting_args_p (TYPE_ARG_TYPES (newtype))
        !          1462:                && TREE_TYPE (TREE_TYPE (oldtype)) == char_type_node)
        !          1463:               ||
        !          1464:               (TREE_TYPE (TREE_TYPE (newtype)) == char_type_node
        !          1465:                && TYPE_ARG_TYPES (newtype) == 0
        !          1466:                && self_promoting_args_p (TYPE_ARG_TYPES (oldtype))
        !          1467:                && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (oldtype))) == void_type_node)))
        !          1468:     {
        !          1469:       if (pedantic)
        !          1470:        pedwarn_with_decl (newdecl, "conflicting types for `%s'");
        !          1471:       /* Make sure we keep void * as ret type, not char *.  */
        !          1472:       if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (oldtype))) == void_type_node)
        !          1473:        TREE_TYPE (newdecl) = newtype = oldtype;
        !          1474:     }
        !          1475:   else if (!types_match
        !          1476:           /* Permit char *foo (int, ...); followed by char *foo ();
        !          1477:              if not pedantic.  */
        !          1478:           && ! (TREE_CODE (olddecl) == FUNCTION_DECL
        !          1479:                 && ! pedantic
        !          1480:                 /* Return types must still match.  */
        !          1481:                 && comptypes (TREE_TYPE (oldtype),
        !          1482:                               TREE_TYPE (newtype))
        !          1483:                 && TYPE_ARG_TYPES (newtype) == 0))
        !          1484:     {
        !          1485:       error_with_decl (newdecl, "conflicting types for `%s'");
        !          1486:       /* Check for function type mismatch
        !          1487:         involving an empty arglist vs a nonempty one.  */
        !          1488:       if (TREE_CODE (olddecl) == FUNCTION_DECL
        !          1489:          && comptypes (TREE_TYPE (oldtype),
        !          1490:                        TREE_TYPE (newtype))
        !          1491:          && ((TYPE_ARG_TYPES (oldtype) == 0
        !          1492:               && DECL_INITIAL (olddecl) == 0)
        !          1493:              ||
        !          1494:              (TYPE_ARG_TYPES (newtype) == 0
        !          1495:               && DECL_INITIAL (newdecl) == 0)))
        !          1496:        {
        !          1497:          /* Classify the problem further.  */
        !          1498:          register tree t = TYPE_ARG_TYPES (oldtype);
        !          1499:          if (t == 0)
        !          1500:            t = TYPE_ARG_TYPES (newtype);
        !          1501:          for (; t; t = TREE_CHAIN (t))
        !          1502:            {
        !          1503:              register tree type = TREE_VALUE (t);
        !          1504: 
        !          1505:              if (TREE_CHAIN (t) == 0
        !          1506:                  && TYPE_MAIN_VARIANT (type) != void_type_node)
        !          1507:                {
        !          1508:                  error ("A parameter list with an ellipsis can't match");
        !          1509:                  error ("an empty parameter name list declaration.");
        !          1510:                  break;
        !          1511:                }
        !          1512: 
        !          1513:              if (TYPE_MAIN_VARIANT (type) == float_type_node
        !          1514:                  || C_PROMOTING_INTEGER_TYPE_P (type))
        !          1515:                {
        !          1516:                  error ("An argument type that has a default promotion");
        !          1517:                  error ("can't match an empty parameter name list declaration.");
        !          1518:                  break;
        !          1519:                }
        !          1520:            }
        !          1521:        }
        !          1522:       error_with_decl (olddecl, "previous declaration of `%s'");
        !          1523:     }
        !          1524:   else
        !          1525:     {
        !          1526:       char *errmsg = redeclaration_error_message (newdecl, olddecl);
        !          1527:       if (errmsg)
        !          1528:        {
        !          1529:          error_with_decl (newdecl, errmsg);
        !          1530:          error_with_decl (olddecl,
        !          1531:                           ((DECL_INITIAL (olddecl)
        !          1532:                             && current_binding_level == global_binding_level)
        !          1533:                            ? "`%s' previously defined here"
        !          1534:                            : "`%s' previously declared here"));
        !          1535:        }
        !          1536:       else if (TREE_CODE (olddecl) == FUNCTION_DECL
        !          1537:               && DECL_INITIAL (olddecl) != 0
        !          1538:               && TYPE_ARG_TYPES (oldtype) == 0
        !          1539:               && TYPE_ARG_TYPES (newtype) != 0)
        !          1540:        {
        !          1541:          register tree type, parm;
        !          1542:          register int nargs;
        !          1543:          /* Prototype decl follows defn w/o prototype.  */
        !          1544: 
        !          1545:          for (parm = TYPE_ACTUAL_ARG_TYPES (oldtype),
        !          1546:               type = TYPE_ARG_TYPES (newtype),
        !          1547:               nargs = 1;
        !          1548:               (TYPE_MAIN_VARIANT (TREE_VALUE (parm)) != void_type_node
        !          1549:                || TYPE_MAIN_VARIANT (TREE_VALUE (type)) != void_type_node);
        !          1550:               parm = TREE_CHAIN (parm), type = TREE_CHAIN (type), nargs++)
        !          1551:            {
        !          1552:              if (TYPE_MAIN_VARIANT (TREE_VALUE (parm)) == void_type_node
        !          1553:                  || TYPE_MAIN_VARIANT (TREE_VALUE (type)) == void_type_node)
        !          1554:                {
        !          1555:                  errmsg = "prototype for `%s' follows and number of arguments";
        !          1556:                  break;
        !          1557:                }
        !          1558:              /* Type for passing arg must be consistent
        !          1559:                 with that declared for the arg.  */
        !          1560:              if (! comptypes (TREE_VALUE (parm), TREE_VALUE (type))
        !          1561:                  /* If -traditional, allow `unsigned int' instead of `int'
        !          1562:                     in the prototype.  */
        !          1563:                  && (! (flag_traditional
        !          1564:                         && TYPE_MAIN_VARIANT (TREE_VALUE (parm)) == integer_type_node
        !          1565:                         && TYPE_MAIN_VARIANT (TREE_VALUE (type)) == unsigned_type_node)))
        !          1566:                {
        !          1567:                  errmsg = "prototype for `%s' follows and argument %d";
        !          1568:                  break;
        !          1569:                }
        !          1570:            }
        !          1571:          if (errmsg)
        !          1572:            {
        !          1573:              error_with_decl (newdecl, errmsg, nargs);
        !          1574:              error_with_decl (olddecl,
        !          1575:                               "doesn't match non-prototype definition here");
        !          1576:            }
        !          1577:          else
        !          1578:            {
        !          1579:              warning_with_decl (newdecl, "prototype for `%s' follows");
        !          1580:              warning_with_decl (olddecl, "non-prototype definition here");
        !          1581:            }
        !          1582:        }
        !          1583:       /* Warn about mismatches in various flags.  */
        !          1584:       else
        !          1585:        {
        !          1586:          /* Warn if function is now inline
        !          1587:             but was previously declared not inline and has been called.  */
        !          1588:          if (TREE_CODE (olddecl) == FUNCTION_DECL
        !          1589:              && ! DECL_INLINE (olddecl) && DECL_INLINE (newdecl)
        !          1590:              && TREE_USED (olddecl))
        !          1591:            warning_with_decl (newdecl,
        !          1592:                               "`%s' declared inline after being called");
        !          1593:          if (TREE_CODE (olddecl) == FUNCTION_DECL
        !          1594:              && ! DECL_INLINE (olddecl) && DECL_INLINE (newdecl)
        !          1595:              && DECL_INITIAL (olddecl) != 0)
        !          1596:            warning_with_decl (newdecl,
        !          1597:                               "`%s' declared inline after its definition");
        !          1598:          /* It is nice to warn when a function is declared
        !          1599:             global first and then static.  */
        !          1600:          if (TREE_CODE (olddecl) == FUNCTION_DECL
        !          1601:              && TREE_PUBLIC (olddecl)
        !          1602:              && !TREE_PUBLIC (newdecl))
        !          1603:            warning_with_decl (newdecl, "static declaration for `%s' follows non-static");
        !          1604: 
        !          1605:          /* These bits are logically part of the type, for variables.
        !          1606:             But not for functions
        !          1607:             (where qualifiers are not valid ANSI anyway).  */
        !          1608:          if (pedantic && TREE_CODE (olddecl) != FUNCTION_DECL
        !          1609:              && (TREE_READONLY (newdecl) != TREE_READONLY (olddecl)
        !          1610:                  || TREE_THIS_VOLATILE (newdecl) != TREE_THIS_VOLATILE (olddecl)))
        !          1611:            pedwarn_with_decl (newdecl, "type qualifiers for `%s' conflict with previous decl");
        !          1612:        }
        !          1613:     }
        !          1614: 
        !          1615:   /* Optionally warn about more than one declaration for the same name.  */
        !          1616:   if (warn_redundant_decls && DECL_SOURCE_LINE (olddecl) != 0
        !          1617:       /* Dont warn about a function declaration
        !          1618:         followed by a definition.  */
        !          1619:       && !(TREE_CODE (newdecl) == FUNCTION_DECL && DECL_INITIAL (newdecl) != 0
        !          1620:           && DECL_INITIAL (olddecl) == 0)
        !          1621:       /* Don't warn about extern decl followed by (tentative) definition.  */
        !          1622:       && !(DECL_EXTERNAL (olddecl) && ! DECL_EXTERNAL (newdecl)))
        !          1623:     {
        !          1624:       warning_with_decl (newdecl, "redundant redeclaration of `%s' in same scope");
        !          1625:       warning_with_decl (olddecl, "previous declaration of `%s'");
        !          1626:     }
        !          1627: 
        !          1628:   /* Copy all the DECL_... slots specified in the new decl
        !          1629:      except for any that we copy here from the old type.
        !          1630: 
        !          1631:      Past this point, we don't change OLDTYPE and NEWTYPE
        !          1632:      even if we change the types of NEWDECL and OLDDECL.  */
        !          1633: 
        !          1634:   if (types_match)
        !          1635:     {
        !          1636:       /* Merge the data types specified in the two decls.  */
        !          1637:       if (TREE_CODE (newdecl) != FUNCTION_DECL || !DECL_BUILT_IN (olddecl))
        !          1638:        TREE_TYPE (newdecl)
        !          1639:          = TREE_TYPE (olddecl)
        !          1640:            = common_type (newtype, oldtype);
        !          1641: 
        !          1642:       /* Lay the type out, unless already done.  */
        !          1643:       if (oldtype != TREE_TYPE (newdecl))
        !          1644:        {
        !          1645:          if (TREE_TYPE (newdecl) != error_mark_node)
        !          1646:            layout_type (TREE_TYPE (newdecl));
        !          1647:          if (TREE_CODE (newdecl) != FUNCTION_DECL
        !          1648:              && TREE_CODE (newdecl) != TYPE_DECL
        !          1649:              && TREE_CODE (newdecl) != CONST_DECL)
        !          1650:            layout_decl (newdecl, 0);
        !          1651:        }
        !          1652:       else
        !          1653:        {
        !          1654:          /* Since the type is OLDDECL's, make OLDDECL's size go with.  */
        !          1655:          DECL_SIZE (newdecl) = DECL_SIZE (olddecl);
        !          1656:          if (TREE_CODE (olddecl) != FUNCTION_DECL)
        !          1657:            if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl))
        !          1658:              DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl);
        !          1659:        }
        !          1660: 
        !          1661:       /* Keep the old rtl since we can safely use it.  */
        !          1662:       DECL_RTL (newdecl) = DECL_RTL (olddecl);
        !          1663: 
        !          1664:       /* Merge the type qualifiers.  */
        !          1665:       if (DECL_BUILT_IN_NONANSI (olddecl) && TREE_THIS_VOLATILE (olddecl)
        !          1666:          && !TREE_THIS_VOLATILE (newdecl))
        !          1667:        TREE_THIS_VOLATILE (olddecl) = 0;
        !          1668:       if (TREE_READONLY (newdecl))
        !          1669:        TREE_READONLY (olddecl) = 1;
        !          1670:       if (TREE_THIS_VOLATILE (newdecl))
        !          1671:        {
        !          1672:          TREE_THIS_VOLATILE (olddecl) = 1;
        !          1673:          if (TREE_CODE (newdecl) == VAR_DECL)
        !          1674:            make_var_volatile (newdecl);
        !          1675:        }
        !          1676: 
        !          1677:       /* Keep source location of definition rather than declaration.  */
        !          1678:       if (DECL_INITIAL (newdecl) == 0 && DECL_INITIAL (olddecl) != 0)
        !          1679:        {
        !          1680:          DECL_SOURCE_LINE (newdecl) = DECL_SOURCE_LINE (olddecl);
        !          1681:          DECL_SOURCE_FILE (newdecl) = DECL_SOURCE_FILE (olddecl);
        !          1682:        }
        !          1683: 
        !          1684:       /* Merge the unused-warning information.  */
        !          1685:       if (DECL_IN_SYSTEM_HEADER (olddecl))
        !          1686:        DECL_IN_SYSTEM_HEADER (newdecl) = 1;
        !          1687:       else if (DECL_IN_SYSTEM_HEADER (newdecl))
        !          1688:        DECL_IN_SYSTEM_HEADER (olddecl) = 1;
        !          1689: 
        !          1690:       /* Merge the initialization information.  */
        !          1691:       if (DECL_INITIAL (newdecl) == 0)
        !          1692:        DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
        !          1693:     }
        !          1694:   /* If cannot merge, then use the new type and qualifiers,
        !          1695:      and don't preserve the old rtl.  */
        !          1696:   else
        !          1697:     {
        !          1698:       TREE_TYPE (olddecl) = TREE_TYPE (newdecl);
        !          1699:       TREE_READONLY (olddecl) = TREE_READONLY (newdecl);
        !          1700:       TREE_THIS_VOLATILE (olddecl) = TREE_THIS_VOLATILE (newdecl);
        !          1701:       TREE_SIDE_EFFECTS (olddecl) = TREE_SIDE_EFFECTS (newdecl);
        !          1702:     }
        !          1703: 
        !          1704:   /* Merge the storage class information.  */
        !          1705:   /* For functions, static overrides non-static.  */
        !          1706:   if (TREE_CODE (newdecl) == FUNCTION_DECL)
        !          1707:     {
        !          1708:       TREE_PUBLIC (newdecl) &= TREE_PUBLIC (olddecl);
        !          1709:       /* This is since we don't automatically
        !          1710:         copy the attributes of NEWDECL into OLDDECL.  */
        !          1711:       TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
        !          1712:       /* If this clears `static', clear it in the identifier too.  */
        !          1713:       if (! TREE_PUBLIC (olddecl))
        !          1714:        TREE_PUBLIC (DECL_NAME (olddecl)) = 0;
        !          1715:     }
        !          1716:   if (DECL_EXTERNAL (newdecl))
        !          1717:     {
        !          1718:       TREE_STATIC (newdecl) = TREE_STATIC (olddecl);
        !          1719:       DECL_EXTERNAL (newdecl) = DECL_EXTERNAL (olddecl);
        !          1720:       /* An extern decl does not override previous storage class.  */
        !          1721:       TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl);
        !          1722:     }
        !          1723:   else
        !          1724:     {
        !          1725:       TREE_STATIC (olddecl) = TREE_STATIC (newdecl);
        !          1726:       TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
        !          1727:     }
        !          1728: 
        !          1729:   /* If either decl says `inline', this fn is inline,
        !          1730:      unless its definition was passed already.  */
        !          1731:   if (DECL_INLINE (newdecl) && DECL_INITIAL (olddecl) == 0)
        !          1732:     DECL_INLINE (olddecl) = 1;
        !          1733:   DECL_INLINE (newdecl) = DECL_INLINE (olddecl);
        !          1734: 
        !          1735:   /* Get rid of any built-in function if new arg types don't match it
        !          1736:      or if we have a function definition.  */
        !          1737:   if (TREE_CODE (newdecl) == FUNCTION_DECL
        !          1738:       && DECL_BUILT_IN (olddecl)
        !          1739:       && (!types_match || new_is_definition))
        !          1740:     {
        !          1741:       TREE_TYPE (olddecl) = TREE_TYPE (newdecl);
        !          1742:       DECL_BUILT_IN (olddecl) = 0;
        !          1743:     }
        !          1744: 
        !          1745:   /* If redeclaring a builtin function, and not a definition,
        !          1746:      it stays built in.
        !          1747:      Also preserve various other info from the definition.  */
        !          1748:   if (TREE_CODE (newdecl) == FUNCTION_DECL && !new_is_definition)
        !          1749:     {
        !          1750:       if (DECL_BUILT_IN (olddecl))
        !          1751:        {
        !          1752:          DECL_BUILT_IN (newdecl) = 1;
        !          1753:          DECL_SET_FUNCTION_CODE (newdecl, DECL_FUNCTION_CODE (olddecl));
        !          1754:        }
        !          1755:       else
        !          1756:        DECL_FRAME_SIZE (newdecl) = DECL_FRAME_SIZE (olddecl);
        !          1757: 
        !          1758:       DECL_RESULT (newdecl) = DECL_RESULT (olddecl);
        !          1759:       DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
        !          1760:       DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl);
        !          1761:       DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl);
        !          1762:     }
        !          1763: 
        !          1764:   /* Copy most of the decl-specific fields of NEWDECL into OLDDECL.
        !          1765:      But preserve OLDdECL's DECL_UID.  */
        !          1766:   {
        !          1767:     register unsigned olddecl_uid = DECL_UID (olddecl);
        !          1768: 
        !          1769:     bcopy ((char *) newdecl + sizeof (struct tree_common),
        !          1770:           (char *) olddecl + sizeof (struct tree_common),
        !          1771:           sizeof (struct tree_decl) - sizeof (struct tree_common));
        !          1772:     DECL_UID (olddecl) = olddecl_uid;
        !          1773:   }
        !          1774: 
        !          1775:   return 1;
        !          1776: }
        !          1777: 
        !          1778: /* Record a decl-node X as belonging to the current lexical scope.
        !          1779:    Check for errors (such as an incompatible declaration for the same
        !          1780:    name already seen in the same scope).
        !          1781: 
        !          1782:    Returns either X or an old decl for the same name.
        !          1783:    If an old decl is returned, it may have been smashed
        !          1784:    to agree with what X says.  */
        !          1785: 
        !          1786: tree
        !          1787: pushdecl (x)
        !          1788:      tree x;
        !          1789: {
        !          1790:   register tree t;
        !          1791:   register tree name = DECL_NAME (x);
        !          1792:   register struct binding_level *b = current_binding_level;
        !          1793: 
        !          1794:   DECL_CONTEXT (x) = current_function_decl;
        !          1795:   /* A local extern declaration for a function doesn't constitute nesting.
        !          1796:      A local auto declaration does, since it's a forward decl
        !          1797:      for a nested function coming later.  */
        !          1798:   if (TREE_CODE (x) == FUNCTION_DECL && DECL_INITIAL (x) == 0
        !          1799:       && DECL_EXTERNAL (x))
        !          1800:     DECL_CONTEXT (x) = 0;
        !          1801: 
        !          1802:   if (warn_nested_externs && DECL_EXTERNAL (x) && b != global_binding_level
        !          1803:       && x != IDENTIFIER_IMPLICIT_DECL (name)
        !          1804:       /* Don't print error messages for __FUNCTION__ and __PRETTY_FUNCTION__ */
        !          1805:       && !DECL_IN_SYSTEM_HEADER (x))
        !          1806:     warning ("nested extern declaration of `%s'", IDENTIFIER_POINTER (name));
        !          1807: 
        !          1808:   if (name)
        !          1809:     {
        !          1810:       char *file;
        !          1811:       int line;
        !          1812: 
        !          1813:       t = lookup_name_current_level (name);
        !          1814:       if (t != 0 && t == error_mark_node)
        !          1815:        /* error_mark_node is 0 for a while during initialization!  */
        !          1816:        {
        !          1817:          t = 0;
        !          1818:          error_with_decl (x, "`%s' used prior to declaration");
        !          1819:        }
        !          1820: 
        !          1821:       if (t != 0)
        !          1822:        {
        !          1823:          file = DECL_SOURCE_FILE (t);
        !          1824:          line = DECL_SOURCE_LINE (t);
        !          1825:        }
        !          1826: 
        !          1827:       if (t != 0 && duplicate_decls (x, t))
        !          1828:        {
        !          1829:          if (TREE_CODE (t) == PARM_DECL)
        !          1830:            {
        !          1831:              /* Don't allow more than one "real" duplicate
        !          1832:                 of a forward parm decl.  */
        !          1833:              TREE_ASM_WRITTEN (t) = TREE_ASM_WRITTEN (x);
        !          1834:              return t;
        !          1835:            }
        !          1836:          /* If this decl is `static' and an implicit decl was seen previously,
        !          1837:             warn.  But don't complain if -traditional,
        !          1838:             since traditional compilers don't complain.  */
        !          1839:          if (!flag_traditional && TREE_PUBLIC (name)
        !          1840:              && ! TREE_PUBLIC (x) && ! DECL_EXTERNAL (x)
        !          1841:              /* We used to warn also for explicit extern followed by static,
        !          1842:                 but sometimes you need to do it that way.  */
        !          1843:              && IDENTIFIER_IMPLICIT_DECL (name) != 0)
        !          1844:            {
        !          1845:              pedwarn ("`%s' was declared implicitly `extern' and later `static'",
        !          1846:                       IDENTIFIER_POINTER (name));
        !          1847:              pedwarn_with_file_and_line (file, line,
        !          1848:                                          "previous declaration of `%s'",
        !          1849:                                          IDENTIFIER_POINTER (name));
        !          1850:            }
        !          1851: 
        !          1852:          return t;
        !          1853:        }
        !          1854: 
        !          1855:       /* If we are processing a typedef statement, generate a whole new
        !          1856:         ..._TYPE node (which will be just an variant of the existing
        !          1857:         ..._TYPE node with identical properties) and then install the
        !          1858:         TYPE_DECL node generated to represent the typedef name as the
        !          1859:         TYPE_NAME of this brand new (duplicate) ..._TYPE node.
        !          1860: 
        !          1861:         The whole point here is to end up with a situation where each
        !          1862:         and every ..._TYPE node the compiler creates will be uniquely
        !          1863:         associated with AT MOST one node representing a typedef name.
        !          1864:         This way, even though the compiler substitutes corresponding
        !          1865:         ..._TYPE nodes for TYPE_DECL (i.e. "typedef name") nodes very
        !          1866:         early on, later parts of the compiler can always do the reverse
        !          1867:         translation and get back the corresponding typedef name.  For
        !          1868:         example, given:
        !          1869: 
        !          1870:                typedef struct S MY_TYPE;
        !          1871:                MY_TYPE object;
        !          1872: 
        !          1873:         Later parts of the compiler might only know that `object' was of
        !          1874:         type `struct S' if if were not for code just below.  With this
        !          1875:         code however, later parts of the compiler see something like:
        !          1876: 
        !          1877:                struct S' == struct S
        !          1878:                typedef struct S' MY_TYPE;
        !          1879:                struct S' object;
        !          1880: 
        !          1881:         And they can then deduce (from the node for type struct S') that
        !          1882:         the original object declaration was:
        !          1883: 
        !          1884:                MY_TYPE object;
        !          1885: 
        !          1886:         Being able to do this is important for proper support of protoize,
        !          1887:         and also for generating precise symbolic debugging information
        !          1888:         which takes full account of the programmer's (typedef) vocabulary.
        !          1889: 
        !          1890:          Obviously, we don't want to generate a duplicate ..._TYPE node if
        !          1891:         the TYPE_DECL node that we are now processing really represents a
        !          1892:         standard built-in type.
        !          1893: 
        !          1894:          Since all standard types are effectively declared at line zero
        !          1895:          in the source file, we can easily check to see if we are working
        !          1896:          on a standard type by checking the current value of lineno.  */
        !          1897: 
        !          1898:       if (TREE_CODE (x) == TYPE_DECL)
        !          1899:         {
        !          1900:           if (DECL_SOURCE_LINE (x) == 0)
        !          1901:             {
        !          1902:              if (TYPE_NAME (TREE_TYPE (x)) == 0)
        !          1903:                TYPE_NAME (TREE_TYPE (x)) = x;
        !          1904:             }
        !          1905:           else if (TREE_TYPE (x) != error_mark_node)
        !          1906:             {
        !          1907:               tree tt = TREE_TYPE (x);
        !          1908: 
        !          1909:               tt = build_type_copy (tt);
        !          1910:               TYPE_NAME (tt) = x;
        !          1911:               TREE_TYPE (x) = tt;
        !          1912:             }
        !          1913:         }
        !          1914: 
        !          1915:       /* Multiple external decls of the same identifier ought to match.
        !          1916:         Check against both global declarations and out of scope (limbo) block
        !          1917:         level declarations.
        !          1918: 
        !          1919:         We get warnings about inline functions where they are defined.
        !          1920:         Avoid duplicate warnings where they are used.  */
        !          1921:       if (TREE_PUBLIC (x) && ! DECL_INLINE (x))
        !          1922:        {
        !          1923:          tree decl;
        !          1924: 
        !          1925:          if (IDENTIFIER_GLOBAL_VALUE (name) != 0
        !          1926:              && (DECL_EXTERNAL (IDENTIFIER_GLOBAL_VALUE (name))
        !          1927:                  || TREE_PUBLIC (IDENTIFIER_GLOBAL_VALUE (name))))
        !          1928:            decl = IDENTIFIER_GLOBAL_VALUE (name);
        !          1929:          else if (IDENTIFIER_LIMBO_VALUE (name) != 0)
        !          1930:            /* Decls in limbo are always extern, so no need to check that.  */
        !          1931:            decl = IDENTIFIER_LIMBO_VALUE (name);
        !          1932:          else
        !          1933:            decl = 0;
        !          1934: 
        !          1935:          if (decl && ! comptypes (TREE_TYPE (x), TREE_TYPE (decl))
        !          1936:              /* If old decl is built-in, we already warned if we should.  */
        !          1937:              && !DECL_BUILT_IN (decl))
        !          1938:            {
        !          1939:              pedwarn_with_decl (x,
        !          1940:                                 "type mismatch with previous external decl");
        !          1941:              pedwarn_with_decl (decl, "previous external decl of `%s'");
        !          1942:            }
        !          1943:        }
        !          1944: 
        !          1945:       /* If a function has had an implicit declaration, and then is defined,
        !          1946:         make sure they are compatible.  */
        !          1947: 
        !          1948:       if (IDENTIFIER_IMPLICIT_DECL (name) != 0
        !          1949:          && IDENTIFIER_GLOBAL_VALUE (name) == 0
        !          1950:          && TREE_CODE (x) == FUNCTION_DECL
        !          1951:          && ! comptypes (TREE_TYPE (x),
        !          1952:                          TREE_TYPE (IDENTIFIER_IMPLICIT_DECL (name))))
        !          1953:        {
        !          1954:          warning_with_decl (x, "type mismatch with previous implicit declaration");
        !          1955:          warning_with_decl (IDENTIFIER_IMPLICIT_DECL (name),
        !          1956:                             "previous implicit declaration of `%s'");
        !          1957:        }
        !          1958: 
        !          1959:       /* In PCC-compatibility mode, extern decls of vars with no current decl
        !          1960:         take effect at top level no matter where they are.  */
        !          1961:       if (flag_traditional && DECL_EXTERNAL (x)
        !          1962:          && lookup_name (name) == 0)
        !          1963:        {
        !          1964:          tree type = TREE_TYPE (x);
        !          1965: 
        !          1966:          /* But don't do this if the type contains temporary nodes.  */
        !          1967:          while (type)
        !          1968:            {
        !          1969:              if (type == error_mark_node)
        !          1970:                break;
        !          1971:              if (! TREE_PERMANENT (type))
        !          1972:                {
        !          1973:                  warning_with_decl (x, "type of external `%s' is not global");
        !          1974:                  /* By exiting the loop early, we leave TYPE nonzero,
        !          1975:                     and thus prevent globalization of the decl.  */
        !          1976:                  break;
        !          1977:                }
        !          1978:              else if (TREE_CODE (type) == FUNCTION_TYPE
        !          1979:                       && TYPE_ARG_TYPES (type) != 0)
        !          1980:                /* The types might not be truly local,
        !          1981:                   but the list of arg types certainly is temporary.
        !          1982:                   Since prototypes are nontraditional,
        !          1983:                   ok not to do the traditional thing.  */
        !          1984:                break;
        !          1985:              type = TREE_TYPE (type);
        !          1986:            }
        !          1987: 
        !          1988:          if (type == 0)
        !          1989:            b = global_binding_level;
        !          1990:        }
        !          1991: 
        !          1992:       /* This name is new in its binding level.
        !          1993:         Install the new declaration and return it.  */
        !          1994:       if (b == global_binding_level)
        !          1995:        {
        !          1996:          /* Install a global value.  */
        !          1997:          
        !          1998:          /* If the first global decl has external linkage,
        !          1999:             warn if we later see static one.  */
        !          2000:          if (IDENTIFIER_GLOBAL_VALUE (name) == 0 && TREE_PUBLIC (x))
        !          2001:            TREE_PUBLIC (name) = 1;
        !          2002: 
        !          2003:          IDENTIFIER_GLOBAL_VALUE (name) = x;
        !          2004: 
        !          2005:          /* We no longer care about any previous block level declarations.  */
        !          2006:          IDENTIFIER_LIMBO_VALUE (name) = 0;
        !          2007: 
        !          2008:          /* Don't forget if the function was used via an implicit decl.  */
        !          2009:          if (IDENTIFIER_IMPLICIT_DECL (name)
        !          2010:              && TREE_USED (IDENTIFIER_IMPLICIT_DECL (name)))
        !          2011:            TREE_USED (x) = 1, TREE_USED (name) = 1;
        !          2012: 
        !          2013:          /* Don't forget if its address was taken in that way.  */
        !          2014:          if (IDENTIFIER_IMPLICIT_DECL (name)
        !          2015:              && TREE_ADDRESSABLE (IDENTIFIER_IMPLICIT_DECL (name)))
        !          2016:            TREE_ADDRESSABLE (x) = 1;
        !          2017: 
        !          2018:          /* Warn about mismatches against previous implicit decl.  */
        !          2019:          if (IDENTIFIER_IMPLICIT_DECL (name) != 0
        !          2020:              /* If this real decl matches the implicit, don't complain.  */
        !          2021:              && ! (TREE_CODE (x) == FUNCTION_DECL
        !          2022:                    && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (x)))
        !          2023:                        == integer_type_node)))
        !          2024:            pedwarn ("`%s' was previously implicitly declared to return `int'",
        !          2025:                     IDENTIFIER_POINTER (name));
        !          2026: 
        !          2027:          /* If this decl is `static' and an `extern' was seen previously,
        !          2028:             that is erroneous.  */
        !          2029:          if (TREE_PUBLIC (name)
        !          2030:              && ! TREE_PUBLIC (x) && ! DECL_EXTERNAL (x))
        !          2031:            {
        !          2032:              /* Okay to redeclare an ANSI built-in as static.  */
        !          2033:              if (t != 0 && DECL_BUILT_IN (t))
        !          2034:                ;
        !          2035:              /* Okay to declare a non-ANSI built-in as anything.  */
        !          2036:              else if (t != 0 && DECL_BUILT_IN_NONANSI (t))
        !          2037:                ;
        !          2038:              else if (IDENTIFIER_IMPLICIT_DECL (name))
        !          2039:                pedwarn ("`%s' was declared implicitly `extern' and later `static'",
        !          2040:                         IDENTIFIER_POINTER (name));
        !          2041:              else
        !          2042:                pedwarn ("`%s' was declared `extern' and later `static'",
        !          2043:                         IDENTIFIER_POINTER (name));
        !          2044:            }
        !          2045:        }
        !          2046:       else
        !          2047:        {
        !          2048:          /* Here to install a non-global value.  */
        !          2049:          tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
        !          2050:          tree oldglobal = IDENTIFIER_GLOBAL_VALUE (name);
        !          2051:          IDENTIFIER_LOCAL_VALUE (name) = x;
        !          2052: 
        !          2053:          /* If this is an extern function declaration, see if we
        !          2054:             have a global definition or declaration for the function.  */
        !          2055:          if (oldlocal == 0
        !          2056:              && DECL_EXTERNAL (x) && !DECL_INLINE (x)
        !          2057:              && oldglobal != 0
        !          2058:              && TREE_CODE (x) == FUNCTION_DECL
        !          2059:              && TREE_CODE (oldglobal) == FUNCTION_DECL)
        !          2060:            {
        !          2061:              /* We have one.  Their types must agree.  */
        !          2062:              if (! comptypes (TREE_TYPE (x),
        !          2063:                               TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (name))))
        !          2064:                pedwarn_with_decl (x, "extern declaration of `%s' doesn't match global one");
        !          2065:              else
        !          2066:                {
        !          2067:                  /* Inner extern decl is inline if global one is.
        !          2068:                     Copy enough to really inline it.  */
        !          2069:                  if (DECL_INLINE (oldglobal))
        !          2070:                    {
        !          2071:                      DECL_INLINE (x) = DECL_INLINE (oldglobal);
        !          2072:                      DECL_INITIAL (x) = (current_function_decl == oldglobal
        !          2073:                                          ? 0 : DECL_INITIAL (oldglobal));
        !          2074:                      DECL_SAVED_INSNS (x) = DECL_SAVED_INSNS (oldglobal);
        !          2075:                      DECL_FRAME_SIZE (x) = DECL_FRAME_SIZE (oldglobal);
        !          2076:                      DECL_ARGUMENTS (x) = DECL_ARGUMENTS (oldglobal);
        !          2077:                      DECL_RESULT (x) = DECL_RESULT (oldglobal);
        !          2078:                      TREE_ASM_WRITTEN (x) = TREE_ASM_WRITTEN (oldglobal);
        !          2079:                      DECL_ABSTRACT_ORIGIN (x) = oldglobal;
        !          2080:                    }
        !          2081:                  /* Inner extern decl is built-in if global one is.  */
        !          2082:                  if (DECL_BUILT_IN (oldglobal))
        !          2083:                    {
        !          2084:                      DECL_BUILT_IN (x) = DECL_BUILT_IN (oldglobal);
        !          2085:                      DECL_SET_FUNCTION_CODE (x, DECL_FUNCTION_CODE (oldglobal));
        !          2086:                    }
        !          2087:                  /* Keep the arg types from a file-scope fcn defn.  */
        !          2088:                  if (TYPE_ARG_TYPES (TREE_TYPE (oldglobal)) != 0
        !          2089:                      && DECL_INITIAL (oldglobal)
        !          2090:                      && TYPE_ARG_TYPES (TREE_TYPE (x)) == 0)
        !          2091:                    TREE_TYPE (x) = TREE_TYPE (oldglobal);
        !          2092:                }
        !          2093:            }
        !          2094: 
        !          2095: #if 0 /* This case is probably sometimes the right thing to do.  */
        !          2096:          /* If we have a local external declaration,
        !          2097:             then any file-scope declaration should not
        !          2098:             have been static.  */
        !          2099:          if (oldlocal == 0 && oldglobal != 0
        !          2100:              && !TREE_PUBLIC (oldglobal)
        !          2101:              && DECL_EXTERNAL (x) && TREE_PUBLIC (x))
        !          2102:            warning ("`%s' locally external but globally static",
        !          2103:                     IDENTIFIER_POINTER (name));
        !          2104: #endif
        !          2105: 
        !          2106:          /* If we have a local external declaration,
        !          2107:             and no file-scope declaration has yet been seen,
        !          2108:             then if we later have a file-scope decl it must not be static.  */
        !          2109:          if (oldlocal == 0
        !          2110:              && oldglobal == 0
        !          2111:              && DECL_EXTERNAL (x)
        !          2112:              && TREE_PUBLIC (x))
        !          2113:            {
        !          2114:              TREE_PUBLIC (name) = 1;
        !          2115: 
        !          2116:              /* Save this decl, so that we can do type checking against
        !          2117:                 other decls after it falls out of scope.
        !          2118: 
        !          2119:                 Only save it once.  This prevents temporary decls created in
        !          2120:                 expand_inline_function from being used here, since this
        !          2121:                 will have been set when the inline function was parsed.
        !          2122:                 It also helps give slightly better warnings.  */
        !          2123:              if (IDENTIFIER_LIMBO_VALUE (name) == 0)
        !          2124:                IDENTIFIER_LIMBO_VALUE (name) = x;
        !          2125:            }
        !          2126: 
        !          2127:          /* Warn if shadowing an argument at the top level of the body.  */
        !          2128:          if (oldlocal != 0 && !DECL_EXTERNAL (x)
        !          2129:              /* This warning doesn't apply to the parms of a nested fcn.  */
        !          2130:              && ! current_binding_level->parm_flag
        !          2131:              /* Check that this is one level down from the parms.  */
        !          2132:              && current_binding_level->level_chain->parm_flag
        !          2133:              /* Check that the decl being shadowed
        !          2134:                 comes from the parm level, one level up.  */
        !          2135:              && chain_member (oldlocal, current_binding_level->level_chain->names))
        !          2136:            {
        !          2137:              if (TREE_CODE (oldlocal) == PARM_DECL)
        !          2138:                pedwarn ("declaration of `%s' shadows a parameter",
        !          2139:                         IDENTIFIER_POINTER (name));
        !          2140:              else
        !          2141:                pedwarn ("declaration of `%s' shadows a symbol from the parameter list",
        !          2142:                         IDENTIFIER_POINTER (name));
        !          2143:            }
        !          2144: 
        !          2145:          /* Maybe warn if shadowing something else.  */
        !          2146:          else if (warn_shadow && !DECL_EXTERNAL (x)
        !          2147:                   /* No shadow warnings for internally generated vars.  */
        !          2148:                   && DECL_SOURCE_LINE (x) != 0
        !          2149:                   /* No shadow warnings for vars made for inlining.  */
        !          2150:                   && ! DECL_FROM_INLINE (x))
        !          2151:            {
        !          2152:              char *warnstring = 0;
        !          2153: 
        !          2154:              if (TREE_CODE (x) == PARM_DECL
        !          2155:                  && current_binding_level->level_chain->parm_flag)
        !          2156:                /* Don't warn about the parm names in function declarator
        !          2157:                   within a function declarator.
        !          2158:                   It would be nice to avoid warning in any function
        !          2159:                   declarator in a declaration, as opposed to a definition,
        !          2160:                   but there is no way to tell it's not a definition.  */
        !          2161:                ;
        !          2162:              else if (oldlocal != 0 && TREE_CODE (oldlocal) == PARM_DECL)
        !          2163:                warnstring = "declaration of `%s' shadows a parameter";
        !          2164:              else if (oldlocal != 0)
        !          2165:                warnstring = "declaration of `%s' shadows previous local";
        !          2166:              else if (IDENTIFIER_GLOBAL_VALUE (name) != 0
        !          2167:                       && IDENTIFIER_GLOBAL_VALUE (name) != error_mark_node)
        !          2168:                warnstring = "declaration of `%s' shadows global declaration";
        !          2169: 
        !          2170:              if (warnstring)
        !          2171:                warning (warnstring, IDENTIFIER_POINTER (name));
        !          2172:            }
        !          2173: 
        !          2174:          /* If storing a local value, there may already be one (inherited).
        !          2175:             If so, record it for restoration when this binding level ends.  */
        !          2176:          if (oldlocal != 0)
        !          2177:            b->shadowed = tree_cons (name, oldlocal, b->shadowed);
        !          2178:        }
        !          2179: 
        !          2180:       /* Keep count of variables in this level with incomplete type.  */
        !          2181:       if (TYPE_SIZE (TREE_TYPE (x)) == 0)
        !          2182:        ++b->n_incomplete;
        !          2183:     }
        !          2184: 
        !          2185:   /* Put decls on list in reverse order.
        !          2186:      We will reverse them later if necessary.  */
        !          2187:   TREE_CHAIN (x) = b->names;
        !          2188:   b->names = x;
        !          2189: 
        !          2190:   return x;
        !          2191: }
        !          2192: 
        !          2193: /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate.  */
        !          2194: 
        !          2195: tree
        !          2196: pushdecl_top_level (x)
        !          2197:      tree x;
        !          2198: {
        !          2199:   register tree t;
        !          2200:   register struct binding_level *b = current_binding_level;
        !          2201:   register tree function_decl = current_function_decl;
        !          2202: 
        !          2203:   current_binding_level = global_binding_level;
        !          2204:   current_function_decl = 0;
        !          2205:   t = pushdecl (x);
        !          2206:   current_binding_level = b;
        !          2207:   current_function_decl = function_decl;
        !          2208:   return t;
        !          2209: }
        !          2210: 
        !          2211: /* Generate an implicit declaration for identifier FUNCTIONID
        !          2212:    as a function of type int ().  Print a warning if appropriate.  */
        !          2213: 
        !          2214: tree
        !          2215: implicitly_declare (functionid)
        !          2216:      tree functionid;
        !          2217: {
        !          2218:   register tree decl;
        !          2219:   int traditional_warning = 0;
        !          2220:   /* Only one "implicit declaration" warning per identifier.  */
        !          2221:   int implicit_warning;
        !          2222: 
        !          2223:   /* Save the decl permanently so we can warn if definition follows.  */
        !          2224:   push_obstacks_nochange ();
        !          2225:   end_temporary_allocation ();
        !          2226: 
        !          2227:   /* We used to reuse an old implicit decl here,
        !          2228:      but this loses with inline functions because it can clobber
        !          2229:      the saved decl chains.  */
        !          2230: /*  if (IDENTIFIER_IMPLICIT_DECL (functionid) != 0)
        !          2231:     decl = IDENTIFIER_IMPLICIT_DECL (functionid);
        !          2232:   else  */
        !          2233:     decl = build_decl (FUNCTION_DECL, functionid, default_function_type);
        !          2234: 
        !          2235:   /* Warn of implicit decl following explicit local extern decl.
        !          2236:      This is probably a program designed for traditional C.  */
        !          2237:   if (TREE_PUBLIC (functionid) && IDENTIFIER_GLOBAL_VALUE (functionid) == 0)
        !          2238:     traditional_warning = 1;
        !          2239: 
        !          2240:   /* Warn once of an implicit declaration.  */
        !          2241:   implicit_warning = (IDENTIFIER_IMPLICIT_DECL (functionid) == 0);
        !          2242: 
        !          2243:   DECL_EXTERNAL (decl) = 1;
        !          2244:   TREE_PUBLIC (decl) = 1;
        !          2245: 
        !          2246:   /* Record that we have an implicit decl and this is it.  */
        !          2247:   IDENTIFIER_IMPLICIT_DECL (functionid) = decl;
        !          2248: 
        !          2249:   /* ANSI standard says implicit declarations are in the innermost block.
        !          2250:      So we record the decl in the standard fashion.
        !          2251:      If flag_traditional is set, pushdecl does it top-level.  */
        !          2252:   pushdecl (decl);
        !          2253: 
        !          2254:   /* This is a no-op in c-lang.c or something real in objc-actions.c.  */
        !          2255:   maybe_objc_check_decl (decl);
        !          2256: 
        !          2257:   rest_of_decl_compilation (decl, NULL_PTR, 0, 0);
        !          2258: 
        !          2259:   if (warn_implicit && implicit_warning)
        !          2260:     warning ("implicit declaration of function `%s'",
        !          2261:             IDENTIFIER_POINTER (functionid));
        !          2262:   else if (warn_traditional && traditional_warning)
        !          2263:     warning ("function `%s' was previously declared within a block",
        !          2264:             IDENTIFIER_POINTER (functionid));
        !          2265: 
        !          2266:   /* Write a record describing this implicit function declaration to the
        !          2267:      prototypes file (if requested).  */
        !          2268: 
        !          2269:   gen_aux_info_record (decl, 0, 1, 0);
        !          2270: 
        !          2271:   pop_obstacks ();
        !          2272: 
        !          2273:   return decl;
        !          2274: }
        !          2275: 
        !          2276: /* Return zero if the declaration NEWDECL is valid
        !          2277:    when the declaration OLDDECL (assumed to be for the same name)
        !          2278:    has already been seen.
        !          2279:    Otherwise return an error message format string with a %s
        !          2280:    where the identifier should go.  */
        !          2281: 
        !          2282: static char *
        !          2283: redeclaration_error_message (newdecl, olddecl)
        !          2284:      tree newdecl, olddecl;
        !          2285: {
        !          2286:   if (TREE_CODE (newdecl) == TYPE_DECL)
        !          2287:     {
        !          2288:       if (flag_traditional && TREE_TYPE (newdecl) == TREE_TYPE (olddecl))
        !          2289:        return 0;
        !          2290:       return "redefinition of `%s'";
        !          2291:     }
        !          2292:   else if (TREE_CODE (newdecl) == FUNCTION_DECL)
        !          2293:     {
        !          2294:       /* Declarations of functions can insist on internal linkage
        !          2295:         but they can't be inconsistent with internal linkage,
        !          2296:         so there can be no error on that account.
        !          2297:         However defining the same name twice is no good.  */
        !          2298:       if (DECL_INITIAL (olddecl) != 0 && DECL_INITIAL (newdecl) != 0
        !          2299:          /* However, defining once as extern inline and a second
        !          2300:             time in another way is ok.  */
        !          2301:          && !(DECL_INLINE (olddecl) && DECL_EXTERNAL (olddecl)
        !          2302:               && !(DECL_INLINE (newdecl) && DECL_EXTERNAL (newdecl))))
        !          2303:        return "redefinition of `%s'";
        !          2304:       return 0;
        !          2305:     }
        !          2306:   else if (current_binding_level == global_binding_level)
        !          2307:     {
        !          2308:       /* Objects declared at top level:  */
        !          2309:       /* If at least one is a reference, it's ok.  */
        !          2310:       if (DECL_EXTERNAL (newdecl) || DECL_EXTERNAL (olddecl))
        !          2311:        return 0;
        !          2312:       /* Reject two definitions.  */
        !          2313:       if (DECL_INITIAL (olddecl) != 0 && DECL_INITIAL (newdecl) != 0)
        !          2314:        return "redefinition of `%s'";
        !          2315:       /* Now we have two tentative defs, or one tentative and one real def.  */
        !          2316:       /* Insist that the linkage match.  */
        !          2317:       if (TREE_PUBLIC (olddecl) != TREE_PUBLIC (newdecl))
        !          2318:        return "conflicting declarations of `%s'";
        !          2319:       return 0;
        !          2320:     }
        !          2321:   else if (current_binding_level->parm_flag
        !          2322:           && TREE_ASM_WRITTEN (olddecl) && !TREE_ASM_WRITTEN (newdecl))
        !          2323:     return 0;
        !          2324:   else
        !          2325:     {
        !          2326:       /* Objects declared with block scope:  */
        !          2327:       /* Reject two definitions, and reject a definition
        !          2328:         together with an external reference.  */
        !          2329:       if (!(DECL_EXTERNAL (newdecl) && DECL_EXTERNAL (olddecl)))
        !          2330:        return "redeclaration of `%s'";
        !          2331:       return 0;
        !          2332:     }
        !          2333: }
        !          2334: 
        !          2335: /* Get the LABEL_DECL corresponding to identifier ID as a label.
        !          2336:    Create one if none exists so far for the current function.
        !          2337:    This function is called for both label definitions and label references.  */
        !          2338: 
        !          2339: tree
        !          2340: lookup_label (id)
        !          2341:      tree id;
        !          2342: {
        !          2343:   register tree decl = IDENTIFIER_LABEL_VALUE (id);
        !          2344: 
        !          2345:   if (current_function_decl == 0)
        !          2346:     {
        !          2347:       error ("label %s referenced outside of any function",
        !          2348:             IDENTIFIER_POINTER (id));
        !          2349:       return 0;
        !          2350:     }
        !          2351: 
        !          2352:   /* Use a label already defined or ref'd with this name.  */
        !          2353:   if (decl != 0)
        !          2354:     {
        !          2355:       /* But not if it is inherited and wasn't declared to be inheritable.  */
        !          2356:       if (DECL_CONTEXT (decl) != current_function_decl
        !          2357:          && ! C_DECLARED_LABEL_FLAG (decl))
        !          2358:        return shadow_label (id);
        !          2359:       return decl;
        !          2360:     }
        !          2361: 
        !          2362:   decl = build_decl (LABEL_DECL, id, void_type_node);
        !          2363: 
        !          2364:   /* Make sure every label has an rtx.  */
        !          2365:   label_rtx (decl);
        !          2366: 
        !          2367:   /* A label not explicitly declared must be local to where it's ref'd.  */
        !          2368:   DECL_CONTEXT (decl) = current_function_decl;
        !          2369: 
        !          2370:   DECL_MODE (decl) = VOIDmode;
        !          2371: 
        !          2372:   /* Say where one reference is to the label,
        !          2373:      for the sake of the error if it is not defined.  */
        !          2374:   DECL_SOURCE_LINE (decl) = lineno;
        !          2375:   DECL_SOURCE_FILE (decl) = input_filename;
        !          2376: 
        !          2377:   IDENTIFIER_LABEL_VALUE (id) = decl;
        !          2378: 
        !          2379:   named_labels = tree_cons (NULL_TREE, decl, named_labels);
        !          2380: 
        !          2381:   return decl;
        !          2382: }
        !          2383: 
        !          2384: /* Make a label named NAME in the current function,
        !          2385:    shadowing silently any that may be inherited from containing functions
        !          2386:    or containing scopes.
        !          2387: 
        !          2388:    Note that valid use, if the label being shadowed
        !          2389:    comes from another scope in the same function,
        !          2390:    requires calling declare_nonlocal_label right away.  */
        !          2391: 
        !          2392: tree
        !          2393: shadow_label (name)
        !          2394:      tree name;
        !          2395: {
        !          2396:   register tree decl = IDENTIFIER_LABEL_VALUE (name);
        !          2397: 
        !          2398:   if (decl != 0)
        !          2399:     {
        !          2400:       shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels);
        !          2401:       IDENTIFIER_LABEL_VALUE (name) = decl = 0;
        !          2402:     }
        !          2403: 
        !          2404:   return lookup_label (name);
        !          2405: }
        !          2406: 
        !          2407: /* Define a label, specifying the location in the source file.
        !          2408:    Return the LABEL_DECL node for the label, if the definition is valid.
        !          2409:    Otherwise return 0.  */
        !          2410: 
        !          2411: tree
        !          2412: define_label (filename, line, name)
        !          2413:      char *filename;
        !          2414:      int line;
        !          2415:      tree name;
        !          2416: {
        !          2417:   tree decl = lookup_label (name);
        !          2418: 
        !          2419:   /* If label with this name is known from an outer context, shadow it.  */
        !          2420:   if (decl != 0 && DECL_CONTEXT (decl) != current_function_decl)
        !          2421:     {
        !          2422:       shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels);
        !          2423:       IDENTIFIER_LABEL_VALUE (name) = 0;
        !          2424:       decl = lookup_label (name);
        !          2425:     }
        !          2426: 
        !          2427:   if (DECL_INITIAL (decl) != 0)
        !          2428:     {
        !          2429:       error ("duplicate label `%s'", IDENTIFIER_POINTER (name));
        !          2430:       return 0;
        !          2431:     }
        !          2432:   else
        !          2433:     {
        !          2434:       /* Mark label as having been defined.  */
        !          2435:       DECL_INITIAL (decl) = error_mark_node;
        !          2436:       /* Say where in the source.  */
        !          2437:       DECL_SOURCE_FILE (decl) = filename;
        !          2438:       DECL_SOURCE_LINE (decl) = line;
        !          2439:       return decl;
        !          2440:     }
        !          2441: }
        !          2442: 
        !          2443: /* Return the list of declarations of the current level.
        !          2444:    Note that this list is in reverse order unless/until
        !          2445:    you nreverse it; and when you do nreverse it, you must
        !          2446:    store the result back using `storedecls' or you will lose.  */
        !          2447: 
        !          2448: tree
        !          2449: getdecls ()
        !          2450: {
        !          2451:   return current_binding_level->names;
        !          2452: }
        !          2453: 
        !          2454: /* Return the list of type-tags (for structs, etc) of the current level.  */
        !          2455: 
        !          2456: tree
        !          2457: gettags ()
        !          2458: {
        !          2459:   return current_binding_level->tags;
        !          2460: }
        !          2461: 
        !          2462: /* Store the list of declarations of the current level.
        !          2463:    This is done for the parameter declarations of a function being defined,
        !          2464:    after they are modified in the light of any missing parameters.  */
        !          2465: 
        !          2466: static void
        !          2467: storedecls (decls)
        !          2468:      tree decls;
        !          2469: {
        !          2470:   current_binding_level->names = decls;
        !          2471: }
        !          2472: 
        !          2473: /* Similarly, store the list of tags of the current level.  */
        !          2474: 
        !          2475: static void
        !          2476: storetags (tags)
        !          2477:      tree tags;
        !          2478: {
        !          2479:   current_binding_level->tags = tags;
        !          2480: }
        !          2481: 
        !          2482: /* Given NAME, an IDENTIFIER_NODE,
        !          2483:    return the structure (or union or enum) definition for that name.
        !          2484:    Searches binding levels from BINDING_LEVEL up to the global level.
        !          2485:    If THISLEVEL_ONLY is nonzero, searches only the specified context
        !          2486:    (but skips any tag-transparent contexts to find one that is
        !          2487:    meaningful for tags).
        !          2488:    CODE says which kind of type the caller wants;
        !          2489:    it is RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE.
        !          2490:    If the wrong kind of type is found, an error is reported.  */
        !          2491: 
        !          2492: static tree
        !          2493: lookup_tag (code, name, binding_level, thislevel_only)
        !          2494:      enum tree_code code;
        !          2495:      struct binding_level *binding_level;
        !          2496:      tree name;
        !          2497:      int thislevel_only;
        !          2498: {
        !          2499:   register struct binding_level *level;
        !          2500: 
        !          2501:   for (level = binding_level; level; level = level->level_chain)
        !          2502:     {
        !          2503:       register tree tail;
        !          2504:       for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
        !          2505:        {
        !          2506:          if (TREE_PURPOSE (tail) == name)
        !          2507:            {
        !          2508:              if (TREE_CODE (TREE_VALUE (tail)) != code)
        !          2509:                {
        !          2510:                  /* Definition isn't the kind we were looking for.  */
        !          2511:                  pending_invalid_xref = name;
        !          2512:                  pending_invalid_xref_file = input_filename;
        !          2513:                  pending_invalid_xref_line = lineno;
        !          2514:                }
        !          2515:              return TREE_VALUE (tail);
        !          2516:            }
        !          2517:        }
        !          2518:       if (thislevel_only && ! level->tag_transparent)
        !          2519:        return NULL_TREE;
        !          2520:     }
        !          2521:   return NULL_TREE;
        !          2522: }
        !          2523: 
        !          2524: /* Print an error message now
        !          2525:    for a recent invalid struct, union or enum cross reference.
        !          2526:    We don't print them immediately because they are not invalid
        !          2527:    when used in the `struct foo;' construct for shadowing.  */
        !          2528: 
        !          2529: void
        !          2530: pending_xref_error ()
        !          2531: {
        !          2532:   if (pending_invalid_xref != 0)
        !          2533:     error_with_file_and_line (pending_invalid_xref_file,
        !          2534:                              pending_invalid_xref_line,
        !          2535:                              "`%s' defined as wrong kind of tag",
        !          2536:                              IDENTIFIER_POINTER (pending_invalid_xref));
        !          2537:   pending_invalid_xref = 0;
        !          2538: }
        !          2539: 
        !          2540: /* Given a type, find the tag that was defined for it and return the tag name.
        !          2541:    Otherwise return 0.  */
        !          2542: 
        !          2543: static tree
        !          2544: lookup_tag_reverse (type)
        !          2545:      tree type;
        !          2546: {
        !          2547:   register struct binding_level *level;
        !          2548: 
        !          2549:   for (level = current_binding_level; level; level = level->level_chain)
        !          2550:     {
        !          2551:       register tree tail;
        !          2552:       for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
        !          2553:        {
        !          2554:          if (TREE_VALUE (tail) == type)
        !          2555:            return TREE_PURPOSE (tail);
        !          2556:        }
        !          2557:     }
        !          2558:   return NULL_TREE;
        !          2559: }
        !          2560: 
        !          2561: /* Look up NAME in the current binding level and its superiors
        !          2562:    in the namespace of variables, functions and typedefs.
        !          2563:    Return a ..._DECL node of some kind representing its definition,
        !          2564:    or return 0 if it is undefined.  */
        !          2565: 
        !          2566: tree
        !          2567: lookup_name (name)
        !          2568:      tree name;
        !          2569: {
        !          2570:   register tree val;
        !          2571:   if (current_binding_level != global_binding_level
        !          2572:       && IDENTIFIER_LOCAL_VALUE (name))
        !          2573:     val = IDENTIFIER_LOCAL_VALUE (name);
        !          2574:   else
        !          2575:     val = IDENTIFIER_GLOBAL_VALUE (name);
        !          2576:   return val;
        !          2577: }
        !          2578: 
        !          2579: /* Similar to `lookup_name' but look only at current binding level.  */
        !          2580: 
        !          2581: tree
        !          2582: lookup_name_current_level (name)
        !          2583:      tree name;
        !          2584: {
        !          2585:   register tree t;
        !          2586: 
        !          2587:   if (current_binding_level == global_binding_level)
        !          2588:     return IDENTIFIER_GLOBAL_VALUE (name);
        !          2589: 
        !          2590:   if (IDENTIFIER_LOCAL_VALUE (name) == 0)
        !          2591:     return 0;
        !          2592: 
        !          2593:   for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
        !          2594:     if (DECL_NAME (t) == name)
        !          2595:       break;
        !          2596: 
        !          2597:   return t;
        !          2598: }
        !          2599: 
        !          2600: /* Create the predefined scalar types of C,
        !          2601:    and some nodes representing standard constants (0, 1, (void *)0).
        !          2602:    Initialize the global binding level.
        !          2603:    Make definitions for built-in primitive functions.  */
        !          2604: 
        !          2605: void
        !          2606: init_decl_processing ()
        !          2607: {
        !          2608:   register tree endlink;
        !          2609:   /* Either char* or void*.  */
        !          2610:   tree traditional_ptr_type_node;
        !          2611:   /* Data types of memcpy and strlen.  */
        !          2612:   tree memcpy_ftype, strlen_ftype;
        !          2613:   tree void_ftype_any;
        !          2614:   int wchar_type_size;
        !          2615:   tree temp;
        !          2616:   tree array_domain_type;
        !          2617: 
        !          2618:   current_function_decl = NULL;
        !          2619:   named_labels = NULL;
        !          2620:   current_binding_level = NULL_BINDING_LEVEL;
        !          2621:   free_binding_level = NULL_BINDING_LEVEL;
        !          2622:   pushlevel (0);       /* make the binding_level structure for global names */
        !          2623:   global_binding_level = current_binding_level;
        !          2624: 
        !          2625:   /* Define `int' and `char' first so that dbx will output them first.  */
        !          2626: 
        !          2627:   integer_type_node = make_signed_type (INT_TYPE_SIZE);
        !          2628:   pushdecl (build_decl (TYPE_DECL, ridpointers[(int) RID_INT],
        !          2629:                        integer_type_node));
        !          2630: 
        !          2631:   /* Define `char', which is like either `signed char' or `unsigned char'
        !          2632:      but not the same as either.  */
        !          2633: 
        !          2634:   char_type_node
        !          2635:     = (flag_signed_char
        !          2636:        ? make_signed_type (CHAR_TYPE_SIZE)
        !          2637:        : make_unsigned_type (CHAR_TYPE_SIZE));
        !          2638:   pushdecl (build_decl (TYPE_DECL, get_identifier ("char"),
        !          2639:                        char_type_node));
        !          2640: 
        !          2641:   long_integer_type_node = make_signed_type (LONG_TYPE_SIZE);
        !          2642:   pushdecl (build_decl (TYPE_DECL, get_identifier ("long int"),
        !          2643:                        long_integer_type_node));
        !          2644: 
        !          2645:   unsigned_type_node = make_unsigned_type (INT_TYPE_SIZE);
        !          2646:   pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned int"),
        !          2647:                        unsigned_type_node));
        !          2648: 
        !          2649:   long_unsigned_type_node = make_unsigned_type (LONG_TYPE_SIZE);
        !          2650:   pushdecl (build_decl (TYPE_DECL, get_identifier ("long unsigned int"),
        !          2651:                        long_unsigned_type_node));
        !          2652: 
        !          2653:   long_long_integer_type_node = make_signed_type (LONG_LONG_TYPE_SIZE);
        !          2654:   pushdecl (build_decl (TYPE_DECL, get_identifier ("long long int"),
        !          2655:                        long_long_integer_type_node));
        !          2656: 
        !          2657:   long_long_unsigned_type_node = make_unsigned_type (LONG_LONG_TYPE_SIZE);
        !          2658:   pushdecl (build_decl (TYPE_DECL, get_identifier ("long long unsigned int"),
        !          2659:                        long_long_unsigned_type_node));
        !          2660: 
        !          2661:   /* `unsigned long' is the standard type for sizeof.
        !          2662:      Traditionally, use a signed type.
        !          2663:      Note that stddef.h uses `unsigned long',
        !          2664:      and this must agree, even of long and int are the same size.  */
        !          2665:   sizetype
        !          2666:     = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (SIZE_TYPE)));
        !          2667:   if (flag_traditional && TREE_UNSIGNED (sizetype))
        !          2668:     sizetype = signed_type (sizetype);
        !          2669: 
        !          2670:   ptrdiff_type_node
        !          2671:     = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (PTRDIFF_TYPE)));
        !          2672: 
        !          2673:   TREE_TYPE (TYPE_SIZE (integer_type_node)) = sizetype;
        !          2674:   TREE_TYPE (TYPE_SIZE (char_type_node)) = sizetype;
        !          2675:   TREE_TYPE (TYPE_SIZE (unsigned_type_node)) = sizetype;
        !          2676:   TREE_TYPE (TYPE_SIZE (long_unsigned_type_node)) = sizetype;
        !          2677:   TREE_TYPE (TYPE_SIZE (long_integer_type_node)) = sizetype;
        !          2678:   TREE_TYPE (TYPE_SIZE (long_long_integer_type_node)) = sizetype;
        !          2679:   TREE_TYPE (TYPE_SIZE (long_long_unsigned_type_node)) = sizetype;
        !          2680: 
        !          2681:   error_mark_node = make_node (ERROR_MARK);
        !          2682:   TREE_TYPE (error_mark_node) = error_mark_node;
        !          2683: 
        !          2684:   short_integer_type_node = make_signed_type (SHORT_TYPE_SIZE);
        !          2685:   pushdecl (build_decl (TYPE_DECL, get_identifier ("short int"),
        !          2686:                        short_integer_type_node));
        !          2687: 
        !          2688:   short_unsigned_type_node = make_unsigned_type (SHORT_TYPE_SIZE);
        !          2689:   pushdecl (build_decl (TYPE_DECL, get_identifier ("short unsigned int"),
        !          2690:                        short_unsigned_type_node));
        !          2691: 
        !          2692:   /* Define both `signed char' and `unsigned char'.  */
        !          2693:   signed_char_type_node = make_signed_type (CHAR_TYPE_SIZE);
        !          2694:   pushdecl (build_decl (TYPE_DECL, get_identifier ("signed char"),
        !          2695:                        signed_char_type_node));
        !          2696: 
        !          2697:   unsigned_char_type_node = make_unsigned_type (CHAR_TYPE_SIZE);
        !          2698:   pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned char"),
        !          2699:                        unsigned_char_type_node));
        !          2700: 
        !          2701:   intQI_type_node = make_signed_type (GET_MODE_BITSIZE (QImode));
        !          2702:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intQI_type_node));
        !          2703: 
        !          2704:   intHI_type_node = make_signed_type (GET_MODE_BITSIZE (HImode));
        !          2705:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intHI_type_node));
        !          2706: 
        !          2707:   intSI_type_node = make_signed_type (GET_MODE_BITSIZE (SImode));
        !          2708:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intSI_type_node));
        !          2709: 
        !          2710:   intDI_type_node = make_signed_type (GET_MODE_BITSIZE (DImode));
        !          2711:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, intDI_type_node));
        !          2712: 
        !          2713:   unsigned_intQI_type_node = make_unsigned_type (GET_MODE_BITSIZE (QImode));
        !          2714:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intQI_type_node));
        !          2715: 
        !          2716:   unsigned_intHI_type_node = make_unsigned_type (GET_MODE_BITSIZE (HImode));
        !          2717:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intHI_type_node));
        !          2718: 
        !          2719:   unsigned_intSI_type_node = make_unsigned_type (GET_MODE_BITSIZE (SImode));
        !          2720:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intSI_type_node));
        !          2721: 
        !          2722:   unsigned_intDI_type_node = make_unsigned_type (GET_MODE_BITSIZE (DImode));
        !          2723:   pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intDI_type_node));
        !          2724: 
        !          2725:   float_type_node = make_node (REAL_TYPE);
        !          2726:   TYPE_PRECISION (float_type_node) = FLOAT_TYPE_SIZE;
        !          2727:   pushdecl (build_decl (TYPE_DECL, ridpointers[(int) RID_FLOAT],
        !          2728:                        float_type_node));
        !          2729:   layout_type (float_type_node);
        !          2730: 
        !          2731:   double_type_node = make_node (REAL_TYPE);
        !          2732:   if (flag_short_double)
        !          2733:     TYPE_PRECISION (double_type_node) = FLOAT_TYPE_SIZE;
        !          2734:   else
        !          2735:     TYPE_PRECISION (double_type_node) = DOUBLE_TYPE_SIZE;
        !          2736:   pushdecl (build_decl (TYPE_DECL, ridpointers[(int) RID_DOUBLE],
        !          2737:                        double_type_node));
        !          2738:   layout_type (double_type_node);
        !          2739: 
        !          2740:   long_double_type_node = make_node (REAL_TYPE);
        !          2741:   TYPE_PRECISION (long_double_type_node) = LONG_DOUBLE_TYPE_SIZE;
        !          2742:   pushdecl (build_decl (TYPE_DECL, get_identifier ("long double"),
        !          2743:                        long_double_type_node));
        !          2744:   layout_type (long_double_type_node);
        !          2745: 
        !          2746:   complex_integer_type_node = make_node (COMPLEX_TYPE);
        !          2747:   pushdecl (build_decl (TYPE_DECL, get_identifier ("complex int"),
        !          2748:                        complex_integer_type_node));
        !          2749:   TREE_TYPE (complex_integer_type_node) = integer_type_node;
        !          2750:   layout_type (complex_integer_type_node);
        !          2751: 
        !          2752:   complex_float_type_node = make_node (COMPLEX_TYPE);
        !          2753:   pushdecl (build_decl (TYPE_DECL, get_identifier ("complex float"),
        !          2754:                        complex_float_type_node));
        !          2755:   TREE_TYPE (complex_float_type_node) = float_type_node;
        !          2756:   layout_type (complex_float_type_node);
        !          2757: 
        !          2758:   complex_double_type_node = make_node (COMPLEX_TYPE);
        !          2759:   pushdecl (build_decl (TYPE_DECL, get_identifier ("complex double"),
        !          2760:                        complex_double_type_node));
        !          2761:   TREE_TYPE (complex_double_type_node) = double_type_node;
        !          2762:   layout_type (complex_double_type_node);
        !          2763: 
        !          2764:   complex_long_double_type_node = make_node (COMPLEX_TYPE);
        !          2765:   pushdecl (build_decl (TYPE_DECL, get_identifier ("complex long double"),
        !          2766:                        complex_long_double_type_node));
        !          2767:   TREE_TYPE (complex_long_double_type_node) = long_double_type_node;
        !          2768:   layout_type (complex_long_double_type_node);
        !          2769: 
        !          2770:   wchar_type_node
        !          2771:     = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (WCHAR_TYPE)));
        !          2772:   wchar_type_size = TYPE_PRECISION (wchar_type_node);
        !          2773:   signed_wchar_type_node = signed_type (wchar_type_node);
        !          2774:   unsigned_wchar_type_node = unsigned_type (wchar_type_node);
        !          2775: 
        !          2776:   integer_zero_node = build_int_2 (0, 0);
        !          2777:   TREE_TYPE (integer_zero_node) = integer_type_node;
        !          2778:   integer_one_node = build_int_2 (1, 0);
        !          2779:   TREE_TYPE (integer_one_node) = integer_type_node;
        !          2780: 
        !          2781:   size_zero_node = build_int_2 (0, 0);
        !          2782:   TREE_TYPE (size_zero_node) = sizetype;
        !          2783:   size_one_node = build_int_2 (1, 0);
        !          2784:   TREE_TYPE (size_one_node) = sizetype;
        !          2785: 
        !          2786:   void_type_node = make_node (VOID_TYPE);
        !          2787:   pushdecl (build_decl (TYPE_DECL,
        !          2788:                        ridpointers[(int) RID_VOID], void_type_node));
        !          2789:   layout_type (void_type_node);        /* Uses integer_zero_node */
        !          2790:   /* We are not going to have real types in C with less than byte alignment,
        !          2791:      so we might as well not have any types that claim to have it.  */
        !          2792:   TYPE_ALIGN (void_type_node) = BITS_PER_UNIT;
        !          2793: 
        !          2794:   null_pointer_node = build_int_2 (0, 0);
        !          2795:   TREE_TYPE (null_pointer_node) = build_pointer_type (void_type_node);
        !          2796:   layout_type (TREE_TYPE (null_pointer_node));
        !          2797: 
        !          2798:   string_type_node = build_pointer_type (char_type_node);
        !          2799:   const_string_type_node
        !          2800:     = build_pointer_type (build_type_variant (char_type_node, 1, 0));
        !          2801: 
        !          2802:   /* Make a type to be the domain of a few array types
        !          2803:      whose domains don't really matter.
        !          2804:      200 is small enough that it always fits in size_t
        !          2805:      and large enough that it can hold most function names for the
        !          2806:      initializations of __FUNCTION__ and __PRETTY_FUNCTION__.  */
        !          2807:   array_domain_type = build_index_type (build_int_2 (200, 0));
        !          2808: 
        !          2809:   /* make a type for arrays of characters.
        !          2810:      With luck nothing will ever really depend on the length of this
        !          2811:      array type.  */
        !          2812:   char_array_type_node
        !          2813:     = build_array_type (char_type_node, array_domain_type);
        !          2814:   /* Likewise for arrays of ints.  */
        !          2815:   int_array_type_node
        !          2816:     = build_array_type (integer_type_node, array_domain_type);
        !          2817:   /* This is for wide string constants.  */
        !          2818:   wchar_array_type_node
        !          2819:     = build_array_type (wchar_type_node, array_domain_type);
        !          2820: 
        !          2821:   default_function_type
        !          2822:     = build_function_type (integer_type_node, NULL_TREE);
        !          2823: 
        !          2824:   ptr_type_node = build_pointer_type (void_type_node);
        !          2825:   const_ptr_type_node
        !          2826:     = build_pointer_type (build_type_variant (void_type_node, 1, 0));
        !          2827: 
        !          2828:   endlink = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
        !          2829: 
        !          2830:   void_ftype_any
        !          2831:     = build_function_type (void_type_node, NULL_TREE);
        !          2832: 
        !          2833:   double_ftype_double
        !          2834:     = build_function_type (double_type_node,
        !          2835:                           tree_cons (NULL_TREE, double_type_node, endlink));
        !          2836: 
        !          2837:   double_ftype_double_double
        !          2838:     = build_function_type (double_type_node,
        !          2839:                           tree_cons (NULL_TREE, double_type_node,
        !          2840:                                      tree_cons (NULL_TREE,
        !          2841:                                                 double_type_node, endlink)));
        !          2842: 
        !          2843:   int_ftype_int
        !          2844:     = build_function_type (integer_type_node,
        !          2845:                           tree_cons (NULL_TREE, integer_type_node, endlink));
        !          2846: 
        !          2847:   long_ftype_long
        !          2848:     = build_function_type (long_integer_type_node,
        !          2849:                           tree_cons (NULL_TREE,
        !          2850:                                      long_integer_type_node, endlink));
        !          2851: 
        !          2852:   void_ftype_ptr_ptr_int
        !          2853:     = build_function_type (void_type_node,
        !          2854:                           tree_cons (NULL_TREE, ptr_type_node,
        !          2855:                                      tree_cons (NULL_TREE, ptr_type_node,
        !          2856:                                                 tree_cons (NULL_TREE,
        !          2857:                                                            integer_type_node,
        !          2858:                                                            endlink))));
        !          2859: 
        !          2860:   int_ftype_cptr_cptr_sizet
        !          2861:     = build_function_type (integer_type_node,
        !          2862:                           tree_cons (NULL_TREE, const_ptr_type_node,
        !          2863:                                      tree_cons (NULL_TREE, const_ptr_type_node,
        !          2864:                                                 tree_cons (NULL_TREE,
        !          2865:                                                            sizetype,
        !          2866:                                                            endlink))));
        !          2867: 
        !          2868:   void_ftype_ptr_int_int
        !          2869:     = build_function_type (void_type_node,
        !          2870:                           tree_cons (NULL_TREE, ptr_type_node,
        !          2871:                                      tree_cons (NULL_TREE, integer_type_node,
        !          2872:                                                 tree_cons (NULL_TREE,
        !          2873:                                                            integer_type_node,
        !          2874:                                                            endlink))));
        !          2875: 
        !          2876:   string_ftype_ptr_ptr         /* strcpy prototype */
        !          2877:     = build_function_type (string_type_node,
        !          2878:                           tree_cons (NULL_TREE, string_type_node,
        !          2879:                                      tree_cons (NULL_TREE,
        !          2880:                                                 const_string_type_node,
        !          2881:                                                 endlink)));
        !          2882: 
        !          2883:   int_ftype_string_string      /* strcmp prototype */
        !          2884:     = build_function_type (integer_type_node,
        !          2885:                           tree_cons (NULL_TREE, const_string_type_node,
        !          2886:                                      tree_cons (NULL_TREE,
        !          2887:                                                 const_string_type_node,
        !          2888:                                                 endlink)));
        !          2889: 
        !          2890:   strlen_ftype         /* strlen prototype */
        !          2891:     = build_function_type (flag_traditional ? integer_type_node : sizetype,
        !          2892:                           tree_cons (NULL_TREE, const_string_type_node,
        !          2893:                                      endlink));
        !          2894: 
        !          2895:   traditional_ptr_type_node
        !          2896:     = (flag_traditional ? string_type_node : ptr_type_node);
        !          2897: 
        !          2898:   memcpy_ftype /* memcpy prototype */
        !          2899:     = build_function_type (traditional_ptr_type_node,
        !          2900:                           tree_cons (NULL_TREE, ptr_type_node,
        !          2901:                                      tree_cons (NULL_TREE, const_ptr_type_node,
        !          2902:                                                 tree_cons (NULL_TREE,
        !          2903:                                                            sizetype,
        !          2904:                                                            endlink))));
        !          2905: 
        !          2906:   builtin_function ("__builtin_constant_p", int_ftype_int,
        !          2907:                    BUILT_IN_CONSTANT_P, NULL_PTR);
        !          2908: 
        !          2909:   builtin_function ("__builtin_return_address",
        !          2910:                    build_function_type (ptr_type_node, 
        !          2911:                                         tree_cons (NULL_TREE,
        !          2912:                                                    unsigned_type_node,
        !          2913:                                                    endlink)),
        !          2914:                    BUILT_IN_RETURN_ADDRESS, NULL_PTR);
        !          2915: 
        !          2916:   builtin_function ("__builtin_frame_address",
        !          2917:                    build_function_type (ptr_type_node, 
        !          2918:                                         tree_cons (NULL_TREE,
        !          2919:                                                    unsigned_type_node,
        !          2920:                                                    endlink)),
        !          2921:                    BUILT_IN_FRAME_ADDRESS, NULL_PTR);
        !          2922: 
        !          2923:   builtin_function ("__builtin_alloca",
        !          2924:                    build_function_type (ptr_type_node,
        !          2925:                                         tree_cons (NULL_TREE,
        !          2926:                                                    sizetype,
        !          2927:                                                    endlink)),
        !          2928:                    BUILT_IN_ALLOCA, "alloca");
        !          2929:   builtin_function ("__builtin_ffs", int_ftype_int, BUILT_IN_FFS, NULL_PTR);
        !          2930:   /* Define alloca, ffs as builtins.
        !          2931:      Declare _exit just to mark it as volatile.  */
        !          2932:   if (! flag_no_builtin && !flag_no_nonansi_builtin)
        !          2933:     {
        !          2934:       temp = builtin_function ("alloca",
        !          2935:                               build_function_type (ptr_type_node,
        !          2936:                                                    tree_cons (NULL_TREE,
        !          2937:                                                               sizetype,
        !          2938:                                                               endlink)),
        !          2939:                               BUILT_IN_ALLOCA, NULL_PTR);
        !          2940:       /* Suppress error if redefined as a non-function.  */
        !          2941:       DECL_BUILT_IN_NONANSI (temp) = 1;
        !          2942:       temp = builtin_function ("ffs", int_ftype_int, BUILT_IN_FFS, NULL_PTR);
        !          2943:       /* Suppress error if redefined as a non-function.  */
        !          2944:       DECL_BUILT_IN_NONANSI (temp) = 1;
        !          2945:       temp = builtin_function ("_exit", void_ftype_any, NOT_BUILT_IN,
        !          2946:                               NULL_PTR);
        !          2947:       TREE_THIS_VOLATILE (temp) = 1;
        !          2948:       TREE_SIDE_EFFECTS (temp) = 1;
        !          2949:       /* Suppress error if redefined as a non-function.  */
        !          2950:       DECL_BUILT_IN_NONANSI (temp) = 1;
        !          2951:     }
        !          2952: 
        !          2953:   builtin_function ("__builtin_abs", int_ftype_int, BUILT_IN_ABS, NULL_PTR);
        !          2954:   builtin_function ("__builtin_fabs", double_ftype_double, BUILT_IN_FABS,
        !          2955:                    NULL_PTR);
        !          2956:   builtin_function ("__builtin_labs", long_ftype_long, BUILT_IN_LABS,
        !          2957:                    NULL_PTR);
        !          2958:   builtin_function ("__builtin_saveregs",
        !          2959:                    build_function_type (ptr_type_node, NULL_TREE),
        !          2960:                    BUILT_IN_SAVEREGS, NULL_PTR);
        !          2961: /* EXPAND_BUILTIN_VARARGS is obsolete.  */
        !          2962: #if 0
        !          2963:   builtin_function ("__builtin_varargs",
        !          2964:                    build_function_type (ptr_type_node,
        !          2965:                                         tree_cons (NULL_TREE,
        !          2966:                                                    integer_type_node,
        !          2967:                                                    endlink)),
        !          2968:                    BUILT_IN_VARARGS, NULL_PTR);
        !          2969: #endif
        !          2970:   builtin_function ("__builtin_classify_type", default_function_type,
        !          2971:                    BUILT_IN_CLASSIFY_TYPE, NULL_PTR);
        !          2972:   builtin_function ("__builtin_next_arg",
        !          2973:                    build_function_type (ptr_type_node, endlink),
        !          2974:                    BUILT_IN_NEXT_ARG, NULL_PTR);
        !          2975:   builtin_function ("__builtin_args_info",
        !          2976:                    build_function_type (integer_type_node,
        !          2977:                                         tree_cons (NULL_TREE,
        !          2978:                                                    integer_type_node,
        !          2979:                                                    endlink)),
        !          2980:                    BUILT_IN_ARGS_INFO, NULL_PTR);
        !          2981: 
        !          2982:   /* Untyped call and return.  */
        !          2983:   builtin_function ("__builtin_apply_args",
        !          2984:                    build_function_type (ptr_type_node, NULL_TREE),
        !          2985:                    BUILT_IN_APPLY_ARGS, NULL_PTR);
        !          2986: 
        !          2987:   temp = tree_cons (NULL_TREE,
        !          2988:                    build_pointer_type (build_function_type (void_type_node,
        !          2989:                                                             NULL_TREE)),
        !          2990:                    tree_cons (NULL_TREE,
        !          2991:                               ptr_type_node,
        !          2992:                               tree_cons (NULL_TREE,
        !          2993:                                          sizetype,
        !          2994:                                          endlink)));
        !          2995:   builtin_function ("__builtin_apply",
        !          2996:                    build_function_type (ptr_type_node, temp),
        !          2997:                    BUILT_IN_APPLY, NULL_PTR);
        !          2998:   builtin_function ("__builtin_return",
        !          2999:                    build_function_type (void_type_node,
        !          3000:                                         tree_cons (NULL_TREE,
        !          3001:                                                    ptr_type_node,
        !          3002:                                                    endlink)),
        !          3003:                    BUILT_IN_RETURN, NULL_PTR);
        !          3004: 
        !          3005:   /* Currently under experimentation.  */
        !          3006:   builtin_function ("__builtin_memcpy", memcpy_ftype,
        !          3007:                    BUILT_IN_MEMCPY, "memcpy");
        !          3008:   builtin_function ("__builtin_memcmp", int_ftype_cptr_cptr_sizet,
        !          3009:                    BUILT_IN_MEMCMP, "memcmp");
        !          3010:   builtin_function ("__builtin_strcmp", int_ftype_string_string,
        !          3011:                    BUILT_IN_STRCMP, "strcmp");
        !          3012:   builtin_function ("__builtin_strcpy", string_ftype_ptr_ptr,
        !          3013:                    BUILT_IN_STRCPY, "strcpy");
        !          3014:   builtin_function ("__builtin_strlen", strlen_ftype,
        !          3015:                    BUILT_IN_STRLEN, "strlen");
        !          3016:   builtin_function ("__builtin_fsqrt", double_ftype_double, 
        !          3017:                    BUILT_IN_FSQRT, "sqrt");
        !          3018:   builtin_function ("__builtin_sin", double_ftype_double, 
        !          3019:                    BUILT_IN_SIN, "sin");
        !          3020:   builtin_function ("__builtin_cos", double_ftype_double, 
        !          3021:                    BUILT_IN_COS, "cos");
        !          3022: 
        !          3023:   /* In an ANSI C program, it is okay to supply built-in meanings
        !          3024:      for these functions, since applications cannot validly use them
        !          3025:      with any other meaning.
        !          3026:      However, honor the -fno-builtin option.  */
        !          3027:   if (!flag_no_builtin)
        !          3028:     {
        !          3029:       builtin_function ("abs", int_ftype_int, BUILT_IN_ABS, NULL_PTR);
        !          3030:       builtin_function ("fabs", double_ftype_double, BUILT_IN_FABS, NULL_PTR);
        !          3031:       builtin_function ("labs", long_ftype_long, BUILT_IN_LABS, NULL_PTR);
        !          3032:       builtin_function ("memcpy", memcpy_ftype, BUILT_IN_MEMCPY, NULL_PTR);
        !          3033:       builtin_function ("memcmp", int_ftype_cptr_cptr_sizet, BUILT_IN_MEMCMP,
        !          3034:                        NULL_PTR);
        !          3035:       builtin_function ("strcmp", int_ftype_string_string, BUILT_IN_STRCMP,
        !          3036:                        NULL_PTR);
        !          3037:       builtin_function ("strcpy", string_ftype_ptr_ptr, BUILT_IN_STRCPY,
        !          3038:                        NULL_PTR);
        !          3039:       builtin_function ("strlen", strlen_ftype, BUILT_IN_STRLEN, NULL_PTR);
        !          3040:       builtin_function ("sqrt", double_ftype_double, BUILT_IN_FSQRT, NULL_PTR);
        !          3041:       builtin_function ("sin", double_ftype_double, BUILT_IN_SIN, NULL_PTR);
        !          3042:       builtin_function ("cos", double_ftype_double, BUILT_IN_COS, NULL_PTR);
        !          3043: 
        !          3044:       /* Declare these functions volatile
        !          3045:         to avoid spurious "control drops through" warnings.  */
        !          3046:       /* Don't specify the argument types, to avoid errors
        !          3047:         from certain code which isn't valid in ANSI but which exists.  */
        !          3048:       temp = builtin_function ("abort", void_ftype_any, NOT_BUILT_IN,
        !          3049:                               NULL_PTR);
        !          3050:       TREE_THIS_VOLATILE (temp) = 1;
        !          3051:       TREE_SIDE_EFFECTS (temp) = 1;
        !          3052:       temp = builtin_function ("exit", void_ftype_any, NOT_BUILT_IN, NULL_PTR);
        !          3053:       TREE_THIS_VOLATILE (temp) = 1;
        !          3054:       TREE_SIDE_EFFECTS (temp) = 1;
        !          3055:     }
        !          3056: 
        !          3057: #if 0
        !          3058:   /* Support for these has not been written in either expand_builtin
        !          3059:      or build_function_call.  */
        !          3060:   builtin_function ("__builtin_div", default_ftype, BUILT_IN_DIV, NULL_PTR);
        !          3061:   builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV, NULL_PTR);
        !          3062:   builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR,
        !          3063:                    NULL_PTR);
        !          3064:   builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL,
        !          3065:                    NULL_PTR);
        !          3066:   builtin_function ("__builtin_fmod", double_ftype_double_double,
        !          3067:                    BUILT_IN_FMOD, NULL_PTR);
        !          3068:   builtin_function ("__builtin_frem", double_ftype_double_double,
        !          3069:                    BUILT_IN_FREM, NULL_PTR);
        !          3070:   builtin_function ("__builtin_memset", ptr_ftype_ptr_int_int,
        !          3071:                    BUILT_IN_MEMSET, NULL_PTR);
        !          3072:   builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP,
        !          3073:                    NULL_PTR);
        !          3074:   builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN,
        !          3075:                    NULL_PTR);
        !          3076: #endif
        !          3077: 
        !          3078:   /* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__.  */
        !          3079:   declare_function_name ();
        !          3080: 
        !          3081:   start_identifier_warnings ();
        !          3082: 
        !          3083:   /* Prepare to check format strings against argument lists.  */
        !          3084:   init_function_format_info ();
        !          3085: 
        !          3086:   init_iterators ();
        !          3087: 
        !          3088:   incomplete_decl_finalize_hook = finish_incomplete_decl;
        !          3089: }
        !          3090: 
        !          3091: /* Return a definition for a builtin function named NAME and whose data type
        !          3092:    is TYPE.  TYPE should be a function type with argument types.
        !          3093:    FUNCTION_CODE tells later passes how to compile calls to this function.
        !          3094:    See tree.h for its possible values.
        !          3095: 
        !          3096:    If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
        !          3097:    the name to be called if we can't opencode the function.  */
        !          3098: 
        !          3099: tree
        !          3100: builtin_function (name, type, function_code, library_name)
        !          3101:      char *name;
        !          3102:      tree type;
        !          3103:      enum built_in_function function_code;
        !          3104:      char *library_name;
        !          3105: {
        !          3106:   tree decl = build_decl (FUNCTION_DECL, get_identifier (name), type);
        !          3107:   DECL_EXTERNAL (decl) = 1;
        !          3108:   TREE_PUBLIC (decl) = 1;
        !          3109:   /* If -traditional, permit redefining a builtin function any way you like.
        !          3110:      (Though really, if the program redefines these functions,
        !          3111:      it probably won't work right unless compiled with -fno-builtin.)  */
        !          3112:   if (flag_traditional && name[0] != '_')
        !          3113:     DECL_BUILT_IN_NONANSI (decl) = 1;
        !          3114:   if (library_name)
        !          3115:     DECL_ASSEMBLER_NAME (decl) = get_identifier (library_name);
        !          3116:   make_decl_rtl (decl, NULL_PTR, 1);
        !          3117:   pushdecl (decl);
        !          3118:   if (function_code != NOT_BUILT_IN)
        !          3119:     {
        !          3120:       DECL_BUILT_IN (decl) = 1;
        !          3121:       DECL_SET_FUNCTION_CODE (decl, function_code);
        !          3122:     }
        !          3123:   /* Warn if a function in the namespace for users
        !          3124:      is used without an occasion to consider it declared.  */
        !          3125:   if (name[0] != '_' || name[1] != '_')
        !          3126:     C_DECL_ANTICIPATED (decl) = 1;
        !          3127: 
        !          3128:   return decl;
        !          3129: }
        !          3130: 
        !          3131: /* Called when a declaration is seen that contains no names to declare.
        !          3132:    If its type is a reference to a structure, union or enum inherited
        !          3133:    from a containing scope, shadow that tag name for the current scope
        !          3134:    with a forward reference.
        !          3135:    If its type defines a new named structure or union
        !          3136:    or defines an enum, it is valid but we need not do anything here.
        !          3137:    Otherwise, it is an error.  */
        !          3138: 
        !          3139: void
        !          3140: shadow_tag (declspecs)
        !          3141:      tree declspecs;
        !          3142: {
        !          3143:   shadow_tag_warned (declspecs, 0);
        !          3144: }
        !          3145: 
        !          3146: void
        !          3147: shadow_tag_warned (declspecs, warned)
        !          3148:      tree declspecs;
        !          3149:      int warned;
        !          3150:      /* 1 => we have done a pedwarn.  2 => we have done a warning, but
        !          3151:        no pedwarn.  */
        !          3152: {
        !          3153:   int found_tag = 0;
        !          3154:   register tree link;
        !          3155: 
        !          3156:   pending_invalid_xref = 0;
        !          3157: 
        !          3158:   for (link = declspecs; link; link = TREE_CHAIN (link))
        !          3159:     {
        !          3160:       register tree value = TREE_VALUE (link);
        !          3161:       register enum tree_code code = TREE_CODE (value);
        !          3162: 
        !          3163:       if (code == RECORD_TYPE || code == UNION_TYPE || code == ENUMERAL_TYPE)
        !          3164:        /* Used to test also that TYPE_SIZE (value) != 0.
        !          3165:           That caused warning for `struct foo;' at top level in the file.  */
        !          3166:        {
        !          3167:          register tree name = lookup_tag_reverse (value);
        !          3168:          register tree t;
        !          3169: 
        !          3170:          found_tag++;
        !          3171: 
        !          3172:          if (name == 0)
        !          3173:            {
        !          3174:              if (warned != 1 && code != ENUMERAL_TYPE)
        !          3175:                /* Empty unnamed enum OK */
        !          3176:                {
        !          3177:                  pedwarn ("unnamed struct/union that defines no instances");
        !          3178:                  warned = 1;
        !          3179:                }
        !          3180:            }
        !          3181:          else
        !          3182:            {
        !          3183:              t = lookup_tag (code, name, current_binding_level, 1);
        !          3184: 
        !          3185:              if (t == 0)
        !          3186:                {
        !          3187:                  t = make_node (code);
        !          3188:                  pushtag (name, t);
        !          3189:                }
        !          3190:            }
        !          3191:        }
        !          3192:       else
        !          3193:        {
        !          3194:          if (!warned)
        !          3195:            {
        !          3196:              warning ("useless keyword or type name in empty declaration");
        !          3197:              warned = 2;
        !          3198:            }
        !          3199:        }
        !          3200:     }
        !          3201: 
        !          3202:   if (found_tag > 1)
        !          3203:     error ("two types specified in one empty declaration");
        !          3204: 
        !          3205:   if (warned != 1)
        !          3206:     {
        !          3207:       if (found_tag == 0)
        !          3208:        pedwarn ("empty declaration");
        !          3209:     }
        !          3210: }
        !          3211: 
        !          3212: /* Decode a "typename", such as "int **", returning a ..._TYPE node.  */
        !          3213: 
        !          3214: tree
        !          3215: groktypename (typename)
        !          3216:      tree typename;
        !          3217: {
        !          3218:   if (TREE_CODE (typename) != TREE_LIST)
        !          3219:     return typename;
        !          3220:   return grokdeclarator (TREE_VALUE (typename),
        !          3221:                         TREE_PURPOSE (typename),
        !          3222:                         TYPENAME, 0);
        !          3223: }
        !          3224: 
        !          3225: /* Return a PARM_DECL node for a given pair of specs and declarator.  */
        !          3226: 
        !          3227: tree
        !          3228: groktypename_in_parm_context (typename)
        !          3229:      tree typename;
        !          3230: {
        !          3231:   if (TREE_CODE (typename) != TREE_LIST)
        !          3232:     return typename;
        !          3233:   return grokdeclarator (TREE_VALUE (typename),
        !          3234:                         TREE_PURPOSE (typename),
        !          3235:                         PARM, 0);
        !          3236: }
        !          3237: 
        !          3238: /* Decode a declarator in an ordinary declaration or data definition.
        !          3239:    This is called as soon as the type information and variable name
        !          3240:    have been parsed, before parsing the initializer if any.
        !          3241:    Here we create the ..._DECL node, fill in its type,
        !          3242:    and put it on the list of decls for the current context.
        !          3243:    The ..._DECL node is returned as the value.
        !          3244: 
        !          3245:    Exception: for arrays where the length is not specified,
        !          3246:    the type is left null, to be filled in by `finish_decl'.
        !          3247: 
        !          3248:    Function definitions do not come here; they go to start_function
        !          3249:    instead.  However, external and forward declarations of functions
        !          3250:    do go through here.  Structure field declarations are done by
        !          3251:    grokfield and not through here.  */
        !          3252: 
        !          3253: /* Set this to zero to debug not using the temporary obstack
        !          3254:    to parse initializers.  */
        !          3255: int debug_temp_inits = 1;
        !          3256: 
        !          3257: tree
        !          3258: start_decl (declarator, declspecs, initialized)
        !          3259:      tree declarator, declspecs;
        !          3260:      int initialized;
        !          3261: {
        !          3262:   register tree decl = grokdeclarator (declarator, declspecs,
        !          3263:                                       NORMAL, initialized);
        !          3264:   register tree tem;
        !          3265:   int init_written = initialized;
        !          3266: 
        !          3267:   /* The corresponding pop_obstacks is in finish_decl.  */
        !          3268:   push_obstacks_nochange ();
        !          3269: 
        !          3270:   if (initialized)
        !          3271:     /* Is it valid for this decl to have an initializer at all?
        !          3272:        If not, set INITIALIZED to zero, which will indirectly
        !          3273:        tell `finish_decl' to ignore the initializer once it is parsed.  */
        !          3274:     switch (TREE_CODE (decl))
        !          3275:       {
        !          3276:       case TYPE_DECL:
        !          3277:        /* typedef foo = bar  means give foo the same type as bar.
        !          3278:           We haven't parsed bar yet, so `finish_decl' will fix that up.
        !          3279:           Any other case of an initialization in a TYPE_DECL is an error.  */
        !          3280:        if (pedantic || list_length (declspecs) > 1)
        !          3281:          {
        !          3282:            error ("typedef `%s' is initialized",
        !          3283:                   IDENTIFIER_POINTER (DECL_NAME (decl)));
        !          3284:            initialized = 0;
        !          3285:          }
        !          3286:        break;
        !          3287: 
        !          3288:       case FUNCTION_DECL:
        !          3289:        error ("function `%s' is initialized like a variable",
        !          3290:               IDENTIFIER_POINTER (DECL_NAME (decl)));
        !          3291:        initialized = 0;
        !          3292:        break;
        !          3293: 
        !          3294:       case PARM_DECL:
        !          3295:        /* DECL_INITIAL in a PARM_DECL is really DECL_ARG_TYPE.  */
        !          3296:        error ("parameter `%s' is initialized",
        !          3297:               IDENTIFIER_POINTER (DECL_NAME (decl)));
        !          3298:        initialized = 0;
        !          3299:        break;
        !          3300: 
        !          3301:       default:
        !          3302:        /* Don't allow initializations for incomplete types
        !          3303:           except for arrays which might be completed by the initialization.  */
        !          3304:        if (TYPE_SIZE (TREE_TYPE (decl)) != 0)
        !          3305:          {
        !          3306:            /* A complete type is ok if size is fixed.  */
        !          3307: 
        !          3308:            if (TREE_CODE (TYPE_SIZE (TREE_TYPE (decl))) != INTEGER_CST
        !          3309:                || C_DECL_VARIABLE_SIZE (decl))
        !          3310:              {
        !          3311:                error ("variable-sized object may not be initialized");
        !          3312:                initialized = 0;
        !          3313:              }
        !          3314:          }
        !          3315:        else if (TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE)
        !          3316:          {
        !          3317:            error ("variable `%s' has initializer but incomplete type",
        !          3318:                   IDENTIFIER_POINTER (DECL_NAME (decl)));
        !          3319:            initialized = 0;
        !          3320:          }
        !          3321:        else if (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl))) == 0)
        !          3322:          {
        !          3323:            error ("elements of array `%s' have incomplete type",
        !          3324:                   IDENTIFIER_POINTER (DECL_NAME (decl)));
        !          3325:            initialized = 0;
        !          3326:          }
        !          3327:       }
        !          3328: 
        !          3329:   if (initialized)
        !          3330:     {
        !          3331: #if 0  /* Seems redundant with grokdeclarator.  */
        !          3332:       if (current_binding_level != global_binding_level
        !          3333:          && DECL_EXTERNAL (decl)
        !          3334:          && TREE_CODE (decl) != FUNCTION_DECL)
        !          3335:        warning ("declaration of `%s' has `extern' and is initialized",
        !          3336:                 IDENTIFIER_POINTER (DECL_NAME (decl)));
        !          3337: #endif
        !          3338:       DECL_EXTERNAL (decl) = 0;
        !          3339:       if (current_binding_level == global_binding_level)
        !          3340:        TREE_STATIC (decl) = 1;
        !          3341: 
        !          3342:       /* Tell `pushdecl' this is an initialized decl
        !          3343:         even though we don't yet have the initializer expression.
        !          3344:         Also tell `finish_decl' it may store the real initializer.  */
        !          3345:       DECL_INITIAL (decl) = error_mark_node;
        !          3346:     }
        !          3347: 
        !          3348:   /* If this is a function declaration, write a record describing it to the
        !          3349:      prototypes file (if requested).  */
        !          3350: 
        !          3351:   if (TREE_CODE (decl) == FUNCTION_DECL)
        !          3352:     gen_aux_info_record (decl, 0, 0, TYPE_ARG_TYPES (TREE_TYPE (decl)) != 0);
        !          3353: 
        !          3354:   /* Add this decl to the current binding level.
        !          3355:      TEM may equal DECL or it may be a previous decl of the same name.  */
        !          3356:   tem = pushdecl (decl);
        !          3357: 
        !          3358:   /* For a local variable, define the RTL now.  */
        !          3359:   if (current_binding_level != global_binding_level
        !          3360:       /* But not if this is a duplicate decl
        !          3361:         and we preserved the rtl from the previous one
        !          3362:         (which may or may not happen).  */
        !          3363:       && DECL_RTL (tem) == 0)
        !          3364:     {
        !          3365:       if (TYPE_SIZE (TREE_TYPE (tem)) != 0)
        !          3366:        expand_decl (tem);
        !          3367:       else if (TREE_CODE (TREE_TYPE (tem)) == ARRAY_TYPE
        !          3368:               && DECL_INITIAL (tem) != 0)
        !          3369:        expand_decl (tem);
        !          3370:     }
        !          3371: 
        !          3372:   if (init_written)
        !          3373:     {
        !          3374:       /* When parsing and digesting the initializer,
        !          3375:         use temporary storage.  Do this even if we will ignore the value.  */
        !          3376:       if (current_binding_level == global_binding_level && debug_temp_inits)
        !          3377:        temporary_allocation ();
        !          3378:     }
        !          3379: 
        !          3380:   return tem;
        !          3381: }
        !          3382: 
        !          3383: /* Finish processing of a declaration;
        !          3384:    install its initial value.
        !          3385:    If the length of an array type is not known before,
        !          3386:    it must be determined now, from the initial value, or it is an error.  */
        !          3387: 
        !          3388: void
        !          3389: finish_decl (decl, init, asmspec_tree)
        !          3390:      tree decl, init;
        !          3391:      tree asmspec_tree;
        !          3392: {
        !          3393:   register tree type = TREE_TYPE (decl);
        !          3394:   int was_incomplete = (DECL_SIZE (decl) == 0);
        !          3395:   int temporary = allocation_temporary_p ();
        !          3396:   char *asmspec = 0;
        !          3397: 
        !          3398:   if (asmspec_tree)
        !          3399:     asmspec = TREE_STRING_POINTER (asmspec_tree);
        !          3400: 
        !          3401:   /* If `start_decl' didn't like having an initialization, ignore it now.  */
        !          3402: 
        !          3403:   if (init != 0 && DECL_INITIAL (decl) == 0)
        !          3404:     init = 0;
        !          3405:   /* Don't crash if parm is initialized.  */
        !          3406:   if (TREE_CODE (decl) == PARM_DECL)
        !          3407:     init = 0;
        !          3408: 
        !          3409:   if (ITERATOR_P (decl))
        !          3410:     {
        !          3411:       if (init == 0)
        !          3412:        error_with_decl (decl, "iterator has no initial value");
        !          3413:       else
        !          3414:        init = save_expr (init);
        !          3415:     }
        !          3416: 
        !          3417:   if (init)
        !          3418:     {
        !          3419:       if (TREE_CODE (decl) != TYPE_DECL)
        !          3420:        store_init_value (decl, init);
        !          3421:       else
        !          3422:        {
        !          3423:          /* typedef foo = bar; store the type of bar as the type of foo.  */
        !          3424:          TREE_TYPE (decl) = TREE_TYPE (init);
        !          3425:          DECL_INITIAL (decl) = init = 0;
        !          3426:        }
        !          3427:     }
        !          3428: 
        !          3429:   /* Pop back to the obstack that is current for this binding level.
        !          3430:      This is because MAXINDEX, rtl, etc. to be made below
        !          3431:      must go in the permanent obstack.  But don't discard the
        !          3432:      temporary data yet.  */
        !          3433:   pop_obstacks ();
        !          3434: #if 0 /* pop_obstacks was near the end; this is what was here.  */
        !          3435:   if (current_binding_level == global_binding_level && temporary)
        !          3436:     end_temporary_allocation ();
        !          3437: #endif
        !          3438: 
        !          3439:   /* Deduce size of array from initialization, if not already known */
        !          3440: 
        !          3441:   if (TREE_CODE (type) == ARRAY_TYPE
        !          3442:       && TYPE_DOMAIN (type) == 0
        !          3443:       && TREE_CODE (decl) != TYPE_DECL)
        !          3444:     {
        !          3445:       int do_default
        !          3446:        = (TREE_STATIC (decl)
        !          3447:           /* Even if pedantic, an external linkage array
        !          3448:              may have incomplete type at first.  */
        !          3449:           ? pedantic && !TREE_PUBLIC (decl)
        !          3450:           : !DECL_EXTERNAL (decl));
        !          3451:       int failure
        !          3452:        = complete_array_type (type, DECL_INITIAL (decl), do_default);
        !          3453: 
        !          3454:       /* Get the completed type made by complete_array_type.  */
        !          3455:       type = TREE_TYPE (decl);
        !          3456: 
        !          3457:       if (failure == 1)
        !          3458:        error_with_decl (decl, "initializer fails to determine size of `%s'");
        !          3459: 
        !          3460:       if (failure == 2)
        !          3461:        {
        !          3462:          if (do_default)
        !          3463:            error_with_decl (decl, "array size missing in `%s'");
        !          3464:          /* If a `static' var's size isn't known,
        !          3465:             make it extern as well as static, so it does not get
        !          3466:             allocated.
        !          3467:             If it is not `static', then do not mark extern;
        !          3468:             finish_incomplete_decl will give it a default size
        !          3469:             and it will get allocated.  */
        !          3470:          else if (!pedantic && TREE_STATIC (decl) && ! TREE_PUBLIC (decl))
        !          3471:            DECL_EXTERNAL (decl) = 1;
        !          3472:        }
        !          3473: 
        !          3474:       if (pedantic && TYPE_DOMAIN (type) != 0
        !          3475:          && tree_int_cst_lt (TYPE_MAX_VALUE (TYPE_DOMAIN (type)),
        !          3476:                              integer_zero_node))
        !          3477:        error_with_decl (decl, "zero-size array `%s'");
        !          3478: 
        !          3479:       layout_decl (decl, 0);
        !          3480:     }
        !          3481: 
        !          3482:   if (TREE_CODE (decl) == VAR_DECL)
        !          3483:     {
        !          3484:       if (DECL_SIZE (decl) == 0
        !          3485:          && TYPE_SIZE (TREE_TYPE (decl)) != 0)
        !          3486:        layout_decl (decl, 0);
        !          3487: 
        !          3488:       if (DECL_SIZE (decl) == 0
        !          3489:          && (TREE_STATIC (decl)
        !          3490:              ?
        !          3491:                /* A static variable with an incomplete type
        !          3492:                   is an error if it is initialized.
        !          3493:                   Also if it is not file scope.
        !          3494:                   Otherwise, let it through, but if it is not `extern'
        !          3495:                   then it may cause an error message later.  */
        !          3496:                (DECL_INITIAL (decl) != 0
        !          3497:                 || current_binding_level != global_binding_level)
        !          3498:              :
        !          3499:                /* An automatic variable with an incomplete type
        !          3500:                   is an error.  */
        !          3501:                !DECL_EXTERNAL (decl)))
        !          3502:        {
        !          3503:          error_with_decl (decl, "storage size of `%s' isn't known");
        !          3504:          TREE_TYPE (decl) = error_mark_node;
        !          3505:        }
        !          3506: 
        !          3507:       if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl))
        !          3508:          && DECL_SIZE (decl) != 0)
        !          3509:        {
        !          3510:          if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST)
        !          3511:            constant_expression_warning (DECL_SIZE (decl));
        !          3512:          else
        !          3513:            error_with_decl (decl, "storage size of `%s' isn't constant");
        !          3514:        }
        !          3515:     }
        !          3516: 
        !          3517:   /* Output the assembler code and/or RTL code for variables and functions,
        !          3518:      unless the type is an undefined structure or union.
        !          3519:      If not, it will get done when the type is completed.  */
        !          3520: 
        !          3521:   if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL)
        !          3522:     {
        !          3523:       if (flag_traditional && allocation_temporary_p ())
        !          3524:        {
        !          3525:          push_obstacks_nochange ();
        !          3526:          end_temporary_allocation ();
        !          3527:          /* This is a no-op in c-lang.c or something real in objc-actions.c.  */
        !          3528:          maybe_objc_check_decl (decl);
        !          3529:          rest_of_decl_compilation (decl, asmspec,
        !          3530:                                    current_binding_level == global_binding_level,
        !          3531:                                    0);
        !          3532:          pop_obstacks ();
        !          3533:        }
        !          3534:       else
        !          3535:        {
        !          3536:          /* This is a no-op in c-lang.c or something real in objc-actions.c.  */
        !          3537:          maybe_objc_check_decl (decl);
        !          3538:          rest_of_decl_compilation (decl, asmspec,
        !          3539:                                    current_binding_level == global_binding_level,
        !          3540:                                    0);
        !          3541:        }
        !          3542:       if (current_binding_level != global_binding_level)
        !          3543:        {
        !          3544:          /* Recompute the RTL of a local array now
        !          3545:             if it used to be an incomplete type.  */
        !          3546:          if (was_incomplete
        !          3547:              && ! TREE_STATIC (decl) && ! DECL_EXTERNAL (decl))
        !          3548:            {
        !          3549:              /* If we used it already as memory, it must stay in memory.  */
        !          3550:              TREE_ADDRESSABLE (decl) = TREE_USED (decl);
        !          3551:              /* If it's still incomplete now, no init will save it.  */
        !          3552:              if (DECL_SIZE (decl) == 0)
        !          3553:                DECL_INITIAL (decl) = 0;
        !          3554:              expand_decl (decl);
        !          3555:            }
        !          3556:          /* Compute and store the initial value.  */
        !          3557:          if (TREE_CODE (decl) != FUNCTION_DECL)
        !          3558:            expand_decl_init (decl);
        !          3559:        }
        !          3560:     }
        !          3561: 
        !          3562:   if (TREE_CODE (decl) == TYPE_DECL)
        !          3563:     {
        !          3564:       /* This is a no-op in c-lang.c or something real in objc-actions.c.  */
        !          3565:       maybe_objc_check_decl (decl);
        !          3566:       rest_of_decl_compilation (decl, NULL_PTR,
        !          3567:                                current_binding_level == global_binding_level,
        !          3568:                                0);
        !          3569:     }
        !          3570: 
        !          3571:   /* ??? After 2.3, test (init != 0) instead of TREE_CODE.  */
        !          3572:   if (!(TREE_CODE (decl) == FUNCTION_DECL && DECL_INLINE (decl))
        !          3573:       && temporary && TREE_PERMANENT (decl)
        !          3574:       /* DECL_INITIAL is not defined in PARM_DECLs, since it shares
        !          3575:         space with DECL_ARG_TYPE.  */
        !          3576:       && TREE_CODE (decl) != PARM_DECL)
        !          3577:     {
        !          3578:       /* We need to remember that this array HAD an initialization,
        !          3579:         but discard the actual temporary nodes,
        !          3580:         since we can't have a permanent node keep pointing to them.  */
        !          3581:       /* We make an exception for inline functions, since it's
        !          3582:         normal for a local extern redeclaration of an inline function
        !          3583:         to have a copy of the top-level decl's DECL_INLINE.  */
        !          3584:       if (DECL_INITIAL (decl) != 0)
        !          3585:        {
        !          3586:          /* If this is a static const variable, then preserve the
        !          3587:             initializer instead of discarding it so that we can optimize
        !          3588:             references to it.  */
        !          3589:          if (TREE_STATIC (decl) && TREE_READONLY (decl))
        !          3590:            {
        !          3591:              preserve_initializer ();
        !          3592:              /* Hack?  Set the permanent bit for something that is permanent,
        !          3593:                 but not on the permenent obstack, so as to convince
        !          3594:                 output_constant_def to make its rtl on the permanent
        !          3595:                 obstack.  */
        !          3596:              TREE_PERMANENT (DECL_INITIAL (decl)) = 1;
        !          3597:            }
        !          3598:          else
        !          3599:            DECL_INITIAL (decl) = error_mark_node;
        !          3600:        }
        !          3601:     }
        !          3602: 
        !          3603: #if 0
        !          3604:   /* Resume permanent allocation, if not within a function.  */
        !          3605:   /* The corresponding push_obstacks_nochange is in start_decl,
        !          3606:      and in push_parm_decl and in grokfield.  */
        !          3607:   pop_obstacks ();
        !          3608: #endif
        !          3609: 
        !          3610:   /* If we have gone back from temporary to permanent allocation,
        !          3611:      actually free the temporary space that we no longer need.  */
        !          3612:   if (temporary && !allocation_temporary_p ())
        !          3613:     permanent_allocation ();
        !          3614: 
        !          3615:   /* At the end of a declaration, throw away any variable type sizes
        !          3616:      of types defined inside that declaration.  There is no use
        !          3617:      computing them in the following function definition.  */
        !          3618:   if (current_binding_level == global_binding_level)
        !          3619:     get_pending_sizes ();
        !          3620: }
        !          3621: 
        !          3622: /* If DECL has a cleanup, build and return that cleanup here.
        !          3623:    This is a callback called by expand_expr.  */
        !          3624: 
        !          3625: tree
        !          3626: maybe_build_cleanup (decl)
        !          3627:      tree decl;
        !          3628: {
        !          3629:   /* There are no cleanups in C.  */
        !          3630:   return NULL_TREE;
        !          3631: }
        !          3632: 
        !          3633: /* Given a parsed parameter declaration,
        !          3634:    decode it into a PARM_DECL and push that on the current binding level.
        !          3635:    Also, for the sake of forward parm decls,
        !          3636:    record the given order of parms in `parm_order'.  */
        !          3637: 
        !          3638: void
        !          3639: push_parm_decl (parm)
        !          3640:      tree parm;
        !          3641: {
        !          3642:   tree decl, olddecl;
        !          3643:   int old_immediate_size_expand = immediate_size_expand;
        !          3644:   /* Don't try computing parm sizes now -- wait till fn is called.  */
        !          3645:   immediate_size_expand = 0;
        !          3646: 
        !          3647:   /* The corresponding pop_obstacks is in finish_decl.  */
        !          3648:   push_obstacks_nochange ();
        !          3649: 
        !          3650:   decl = grokdeclarator (TREE_VALUE (parm), TREE_PURPOSE (parm), PARM, 0);
        !          3651: 
        !          3652: #if 0
        !          3653:   if (DECL_NAME (decl))
        !          3654:     {
        !          3655:       olddecl = lookup_name (DECL_NAME (decl));
        !          3656:       if (pedantic && olddecl != 0 && TREE_CODE (olddecl) == TYPE_DECL)
        !          3657:        pedwarn_with_decl (decl, "ANSI C forbids parameter `%s' shadowing typedef");
        !          3658:     }
        !          3659: #endif
        !          3660: 
        !          3661:   decl = pushdecl (decl);
        !          3662: 
        !          3663:   immediate_size_expand = old_immediate_size_expand;
        !          3664: 
        !          3665:   current_binding_level->parm_order
        !          3666:     = tree_cons (NULL_TREE, decl, current_binding_level->parm_order);
        !          3667: 
        !          3668:   /* Add this decl to the current binding level.  */
        !          3669:   finish_decl (decl, NULL_TREE, NULL_TREE);
        !          3670: }
        !          3671: 
        !          3672: /* Clear the given order of parms in `parm_order'.
        !          3673:    Used at start of parm list,
        !          3674:    and also at semicolon terminating forward decls.  */
        !          3675: 
        !          3676: void
        !          3677: clear_parm_order ()
        !          3678: {
        !          3679:   current_binding_level->parm_order = NULL_TREE;
        !          3680: }
        !          3681: 
        !          3682: /* Make TYPE a complete type based on INITIAL_VALUE.
        !          3683:    Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered,
        !          3684:    2 if there was no information (in which case assume 1 if DO_DEFAULT).  */
        !          3685: 
        !          3686: int
        !          3687: complete_array_type (type, initial_value, do_default)
        !          3688:      tree type;
        !          3689:      tree initial_value;
        !          3690:      int do_default;
        !          3691: {
        !          3692:   register tree maxindex = NULL_TREE;
        !          3693:   int value = 0;
        !          3694: 
        !          3695:   if (initial_value)
        !          3696:     {
        !          3697:       /* Note MAXINDEX  is really the maximum index,
        !          3698:         one less than the size.  */
        !          3699:       if (TREE_CODE (initial_value) == STRING_CST)
        !          3700:        {
        !          3701:          int eltsize
        !          3702:            = int_size_in_bytes (TREE_TYPE (TREE_TYPE (initial_value)));
        !          3703:          maxindex = build_int_2 ((TREE_STRING_LENGTH (initial_value)
        !          3704:                                   / eltsize) - 1, 0);
        !          3705:        }
        !          3706:       else if (TREE_CODE (initial_value) == CONSTRUCTOR)
        !          3707:        {
        !          3708:          tree elts = CONSTRUCTOR_ELTS (initial_value);
        !          3709:          maxindex = size_binop (MINUS_EXPR, integer_zero_node, size_one_node);
        !          3710:          for (; elts; elts = TREE_CHAIN (elts))
        !          3711:            {
        !          3712:              if (TREE_PURPOSE (elts))
        !          3713:                maxindex = TREE_PURPOSE (elts);
        !          3714:              else
        !          3715:                maxindex = size_binop (PLUS_EXPR, maxindex, size_one_node);
        !          3716:            }
        !          3717:          maxindex = copy_node (maxindex);
        !          3718:        }
        !          3719:       else
        !          3720:        {
        !          3721:          /* Make an error message unless that happened already.  */
        !          3722:          if (initial_value != error_mark_node)
        !          3723:            value = 1;
        !          3724: 
        !          3725:          /* Prevent further error messages.  */
        !          3726:          maxindex = build_int_2 (0, 0);
        !          3727:        }
        !          3728:     }
        !          3729: 
        !          3730:   if (!maxindex)
        !          3731:     {
        !          3732:       if (do_default)
        !          3733:        maxindex = build_int_2 (0, 0);
        !          3734:       value = 2;
        !          3735:     }
        !          3736: 
        !          3737:   if (maxindex)
        !          3738:     {
        !          3739:       TYPE_DOMAIN (type) = build_index_type (maxindex);
        !          3740:       if (!TREE_TYPE (maxindex))
        !          3741:        TREE_TYPE (maxindex) = TYPE_DOMAIN (type);
        !          3742: #if 0 /* I took out this change
        !          3743:         together with the change in build_array_type. --rms  */
        !          3744:       change_main_variant (type,
        !          3745:                           build_array_type (TREE_TYPE (type),
        !          3746:                                             TYPE_DOMAIN (type)));
        !          3747: #endif
        !          3748:     }
        !          3749: 
        !          3750:   /* Lay out the type now that we can get the real answer.  */
        !          3751: 
        !          3752:   layout_type (type);
        !          3753: 
        !          3754:   return value;
        !          3755: }
        !          3756: 
        !          3757: /* Given declspecs and a declarator,
        !          3758:    determine the name and type of the object declared
        !          3759:    and construct a ..._DECL node for it.
        !          3760:    (In one case we can return a ..._TYPE node instead.
        !          3761:     For invalid input we sometimes return 0.)
        !          3762: 
        !          3763:    DECLSPECS is a chain of tree_list nodes whose value fields
        !          3764:     are the storage classes and type specifiers.
        !          3765: 
        !          3766:    DECL_CONTEXT says which syntactic context this declaration is in:
        !          3767:      NORMAL for most contexts.  Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL.
        !          3768:      FUNCDEF for a function definition.  Like NORMAL but a few different
        !          3769:       error messages in each case.  Return value may be zero meaning
        !          3770:       this definition is too screwy to try to parse.
        !          3771:      PARM for a parameter declaration (either within a function prototype
        !          3772:       or before a function body).  Make a PARM_DECL, or return void_type_node.
        !          3773:      TYPENAME if for a typename (in a cast or sizeof).
        !          3774:       Don't make a DECL node; just return the ..._TYPE node.
        !          3775:      FIELD for a struct or union field; make a FIELD_DECL.
        !          3776:      BITFIELD for a field with specified width.
        !          3777:    INITIALIZED is 1 if the decl has an initializer.
        !          3778: 
        !          3779:    In the TYPENAME case, DECLARATOR is really an absolute declarator.
        !          3780:    It may also be so in the PARM case, for a prototype where the
        !          3781:    argument type is specified but not the name.
        !          3782: 
        !          3783:    This function is where the complicated C meanings of `static'
        !          3784:    and `extern' are interpreted.  */
        !          3785: 
        !          3786: static tree
        !          3787: grokdeclarator (declarator, declspecs, decl_context, initialized)
        !          3788:      tree declspecs;
        !          3789:      tree declarator;
        !          3790:      enum decl_context decl_context;
        !          3791:      int initialized;
        !          3792: {
        !          3793:   int specbits = 0;
        !          3794:   tree spec;
        !          3795:   tree type = NULL_TREE;
        !          3796:   int longlong = 0;
        !          3797:   int constp;
        !          3798:   int volatilep;
        !          3799:   int inlinep;
        !          3800:   int explicit_int = 0;
        !          3801:   int explicit_char = 0;
        !          3802:   int defaulted_int = 0;
        !          3803:   tree typedef_decl = 0;
        !          3804:   char *name;
        !          3805:   tree typedef_type = 0;
        !          3806:   int funcdef_flag = 0;
        !          3807:   enum tree_code innermost_code = ERROR_MARK;
        !          3808:   int bitfield = 0;
        !          3809:   int size_varies = 0;
        !          3810: 
        !          3811:   if (decl_context == BITFIELD)
        !          3812:     bitfield = 1, decl_context = FIELD;
        !          3813: 
        !          3814:   if (decl_context == FUNCDEF)
        !          3815:     funcdef_flag = 1, decl_context = NORMAL;
        !          3816: 
        !          3817:   push_obstacks_nochange ();
        !          3818: 
        !          3819:   if (flag_traditional && allocation_temporary_p ())
        !          3820:     end_temporary_allocation ();
        !          3821: 
        !          3822:   /* Look inside a declarator for the name being declared
        !          3823:      and get it as a string, for an error message.  */
        !          3824:   {
        !          3825:     register tree decl = declarator;
        !          3826:     name = 0;
        !          3827: 
        !          3828:     while (decl)
        !          3829:       switch (TREE_CODE (decl))
        !          3830:        {
        !          3831:        case ARRAY_REF:
        !          3832:        case INDIRECT_REF:
        !          3833:        case CALL_EXPR:
        !          3834:          innermost_code = TREE_CODE (decl);
        !          3835:          decl = TREE_OPERAND (decl, 0);
        !          3836:          break;
        !          3837: 
        !          3838:        case IDENTIFIER_NODE:
        !          3839:          name = IDENTIFIER_POINTER (decl);
        !          3840:          decl = 0;
        !          3841:          break;
        !          3842: 
        !          3843:        default:
        !          3844:          abort ();
        !          3845:        }
        !          3846:     if (name == 0)
        !          3847:       name = "type name";
        !          3848:   }
        !          3849: 
        !          3850:   /* A function definition's declarator must have the form of
        !          3851:      a function declarator.  */
        !          3852: 
        !          3853:   if (funcdef_flag && innermost_code != CALL_EXPR)
        !          3854:     return 0;
        !          3855: 
        !          3856:   /* Anything declared one level down from the top level
        !          3857:      must be one of the parameters of a function
        !          3858:      (because the body is at least two levels down).  */
        !          3859: 
        !          3860:   /* If this looks like a function definition, make it one,
        !          3861:      even if it occurs where parms are expected.
        !          3862:      Then store_parm_decls will reject it and not use it as a parm.  */
        !          3863:   if (decl_context == NORMAL && !funcdef_flag
        !          3864:       && current_binding_level->level_chain == global_binding_level)
        !          3865:     decl_context = PARM;
        !          3866: 
        !          3867:   /* Look through the decl specs and record which ones appear.
        !          3868:      Some typespecs are defined as built-in typenames.
        !          3869:      Others, the ones that are modifiers of other types,
        !          3870:      are represented by bits in SPECBITS: set the bits for
        !          3871:      the modifiers that appear.  Storage class keywords are also in SPECBITS.
        !          3872: 
        !          3873:      If there is a typedef name or a type, store the type in TYPE.
        !          3874:      This includes builtin typedefs such as `int'.
        !          3875: 
        !          3876:      Set EXPLICIT_INT or EXPLICIT_CHAR if the type is `int' or `char'
        !          3877:      and did not come from a user typedef.
        !          3878: 
        !          3879:      Set LONGLONG if `long' is mentioned twice.  */
        !          3880: 
        !          3881:   for (spec = declspecs; spec; spec = TREE_CHAIN (spec))
        !          3882:     {
        !          3883:       register int i;
        !          3884:       register tree id = TREE_VALUE (spec);
        !          3885: 
        !          3886:       if (id == ridpointers[(int) RID_INT])
        !          3887:        explicit_int = 1;
        !          3888:       if (id == ridpointers[(int) RID_CHAR])
        !          3889:        explicit_char = 1;
        !          3890: 
        !          3891:       if (TREE_CODE (id) == IDENTIFIER_NODE)
        !          3892:        for (i = (int) RID_FIRST_MODIFIER; i < (int) RID_MAX; i++)
        !          3893:          {
        !          3894:            if (ridpointers[i] == id)
        !          3895:              {
        !          3896:                if (i == (int) RID_LONG && specbits & (1<<i))
        !          3897:                  {
        !          3898:                    if (longlong)
        !          3899:                      error ("`long long long' is too long for GCC");
        !          3900:                    else
        !          3901:                      {
        !          3902:                        if (pedantic)
        !          3903:                          pedwarn ("ANSI C does not support `long long'");
        !          3904:                        longlong = 1;
        !          3905:                      }
        !          3906:                  }
        !          3907:                else if (specbits & (1 << i))
        !          3908:                  pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id));
        !          3909:                specbits |= 1 << i;
        !          3910:                goto found;
        !          3911:              }
        !          3912:          }
        !          3913:       if (type)
        !          3914:        error ("two or more data types in declaration of `%s'", name);
        !          3915:       /* Actual typedefs come to us as TYPE_DECL nodes.  */
        !          3916:       else if (TREE_CODE (id) == TYPE_DECL)
        !          3917:        {
        !          3918:          type = TREE_TYPE (id);
        !          3919:          typedef_decl = id;
        !          3920:        }
        !          3921:       /* Built-in types come as identifiers.  */
        !          3922:       else if (TREE_CODE (id) == IDENTIFIER_NODE)
        !          3923:        {
        !          3924:          register tree t = lookup_name (id);
        !          3925:          if (TREE_TYPE (t) == error_mark_node)
        !          3926:            ;
        !          3927:          else if (!t || TREE_CODE (t) != TYPE_DECL)
        !          3928:            error ("`%s' fails to be a typedef or built in type",
        !          3929:                   IDENTIFIER_POINTER (id));
        !          3930:          else
        !          3931:            {
        !          3932:              type = TREE_TYPE (t);
        !          3933:              typedef_decl = t;
        !          3934:            }
        !          3935:        }
        !          3936:       else if (TREE_CODE (id) != ERROR_MARK)
        !          3937:        type = id;
        !          3938: 
        !          3939:     found: {}
        !          3940:     }
        !          3941: 
        !          3942:   typedef_type = type;
        !          3943:   if (type)
        !          3944:     size_varies = C_TYPE_VARIABLE_SIZE (type);
        !          3945: 
        !          3946:   /* No type at all: default to `int', and set DEFAULTED_INT
        !          3947:      because it was not a user-defined typedef.  */
        !          3948: 
        !          3949:   if (type == 0)
        !          3950:     {
        !          3951:       if (funcdef_flag && warn_return_type
        !          3952:          && ! (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
        !          3953:                            | (1 << (int) RID_SIGNED) | (1 << (int) RID_UNSIGNED))))
        !          3954:        warn_about_return_type = 1;
        !          3955:       defaulted_int = 1;
        !          3956:       type = integer_type_node;
        !          3957:     }
        !          3958: 
        !          3959:   /* Now process the modifiers that were specified
        !          3960:      and check for invalid combinations.  */
        !          3961: 
        !          3962:   /* Long double is a special combination.  */
        !          3963: 
        !          3964:   if ((specbits & 1 << (int) RID_LONG)
        !          3965:       && TYPE_MAIN_VARIANT (type) == double_type_node)
        !          3966:     {
        !          3967:       specbits &= ~ (1 << (int) RID_LONG);
        !          3968:       type = long_double_type_node;
        !          3969:     }
        !          3970: 
        !          3971:   /* Check all other uses of type modifiers.  */
        !          3972: 
        !          3973:   if (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
        !          3974:                  | (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED)))
        !          3975:     {
        !          3976:       int ok = 0;
        !          3977: 
        !          3978:       if (TREE_CODE (type) != INTEGER_TYPE)
        !          3979:        error ("long, short, signed or unsigned invalid for `%s'", name);
        !          3980:       else if ((specbits & 1 << (int) RID_LONG)
        !          3981:               && (specbits & 1 << (int) RID_SHORT))
        !          3982:        error ("long and short specified together for `%s'", name);
        !          3983:       else if (((specbits & 1 << (int) RID_LONG)
        !          3984:                || (specbits & 1 << (int) RID_SHORT))
        !          3985:               && explicit_char)
        !          3986:        error ("long or short specified with char for `%s'", name);
        !          3987:       else if (((specbits & 1 << (int) RID_LONG)
        !          3988:                || (specbits & 1 << (int) RID_SHORT))
        !          3989:               && TREE_CODE (type) == REAL_TYPE)
        !          3990:        error ("long or short specified with floating type for `%s'", name);
        !          3991:       else if ((specbits & 1 << (int) RID_SIGNED)
        !          3992:               && (specbits & 1 << (int) RID_UNSIGNED))
        !          3993:        error ("signed and unsigned given together for `%s'", name);
        !          3994:       else
        !          3995:        {
        !          3996:          ok = 1;
        !          3997:          if (!explicit_int && !defaulted_int && !explicit_char && pedantic)
        !          3998:            {
        !          3999:              pedwarn ("long, short, signed or unsigned used invalidly for `%s'",
        !          4000:                       name);
        !          4001:              if (flag_pedantic_errors)
        !          4002:                ok = 0;
        !          4003:            }
        !          4004:        }
        !          4005: 
        !          4006:       /* Discard the type modifiers if they are invalid.  */
        !          4007:       if (! ok)
        !          4008:        {
        !          4009:          specbits &= ~((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
        !          4010:                        | (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED));
        !          4011:          longlong = 0;
        !          4012:        }
        !          4013:     }
        !          4014: 
        !          4015:   /* Decide whether an integer type is signed or not.
        !          4016:      Optionally treat bitfields as signed by default.  */
        !          4017:   if (specbits & 1 << (int) RID_UNSIGNED
        !          4018:       /* Traditionally, all bitfields are unsigned.  */
        !          4019:       || (bitfield && flag_traditional
        !          4020:          && (! explicit_flag_signed_bitfields || !flag_signed_bitfields))
        !          4021:       || (bitfield && ! flag_signed_bitfields
        !          4022:          && (explicit_int || defaulted_int || explicit_char
        !          4023:              /* A typedef for plain `int' without `signed'
        !          4024:                 can be controlled just like plain `int'.  */
        !          4025:              || ! (typedef_decl != 0
        !          4026:                    && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
        !          4027:          && TREE_CODE (type) != ENUMERAL_TYPE
        !          4028:          && !(specbits & 1 << (int) RID_SIGNED)))
        !          4029:     {
        !          4030:       if (longlong)
        !          4031:        type = long_long_unsigned_type_node;
        !          4032:       else if (specbits & 1 << (int) RID_LONG)
        !          4033:        type = long_unsigned_type_node;
        !          4034:       else if (specbits & 1 << (int) RID_SHORT)
        !          4035:        type = short_unsigned_type_node;
        !          4036:       else if (type == char_type_node)
        !          4037:        type = unsigned_char_type_node;
        !          4038:       else if (typedef_decl)
        !          4039:        type = unsigned_type (type);
        !          4040:       else
        !          4041:        type = unsigned_type_node;
        !          4042:     }
        !          4043:   else if ((specbits & 1 << (int) RID_SIGNED)
        !          4044:           && type == char_type_node)
        !          4045:     type = signed_char_type_node;
        !          4046:   else if (longlong)
        !          4047:     type = long_long_integer_type_node;
        !          4048:   else if (specbits & 1 << (int) RID_LONG)
        !          4049:     type = long_integer_type_node;
        !          4050:   else if (specbits & 1 << (int) RID_SHORT)
        !          4051:     type = short_integer_type_node;
        !          4052:   else if (specbits & 1 << (int) RID_COMPLEX)
        !          4053:     {
        !          4054:       if (defaulted_int)
        !          4055:        type = complex_double_type_node;
        !          4056:       else if (type == integer_type_node)
        !          4057:        type = complex_integer_type_node;
        !          4058:       else if (type == float_type_node)
        !          4059:        type = complex_float_type_node;
        !          4060:       else if (type == double_type_node)
        !          4061:        type = complex_double_type_node;
        !          4062:       else if (type == long_double_type_node)
        !          4063:        type = complex_long_double_type_node;
        !          4064:       else
        !          4065:        error ("invalid complex type");
        !          4066:     }
        !          4067: 
        !          4068:   /* Set CONSTP if this declaration is `const', whether by
        !          4069:      explicit specification or via a typedef.
        !          4070:      Likewise for VOLATILEP.  */
        !          4071: 
        !          4072:   constp = !! (specbits & 1 << (int) RID_CONST) + TYPE_READONLY (type);
        !          4073:   volatilep = !! (specbits & 1 << (int) RID_VOLATILE) + TYPE_VOLATILE (type);
        !          4074:   inlinep = !! (specbits & (1 << (int) RID_INLINE));
        !          4075:   if (constp > 1)
        !          4076:     pedwarn ("duplicate `const'");
        !          4077:   if (volatilep > 1)
        !          4078:     pedwarn ("duplicate `volatile'");
        !          4079:   if (! flag_gen_aux_info && (TYPE_READONLY (type) || TYPE_VOLATILE (type)))
        !          4080:     type = TYPE_MAIN_VARIANT (type);
        !          4081: 
        !          4082:   /* Warn if two storage classes are given. Default to `auto'.  */
        !          4083: 
        !          4084:   {
        !          4085:     int nclasses = 0;
        !          4086: 
        !          4087:     if (specbits & 1 << (int) RID_AUTO) nclasses++;
        !          4088:     if (specbits & 1 << (int) RID_STATIC) nclasses++;
        !          4089:     if (specbits & 1 << (int) RID_EXTERN) nclasses++;
        !          4090:     if (specbits & 1 << (int) RID_REGISTER) nclasses++;
        !          4091:     if (specbits & 1 << (int) RID_TYPEDEF) nclasses++;
        !          4092:     if (specbits & 1 << (int) RID_ITERATOR) nclasses++;
        !          4093: 
        !          4094:     /* Warn about storage classes that are invalid for certain
        !          4095:        kinds of declarations (parameters, typenames, etc.).  */
        !          4096: 
        !          4097:     if (nclasses > 1)
        !          4098:       error ("multiple storage classes in declaration of `%s'", name);
        !          4099:     else if (funcdef_flag
        !          4100:             && (specbits
        !          4101:                 & ((1 << (int) RID_REGISTER)
        !          4102:                    | (1 << (int) RID_AUTO)
        !          4103:                    | (1 << (int) RID_TYPEDEF))))
        !          4104:       {
        !          4105:        if (specbits & 1 << (int) RID_AUTO
        !          4106:            && (pedantic || current_binding_level == global_binding_level))
        !          4107:          pedwarn ("function definition declared `auto'");
        !          4108:        if (specbits & 1 << (int) RID_REGISTER)
        !          4109:          error ("function definition declared `register'");
        !          4110:        if (specbits & 1 << (int) RID_TYPEDEF)
        !          4111:          error ("function definition declared `typedef'");
        !          4112:        specbits &= ~ ((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER)
        !          4113:                       | (1 << (int) RID_AUTO));
        !          4114:       }
        !          4115:     else if (decl_context != NORMAL && nclasses > 0)
        !          4116:       {
        !          4117:        if (decl_context == PARM && specbits & 1 << (int) RID_REGISTER)
        !          4118:          ;
        !          4119:        else
        !          4120:          {
        !          4121:            error ((decl_context == FIELD
        !          4122:                    ? "storage class specified for structure field `%s'"
        !          4123:                    : (decl_context == PARM
        !          4124:                       ? "storage class specified for parameter `%s'"
        !          4125:                       : "storage class specified for typename")),
        !          4126:                   name);
        !          4127:            specbits &= ~ ((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER)
        !          4128:                           | (1 << (int) RID_AUTO) | (1 << (int) RID_STATIC)
        !          4129:                           | (1 << (int) RID_EXTERN));
        !          4130:          }
        !          4131:       }
        !          4132:     else if (specbits & 1 << (int) RID_EXTERN && initialized && ! funcdef_flag)
        !          4133:       {
        !          4134:        /* `extern' with initialization is invalid if not at top level.  */
        !          4135:        if (current_binding_level == global_binding_level)
        !          4136:          warning ("`%s' initialized and declared `extern'", name);
        !          4137:        else
        !          4138:          error ("`%s' has both `extern' and initializer", name);
        !          4139:       }
        !          4140:     else if (specbits & 1 << (int) RID_EXTERN && funcdef_flag
        !          4141:             && current_binding_level != global_binding_level)
        !          4142:       error ("nested function `%s' declared `extern'", name);
        !          4143:     else if (current_binding_level == global_binding_level
        !          4144:             && specbits & (1 << (int) RID_AUTO))
        !          4145:       error ("top-level declaration of `%s' specifies `auto'", name);
        !          4146:     else if ((specbits & 1 << (int) RID_ITERATOR)
        !          4147:             && TREE_CODE (declarator) != IDENTIFIER_NODE)
        !          4148:       {
        !          4149:        error ("iterator `%s' has derived type", name);
        !          4150:        type = error_mark_node;
        !          4151:       }
        !          4152:     else if ((specbits & 1 << (int) RID_ITERATOR)
        !          4153:             && TREE_CODE (type) != INTEGER_TYPE)
        !          4154:       {
        !          4155:        error ("iterator `%s' has noninteger type", name);
        !          4156:        type = error_mark_node;
        !          4157:       }
        !          4158:   }
        !          4159: 
        !          4160:   /* Now figure out the structure of the declarator proper.
        !          4161:      Descend through it, creating more complex types, until we reach
        !          4162:      the declared identifier (or NULL_TREE, in an absolute declarator).  */
        !          4163: 
        !          4164:   while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE)
        !          4165:     {
        !          4166:       if (type == error_mark_node)
        !          4167:        {
        !          4168:          declarator = TREE_OPERAND (declarator, 0);
        !          4169:          continue;
        !          4170:        }
        !          4171: 
        !          4172:       /* Each level of DECLARATOR is either an ARRAY_REF (for ...[..]),
        !          4173:         an INDIRECT_REF (for *...),
        !          4174:         a CALL_EXPR (for ...(...)),
        !          4175:         an identifier (for the name being declared)
        !          4176:         or a null pointer (for the place in an absolute declarator
        !          4177:         where the name was omitted).
        !          4178:         For the last two cases, we have just exited the loop.
        !          4179: 
        !          4180:         At this point, TYPE is the type of elements of an array,
        !          4181:         or for a function to return, or for a pointer to point to.
        !          4182:         After this sequence of ifs, TYPE is the type of the
        !          4183:         array or function or pointer, and DECLARATOR has had its
        !          4184:         outermost layer removed.  */
        !          4185: 
        !          4186:       if (TREE_CODE (declarator) == ARRAY_REF)
        !          4187:        {
        !          4188:          register tree itype = NULL_TREE;
        !          4189:          register tree size = TREE_OPERAND (declarator, 1);
        !          4190:          /* An uninitialized decl with `extern' is a reference.  */
        !          4191:          int extern_ref = !initialized && (specbits & (1 << (int) RID_EXTERN));
        !          4192: 
        !          4193:          declarator = TREE_OPERAND (declarator, 0);
        !          4194: 
        !          4195:          /* Check for some types that there cannot be arrays of.  */
        !          4196: 
        !          4197:          if (TYPE_MAIN_VARIANT (type) == void_type_node)
        !          4198:            {
        !          4199:              error ("declaration of `%s' as array of voids", name);
        !          4200:              type = error_mark_node;
        !          4201:            }
        !          4202: 
        !          4203:          if (TREE_CODE (type) == FUNCTION_TYPE)
        !          4204:            {
        !          4205:              error ("declaration of `%s' as array of functions", name);
        !          4206:              type = error_mark_node;
        !          4207:            }
        !          4208: 
        !          4209:          if (size == error_mark_node)
        !          4210:            type = error_mark_node;
        !          4211: 
        !          4212:          if (type == error_mark_node)
        !          4213:            continue;
        !          4214: 
        !          4215:          /* If this is a block level extern, it must live past the end
        !          4216:             of the function so that we can check it against other extern
        !          4217:             declarations (IDENTIFIER_LIMBO_VALUE).  */
        !          4218:          if (extern_ref && allocation_temporary_p ())
        !          4219:            end_temporary_allocation ();
        !          4220: 
        !          4221:          /* If size was specified, set ITYPE to a range-type for that size.
        !          4222:             Otherwise, ITYPE remains null.  finish_decl may figure it out
        !          4223:             from an initial value.  */
        !          4224: 
        !          4225:          if (size)
        !          4226:            {
        !          4227:              /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
        !          4228:              STRIP_TYPE_NOPS (size);
        !          4229: 
        !          4230:              if (TREE_CODE (TREE_TYPE (size)) != INTEGER_TYPE
        !          4231:                  && TREE_CODE (TREE_TYPE (size)) != ENUMERAL_TYPE)
        !          4232:                {
        !          4233:                  error ("size of array `%s' has non-integer type", name);
        !          4234:                  size = integer_one_node;
        !          4235:                }
        !          4236:              if (pedantic && integer_zerop (size))
        !          4237:                pedwarn ("ANSI C forbids zero-size array `%s'", name);
        !          4238:              if (TREE_CODE (size) == INTEGER_CST)
        !          4239:                {
        !          4240:                  constant_expression_warning (size);
        !          4241:                  if (INT_CST_LT (size, integer_zero_node))
        !          4242:                    {
        !          4243:                      error ("size of array `%s' is negative", name);
        !          4244:                      size = integer_one_node;
        !          4245:                    }
        !          4246:                  itype = build_index_type (size_binop (MINUS_EXPR, size,
        !          4247:                                                        size_one_node));
        !          4248:                }
        !          4249:              else
        !          4250:                {
        !          4251:                  if (pedantic)
        !          4252:                    {
        !          4253:                      if (TREE_CONSTANT (size))
        !          4254:                        pedwarn ("ANSI C forbids array `%s' whose size can't be evaluated", name);
        !          4255:                      else
        !          4256:                        pedwarn ("ANSI C forbids variable-size array `%s'", name);
        !          4257:                    }
        !          4258:                  itype = build_binary_op (MINUS_EXPR, size, integer_one_node,
        !          4259:                                           1);
        !          4260:                  /* Make sure the array size remains visibly nonconstant
        !          4261:                     even if it is (eg) a const variable with known value.  */
        !          4262:                  size_varies = 1;
        !          4263:                  itype = variable_size (itype);
        !          4264:                  itype = build_index_type (itype);
        !          4265:                }
        !          4266:            }
        !          4267: 
        !          4268: #if 0 /* This had bad results for pointers to arrays, as in
        !          4269:         union incomplete (*foo)[4];  */
        !          4270:          /* Complain about arrays of incomplete types, except in typedefs.  */
        !          4271: 
        !          4272:          if (TYPE_SIZE (type) == 0
        !          4273:              /* Avoid multiple warnings for nested array types.  */
        !          4274:              && TREE_CODE (type) != ARRAY_TYPE
        !          4275:              && !(specbits & (1 << (int) RID_TYPEDEF))
        !          4276:              && !C_TYPE_BEING_DEFINED (type))
        !          4277:            warning ("array type has incomplete element type");
        !          4278: #endif
        !          4279: 
        !          4280: #if 0  /* We shouldn't have a function type here at all!
        !          4281:          Functions aren't allowed as array elements.  */
        !          4282:          if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
        !          4283:              && (constp || volatilep))
        !          4284:            pedwarn ("ANSI C forbids const or volatile function types");
        !          4285: #endif
        !          4286: 
        !          4287:          /* Build the array type itself, then merge any constancy or
        !          4288:             volatility into the target type.  We must do it in this order
        !          4289:             to ensure that the TYPE_MAIN_VARIANT field of the array type
        !          4290:             is set correctly.  */
        !          4291: 
        !          4292:          type = build_array_type (type, itype);
        !          4293:          if (constp || volatilep)
        !          4294:            type = c_build_type_variant (type, constp, volatilep);
        !          4295: 
        !          4296: #if 0  /* don't clear these; leave them set so that the array type
        !          4297:           or the variable is itself const or volatile.  */
        !          4298:          constp = 0;
        !          4299:          volatilep = 0;
        !          4300: #endif
        !          4301: 
        !          4302:          if (size_varies)
        !          4303:            C_TYPE_VARIABLE_SIZE (type) = 1;
        !          4304:        }
        !          4305:       else if (TREE_CODE (declarator) == CALL_EXPR)
        !          4306:        {
        !          4307:          int extern_ref = (!(specbits & (1 << (int) RID_AUTO))
        !          4308:                            || current_binding_level == global_binding_level);
        !          4309:          tree arg_types;
        !          4310: 
        !          4311:          /* Declaring a function type.
        !          4312:             Make sure we have a valid type for the function to return.  */
        !          4313:          if (type == error_mark_node)
        !          4314:            continue;
        !          4315: 
        !          4316:          size_varies = 0;
        !          4317: 
        !          4318:          /* Warn about some types functions can't return.  */
        !          4319: 
        !          4320:          if (TREE_CODE (type) == FUNCTION_TYPE)
        !          4321:            {
        !          4322:              error ("`%s' declared as function returning a function", name);
        !          4323:              type = integer_type_node;
        !          4324:            }
        !          4325:          if (TREE_CODE (type) == ARRAY_TYPE)
        !          4326:            {
        !          4327:              error ("`%s' declared as function returning an array", name);
        !          4328:              type = integer_type_node;
        !          4329:            }
        !          4330: 
        !          4331: #ifndef TRADITIONAL_RETURN_FLOAT
        !          4332:          /* Traditionally, declaring return type float means double.  */
        !          4333: 
        !          4334:          if (flag_traditional && TYPE_MAIN_VARIANT (type) == float_type_node)
        !          4335:            type = double_type_node;
        !          4336: #endif /* TRADITIONAL_RETURN_FLOAT */
        !          4337: 
        !          4338:          /* If this is a block level extern, it must live past the end
        !          4339:             of the function so that we can check it against other extern
        !          4340:             declarations (IDENTIFIER_LIMBO_VALUE).  */
        !          4341:          if (extern_ref && allocation_temporary_p ())
        !          4342:            end_temporary_allocation ();
        !          4343: 
        !          4344:          /* Construct the function type and go to the next
        !          4345:             inner layer of declarator.  */
        !          4346: 
        !          4347:          arg_types = grokparms (TREE_OPERAND (declarator, 1),
        !          4348:                                 funcdef_flag
        !          4349:                                 /* Say it's a definition
        !          4350:                                    only for the CALL_EXPR
        !          4351:                                    closest to the identifier.  */
        !          4352:                                 && TREE_CODE (TREE_OPERAND (declarator, 0)) == IDENTIFIER_NODE);
        !          4353: #if 0 /* This seems to be false.  We turn off temporary allocation
        !          4354:         above in this function if -traditional.
        !          4355:         And this code caused inconsistent results with prototypes:
        !          4356:         callers would ignore them, and pass arguments wrong.  */
        !          4357: 
        !          4358:          /* Omit the arg types if -traditional, since the arg types
        !          4359:             and the list links might not be permanent.  */
        !          4360:          type = build_function_type (type,
        !          4361:                                      flag_traditional 
        !          4362:                                      ? NULL_TREE : arg_types);
        !          4363: #endif
        !          4364:          /* ANSI seems to say that `const int foo ();'
        !          4365:             does not make the function foo const.  */
        !          4366:          if (constp || volatilep)
        !          4367:            type = c_build_type_variant (type, constp, volatilep);
        !          4368:          constp = 0;
        !          4369:          volatilep = 0;
        !          4370: 
        !          4371:          type = build_function_type (type, arg_types);
        !          4372:          declarator = TREE_OPERAND (declarator, 0);
        !          4373: 
        !          4374:          /* Set the TYPE_CONTEXTs for each tagged type which is local to
        !          4375:             the formal parameter list of this FUNCTION_TYPE to point to
        !          4376:             the FUNCTION_TYPE node itself.  */
        !          4377: 
        !          4378:          {
        !          4379:            register tree link;
        !          4380: 
        !          4381:            for (link = current_function_parm_tags;
        !          4382:                 link;
        !          4383:                 link = TREE_CHAIN (link))
        !          4384:              TYPE_CONTEXT (TREE_VALUE (link)) = type;
        !          4385:          }
        !          4386:        }
        !          4387:       else if (TREE_CODE (declarator) == INDIRECT_REF)
        !          4388:        {
        !          4389:          /* Merge any constancy or volatility into the target type
        !          4390:             for the pointer.  */
        !          4391: 
        !          4392:          if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
        !          4393:              && (constp || volatilep))
        !          4394:            pedwarn ("ANSI C forbids const or volatile function types");
        !          4395:          if (constp || volatilep)
        !          4396:            type = c_build_type_variant (type, constp, volatilep);
        !          4397:          constp = 0;
        !          4398:          volatilep = 0;
        !          4399:          size_varies = 0;
        !          4400: 
        !          4401:          type = build_pointer_type (type);
        !          4402: 
        !          4403:          /* Process a list of type modifier keywords
        !          4404:             (such as const or volatile) that were given inside the `*'.  */
        !          4405: 
        !          4406:          if (TREE_TYPE (declarator))
        !          4407:            {
        !          4408:              register tree typemodlist;
        !          4409:              int erred = 0;
        !          4410:              for (typemodlist = TREE_TYPE (declarator); typemodlist;
        !          4411:                   typemodlist = TREE_CHAIN (typemodlist))
        !          4412:                {
        !          4413:                  if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_CONST])
        !          4414:                    constp++;
        !          4415:                  else if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_VOLATILE])
        !          4416:                    volatilep++;
        !          4417:                  else if (!erred)
        !          4418:                    {
        !          4419:                      erred = 1;
        !          4420:                      error ("invalid type modifier within pointer declarator");
        !          4421:                    }
        !          4422:                }
        !          4423:              if (constp > 1)
        !          4424:                pedwarn ("duplicate `const'");
        !          4425:              if (volatilep > 1)
        !          4426:                pedwarn ("duplicate `volatile'");
        !          4427:            }
        !          4428: 
        !          4429:          declarator = TREE_OPERAND (declarator, 0);
        !          4430:        }
        !          4431:       else
        !          4432:        abort ();
        !          4433: 
        !          4434:     }
        !          4435: 
        !          4436:   /* Now TYPE has the actual type.  */
        !          4437: 
        !          4438:   /* If this is declaring a typedef name, return a TYPE_DECL.  */
        !          4439: 
        !          4440:   if (specbits & (1 << (int) RID_TYPEDEF))
        !          4441:     {
        !          4442:       tree decl;
        !          4443:       /* Note that the grammar rejects storage classes
        !          4444:         in typenames, fields or parameters */
        !          4445:       if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
        !          4446:          && (constp || volatilep))
        !          4447:        pedwarn ("ANSI C forbids const or volatile function types");
        !          4448:       if (constp || volatilep)
        !          4449:        type = c_build_type_variant (type, constp, volatilep);
        !          4450:       pop_obstacks ();
        !          4451:       decl = build_decl (TYPE_DECL, declarator, type);
        !          4452:       if ((specbits & (1 << (int) RID_SIGNED))
        !          4453:          || (typedef_decl && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
        !          4454:        C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1;
        !          4455:       return decl;
        !          4456:     }
        !          4457: 
        !          4458:   /* Detect the case of an array type of unspecified size
        !          4459:      which came, as such, direct from a typedef name.
        !          4460:      We must copy the type, so that each identifier gets
        !          4461:      a distinct type, so that each identifier's size can be
        !          4462:      controlled separately by its own initializer.  */
        !          4463: 
        !          4464:   if (type != 0 && typedef_type != 0
        !          4465:       && TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (typedef_type)
        !          4466:       && TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type) == 0)
        !          4467:     {
        !          4468:       type = build_array_type (TREE_TYPE (type), 0);
        !          4469:       if (size_varies)
        !          4470:        C_TYPE_VARIABLE_SIZE (type) = 1;
        !          4471:     }
        !          4472: 
        !          4473:   /* If this is a type name (such as, in a cast or sizeof),
        !          4474:      compute the type and return it now.  */
        !          4475: 
        !          4476:   if (decl_context == TYPENAME)
        !          4477:     {
        !          4478:       /* Note that the grammar rejects storage classes
        !          4479:         in typenames, fields or parameters */
        !          4480:       if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
        !          4481:          && (constp || volatilep))
        !          4482:        pedwarn ("ANSI C forbids const or volatile function types");
        !          4483:       if (constp || volatilep)
        !          4484:        type = c_build_type_variant (type, constp, volatilep);
        !          4485:       pop_obstacks ();
        !          4486:       return type;
        !          4487:     }
        !          4488: 
        !          4489:   /* Aside from typedefs and type names (handle above),
        !          4490:      `void' at top level (not within pointer)
        !          4491:      is allowed only in public variables.
        !          4492:      We don't complain about parms either, but that is because
        !          4493:      a better error message can be made later.  */
        !          4494: 
        !          4495:   if (TYPE_MAIN_VARIANT (type) == void_type_node && decl_context != PARM
        !          4496:       && ! ((decl_context != FIELD && TREE_CODE (type) != FUNCTION_TYPE)
        !          4497:            && ((specbits & (1 << (int) RID_EXTERN))
        !          4498:                || (current_binding_level == global_binding_level
        !          4499:                    && !(specbits
        !          4500:                         & ((1 << (int) RID_STATIC) | (1 << (int) RID_REGISTER)))))))
        !          4501:     {
        !          4502:       error ("variable or field `%s' declared void",
        !          4503:             IDENTIFIER_POINTER (declarator));
        !          4504:       type = integer_type_node;
        !          4505:     }
        !          4506: 
        !          4507:   /* Now create the decl, which may be a VAR_DECL, a PARM_DECL
        !          4508:      or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE.  */
        !          4509: 
        !          4510:   {
        !          4511:     register tree decl;
        !          4512: 
        !          4513:     if (decl_context == PARM)
        !          4514:       {
        !          4515:        tree type_as_written = type;
        !          4516:        tree main_type;
        !          4517: 
        !          4518:        /* A parameter declared as an array of T is really a pointer to T.
        !          4519:           One declared as a function is really a pointer to a function.  */
        !          4520: 
        !          4521:        if (TREE_CODE (type) == ARRAY_TYPE)
        !          4522:          {
        !          4523:            /* Transfer const-ness of array into that of type pointed to.  */
        !          4524:            type = TREE_TYPE (type);
        !          4525:            if (constp || volatilep)
        !          4526:              type = c_build_type_variant (type, constp, volatilep);
        !          4527:            type = build_pointer_type (type);
        !          4528:            volatilep = constp = 0;
        !          4529:            size_varies = 0;
        !          4530:          }
        !          4531:        else if (TREE_CODE (type) == FUNCTION_TYPE)
        !          4532:          {
        !          4533:            if (pedantic && (constp || volatilep))
        !          4534:              pedwarn ("ANSI C forbids const or volatile function types");
        !          4535:            if (constp || volatilep)
        !          4536:              type = c_build_type_variant (type, constp, volatilep);
        !          4537:            type = build_pointer_type (type);
        !          4538:            volatilep = constp = 0;
        !          4539:          }
        !          4540: 
        !          4541:        decl = build_decl (PARM_DECL, declarator, type);
        !          4542:        if (size_varies)
        !          4543:          C_DECL_VARIABLE_SIZE (decl) = 1;
        !          4544: 
        !          4545:        /* Compute the type actually passed in the parmlist,
        !          4546:           for the case where there is no prototype.
        !          4547:           (For example, shorts and chars are passed as ints.)
        !          4548:           When there is a prototype, this is overridden later.  */
        !          4549: 
        !          4550:        DECL_ARG_TYPE (decl) = type;
        !          4551:        main_type = (type == error_mark_node
        !          4552:                     ? error_mark_node
        !          4553:                     : TYPE_MAIN_VARIANT (type));
        !          4554:        if (main_type == float_type_node)
        !          4555:          DECL_ARG_TYPE (decl) = double_type_node;
        !          4556:        /* Don't use TYPE_PRECISION to decide whether to promote,
        !          4557:           because we should convert short if it's the same size as int,
        !          4558:           but we should not convert long if it's the same size as int.  */
        !          4559:        else if (TREE_CODE (main_type) != ERROR_MARK
        !          4560:                 && C_PROMOTING_INTEGER_TYPE_P (main_type))
        !          4561:          {
        !          4562:            if (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)
        !          4563:                && TREE_UNSIGNED (type))
        !          4564:              DECL_ARG_TYPE (decl) = unsigned_type_node;
        !          4565:            else
        !          4566:              DECL_ARG_TYPE (decl) = integer_type_node;
        !          4567:          }
        !          4568: 
        !          4569:        DECL_ARG_TYPE_AS_WRITTEN (decl) = type_as_written;
        !          4570:       }
        !          4571:     else if (decl_context == FIELD)
        !          4572:       {
        !          4573:        /* Structure field.  It may not be a function.  */
        !          4574: 
        !          4575:        if (TREE_CODE (type) == FUNCTION_TYPE)
        !          4576:          {
        !          4577:            error ("field `%s' declared as a function",
        !          4578:                   IDENTIFIER_POINTER (declarator));
        !          4579:            type = build_pointer_type (type);
        !          4580:          }
        !          4581:        else if (TREE_CODE (type) != ERROR_MARK && TYPE_SIZE (type) == 0)
        !          4582:          {
        !          4583:            error ("field `%s' has incomplete type",
        !          4584:                   IDENTIFIER_POINTER (declarator));
        !          4585:            type = error_mark_node;
        !          4586:          }
        !          4587:        /* Move type qualifiers down to element of an array.  */
        !          4588:        if (TREE_CODE (type) == ARRAY_TYPE && (constp || volatilep))
        !          4589:          {
        !          4590:            type = build_array_type (c_build_type_variant (TREE_TYPE (type),
        !          4591:                                                           constp, volatilep),
        !          4592:                                     TYPE_DOMAIN (type));
        !          4593: #if 0 /* Leave the field const or volatile as well.  */
        !          4594:            constp = volatilep = 0;
        !          4595: #endif
        !          4596:          }
        !          4597:        decl = build_decl (FIELD_DECL, declarator, type);
        !          4598:        if (size_varies)
        !          4599:          C_DECL_VARIABLE_SIZE (decl) = 1;
        !          4600:       }
        !          4601:     else if (TREE_CODE (type) == FUNCTION_TYPE)
        !          4602:       {
        !          4603:        /* Every function declaration is "external"
        !          4604:           except for those which are inside a function body
        !          4605:           in which `auto' is used.
        !          4606:           That is a case not specified by ANSI C,
        !          4607:           and we use it for forward declarations for nested functions.  */
        !          4608:        int extern_ref = (!(specbits & (1 << (int) RID_AUTO))
        !          4609:                          || current_binding_level == global_binding_level);
        !          4610: 
        !          4611:        if (specbits & (1 << (int) RID_AUTO)
        !          4612:            && (pedantic || current_binding_level == global_binding_level))
        !          4613:          pedwarn ("invalid storage class for function `%s'",
        !          4614:                 IDENTIFIER_POINTER (declarator));
        !          4615:        if (specbits & (1 << (int) RID_REGISTER))
        !          4616:          error ("invalid storage class for function `%s'",
        !          4617:                 IDENTIFIER_POINTER (declarator));
        !          4618:        /* Function declaration not at top level.
        !          4619:           Storage classes other than `extern' are not allowed
        !          4620:           and `extern' makes no difference.  */
        !          4621:        if (current_binding_level != global_binding_level
        !          4622:            && (specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_INLINE)))
        !          4623:            && pedantic)
        !          4624:          pedwarn ("invalid storage class for function `%s'",
        !          4625:                   IDENTIFIER_POINTER (declarator));
        !          4626: 
        !          4627:        /* If this is a block level extern, it must live past the end
        !          4628:           of the function so that we can check it against other
        !          4629:           extern declarations (IDENTIFIER_LIMBO_VALUE).  */
        !          4630:        if (extern_ref && allocation_temporary_p ())
        !          4631:          end_temporary_allocation ();
        !          4632: 
        !          4633:        decl = build_decl (FUNCTION_DECL, declarator, type);
        !          4634: 
        !          4635:        if (pedantic && (constp || volatilep)
        !          4636:            && ! DECL_IN_SYSTEM_HEADER (decl))
        !          4637:          pedwarn ("ANSI C forbids const or volatile functions");
        !          4638: 
        !          4639:        if (volatilep
        !          4640:            && TREE_TYPE (TREE_TYPE (decl)) != void_type_node)
        !          4641:          warning ("volatile function returns non-void value");
        !          4642: 
        !          4643:        if (extern_ref)
        !          4644:          DECL_EXTERNAL (decl) = 1;
        !          4645:        /* Record absence of global scope for `static' or `auto'.  */
        !          4646:        TREE_PUBLIC (decl)
        !          4647:          = !(specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_AUTO)));
        !          4648: 
        !          4649: #ifdef NeXT
        !          4650: #ifdef HPPA
        !          4651:        /* record that this is a vararg/stdarg function which must 
        !          4652:           be taken special care of when it is called. */
        !          4653: 
        !          4654:        {
        !          4655:          tree last = tree_last (TYPE_ARG_TYPES (type));
        !          4656:          
        !          4657:          if (last && (TYPE_MAIN_VARIANT (TREE_VALUE (last)) 
        !          4658:                       != void_type_node))
        !          4659:            add_vararg_func(IDENTIFIER_POINTER(declarator), '1');
        !          4660:          else
        !          4661:            add_vararg_func(IDENTIFIER_POINTER(declarator), '0');
        !          4662:        }
        !          4663: #endif
        !          4664: #endif
        !          4665: 
        !          4666:        /* Record presence of `inline', if it is reasonable.  */
        !          4667:        if (inlinep)
        !          4668:          {
        !          4669:            tree last = tree_last (TYPE_ARG_TYPES (type));
        !          4670: 
        !          4671:            if (! strcmp (IDENTIFIER_POINTER (declarator), "main"))
        !          4672:              warning ("cannot inline function `main'");
        !          4673:            else if (last && (TYPE_MAIN_VARIANT (TREE_VALUE (last))
        !          4674:                              != void_type_node))
        !          4675:              warning ("inline declaration ignored for function with `...'");
        !          4676:            else
        !          4677:              /* Assume that otherwise the function can be inlined.  */
        !          4678:              DECL_INLINE (decl) = 1;
        !          4679: 
        !          4680:            if (specbits & (1 << (int) RID_EXTERN))
        !          4681:              current_extern_inline = 1;
        !          4682:          }
        !          4683:       }
        !          4684:     else
        !          4685:       {
        !          4686:        /* It's a variable.  */
        !          4687:        /* An uninitialized decl with `extern' is a reference.  */
        !          4688:        int extern_ref = !initialized && (specbits & (1 << (int) RID_EXTERN));
        !          4689: 
        !          4690:        /* Move type qualifiers down to element of an array.  */
        !          4691:        if (TREE_CODE (type) == ARRAY_TYPE && (constp || volatilep))
        !          4692:          {
        !          4693:            type = build_array_type (c_build_type_variant (TREE_TYPE (type),
        !          4694:                                                           constp, volatilep),
        !          4695:                                     TYPE_DOMAIN (type));
        !          4696: #if 0 /* Leave the variable const or volatile as well.  */
        !          4697:            constp = volatilep = 0;
        !          4698: #endif
        !          4699:          }
        !          4700: 
        !          4701:        /* If this is a block level extern, it must live past the end
        !          4702:           of the function so that we can check it against other
        !          4703:           extern declarations (IDENTIFIER_LIMBO_VALUE).  */
        !          4704:        if (extern_ref && allocation_temporary_p ())
        !          4705:          end_temporary_allocation ();
        !          4706: 
        !          4707:        decl = build_decl (VAR_DECL, declarator, type);
        !          4708:        if (size_varies)
        !          4709:          C_DECL_VARIABLE_SIZE (decl) = 1;
        !          4710: 
        !          4711:        if (inlinep)
        !          4712:          pedwarn_with_decl (decl, "variable `%s' declared `inline'");
        !          4713: 
        !          4714:        DECL_EXTERNAL (decl) = extern_ref;
        !          4715: 
        !          4716:        if (   !initialized
        !          4717:            && !extern_ref
        !          4718:            &&  TREE_CODE (type) == ARRAY_TYPE 
        !          4719:            &&  DECL_SIZE (decl) == NULL_TREE)
        !          4720:          {
        !          4721:            warning_with_decl (decl, "variable `%s' is implicitly extern");
        !          4722:            DECL_EXTERNAL (decl) = 1;
        !          4723:          }
        !          4724: 
        !          4725:        /* At top level, the presence of a `static' or `register' storage
        !          4726:           class specifier, or the absence of all storage class specifiers
        !          4727:           makes this declaration a definition (perhaps tentative).  Also,
        !          4728:           the absence of both `static' and `register' makes it public.  */
        !          4729:        if (current_binding_level == global_binding_level)
        !          4730:          {
        !          4731:            TREE_PUBLIC (decl)
        !          4732:              = !(specbits
        !          4733:                  & ((1 << (int) RID_STATIC) | (1 << (int) RID_REGISTER)));
        !          4734:            TREE_STATIC (decl) = ! DECL_EXTERNAL (decl);
        !          4735:          }
        !          4736:        /* Not at top level, only `static' makes a static definition.  */
        !          4737:        else
        !          4738:          {
        !          4739:            TREE_STATIC (decl) = (specbits & (1 << (int) RID_STATIC)) != 0;
        !          4740:            TREE_PUBLIC (decl) = DECL_EXTERNAL (decl);
        !          4741:          }
        !          4742: 
        !          4743:        if (specbits & 1 << (int) RID_ITERATOR)
        !          4744:          ITERATOR_P (decl) = 1;
        !          4745:       }
        !          4746: 
        !          4747:     /* Record `register' declaration for warnings on &
        !          4748:        and in case doing stupid register allocation.  */
        !          4749: 
        !          4750:     if (specbits & (1 << (int) RID_REGISTER))
        !          4751:       DECL_REGISTER (decl) = 1;
        !          4752: 
        !          4753:     /* Record constancy and volatility.  */
        !          4754: 
        !          4755:     if (constp)
        !          4756:       TREE_READONLY (decl) = 1;
        !          4757:     if (volatilep)
        !          4758:       {
        !          4759:        TREE_SIDE_EFFECTS (decl) = 1;
        !          4760:        TREE_THIS_VOLATILE (decl) = 1;
        !          4761:       }
        !          4762:     /* If a type has volatile components, it should be stored in memory.
        !          4763:        Otherwise, the fact that those components are volatile
        !          4764:        will be ignored, and would even crash the compiler.  */
        !          4765:     if (C_TYPE_FIELDS_VOLATILE (TREE_TYPE (decl)))
        !          4766:       mark_addressable (decl);
        !          4767: 
        !          4768:     pop_obstacks ();
        !          4769: 
        !          4770:     return decl;
        !          4771:   }
        !          4772: }
        !          4773: 
        !          4774: /* Decode the parameter-list info for a function type or function definition.
        !          4775:    The argument is the value returned by `get_parm_info' (or made in parse.y
        !          4776:    if there is an identifier list instead of a parameter decl list).
        !          4777:    These two functions are separate because when a function returns
        !          4778:    or receives functions then each is called multiple times but the order
        !          4779:    of calls is different.  The last call to `grokparms' is always the one
        !          4780:    that contains the formal parameter names of a function definition.
        !          4781: 
        !          4782:    Store in `last_function_parms' a chain of the decls of parms.
        !          4783:    Also store in `last_function_parm_tags' a chain of the struct, union,
        !          4784:    and enum tags declared among the parms.
        !          4785: 
        !          4786:    Return a list of arg types to use in the FUNCTION_TYPE for this function.
        !          4787: 
        !          4788:    FUNCDEF_FLAG is nonzero for a function definition, 0 for
        !          4789:    a mere declaration.  A nonempty identifier-list gets an error message
        !          4790:    when FUNCDEF_FLAG is zero.  */
        !          4791: 
        !          4792: static tree
        !          4793: grokparms (parms_info, funcdef_flag)
        !          4794:      tree parms_info;
        !          4795:      int funcdef_flag;
        !          4796: {
        !          4797:   tree first_parm = TREE_CHAIN (parms_info);
        !          4798: 
        !          4799:   last_function_parms = TREE_PURPOSE (parms_info);
        !          4800:   last_function_parm_tags = TREE_VALUE (parms_info);
        !          4801: 
        !          4802:   if (warn_strict_prototypes && first_parm == 0 && !funcdef_flag
        !          4803:       && !in_system_header)
        !          4804:     warning ("function declaration isn't a prototype");
        !          4805: 
        !          4806:   if (first_parm != 0
        !          4807:       && TREE_CODE (TREE_VALUE (first_parm)) == IDENTIFIER_NODE)
        !          4808:     {
        !          4809:       if (! funcdef_flag)
        !          4810:        pedwarn ("parameter names (without types) in function declaration");
        !          4811: 
        !          4812:       last_function_parms = first_parm;
        !          4813:       return 0;
        !          4814:     }
        !          4815:   else
        !          4816:     {
        !          4817:       tree parm;
        !          4818:       tree typelt;
        !          4819:       /* We no longer test FUNCDEF_FLAG.
        !          4820:         If the arg types are incomplete in a declaration,
        !          4821:         they must include undefined tags.
        !          4822:         These tags can never be defined in the scope of the declaration,
        !          4823:         so the types can never be completed,
        !          4824:         and no call can be compiled successfully.  */
        !          4825: #if 0
        !          4826:       /* In a fcn definition, arg types must be complete.  */
        !          4827:       if (funcdef_flag)
        !          4828: #endif
        !          4829:        for (parm = last_function_parms, typelt = first_parm;
        !          4830:             parm;
        !          4831:             parm = TREE_CHAIN (parm))
        !          4832:          /* Skip over any enumeration constants declared here.  */
        !          4833:          if (TREE_CODE (parm) == PARM_DECL)
        !          4834:            {
        !          4835:              /* Barf if the parameter itself has an incomplete type.  */
        !          4836:              tree type = TREE_VALUE (typelt);
        !          4837:              if (TYPE_SIZE (type) == 0)
        !          4838:                {
        !          4839:                  if (funcdef_flag && DECL_NAME (parm) != 0)
        !          4840:                    error ("parameter `%s' has incomplete type",
        !          4841:                           IDENTIFIER_POINTER (DECL_NAME (parm)));
        !          4842:                  else
        !          4843:                    warning ("parameter has incomplete type");
        !          4844:                  if (funcdef_flag)
        !          4845:                    {
        !          4846:                      TREE_VALUE (typelt) = error_mark_node;
        !          4847:                      TREE_TYPE (parm) = error_mark_node;
        !          4848:                    }
        !          4849:                }
        !          4850: #if 0  /* This has been replaced by parm_tags_warning
        !          4851:          which uses a more accurate criterion for what to warn about.  */
        !          4852:              else
        !          4853:                {
        !          4854:                  /* Now warn if is a pointer to an incomplete type.  */
        !          4855:                  while (TREE_CODE (type) == POINTER_TYPE
        !          4856:                         || TREE_CODE (type) == REFERENCE_TYPE)
        !          4857:                    type = TREE_TYPE (type);
        !          4858:                  type = TYPE_MAIN_VARIANT (type);
        !          4859:                  if (TYPE_SIZE (type) == 0)
        !          4860:                    {
        !          4861:                      if (DECL_NAME (parm) != 0)
        !          4862:                        warning ("parameter `%s' points to incomplete type",
        !          4863:                                 IDENTIFIER_POINTER (DECL_NAME (parm)));
        !          4864:                      else
        !          4865:                        warning ("parameter points to incomplete type");
        !          4866:                    }
        !          4867:                }
        !          4868: #endif
        !          4869:              typelt = TREE_CHAIN (typelt);
        !          4870:            }
        !          4871: 
        !          4872:       /* Allocate the list of types the way we allocate a type.  */
        !          4873:       if (first_parm && ! TREE_PERMANENT (first_parm))
        !          4874:        {
        !          4875:          /* Construct a copy of the list of types
        !          4876:             on the saveable obstack.  */
        !          4877:          tree result = NULL;
        !          4878:          for (typelt = first_parm; typelt; typelt = TREE_CHAIN (typelt))
        !          4879:            result = saveable_tree_cons (NULL_TREE, TREE_VALUE (typelt),
        !          4880:                                         result);
        !          4881:          return nreverse (result);
        !          4882:        }
        !          4883:       else
        !          4884:        /* The list we have is permanent already.  */
        !          4885:        return first_parm;
        !          4886:     }
        !          4887: }
        !          4888: 
        !          4889: 
        !          4890: /* Return a tree_list node with info on a parameter list just parsed.
        !          4891:    The TREE_PURPOSE is a chain of decls of those parms.
        !          4892:    The TREE_VALUE is a list of structure, union and enum tags defined.
        !          4893:    The TREE_CHAIN is a list of argument types to go in the FUNCTION_TYPE.
        !          4894:    This tree_list node is later fed to `grokparms'.
        !          4895: 
        !          4896:    VOID_AT_END nonzero means append `void' to the end of the type-list.
        !          4897:    Zero means the parmlist ended with an ellipsis so don't append `void'.  */
        !          4898: 
        !          4899: tree
        !          4900: get_parm_info (void_at_end)
        !          4901:      int void_at_end;
        !          4902: {
        !          4903:   register tree decl, t;
        !          4904:   register tree types = 0;
        !          4905:   int erred = 0;
        !          4906:   tree tags = gettags ();
        !          4907:   tree parms = getdecls ();
        !          4908:   tree new_parms = 0;
        !          4909:   tree order = current_binding_level->parm_order;
        !          4910: 
        !          4911:   /* Just `void' (and no ellipsis) is special.  There are really no parms.  */
        !          4912:   if (void_at_end && parms != 0
        !          4913:       && TREE_CHAIN (parms) == 0
        !          4914:       && TYPE_MAIN_VARIANT (TREE_TYPE (parms)) == void_type_node
        !          4915:       && DECL_NAME (parms) == 0)
        !          4916:     {
        !          4917:       parms = NULL_TREE;
        !          4918:       storedecls (NULL_TREE);
        !          4919:       return saveable_tree_cons (NULL_TREE, NULL_TREE,
        !          4920:                                 saveable_tree_cons (NULL_TREE, void_type_node, NULL_TREE));
        !          4921:     }
        !          4922: 
        !          4923:   /* Extract enumerator values and other non-parms declared with the parms.
        !          4924:      Likewise any forward parm decls that didn't have real parm decls.  */
        !          4925:   for (decl = parms; decl; )
        !          4926:     {
        !          4927:       tree next = TREE_CHAIN (decl);
        !          4928: 
        !          4929:       if (TREE_CODE (decl) != PARM_DECL)
        !          4930:        {
        !          4931:          TREE_CHAIN (decl) = new_parms;
        !          4932:          new_parms = decl;
        !          4933:        }
        !          4934:       else if (TREE_ASM_WRITTEN (decl))
        !          4935:        {
        !          4936:          error_with_decl (decl, "parameter `%s' has just a forward declaration");
        !          4937:          TREE_CHAIN (decl) = new_parms;
        !          4938:          new_parms = decl;
        !          4939:        }
        !          4940:       decl = next;
        !          4941:     }
        !          4942: 
        !          4943:   /* Put the parm decls back in the order they were in in the parm list.  */
        !          4944:   for (t = order; t; t = TREE_CHAIN (t))
        !          4945:     {
        !          4946:       if (TREE_CHAIN (t))
        !          4947:        TREE_CHAIN (TREE_VALUE (t)) = TREE_VALUE (TREE_CHAIN (t));
        !          4948:       else
        !          4949:        TREE_CHAIN (TREE_VALUE (t)) = 0;
        !          4950:     }
        !          4951: 
        !          4952:   new_parms = chainon (order ? nreverse (TREE_VALUE (order)) : 0,
        !          4953:                       new_parms);
        !          4954: 
        !          4955:   /* Store the parmlist in the binding level since the old one
        !          4956:      is no longer a valid list.  (We have changed the chain pointers.)  */
        !          4957:   storedecls (new_parms);
        !          4958: 
        !          4959:   for (decl = new_parms; decl; decl = TREE_CHAIN (decl))
        !          4960:     /* There may also be declarations for enumerators if an enumeration
        !          4961:        type is declared among the parms.  Ignore them here.  */
        !          4962:     if (TREE_CODE (decl) == PARM_DECL)
        !          4963:       {
        !          4964:        /* Since there is a prototype,
        !          4965:           args are passed in their declared types.  */
        !          4966:        tree type = TREE_TYPE (decl);
        !          4967:        DECL_ARG_TYPE (decl) = type;
        !          4968: #ifdef PROMOTE_PROTOTYPES
        !          4969:        if ((TREE_CODE (type) == INTEGER_TYPE
        !          4970:             || TREE_CODE (type) == ENUMERAL_TYPE)
        !          4971:            && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
        !          4972:          DECL_ARG_TYPE (decl) = integer_type_node;
        !          4973: #endif
        !          4974: 
        !          4975:        types = saveable_tree_cons (NULL_TREE, TREE_TYPE (decl), types);
        !          4976:        if (TYPE_MAIN_VARIANT (TREE_VALUE (types)) == void_type_node && ! erred
        !          4977:            && DECL_NAME (decl) == 0)
        !          4978:          {
        !          4979:            error ("`void' in parameter list must be the entire list");
        !          4980:            erred = 1;
        !          4981:          }
        !          4982:       }
        !          4983: 
        !          4984:   if (void_at_end)
        !          4985:     return saveable_tree_cons (new_parms, tags,
        !          4986:                               nreverse (saveable_tree_cons (NULL_TREE, void_type_node, types)));
        !          4987: 
        !          4988:   return saveable_tree_cons (new_parms, tags, nreverse (types));
        !          4989: }
        !          4990: 
        !          4991: /* At end of parameter list, warn about any struct, union or enum tags
        !          4992:    defined within.  Do so because these types cannot ever become complete.  */
        !          4993: 
        !          4994: void
        !          4995: parmlist_tags_warning ()
        !          4996: {
        !          4997:   tree elt;
        !          4998:   static int already;
        !          4999: 
        !          5000:   for (elt = current_binding_level->tags; elt; elt = TREE_CHAIN (elt))
        !          5001:     {
        !          5002:       enum tree_code code = TREE_CODE (TREE_VALUE (elt));
        !          5003:       /* An anonymous union parm type is meaningful as a GNU extension.
        !          5004:         So don't warn for that.  */
        !          5005:       if (code == UNION_TYPE && !pedantic)
        !          5006:        continue;
        !          5007:       if (TREE_PURPOSE (elt) != 0)
        !          5008:        warning ("`%s %s' declared inside parameter list",
        !          5009:                 (code == RECORD_TYPE ? "struct"
        !          5010:                  : code == UNION_TYPE ? "union"
        !          5011:                  : "enum"),
        !          5012:                 IDENTIFIER_POINTER (TREE_PURPOSE (elt)));
        !          5013:       else
        !          5014:        warning ("anonymous %s declared inside parameter list",
        !          5015:                 (code == RECORD_TYPE ? "struct"
        !          5016:                  : code == UNION_TYPE ? "union"
        !          5017:                  : "enum"));
        !          5018: 
        !          5019:       if (! already)
        !          5020:        {
        !          5021:          warning ("its scope is only this definition or declaration,");
        !          5022:          warning ("which is probably not what you want.");
        !          5023:          already = 1;
        !          5024:        }
        !          5025:     }
        !          5026: }
        !          5027: 
        !          5028: /* Get the struct, enum or union (CODE says which) with tag NAME.
        !          5029:    Define the tag as a forward-reference if it is not defined.  */
        !          5030: 
        !          5031: tree
        !          5032: xref_tag (code, name)
        !          5033:      enum tree_code code;
        !          5034:      tree name;
        !          5035: {
        !          5036:   int temporary = allocation_temporary_p ();
        !          5037: 
        !          5038:   /* If a cross reference is requested, look up the type
        !          5039:      already defined for this tag and return it.  */
        !          5040: 
        !          5041:   register tree ref = lookup_tag (code, name, current_binding_level, 0);
        !          5042:   /* Even if this is the wrong type of tag, return what we found.
        !          5043:      There will be an error message anyway, from pending_xref_error.
        !          5044:      If we create an empty xref just for an invalid use of the type,
        !          5045:      the main result is to create lots of superfluous error messages.  */
        !          5046:   if (ref)
        !          5047:     return ref;
        !          5048: 
        !          5049:   push_obstacks_nochange ();
        !          5050: 
        !          5051:   if (current_binding_level == global_binding_level && temporary)
        !          5052:     end_temporary_allocation ();
        !          5053: 
        !          5054:   /* If no such tag is yet defined, create a forward-reference node
        !          5055:      and record it as the "definition".
        !          5056:      When a real declaration of this type is found,
        !          5057:      the forward-reference will be altered into a real type.  */
        !          5058: 
        !          5059:   ref = make_node (code);
        !          5060:   if (code == ENUMERAL_TYPE)
        !          5061:     {
        !          5062:       /* (In ANSI, Enums can be referred to only if already defined.)  */
        !          5063:       if (pedantic)
        !          5064:        pedwarn ("ANSI C forbids forward references to `enum' types");
        !          5065:       /* Give the type a default layout like unsigned int
        !          5066:         to avoid crashing if it does not get defined.  */
        !          5067:       TYPE_MODE (ref) = TYPE_MODE (unsigned_type_node);
        !          5068:       TYPE_ALIGN (ref) = TYPE_ALIGN (unsigned_type_node);
        !          5069:       TREE_UNSIGNED (ref) = 1;
        !          5070:       TYPE_PRECISION (ref) = TYPE_PRECISION (unsigned_type_node);
        !          5071:       TYPE_MIN_VALUE (ref) = TYPE_MIN_VALUE (unsigned_type_node);
        !          5072:       TYPE_MAX_VALUE (ref) = TYPE_MAX_VALUE (unsigned_type_node);
        !          5073:     }
        !          5074: 
        !          5075:   pushtag (name, ref);
        !          5076: 
        !          5077:   pop_obstacks ();
        !          5078: 
        !          5079:   return ref;
        !          5080: }
        !          5081: 
        !          5082: /* Make sure that the tag NAME is defined *in the current binding level*
        !          5083:    at least as a forward reference.
        !          5084:    CODE says which kind of tag NAME ought to be.
        !          5085: 
        !          5086:    We also do a push_obstacks_nochange
        !          5087:    whose matching pop is in finish_struct.  */
        !          5088: 
        !          5089: tree
        !          5090: start_struct (code, name)
        !          5091:      enum tree_code code;
        !          5092:      tree name;
        !          5093: {
        !          5094:   /* If there is already a tag defined at this binding level
        !          5095:      (as a forward reference), just return it.  */
        !          5096: 
        !          5097:   register tree ref = 0;
        !          5098: 
        !          5099:   push_obstacks_nochange ();
        !          5100:   if (current_binding_level == global_binding_level)
        !          5101:     end_temporary_allocation ();
        !          5102: 
        !          5103:   if (name != 0)
        !          5104:     ref = lookup_tag (code, name, current_binding_level, 1);
        !          5105:   if (ref && TREE_CODE (ref) == code)
        !          5106:     {
        !          5107:       C_TYPE_BEING_DEFINED (ref) = 1;
        !          5108:       if (TYPE_FIELDS (ref))
        !          5109:        error ((code == UNION_TYPE ? "redefinition of `union %s'"
        !          5110:                : "redefinition of `struct %s'"),
        !          5111:               IDENTIFIER_POINTER (name));
        !          5112: 
        !          5113:       return ref;
        !          5114:     }
        !          5115: 
        !          5116:   /* Otherwise create a forward-reference just so the tag is in scope.  */
        !          5117: 
        !          5118:   ref = make_node (code);
        !          5119:   pushtag (name, ref);
        !          5120:   C_TYPE_BEING_DEFINED (ref) = 1;
        !          5121:   return ref;
        !          5122: }
        !          5123: 
        !          5124: /* Process the specs, declarator (NULL if omitted) and width (NULL if omitted)
        !          5125:    of a structure component, returning a FIELD_DECL node.
        !          5126:    WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node.
        !          5127: 
        !          5128:    This is done during the parsing of the struct declaration.
        !          5129:    The FIELD_DECL nodes are chained together and the lot of them
        !          5130:    are ultimately passed to `build_struct' to make the RECORD_TYPE node.  */
        !          5131: 
        !          5132: tree
        !          5133: grokfield (filename, line, declarator, declspecs, width)
        !          5134:      char *filename;
        !          5135:      int line;
        !          5136:      tree declarator, declspecs, width;
        !          5137: {
        !          5138:   tree value;
        !          5139: 
        !          5140:   /* The corresponding pop_obstacks is in finish_decl.  */
        !          5141:   push_obstacks_nochange ();
        !          5142: 
        !          5143:   value = grokdeclarator (declarator, declspecs, width ? BITFIELD : FIELD, 0);
        !          5144: 
        !          5145:   finish_decl (value, NULL_TREE, NULL_TREE);
        !          5146:   DECL_INITIAL (value) = width;
        !          5147: 
        !          5148:   maybe_objc_check_decl (value);
        !          5149:   return value;
        !          5150: }
        !          5151: 
        !          5152: /* Function to help qsort sort FIELD_DECLs by name order.  */
        !          5153: 
        !          5154: static int
        !          5155: field_decl_cmp (x, y)
        !          5156:      tree *x, *y;
        !          5157: {
        !          5158:   return (long)DECL_NAME (*x) - (long)DECL_NAME (*y);
        !          5159: }
        !          5160: 
        !          5161: /* Fill in the fields of a RECORD_TYPE or UNION_TYPE node, T.
        !          5162:    FIELDLIST is a chain of FIELD_DECL nodes for the fields.
        !          5163: 
        !          5164:    We also do a pop_obstacks to match the push in start_struct.  */
        !          5165: 
        !          5166: tree
        !          5167: finish_struct (t, fieldlist)
        !          5168:      register tree t, fieldlist;
        !          5169: {
        !          5170:   register tree x;
        !          5171:   int old_momentary;
        !          5172:   int toplevel = global_binding_level == current_binding_level;
        !          5173: 
        !          5174:   /* If this type was previously laid out as a forward reference,
        !          5175:      make sure we lay it out again.  */
        !          5176: 
        !          5177:   TYPE_SIZE (t) = 0;
        !          5178: 
        !          5179:   /* Nameless union parm types are useful as GCC extension.  */
        !          5180:   if (! (TREE_CODE (t) == UNION_TYPE && TYPE_NAME (t) == 0) && !pedantic)
        !          5181:     /* Otherwise, warn about any struct or union def. in parmlist.  */
        !          5182:     if (in_parm_level_p ())
        !          5183:       {
        !          5184:        if (pedantic)
        !          5185:          pedwarn ((TREE_CODE (t) == UNION_TYPE ? "union defined inside parms"
        !          5186:                    : "structure defined inside parms"));
        !          5187:        else if (! flag_traditional)
        !          5188:          warning ((TREE_CODE (t) == UNION_TYPE ? "union defined inside parms"
        !          5189:                    : "structure defined inside parms"));
        !          5190:       }
        !          5191: 
        !          5192:   old_momentary = suspend_momentary ();
        !          5193: 
        !          5194:   if (fieldlist == 0 && pedantic)
        !          5195:     pedwarn ((TREE_CODE (t) == UNION_TYPE ? "union has no members"
        !          5196:              : "structure has no members"));
        !          5197: 
        !          5198:   /* Install struct as DECL_CONTEXT of each field decl.
        !          5199:      Also process specified field sizes.
        !          5200:      Set DECL_FIELD_SIZE to the specified size, or 0 if none specified.
        !          5201:      The specified size is found in the DECL_INITIAL.
        !          5202:      Store 0 there, except for ": 0" fields (so we can find them
        !          5203:      and delete them, below).  */
        !          5204: 
        !          5205:   for (x = fieldlist; x; x = TREE_CHAIN (x))
        !          5206:     {
        !          5207:       DECL_CONTEXT (x) = t;
        !          5208:       DECL_FIELD_SIZE (x) = 0;
        !          5209: 
        !          5210:       /* If any field is const, the structure type is pseudo-const.  */
        !          5211:       if (TREE_READONLY (x))
        !          5212:        C_TYPE_FIELDS_READONLY (t) = 1;
        !          5213:       else
        !          5214:        {
        !          5215:          /* A field that is pseudo-const makes the structure likewise.  */
        !          5216:          tree t1 = TREE_TYPE (x);
        !          5217:          while (TREE_CODE (t1) == ARRAY_TYPE)
        !          5218:            t1 = TREE_TYPE (t1);
        !          5219:          if ((TREE_CODE (t1) == RECORD_TYPE || TREE_CODE (t1) == UNION_TYPE)
        !          5220:              && C_TYPE_FIELDS_READONLY (t1))
        !          5221:            C_TYPE_FIELDS_READONLY (t) = 1;
        !          5222:        }
        !          5223: 
        !          5224:       /* Any field that is volatile means variables of this type must be
        !          5225:         treated in some ways as volatile.  */
        !          5226:       if (TREE_THIS_VOLATILE (x))
        !          5227:        C_TYPE_FIELDS_VOLATILE (t) = 1;
        !          5228: 
        !          5229:       /* Any field of nominal variable size implies structure is too.  */
        !          5230:       if (C_DECL_VARIABLE_SIZE (x))
        !          5231:        C_TYPE_VARIABLE_SIZE (t) = 1;
        !          5232: 
        !          5233:       /* Detect invalid nested redefinition.  */
        !          5234:       if (TREE_TYPE (x) == t)
        !          5235:        error ("nested redefinition of `%s'",
        !          5236:               IDENTIFIER_POINTER (TYPE_NAME (t)));
        !          5237: 
        !          5238:       /* Detect invalid bit-field size.  */
        !          5239:       if (DECL_INITIAL (x))
        !          5240:        STRIP_NOPS (DECL_INITIAL (x));
        !          5241:       if (DECL_INITIAL (x))
        !          5242:        {
        !          5243:          if (TREE_CODE (DECL_INITIAL (x)) == INTEGER_CST)
        !          5244:            constant_expression_warning (DECL_INITIAL (x));
        !          5245:          else
        !          5246:            {
        !          5247:              error_with_decl (x, "bit-field `%s' width not an integer constant");
        !          5248:              DECL_INITIAL (x) = NULL;
        !          5249:            }
        !          5250:        }
        !          5251: 
        !          5252:       /* Detect invalid bit-field type.  */
        !          5253:       if (DECL_INITIAL (x)
        !          5254:          && TREE_CODE (TREE_TYPE (x)) != INTEGER_TYPE
        !          5255:          && TREE_CODE (TREE_TYPE (x)) != ENUMERAL_TYPE)
        !          5256:        {
        !          5257:          error_with_decl (x, "bit-field `%s' has invalid type");
        !          5258:          DECL_INITIAL (x) = NULL;
        !          5259:        }
        !          5260:       if (DECL_INITIAL (x) && pedantic
        !          5261:          && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != integer_type_node
        !          5262:          && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != unsigned_type_node
        !          5263:          /* Accept an enum that's equivalent to int or unsigned int.  */
        !          5264:          && !(TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE
        !          5265:               && (TYPE_PRECISION (TREE_TYPE (x))
        !          5266:                   == TYPE_PRECISION (integer_type_node))))
        !          5267:        pedwarn_with_decl (x, "bit-field `%s' type invalid in ANSI C");
        !          5268: 
        !          5269:       /* Detect and ignore out of range field width.  */
        !          5270:       if (DECL_INITIAL (x))
        !          5271:        {
        !          5272:          unsigned HOST_WIDE_INT width = TREE_INT_CST_LOW (DECL_INITIAL (x));
        !          5273: 
        !          5274:          if (tree_int_cst_lt (DECL_INITIAL (x), integer_zero_node))
        !          5275:            {
        !          5276:              DECL_INITIAL (x) = NULL;
        !          5277:              error_with_decl (x, "negative width in bit-field `%s'");
        !          5278:            }
        !          5279:          else if (TREE_INT_CST_HIGH (DECL_INITIAL (x)) != 0
        !          5280:                   || width > TYPE_PRECISION (TREE_TYPE (x)))
        !          5281:            {
        !          5282:              DECL_INITIAL (x) = NULL;
        !          5283:              pedwarn_with_decl (x, "width of `%s' exceeds its type");
        !          5284:            }
        !          5285:          else if (width == 0 && DECL_NAME (x) != 0)
        !          5286:            {
        !          5287:              error_with_decl (x, "zero width for bit-field `%s'");
        !          5288:              DECL_INITIAL (x) = NULL;
        !          5289:            }
        !          5290:        }
        !          5291: 
        !          5292:       /* Process valid field width.  */
        !          5293:       if (DECL_INITIAL (x))
        !          5294:        {
        !          5295:          register int width = TREE_INT_CST_LOW (DECL_INITIAL (x));
        !          5296: 
        !          5297:          DECL_FIELD_SIZE (x) = width;
        !          5298:          DECL_BIT_FIELD (x) = 1;
        !          5299:          DECL_INITIAL (x) = NULL;
        !          5300: 
        !          5301:          if (width == 0)
        !          5302:            {
        !          5303:              /* field size 0 => force desired amount of alignment.  */
        !          5304: #ifdef EMPTY_FIELD_BOUNDARY
        !          5305:              DECL_ALIGN (x) = MAX (DECL_ALIGN (x), EMPTY_FIELD_BOUNDARY);
        !          5306: #endif
        !          5307: #ifdef PCC_BITFIELD_TYPE_MATTERS
        !          5308:              DECL_ALIGN (x) = MAX (DECL_ALIGN (x),
        !          5309:                                    TYPE_ALIGN (TREE_TYPE (x)));
        !          5310: #endif
        !          5311:            }
        !          5312:        }
        !          5313:       else
        !          5314:        {
        !          5315:          int min_align = (DECL_PACKED (x) ? BITS_PER_UNIT
        !          5316:                           : TYPE_ALIGN (TREE_TYPE (x)));
        !          5317:          /* Non-bit-fields are aligned for their type, except packed
        !          5318:             fields which require only BITS_PER_UNIT alignment.  */
        !          5319:          DECL_ALIGN (x) = MAX (DECL_ALIGN (x), min_align);
        !          5320:        }
        !          5321:     }
        !          5322: 
        !          5323:   /* Now DECL_INITIAL is null on all members.  */
        !          5324: 
        !          5325:   /* Delete all duplicate fields from the fieldlist */
        !          5326:   for (x = fieldlist; x && TREE_CHAIN (x);)
        !          5327:     /* Anonymous fields aren't duplicates.  */
        !          5328:     if (DECL_NAME (TREE_CHAIN (x)) == 0)
        !          5329:       x = TREE_CHAIN (x);
        !          5330:     else
        !          5331:       {
        !          5332:        register tree y = fieldlist;
        !          5333:          
        !          5334:        while (1)
        !          5335:          {
        !          5336:            if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x)))
        !          5337:              break;
        !          5338:            if (y == x)
        !          5339:              break;
        !          5340:            y = TREE_CHAIN (y);
        !          5341:          }
        !          5342:        if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x)))
        !          5343:          {
        !          5344:            error_with_decl (TREE_CHAIN (x), "duplicate member `%s'");
        !          5345:            TREE_CHAIN (x) = TREE_CHAIN (TREE_CHAIN (x));
        !          5346:          }
        !          5347:        else x = TREE_CHAIN (x);
        !          5348:       }
        !          5349: 
        !          5350:   /* Now we have the nearly final fieldlist.  Record it,
        !          5351:      then lay out the structure or union (including the fields).  */
        !          5352: 
        !          5353:   TYPE_FIELDS (t) = fieldlist;
        !          5354: 
        !          5355:   layout_type (t);
        !          5356: 
        !          5357:   /* Delete all zero-width bit-fields from the front of the fieldlist */
        !          5358:   while (fieldlist
        !          5359:         && DECL_INITIAL (fieldlist))
        !          5360:     fieldlist = TREE_CHAIN (fieldlist);
        !          5361:   /* Delete all such members from the rest of the fieldlist */
        !          5362:   for (x = fieldlist; x;)
        !          5363:     {
        !          5364:       if (TREE_CHAIN (x) && DECL_INITIAL (TREE_CHAIN (x)))
        !          5365:        TREE_CHAIN (x) = TREE_CHAIN (TREE_CHAIN (x));
        !          5366:       else x = TREE_CHAIN (x);
        !          5367:     }
        !          5368: 
        !          5369:   /*  Now we have the truly final field list.
        !          5370:       Store it in this type and in the variants.  */
        !          5371: 
        !          5372:   TYPE_FIELDS (t) = fieldlist;
        !          5373: 
        !          5374:   /* If there are lots of fields, sort so we can look through them fast.
        !          5375:      We arbitrarily consider 16 or more elts to be "a lot".  */
        !          5376:   {
        !          5377:     int len = 0;
        !          5378: 
        !          5379:     for (x = fieldlist; x; x = TREE_CHAIN (x))
        !          5380:       {
        !          5381:        if (len > 15)
        !          5382:          break;
        !          5383:        len += 1;
        !          5384:       }
        !          5385:     if (len > 15)
        !          5386:       {
        !          5387:        tree *field_array;
        !          5388:        char *space;
        !          5389: 
        !          5390:        len += list_length (x);
        !          5391:        /* Use the same allocation policy here that make_node uses, to
        !          5392:           ensure that this lives as long as the rest of the struct decl.
        !          5393:           All decls in an inline function need to be saved.  */
        !          5394:        if (allocation_temporary_p ())
        !          5395:          space = savealloc (sizeof (struct lang_type) + len * sizeof (tree));
        !          5396:        else
        !          5397:          space = oballoc (sizeof (struct lang_type) + len * sizeof (tree));
        !          5398: 
        !          5399:        TYPE_LANG_SPECIFIC (t) = (struct lang_type *) space;
        !          5400:        TYPE_LANG_SPECIFIC (t)->len = len;
        !          5401: 
        !          5402:        field_array = &TYPE_LANG_SPECIFIC (t)->elts[0];
        !          5403:        len = 0;
        !          5404:        for (x = fieldlist; x; x = TREE_CHAIN (x))
        !          5405:          field_array[len++] = x;
        !          5406: 
        !          5407:        qsort (field_array, len, sizeof (tree), field_decl_cmp);
        !          5408:       }
        !          5409:   }
        !          5410: 
        !          5411:   for (x = TYPE_MAIN_VARIANT (t); x; x = TYPE_NEXT_VARIANT (x))
        !          5412:     {
        !          5413:       TYPE_FIELDS (x) = TYPE_FIELDS (t);
        !          5414:       TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (t);
        !          5415:       TYPE_ALIGN (x) = TYPE_ALIGN (t);
        !          5416:     }
        !          5417: 
        !          5418:   /* Promote each bit-field's type to int if it is narrower than that.  */
        !          5419:   for (x = fieldlist; x; x = TREE_CHAIN (x))
        !          5420:     if (DECL_BIT_FIELD (x)
        !          5421:        && (C_PROMOTING_INTEGER_TYPE_P (TREE_TYPE (x))
        !          5422:            || DECL_FIELD_SIZE (x) < TYPE_PRECISION (integer_type_node)))
        !          5423:       {
        !          5424:        tree type = TREE_TYPE (x);
        !          5425: 
        !          5426:        /* Preserve unsignedness if traditional
        !          5427:           or if not really getting any wider.  */
        !          5428:        if (TREE_UNSIGNED (type)
        !          5429:            && (flag_traditional
        !          5430:                ||
        !          5431:                (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)
        !          5432:                 &&
        !          5433:                 DECL_FIELD_SIZE (x) == TYPE_PRECISION (integer_type_node))))
        !          5434:          TREE_TYPE (x) = unsigned_type_node;
        !          5435:        else
        !          5436:          TREE_TYPE (x) = integer_type_node;
        !          5437:       }
        !          5438: 
        !          5439:   /* If this structure or union completes the type of any previous
        !          5440:      variable declaration, lay it out and output its rtl.  */
        !          5441: 
        !          5442:   if (current_binding_level->n_incomplete != 0)
        !          5443:     {
        !          5444:       tree decl;
        !          5445:       for (decl = current_binding_level->names; decl; decl = TREE_CHAIN (decl))
        !          5446:        {
        !          5447:          if (TREE_TYPE (decl) == t
        !          5448:              && TREE_CODE (decl) != TYPE_DECL)
        !          5449:            {
        !          5450:              layout_decl (decl, 0);
        !          5451:              /* This is a no-op in c-lang.c or something real in objc-actions.c.  */
        !          5452:              maybe_objc_check_decl (decl);
        !          5453:              rest_of_decl_compilation (decl, NULL_PTR, toplevel, 0);
        !          5454:              if (! toplevel)
        !          5455:                expand_decl (decl);
        !          5456:              --current_binding_level->n_incomplete;
        !          5457:            }
        !          5458:          else if (TYPE_SIZE (TREE_TYPE (decl)) == 0
        !          5459:                   && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
        !          5460:            {
        !          5461:              tree element = TREE_TYPE (decl);
        !          5462:              while (TREE_CODE (element) == ARRAY_TYPE)
        !          5463:                element = TREE_TYPE (element);
        !          5464:              if (element == t)
        !          5465:                layout_array_type (TREE_TYPE (decl));
        !          5466:            }
        !          5467:        }
        !          5468:     }
        !          5469: 
        !          5470:   resume_momentary (old_momentary);
        !          5471: 
        !          5472:   /* Finish debugging output for this type.  */
        !          5473:   rest_of_type_compilation (t, toplevel);
        !          5474: 
        !          5475:   /* The matching push is in start_struct.  */
        !          5476:   pop_obstacks ();
        !          5477: 
        !          5478:   return t;
        !          5479: }
        !          5480: 
        !          5481: /* Lay out the type T, and its element type, and so on.  */
        !          5482: 
        !          5483: static void
        !          5484: layout_array_type (t)
        !          5485:      tree t;
        !          5486: {
        !          5487:   if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
        !          5488:     layout_array_type (TREE_TYPE (t));
        !          5489:   layout_type (t);
        !          5490: }
        !          5491: 
        !          5492: /* Begin compiling the definition of an enumeration type.
        !          5493:    NAME is its name (or null if anonymous).
        !          5494:    Returns the type object, as yet incomplete.
        !          5495:    Also records info about it so that build_enumerator
        !          5496:    may be used to declare the individual values as they are read.  */
        !          5497: 
        !          5498: tree
        !          5499: start_enum (name)
        !          5500:      tree name;
        !          5501: {
        !          5502:   register tree enumtype = 0;
        !          5503: 
        !          5504:   /* If this is the real definition for a previous forward reference,
        !          5505:      fill in the contents in the same object that used to be the
        !          5506:      forward reference.  */
        !          5507: 
        !          5508:   if (name != 0)
        !          5509:     enumtype = lookup_tag (ENUMERAL_TYPE, name, current_binding_level, 1);
        !          5510: 
        !          5511:   /* The corresponding pop_obstacks is in finish_enum.  */
        !          5512:   push_obstacks_nochange ();
        !          5513:   /* If these symbols and types are global, make them permanent.  */
        !          5514:   if (current_binding_level == global_binding_level)
        !          5515:     end_temporary_allocation ();
        !          5516: 
        !          5517:   if (enumtype == 0 || TREE_CODE (enumtype) != ENUMERAL_TYPE)
        !          5518:     {
        !          5519:       enumtype = make_node (ENUMERAL_TYPE);
        !          5520:       pushtag (name, enumtype);
        !          5521:     }
        !          5522: 
        !          5523:   C_TYPE_BEING_DEFINED (enumtype) = 1;
        !          5524: 
        !          5525:   if (TYPE_VALUES (enumtype) != 0)
        !          5526:     {
        !          5527:       /* This enum is a named one that has been declared already.  */
        !          5528:       error ("redeclaration of `enum %s'", IDENTIFIER_POINTER (name));
        !          5529: 
        !          5530:       /* Completely replace its old definition.
        !          5531:         The old enumerators remain defined, however.  */
        !          5532:       TYPE_VALUES (enumtype) = 0;
        !          5533:     }
        !          5534: 
        !          5535:   enum_next_value = integer_zero_node;
        !          5536:   enum_overflow = 0;
        !          5537: 
        !          5538:   return enumtype;
        !          5539: }
        !          5540: 
        !          5541: /* After processing and defining all the values of an enumeration type,
        !          5542:    install their decls in the enumeration type and finish it off.
        !          5543:    ENUMTYPE is the type object and VALUES a list of decl-value pairs.
        !          5544:    Returns ENUMTYPE.  */
        !          5545: 
        !          5546: tree
        !          5547: finish_enum (enumtype, values)
        !          5548:      register tree enumtype, values;
        !          5549: {
        !          5550:   register tree pair, tem;
        !          5551:   tree minnode = 0, maxnode = 0;
        !          5552:   register HOST_WIDE_INT maxvalue = 0;
        !          5553:   register HOST_WIDE_INT minvalue = 0;
        !          5554:   register int i;
        !          5555:   unsigned precision = 0;
        !          5556:   int toplevel = global_binding_level == current_binding_level;
        !          5557:   int temporary = allocation_temporary_p ();
        !          5558: 
        !          5559:   if (in_parm_level_p ())
        !          5560:     warning ("enum defined inside parms");
        !          5561: 
        !          5562:   /* Calculate the maximum value of any enumerator in this type.  */
        !          5563: 
        !          5564:   for (pair = values; pair; pair = TREE_CHAIN (pair))
        !          5565:     {
        !          5566:       tree value = TREE_VALUE (pair);
        !          5567:       if (pair == values)
        !          5568:        minnode = maxnode = TREE_VALUE (pair);
        !          5569:       else
        !          5570:        {
        !          5571:          if (tree_int_cst_lt (maxnode, value))
        !          5572:            maxnode = value;
        !          5573:          if (tree_int_cst_lt (value, minnode))
        !          5574:            minnode = value;
        !          5575:        }
        !          5576:     }
        !          5577: 
        !          5578:   TYPE_MIN_VALUE (enumtype) = minnode;
        !          5579:   TYPE_MAX_VALUE (enumtype) = maxnode;
        !          5580: 
        !          5581:   /* Determine the precision this type needs.  */
        !          5582: 
        !          5583:   if (TREE_INT_CST_HIGH (minnode) >= 0
        !          5584:       ? tree_int_cst_lt (TYPE_MAX_VALUE (unsigned_type_node), maxnode)
        !          5585:       : (tree_int_cst_lt (minnode, TYPE_MIN_VALUE (integer_type_node))
        !          5586:         || tree_int_cst_lt (TYPE_MAX_VALUE (integer_type_node), maxnode)))
        !          5587:     precision = TYPE_PRECISION (long_long_integer_type_node);
        !          5588:   else
        !          5589:     {
        !          5590:       maxvalue = TREE_INT_CST_LOW (maxnode);
        !          5591:       minvalue = TREE_INT_CST_LOW (minnode);
        !          5592: 
        !          5593:       if (maxvalue > 0)
        !          5594:        precision = floor_log2 (maxvalue) + 1;
        !          5595:       if (minvalue < 0)
        !          5596:        {
        !          5597:          /* Compute number of bits to represent magnitude of a negative value.
        !          5598:             Add one to MINVALUE since range of negative numbers
        !          5599:             includes the power of two.  */
        !          5600:          unsigned negprecision = floor_log2 (-minvalue - 1) + 1;
        !          5601:          if (negprecision > precision)
        !          5602:            precision = negprecision;
        !          5603:          precision += 1;       /* room for sign bit */
        !          5604:        }
        !          5605: 
        !          5606:       if (!precision)
        !          5607:        precision = 1;
        !          5608:     }
        !          5609: 
        !          5610:   if (flag_short_enums || precision > TYPE_PRECISION (integer_type_node))
        !          5611:     /* Use the width of the narrowest normal C type which is wide enough.  */
        !          5612:     TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size (precision, 1));
        !          5613:   else
        !          5614:     TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node);
        !          5615: 
        !          5616:   TYPE_SIZE (enumtype) = 0;
        !          5617:   layout_type (enumtype);
        !          5618: 
        !          5619:   /* An enum can have some negative values; then it is signed.  */
        !          5620:   TREE_UNSIGNED (enumtype) = ! tree_int_cst_lt (minnode, integer_zero_node);
        !          5621: 
        !          5622:   /* Change the type of the enumerators to be the enum type.
        !          5623:      Formerly this was done only for enums that fit in an int,
        !          5624:      but the comment said it was done only for enums wider than int.
        !          5625:      It seems necessary to do this for wide enums,
        !          5626:      and best not to change what's done for ordinary narrower ones.  */
        !          5627:   for (pair = values; pair; pair = TREE_CHAIN (pair))
        !          5628:     {
        !          5629:       TREE_TYPE (TREE_PURPOSE (pair)) = enumtype;
        !          5630:       DECL_SIZE (TREE_PURPOSE (pair)) = TYPE_SIZE (enumtype);
        !          5631:       if (TREE_CODE (TREE_PURPOSE (pair)) != FUNCTION_DECL)
        !          5632:        DECL_ALIGN (TREE_PURPOSE (pair)) = TYPE_ALIGN (enumtype);
        !          5633:     }
        !          5634: 
        !          5635:   /* Replace the decl nodes in VALUES with their names.  */
        !          5636:   for (pair = values; pair; pair = TREE_CHAIN (pair))
        !          5637:     TREE_PURPOSE (pair) = DECL_NAME (TREE_PURPOSE (pair));
        !          5638: 
        !          5639:   TYPE_VALUES (enumtype) = values;
        !          5640: 
        !          5641:   /* Fix up all variant types of this enum type.  */
        !          5642:   for (tem = TYPE_MAIN_VARIANT (enumtype); tem; tem = TYPE_NEXT_VARIANT (tem))
        !          5643:     {
        !          5644:       TYPE_VALUES (tem) = TYPE_VALUES (enumtype);
        !          5645:       TYPE_MIN_VALUE (tem) = TYPE_MIN_VALUE (enumtype);
        !          5646:       TYPE_MAX_VALUE (tem) = TYPE_MAX_VALUE (enumtype);
        !          5647:       TYPE_SIZE (tem) = TYPE_SIZE (enumtype);
        !          5648:       TYPE_MODE (tem) = TYPE_MODE (enumtype);
        !          5649:       TYPE_PRECISION (tem) = TYPE_PRECISION (enumtype);
        !          5650:       TYPE_ALIGN (tem) = TYPE_ALIGN (enumtype);
        !          5651:       TREE_UNSIGNED (tem) = TREE_UNSIGNED (enumtype);
        !          5652:     }
        !          5653: 
        !          5654:   /* Finish debugging output for this type.  */
        !          5655:   rest_of_type_compilation (enumtype, toplevel);
        !          5656: 
        !          5657:   /* This matches a push in start_enum.  */
        !          5658:   pop_obstacks ();
        !          5659: 
        !          5660:   return enumtype;
        !          5661: }
        !          5662: 
        !          5663: /* Build and install a CONST_DECL for one value of the
        !          5664:    current enumeration type (one that was begun with start_enum).
        !          5665:    Return a tree-list containing the CONST_DECL and its value.
        !          5666:    Assignment of sequential values by default is handled here.  */
        !          5667: 
        !          5668: tree
        !          5669: build_enumerator (name, value)
        !          5670:      tree name, value;
        !          5671: {
        !          5672:   register tree decl, type;
        !          5673: 
        !          5674:   /* Validate and default VALUE.  */
        !          5675: 
        !          5676:   /* Remove no-op casts from the value.  */
        !          5677:   if (value)
        !          5678:     STRIP_TYPE_NOPS (value);
        !          5679: 
        !          5680:   if (value != 0)
        !          5681:     {
        !          5682:       if (TREE_CODE (value) == INTEGER_CST)
        !          5683:        {
        !          5684:          value = default_conversion (value);
        !          5685:          constant_expression_warning (value);
        !          5686:        }
        !          5687:       else
        !          5688:        {
        !          5689:          error ("enumerator value for `%s' not integer constant",
        !          5690:                 IDENTIFIER_POINTER (name));
        !          5691:          value = 0;
        !          5692:        }
        !          5693:     }
        !          5694: 
        !          5695:   /* Default based on previous value.  */
        !          5696:   /* It should no longer be possible to have NON_LVALUE_EXPR
        !          5697:      in the default.  */
        !          5698:   if (value == 0)
        !          5699:     {
        !          5700:       value = enum_next_value;
        !          5701:       if (enum_overflow)
        !          5702:        error ("overflow in enumeration values");
        !          5703:     }
        !          5704: 
        !          5705:   if (pedantic && ! int_fits_type_p (value, integer_type_node))
        !          5706:     {
        !          5707:       pedwarn ("ANSI C restricts enumerator values to range of `int'");
        !          5708:       value = integer_zero_node;
        !          5709:     }
        !          5710: 
        !          5711:   /* Set basis for default for next value.  */
        !          5712:   enum_next_value = build_binary_op (PLUS_EXPR, value, integer_one_node, 0);
        !          5713:   enum_overflow = tree_int_cst_lt (enum_next_value, value);
        !          5714: 
        !          5715:   /* Now create a declaration for the enum value name.  */
        !          5716: 
        !          5717:   type = TREE_TYPE (value);
        !          5718:   type = type_for_size (MAX (TYPE_PRECISION (type),
        !          5719:                             TYPE_PRECISION (integer_type_node)),
        !          5720:                        ((flag_traditional
        !          5721:                          || TYPE_PRECISION (type) >= TYPE_PRECISION (integer_type_node))
        !          5722:                         && TREE_UNSIGNED (type)));
        !          5723: 
        !          5724:   decl = build_decl (CONST_DECL, name, type);
        !          5725:   DECL_INITIAL (decl) = value;
        !          5726:   TREE_TYPE (value) = type;
        !          5727:   pushdecl (decl);
        !          5728: 
        !          5729:   return saveable_tree_cons (decl, value, NULL_TREE);
        !          5730: }
        !          5731: 
        !          5732: /* Create the FUNCTION_DECL for a function definition.
        !          5733:    DECLSPECS and DECLARATOR are the parts of the declaration;
        !          5734:    they describe the function's name and the type it returns,
        !          5735:    but twisted together in a fashion that parallels the syntax of C.
        !          5736: 
        !          5737:    This function creates a binding context for the function body
        !          5738:    as well as setting up the FUNCTION_DECL in current_function_decl.
        !          5739: 
        !          5740:    Returns 1 on success.  If the DECLARATOR is not suitable for a function
        !          5741:    (it defines a datum instead), we return 0, which tells
        !          5742:    yyparse to report a parse error.
        !          5743: 
        !          5744:    NESTED is nonzero for a function nested within another function.  */
        !          5745: 
        !          5746: int
        !          5747: start_function (declspecs, declarator, nested)
        !          5748:      tree declarator, declspecs;
        !          5749:      int nested;
        !          5750: {
        !          5751:   tree decl1, old_decl;
        !          5752:   tree restype;
        !          5753: 
        !          5754:   current_function_returns_value = 0;  /* Assume, until we see it does. */
        !          5755:   current_function_returns_null = 0;
        !          5756:   warn_about_return_type = 0;
        !          5757:   current_extern_inline = 0;
        !          5758:   c_function_varargs = 0;
        !          5759:   named_labels = 0;
        !          5760:   shadowed_labels = 0;
        !          5761: 
        !          5762:   decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1);
        !          5763: 
        !          5764:   /* If the declarator is not suitable for a function definition,
        !          5765:      cause a syntax error.  */
        !          5766:   if (decl1 == 0)
        !          5767:     return 0;
        !          5768: 
        !          5769:   announce_function (decl1);
        !          5770: 
        !          5771:   if (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl1))) == 0)
        !          5772:     {
        !          5773:       error ("return-type is an incomplete type");
        !          5774:       /* Make it return void instead.  */
        !          5775:       TREE_TYPE (decl1)
        !          5776:        = build_function_type (void_type_node,
        !          5777:                               TYPE_ARG_TYPES (TREE_TYPE (decl1)));
        !          5778:     }
        !          5779: 
        !          5780:   if (warn_about_return_type)
        !          5781:     warning ("return-type defaults to `int'");
        !          5782: 
        !          5783:   /* Save the parm names or decls from this function's declarator
        !          5784:      where store_parm_decls will find them.  */
        !          5785:   current_function_parms = last_function_parms;
        !          5786:   current_function_parm_tags = last_function_parm_tags;
        !          5787: 
        !          5788:   /* Make the init_value nonzero so pushdecl knows this is not tentative.
        !          5789:      error_mark_node is replaced below (in poplevel) with the BLOCK.  */
        !          5790:   DECL_INITIAL (decl1) = error_mark_node;
        !          5791: 
        !          5792:   /* If this definition isn't a prototype and we had a prototype declaration
        !          5793:      before, copy the arg type info from that prototype.
        !          5794:      But not if what we had before was a builtin function.  */
        !          5795:   old_decl = lookup_name_current_level (DECL_NAME (decl1));
        !          5796:   if (old_decl != 0 && TREE_CODE (TREE_TYPE (old_decl)) == FUNCTION_TYPE
        !          5797:       && !DECL_BUILT_IN (old_decl)
        !          5798:       && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl1)))
        !          5799:          == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (old_decl))))
        !          5800:       && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0)
        !          5801:     {
        !          5802:       TREE_TYPE (decl1) = TREE_TYPE (old_decl);
        !          5803:       current_function_prototype_file = DECL_SOURCE_FILE (old_decl);
        !          5804:       current_function_prototype_line = DECL_SOURCE_LINE (old_decl);
        !          5805:     }
        !          5806: 
        !          5807:   /* Optionally warn of old-fashioned def with no previous prototype.  */
        !          5808:   if (warn_strict_prototypes
        !          5809:       && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0
        !          5810:       && !(old_decl != 0 && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0))
        !          5811:     warning ("function declaration isn't a prototype");
        !          5812:   /* Optionally warn of any global def with no previous prototype.  */
        !          5813:   else if (warn_missing_prototypes
        !          5814:           && TREE_PUBLIC (decl1)
        !          5815:           && !(old_decl != 0 && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0)
        !          5816:           && strcmp ("main", IDENTIFIER_POINTER (DECL_NAME (decl1))))
        !          5817:     warning_with_decl (decl1, "no previous prototype for `%s'");
        !          5818:   /* Optionally warn of any def with no previous prototype
        !          5819:      if the function has already been used.  */
        !          5820:   else if (warn_missing_prototypes
        !          5821:           && old_decl != 0 && TREE_USED (old_decl)
        !          5822:           && !(old_decl != 0 && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0))
        !          5823:     warning_with_decl (decl1, "`%s' was used with no prototype before its definition");
        !          5824: 
        !          5825:   /* This is a definition, not a reference.
        !          5826:      So normally clear DECL_EXTERNAL.
        !          5827:      However, `extern inline' acts like a declaration
        !          5828:      except for defining how to inline.  So set DECL_EXTERNAL in that case.  */
        !          5829:   DECL_EXTERNAL (decl1) = current_extern_inline;
        !          5830: 
        !          5831:   /* This function exists in static storage.
        !          5832:      (This does not mean `static' in the C sense!)  */
        !          5833:   TREE_STATIC (decl1) = 1;
        !          5834: 
        !          5835:   /* A nested function is not global.  */
        !          5836:   if (current_function_decl != 0)
        !          5837:     TREE_PUBLIC (decl1) = 0;
        !          5838: 
        !          5839:   /* Record the decl so that the function name is defined.
        !          5840:      If we already have a decl for this name, and it is a FUNCTION_DECL,
        !          5841:      use the old decl.  */
        !          5842: 
        !          5843:   current_function_decl = pushdecl (decl1);
        !          5844: 
        !          5845:   pushlevel (0);
        !          5846:   declare_parm_level (1);
        !          5847:   current_binding_level->subblocks_tag_transparent = 1;
        !          5848: 
        !          5849:   make_function_rtl (current_function_decl);
        !          5850: 
        !          5851:   restype = TREE_TYPE (TREE_TYPE (current_function_decl));
        !          5852:   /* Promote the value to int before returning it.  */
        !          5853:   if (C_PROMOTING_INTEGER_TYPE_P (restype))
        !          5854:     {
        !          5855:       /* It retains unsignedness if traditional
        !          5856:         or if not really getting wider.  */
        !          5857:       if (TREE_UNSIGNED (restype)
        !          5858:          && (flag_traditional
        !          5859:              || (TYPE_PRECISION (restype)
        !          5860:                  == TYPE_PRECISION (integer_type_node))))
        !          5861:        restype = unsigned_type_node;
        !          5862:       else
        !          5863:        restype = integer_type_node;
        !          5864:     }
        !          5865:   DECL_RESULT (current_function_decl)
        !          5866:     = build_decl (RESULT_DECL, NULL_TREE, restype);
        !          5867: 
        !          5868:   if (!nested)
        !          5869:     /* Allocate further tree nodes temporarily during compilation
        !          5870:        of this function only.  */
        !          5871:     temporary_allocation ();
        !          5872: 
        !          5873:   /* If this fcn was already referenced via a block-scope `extern' decl
        !          5874:      (or an implicit decl), propagate certain information about the usage.  */
        !          5875:   if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl)))
        !          5876:     TREE_ADDRESSABLE (current_function_decl) = 1;
        !          5877: 
        !          5878:   return 1;
        !          5879: }
        !          5880: 
        !          5881: /* Record that this function is going to be a varargs function.
        !          5882:    This is called before store_parm_decls, which is too early
        !          5883:    to call mark_varargs directly.  */
        !          5884: 
        !          5885: void
        !          5886: c_mark_varargs ()
        !          5887: {
        !          5888:   c_function_varargs = 1;
        !          5889: }
        !          5890: 
        !          5891: /* Store the parameter declarations into the current function declaration.
        !          5892:    This is called after parsing the parameter declarations, before
        !          5893:    digesting the body of the function.
        !          5894: 
        !          5895:    For an old-style definition, modify the function's type
        !          5896:    to specify at least the number of arguments.  */
        !          5897: 
        !          5898: void
        !          5899: store_parm_decls ()
        !          5900: {
        !          5901:   register tree fndecl = current_function_decl;
        !          5902:   register tree parm;
        !          5903: 
        !          5904:   /* This is either a chain of PARM_DECLs (if a prototype was used)
        !          5905:      or a list of IDENTIFIER_NODEs (for an old-fashioned C definition).  */
        !          5906:   tree specparms = current_function_parms;
        !          5907: 
        !          5908:   /* This is a list of types declared among parms in a prototype.  */
        !          5909:   tree parmtags = current_function_parm_tags;
        !          5910: 
        !          5911:   /* This is a chain of PARM_DECLs from old-style parm declarations.  */
        !          5912:   register tree parmdecls = getdecls ();
        !          5913: 
        !          5914:   /* This is a chain of any other decls that came in among the parm
        !          5915:      declarations.  If a parm is declared with  enum {foo, bar} x;
        !          5916:      then CONST_DECLs for foo and bar are put here.  */
        !          5917:   tree nonparms = 0;
        !          5918: 
        !          5919:   /* Nonzero if this definition is written with a prototype.  */
        !          5920:   int prototype = 0;
        !          5921: 
        !          5922:   if (specparms != 0 && TREE_CODE (specparms) != TREE_LIST)
        !          5923:     {
        !          5924:       /* This case is when the function was defined with an ANSI prototype.
        !          5925:         The parms already have decls, so we need not do anything here
        !          5926:         except record them as in effect
        !          5927:         and complain if any redundant old-style parm decls were written.  */
        !          5928: 
        !          5929:       register tree next;
        !          5930:       tree others = 0;
        !          5931: 
        !          5932:       prototype = 1;
        !          5933: 
        !          5934:       if (parmdecls != 0)
        !          5935:        {
        !          5936:          tree decl, link;
        !          5937: 
        !          5938:          error_with_decl (fndecl,
        !          5939:                           "parm types given both in parmlist and separately");
        !          5940:          /* Get rid of the erroneous decls; don't keep them on
        !          5941:             the list of parms, since they might not be PARM_DECLs.  */
        !          5942:          for (decl = current_binding_level->names;
        !          5943:               decl; decl = TREE_CHAIN (decl))
        !          5944:            if (DECL_NAME (decl))
        !          5945:              IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) = 0;
        !          5946:          for (link = current_binding_level->shadowed;
        !          5947:               link; link = TREE_CHAIN (link))
        !          5948:            IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
        !          5949:          current_binding_level->names = 0;
        !          5950:          current_binding_level->shadowed = 0;
        !          5951:        }
        !          5952: 
        !          5953:       specparms = nreverse (specparms);
        !          5954:       for (parm = specparms; parm; parm = next)
        !          5955:        {
        !          5956:          next = TREE_CHAIN (parm);
        !          5957:          if (TREE_CODE (parm) == PARM_DECL)
        !          5958:            {
        !          5959:              if (DECL_NAME (parm) == 0)
        !          5960:                error_with_decl (parm, "parameter name omitted");
        !          5961:              else if (TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == void_type_node)
        !          5962:                {
        !          5963:                  error_with_decl (parm, "parameter `%s' declared void");
        !          5964:                  /* Change the type to error_mark_node so this parameter
        !          5965:                     will be ignored by assign_parms.  */
        !          5966:                  TREE_TYPE (parm) = error_mark_node;
        !          5967:                }
        !          5968:              pushdecl (parm);
        !          5969:            }
        !          5970:          else
        !          5971:            {
        !          5972:              /* If we find an enum constant or a type tag,
        !          5973:                 put it aside for the moment.  */
        !          5974:              TREE_CHAIN (parm) = 0;
        !          5975:              others = chainon (others, parm);
        !          5976:            }
        !          5977:        }
        !          5978: 
        !          5979:       /* Get the decls in their original chain order
        !          5980:         and record in the function.  */
        !          5981:       DECL_ARGUMENTS (fndecl) = getdecls ();
        !          5982: 
        !          5983: #if 0
        !          5984:       /* If this function takes a variable number of arguments,
        !          5985:         add a phony parameter to the end of the parm list,
        !          5986:         to represent the position of the first unnamed argument.  */
        !          5987:       if (TREE_VALUE (tree_last (TYPE_ARG_TYPES (TREE_TYPE (fndecl))))
        !          5988:          != void_type_node)
        !          5989:        {
        !          5990:          tree dummy = build_decl (PARM_DECL, NULL_TREE, void_type_node);
        !          5991:          /* Let's hope the address of the unnamed parm
        !          5992:             won't depend on its type.  */
        !          5993:          TREE_TYPE (dummy) = integer_type_node;
        !          5994:          DECL_ARG_TYPE (dummy) = integer_type_node;
        !          5995:          DECL_ARGUMENTS (fndecl)
        !          5996:            = chainon (DECL_ARGUMENTS (fndecl), dummy);
        !          5997:        }
        !          5998: #endif
        !          5999: 
        !          6000:       /* Now pushdecl the enum constants.  */
        !          6001:       for (parm = others; parm; parm = next)
        !          6002:        {
        !          6003:          next = TREE_CHAIN (parm);
        !          6004:          if (DECL_NAME (parm) == 0)
        !          6005:            ;
        !          6006:          else if (TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == void_type_node)
        !          6007:            ;
        !          6008:          else if (TREE_CODE (parm) != PARM_DECL)
        !          6009:            pushdecl (parm);
        !          6010:        }
        !          6011: 
        !          6012:       storetags (chainon (parmtags, gettags ()));
        !          6013:     }
        !          6014:   else
        !          6015:     {
        !          6016:       /* SPECPARMS is an identifier list--a chain of TREE_LIST nodes
        !          6017:         each with a parm name as the TREE_VALUE.
        !          6018: 
        !          6019:         PARMDECLS is a chain of declarations for parameters.
        !          6020:         Warning! It can also contain CONST_DECLs which are not parameters
        !          6021:         but are names of enumerators of any enum types
        !          6022:         declared among the parameters.
        !          6023: 
        !          6024:         First match each formal parameter name with its declaration.
        !          6025:         Associate decls with the names and store the decls
        !          6026:         into the TREE_PURPOSE slots.  */
        !          6027: 
        !          6028:       for (parm = parmdecls; parm; parm = TREE_CHAIN (parm))
        !          6029:        DECL_RESULT (parm) = 0;
        !          6030: 
        !          6031:       for (parm = specparms; parm; parm = TREE_CHAIN (parm))
        !          6032:        {
        !          6033:          register tree tail, found = NULL;
        !          6034: 
        !          6035:          if (TREE_VALUE (parm) == 0)
        !          6036:            {
        !          6037:              error_with_decl (fndecl, "parameter name missing from parameter list");
        !          6038:              TREE_PURPOSE (parm) = 0;
        !          6039:              continue;
        !          6040:            }
        !          6041: 
        !          6042:          /* See if any of the parmdecls specifies this parm by name.
        !          6043:             Ignore any enumerator decls.  */
        !          6044:          for (tail = parmdecls; tail; tail = TREE_CHAIN (tail))
        !          6045:            if (DECL_NAME (tail) == TREE_VALUE (parm)
        !          6046:                && TREE_CODE (tail) == PARM_DECL)
        !          6047:              {
        !          6048:                found = tail;
        !          6049:                break;
        !          6050:              }
        !          6051: 
        !          6052:          /* If declaration already marked, we have a duplicate name.
        !          6053:             Complain, and don't use this decl twice.   */
        !          6054:          if (found && DECL_RESULT (found) != 0)
        !          6055:            {
        !          6056:              error_with_decl (found, "multiple parameters named `%s'");
        !          6057:              found = 0;
        !          6058:            }
        !          6059: 
        !          6060:          /* If the declaration says "void", complain and ignore it.  */
        !          6061:          if (found && TYPE_MAIN_VARIANT (TREE_TYPE (found)) == void_type_node)
        !          6062:            {
        !          6063:              error_with_decl (found, "parameter `%s' declared void");
        !          6064:              TREE_TYPE (found) = integer_type_node;
        !          6065:              DECL_ARG_TYPE (found) = integer_type_node;
        !          6066:              layout_decl (found, 0);
        !          6067:            }
        !          6068: 
        !          6069:          /* Traditionally, a parm declared float is actually a double.  */
        !          6070:          if (found && flag_traditional
        !          6071:              && TYPE_MAIN_VARIANT (TREE_TYPE (found)) == float_type_node)
        !          6072:            {
        !          6073:              TREE_TYPE (found) = double_type_node;
        !          6074:              DECL_ARG_TYPE (found) = double_type_node;
        !          6075:              layout_decl (found, 0);
        !          6076:            }
        !          6077: 
        !          6078:          /* If no declaration found, default to int.  */
        !          6079:          if (!found)
        !          6080:            {
        !          6081:              found = build_decl (PARM_DECL, TREE_VALUE (parm),
        !          6082:                                  integer_type_node);
        !          6083:              DECL_ARG_TYPE (found) = TREE_TYPE (found);
        !          6084:              DECL_SOURCE_LINE (found) = DECL_SOURCE_LINE (fndecl);
        !          6085:              DECL_SOURCE_FILE (found) = DECL_SOURCE_FILE (fndecl);
        !          6086:              if (extra_warnings)
        !          6087:                warning_with_decl (found, "type of `%s' defaults to `int'");
        !          6088:              pushdecl (found);
        !          6089:            }
        !          6090: 
        !          6091:          TREE_PURPOSE (parm) = found;
        !          6092: 
        !          6093:          /* Mark this decl as "already found" -- see test, above.
        !          6094:             It is safe to use DECL_RESULT for this
        !          6095:             since it is not used in PARM_DECLs or CONST_DECLs.  */
        !          6096:          DECL_RESULT (found) = error_mark_node;
        !          6097:        }
        !          6098: 
        !          6099:       /* Put anything which is on the parmdecls chain and which is
        !          6100:         not a PARM_DECL onto the list NONPARMS.  (The types of
        !          6101:         non-parm things which might appear on the list include
        !          6102:         enumerators and NULL-named TYPE_DECL nodes.) Complain about
        !          6103:         any actual PARM_DECLs not matched with any names.  */
        !          6104: 
        !          6105:       nonparms = 0;
        !          6106:       for (parm = parmdecls; parm; )
        !          6107:        {
        !          6108:          tree next = TREE_CHAIN (parm);
        !          6109:          TREE_CHAIN (parm) = 0;
        !          6110: 
        !          6111:          if (TREE_CODE (parm) != PARM_DECL)
        !          6112:            nonparms = chainon (nonparms, parm);
        !          6113:          else
        !          6114:            {
        !          6115:              /* Complain about args with incomplete types.  */
        !          6116:              if (TYPE_SIZE (TREE_TYPE (parm)) == 0)
        !          6117:                {
        !          6118:                  error_with_decl (parm, "parameter `%s' has incomplete type");
        !          6119:                  TREE_TYPE (parm) = error_mark_node;
        !          6120:                }
        !          6121: 
        !          6122:              if (DECL_RESULT (parm) == 0)
        !          6123:                {
        !          6124:                  error_with_decl (parm,
        !          6125:                                   "declaration for parameter `%s' but no such parameter");
        !          6126:                  /* Pretend the parameter was not missing.
        !          6127:                     This gets us to a standard state and minimizes
        !          6128:                     further error messages.  */
        !          6129:                  specparms
        !          6130:                    = chainon (specparms,
        !          6131:                               tree_cons (parm, NULL_TREE, NULL_TREE));
        !          6132:                }
        !          6133:            }
        !          6134: 
        !          6135:          parm = next;
        !          6136:        }
        !          6137: 
        !          6138:       /* Chain the declarations together in the order of the list of names.  */
        !          6139:       /* Store that chain in the function decl, replacing the list of names.  */
        !          6140:       parm = specparms;
        !          6141:       DECL_ARGUMENTS (fndecl) = 0;
        !          6142:       {
        !          6143:        register tree last;
        !          6144:        for (last = 0; parm; parm = TREE_CHAIN (parm))
        !          6145:          if (TREE_PURPOSE (parm))
        !          6146:            {
        !          6147:              if (last == 0)
        !          6148:                DECL_ARGUMENTS (fndecl) = TREE_PURPOSE (parm);
        !          6149:              else
        !          6150:                TREE_CHAIN (last) = TREE_PURPOSE (parm);
        !          6151:              last = TREE_PURPOSE (parm);
        !          6152:              TREE_CHAIN (last) = 0;
        !          6153:            }
        !          6154:       }
        !          6155: 
        !          6156:       /* If there was a previous prototype,
        !          6157:         set the DECL_ARG_TYPE of each argument according to
        !          6158:         the type previously specified, and report any mismatches.  */
        !          6159: 
        !          6160:       if (TYPE_ARG_TYPES (TREE_TYPE (fndecl)))
        !          6161:        {
        !          6162:          register tree type;
        !          6163:          for (parm = DECL_ARGUMENTS (fndecl),
        !          6164:               type = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
        !          6165:               parm || (type && (TYPE_MAIN_VARIANT (TREE_VALUE (type))
        !          6166:                                 != void_type_node));
        !          6167:               parm = TREE_CHAIN (parm), type = TREE_CHAIN (type))
        !          6168:            {
        !          6169:              if (parm == 0 || type == 0
        !          6170:                  || TYPE_MAIN_VARIANT (TREE_VALUE (type)) == void_type_node)
        !          6171:                {
        !          6172:                  error ("number of arguments doesn't match prototype");
        !          6173:                  error_with_file_and_line (current_function_prototype_file,
        !          6174:                                            current_function_prototype_line,
        !          6175:                                            "prototype declaration");
        !          6176:                  break;
        !          6177:                }
        !          6178:              /* Type for passing arg must be consistent
        !          6179:                 with that declared for the arg.  */
        !          6180:              if (! comptypes (DECL_ARG_TYPE (parm), TREE_VALUE (type)))
        !          6181:                {
        !          6182:                  if (TYPE_MAIN_VARIANT (TREE_TYPE (parm))
        !          6183:                      == TYPE_MAIN_VARIANT (TREE_VALUE (type)))
        !          6184:                    {
        !          6185:                      /* Adjust argument to match prototype.  E.g. a previous
        !          6186:                         `int foo(float);' prototype causes
        !          6187:                         `int foo(x) float x; {...}' to be treated like
        !          6188:                         `int foo(float x) {...}'.  This is particularly
        !          6189:                         useful for argument types like uid_t.  */
        !          6190:                      DECL_ARG_TYPE (parm) = TREE_TYPE (parm);
        !          6191: #ifdef PROMOTE_PROTOTYPES
        !          6192:                      if ((TREE_CODE (TREE_TYPE (parm)) == INTEGER_TYPE
        !          6193:                           || TREE_CODE (TREE_TYPE (parm)) == ENUMERAL_TYPE)
        !          6194:                          && TYPE_PRECISION (TREE_TYPE (parm))
        !          6195:                          < TYPE_PRECISION (integer_type_node))
        !          6196:                        DECL_ARG_TYPE (parm) = integer_type_node;
        !          6197: #endif
        !          6198:                      if (pedantic)
        !          6199:                        {
        !          6200:                          pedwarn ("promoted argument `%s' doesn't match prototype",
        !          6201:                                   IDENTIFIER_POINTER (DECL_NAME (parm)));
        !          6202:                          warning_with_file_and_line
        !          6203:                            (current_function_prototype_file,
        !          6204:                             current_function_prototype_line,
        !          6205:                             "prototype declaration");
        !          6206:                        }
        !          6207:                    }
        !          6208:                  /* If -traditional, allow `int' argument to match
        !          6209:                     `unsigned' prototype.  */
        !          6210:                  else if (! (flag_traditional
        !          6211:                              && TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == integer_type_node
        !          6212:                              && TYPE_MAIN_VARIANT (TREE_VALUE (type)) == unsigned_type_node))
        !          6213:                    {
        !          6214:                      error ("argument `%s' doesn't match prototype",
        !          6215:                             IDENTIFIER_POINTER (DECL_NAME (parm)));
        !          6216:                      error_with_file_and_line (current_function_prototype_file,
        !          6217:                                                current_function_prototype_line,
        !          6218:                                                "prototype declaration");
        !          6219:                    }
        !          6220:                }
        !          6221:            }
        !          6222:          TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = 0;
        !          6223:        }
        !          6224: 
        !          6225:       /* Otherwise, create a prototype that would match.  */
        !          6226: 
        !          6227:       else
        !          6228:        {
        !          6229:          register tree actual, type;
        !          6230:          register tree last = 0;
        !          6231: 
        !          6232:          for (parm = DECL_ARGUMENTS (fndecl); parm; parm = TREE_CHAIN (parm))
        !          6233:            {
        !          6234:              type = perm_tree_cons (NULL_TREE, DECL_ARG_TYPE (parm),
        !          6235:                                     NULL_TREE);
        !          6236:              if (last)
        !          6237:                TREE_CHAIN (last) = type;
        !          6238:              else
        !          6239:                actual = type;
        !          6240:              last = type;
        !          6241:            }
        !          6242:          type = perm_tree_cons (NULL_TREE, void_type_node, NULL_TREE);
        !          6243:          if (last)
        !          6244:            TREE_CHAIN (last) = type;
        !          6245:          else
        !          6246:            actual = type;
        !          6247: 
        !          6248:          /* We are going to assign a new value for the TYPE_ACTUAL_ARG_TYPES
        !          6249:             of the type of this function, but we need to avoid having this
        !          6250:             affect the types of other similarly-typed functions, so we must
        !          6251:             first force the generation of an identical (but separate) type
        !          6252:             node for the relevant function type.  The new node we create
        !          6253:             will be a variant of the main variant of the original function
        !          6254:             type.  */
        !          6255: 
        !          6256:          TREE_TYPE (fndecl) = build_type_copy (TREE_TYPE (fndecl));
        !          6257: 
        !          6258:          TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = actual;
        !          6259:        }
        !          6260: 
        !          6261:       /* Now store the final chain of decls for the arguments
        !          6262:         as the decl-chain of the current lexical scope.
        !          6263:         Put the enumerators in as well, at the front so that
        !          6264:         DECL_ARGUMENTS is not modified.  */
        !          6265: 
        !          6266:       storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl)));
        !          6267:     }
        !          6268: 
        !          6269:   /* Make sure the binding level for the top of the function body
        !          6270:      gets a BLOCK if there are any in the function.
        !          6271:      Otherwise, the dbx output is wrong.  */
        !          6272: 
        !          6273:   keep_next_if_subblocks = 1;
        !          6274: 
        !          6275:   /* ??? This might be an improvement,
        !          6276:      but needs to be thought about some more.  */
        !          6277: #if 0
        !          6278:   keep_next_level_flag = 1;
        !          6279: #endif
        !          6280: 
        !          6281:   /* Write a record describing this function definition to the prototypes
        !          6282:      file (if requested).  */
        !          6283: 
        !          6284:   gen_aux_info_record (fndecl, 1, 0, prototype);
        !          6285: 
        !          6286:   /* Initialize the RTL code for the function.  */
        !          6287: 
        !          6288:   init_function_start (fndecl, input_filename, lineno);
        !          6289: 
        !          6290:   /* If this is a varargs function, inform function.c.  */
        !          6291: 
        !          6292:   if (c_function_varargs)
        !          6293:     mark_varargs ();
        !          6294: 
        !          6295:   /* Declare __FUNCTION__ and __PRETTY_FUNCTION__ for this function.  */
        !          6296: 
        !          6297:   declare_function_name ();
        !          6298: 
        !          6299:   /* Set up parameters and prepare for return, for the function.  */
        !          6300: 
        !          6301:   expand_function_start (fndecl, 0);
        !          6302: 
        !          6303:   /* If this function is `main', emit a call to `__main'
        !          6304:      to run global initializers, etc.  */
        !          6305:   if (DECL_NAME (fndecl)
        !          6306:       && strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "main") == 0
        !          6307:       && DECL_CONTEXT (fndecl) == NULL_TREE)
        !          6308:     expand_main_function ();
        !          6309: }
        !          6310: 
        !          6311: /* SPECPARMS is an identifier list--a chain of TREE_LIST nodes
        !          6312:    each with a parm name as the TREE_VALUE.  A null pointer as TREE_VALUE
        !          6313:    stands for an ellipsis in the identifier list.
        !          6314: 
        !          6315:    PARMLIST is the data returned by get_parm_info for the
        !          6316:    parmlist that follows the semicolon.
        !          6317: 
        !          6318:    We return a value of the same sort that get_parm_info returns,
        !          6319:    except that it describes the combination of identifiers and parmlist.  */
        !          6320: 
        !          6321: tree
        !          6322: combine_parm_decls (specparms, parmlist, void_at_end)
        !          6323:      tree specparms, parmlist;
        !          6324:      int void_at_end;
        !          6325: {
        !          6326:   register tree fndecl = current_function_decl;
        !          6327:   register tree parm;
        !          6328: 
        !          6329:   tree parmdecls = TREE_PURPOSE (parmlist);
        !          6330: 
        !          6331:   /* This is a chain of any other decls that came in among the parm
        !          6332:      declarations.  They were separated already by get_parm_info,
        !          6333:      so we just need to keep them separate.  */
        !          6334:   tree nonparms = TREE_VALUE (parmlist);
        !          6335: 
        !          6336:   tree types = 0;
        !          6337: 
        !          6338:   for (parm = parmdecls; parm; parm = TREE_CHAIN (parm))
        !          6339:     DECL_RESULT (parm) = 0;
        !          6340: 
        !          6341:   for (parm = specparms; parm; parm = TREE_CHAIN (parm))
        !          6342:     {
        !          6343:       register tree tail, found = NULL;
        !          6344: 
        !          6345:       /* See if any of the parmdecls specifies this parm by name.  */
        !          6346:       for (tail = parmdecls; tail; tail = TREE_CHAIN (tail))
        !          6347:        if (DECL_NAME (tail) == TREE_VALUE (parm))
        !          6348:          {
        !          6349:            found = tail;
        !          6350:            break;
        !          6351:          }
        !          6352: 
        !          6353:       /* If declaration already marked, we have a duplicate name.
        !          6354:         Complain, and don't use this decl twice.   */
        !          6355:       if (found && DECL_RESULT (found) != 0)
        !          6356:        {
        !          6357:          error_with_decl (found, "multiple parameters named `%s'");
        !          6358:          found = 0;
        !          6359:        }
        !          6360: 
        !          6361:       /* If the declaration says "void", complain and ignore it.  */
        !          6362:       if (found && TYPE_MAIN_VARIANT (TREE_TYPE (found)) == void_type_node)
        !          6363:        {
        !          6364:          error_with_decl (found, "parameter `%s' declared void");
        !          6365:          TREE_TYPE (found) = integer_type_node;
        !          6366:          DECL_ARG_TYPE (found) = integer_type_node;
        !          6367:          layout_decl (found, 0);
        !          6368:        }
        !          6369: 
        !          6370:       /* Traditionally, a parm declared float is actually a double.  */
        !          6371:       if (found && flag_traditional
        !          6372:          && TYPE_MAIN_VARIANT (TREE_TYPE (found)) == float_type_node)
        !          6373:        {
        !          6374:          TREE_TYPE (found) = double_type_node;
        !          6375:          DECL_ARG_TYPE (found) = double_type_node;
        !          6376:          layout_decl (found, 0);
        !          6377:        }
        !          6378: 
        !          6379:       /* If no declaration found, default to int.  */
        !          6380:       if (!found)
        !          6381:        {
        !          6382:          found = build_decl (PARM_DECL, TREE_VALUE (parm),
        !          6383:                              integer_type_node);
        !          6384:          DECL_ARG_TYPE (found) = TREE_TYPE (found);
        !          6385:          DECL_SOURCE_LINE (found) = DECL_SOURCE_LINE (fndecl);
        !          6386:          DECL_SOURCE_FILE (found) = DECL_SOURCE_FILE (fndecl);
        !          6387:          error_with_decl (found, "type of parameter `%s' is not declared");
        !          6388:          pushdecl (found);
        !          6389:        }
        !          6390: 
        !          6391:       TREE_PURPOSE (parm) = found;
        !          6392: 
        !          6393:       /* Mark this decl as "already found" -- see test, above.
        !          6394:         It is safe to use DECL_RESULT for this
        !          6395:         since it is not used in PARM_DECLs or CONST_DECLs.  */
        !          6396:       DECL_RESULT (found) = error_mark_node;
        !          6397:     }
        !          6398: 
        !          6399:   /* Complain about any actual PARM_DECLs not matched with any names.  */
        !          6400: 
        !          6401:   for (parm = parmdecls; parm; )
        !          6402:     {
        !          6403:       tree next = TREE_CHAIN (parm);
        !          6404:       TREE_CHAIN (parm) = 0;
        !          6405: 
        !          6406:       /* Complain about args with incomplete types.  */
        !          6407:       if (TYPE_SIZE (TREE_TYPE (parm)) == 0)
        !          6408:        {
        !          6409:          error_with_decl (parm, "parameter `%s' has incomplete type");
        !          6410:          TREE_TYPE (parm) = error_mark_node;
        !          6411:        }
        !          6412: 
        !          6413:       if (DECL_RESULT (parm) == 0)
        !          6414:        {
        !          6415:          error_with_decl (parm,
        !          6416:                           "declaration for parameter `%s' but no such parameter");
        !          6417:          /* Pretend the parameter was not missing.
        !          6418:             This gets us to a standard state and minimizes
        !          6419:             further error messages.  */
        !          6420:          specparms
        !          6421:            = chainon (specparms,
        !          6422:                       tree_cons (parm, NULL_TREE, NULL_TREE));
        !          6423:        }
        !          6424: 
        !          6425:       parm = next;
        !          6426:     }
        !          6427: 
        !          6428:   /* Chain the declarations together in the order of the list of names.
        !          6429:      At the same time, build up a list of their types, in reverse order.  */
        !          6430: 
        !          6431:   parm = specparms;
        !          6432:   parmdecls = 0;
        !          6433:   {
        !          6434:     register tree last;
        !          6435:     for (last = 0; parm; parm = TREE_CHAIN (parm))
        !          6436:       if (TREE_PURPOSE (parm))
        !          6437:        {
        !          6438:          if (last == 0)
        !          6439:            parmdecls = TREE_PURPOSE (parm);
        !          6440:          else
        !          6441:            TREE_CHAIN (last) = TREE_PURPOSE (parm);
        !          6442:          last = TREE_PURPOSE (parm);
        !          6443:          TREE_CHAIN (last) = 0;
        !          6444: 
        !          6445:          types = saveable_tree_cons (NULL_TREE, TREE_TYPE (parm), types);
        !          6446:        }
        !          6447:   }
        !          6448:   
        !          6449:   if (void_at_end)
        !          6450:     return saveable_tree_cons (parmdecls, nonparms,
        !          6451:                               nreverse (saveable_tree_cons (NULL_TREE, void_type_node, types)));
        !          6452: 
        !          6453:   return saveable_tree_cons (parmdecls, nonparms, nreverse (types));
        !          6454: }
        !          6455: 
        !          6456: /* Finish up a function declaration and compile that function
        !          6457:    all the way to assembler language output.  The free the storage
        !          6458:    for the function definition.
        !          6459: 
        !          6460:    This is called after parsing the body of the function definition.
        !          6461: 
        !          6462:    NESTED is nonzero if the function being finished is nested in another.  */
        !          6463: 
        !          6464: void
        !          6465: finish_function (nested)
        !          6466:      int nested;
        !          6467: {
        !          6468:   register tree fndecl = current_function_decl;
        !          6469: 
        !          6470: /*  TREE_READONLY (fndecl) = 1;
        !          6471:     This caused &foo to be of type ptr-to-const-function
        !          6472:     which then got a warning when stored in a ptr-to-function variable.  */
        !          6473: 
        !          6474:   poplevel (1, 0, 1);
        !          6475:   BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
        !          6476: 
        !          6477:   /* Must mark the RESULT_DECL as being in this function.  */
        !          6478: 
        !          6479:   DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl;
        !          6480: 
        !          6481:   /* Obey `register' declarations if `setjmp' is called in this fn.  */
        !          6482: #ifdef NEXT_SEMANTICS
        !          6483:   /* Be even more conservative on NeXT so that exception handling
        !          6484:      will work reliably. */
        !          6485:   if (current_function_calls_setjmp)
        !          6486: #else
        !          6487:   if (flag_traditional && current_function_calls_setjmp)
        !          6488: #endif
        !          6489:     {
        !          6490:       setjmp_protect (DECL_INITIAL (fndecl));
        !          6491:       setjmp_protect_args ();
        !          6492:     }
        !          6493: 
        !          6494: #ifdef DEFAULT_MAIN_RETURN
        !          6495:   if (! strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "main"))
        !          6496:     {
        !          6497:       if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (fndecl)))
        !          6498:          != integer_type_node)
        !          6499:        warning_with_decl (fndecl, "return type of `%s' is not `int'");
        !          6500:       else
        !          6501:        {
        !          6502:          /* Make it so that `main' always returns success by default.  */
        !          6503:          DEFAULT_MAIN_RETURN;
        !          6504:        }
        !          6505:     }
        !          6506: #endif
        !          6507: 
        !          6508:   /* Generate rtl for function exit.  */
        !          6509:   expand_function_end (input_filename, lineno, 0);
        !          6510: 
        !          6511:   /* So we can tell if jump_optimize sets it to 1.  */
        !          6512:   can_reach_end = 0;
        !          6513: 
        !          6514:   /* Run the optimizers and output the assembler code for this function.  */
        !          6515:   rest_of_compilation (fndecl);
        !          6516: 
        !          6517:   current_function_returns_null |= can_reach_end;
        !          6518: 
        !          6519:   if (TREE_THIS_VOLATILE (fndecl) && current_function_returns_null)
        !          6520:     warning ("`volatile' function does return");
        !          6521:   else if (warn_return_type && can_reach_end
        !          6522:           && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (fndecl))) != void_type_node)
        !          6523:     /* If this function returns non-void and control can drop through,
        !          6524:        complain.  */
        !          6525:     warning ("control reaches end of non-void function");
        !          6526:   /* With just -W, complain only if function returns both with
        !          6527:      and without a value.  */
        !          6528:   else if (extra_warnings
        !          6529:           && current_function_returns_value && current_function_returns_null)
        !          6530:     warning ("this function may return with or without a value");
        !          6531: 
        !          6532:   /* Free all the tree nodes making up this function.  */
        !          6533:   /* Switch back to allocating nodes permanently
        !          6534:      until we start another function.  */
        !          6535:   if (! nested)
        !          6536:     permanent_allocation ();
        !          6537: 
        !          6538:   if (DECL_SAVED_INSNS (fndecl) == 0 && ! nested)
        !          6539:     {
        !          6540:       /* Stop pointing to the local nodes about to be freed.  */
        !          6541:       /* But DECL_INITIAL must remain nonzero so we know this
        !          6542:         was an actual function definition.  */
        !          6543:       /* For a nested function, this is done in pop_c_function_context.  */
        !          6544:       /* If rest_of_compilation set this to 0, leave it 0.  */
        !          6545:       if (DECL_INITIAL (fndecl) != 0)
        !          6546:        DECL_INITIAL (fndecl) = error_mark_node;
        !          6547:       DECL_ARGUMENTS (fndecl) = 0;
        !          6548:     }
        !          6549: 
        !          6550:   if (! nested)
        !          6551:     {
        !          6552:       /* Let the error reporting routines know that we're outside a
        !          6553:         function.  For a nested function, this value is used in
        !          6554:         pop_c_function_context and then reset via pop_function_context.  */
        !          6555:       current_function_decl = NULL;
        !          6556:     }
        !          6557: }
        !          6558: 
        !          6559: /* Save and restore the variables in this file and elsewhere
        !          6560:    that keep track of the progress of compilation of the current function.
        !          6561:    Used for nested functions.  */
        !          6562: 
        !          6563: struct c_function
        !          6564: {
        !          6565:   struct c_function *next;
        !          6566:   tree named_labels;
        !          6567:   tree shadowed_labels;
        !          6568:   int returns_value;
        !          6569:   int returns_null;
        !          6570:   int warn_about_return_type;
        !          6571:   int extern_inline;
        !          6572:   struct binding_level *binding_level;
        !          6573: };
        !          6574: 
        !          6575: struct c_function *c_function_chain;
        !          6576: 
        !          6577: /* Save and reinitialize the variables
        !          6578:    used during compilation of a C function.  */
        !          6579: 
        !          6580: void
        !          6581: push_c_function_context ()
        !          6582: {
        !          6583:   struct c_function *p
        !          6584:     = (struct c_function *) xmalloc (sizeof (struct c_function));
        !          6585: 
        !          6586:   if (pedantic)
        !          6587:     pedwarn ("ANSI C forbids nested functions");
        !          6588: 
        !          6589:   push_function_context ();
        !          6590: 
        !          6591:   p->next = c_function_chain;
        !          6592:   c_function_chain = p;
        !          6593: 
        !          6594:   p->named_labels = named_labels;
        !          6595:   p->shadowed_labels = shadowed_labels;
        !          6596:   p->returns_value = current_function_returns_value;
        !          6597:   p->returns_null = current_function_returns_null;
        !          6598:   p->warn_about_return_type = warn_about_return_type;
        !          6599:   p->extern_inline = current_extern_inline;
        !          6600:   p->binding_level = current_binding_level;
        !          6601: }
        !          6602: 
        !          6603: /* Restore the variables used during compilation of a C function.  */
        !          6604: 
        !          6605: void
        !          6606: pop_c_function_context ()
        !          6607: {
        !          6608:   struct c_function *p = c_function_chain;
        !          6609:   tree link;
        !          6610: 
        !          6611:   /* Bring back all the labels that were shadowed.  */
        !          6612:   for (link = shadowed_labels; link; link = TREE_CHAIN (link))
        !          6613:     if (DECL_NAME (TREE_VALUE (link)) != 0)
        !          6614:       IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link)))
        !          6615:        = TREE_VALUE (link);
        !          6616: 
        !          6617:   if (DECL_SAVED_INSNS (current_function_decl) == 0)
        !          6618:     {
        !          6619:       /* Stop pointing to the local nodes about to be freed.  */
        !          6620:       /* But DECL_INITIAL must remain nonzero so we know this
        !          6621:         was an actual function definition.  */
        !          6622:       DECL_INITIAL (current_function_decl) = error_mark_node;
        !          6623:       DECL_ARGUMENTS (current_function_decl) = 0;
        !          6624:     }
        !          6625: 
        !          6626:   pop_function_context ();
        !          6627: 
        !          6628:   c_function_chain = p->next;
        !          6629: 
        !          6630:   named_labels = p->named_labels;
        !          6631:   shadowed_labels = p->shadowed_labels;
        !          6632:   current_function_returns_value = p->returns_value;
        !          6633:   current_function_returns_null = p->returns_null;
        !          6634:   warn_about_return_type = p->warn_about_return_type;
        !          6635:   current_extern_inline = p->extern_inline;
        !          6636:   current_binding_level = p->binding_level;
        !          6637: 
        !          6638:   free (p);
        !          6639: }

unix.superglobalmegacorp.com

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