|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.