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