|
|
1.1 ! root 1: /* Process declarations and variables for C compiler. ! 2: Copyright (C) 1988, 1992, 1993 Free Software Foundation, Inc. ! 3: Hacked by Michael Tiemann ([email protected]) ! 4: ! 5: This file is part of GNU CC. ! 6: ! 7: GNU CC is free software; you can redistribute it and/or modify ! 8: it under the terms of the GNU General Public License as published by ! 9: the Free Software Foundation; either version 2, or (at your option) ! 10: any later version. ! 11: ! 12: GNU CC is distributed in the hope that it will be useful, ! 13: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 15: GNU General Public License for more details. ! 16: ! 17: You should have received a copy of the GNU General Public License ! 18: along with GNU CC; see the file COPYING. If not, write to ! 19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 20: ! 21: ! 22: /* Process declarations and symbol lookup for C front end. ! 23: Also constructs types; the standard scalar types at initialization, ! 24: and structure, union, array and enum types when they are declared. */ ! 25: ! 26: /* ??? not all decl nodes are given the most useful possible ! 27: line numbers. For example, the CONST_DECLs for enum values. */ ! 28: ! 29: #include <stdio.h> ! 30: #include "config.h" ! 31: #include "tree.h" ! 32: #include "rtl.h" ! 33: #include "flags.h" ! 34: #include "cp-tree.h" ! 35: #include "cp-decl.h" ! 36: #include "cp-lex.h" ! 37: #include <sys/types.h> ! 38: #include <signal.h> ! 39: #include "obstack.h" ! 40: ! 41: #define obstack_chunk_alloc xmalloc ! 42: #define obstack_chunk_free free ! 43: ! 44: #ifndef OBJCPLUS ! 45: /* Define this if C structs should have gratuitous typedefing ! 46: done just like C++ structs do. */ ! 47: #define BREAK_C_TAGS ! 48: #endif /* not OBJCPLUS */ ! 49: extern struct obstack permanent_obstack; ! 50: ! 51: #ifdef OBJCPLUS ! 52: #define DECL_HAS_C_LINKAGE(DECL) \ ! 53: (DECL_LANGUAGE (DECL)==lang_c || DECL_LANGUAGE (DECL)==lang_objc) ! 54: #else ! 55: #define DECL_HAS_C_LINKAGE(DECL) (DECL_LANGUAGE (DECL)==lang_c) ! 56: #endif ! 57: #define DECL_LINKAGE(DECL) \ ! 58: (DECL_HAS_C_LINKAGE(DECL) ? lang_c : \ ! 59: DECL_HAS_CPLUSPLUS_LINKAGE(DECL) ? lang_cplusplus : 0) ! 60: ! 61: #define DECL_HAS_CPLUSPLUS_LINKAGE(DECL) (DECL_LANGUAGE (DECL)==lang_cplusplus) ! 62: ! 63: #define DECLS_SAME_LINKAGE(DECL1, DECL2) \ ! 64: (DECL_LINKAGE(DECL1) == DECL_LINKAGE(DECL2)) ! 65: ! 66: extern int current_class_depth; ! 67: ! 68: /* Stack of places to restore the search obstack back to. */ ! 69: ! 70: /* Obstack used for remembering local class declarations (like ! 71: enums and static (const) members. */ ! 72: #include "stack.h" ! 73: static struct obstack decl_obstack; ! 74: static struct stack_level *decl_stack; ! 75: ! 76: #ifndef CHAR_TYPE_SIZE ! 77: #define CHAR_TYPE_SIZE BITS_PER_UNIT ! 78: #endif ! 79: ! 80: #ifndef SHORT_TYPE_SIZE ! 81: #define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2)) ! 82: #endif ! 83: ! 84: #ifndef INT_TYPE_SIZE ! 85: #define INT_TYPE_SIZE BITS_PER_WORD ! 86: #endif ! 87: ! 88: #ifndef LONG_TYPE_SIZE ! 89: #define LONG_TYPE_SIZE BITS_PER_WORD ! 90: #endif ! 91: ! 92: #ifndef LONG_LONG_TYPE_SIZE ! 93: #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2) ! 94: #endif ! 95: ! 96: #ifndef WCHAR_UNSIGNED ! 97: #define WCHAR_UNSIGNED 0 ! 98: #endif ! 99: ! 100: #ifndef FLOAT_TYPE_SIZE ! 101: #define FLOAT_TYPE_SIZE BITS_PER_WORD ! 102: #endif ! 103: ! 104: #ifndef DOUBLE_TYPE_SIZE ! 105: #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2) ! 106: #endif ! 107: ! 108: #ifndef LONG_DOUBLE_TYPE_SIZE ! 109: #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2) ! 110: #endif ! 111: ! 112: /* We let tm.h override the types used here, to handle trivial differences ! 113: such as the choice of unsigned int or long unsigned int for size_t. ! 114: When machines start needing nontrivial differences in the size type, ! 115: it would be best to do something here to figure out automatically ! 116: from other information what type to use. */ ! 117: ! 118: #ifndef SIZE_TYPE ! 119: #define SIZE_TYPE "long unsigned int" ! 120: #endif ! 121: ! 122: #ifndef PTRDIFF_TYPE ! 123: #define PTRDIFF_TYPE "long int" ! 124: #endif ! 125: ! 126: #ifndef WCHAR_TYPE ! 127: #define WCHAR_TYPE "int" ! 128: #endif ! 129: ! 130: #define builtin_function(NAME, TYPE, CODE, LIBNAME) \ ! 131: define_function (NAME, TYPE, CODE, (void (*)())pushdecl, LIBNAME) ! 132: #define auto_function(NAME, TYPE, CODE) \ ! 133: do { \ ! 134: tree __name = NAME; \ ! 135: tree __type = TYPE; \ ! 136: define_function (IDENTIFIER_POINTER (__name), __type, CODE, \ ! 137: (void (*)())push_overloaded_decl_1, \ ! 138: IDENTIFIER_POINTER (build_decl_overload (__name, TYPE_ARG_TYPES (__type), 0)));\ ! 139: } while (0) ! 140: ! 141: tree grokparms PROTO((tree, int)); ! 142: static tree lookup_nested_type PROTO((tree, tree)); ! 143: static char *redeclaration_error_message PROTO((tree, tree)); ! 144: static int parmlist_is_random PROTO((tree)); ! 145: static void grok_op_properties PROTO((tree, int)); ! 146: static void expand_static_init PROTO((tree, tree)); ! 147: static void deactivate_exception_cleanups PROTO((void)); ! 148: ! 149: tree define_function PROTO((char *, tree, enum built_in_function, void (*)(), char *)); ! 150: ! 151: /* a node which has tree code ERROR_MARK, and whose type is itself. ! 152: All erroneous expressions are replaced with this node. All functions ! 153: that accept nodes as arguments should avoid generating error messages ! 154: if this node is one of the arguments, since it is undesirable to get ! 155: multiple error messages from one error in the input. */ ! 156: ! 157: tree error_mark_node; ! 158: ! 159: /* Erroneous argument lists can use this *IFF* they do not modify it. */ ! 160: tree error_mark_list; ! 161: ! 162: /* INTEGER_TYPE and REAL_TYPE nodes for the standard data types */ ! 163: ! 164: tree short_integer_type_node; ! 165: tree integer_type_node; ! 166: tree long_integer_type_node; ! 167: tree long_long_integer_type_node; ! 168: ! 169: tree short_unsigned_type_node; ! 170: tree unsigned_type_node; ! 171: tree long_unsigned_type_node; ! 172: tree long_long_unsigned_type_node; ! 173: ! 174: tree ptrdiff_type_node; ! 175: ! 176: tree unsigned_char_type_node; ! 177: tree signed_char_type_node; ! 178: tree char_type_node; ! 179: tree wchar_type_node; ! 180: tree signed_wchar_type_node; ! 181: tree unsigned_wchar_type_node; ! 182: ! 183: tree float_type_node; ! 184: tree double_type_node; ! 185: tree long_double_type_node; ! 186: ! 187: tree intQI_type_node; ! 188: tree intHI_type_node; ! 189: tree intSI_type_node; ! 190: tree intDI_type_node; ! 191: ! 192: tree unsigned_intQI_type_node; ! 193: tree unsigned_intHI_type_node; ! 194: tree unsigned_intSI_type_node; ! 195: tree unsigned_intDI_type_node; ! 196: ! 197: /* a VOID_TYPE node, and the same, packaged in a TREE_LIST. */ ! 198: ! 199: tree void_type_node, void_list_node; ! 200: tree void_zero_node; ! 201: ! 202: /* Nodes for types `void *' and `const void *'. */ ! 203: ! 204: tree ptr_type_node, const_ptr_type_node; ! 205: ! 206: /* Nodes for types `char *' and `const char *'. */ ! 207: ! 208: tree string_type_node, const_string_type_node; ! 209: ! 210: /* Type `char[256]' or something like it. ! 211: Used when an array of char is needed and the size is irrelevant. */ ! 212: ! 213: tree char_array_type_node; ! 214: ! 215: /* Type `int[256]' or something like it. ! 216: Used when an array of int needed and the size is irrelevant. */ ! 217: ! 218: tree int_array_type_node; ! 219: ! 220: /* Type `wchar_t[256]' or something like it. ! 221: Used when a wide string literal is created. */ ! 222: ! 223: tree wchar_array_type_node; ! 224: ! 225: /* type `int ()' -- used for implicit declaration of functions. */ ! 226: ! 227: tree default_function_type; ! 228: ! 229: /* function types `double (double)' and `double (double, double)', etc. */ ! 230: ! 231: tree double_ftype_double, double_ftype_double_double; ! 232: tree int_ftype_int, long_ftype_long; ! 233: ! 234: /* Function type `void (void *, void *, int)' and similar ones. */ ! 235: ! 236: tree void_ftype_ptr_ptr_int, int_ftype_ptr_ptr_int, void_ftype_ptr_int_int; ! 237: ! 238: /* Function type `char *(char *, char *)' and similar ones */ ! 239: tree string_ftype_ptr_ptr, int_ftype_string_string; ! 240: ! 241: /* Function type `size_t (const char *)' */ ! 242: tree sizet_ftype_string; ! 243: ! 244: /* Function type `int (const void *, const void *, size_t)' */ ! 245: tree int_ftype_cptr_cptr_sizet; ! 246: ! 247: /* C++ extensions */ ! 248: tree vtable_entry_type; ! 249: tree __t_desc_type_node, __i_desc_type_node, __m_desc_type_node; ! 250: tree __t_desc_array_type, __i_desc_array_type, __m_desc_array_type; ! 251: tree class_star_type_node; ! 252: tree class_type_node, record_type_node, union_type_node, enum_type_node; ! 253: tree exception_type_node, unknown_type_node; ! 254: tree maybe_gc_cleanup; ! 255: ! 256: /* Used for virtual function tables. */ ! 257: tree vtbl_mask; ! 258: ! 259: /* Array type `(void *)[]' */ ! 260: tree vtbl_type_node; ! 261: ! 262: /* Static decls which do not have static initializers have no ! 263: initializers as far as GNU C is concerned. EMPTY_INIT_NODE ! 264: is a static initializer which makes varasm code place the decl ! 265: in data rather than in bss space. Such gymnastics are necessary ! 266: to avoid the problem that the linker will not include a library ! 267: file if all the library appears to contribute are bss variables. */ ! 268: ! 269: tree empty_init_node; ! 270: ! 271: /* In a destructor, the point at which all derived class destroying ! 272: has been done, just before any base class destroying will be done. */ ! 273: ! 274: tree dtor_label; ! 275: ! 276: /* In a constructor, the point at which we are ready to return ! 277: the pointer to the initialized object. */ ! 278: ! 279: tree ctor_label; ! 280: ! 281: /* A FUNCTION_DECL which can call `unhandled_exception'. ! 282: Not necessarily the one that the user will declare, ! 283: but sufficient to be called by routines that want to abort the program. */ ! 284: ! 285: tree unhandled_exception_fndecl; ! 286: ! 287: /* A FUNCTION_DECL which can call `abort'. Not necessarily the ! 288: one that the user will declare, but sufficient to be called ! 289: by routines that want to abort the program. */ ! 290: ! 291: tree abort_fndecl; ! 292: ! 293: extern rtx cleanup_label, return_label; ! 294: ! 295: /* If original DECL_RESULT of current function was a register, ! 296: but due to being an addressable named return value, would up ! 297: on the stack, this variable holds the named return value's ! 298: original location. */ ! 299: rtx original_result_rtx; ! 300: ! 301: /* Sequence of insns which represents base initialization. */ ! 302: rtx base_init_insns; ! 303: ! 304: /* C++: Keep these around to reduce calls to `get_identifier'. ! 305: Identifiers for `this' in member functions and the auto-delete ! 306: parameter for destructors. */ ! 307: tree this_identifier, in_charge_identifier; ! 308: /* Used in pointer to member functions, and in vtables. */ ! 309: tree pfn_identifier, index_identifier, delta_identifier, delta2_identifier; ! 310: tree pfn_or_delta2_identifier; ! 311: ! 312: /* A list (chain of TREE_LIST nodes) of named label uses. ! 313: The TREE_PURPOSE field is the list of variables defined ! 314: the the label's scope defined at the point of use. ! 315: The TREE_VALUE field is the LABEL_DECL used. ! 316: The TREE_TYPE field holds `current_binding_level' at the ! 317: point of the label's use. ! 318: ! 319: Used only for jumps to as-yet undefined labels, since ! 320: jumps to defined labels can have their validity checked ! 321: by stmt.c. */ ! 322: ! 323: static tree named_label_uses; ! 324: ! 325: /* A list of objects which have constructors or destructors ! 326: which reside in the global scope. The decl is stored in ! 327: the TREE_VALUE slot and the initializer is stored ! 328: in the TREE_PURPOSE slot. */ ! 329: tree static_aggregates; ! 330: ! 331: /* A list of functions which were declared inline, but later had their ! 332: address taken. Used only for non-virtual member functions, since we can ! 333: find other functions easily enough. */ ! 334: tree pending_addressable_inlines; ! 335: ! 336: /* A list of overloaded functions which we should forget ever ! 337: existed, such as functions declared in a function's scope, ! 338: once we leave that function's scope. */ ! 339: static tree overloads_to_forget; ! 340: ! 341: /* -- end of C++ */ ! 342: ! 343: /* Two expressions that are constants with value zero. ! 344: The first is of type `int', the second of type `void *'. */ ! 345: ! 346: tree integer_zero_node; ! 347: tree null_pointer_node; ! 348: ! 349: /* A node for the integer constants 1, 2, and 3. */ ! 350: ! 351: tree integer_one_node, integer_two_node, integer_three_node; ! 352: ! 353: /* Nonzero if we have seen an invalid cross reference ! 354: to a struct, union, or enum, but not yet printed the message. */ ! 355: ! 356: tree pending_invalid_xref; ! 357: /* File and line to appear in the eventual error message. */ ! 358: char *pending_invalid_xref_file; ! 359: int pending_invalid_xref_line; ! 360: ! 361: /* While defining an enum type, this is 1 plus the last enumerator ! 362: constant value. */ ! 363: ! 364: static tree enum_next_value; ! 365: ! 366: /* Parsing a function declarator leaves a list of parameter names ! 367: or a chain or parameter decls here. */ ! 368: ! 369: tree last_function_parms; ! 370: ! 371: /* Parsing a function declarator leaves here a chain of structure ! 372: and enum types declared in the parmlist. */ ! 373: ! 374: static tree last_function_parm_tags; ! 375: ! 376: /* After parsing the declarator that starts a function definition, ! 377: `start_function' puts here the list of parameter names or chain of decls. ! 378: `store_parm_decls' finds it here. */ ! 379: ! 380: static tree current_function_parms; ! 381: ! 382: /* Similar, for last_function_parm_tags. */ ! 383: static tree current_function_parm_tags; ! 384: ! 385: /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function ! 386: that have names. Here so we can clear out their names' definitions ! 387: at the end of the function. */ ! 388: ! 389: static tree named_labels; ! 390: ! 391: /* A list of LABEL_DECLs from outer contexts that are currently shadowed. */ ! 392: ! 393: static tree shadowed_labels; ! 394: ! 395: #if 0 /* Not needed by C++ */ ! 396: /* Nonzero when store_parm_decls is called indicates a varargs function. ! 397: Value not meaningful after store_parm_decls. */ ! 398: ! 399: static int c_function_varargs; ! 400: #endif ! 401: ! 402: /* The FUNCTION_DECL for the function currently being compiled, ! 403: or 0 if between functions. */ ! 404: tree current_function_decl; ! 405: ! 406: /* Set to 0 at beginning of a function definition, set to 1 if ! 407: a return statement that specifies a return value is seen. */ ! 408: ! 409: int current_function_returns_value; ! 410: ! 411: /* Set to 0 at beginning of a function definition, set to 1 if ! 412: a return statement with no argument is seen. */ ! 413: ! 414: int current_function_returns_null; ! 415: ! 416: /* Set to 0 at beginning of a function definition, and whenever ! 417: a label (case or named) is defined. Set to value of expression ! 418: returned from function when that value can be transformed into ! 419: a named return value. */ ! 420: ! 421: tree current_function_return_value; ! 422: ! 423: /* Set to nonzero by `grokdeclarator' for a function ! 424: whose return type is defaulted, if warnings for this are desired. */ ! 425: ! 426: static int warn_about_return_type; ! 427: ! 428: /* Nonzero when starting a function declared `extern inline'. */ ! 429: ! 430: static int current_extern_inline; ! 431: ! 432: /* Nonzero means give `double' the same size as `float'. */ ! 433: ! 434: extern int flag_short_double; ! 435: ! 436: /* Nonzero means don't recognize any builtin functions. */ ! 437: ! 438: extern int flag_no_builtin; ! 439: ! 440: /* Nonzero means do emit exported implementations of functions even if ! 441: they can be inlined. */ ! 442: ! 443: extern int flag_implement_inlines; ! 444: ! 445: /* Nonzero means handle things in ANSI, instead of GNU fashion. This ! 446: flag should be tested for language behavior that's different between ! 447: ANSI and GNU, but not so horrible as to merit a PEDANTIC label. */ ! 448: ! 449: extern int flag_ansi; ! 450: ! 451: /* Pointers to the base and current top of the language name stack. */ ! 452: ! 453: extern tree *current_lang_base, *current_lang_stack; ! 454: ! 455: /* C and C++ flags are in cp-decl2.c. */ ! 456: ! 457: /* Set to 0 at beginning of a constructor, set to 1 ! 458: if that function does an allocation before referencing its ! 459: instance variable. */ ! 460: int current_function_assigns_this; ! 461: int current_function_just_assigned_this; ! 462: ! 463: /* Set to 0 at beginning of a function. Set non-zero when ! 464: store_parm_decls is called. Don't call store_parm_decls ! 465: if this flag is non-zero! */ ! 466: int current_function_parms_stored; ! 467: ! 468: /* Current end of entries in the gc obstack for stack pointer variables. */ ! 469: ! 470: int current_function_obstack_index; ! 471: ! 472: /* Flag saying whether we have used the obstack in this function or not. */ ! 473: ! 474: int current_function_obstack_usage; ! 475: ! 476: /* Flag used when debugging cp-spew.c */ ! 477: ! 478: extern int spew_debug; ! 479: ! 480: /* This is a copy of the class_shadowed list of the previous class binding ! 481: contour when at global scope. It's used to reset IDENTIFIER_CLASS_VALUEs ! 482: when entering another class scope (i.e. a cache miss). */ ! 483: extern tree previous_class_values; ! 484: ! 485: ! 486: ! 487: #ifdef NeXT ! 488: #ifdef HPPA ! 489: extern void add_vararg_func(char *, char); ! 490: #endif ! 491: #endif ! 492: ! 493: /* Allocate a level of searching. */ ! 494: struct stack_level * ! 495: push_decl_level (stack, obstack) ! 496: struct stack_level *stack; ! 497: struct obstack *obstack; ! 498: { ! 499: struct stack_level tem; ! 500: tem.prev = stack; ! 501: ! 502: return push_stack_level (obstack, (char *)&tem, sizeof (tem)); ! 503: } ! 504: ! 505: /* Discard a level of decl allocation. */ ! 506: ! 507: static struct stack_level * ! 508: pop_decl_level (stack) ! 509: struct stack_level *stack; ! 510: { ! 511: #if !NEW_CLASS_SCOPING ! 512: tree *bp, *tp; ! 513: struct obstack *obstack = stack->obstack; ! 514: bp = stack->first; ! 515: tp = (tree *)obstack_next_free (obstack); ! 516: while (tp != bp) ! 517: { ! 518: --tp; ! 519: if (*tp != NULL_TREE) ! 520: IDENTIFIER_CLASS_VALUE (DECL_NAME (*tp)) = NULL_TREE; ! 521: } ! 522: #endif ! 523: return pop_stack_level (stack); ! 524: } ! 525: ! 526: /* For each binding contour we allocate a binding_level structure ! 527: * which records the names defined in that contour. ! 528: * Contours include: ! 529: * 0) the global one ! 530: * 1) one for each function definition, ! 531: * where internal declarations of the parameters appear. ! 532: * 2) one for each compound statement, ! 533: * to record its declarations. ! 534: * ! 535: * The current meaning of a name can be found by searching the levels from ! 536: * the current one out to the global one. ! 537: * ! 538: * Off to the side, may be the class_binding_level. This exists ! 539: * only to catch class-local declarations. It is otherwise ! 540: * nonexistent. ! 541: * ! 542: * Also there may be binding levels that catch cleanups that ! 543: * must be run when exceptions occur. ! 544: */ ! 545: ! 546: /* Note that the information in the `names' component of the global contour ! 547: is duplicated in the IDENTIFIER_GLOBAL_VALUEs of all identifiers. */ ! 548: ! 549: struct binding_level ! 550: { ! 551: /* A chain of _DECL nodes for all variables, constants, functions, ! 552: * and typedef types. These are in the reverse of the order supplied. ! 553: */ ! 554: tree names; ! 555: ! 556: /* A list of structure, union and enum definitions, ! 557: * for looking up tag names. ! 558: * It is a chain of TREE_LIST nodes, each of whose TREE_PURPOSE is a name, ! 559: * or NULL_TREE; and whose TREE_VALUE is a RECORD_TYPE, UNION_TYPE, ! 560: * or ENUMERAL_TYPE node. ! 561: * ! 562: * C++: the TREE_VALUE nodes can be simple types for component_bindings. ! 563: * ! 564: */ ! 565: tree tags; ! 566: ! 567: /* For each level, a list of shadowed outer-level local definitions ! 568: to be restored when this level is popped. ! 569: Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and ! 570: whose TREE_VALUE is its old definition (a kind of ..._DECL node). */ ! 571: tree shadowed; ! 572: ! 573: /* Same, for IDENTIFIER_CLASS_VALUE. */ ! 574: tree class_shadowed; ! 575: ! 576: /* Same, for IDENTIFIER_TYPE_VALUE. */ ! 577: tree type_shadowed; ! 578: ! 579: /* For each level (except not the global one), ! 580: a chain of BLOCK nodes for all the levels ! 581: that were entered and exited one level down. */ ! 582: tree blocks; ! 583: ! 584: /* The BLOCK node for this level, if one has been preallocated. ! 585: If 0, the BLOCK is allocated (if needed) when the level is popped. */ ! 586: tree this_block; ! 587: ! 588: /* The binding level which this one is contained in (inherits from). */ ! 589: struct binding_level *level_chain; ! 590: ! 591: /* Number of decls in `names' that have incomplete ! 592: structure or union types. */ ! 593: unsigned short n_incomplete; ! 594: ! 595: /* 1 for the level that holds the parameters of a function. ! 596: 2 for the level that holds a class declaration. ! 597: 3 for levels that hold parameter declarations. */ ! 598: unsigned parm_flag : 4; ! 599: ! 600: /* 1 means make a BLOCK for this level regardless of all else. ! 601: 2 for temporary binding contours created by the compiler. */ ! 602: unsigned keep : 3; ! 603: ! 604: /* Nonzero if this level "doesn't exist" for tags. */ ! 605: unsigned tag_transparent : 1; ! 606: ! 607: /* Nonzero if this level can safely have additional ! 608: cleanup-needing variables added to it. */ ! 609: unsigned more_cleanups_ok : 1; ! 610: unsigned have_cleanups : 1; ! 611: ! 612: /* Nonzero if this level can safely have additional ! 613: exception-raising statements added to it. */ ! 614: unsigned more_exceptions_ok : 1; ! 615: unsigned have_exceptions : 1; ! 616: ! 617: /* Nonzero if we should accept any name as an identifier in ! 618: this scope. This happens in some template definitions. */ ! 619: unsigned accept_any : 1; ! 620: ! 621: /* Nonzero if this level is for completing a template class definition ! 622: inside a binding level that temporarily binds the parameters. This ! 623: means that definitions here should not be popped off when unwinding ! 624: this binding level. (Not actually implemented this way, ! 625: unfortunately.) */ ! 626: unsigned pseudo_global : 1; ! 627: ! 628: /* Two bits left for this word. */ ! 629: ! 630: #if defined(DEBUG_CP_BINDING_LEVELS) ! 631: /* Binding depth at which this level began. */ ! 632: unsigned binding_depth; ! 633: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */ ! 634: }; ! 635: ! 636: #define NULL_BINDING_LEVEL ((struct binding_level *) NULL) ! 637: ! 638: /* The binding level currently in effect. */ ! 639: ! 640: static struct binding_level *current_binding_level; ! 641: ! 642: /* The binding level of the current class, if any. */ ! 643: ! 644: static struct binding_level *class_binding_level; ! 645: ! 646: /* A chain of binding_level structures awaiting reuse. */ ! 647: ! 648: static struct binding_level *free_binding_level; ! 649: ! 650: /* The outermost binding level, for names of file scope. ! 651: This is created when the compiler is started and exists ! 652: through the entire run. */ ! 653: ! 654: static struct binding_level *global_binding_level; ! 655: ! 656: /* Binding level structures are initialized by copying this one. */ ! 657: ! 658: static struct binding_level clear_binding_level; ! 659: ! 660: /* Nonzero means unconditionally make a BLOCK for the next level pushed. */ ! 661: ! 662: static int keep_next_level_flag; ! 663: ! 664: #if defined(DEBUG_CP_BINDING_LEVELS) ! 665: static int binding_depth = 0; ! 666: static int is_class_level = 0; ! 667: ! 668: static void ! 669: indent () ! 670: { ! 671: register unsigned i; ! 672: ! 673: for (i = 0; i < binding_depth*2; i++) ! 674: putc (' ', stderr); ! 675: } ! 676: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */ ! 677: ! 678: static void ! 679: push_binding_level (newlevel, tag_transparent, keep) ! 680: struct binding_level *newlevel; ! 681: int tag_transparent, keep; ! 682: { ! 683: /* Add this level to the front of the chain (stack) of levels that ! 684: are active. */ ! 685: *newlevel = clear_binding_level; ! 686: if (class_binding_level) ! 687: { ! 688: newlevel->level_chain = class_binding_level; ! 689: class_binding_level = (struct binding_level *)0; ! 690: } ! 691: else ! 692: { ! 693: newlevel->level_chain = current_binding_level; ! 694: } ! 695: current_binding_level = newlevel; ! 696: newlevel->tag_transparent = tag_transparent; ! 697: newlevel->more_cleanups_ok = 1; ! 698: newlevel->more_exceptions_ok = 1; ! 699: newlevel->keep = keep; ! 700: #if defined(DEBUG_CP_BINDING_LEVELS) ! 701: newlevel->binding_depth = binding_depth; ! 702: indent (); ! 703: fprintf (stderr, "push %s level 0x%08x line %d\n", ! 704: (is_class_level) ? "class" : "block", newlevel, lineno); ! 705: is_class_level = 0; ! 706: binding_depth++; ! 707: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */ ! 708: } ! 709: ! 710: static void ! 711: pop_binding_level () ! 712: { ! 713: if (class_binding_level) ! 714: current_binding_level = class_binding_level; ! 715: ! 716: if (global_binding_level) ! 717: { ! 718: /* cannot pop a level, if there are none left to pop. */ ! 719: if (current_binding_level == global_binding_level) ! 720: my_friendly_abort (123); ! 721: } ! 722: /* Pop the current level, and free the structure for reuse. */ ! 723: #if defined(DEBUG_CP_BINDING_LEVELS) ! 724: binding_depth--; ! 725: indent (); ! 726: fprintf (stderr, "pop %s level 0x%08x line %d\n", ! 727: (is_class_level) ? "class" : "block", ! 728: current_binding_level, lineno); ! 729: if (is_class_level != (current_binding_level == class_binding_level)) ! 730: #if 0 /* XXX Don't abort when we're watching how things are being managed. */ ! 731: abort (); ! 732: #else ! 733: { ! 734: indent (); ! 735: fprintf (stderr, "XXX is_class_level != (current_binding_level == class_binding_level)\n"); ! 736: } ! 737: #endif ! 738: is_class_level = 0; ! 739: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */ ! 740: { ! 741: register struct binding_level *level = current_binding_level; ! 742: current_binding_level = current_binding_level->level_chain; ! 743: level->level_chain = free_binding_level; ! 744: #if 0 /* defined(DEBUG_CP_BINDING_LEVELS) */ ! 745: if (level->binding_depth != binding_depth) ! 746: abort (); ! 747: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */ ! 748: free_binding_level = level; ! 749: ! 750: class_binding_level = current_binding_level; ! 751: if (class_binding_level->parm_flag != 2) ! 752: class_binding_level = 0; ! 753: while (current_binding_level->parm_flag == 2) ! 754: current_binding_level = current_binding_level->level_chain; ! 755: } ! 756: } ! 757: ! 758: /* Nonzero if we are currently in the global binding level. */ ! 759: ! 760: int ! 761: global_bindings_p () ! 762: { ! 763: return current_binding_level == global_binding_level; ! 764: } ! 765: ! 766: void ! 767: keep_next_level () ! 768: { ! 769: keep_next_level_flag = 1; ! 770: } ! 771: ! 772: /* Nonzero if the current level needs to have a BLOCK made. */ ! 773: ! 774: int ! 775: kept_level_p () ! 776: { ! 777: return (current_binding_level->blocks != NULL_TREE ! 778: || current_binding_level->keep ! 779: || current_binding_level->names != NULL_TREE ! 780: || (current_binding_level->tags != NULL_TREE ! 781: && !current_binding_level->tag_transparent)); ! 782: } ! 783: ! 784: /* Identify this binding level as a level of parameters. */ ! 785: ! 786: void ! 787: declare_parm_level () ! 788: { ! 789: current_binding_level->parm_flag = 1; ! 790: } ! 791: ! 792: /* Identify this binding level as a level of a default exception handler. */ ! 793: ! 794: void ! 795: declare_implicit_exception () ! 796: { ! 797: current_binding_level->parm_flag = 3; ! 798: } ! 799: ! 800: /* Nonzero if current binding contour contains expressions ! 801: that might raise exceptions. */ ! 802: ! 803: int ! 804: have_exceptions_p () ! 805: { ! 806: return current_binding_level->have_exceptions; ! 807: } ! 808: ! 809: void ! 810: declare_uninstantiated_type_level () ! 811: { ! 812: current_binding_level->accept_any = 1; ! 813: } ! 814: ! 815: int ! 816: uninstantiated_type_level_p () ! 817: { ! 818: return current_binding_level->accept_any; ! 819: } ! 820: ! 821: void ! 822: declare_pseudo_global_level () ! 823: { ! 824: current_binding_level->pseudo_global = 1; ! 825: } ! 826: ! 827: int ! 828: pseudo_global_level_p () ! 829: { ! 830: return current_binding_level->pseudo_global; ! 831: } ! 832: ! 833: void ! 834: set_class_shadows (shadows) ! 835: tree shadows; ! 836: { ! 837: class_binding_level->class_shadowed = shadows; ! 838: } ! 839: ! 840: /* Enter a new binding level. ! 841: If TAG_TRANSPARENT is nonzero, do so only for the name space of variables, ! 842: not for that of tags. */ ! 843: ! 844: void ! 845: pushlevel (tag_transparent) ! 846: int tag_transparent; ! 847: { ! 848: register struct binding_level *newlevel = NULL_BINDING_LEVEL; ! 849: ! 850: /* If this is the top level of a function, ! 851: just make sure that NAMED_LABELS is 0. ! 852: They should have been set to 0 at the end of the previous function. */ ! 853: ! 854: if (current_binding_level == global_binding_level) ! 855: my_friendly_assert (named_labels == NULL_TREE, 134); ! 856: ! 857: /* Reuse or create a struct for this binding level. */ ! 858: ! 859: #if defined(DEBUG_CP_BINDING_LEVELS) ! 860: if (0) ! 861: #else /* !defined(DEBUG_CP_BINDING_LEVELS) */ ! 862: if (free_binding_level) ! 863: #endif /* !defined(DEBUG_CP_BINDING_LEVELS) */ ! 864: { ! 865: newlevel = free_binding_level; ! 866: free_binding_level = free_binding_level->level_chain; ! 867: } ! 868: else ! 869: { ! 870: /* Create a new `struct binding_level'. */ ! 871: newlevel = (struct binding_level *) xmalloc (sizeof (struct binding_level)); ! 872: } ! 873: push_binding_level (newlevel, tag_transparent, keep_next_level_flag); ! 874: GNU_xref_start_scope ((HOST_WIDE_INT) newlevel); ! 875: keep_next_level_flag = 0; ! 876: } ! 877: ! 878: void ! 879: pushlevel_temporary (tag_transparent) ! 880: int tag_transparent; ! 881: { ! 882: pushlevel (tag_transparent); ! 883: current_binding_level->keep = 2; ! 884: clear_last_expr (); ! 885: ! 886: /* Note we don't call push_momentary() here. Otherwise, it would cause ! 887: cleanups to be allocated on the momentary obstack, and they will be ! 888: overwritten by the next statement. */ ! 889: ! 890: expand_start_bindings (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 == 1, 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 KEEP == 2, this level's subblocks go to the front, ! 902: not the back of the current binding level. This happens, ! 903: for instance, when code for constructors and destructors ! 904: need to generate code at the end of a function which must ! 905: be moved up to the front of the function. ! 906: ! 907: If FUNCTIONBODY is nonzero, this level is the body of a function, ! 908: so create a block as if KEEP were set and also clear out all ! 909: label names. ! 910: ! 911: If REVERSE is nonzero, reverse the order of decls before putting ! 912: them into the BLOCK. */ ! 913: ! 914: tree ! 915: poplevel (keep, reverse, functionbody) ! 916: int keep; ! 917: int reverse; ! 918: int functionbody; ! 919: { ! 920: register tree link; ! 921: /* The chain of decls was accumulated in reverse order. ! 922: Put it into forward order, just for cleanliness. */ ! 923: tree decls; ! 924: int tmp = functionbody; ! 925: int implicit_try_block = current_binding_level->parm_flag == 3; ! 926: int real_functionbody = current_binding_level->keep == 2 ! 927: ? ((functionbody = 0), tmp) : functionbody; ! 928: tree tags = functionbody >= 0 ? current_binding_level->tags : 0; ! 929: tree subblocks = functionbody >= 0 ? current_binding_level->blocks : 0; ! 930: tree block = NULL_TREE; ! 931: tree decl; ! 932: int block_previously_created; ! 933: ! 934: GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level, ! 935: (HOST_WIDE_INT) current_binding_level->level_chain, ! 936: current_binding_level->parm_flag, ! 937: current_binding_level->keep, ! 938: current_binding_level->tag_transparent); ! 939: ! 940: if (current_binding_level->keep == 1) ! 941: keep = 1; ! 942: ! 943: /* This warning is turned off because it causes warnings for ! 944: declarations like `extern struct foo *x'. */ ! 945: #if 0 ! 946: /* Warn about incomplete structure types in this level. */ ! 947: for (link = tags; link; link = TREE_CHAIN (link)) ! 948: if (TYPE_SIZE (TREE_VALUE (link)) == NULL_TREE) ! 949: { ! 950: tree type = TREE_VALUE (link); ! 951: char *errmsg; ! 952: switch (TREE_CODE (type)) ! 953: { ! 954: case RECORD_TYPE: ! 955: errmsg = "`struct %s' incomplete in scope ending here"; ! 956: break; ! 957: case UNION_TYPE: ! 958: errmsg = "`union %s' incomplete in scope ending here"; ! 959: break; ! 960: case ENUMERAL_TYPE: ! 961: errmsg = "`enum %s' incomplete in scope ending here"; ! 962: break; ! 963: } ! 964: if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE) ! 965: error (errmsg, IDENTIFIER_POINTER (TYPE_NAME (type))); ! 966: else ! 967: /* If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL. */ ! 968: error (errmsg, TYPE_NAME_STRING (type)); ! 969: } ! 970: #endif /* 0 */ ! 971: ! 972: /* Get the decls in the order they were written. ! 973: Usually current_binding_level->names is in reverse order. ! 974: But parameter decls were previously put in forward order. */ ! 975: ! 976: if (reverse) ! 977: current_binding_level->names ! 978: = decls = nreverse (current_binding_level->names); ! 979: else ! 980: decls = current_binding_level->names; ! 981: ! 982: /* Output any nested inline functions within this block ! 983: if they weren't already output. */ ! 984: ! 985: for (decl = decls; decl; decl = TREE_CHAIN (decl)) ! 986: if (TREE_CODE (decl) == FUNCTION_DECL ! 987: && ! TREE_ASM_WRITTEN (decl) ! 988: && DECL_INITIAL (decl) != NULL_TREE ! 989: && TREE_ADDRESSABLE (decl)) ! 990: { ! 991: /* If this decl was copied from a file-scope decl ! 992: on account of a block-scope extern decl, ! 993: propagate TREE_ADDRESSABLE to the file-scope decl. */ ! 994: if (DECL_ABSTRACT_ORIGIN (decl) != NULL_TREE) ! 995: TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1; ! 996: else ! 997: { ! 998: push_function_context (); ! 999: output_inline_function (decl); ! 1000: pop_function_context (); ! 1001: } ! 1002: } ! 1003: ! 1004: /* If there were any declarations or structure tags in that level, ! 1005: or if this level is a function body, ! 1006: create a BLOCK to record them for the life of this function. */ ! 1007: ! 1008: block = NULL_TREE; ! 1009: block_previously_created = (current_binding_level->this_block != NULL_TREE); ! 1010: if (block_previously_created) ! 1011: block = current_binding_level->this_block; ! 1012: else if (keep == 1 || functionbody) ! 1013: block = make_node (BLOCK); ! 1014: if (block != NULL_TREE) ! 1015: { ! 1016: BLOCK_VARS (block) = decls; ! 1017: BLOCK_TYPE_TAGS (block) = tags; ! 1018: BLOCK_SUBBLOCKS (block) = subblocks; ! 1019: /* If we created the block earlier on, and we are just diddling it now, ! 1020: then it already should have a proper BLOCK_END_NOTE value associated ! 1021: with it, so avoid trashing that. Otherwise, for a new block, install ! 1022: a new BLOCK_END_NOTE value. */ ! 1023: if (! block_previously_created) ! 1024: remember_end_note (block); ! 1025: } ! 1026: ! 1027: /* In each subblock, record that this is its superior. */ ! 1028: ! 1029: if (keep >= 0) ! 1030: for (link = subblocks; link; link = TREE_CHAIN (link)) ! 1031: BLOCK_SUPERCONTEXT (link) = block; ! 1032: ! 1033: /* Clear out the meanings of the local variables of this level. */ ! 1034: ! 1035: for (link = decls; link; link = TREE_CHAIN (link)) ! 1036: { ! 1037: if (DECL_NAME (link) != NULL_TREE) ! 1038: { ! 1039: /* If the ident. was used or addressed via a local extern decl, ! 1040: don't forget that fact. */ ! 1041: if (DECL_EXTERNAL (link)) ! 1042: { ! 1043: if (TREE_USED (link)) ! 1044: TREE_USED (DECL_ASSEMBLER_NAME (link)) = 1; ! 1045: if (TREE_ADDRESSABLE (link)) ! 1046: TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1; ! 1047: } ! 1048: IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = NULL_TREE; ! 1049: } ! 1050: } ! 1051: ! 1052: /* Restore all name-meanings of the outer levels ! 1053: that were shadowed by this level. */ ! 1054: ! 1055: for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link)) ! 1056: IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link); ! 1057: for (link = current_binding_level->class_shadowed; ! 1058: link; link = TREE_CHAIN (link)) ! 1059: IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link); ! 1060: for (link = current_binding_level->type_shadowed; ! 1061: link; link = TREE_CHAIN (link)) ! 1062: IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link); ! 1063: ! 1064: /* If the level being exited is the top level of a function, ! 1065: check over all the labels. */ ! 1066: ! 1067: if (functionbody) ! 1068: { ! 1069: /* If this is the top level block of a function, ! 1070: the vars are the function's parameters. ! 1071: Don't leave them in the BLOCK because they are ! 1072: found in the FUNCTION_DECL instead. */ ! 1073: ! 1074: BLOCK_VARS (block) = 0; ! 1075: ! 1076: /* Clear out the definitions of all label names, ! 1077: since their scopes end here. */ ! 1078: ! 1079: for (link = named_labels; link; link = TREE_CHAIN (link)) ! 1080: { ! 1081: register tree label = TREE_VALUE (link); ! 1082: ! 1083: if (DECL_INITIAL (label) == NULL_TREE) ! 1084: { ! 1085: cp_error_at ("label `%D' used but not defined", label); ! 1086: /* Avoid crashing later. */ ! 1087: define_label (input_filename, 1, DECL_NAME (label)); ! 1088: } ! 1089: else if (warn_unused && !TREE_USED (label)) ! 1090: cp_warning_at ("label `%D' defined but not used", label); ! 1091: SET_IDENTIFIER_LABEL_VALUE (DECL_NAME (label), NULL_TREE); ! 1092: ! 1093: /* Put the labels into the "variables" of the ! 1094: top-level block, so debugger can see them. */ ! 1095: TREE_CHAIN (label) = BLOCK_VARS (block); ! 1096: BLOCK_VARS (block) = label; ! 1097: } ! 1098: ! 1099: named_labels = NULL_TREE; ! 1100: } ! 1101: ! 1102: /* Any uses of undefined labels now operate under constraints ! 1103: of next binding contour. */ ! 1104: { ! 1105: struct binding_level *level_chain; ! 1106: level_chain = current_binding_level->level_chain; ! 1107: if (level_chain) ! 1108: { ! 1109: tree labels; ! 1110: for (labels = named_label_uses; labels; labels = TREE_CHAIN (labels)) ! 1111: if (TREE_TYPE (labels) == (tree)current_binding_level) ! 1112: { ! 1113: TREE_TYPE (labels) = (tree)level_chain; ! 1114: TREE_PURPOSE (labels) = level_chain->names; ! 1115: } ! 1116: } ! 1117: } ! 1118: ! 1119: tmp = current_binding_level->keep; ! 1120: ! 1121: pop_binding_level (); ! 1122: if (functionbody) ! 1123: DECL_INITIAL (current_function_decl) = block; ! 1124: else if (block) ! 1125: { ! 1126: if (!block_previously_created) ! 1127: current_binding_level->blocks ! 1128: = chainon (current_binding_level->blocks, block); ! 1129: } ! 1130: /* If we did not make a block for the level just exited, ! 1131: any blocks made for inner levels ! 1132: (since they cannot be recorded as subblocks in that level) ! 1133: must be carried forward so they will later become subblocks ! 1134: of something else. */ ! 1135: else if (subblocks) ! 1136: { ! 1137: if (keep == 2) ! 1138: current_binding_level->blocks ! 1139: = chainon (subblocks, current_binding_level->blocks); ! 1140: else ! 1141: current_binding_level->blocks ! 1142: = chainon (current_binding_level->blocks, subblocks); ! 1143: } ! 1144: ! 1145: /* Take care of compiler's internal binding structures. */ ! 1146: if (tmp == 2 && !implicit_try_block) ! 1147: { ! 1148: #if 0 ! 1149: /* We did not call push_momentary for this ! 1150: binding contour, so there is nothing to pop. */ ! 1151: pop_momentary (); ! 1152: #endif ! 1153: expand_end_bindings (getdecls (), keep, 1); ! 1154: /* Each and every BLOCK node created here in `poplevel' is important ! 1155: (e.g. for proper debugging information) so if we created one ! 1156: earlier, mark it as "used". */ ! 1157: if (block) ! 1158: TREE_USED (block) = 1; ! 1159: block = poplevel (keep, reverse, real_functionbody); ! 1160: } ! 1161: ! 1162: /* Each and every BLOCK node created here in `poplevel' is important ! 1163: (e.g. for proper debugging information) so if we created one ! 1164: earlier, mark it as "used". */ ! 1165: if (block) ! 1166: TREE_USED (block) = 1; ! 1167: return block; ! 1168: } ! 1169: ! 1170: /* Delete the node BLOCK from the current binding level. ! 1171: This is used for the block inside a stmt expr ({...}) ! 1172: so that the block can be reinserted where appropriate. */ ! 1173: ! 1174: void ! 1175: delete_block (block) ! 1176: tree block; ! 1177: { ! 1178: tree t; ! 1179: if (current_binding_level->blocks == block) ! 1180: current_binding_level->blocks = TREE_CHAIN (block); ! 1181: for (t = current_binding_level->blocks; t;) ! 1182: { ! 1183: if (TREE_CHAIN (t) == block) ! 1184: TREE_CHAIN (t) = TREE_CHAIN (block); ! 1185: else ! 1186: t = TREE_CHAIN (t); ! 1187: } ! 1188: TREE_CHAIN (block) = NULL_TREE; ! 1189: /* Clear TREE_USED which is always set by poplevel. ! 1190: The flag is set again if insert_block is called. */ ! 1191: TREE_USED (block) = 0; ! 1192: } ! 1193: ! 1194: /* Insert BLOCK at the end of the list of subblocks of the ! 1195: current binding level. This is used when a BIND_EXPR is expanded, ! 1196: to handle the BLOCK node inside the BIND_EXPR. */ ! 1197: ! 1198: void ! 1199: insert_block (block) ! 1200: tree block; ! 1201: { ! 1202: TREE_USED (block) = 1; ! 1203: current_binding_level->blocks ! 1204: = chainon (current_binding_level->blocks, block); ! 1205: } ! 1206: ! 1207: /* Add BLOCK to the current list of blocks for this binding contour. */ ! 1208: void ! 1209: add_block_current_level (block) ! 1210: tree block; ! 1211: { ! 1212: current_binding_level->blocks ! 1213: = chainon (current_binding_level->blocks, block); ! 1214: } ! 1215: ! 1216: /* Set the BLOCK node for the innermost scope ! 1217: (the one we are currently in). */ ! 1218: ! 1219: void ! 1220: set_block (block) ! 1221: register tree block; ! 1222: { ! 1223: current_binding_level->this_block = block; ! 1224: } ! 1225: ! 1226: /* Do a pushlevel for class declarations. */ ! 1227: void ! 1228: pushlevel_class () ! 1229: { ! 1230: register struct binding_level *newlevel; ! 1231: ! 1232: /* Reuse or create a struct for this binding level. */ ! 1233: #if defined(DEBUG_CP_BINDING_LEVELS) ! 1234: if (0) ! 1235: #else /* !defined(DEBUG_CP_BINDING_LEVELS) */ ! 1236: if (free_binding_level) ! 1237: #endif /* !defined(DEBUG_CP_BINDING_LEVELS) */ ! 1238: { ! 1239: newlevel = free_binding_level; ! 1240: free_binding_level = free_binding_level->level_chain; ! 1241: } ! 1242: else ! 1243: { ! 1244: /* Create a new `struct binding_level'. */ ! 1245: newlevel = (struct binding_level *) xmalloc (sizeof (struct binding_level)); ! 1246: } ! 1247: ! 1248: #if defined(DEBUG_CP_BINDING_LEVELS) ! 1249: is_class_level = 1; ! 1250: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */ ! 1251: ! 1252: push_binding_level (newlevel, 0, 0); ! 1253: ! 1254: decl_stack = push_decl_level (decl_stack, &decl_obstack); ! 1255: class_binding_level = current_binding_level; ! 1256: class_binding_level->parm_flag = 2; ! 1257: /* We have just pushed into a new binding level. Now, fake out the rest ! 1258: of the compiler. Set the `current_binding_level' back to point to ! 1259: the most closely containing non-class binding level. */ ! 1260: do ! 1261: { ! 1262: current_binding_level = current_binding_level->level_chain; ! 1263: } ! 1264: while (current_binding_level->parm_flag == 2); ! 1265: } ! 1266: ! 1267: /* ...and a poplevel for class declarations. */ ! 1268: tree ! 1269: poplevel_class () ! 1270: { ! 1271: register struct binding_level *level = class_binding_level; ! 1272: tree block = NULL_TREE; ! 1273: tree shadowed; ! 1274: ! 1275: my_friendly_assert (level != 0, 354); ! 1276: ! 1277: decl_stack = pop_decl_level (decl_stack); ! 1278: #if !NEW_CLASS_SCOPING ! 1279: for (shadowed = level->shadowed; shadowed; shadowed = TREE_CHAIN (shadowed)) ! 1280: IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed); ! 1281: for (shadowed = level->class_shadowed; shadowed; shadowed = TREE_CHAIN (shadowed)) ! 1282: IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed); ! 1283: for (shadowed = level->type_shadowed; shadowed; shadowed = TREE_CHAIN (shadowed)) ! 1284: IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed); ! 1285: #else ! 1286: for (shadowed = level->shadowed; shadowed; shadowed = TREE_CHAIN (shadowed)) ! 1287: IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed); ! 1288: /* If we're leaving a toplevel class, don't bother to do the setting ! 1289: of IDENTIFER_CLASS_VALUE to NULL_TREE, since first of all this slot ! 1290: shouldn't even be used when current_class_type isn't set, and second, ! 1291: if we don't touch it here, we're able to use the caching effect if the ! 1292: next time we're entering a class scope, it is the same class. */ ! 1293: if (current_class_depth != 1) ! 1294: for (shadowed = level->class_shadowed; ! 1295: shadowed; ! 1296: shadowed = TREE_CHAIN (shadowed)) ! 1297: IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed); ! 1298: else ! 1299: /* Remember to save what IDENTIFIER's were bound in this scope so we ! 1300: can recover from cache misses. */ ! 1301: previous_class_values = class_binding_level->class_shadowed; ! 1302: for (shadowed = level->type_shadowed; ! 1303: shadowed; ! 1304: shadowed = TREE_CHAIN (shadowed)) ! 1305: IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (shadowed)) = TREE_VALUE (shadowed); ! 1306: #endif ! 1307: ! 1308: GNU_xref_end_scope ((HOST_WIDE_INT) class_binding_level, ! 1309: (HOST_WIDE_INT) class_binding_level->level_chain, ! 1310: class_binding_level->parm_flag, ! 1311: class_binding_level->keep, ! 1312: class_binding_level->tag_transparent); ! 1313: ! 1314: if (class_binding_level->parm_flag != 2) ! 1315: class_binding_level = (struct binding_level *)0; ! 1316: ! 1317: /* Now, pop out of the the binding level which we created up in the ! 1318: `pushlevel_class' routine. */ ! 1319: #if defined(DEBUG_CP_BINDING_LEVELS) ! 1320: is_class_level = 1; ! 1321: #endif /* defined(DEBUG_CP_BINDING_LEVELS) */ ! 1322: ! 1323: pop_binding_level (); ! 1324: ! 1325: return block; ! 1326: } ! 1327: ! 1328: /* For debugging. */ ! 1329: int no_print_functions = 0; ! 1330: int no_print_builtins = 0; ! 1331: ! 1332: void ! 1333: print_binding_level (lvl) ! 1334: struct binding_level *lvl; ! 1335: { ! 1336: tree t; ! 1337: int i = 0, len; ! 1338: fprintf (stderr, " blocks="); ! 1339: fprintf (stderr, HOST_PTR_PRINTF, lvl->blocks); ! 1340: fprintf (stderr, " n_incomplete=%d parm_flag=%d keep=%d", ! 1341: lvl->n_incomplete, lvl->parm_flag, lvl->keep); ! 1342: if (lvl->tag_transparent) ! 1343: fprintf (stderr, " tag-transparent"); ! 1344: if (lvl->more_cleanups_ok) ! 1345: fprintf (stderr, " more-cleanups-ok"); ! 1346: if (lvl->have_cleanups) ! 1347: fprintf (stderr, " have-cleanups"); ! 1348: if (lvl->more_exceptions_ok) ! 1349: fprintf (stderr, " more-exceptions-ok"); ! 1350: if (lvl->have_exceptions) ! 1351: fprintf (stderr, " have-exceptions"); ! 1352: fprintf (stderr, "\n"); ! 1353: if (lvl->names) ! 1354: { ! 1355: fprintf (stderr, " names:\t"); ! 1356: /* We can probably fit 3 names to a line? */ ! 1357: for (t = lvl->names; t; t = TREE_CHAIN (t)) ! 1358: { ! 1359: if (no_print_functions && (TREE_CODE(t) == FUNCTION_DECL)) ! 1360: continue; ! 1361: if (no_print_builtins ! 1362: && (TREE_CODE(t) == TYPE_DECL) ! 1363: && (!strcmp(DECL_SOURCE_FILE(t),"<built-in>"))) ! 1364: continue; ! 1365: ! 1366: /* Function decls tend to have longer names. */ ! 1367: if (TREE_CODE (t) == FUNCTION_DECL) ! 1368: len = 3; ! 1369: else ! 1370: len = 2; ! 1371: i += len; ! 1372: if (i > 6) ! 1373: { ! 1374: fprintf (stderr, "\n\t"); ! 1375: i = len; ! 1376: } ! 1377: print_node_brief (stderr, "", t, 0); ! 1378: if (TREE_CODE (t) == ERROR_MARK) ! 1379: break; ! 1380: } ! 1381: if (i) ! 1382: fprintf (stderr, "\n"); ! 1383: } ! 1384: if (lvl->tags) ! 1385: { ! 1386: fprintf (stderr, " tags:\t"); ! 1387: i = 0; ! 1388: for (t = lvl->tags; t; t = TREE_CHAIN (t)) ! 1389: { ! 1390: if (TREE_PURPOSE (t) == NULL_TREE) ! 1391: len = 3; ! 1392: else if (TREE_PURPOSE (t) == TYPE_IDENTIFIER (TREE_VALUE (t))) ! 1393: len = 2; ! 1394: else ! 1395: len = 4; ! 1396: i += len; ! 1397: if (i > 5) ! 1398: { ! 1399: fprintf (stderr, "\n\t"); ! 1400: i = len; ! 1401: } ! 1402: if (TREE_PURPOSE (t) == NULL_TREE) ! 1403: { ! 1404: print_node_brief (stderr, "<unnamed-typedef", TREE_VALUE (t), 0); ! 1405: fprintf (stderr, ">"); ! 1406: } ! 1407: else if (TREE_PURPOSE (t) == TYPE_IDENTIFIER (TREE_VALUE (t))) ! 1408: print_node_brief (stderr, "", TREE_VALUE (t), 0); ! 1409: else ! 1410: { ! 1411: print_node_brief (stderr, "<typedef", TREE_PURPOSE (t), 0); ! 1412: print_node_brief (stderr, "", TREE_VALUE (t), 0); ! 1413: fprintf (stderr, ">"); ! 1414: } ! 1415: } ! 1416: if (i) ! 1417: fprintf (stderr, "\n"); ! 1418: } ! 1419: if (lvl->shadowed) ! 1420: { ! 1421: fprintf (stderr, " shadowed:"); ! 1422: for (t = lvl->shadowed; t; t = TREE_CHAIN (t)) ! 1423: { ! 1424: fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t))); ! 1425: } ! 1426: fprintf (stderr, "\n"); ! 1427: } ! 1428: if (lvl->class_shadowed) ! 1429: { ! 1430: fprintf (stderr, " class-shadowed:"); ! 1431: for (t = lvl->class_shadowed; t; t = TREE_CHAIN (t)) ! 1432: { ! 1433: fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t))); ! 1434: } ! 1435: fprintf (stderr, "\n"); ! 1436: } ! 1437: if (lvl->type_shadowed) ! 1438: { ! 1439: fprintf (stderr, " type-shadowed:"); ! 1440: for (t = lvl->type_shadowed; t; t = TREE_CHAIN (t)) ! 1441: { ! 1442: #if 0 ! 1443: fprintf (stderr, "\n\t"); ! 1444: print_node_brief (stderr, "<", TREE_PURPOSE (t), 0); ! 1445: if (TREE_VALUE (t)) ! 1446: print_node_brief (stderr, " ", TREE_VALUE (t), 0); ! 1447: else ! 1448: fprintf (stderr, " (none)"); ! 1449: fprintf (stderr, ">"); ! 1450: #else ! 1451: fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t))); ! 1452: #endif ! 1453: } ! 1454: fprintf (stderr, "\n"); ! 1455: } ! 1456: } ! 1457: ! 1458: void ! 1459: print_other_binding_stack (stack) ! 1460: struct binding_level *stack; ! 1461: { ! 1462: struct binding_level *level; ! 1463: for (level = stack; level != global_binding_level; level = level->level_chain) ! 1464: { ! 1465: fprintf (stderr, "binding level "); ! 1466: fprintf (stderr, HOST_PTR_PRINTF, level); ! 1467: fprintf (stderr, "\n"); ! 1468: print_binding_level (level); ! 1469: } ! 1470: } ! 1471: ! 1472: void ! 1473: print_binding_stack () ! 1474: { ! 1475: struct binding_level *b; ! 1476: fprintf (stderr, "current_binding_level="); ! 1477: fprintf (stderr, HOST_PTR_PRINTF, current_binding_level); ! 1478: fprintf (stderr, "\nclass_binding_level="); ! 1479: fprintf (stderr, HOST_PTR_PRINTF, class_binding_level); ! 1480: fprintf (stderr, "\nglobal_binding_level="); ! 1481: fprintf (stderr, HOST_PTR_PRINTF, global_binding_level); ! 1482: fprintf (stderr, "\n"); ! 1483: if (class_binding_level) ! 1484: { ! 1485: for (b = class_binding_level; b; b = b->level_chain) ! 1486: if (b == current_binding_level) ! 1487: break; ! 1488: if (b) ! 1489: b = class_binding_level; ! 1490: else ! 1491: b = current_binding_level; ! 1492: } ! 1493: else ! 1494: b = current_binding_level; ! 1495: print_other_binding_stack (b); ! 1496: fprintf (stderr, "global:\n"); ! 1497: print_binding_level (global_binding_level); ! 1498: } ! 1499: ! 1500: /* Subroutines for reverting temporarily to top-level for instantiation ! 1501: of templates and such. We actually need to clear out the class- and ! 1502: local-value slots of all identifiers, so that only the global values ! 1503: are at all visible. Simply setting current_binding_level to the global ! 1504: scope isn't enough, because more binding levels may be pushed. */ ! 1505: struct saved_scope { ! 1506: struct binding_level *old_binding_level; ! 1507: tree old_bindings; ! 1508: struct saved_scope *prev; ! 1509: tree class_name, class_type, class_decl, function_decl; ! 1510: struct binding_level *class_bindings; ! 1511: tree previous_class_type; ! 1512: }; ! 1513: static struct saved_scope *current_saved_scope; ! 1514: extern tree prev_class_type; ! 1515: ! 1516: void ! 1517: push_to_top_level () ! 1518: { ! 1519: struct saved_scope *s = ! 1520: (struct saved_scope *) xmalloc (sizeof (struct saved_scope)); ! 1521: struct binding_level *b = current_binding_level; ! 1522: tree old_bindings = NULL_TREE; ! 1523: ! 1524: /* Have to include global_binding_level, because class-level decls ! 1525: aren't listed anywhere useful. */ ! 1526: for (; b; b = b->level_chain) ! 1527: { ! 1528: tree t; ! 1529: for (t = b->names; t; t = TREE_CHAIN (t)) ! 1530: if (b != global_binding_level) ! 1531: { ! 1532: tree binding, t1, t2 = t; ! 1533: tree id = DECL_ASSEMBLER_NAME (t2); ! 1534: ! 1535: if (!id ! 1536: || (!IDENTIFIER_LOCAL_VALUE (id) ! 1537: && !IDENTIFIER_CLASS_VALUE (id))) ! 1538: continue; ! 1539: ! 1540: for (t1 = old_bindings; t1; t1 = TREE_CHAIN (t1)) ! 1541: if (TREE_VEC_ELT (t1, 0) == id) ! 1542: goto skip_it; ! 1543: ! 1544: binding = make_tree_vec (4); ! 1545: if (id) ! 1546: { ! 1547: my_friendly_assert (TREE_CODE (id) == IDENTIFIER_NODE, 135); ! 1548: TREE_VEC_ELT (binding, 0) = id; ! 1549: TREE_VEC_ELT (binding, 1) = IDENTIFIER_TYPE_VALUE (id); ! 1550: TREE_VEC_ELT (binding, 2) = IDENTIFIER_LOCAL_VALUE (id); ! 1551: TREE_VEC_ELT (binding, 3) = IDENTIFIER_CLASS_VALUE (id); ! 1552: IDENTIFIER_LOCAL_VALUE (id) = NULL_TREE; ! 1553: IDENTIFIER_CLASS_VALUE (id) = NULL_TREE; ! 1554: #if !NEW_CLASS_SCOPING ! 1555: /* The type unwinding below should take care of this. */ ! 1556: adjust_type_value (id); ! 1557: #endif ! 1558: } ! 1559: TREE_CHAIN (binding) = old_bindings; ! 1560: old_bindings = binding; ! 1561: skip_it: ! 1562: ; ! 1563: } ! 1564: /* Unwind type-value slots back to top level. */ ! 1565: if (b != global_binding_level) ! 1566: for (t = b->type_shadowed; t; t = TREE_CHAIN (t)) ! 1567: SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (t), TREE_VALUE (t)); ! 1568: } ! 1569: ! 1570: s->old_binding_level = current_binding_level; ! 1571: current_binding_level = global_binding_level; ! 1572: ! 1573: s->class_name = current_class_name; ! 1574: s->class_type = current_class_type; ! 1575: s->class_decl = current_class_decl; ! 1576: s->function_decl = current_function_decl; ! 1577: s->class_bindings = class_binding_level; ! 1578: s->previous_class_type = previous_class_type; ! 1579: current_class_name = current_class_type = current_class_decl = NULL_TREE; ! 1580: current_function_decl = NULL_TREE; ! 1581: class_binding_level = (struct binding_level *)0; ! 1582: previous_class_type = NULL_TREE; ! 1583: ! 1584: s->prev = current_saved_scope; ! 1585: s->old_bindings = old_bindings; ! 1586: current_saved_scope = s; ! 1587: } ! 1588: ! 1589: void ! 1590: pop_from_top_level () ! 1591: { ! 1592: struct saved_scope *s = current_saved_scope; ! 1593: tree t; ! 1594: ! 1595: if (previous_class_type) ! 1596: previous_class_type = NULL_TREE; ! 1597: ! 1598: current_binding_level = s->old_binding_level; ! 1599: current_saved_scope = s->prev; ! 1600: for (t = s->old_bindings; t; t = TREE_CHAIN (t)) ! 1601: { ! 1602: tree id = TREE_VEC_ELT (t, 0); ! 1603: if (id) ! 1604: { ! 1605: IDENTIFIER_TYPE_VALUE (id) = TREE_VEC_ELT (t, 1); ! 1606: IDENTIFIER_LOCAL_VALUE (id) = TREE_VEC_ELT (t, 2); ! 1607: IDENTIFIER_CLASS_VALUE (id) = TREE_VEC_ELT (t, 3); ! 1608: } ! 1609: } ! 1610: current_class_name = s->class_name; ! 1611: current_class_type = s->class_type; ! 1612: current_class_decl = s->class_decl; ! 1613: if (current_class_type) ! 1614: C_C_D = CLASSTYPE_INST_VAR (current_class_type); ! 1615: else ! 1616: C_C_D = NULL_TREE; ! 1617: current_function_decl = s->function_decl; ! 1618: class_binding_level = s->class_bindings; ! 1619: previous_class_type = s->previous_class_type; ! 1620: free (s); ! 1621: } ! 1622: ! 1623: /* Push a definition of struct, union or enum tag "name". ! 1624: "type" should be the type node. ! 1625: We assume that the tag "name" is not already defined. ! 1626: ! 1627: Note that the definition may really be just a forward reference. ! 1628: In that case, the TYPE_SIZE will be a NULL_TREE. ! 1629: ! 1630: C++ gratuitously puts all these tags in the name space. */ ! 1631: ! 1632: /* When setting the IDENTIFIER_TYPE_VALUE field of an identifier ID, ! 1633: record the shadowed value for this binding contour. TYPE is ! 1634: the type that ID maps to. */ ! 1635: void ! 1636: set_identifier_type_value (id, type) ! 1637: tree id; ! 1638: tree type; ! 1639: { ! 1640: #if NEW_CLASS_SCOPING ! 1641: if (class_binding_level) ! 1642: { ! 1643: tree old_type_value = IDENTIFIER_TYPE_VALUE (id); ! 1644: class_binding_level->type_shadowed ! 1645: = tree_cons (id, old_type_value, class_binding_level->type_shadowed); ! 1646: } ! 1647: else if (current_binding_level != global_binding_level) ! 1648: { ! 1649: tree old_type_value = IDENTIFIER_TYPE_VALUE (id); ! 1650: current_binding_level->type_shadowed ! 1651: = tree_cons (id, old_type_value, current_binding_level->type_shadowed); ! 1652: } ! 1653: #else ! 1654: if (current_binding_level != global_binding_level) ! 1655: { ! 1656: tree old_type_value = IDENTIFIER_TYPE_VALUE (id); ! 1657: current_binding_level->type_shadowed ! 1658: = tree_cons (id, old_type_value, current_binding_level->type_shadowed); ! 1659: } ! 1660: else if (class_binding_level) ! 1661: { ! 1662: tree old_type_value = IDENTIFIER_TYPE_VALUE (id); ! 1663: class_binding_level->type_shadowed ! 1664: = tree_cons (id, old_type_value, class_binding_level->type_shadowed); ! 1665: } ! 1666: #endif ! 1667: SET_IDENTIFIER_TYPE_VALUE (id, type); ! 1668: } ! 1669: ! 1670: /* ! 1671: * local values can need to be shadowed too, but it only happens ! 1672: * explicitly from pushdecl, in support of nested enums. ! 1673: */ ! 1674: void ! 1675: set_identifier_local_value (id, type) ! 1676: tree id; ! 1677: tree type; ! 1678: { ! 1679: if (current_binding_level != global_binding_level) ! 1680: { ! 1681: tree old_local_value = IDENTIFIER_LOCAL_VALUE (id); ! 1682: current_binding_level->shadowed ! 1683: = tree_cons (id, old_local_value, current_binding_level->shadowed); ! 1684: } ! 1685: else if (class_binding_level) ! 1686: { ! 1687: tree old_local_value = IDENTIFIER_LOCAL_VALUE (id); ! 1688: class_binding_level->shadowed ! 1689: = tree_cons (id, old_local_value, class_binding_level->shadowed); ! 1690: } ! 1691: IDENTIFIER_LOCAL_VALUE (id) = type; ! 1692: ! 1693: #if NEW_CLASS_SCOPING ! 1694: /* If this is a TYPE_DECL, push it into the type value slot. */ ! 1695: if (TREE_CODE (type) == TYPE_DECL) ! 1696: set_identifier_type_value (id, TREE_TYPE (type)); ! 1697: #endif ! 1698: } ! 1699: ! 1700: /* Subroutine "set_nested_typename" builds the nested-typename of ! 1701: the type decl in question. (Argument CLASSNAME can actually be ! 1702: a function as well, if that's the smallest containing scope.) */ ! 1703: ! 1704: static void ! 1705: set_nested_typename (decl, classname, name, type) ! 1706: tree decl, classname, name, type; ! 1707: { ! 1708: my_friendly_assert (TREE_CODE (decl) == TYPE_DECL, 136); ! 1709: if (classname != NULL_TREE) ! 1710: { ! 1711: char *buf; ! 1712: my_friendly_assert (TREE_CODE (classname) == IDENTIFIER_NODE, 137); ! 1713: my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 138); ! 1714: buf = (char *) alloca (4 + IDENTIFIER_LENGTH (classname) ! 1715: + IDENTIFIER_LENGTH (name)); ! 1716: sprintf (buf, "%s::%s", IDENTIFIER_POINTER (classname), ! 1717: IDENTIFIER_POINTER (name)); ! 1718: DECL_NESTED_TYPENAME (decl) = get_identifier (buf); ! 1719: ! 1720: /* When NEW_CLASS_SCOPING is set to 1: ! 1721: ! 1722: This is a special usage of IDENTIFIER_TYPE_VALUE which have no ! 1723: correspondence in any binding_level. This is ok since the ! 1724: DECL_NESTED_TYPENAME is just a convenience identifier whose ! 1725: IDENTIFIER_TYPE_VALUE will remain constant from now on. */ ! 1726: SET_IDENTIFIER_TYPE_VALUE (DECL_NESTED_TYPENAME (decl), type); ! 1727: } ! 1728: else ! 1729: DECL_NESTED_TYPENAME (decl) = name; ! 1730: } ! 1731: ! 1732: #if 0 /* not yet, should get fixed properly later */ ! 1733: /* Create a TYPE_DECL node with the correct DECL_ASSEMBLER_NAME. ! 1734: Other routines shouldn't use build_decl directly; they'll produce ! 1735: incorrect results with `-g' unless they duplicate this code. ! 1736: ! 1737: This is currently needed mainly for dbxout.c, but we can make ! 1738: use of it in cp-method.c later as well. */ ! 1739: tree ! 1740: make_type_decl (name, type) ! 1741: tree name, type; ! 1742: { ! 1743: tree decl, id; ! 1744: decl = build_decl (TYPE_DECL, name, type); ! 1745: if (TYPE_NAME (type) == name) ! 1746: /* Class/union/enum definition, or a redundant typedef for same. */ ! 1747: { ! 1748: id = get_identifier (build_overload_name (type, 1, 1)); ! 1749: DECL_ASSEMBLER_NAME (decl) = id; ! 1750: } ! 1751: else if (TYPE_NAME (type) != NULL_TREE) ! 1752: /* Explicit typedef, or implicit typedef for template expansion. */ ! 1753: DECL_ASSEMBLER_NAME (decl) = DECL_ASSEMBLER_NAME (TYPE_NAME (type)); ! 1754: else ! 1755: { ! 1756: /* XXX: Typedef for unnamed struct; some other situations. ! 1757: TYPE_NAME is null; what's right here? */ ! 1758: } ! 1759: return decl; ! 1760: } ! 1761: #endif ! 1762: ! 1763: void ! 1764: pushtag (name, type) ! 1765: tree name, type; ! 1766: { ! 1767: register struct binding_level *b; ! 1768: ! 1769: if (class_binding_level) ! 1770: b = class_binding_level; ! 1771: else ! 1772: { ! 1773: b = current_binding_level; ! 1774: while (b->tag_transparent) b = b->level_chain; ! 1775: } ! 1776: ! 1777: if (b == global_binding_level) ! 1778: b->tags = perm_tree_cons (name, type, b->tags); ! 1779: else ! 1780: b->tags = saveable_tree_cons (name, type, b->tags); ! 1781: ! 1782: if (name) ! 1783: { ! 1784: /* Record the identifier as the type's name if it has none. */ ! 1785: ! 1786: if (TYPE_NAME (type) == NULL_TREE) ! 1787: TYPE_NAME (type) = name; ! 1788: ! 1789: /* Do C++ gratuitous typedefing. */ ! 1790: if (IDENTIFIER_TYPE_VALUE (name) != type ! 1791: && (TREE_CODE (type) != RECORD_TYPE ! 1792: || class_binding_level == (struct binding_level *)0 ! 1793: || !CLASSTYPE_DECLARED_EXCEPTION (type))) ! 1794: { ! 1795: register tree d; ! 1796: if (current_class_type == NULL_TREE ! 1797: || TYPE_SIZE (current_class_type) != NULL_TREE) ! 1798: { ! 1799: if (current_lang_name == lang_name_cplusplus) ! 1800: d = lookup_nested_type (type, current_class_type ? TYPE_NAME (current_class_type) : NULL_TREE); ! 1801: else ! 1802: d = NULL_TREE; ! 1803: ! 1804: if (d == NULL_TREE) ! 1805: { ! 1806: #if 0 /* not yet, should get fixed properly later */ ! 1807: d = make_type_decl (name, type); ! 1808: DECL_ASSEMBLER_NAME (d) = get_identifier (build_overload_name (type, 1, 1)); ! 1809: #else ! 1810: d = build_decl (TYPE_DECL, name, type); ! 1811: DECL_ASSEMBLER_NAME (d) = get_identifier (build_overload_name (type, 1, 1)); ! 1812: #endif ! 1813: #ifdef DWARF_DEBUGGING_INFO ! 1814: if (write_symbols == DWARF_DEBUG) ! 1815: { ! 1816: /* Mark the TYPE_DECL node we created just above as an ! 1817: gratuitous one. We need to do this so that dwarfout.c ! 1818: will understand that it is not supposed to output a ! 1819: TAG_typedef DIE for it. */ ! 1820: DECL_IGNORED_P (d) = 1; ! 1821: } ! 1822: #endif /* DWARF_DEBUGGING_INFO */ ! 1823: set_identifier_type_value (name, type); ! 1824: } ! 1825: else ! 1826: d = TYPE_NAME (d); ! 1827: ! 1828: /* If it is anonymous, then we are called from pushdecl, ! 1829: and we don't want to infinitely recurse. Also, if the ! 1830: name is already in scope, we don't want to push it ! 1831: again--pushdecl is only for pushing new decls. */ ! 1832: if (! ANON_AGGRNAME_P (name) ! 1833: #ifdef OBJCPLUS ! 1834: /* we only want this behavior when doing c++ */ ! 1835: && current_lang_name == lang_name_cplusplus ! 1836: #endif ! 1837: && TYPE_NAME (type) ! 1838: && (TREE_CODE (TYPE_NAME (type)) != TYPE_DECL ! 1839: || lookup_name (name, 1) != TYPE_NAME (type))) ! 1840: { ! 1841: if (class_binding_level) ! 1842: d = pushdecl_class_level (d); ! 1843: else ! 1844: d = pushdecl (d); ! 1845: } ! 1846: } ! 1847: else ! 1848: { ! 1849: /* Make nested declarations go into class-level scope. */ ! 1850: d = build_lang_field_decl (TYPE_DECL, name, type); ! 1851: #ifdef DWARF_DEBUGGING_INFO ! 1852: if (write_symbols == DWARF_DEBUG) ! 1853: { ! 1854: /* Mark the TYPE_DECL node we created just above as an ! 1855: gratuitous one. We need to do this so that dwarfout.c ! 1856: will understand that it is not supposed to output a ! 1857: TAG_typedef DIE for it. */ ! 1858: DECL_IGNORED_P (d) = 1; ! 1859: } ! 1860: #endif /* DWARF_DEBUGGING_INFO */ ! 1861: #if !NEW_CLASS_SCOPING ! 1862: set_identifier_type_value (name, type); ! 1863: #else ! 1864: /* Make sure we're in this type's scope when we push the ! 1865: decl for a template, otherwise class_binding_level will ! 1866: be NULL and we'll end up dying inside of ! 1867: push_class_level_binding. */ ! 1868: if (TREE_CODE (type) == UNINSTANTIATED_P_TYPE) ! 1869: pushclass (type, 0); ! 1870: d = pushdecl_class_level (d); ! 1871: if (TREE_CODE (type) == UNINSTANTIATED_P_TYPE) ! 1872: popclass (0); ! 1873: #endif ! 1874: } ! 1875: if (write_symbols != DWARF_DEBUG) ! 1876: { ! 1877: if (ANON_AGGRNAME_P (name)) ! 1878: DECL_IGNORED_P (d) = 1; ! 1879: } ! 1880: TYPE_NAME (type) = d; ! 1881: ! 1882: if ((current_class_type == NULL_TREE ! 1883: && current_function_decl == NULL_TREE) ! 1884: || current_lang_name != lang_name_cplusplus) ! 1885: /* Non-nested class. */ ! 1886: DECL_NESTED_TYPENAME (d) = name; ! 1887: else if (current_function_decl != NULL_TREE) ! 1888: { ! 1889: /* Function-nested class. */ ! 1890: set_nested_typename (d, DECL_ASSEMBLER_NAME (current_function_decl), ! 1891: name, type); ! 1892: /* This builds the links for classes nested in fn scope. */ ! 1893: DECL_CONTEXT (d) = current_function_decl; ! 1894: } ! 1895: else if (TYPE_SIZE (current_class_type) == NULL_TREE) ! 1896: { ! 1897: /* Class-nested class. */ ! 1898: set_nested_typename (d, DECL_NESTED_TYPENAME (TYPE_NAME (current_class_type)), ! 1899: name, type); ! 1900: /* This builds the links for classes nested in type scope. */ ! 1901: DECL_CONTEXT (d) = current_class_type; ! 1902: DECL_CLASS_CONTEXT (d) = current_class_type; ! 1903: } ! 1904: TYPE_CONTEXT (type) = DECL_CONTEXT (d); ! 1905: } ! 1906: if (b->parm_flag == 2) ! 1907: { ! 1908: TREE_NONLOCAL_FLAG (type) = 1; ! 1909: #if !NEW_CLASS_SCOPING ! 1910: IDENTIFIER_CLASS_VALUE (name) = TYPE_NAME (type); ! 1911: #endif ! 1912: if (TYPE_SIZE (current_class_type) == NULL_TREE) ! 1913: CLASSTYPE_TAGS (current_class_type) = b->tags; ! 1914: } ! 1915: } ! 1916: ! 1917: if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL) ! 1918: /* Use the canonical TYPE_DECL for this node. */ ! 1919: TYPE_STUB_DECL (type) = TYPE_NAME (type); ! 1920: else ! 1921: { ! 1922: /* Create a fake NULL-named TYPE_DECL node whose TREE_TYPE ! 1923: will be the tagged type we just added to the current ! 1924: binding level. This fake NULL-named TYPE_DECL node helps ! 1925: dwarfout.c to know when it needs to output a ! 1926: representation of a tagged type, and it also gives us a ! 1927: convenient place to record the "scope start" address for ! 1928: the tagged type. */ ! 1929: ! 1930: #if 0 /* not yet, should get fixed properly later */ ! 1931: TYPE_STUB_DECL (type) = pushdecl (make_type_decl (NULL_TREE, type)); ! 1932: #else ! 1933: TYPE_STUB_DECL (type) = pushdecl (build_decl (TYPE_DECL, NULL_TREE, type)); ! 1934: #endif ! 1935: } ! 1936: } ! 1937: ! 1938: /* Counter used to create anonymous type names. */ ! 1939: static int anon_cnt = 0; ! 1940: ! 1941: /* Return an IDENTIFIER which can be used as a name for ! 1942: anonymous structs and unions. */ ! 1943: tree ! 1944: make_anon_name () ! 1945: { ! 1946: char buf[32]; ! 1947: ! 1948: sprintf (buf, ANON_AGGRNAME_FORMAT, anon_cnt++); ! 1949: return get_identifier (buf); ! 1950: } ! 1951: ! 1952: /* Clear the TREE_PURPOSE slot of tags which have anonymous typenames. ! 1953: This keeps dbxout from getting confused. */ ! 1954: void ! 1955: clear_anon_tags () ! 1956: { ! 1957: register struct binding_level *b; ! 1958: register tree tags; ! 1959: static int last_cnt = 0; ! 1960: ! 1961: /* Fast out if no new anon names were declared. */ ! 1962: if (last_cnt == anon_cnt) ! 1963: return; ! 1964: ! 1965: b = current_binding_level; ! 1966: while (b->tag_transparent) ! 1967: b = b->level_chain; ! 1968: tags = b->tags; ! 1969: while (tags) ! 1970: { ! 1971: /* A NULL purpose means we have already processed all tags ! 1972: from here to the end of the list. */ ! 1973: if (TREE_PURPOSE (tags) == NULL_TREE) ! 1974: break; ! 1975: if (ANON_AGGRNAME_P (TREE_PURPOSE (tags))) ! 1976: TREE_PURPOSE (tags) = NULL_TREE; ! 1977: tags = TREE_CHAIN (tags); ! 1978: } ! 1979: last_cnt = anon_cnt; ! 1980: } ! 1981: ! 1982: /* Subroutine of duplicate_decls: return truthvalue of whether ! 1983: or not types of these decls match. ! 1984: ! 1985: For C++, we must compare the parameter list so that `int' can match ! 1986: `int&' in a parameter position, but `int&' is not confused with ! 1987: `const int&'. */ ! 1988: int ! 1989: decls_match (newdecl, olddecl) ! 1990: tree newdecl, olddecl; ! 1991: { ! 1992: int types_match; ! 1993: ! 1994: if (TREE_CODE (newdecl) == FUNCTION_DECL && TREE_CODE (olddecl) == FUNCTION_DECL) ! 1995: { ! 1996: tree f1 = TREE_TYPE (newdecl); ! 1997: tree f2 = TREE_TYPE (olddecl); ! 1998: tree p1 = TYPE_ARG_TYPES (f1); ! 1999: tree p2 = TYPE_ARG_TYPES (f2); ! 2000: ! 2001: /* When we parse a static member function definition, ! 2002: we put together a FUNCTION_DECL which thinks its type ! 2003: is METHOD_TYPE. Change that to FUNCTION_TYPE, and ! 2004: proceed. */ ! 2005: if (TREE_CODE (f1) == METHOD_TYPE && DECL_STATIC_FUNCTION_P (olddecl)) ! 2006: revert_static_member_fn (&f1, &newdecl, &p1); ! 2007: else if (TREE_CODE (f2) == METHOD_TYPE ! 2008: && DECL_STATIC_FUNCTION_P (newdecl)) ! 2009: revert_static_member_fn (&f2, &olddecl, &p2); ! 2010: ! 2011: /* Here we must take care of the case where new default ! 2012: parameters are specified. Also, warn if an old ! 2013: declaration becomes ambiguous because default ! 2014: parameters may cause the two to be ambiguous. */ ! 2015: if (TREE_CODE (f1) != TREE_CODE (f2)) ! 2016: { ! 2017: if (TREE_CODE (f1) == OFFSET_TYPE) ! 2018: cp_compiler_error ("`%D' redeclared as member function", newdecl); ! 2019: else ! 2020: cp_compiler_error ("`%D' redeclared as non-member function", newdecl); ! 2021: return 0; ! 2022: } ! 2023: ! 2024: if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (f1)), ! 2025: TYPE_MAIN_VARIANT (TREE_TYPE (f2)), 2)) ! 2026: types_match = compparms (p1, p2, 2); ! 2027: else ! 2028: types_match = 0; ! 2029: } ! 2030: else ! 2031: { ! 2032: if (TREE_TYPE (newdecl) == error_mark_node) ! 2033: types_match = TREE_TYPE (olddecl) == error_mark_node; ! 2034: else if (TREE_TYPE (olddecl) == NULL_TREE) ! 2035: types_match = TREE_TYPE (newdecl) == NULL_TREE; ! 2036: else ! 2037: types_match = comptypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl), 1); ! 2038: } ! 2039: ! 2040: return types_match; ! 2041: } ! 2042: ! 2043: /* Handle when a new declaration NEWDECL has the same name as an old ! 2044: one OLDDECL in the same binding contour. Prints an error message ! 2045: if appropriate. ! 2046: ! 2047: If safely possible, alter OLDDECL to look like NEWDECL, and return 1. ! 2048: Otherwise, return 0. */ ! 2049: ! 2050: int ! 2051: duplicate_decls (newdecl, olddecl) ! 2052: register tree newdecl, olddecl; ! 2053: { ! 2054: extern struct obstack permanent_obstack; ! 2055: unsigned olddecl_uid = DECL_UID (olddecl); ! 2056: int olddecl_friend = 0, types_match = 0; ! 2057: int new_defines_function; ! 2058: ! 2059: if (TREE_CODE (olddecl) == TREE_LIST ! 2060: && TREE_CODE (newdecl) == FUNCTION_DECL) ! 2061: { ! 2062: /* If a new decl finds a list of old decls, then ! 2063: we assume that the new decl has C linkage, and ! 2064: that the old decls have C++ linkage. In this case, ! 2065: we must look through the list to see whether ! 2066: there is an ambiguity or not. */ ! 2067: tree olddecls = olddecl; ! 2068: tree previous_c_decl = NULL_TREE; ! 2069: ! 2070: /* If the overload list is empty, just install the decl. */ ! 2071: if (TREE_VALUE (olddecls) == NULL_TREE) ! 2072: { ! 2073: TREE_VALUE (olddecls) = newdecl; ! 2074: return 1; ! 2075: } ! 2076: ! 2077: while (olddecls) ! 2078: { ! 2079: if (DECL_HAS_C_LINKAGE (TREE_VALUE (olddecls))) ! 2080: previous_c_decl = TREE_VALUE (olddecls); ! 2081: ! 2082: if (decls_match (newdecl, TREE_VALUE (olddecls))) ! 2083: { ! 2084: if (TREE_CODE (newdecl) == VAR_DECL) ! 2085: ; ! 2086: else if (! DECLS_SAME_LINKAGE (newdecl, TREE_VALUE (olddecls))) ! 2087: { ! 2088: cp_error ! 2089: ("declaration of `%#D' with different language linkage", ! 2090: newdecl); ! 2091: cp_error_at ("previous declaration here", TREE_VALUE (olddecls)); ! 2092: } ! 2093: types_match = 1; ! 2094: break; ! 2095: } ! 2096: olddecls = TREE_CHAIN (olddecls); ! 2097: } ! 2098: if (olddecls) ! 2099: olddecl = TREE_VALUE (olddecls); ! 2100: else ! 2101: { ! 2102: if (previous_c_decl != NULL_TREE ! 2103: && DECL_HAS_C_LINKAGE (newdecl)) ! 2104: { ! 2105: cp_error ("declaration of C function `%#D' conflicts with previous declaration", newdecl); ! 2106: cp_error_at ("`%#D' declared previously at this point in file", previous_c_decl); ! 2107: } ! 2108: else ! 2109: { ! 2110: /* If we found no match, make this join the other ! 2111: overloaded decls. */ ! 2112: DECL_OVERLOADED (newdecl) = 1; ! 2113: } ! 2114: return 1; ! 2115: } ! 2116: } ! 2117: else ! 2118: { ! 2119: if (TREE_CODE (olddecl) != TREE_LIST) ! 2120: olddecl_friend = DECL_LANG_SPECIFIC (olddecl) && DECL_FRIEND_P (olddecl); ! 2121: types_match = decls_match (newdecl, olddecl); ! 2122: } ! 2123: ! 2124: /* If either the type of the new decl or the type of the old decl is an ! 2125: error_mark_node, then that implies that we have already issued an ! 2126: error (earlier) for some bogus type specification, and in that case, ! 2127: it is rather pointless to harass the user with yet more error message ! 2128: about the same declaration, so well just pretent the types match here. */ ! 2129: if ((TREE_TYPE (newdecl) ! 2130: && TREE_CODE (TREE_TYPE (newdecl)) == ERROR_MARK) ! 2131: || (TREE_TYPE (olddecl) ! 2132: && TREE_CODE (TREE_TYPE (olddecl)) == ERROR_MARK)) ! 2133: types_match = 1; ! 2134: ! 2135: /* If this decl has linkage, and the old one does too, maybe no error. */ ! 2136: if (TREE_CODE (olddecl) != TREE_CODE (newdecl)) ! 2137: { ! 2138: cp_error ("`%#D' redeclared as different kind of symbol", newdecl); ! 2139: if (TREE_CODE (olddecl) == TREE_LIST) ! 2140: olddecl = TREE_VALUE (olddecl); ! 2141: cp_error_at ("previous declaration of `%#D'", olddecl); ! 2142: ! 2143: /* New decl is completely inconsistent with the old one => ! 2144: tell caller to replace the old one. */ ! 2145: ! 2146: return 0; ! 2147: } ! 2148: ! 2149: if (flag_traditional && TREE_CODE (newdecl) == FUNCTION_DECL ! 2150: && IDENTIFIER_IMPLICIT_DECL (DECL_ASSEMBLER_NAME (newdecl)) == olddecl) ! 2151: /* If -traditional, avoid error for redeclaring fcn ! 2152: after implicit decl. */ ! 2153: ; ! 2154: else if (TREE_CODE (olddecl) == FUNCTION_DECL && DECL_BUILT_IN (olddecl)) ! 2155: { ! 2156: /* A function declaration for a built-in function. */ ! 2157: if (!TREE_PUBLIC (newdecl)) ! 2158: { ! 2159: /* If you declare a built-in function name as static, the ! 2160: built-in definition is overridden, ! 2161: but optionally warn this was a bad choice of name. */ ! 2162: if (warn_shadow) ! 2163: cp_warning ("shadowing built-in function `%#D'", newdecl); ! 2164: /* Discard the old built-in function. */ ! 2165: return 0; ! 2166: } ! 2167: if (!types_match) ! 2168: { ! 2169: cp_warning ("declaration of `%#D'", newdecl); ! 2170: cp_warning ("conflicts with built-in declaration `%#D'", ! 2171: olddecl); ! 2172: return 0; ! 2173: } ! 2174: } ! 2175: else if (!types_match) ! 2176: { ! 2177: tree oldtype = TREE_TYPE (olddecl); ! 2178: tree newtype = TREE_TYPE (newdecl); ! 2179: int give_error = 0; ! 2180: ! 2181: /* Already complained about this, so don't do so again. */ ! 2182: if (current_class_type == NULL_TREE ! 2183: || IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl)) != current_class_type) ! 2184: { ! 2185: give_error = 1; ! 2186: ! 2187: /* Since we're doing this before finish_struct can set the ! 2188: line number on NEWDECL, we just do a regular error here. */ ! 2189: if (DECL_SOURCE_LINE (newdecl) == 0) ! 2190: cp_error ("conflicting types for `%#D'", newdecl); ! 2191: else ! 2192: cp_error_at ("conflicting types for `%#D'", newdecl); ! 2193: } ! 2194: ! 2195: /* Check for function type mismatch ! 2196: involving an empty arglist vs a nonempty one. */ ! 2197: if (TREE_CODE (olddecl) == FUNCTION_DECL ! 2198: && comptypes (TREE_TYPE (oldtype), ! 2199: TREE_TYPE (newtype), 1) ! 2200: && ((TYPE_ARG_TYPES (oldtype) == NULL_TREE ! 2201: && DECL_INITIAL (olddecl) == NULL_TREE) ! 2202: || (TYPE_ARG_TYPES (newtype) == NULL_TREE ! 2203: && DECL_INITIAL (newdecl) == NULL_TREE))) ! 2204: { ! 2205: /* Classify the problem further. */ ! 2206: register tree t = TYPE_ARG_TYPES (oldtype); ! 2207: ! 2208: if (t == NULL_TREE) ! 2209: t = TYPE_ARG_TYPES (newtype); ! 2210: for (; t; t = TREE_CHAIN (t)) ! 2211: { ! 2212: register tree type = TREE_VALUE (t); ! 2213: ! 2214: if (TREE_CHAIN (t) == NULL_TREE && type != void_type_node) ! 2215: { ! 2216: give_error = 1; ! 2217: error ("A parameter list with an ellipsis can't match"); ! 2218: error ("an empty parameter name list declaration."); ! 2219: break; ! 2220: } ! 2221: ! 2222: if (TYPE_MAIN_VARIANT (type) == float_type_node ! 2223: || C_PROMOTING_INTEGER_TYPE_P (type)) ! 2224: { ! 2225: give_error = 1; ! 2226: error ("An argument type that has a default promotion"); ! 2227: error ("can't match an empty parameter name list declaration."); ! 2228: break; ! 2229: } ! 2230: } ! 2231: } ! 2232: if (give_error) ! 2233: cp_error_at ("previous declaration as `%#D'", olddecl); ! 2234: ! 2235: /* There is one thing GNU C++ cannot tolerate: a constructor ! 2236: which takes the type of object being constructed. ! 2237: Farm that case out here. */ ! 2238: if (TREE_CODE (newdecl) == FUNCTION_DECL ! 2239: && DECL_CONSTRUCTOR_P (newdecl)) ! 2240: { ! 2241: tree tmp = TREE_CHAIN (TYPE_ARG_TYPES (newtype)); ! 2242: ! 2243: if (tmp != NULL_TREE ! 2244: && (TYPE_MAIN_VARIANT (TREE_VALUE (tmp)) ! 2245: == TYPE_METHOD_BASETYPE (newtype))) ! 2246: { ! 2247: tree parm = TREE_CHAIN (DECL_ARGUMENTS (newdecl)); ! 2248: tree argtypes ! 2249: = hash_tree_chain (build_reference_type (TREE_VALUE (tmp)), ! 2250: TREE_CHAIN (tmp)); ! 2251: ! 2252: DECL_ARG_TYPE (parm) ! 2253: = TREE_TYPE (parm) ! 2254: = TYPE_REFERENCE_TO (TREE_VALUE (tmp)); ! 2255: ! 2256: TREE_TYPE (newdecl) = newtype ! 2257: = build_cplus_method_type (TYPE_METHOD_BASETYPE (newtype), ! 2258: TREE_TYPE (newtype), argtypes); ! 2259: error ("constructor cannot take as argument the type being constructed"); ! 2260: SET_IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (newdecl), current_class_type); ! 2261: } ! 2262: } ! 2263: } ! 2264: else ! 2265: { ! 2266: char *errmsg = redeclaration_error_message (newdecl, olddecl); ! 2267: if (errmsg) ! 2268: { ! 2269: error_with_decl (newdecl, errmsg); ! 2270: if (DECL_NAME (olddecl) != NULL_TREE) ! 2271: cp_error_at ((DECL_INITIAL (olddecl) ! 2272: && current_binding_level == global_binding_level) ! 2273: ? "`%#D' previously defined here" ! 2274: : "`%#D' previously declared here", olddecl); ! 2275: } ! 2276: else if (TREE_CODE (olddecl) == FUNCTION_DECL ! 2277: && DECL_INITIAL (olddecl) != NULL_TREE ! 2278: && TYPE_ARG_TYPES (TREE_TYPE (olddecl)) == NULL_TREE ! 2279: && TYPE_ARG_TYPES (TREE_TYPE (newdecl)) != NULL_TREE) ! 2280: { ! 2281: /* Prototype decl follows defn w/o prototype. */ ! 2282: cp_warning_at ("prototype for `%#D'", newdecl); ! 2283: cp_warning_at ("follows non-prototype definition here", olddecl); ! 2284: } ! 2285: else if (TREE_CODE (olddecl) == FUNCTION_DECL ! 2286: && ! DECLS_SAME_LINKAGE (newdecl, olddecl)) ! 2287: /* extern "C" int foo (); ! 2288: int foo () { bar (); } ! 2289: is OK. */ ! 2290: if (current_lang_stack == current_lang_base) ! 2291: DECL_LANGUAGE (newdecl) = DECL_LANGUAGE (olddecl); ! 2292: else ! 2293: { ! 2294: cp_error_at ("previous declaration of `%#D' with %L linkage", ! 2295: olddecl, DECL_LANGUAGE (olddecl)); ! 2296: cp_error ("conflicts with new declaration with %L linkage", ! 2297: DECL_LANGUAGE (newdecl)); ! 2298: } ! 2299: ! 2300: /* These bits are logically part of the type. */ ! 2301: if (pedantic ! 2302: && (TREE_READONLY (newdecl) != TREE_READONLY (olddecl) ! 2303: || TREE_THIS_VOLATILE (newdecl) != TREE_THIS_VOLATILE (olddecl))) ! 2304: cp_error_at ("type qualifiers for `%D' conflict with previous decl", newdecl); ! 2305: } ! 2306: ! 2307: /* We have committed to returning 1 at this point. */ ! 2308: if (TREE_CODE (newdecl) == FUNCTION_DECL) ! 2309: { ! 2310: /* Now that functions must hold information normally held ! 2311: by field decls, there is extra work to do so that ! 2312: declaration information does not get destroyed during ! 2313: definition. */ ! 2314: if (DECL_VINDEX (olddecl)) ! 2315: DECL_VINDEX (newdecl) = DECL_VINDEX (olddecl); ! 2316: if (DECL_CONTEXT (olddecl)) ! 2317: DECL_CONTEXT (newdecl) = DECL_CONTEXT (olddecl); ! 2318: if (DECL_CLASS_CONTEXT (olddecl)) ! 2319: DECL_CLASS_CONTEXT (newdecl) = DECL_CLASS_CONTEXT (olddecl); ! 2320: if (DECL_CHAIN (newdecl) == NULL_TREE) ! 2321: DECL_CHAIN (newdecl) = DECL_CHAIN (olddecl); ! 2322: if (DECL_PENDING_INLINE_INFO (newdecl) == (struct pending_inline *)0) ! 2323: DECL_PENDING_INLINE_INFO (newdecl) = DECL_PENDING_INLINE_INFO (olddecl); ! 2324: } ! 2325: ! 2326: /* Deal with C++: must preserve virtual function table size. */ ! 2327: if (TREE_CODE (olddecl) == TYPE_DECL) ! 2328: { ! 2329: register tree newtype = TREE_TYPE (newdecl); ! 2330: register tree oldtype = TREE_TYPE (olddecl); ! 2331: ! 2332: if (newtype != error_mark_node && oldtype != error_mark_node ! 2333: && TYPE_LANG_SPECIFIC (newtype) && TYPE_LANG_SPECIFIC (oldtype)) ! 2334: { ! 2335: CLASSTYPE_VSIZE (newtype) = CLASSTYPE_VSIZE (oldtype); ! 2336: CLASSTYPE_FRIEND_CLASSES (newtype) ! 2337: = CLASSTYPE_FRIEND_CLASSES (oldtype); ! 2338: } ! 2339: /* why assert here? Just because debugging information is ! 2340: messed up? (mrs) */ ! 2341: /* it happens on something like: ! 2342: typedef struct Thing { ! 2343: Thing(); ! 2344: int x; ! 2345: } Thing; ! 2346: */ ! 2347: #if 0 ! 2348: my_friendly_assert (DECL_IGNORED_P (olddecl) == DECL_IGNORED_P (newdecl), 139); ! 2349: #endif ! 2350: } ! 2351: ! 2352: /* Special handling ensues if new decl is a function definition. */ ! 2353: new_defines_function = (TREE_CODE (newdecl) == FUNCTION_DECL ! 2354: && DECL_INITIAL (newdecl) != NULL_TREE); ! 2355: ! 2356: /* Optionally warn about more than one declaration for the same name, ! 2357: but don't warn about a function declaration followed by a definition. */ ! 2358: if (warn_redundant_decls ! 2359: && DECL_SOURCE_LINE (olddecl) != 0 ! 2360: && !(new_defines_function && DECL_INITIAL (olddecl) == NULL_TREE)) ! 2361: { ! 2362: cp_warning ("redundant redeclaration of `%D' in same scope", newdecl); ! 2363: cp_warning ("previous declaration of `%D'", olddecl); ! 2364: } ! 2365: ! 2366: /* Copy all the DECL_... slots specified in the new decl ! 2367: except for any that we copy here from the old type. */ ! 2368: ! 2369: if (types_match) ! 2370: { ! 2371: /* Automatically handles default parameters. */ ! 2372: tree oldtype = TREE_TYPE (olddecl); ! 2373: /* Merge the data types specified in the two decls. */ ! 2374: tree newtype = common_type (TREE_TYPE (newdecl), TREE_TYPE (olddecl)); ! 2375: ! 2376: if (TREE_CODE (newdecl) == VAR_DECL) ! 2377: DECL_THIS_EXTERN (newdecl) |= DECL_THIS_EXTERN (olddecl); ! 2378: /* Do this after calling `common_type' so that default ! 2379: parameters don't confuse us. */ ! 2380: else if (TREE_CODE (newdecl) == FUNCTION_DECL ! 2381: && (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl)) ! 2382: != TYPE_RAISES_EXCEPTIONS (TREE_TYPE (olddecl)))) ! 2383: { ! 2384: tree ctype = NULL_TREE; ! 2385: ctype = DECL_CLASS_CONTEXT (newdecl); ! 2386: TREE_TYPE (newdecl) = build_exception_variant (ctype, newtype, ! 2387: TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl))); ! 2388: TREE_TYPE (olddecl) = build_exception_variant (ctype, newtype, ! 2389: TYPE_RAISES_EXCEPTIONS (oldtype)); ! 2390: ! 2391: if (! compexcepttypes (TREE_TYPE (newdecl), TREE_TYPE(olddecl), 0)) ! 2392: { ! 2393: cp_error ("declaration of `%D' raises different exceptions...", newdecl); ! 2394: cp_error_at ("...from previous declaration here", olddecl); ! 2395: } ! 2396: } ! 2397: TREE_TYPE (newdecl) = TREE_TYPE (olddecl) = newtype; ! 2398: ! 2399: /* Lay the type out, unless already done. */ ! 2400: if (oldtype != TREE_TYPE (newdecl)) ! 2401: { ! 2402: if (TREE_TYPE (newdecl) != error_mark_node) ! 2403: layout_type (TREE_TYPE (newdecl)); ! 2404: if (TREE_CODE (newdecl) != FUNCTION_DECL ! 2405: && TREE_CODE (newdecl) != TYPE_DECL ! 2406: && TREE_CODE (newdecl) != CONST_DECL) ! 2407: layout_decl (newdecl, 0); ! 2408: } ! 2409: else ! 2410: { ! 2411: /* Since the type is OLDDECL's, make OLDDECL's size go with. */ ! 2412: DECL_SIZE (newdecl) = DECL_SIZE (olddecl); ! 2413: } ! 2414: ! 2415: /* Merge the type qualifiers. */ ! 2416: if (TREE_READONLY (newdecl)) ! 2417: TREE_READONLY (olddecl) = 1; ! 2418: if (TREE_THIS_VOLATILE (newdecl)) ! 2419: TREE_THIS_VOLATILE (olddecl) = 1; ! 2420: ! 2421: /* Merge the initialization information. */ ! 2422: if (DECL_INITIAL (newdecl) == NULL_TREE) ! 2423: DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl); ! 2424: /* Keep the old rtl since we can safely use it, unless it's the ! 2425: call to abort() used for abstract virtuals. */ ! 2426: if ((DECL_LANG_SPECIFIC (olddecl) ! 2427: && !DECL_ABSTRACT_VIRTUAL_P (olddecl)) ! 2428: || DECL_RTL (olddecl) != DECL_RTL (abort_fndecl)) ! 2429: DECL_RTL (newdecl) = DECL_RTL (olddecl); ! 2430: } ! 2431: /* If cannot merge, then use the new type and qualifiers, ! 2432: and don't preserve the old rtl. */ ! 2433: else ! 2434: { ! 2435: /* Clean out any memory we had of the old declaration. */ ! 2436: tree oldstatic = value_member (olddecl, static_aggregates); ! 2437: if (oldstatic) ! 2438: TREE_VALUE (oldstatic) = error_mark_node; ! 2439: ! 2440: TREE_TYPE (olddecl) = TREE_TYPE (newdecl); ! 2441: TREE_READONLY (olddecl) = TREE_READONLY (newdecl); ! 2442: TREE_THIS_VOLATILE (olddecl) = TREE_THIS_VOLATILE (newdecl); ! 2443: TREE_SIDE_EFFECTS (olddecl) = TREE_SIDE_EFFECTS (newdecl); ! 2444: } ! 2445: ! 2446: /* Merge the storage class information. */ ! 2447: if (DECL_EXTERNAL (newdecl)) ! 2448: { ! 2449: TREE_STATIC (newdecl) = TREE_STATIC (olddecl); ! 2450: DECL_EXTERNAL (newdecl) = DECL_EXTERNAL (olddecl); ! 2451: ! 2452: /* For functions, static overrides non-static. */ ! 2453: if (TREE_CODE (newdecl) == FUNCTION_DECL) ! 2454: { ! 2455: TREE_PUBLIC (newdecl) &= TREE_PUBLIC (olddecl); ! 2456: /* This is since we don't automatically ! 2457: copy the attributes of NEWDECL into OLDDECL. */ ! 2458: TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl); ! 2459: /* If this clears `static', clear it in the identifier too. */ ! 2460: if (! TREE_PUBLIC (olddecl)) ! 2461: TREE_PUBLIC (DECL_ASSEMBLER_NAME (olddecl)) = 0; ! 2462: } ! 2463: else ! 2464: TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl); ! 2465: } ! 2466: else ! 2467: { ! 2468: TREE_STATIC (olddecl) = TREE_STATIC (newdecl); ! 2469: /* A `const' which was not declared `extern' and is ! 2470: in static storage is invisible. */ ! 2471: if (TREE_CODE (newdecl) == VAR_DECL ! 2472: && TREE_READONLY (newdecl) && TREE_STATIC (newdecl) ! 2473: && ! DECL_THIS_EXTERN (newdecl)) ! 2474: TREE_PUBLIC (newdecl) = 0; ! 2475: TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl); ! 2476: } ! 2477: ! 2478: /* If either decl says `inline', this fn is inline, ! 2479: unless its definition was passed already. */ ! 2480: if (DECL_INLINE (newdecl) && DECL_INITIAL (olddecl) == NULL_TREE) ! 2481: DECL_INLINE (olddecl) = 1; ! 2482: DECL_INLINE (newdecl) = DECL_INLINE (olddecl); ! 2483: ! 2484: if (TREE_CODE (newdecl) == FUNCTION_DECL) ! 2485: { ! 2486: if (new_defines_function) ! 2487: /* If defining a function declared with other language ! 2488: linkage, use the previously declared language linkage. */ ! 2489: DECL_LANGUAGE (newdecl) = DECL_LANGUAGE (olddecl); ! 2490: else ! 2491: { ! 2492: /* If redeclaring a builtin function, and not a definition, ! 2493: it stays built in. */ ! 2494: if (DECL_BUILT_IN (olddecl)) ! 2495: { ! 2496: DECL_BUILT_IN (newdecl) = 1; ! 2497: DECL_SET_FUNCTION_CODE (newdecl, DECL_FUNCTION_CODE (olddecl)); ! 2498: /* If we're keeping the built-in definition, keep the rtl, ! 2499: regardless of declaration matches. */ ! 2500: DECL_RTL (newdecl) = DECL_RTL (olddecl); ! 2501: } ! 2502: else ! 2503: DECL_FRAME_SIZE (newdecl) = DECL_FRAME_SIZE (olddecl); ! 2504: ! 2505: DECL_RESULT (newdecl) = DECL_RESULT (olddecl); ! 2506: if (DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl)) ! 2507: /* Previously saved insns go together with ! 2508: the function's previous definition. */ ! 2509: DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl); ! 2510: /* Don't clear out the arguments if we're redefining a function. */ ! 2511: if (DECL_ARGUMENTS (olddecl)) ! 2512: DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl); ! 2513: } ! 2514: } ! 2515: ! 2516: /* Now preserve various other info from the definition. */ ! 2517: TREE_ADDRESSABLE (newdecl) = TREE_ADDRESSABLE (olddecl); ! 2518: TREE_ASM_WRITTEN (newdecl) = TREE_ASM_WRITTEN (olddecl); ! 2519: ! 2520: /* Don't really know how much of the language-specific ! 2521: values we should copy from old to new. */ ! 2522: #if 1 ! 2523: if (DECL_LANG_SPECIFIC (olddecl)) ! 2524: DECL_IN_AGGR_P (newdecl) = DECL_IN_AGGR_P (olddecl); ! 2525: #endif ! 2526: ! 2527: if (TREE_CODE (newdecl) == FUNCTION_DECL) ! 2528: { ! 2529: int function_size; ! 2530: struct lang_decl *ol = DECL_LANG_SPECIFIC (olddecl); ! 2531: struct lang_decl *nl = DECL_LANG_SPECIFIC (newdecl); ! 2532: ! 2533: function_size = sizeof (struct tree_decl); ! 2534: ! 2535: bcopy ((char *) newdecl + sizeof (struct tree_common), ! 2536: (char *) olddecl + sizeof (struct tree_common), ! 2537: function_size - sizeof (struct tree_common)); ! 2538: ! 2539: if ((char *)newdecl + ((function_size + sizeof (struct lang_decl) ! 2540: + obstack_alignment_mask (&permanent_obstack)) ! 2541: & ~ obstack_alignment_mask (&permanent_obstack)) ! 2542: == obstack_next_free (&permanent_obstack)) ! 2543: { ! 2544: DECL_MAIN_VARIANT (newdecl) = olddecl; ! 2545: DECL_LANG_SPECIFIC (olddecl) = ol; ! 2546: bcopy ((char *)nl, (char *)ol, sizeof (struct lang_decl)); ! 2547: ! 2548: obstack_free (&permanent_obstack, newdecl); ! 2549: } ! 2550: else if (LANG_DECL_PERMANENT (ol)) ! 2551: { ! 2552: if (DECL_MAIN_VARIANT (olddecl) == olddecl) ! 2553: { ! 2554: /* Save these lang_decls that would otherwise be lost. */ ! 2555: extern tree free_lang_decl_chain; ! 2556: tree free_lang_decl = (tree) ol; ! 2557: TREE_CHAIN (free_lang_decl) = free_lang_decl_chain; ! 2558: free_lang_decl_chain = free_lang_decl; ! 2559: } ! 2560: else ! 2561: { ! 2562: /* Storage leak. */ ! 2563: } ! 2564: } ! 2565: } ! 2566: else ! 2567: { ! 2568: bcopy ((char *) newdecl + sizeof (struct tree_common), ! 2569: (char *) olddecl + sizeof (struct tree_common), ! 2570: sizeof (struct tree_decl) - sizeof (struct tree_common) ! 2571: + tree_code_length [(int)TREE_CODE (newdecl)] * sizeof (char *)); ! 2572: } ! 2573: ! 2574: DECL_UID (olddecl) = olddecl_uid; ! 2575: if (olddecl_friend) ! 2576: DECL_FRIEND_P (olddecl) = 1; ! 2577: ! 2578: return 1; ! 2579: } ! 2580: ! 2581: #if !NEW_CLASS_SCOPING ! 2582: /* This was always a hack, that never should've been necessary. */ ! 2583: void ! 2584: adjust_type_value (id) ! 2585: tree id; ! 2586: { ! 2587: tree t; ! 2588: ! 2589: if (current_binding_level != global_binding_level) ! 2590: { ! 2591: if (current_binding_level != class_binding_level) ! 2592: { ! 2593: t = IDENTIFIER_LOCAL_VALUE (id); ! 2594: if (t && TREE_CODE (t) == TYPE_DECL) ! 2595: { ! 2596: set_it: ! 2597: SET_IDENTIFIER_TYPE_VALUE (id, TREE_TYPE (t)); ! 2598: return; ! 2599: } ! 2600: } ! 2601: else ! 2602: my_friendly_abort (7); ! 2603: ! 2604: if (current_class_type) ! 2605: { ! 2606: t = IDENTIFIER_CLASS_VALUE (id); ! 2607: if (t && TREE_CODE (t) == TYPE_DECL) ! 2608: goto set_it; ! 2609: } ! 2610: } ! 2611: ! 2612: t = IDENTIFIER_GLOBAL_VALUE (id); ! 2613: if (t && TREE_CODE (t) == TYPE_DECL) ! 2614: goto set_it; ! 2615: if (t && TREE_CODE (t) == TEMPLATE_DECL) ! 2616: SET_IDENTIFIER_TYPE_VALUE (id, NULL_TREE); ! 2617: } ! 2618: #endif ! 2619: ! 2620: /* Record a decl-node X as belonging to the current lexical scope. ! 2621: Check for errors (such as an incompatible declaration for the same ! 2622: name already seen in the same scope). ! 2623: ! 2624: Returns either X or an old decl for the same name. ! 2625: If an old decl is returned, it may have been smashed ! 2626: to agree with what X says. */ ! 2627: ! 2628: tree ! 2629: pushdecl (x) ! 2630: tree x; ! 2631: { ! 2632: register tree t; ! 2633: #if 0 /* not yet, should get fixed properly later */ ! 2634: register tree name; ! 2635: #else ! 2636: register tree name = DECL_ASSEMBLER_NAME (x); ! 2637: #endif ! 2638: register struct binding_level *b = current_binding_level; ! 2639: ! 2640: #if 0 ! 2641: static int nglobals; int len; ! 2642: ! 2643: len = list_length (global_binding_level->names); ! 2644: if (len < nglobals) ! 2645: my_friendly_abort (8); ! 2646: else if (len > nglobals) ! 2647: nglobals = len; ! 2648: #endif ! 2649: ! 2650: /* Don't change DECL_CONTEXT of virtual methods. */ ! 2651: if (x != current_function_decl ! 2652: && (TREE_CODE (x) != FUNCTION_DECL ! 2653: || !DECL_VIRTUAL_P (x))) ! 2654: DECL_CONTEXT (x) = current_function_decl; ! 2655: /* A local declaration for a function doesn't constitute nesting. */ ! 2656: if (TREE_CODE (x) == FUNCTION_DECL && DECL_INITIAL (x) == 0) ! 2657: DECL_CONTEXT (x) = 0; ! 2658: ! 2659: #if 0 /* not yet, should get fixed properly later */ ! 2660: /* For functions and class static data, we currently look up the encoded ! 2661: form of the name. For types, we want the real name. The former will ! 2662: probably be changed soon, according to MDT. */ ! 2663: if (TREE_CODE (x) == FUNCTION_DECL || TREE_CODE (x) == VAR_DECL) ! 2664: name = DECL_ASSEMBLER_NAME (x); ! 2665: else ! 2666: name = DECL_NAME (x); ! 2667: #else ! 2668: /* Type are looked up using the DECL_NAME, as that is what the rest of the ! 2669: compiler wants to use. */ ! 2670: if (TREE_CODE (x) == TYPE_DECL) ! 2671: name = DECL_NAME (x); ! 2672: #endif ! 2673: ! 2674: if (name) ! 2675: { ! 2676: char *file; ! 2677: int line; ! 2678: ! 2679: t = lookup_name_current_level (name); ! 2680: if (t == error_mark_node) ! 2681: { ! 2682: /* error_mark_node is 0 for a while during initialization! */ ! 2683: t = NULL_TREE; ! 2684: cp_error_at ("`%#D' used prior to declaration", x); ! 2685: } ! 2686: ! 2687: if (t != NULL_TREE) ! 2688: { ! 2689: if (TREE_CODE (t) == PARM_DECL) ! 2690: { ! 2691: if (DECL_CONTEXT (t) == NULL_TREE) ! 2692: fatal ("parse errors have confused me too much"); ! 2693: } ! 2694: file = DECL_SOURCE_FILE (t); ! 2695: line = DECL_SOURCE_LINE (t); ! 2696: } ! 2697: ! 2698: if (t != NULL_TREE && TREE_CODE (t) != TREE_CODE (x)) ! 2699: { ! 2700: if (TREE_CODE (t) == TYPE_DECL || TREE_CODE (x) == TYPE_DECL) ! 2701: { ! 2702: /* We do nothing special here, because C++ does such nasty ! 2703: things with TYPE_DECLs. Instead, just let the TYPE_DECL ! 2704: get shadowed, and know that if we need to find a TYPE_DECL ! 2705: for a given name, we can look in the IDENTIFIER_TYPE_VALUE ! 2706: slot of the identifier. */ ! 2707: ; ! 2708: } ! 2709: else if (duplicate_decls (x, t)) ! 2710: return t; ! 2711: } ! 2712: else if (t != NULL_TREE && duplicate_decls (x, t)) ! 2713: { ! 2714: /* If this decl is `static' and an `extern' was seen previously, ! 2715: that is erroneous. But don't complain if -traditional, ! 2716: since traditional compilers don't complain. ! 2717: ! 2718: Note that this does not apply to the C++ case of declaring ! 2719: a variable `extern const' and then later `const'. */ ! 2720: if (!flag_traditional && TREE_PUBLIC (name) ! 2721: && ! TREE_PUBLIC (x) && ! DECL_EXTERNAL (x) && ! DECL_INLINE (x)) ! 2722: { ! 2723: /* Due to interference in memory reclamation (X may be ! 2724: obstack-deallocated at this point), we must guard against ! 2725: one really special case. */ ! 2726: if (current_function_decl == x) ! 2727: current_function_decl = t; ! 2728: if (IDENTIFIER_IMPLICIT_DECL (name)) ! 2729: cp_warning ("`%D' was declared implicitly `extern' and later `static'", t); ! 2730: else ! 2731: cp_warning ("`%D' was declared `extern' and later `static'", ! 2732: x); ! 2733: cp_warning_at ("previous declaration of `%D'", t); ! 2734: } ! 2735: #if 0 ! 2736: /* This is turned off until I have time to do it right (bpk). */ ! 2737: ! 2738: /* Also warn if they did a prototype with `static' on it, but ! 2739: then later left the `static' off. */ ! 2740: else if (! TREE_PUBLIC (name) && TREE_PUBLIC (x)) ! 2741: { ! 2742: if (DECL_LANG_SPECIFIC (t) && DECL_FRIEND_P (t)) ! 2743: return t; ! 2744: ! 2745: if (current_function_decl == x) ! 2746: current_function_decl = t; ! 2747: ! 2748: if (extra_warnings) ! 2749: { ! 2750: cp_warning ("`static' missing from declaration of `%D'", t); ! 2751: warning_with_file_and_line (file, line, ! 2752: "previous declaration of `%s'", ! 2753: decl_as_string (t, 0)); ! 2754: } ! 2755: ! 2756: /* Now fix things so it'll do what they expect. */ ! 2757: if (current_function_decl) ! 2758: TREE_PUBLIC (current_function_decl) = 0; ! 2759: } ! 2760: #endif ! 2761: return t; ! 2762: } ! 2763: ! 2764: /* If declaring a type as a typedef, and the type has no known ! 2765: typedef name, install this TYPE_DECL as its typedef name. */ ! 2766: if (TREE_CODE (x) == TYPE_DECL) ! 2767: { ! 2768: tree type = TREE_TYPE (x); ! 2769: tree name = (type != error_mark_node) ? TYPE_NAME (type) : x; ! 2770: ! 2771: if (name == NULL_TREE || TREE_CODE (name) != TYPE_DECL) ! 2772: { ! 2773: /* If these are different names, and we're at the global ! 2774: binding level, make two equivalent definitions. */ ! 2775: name = x; ! 2776: if (global_bindings_p ()) ! 2777: TYPE_NAME (type) = x; ! 2778: } ! 2779: else ! 2780: { ! 2781: tree tname = DECL_NAME (name); ! 2782: ! 2783: if (global_bindings_p () && ANON_AGGRNAME_P (tname)) ! 2784: { ! 2785: /* do gratuitous C++ typedefing, and make sure that ! 2786: we access this type either through TREE_TYPE field ! 2787: or via the tags list. */ ! 2788: TYPE_NAME (TREE_TYPE (x)) = x; ! 2789: pushtag (tname, TREE_TYPE (x)); ! 2790: } ! 2791: } ! 2792: my_friendly_assert (TREE_CODE (name) == TYPE_DECL, 140); ! 2793: ! 2794: if (DECL_NAME (name) && !DECL_NESTED_TYPENAME (name)) ! 2795: set_nested_typename (x, current_class_name, ! 2796: DECL_NAME (name), type); ! 2797: ! 2798: if (type != error_mark_node ! 2799: && TYPE_NAME (type) ! 2800: && TYPE_IDENTIFIER (type)) ! 2801: set_identifier_type_value (DECL_NAME (x), type); ! 2802: } ! 2803: ! 2804: /* Multiple external decls of the same identifier ought to match. ! 2805: ! 2806: We get warnings about inline functions where they are defined. ! 2807: Avoid duplicate warnings where they are used. */ ! 2808: if (TREE_PUBLIC (x) && !DECL_INLINE (x)) ! 2809: { ! 2810: tree decl; ! 2811: ! 2812: if (IDENTIFIER_GLOBAL_VALUE (name) != NULL_TREE ! 2813: && (DECL_EXTERNAL (IDENTIFIER_GLOBAL_VALUE (name)) ! 2814: || TREE_PUBLIC (IDENTIFIER_GLOBAL_VALUE (name)))) ! 2815: decl = IDENTIFIER_GLOBAL_VALUE (name); ! 2816: else ! 2817: decl = NULL_TREE; ! 2818: ! 2819: if (decl && ! comptypes (TREE_TYPE (x), TREE_TYPE (decl), 1) ! 2820: /* If old decl is built-in, we already warned if we should. */ ! 2821: && !DECL_BUILT_IN (decl)) ! 2822: { ! 2823: cp_pedwarn_at ("type mismatch with previous external decl", x); ! 2824: cp_pedwarn_at ("previous external decl of `%D'", decl); ! 2825: } ! 2826: } ! 2827: ! 2828: /* In PCC-compatibility mode, extern decls of vars with no current decl ! 2829: take effect at top level no matter where they are. */ ! 2830: if (flag_traditional && DECL_EXTERNAL (x) ! 2831: && lookup_name (name, 0) == NULL_TREE) ! 2832: b = global_binding_level; ! 2833: ! 2834: /* This name is new in its binding level. ! 2835: Install the new declaration and return it. */ ! 2836: if (b == global_binding_level) ! 2837: { ! 2838: /* Install a global value. */ ! 2839: ! 2840: /* Rule for VAR_DECLs, but not for other kinds of _DECLs: ! 2841: A `const' which was not declared `extern' is invisible. */ ! 2842: if (TREE_CODE (x) == VAR_DECL ! 2843: && TREE_READONLY (x) && ! DECL_THIS_EXTERN (x)) ! 2844: TREE_PUBLIC (x) = 0; ! 2845: ! 2846: /* If the first global decl has external linkage, ! 2847: warn if we later see static one. */ ! 2848: if (IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE && TREE_PUBLIC (x)) ! 2849: TREE_PUBLIC (name) = 1; ! 2850: ! 2851: /* Don't install a TYPE_DECL if we already have another ! 2852: sort of _DECL with that name. */ ! 2853: if (TREE_CODE (x) != TYPE_DECL ! 2854: || t == NULL_TREE ! 2855: || TREE_CODE (t) == TYPE_DECL) ! 2856: IDENTIFIER_GLOBAL_VALUE (name) = x; ! 2857: ! 2858: /* Don't forget if the function was used via an implicit decl. */ ! 2859: if (IDENTIFIER_IMPLICIT_DECL (name) ! 2860: && TREE_USED (IDENTIFIER_IMPLICIT_DECL (name))) ! 2861: TREE_USED (x) = 1; ! 2862: ! 2863: /* Don't forget if its address was taken in that way. */ ! 2864: if (IDENTIFIER_IMPLICIT_DECL (name) ! 2865: && TREE_ADDRESSABLE (IDENTIFIER_IMPLICIT_DECL (name))) ! 2866: TREE_ADDRESSABLE (x) = 1; ! 2867: ! 2868: /* Warn about mismatches against previous implicit decl. */ ! 2869: if (IDENTIFIER_IMPLICIT_DECL (name) != NULL_TREE ! 2870: /* If this real decl matches the implicit, don't complain. */ ! 2871: && ! (TREE_CODE (x) == FUNCTION_DECL ! 2872: && TREE_TYPE (TREE_TYPE (x)) == integer_type_node)) ! 2873: cp_warning ! 2874: ("`%D' was previously implicitly declared to return `int'", x); ! 2875: ! 2876: /* If this decl is `static' and an `extern' was seen previously, ! 2877: that is erroneous. Don't do this for TYPE_DECLs. */ ! 2878: if (TREE_PUBLIC (name) ! 2879: && TREE_CODE (x) != TYPE_DECL ! 2880: && ! TREE_PUBLIC (x) && ! DECL_EXTERNAL (x)) ! 2881: { ! 2882: if (IDENTIFIER_IMPLICIT_DECL (name)) ! 2883: cp_warning ! 2884: ("`%D' was declared implicitly `extern' and later `static'", ! 2885: x); ! 2886: else ! 2887: cp_warning ! 2888: ("`%D' was declared `extern' and later `static'", x); ! 2889: } ! 2890: } ! 2891: else ! 2892: { ! 2893: /* Here to install a non-global value. */ ! 2894: tree oldlocal = IDENTIFIER_LOCAL_VALUE (name); ! 2895: tree oldglobal = IDENTIFIER_GLOBAL_VALUE (name); ! 2896: set_identifier_local_value (name, x); ! 2897: ! 2898: /* If this is an extern function declaration, see if we ! 2899: have a global definition or declaration for the function. */ ! 2900: if (oldlocal == NULL_TREE ! 2901: && DECL_EXTERNAL (x) && !DECL_INLINE (x) ! 2902: && oldglobal != NULL_TREE ! 2903: && TREE_CODE (x) == FUNCTION_DECL ! 2904: && TREE_CODE (oldglobal) == FUNCTION_DECL) ! 2905: { ! 2906: /* We have one. Their types must agree. */ ! 2907: if (! comptypes (TREE_TYPE (x), TREE_TYPE (oldglobal), 1)) ! 2908: { ! 2909: cp_warning ("extern declaration of `%#D' doesn't match", x); ! 2910: cp_warning_at ("global declaration `%#D'", oldglobal); ! 2911: } ! 2912: else ! 2913: { ! 2914: /* Inner extern decl is inline if global one is. ! 2915: Copy enough to really inline it. */ ! 2916: if (DECL_INLINE (oldglobal)) ! 2917: { ! 2918: DECL_INLINE (x) = DECL_INLINE (oldglobal); ! 2919: DECL_INITIAL (x) = (current_function_decl == oldglobal ! 2920: ? NULL_TREE : DECL_INITIAL (oldglobal)); ! 2921: DECL_SAVED_INSNS (x) = DECL_SAVED_INSNS (oldglobal); ! 2922: DECL_FRAME_SIZE (x) = DECL_FRAME_SIZE (oldglobal); ! 2923: DECL_ARGUMENTS (x) = DECL_ARGUMENTS (oldglobal); ! 2924: DECL_RESULT (x) = DECL_RESULT (oldglobal); ! 2925: TREE_ASM_WRITTEN (x) = TREE_ASM_WRITTEN (oldglobal); ! 2926: DECL_ABSTRACT_ORIGIN (x) = oldglobal; ! 2927: } ! 2928: /* Inner extern decl is built-in if global one is. */ ! 2929: if (DECL_BUILT_IN (oldglobal)) ! 2930: { ! 2931: DECL_BUILT_IN (x) = DECL_BUILT_IN (oldglobal); ! 2932: DECL_SET_FUNCTION_CODE (x, DECL_FUNCTION_CODE (oldglobal)); ! 2933: } ! 2934: /* Keep the arg types from a file-scope fcn defn. */ ! 2935: if (TYPE_ARG_TYPES (TREE_TYPE (oldglobal)) != NULL_TREE ! 2936: && DECL_INITIAL (oldglobal) ! 2937: && TYPE_ARG_TYPES (TREE_TYPE (x)) == NULL_TREE) ! 2938: TREE_TYPE (x) = TREE_TYPE (oldglobal); ! 2939: } ! 2940: } ! 2941: /* If we have a local external declaration, ! 2942: and no file-scope declaration has yet been seen, ! 2943: then if we later have a file-scope decl it must not be static. */ ! 2944: if (oldlocal == NULL_TREE ! 2945: && oldglobal == NULL_TREE ! 2946: && DECL_EXTERNAL (x) ! 2947: && TREE_PUBLIC (x)) ! 2948: { ! 2949: TREE_PUBLIC (name) = 1; ! 2950: } ! 2951: ! 2952: if (DECL_FROM_INLINE (x)) ! 2953: /* Inline decls shadow nothing. */; ! 2954: ! 2955: /* Warn if shadowing an argument at the top level of the body. */ ! 2956: else if (oldlocal != NULL_TREE && !DECL_EXTERNAL (x) ! 2957: && TREE_CODE (oldlocal) == PARM_DECL ! 2958: && TREE_CODE (x) != PARM_DECL) ! 2959: { ! 2960: /* Go to where the parms should be and see if we ! 2961: find them there. */ ! 2962: struct binding_level *b = current_binding_level->level_chain; ! 2963: ! 2964: if (cleanup_label) ! 2965: b = b->level_chain; ! 2966: ! 2967: /* ARM $8.3 */ ! 2968: if (b->parm_flag == 1) ! 2969: cp_error ("declaration of `%#D' shadows a parameter", name); ! 2970: } ! 2971: /* Maybe warn if shadowing something else. */ ! 2972: else if (warn_shadow && !DECL_EXTERNAL (x) ! 2973: /* No shadow warnings for internally generated vars. */ ! 2974: && DECL_SOURCE_LINE (x) != 0 ! 2975: /* No shadow warnings for vars made for inlining. */ ! 2976: && ! DECL_FROM_INLINE (x)) ! 2977: { ! 2978: char *warnstring = NULL; ! 2979: ! 2980: if (oldlocal != NULL_TREE && TREE_CODE (oldlocal) == PARM_DECL) ! 2981: warnstring = "declaration of `%s' shadows a parameter"; ! 2982: else if (IDENTIFIER_CLASS_VALUE (name) != NULL_TREE ! 2983: && !TREE_STATIC (name)) ! 2984: warnstring = "declaration of `%s' shadows a member of `this'"; ! 2985: else if (oldlocal != NULL_TREE) ! 2986: warnstring = "declaration of `%s' shadows previous local"; ! 2987: else if (oldglobal != NULL_TREE) ! 2988: warnstring = "declaration of `%s' shadows global declaration"; ! 2989: ! 2990: if (warnstring) ! 2991: warning (warnstring, IDENTIFIER_POINTER (name)); ! 2992: } ! 2993: ! 2994: /* If storing a local value, there may already be one (inherited). ! 2995: If so, record it for restoration when this binding level ends. */ ! 2996: if (oldlocal != NULL_TREE) ! 2997: b->shadowed = tree_cons (name, oldlocal, b->shadowed); ! 2998: } ! 2999: ! 3000: /* Keep count of variables in this level with incomplete type. */ ! 3001: if (TREE_CODE (x) != TEMPLATE_DECL ! 3002: && TREE_CODE (x) != CPLUS_CATCH_DECL ! 3003: && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE ! 3004: && PROMOTES_TO_AGGR_TYPE (TREE_TYPE (x), ARRAY_TYPE)) ! 3005: { ! 3006: if (++b->n_incomplete == 0) ! 3007: error ("too many incomplete variables at this point"); ! 3008: } ! 3009: } ! 3010: ! 3011: if (TREE_CODE (x) == TYPE_DECL && name != NULL_TREE) ! 3012: { ! 3013: #if !NEW_CLASS_SCOPING ! 3014: adjust_type_value (name); ! 3015: #endif ! 3016: if (current_class_name) ! 3017: { ! 3018: if (!DECL_NESTED_TYPENAME (x)) ! 3019: set_nested_typename (x, current_class_name, DECL_NAME (x), ! 3020: TREE_TYPE (x)); ! 3021: #if !NEW_CLASS_SCOPING ! 3022: adjust_type_value (DECL_NESTED_TYPENAME (x)); ! 3023: #endif ! 3024: } ! 3025: } ! 3026: ! 3027: /* Put decls on list in reverse order. ! 3028: We will reverse them later if necessary. */ ! 3029: TREE_CHAIN (x) = b->names; ! 3030: b->names = x; ! 3031: if (! (b != global_binding_level || TREE_PERMANENT (x))) ! 3032: my_friendly_abort (124); ! 3033: ! 3034: return x; ! 3035: } ! 3036: ! 3037: /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, ! 3038: if appropriate. */ ! 3039: tree ! 3040: pushdecl_top_level (x) ! 3041: tree x; ! 3042: { ! 3043: register tree t; ! 3044: register struct binding_level *b = current_binding_level; ! 3045: ! 3046: current_binding_level = global_binding_level; ! 3047: t = pushdecl (x); ! 3048: current_binding_level = b; ! 3049: if (class_binding_level) ! 3050: b = class_binding_level; ! 3051: /* Now, the type_shadowed stack may screw us. Munge it so it does ! 3052: what we want. */ ! 3053: if (TREE_CODE (x) == TYPE_DECL) ! 3054: { ! 3055: tree name = DECL_NAME (x); ! 3056: tree newval; ! 3057: tree *ptr = (tree *)0; ! 3058: for (; b != global_binding_level; b = b->level_chain) ! 3059: { ! 3060: tree shadowed = b->type_shadowed; ! 3061: for (; shadowed; shadowed = TREE_CHAIN (shadowed)) ! 3062: if (TREE_PURPOSE (shadowed) == name) ! 3063: { ! 3064: ptr = &TREE_VALUE (shadowed); ! 3065: /* Can't break out of the loop here because sometimes ! 3066: a binding level will have duplicate bindings for ! 3067: PT names. It's gross, but I haven't time to fix it. */ ! 3068: } ! 3069: } ! 3070: newval = TREE_TYPE (x); ! 3071: if (ptr == (tree *)0) ! 3072: { ! 3073: /* @@ This shouldn't be needed. My test case "zstring.cc" trips ! 3074: up here if this is changed to an assertion. --KR */ ! 3075: SET_IDENTIFIER_TYPE_VALUE (name, newval); ! 3076: } ! 3077: else ! 3078: { ! 3079: #if 0 ! 3080: /* Disabled this 11/10/92, since there are many cases which ! 3081: behave just fine when *ptr doesn't satisfy either of these. ! 3082: For example, nested classes declared as friends of their enclosing ! 3083: class will not meet this criteria. (bpk) */ ! 3084: my_friendly_assert (*ptr == NULL_TREE || *ptr == newval, 141); ! 3085: #endif ! 3086: *ptr = newval; ! 3087: } ! 3088: } ! 3089: return t; ! 3090: } ! 3091: ! 3092: /* Like push_overloaded_decl, only it places X in GLOBAL_BINDING_LEVEL, ! 3093: if appropriate. */ ! 3094: void ! 3095: push_overloaded_decl_top_level (x, forget) ! 3096: tree x; ! 3097: int forget; ! 3098: { ! 3099: struct binding_level *b = current_binding_level; ! 3100: ! 3101: current_binding_level = global_binding_level; ! 3102: push_overloaded_decl (x, forget); ! 3103: current_binding_level = b; ! 3104: } ! 3105: ! 3106: /* Make the declaration of X appear in CLASS scope. */ ! 3107: tree ! 3108: pushdecl_class_level (x) ! 3109: tree x; ! 3110: { ! 3111: /* Don't use DECL_ASSEMBLER_NAME here! Everything that looks in class ! 3112: scope looks for the pre-mangled name. */ ! 3113: register tree name = DECL_NAME (x); ! 3114: ! 3115: if (name) ! 3116: { ! 3117: #if NEW_CLASS_SCOPING ! 3118: push_class_level_binding (name, x); ! 3119: if (TREE_CODE (x) == TYPE_DECL) ! 3120: { ! 3121: set_identifier_type_value (name, TREE_TYPE (x)); ! 3122: if (!DECL_NESTED_TYPENAME (x)) ! 3123: set_nested_typename (x, current_class_name, name, TREE_TYPE (x)); ! 3124: } ! 3125: #else ! 3126: tree oldclass = IDENTIFIER_CLASS_VALUE (name); ! 3127: if (oldclass) ! 3128: class_binding_level->class_shadowed ! 3129: = tree_cons (name, oldclass, class_binding_level->class_shadowed); ! 3130: IDENTIFIER_CLASS_VALUE (name) = x; ! 3131: obstack_ptr_grow (&decl_obstack, x); ! 3132: if (TREE_CODE (x) == TYPE_DECL && !DECL_NESTED_TYPENAME (x)) ! 3133: set_nested_typename (x, current_class_name, name, TREE_TYPE (x)); ! 3134: #endif ! 3135: } ! 3136: return x; ! 3137: } ! 3138: ! 3139: #if NEW_CLASS_SCOPING ! 3140: /* Make the declaration(s) of X appear in CLASS scope ! 3141: under the name NAME. */ ! 3142: void ! 3143: push_class_level_binding (name, x) ! 3144: tree name; ! 3145: tree x; ! 3146: { ! 3147: maybe_push_cache_obstack (); ! 3148: class_binding_level->class_shadowed ! 3149: = tree_cons (name, IDENTIFIER_CLASS_VALUE (name), ! 3150: class_binding_level->class_shadowed); ! 3151: pop_obstacks (); ! 3152: IDENTIFIER_CLASS_VALUE (name) = x; ! 3153: obstack_ptr_grow (&decl_obstack, x); ! 3154: } ! 3155: #endif ! 3156: ! 3157: /* Tell caller how to interpret a TREE_LIST which contains ! 3158: chains of FUNCTION_DECLS. */ ! 3159: int ! 3160: overloaded_globals_p (list) ! 3161: tree list; ! 3162: { ! 3163: my_friendly_assert (TREE_CODE (list) == TREE_LIST, 142); ! 3164: ! 3165: /* Don't commit caller to seeing them as globals. */ ! 3166: if (TREE_NONLOCAL_FLAG (list)) ! 3167: return -1; ! 3168: /* Do commit caller to seeing them as globals. */ ! 3169: if (TREE_CODE (TREE_PURPOSE (list)) == IDENTIFIER_NODE) ! 3170: return 1; ! 3171: /* Do commit caller to not seeing them as globals. */ ! 3172: return 0; ! 3173: } ! 3174: ! 3175: /* DECL is a FUNCTION_DECL which may have other definitions already in place. ! 3176: We get around this by making IDENTIFIER_GLOBAL_VALUE (DECL_NAME (DECL)) ! 3177: point to a list of all the things that want to be referenced by that name. ! 3178: It is then up to the users of that name to decide what to do with that ! 3179: list. ! 3180: ! 3181: DECL may also be a TEMPLATE_DECL, with a FUNCTION_DECL in its DECL_RESULT ! 3182: slot. It is dealt with the same way. ! 3183: ! 3184: The value returned may be a previous declaration if we guessed wrong ! 3185: about what language DECL should belong to (C or C++). Otherwise, ! 3186: it's always DECL (and never something that's not a _DECL). */ ! 3187: tree ! 3188: push_overloaded_decl (decl, forgettable) ! 3189: tree decl; ! 3190: int forgettable; ! 3191: { ! 3192: tree orig_name = DECL_NAME (decl); ! 3193: tree glob = IDENTIFIER_GLOBAL_VALUE (orig_name); ! 3194: ! 3195: DECL_OVERLOADED (decl) = 1; ! 3196: if (glob) ! 3197: { ! 3198: if (TREE_CODE (glob) != TREE_LIST) ! 3199: { ! 3200: if (DECL_HAS_C_LINKAGE (decl)) ! 3201: { ! 3202: if (TREE_CODE (glob) == FUNCTION_DECL) ! 3203: { ! 3204: if (DECL_HAS_C_LINKAGE (glob)) ! 3205: { ! 3206: cp_error ("C-language function `%D' overloaded here", decl); ! 3207: cp_error_at ("Previous C-language version of this function was `%D'", glob); ! 3208: } ! 3209: } ! 3210: else ! 3211: my_friendly_abort (9); ! 3212: } ! 3213: if (forgettable ! 3214: && ! flag_traditional ! 3215: && TREE_PERMANENT (glob) == 1 ! 3216: && !global_bindings_p ()) ! 3217: overloads_to_forget = tree_cons (orig_name, glob, overloads_to_forget); ! 3218: /* We cache the value of builtin functions as ADDR_EXPRs ! 3219: in the name space. Convert it to some kind of _DECL after ! 3220: remembering what to forget. */ ! 3221: if (TREE_CODE (glob) == ADDR_EXPR) ! 3222: glob = TREE_OPERAND (glob, 0); ! 3223: ! 3224: if (TREE_CODE (glob) == FUNCTION_DECL ! 3225: && ! DECLS_SAME_LINKAGE (glob, decl) ! 3226: && comptypes (TREE_TYPE (glob), TREE_TYPE (decl), 2)) ! 3227: { ! 3228: if (current_lang_stack == current_lang_base) ! 3229: { ! 3230: DECL_LANGUAGE (decl) = DECL_LANGUAGE (glob); ! 3231: return glob; ! 3232: } ! 3233: else ! 3234: { ! 3235: cp_error ("conflicting language contexts for declaration of `%D';", decl); ! 3236: cp_error_at ("conflicts with previous declaration here", glob); ! 3237: } ! 3238: } ! 3239: if (pedantic && TREE_CODE (glob) == VAR_DECL) ! 3240: { ! 3241: my_friendly_assert (TREE_CODE_CLASS (TREE_CODE (glob)) == 'd', 143); ! 3242: cp_error ("non-function declaration `%D'", glob); ! 3243: cp_error_at ("conflicts with function declaration `%D'", decl); ! 3244: } ! 3245: glob = tree_cons (orig_name, glob, NULL_TREE); ! 3246: glob = tree_cons (TREE_PURPOSE (glob), decl, glob); ! 3247: IDENTIFIER_GLOBAL_VALUE (orig_name) = glob; ! 3248: TREE_TYPE (glob) = unknown_type_node; ! 3249: return decl; ! 3250: } ! 3251: ! 3252: if (TREE_VALUE (glob) == NULL_TREE) ! 3253: { ! 3254: TREE_VALUE (glob) = decl; ! 3255: return decl; ! 3256: } ! 3257: if (TREE_CODE (decl) != TEMPLATE_DECL) ! 3258: { ! 3259: tree name = DECL_ASSEMBLER_NAME (decl); ! 3260: tree tmp; ! 3261: ! 3262: for (tmp = glob; tmp; tmp = TREE_CHAIN (tmp)) ! 3263: { ! 3264: if (TREE_CODE (TREE_VALUE (tmp)) == FUNCTION_DECL ! 3265: && comptypes (TREE_TYPE (TREE_VALUE (tmp)), TREE_TYPE (decl), ! 3266: 2)) ! 3267: { ! 3268: if (! DECLS_SAME_LINKAGE (TREE_VALUE (tmp), decl)) ! 3269: { ! 3270: cp_error_at ("conflicting language contexts for declaration of `%D';", decl); ! 3271: cp_error_at ("conflicts with previous declaration here", TREE_VALUE (tmp)); ! 3272: } ! 3273: else if (TREE_CODE (TREE_VALUE (tmp)) != TEMPLATE_DECL ! 3274: && DECL_ASSEMBLER_NAME (TREE_VALUE (tmp)) != name) ! 3275: { ! 3276: cp_error ("new declaration `%#D'", decl); ! 3277: cp_error_at ("ambiguates old declaration `%#D'", ! 3278: TREE_VALUE (tmp)); ! 3279: } ! 3280: } ! 3281: /* If we really have seen this before, then if it ambiguates ! 3282: something, we've already given an error before. */ ! 3283: if (TREE_CODE (TREE_VALUE (tmp)) != TEMPLATE_DECL ! 3284: && DECL_ASSEMBLER_NAME (TREE_VALUE (tmp)) == name) ! 3285: return decl; ! 3286: } ! 3287: } ! 3288: } ! 3289: if (DECL_HAS_C_LINKAGE (decl)) ! 3290: { ! 3291: tree decls = glob; ! 3292: while (decls && DECL_HAS_CPLUSPLUS_LINKAGE (TREE_VALUE (decls))) ! 3293: decls = TREE_CHAIN (decls); ! 3294: if (decls) ! 3295: { ! 3296: cp_error ("C-language function `%D' overloaded here", decl); ! 3297: cp_error_at ! 3298: ("Previous C-language version of this function was `%D'", ! 3299: TREE_VALUE (decls)); ! 3300: } ! 3301: } ! 3302: ! 3303: if (forgettable ! 3304: && ! flag_traditional ! 3305: && (glob == NULL_TREE || TREE_PERMANENT (glob) == 1) ! 3306: && !global_bindings_p () ! 3307: && !pseudo_global_level_p ()) ! 3308: overloads_to_forget = tree_cons (orig_name, glob, overloads_to_forget); ! 3309: glob = tree_cons (orig_name, decl, glob); ! 3310: IDENTIFIER_GLOBAL_VALUE (orig_name) = glob; ! 3311: TREE_TYPE (glob) = unknown_type_node; ! 3312: return decl; ! 3313: } ! 3314: ! 3315: /* Generate an implicit declaration for identifier FUNCTIONID ! 3316: as a function of type int (). Print a warning if appropriate. */ ! 3317: ! 3318: tree ! 3319: implicitly_declare (functionid) ! 3320: tree functionid; ! 3321: { ! 3322: register tree decl; ! 3323: int temp = allocation_temporary_p (); ! 3324: ! 3325: push_obstacks_nochange (); ! 3326: ! 3327: /* Save the decl permanently so we can warn if definition follows. ! 3328: In ANSI C, warn_implicit is usually false, so the saves little space. ! 3329: But in C++, it's usually true, hence the extra code. */ ! 3330: if (temp && (flag_traditional || !warn_implicit ! 3331: || current_binding_level == global_binding_level)) ! 3332: end_temporary_allocation (); ! 3333: ! 3334: /* We used to reuse an old implicit decl here, ! 3335: but this loses with inline functions because it can clobber ! 3336: the saved decl chains. */ ! 3337: decl = build_lang_decl (FUNCTION_DECL, functionid, default_function_type); ! 3338: ! 3339: DECL_EXTERNAL (decl) = 1; ! 3340: TREE_PUBLIC (decl) = 1; ! 3341: ! 3342: /* ANSI standard says implicit declarations are in the innermost block. ! 3343: So we record the decl in the standard fashion. ! 3344: If flag_traditional is set, pushdecl does it top-level. */ ! 3345: pushdecl (decl); ! 3346: rest_of_decl_compilation (decl, NULL_PTR, 0, 0); ! 3347: ! 3348: if (warn_implicit ! 3349: /* Only one warning per identifier. */ ! 3350: && IDENTIFIER_IMPLICIT_DECL (functionid) == NULL_TREE) ! 3351: { ! 3352: cp_pedwarn ("implicit declaration of function `%#D'", decl); ! 3353: } ! 3354: ! 3355: SET_IDENTIFIER_IMPLICIT_DECL (functionid, decl); ! 3356: ! 3357: pop_obstacks (); ! 3358: ! 3359: return decl; ! 3360: } ! 3361: ! 3362: /* Return zero if the declaration NEWDECL is valid ! 3363: when the declaration OLDDECL (assumed to be for the same name) ! 3364: has already been seen. ! 3365: Otherwise return an error message format string with a %s ! 3366: where the identifier should go. */ ! 3367: ! 3368: static char * ! 3369: redeclaration_error_message (newdecl, olddecl) ! 3370: tree newdecl, olddecl; ! 3371: { ! 3372: if (TREE_CODE (newdecl) == TYPE_DECL) ! 3373: { ! 3374: /* Because C++ can put things into name space for free, ! 3375: constructs like "typedef struct foo { ... } foo" ! 3376: would look like an erroneous redeclaration. */ ! 3377: if (comptypes (newdecl, olddecl, 0)) ! 3378: return 0; ! 3379: else ! 3380: return "redefinition of `%s'"; ! 3381: } ! 3382: else if (TREE_CODE (newdecl) == FUNCTION_DECL) ! 3383: { ! 3384: /* If this is a pure function, its olddecl will actually be ! 3385: the original initialization to `0' (which we force to call ! 3386: abort()). Don't complain about redefinition in this case. */ ! 3387: if (DECL_LANG_SPECIFIC (olddecl) && DECL_ABSTRACT_VIRTUAL_P (olddecl)) ! 3388: return 0; ! 3389: ! 3390: /* Declarations of functions can insist on internal linkage ! 3391: but they can't be inconsistent with internal linkage, ! 3392: so there can be no error on that account. ! 3393: However defining the same name twice is no good. */ ! 3394: if (DECL_INITIAL (olddecl) != NULL_TREE ! 3395: && DECL_INITIAL (newdecl) != NULL_TREE ! 3396: /* However, defining once as extern inline and a second ! 3397: time in another way is ok. */ ! 3398: && !(DECL_INLINE (olddecl) && DECL_EXTERNAL (olddecl) ! 3399: && !(DECL_INLINE (newdecl) && DECL_EXTERNAL (newdecl)))) ! 3400: { ! 3401: if (DECL_NAME (olddecl) == NULL_TREE) ! 3402: return "`%s' not declared in class"; ! 3403: else ! 3404: return "redefinition of `%s'"; ! 3405: } ! 3406: return 0; ! 3407: } ! 3408: else if (current_binding_level == global_binding_level) ! 3409: { ! 3410: /* Objects declared at top level: */ ! 3411: /* If at least one is a reference, it's ok. */ ! 3412: if (DECL_EXTERNAL (newdecl) || DECL_EXTERNAL (olddecl)) ! 3413: return 0; ! 3414: /* Reject two definitions. */ ! 3415: if (DECL_INITIAL (olddecl) != NULL_TREE ! 3416: && DECL_INITIAL (newdecl) != NULL_TREE) ! 3417: return "redefinition of `%s'"; ! 3418: /* Now we have two tentative defs, or one tentative and one real def. */ ! 3419: /* Insist that the linkage match. */ ! 3420: if (TREE_PUBLIC (olddecl) != TREE_PUBLIC (newdecl)) ! 3421: return "conflicting declarations of `%s'"; ! 3422: return 0; ! 3423: } ! 3424: else ! 3425: { ! 3426: /* Objects declared with block scope: */ ! 3427: /* Reject two definitions, and reject a definition ! 3428: together with an external reference. */ ! 3429: if (!(DECL_EXTERNAL (newdecl) && DECL_EXTERNAL (olddecl))) ! 3430: return "redeclaration of `%s'"; ! 3431: return 0; ! 3432: } ! 3433: } ! 3434: ! 3435: /* Get the LABEL_DECL corresponding to identifier ID as a label. ! 3436: Create one if none exists so far for the current function. ! 3437: This function is called for both label definitions and label references. */ ! 3438: ! 3439: tree ! 3440: lookup_label (id) ! 3441: tree id; ! 3442: { ! 3443: register tree decl = IDENTIFIER_LABEL_VALUE (id); ! 3444: ! 3445: if (current_function_decl == NULL_TREE) ! 3446: { ! 3447: error ("label `%s' referenced outside of any function", ! 3448: IDENTIFIER_POINTER (id)); ! 3449: return NULL_TREE; ! 3450: } ! 3451: ! 3452: if ((decl == NULL_TREE ! 3453: || DECL_SOURCE_LINE (decl) == 0) ! 3454: && (named_label_uses == NULL_TREE ! 3455: || TREE_PURPOSE (named_label_uses) != current_binding_level->names ! 3456: || TREE_VALUE (named_label_uses) != decl)) ! 3457: { ! 3458: named_label_uses ! 3459: = tree_cons (current_binding_level->names, decl, named_label_uses); ! 3460: TREE_TYPE (named_label_uses) = (tree)current_binding_level; ! 3461: } ! 3462: ! 3463: /* Use a label already defined or ref'd with this name. */ ! 3464: if (decl != NULL_TREE) ! 3465: { ! 3466: /* But not if it is inherited and wasn't declared to be inheritable. */ ! 3467: if (DECL_CONTEXT (decl) != current_function_decl ! 3468: && ! C_DECLARED_LABEL_FLAG (decl)) ! 3469: return shadow_label (id); ! 3470: return decl; ! 3471: } ! 3472: ! 3473: decl = build_decl (LABEL_DECL, id, void_type_node); ! 3474: ! 3475: /* A label not explicitly declared must be local to where it's ref'd. */ ! 3476: DECL_CONTEXT (decl) = current_function_decl; ! 3477: ! 3478: DECL_MODE (decl) = VOIDmode; ! 3479: ! 3480: /* Say where one reference is to the label, ! 3481: for the sake of the error if it is not defined. */ ! 3482: DECL_SOURCE_LINE (decl) = lineno; ! 3483: DECL_SOURCE_FILE (decl) = input_filename; ! 3484: ! 3485: SET_IDENTIFIER_LABEL_VALUE (id, decl); ! 3486: ! 3487: named_labels = tree_cons (NULL_TREE, decl, named_labels); ! 3488: TREE_VALUE (named_label_uses) = decl; ! 3489: ! 3490: return decl; ! 3491: } ! 3492: ! 3493: /* Make a label named NAME in the current function, ! 3494: shadowing silently any that may be inherited from containing functions ! 3495: or containing scopes. ! 3496: ! 3497: Note that valid use, if the label being shadowed ! 3498: comes from another scope in the same function, ! 3499: requires calling declare_nonlocal_label right away. */ ! 3500: ! 3501: tree ! 3502: shadow_label (name) ! 3503: tree name; ! 3504: { ! 3505: register tree decl = IDENTIFIER_LABEL_VALUE (name); ! 3506: ! 3507: if (decl != NULL_TREE) ! 3508: { ! 3509: shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels); ! 3510: SET_IDENTIFIER_LABEL_VALUE (name, NULL_TREE); ! 3511: SET_IDENTIFIER_LABEL_VALUE (decl, NULL_TREE); ! 3512: } ! 3513: ! 3514: return lookup_label (name); ! 3515: } ! 3516: ! 3517: /* Define a label, specifying the location in the source file. ! 3518: Return the LABEL_DECL node for the label, if the definition is valid. ! 3519: Otherwise return 0. */ ! 3520: ! 3521: tree ! 3522: define_label (filename, line, name) ! 3523: char *filename; ! 3524: int line; ! 3525: tree name; ! 3526: { ! 3527: tree decl = lookup_label (name); ! 3528: ! 3529: /* After labels, make any new cleanups go into their ! 3530: own new (temporary) binding contour. */ ! 3531: current_binding_level->more_cleanups_ok = 0; ! 3532: ! 3533: /* If label with this name is known from an outer context, shadow it. */ ! 3534: if (decl != NULL_TREE && DECL_CONTEXT (decl) != current_function_decl) ! 3535: { ! 3536: shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels); ! 3537: SET_IDENTIFIER_LABEL_VALUE (name, NULL_TREE); ! 3538: decl = lookup_label (name); ! 3539: } ! 3540: ! 3541: if (DECL_INITIAL (decl) != NULL_TREE) ! 3542: { ! 3543: cp_error ("duplicate label `%D'", decl); ! 3544: return 0; ! 3545: } ! 3546: else ! 3547: { ! 3548: tree uses, prev; ! 3549: ! 3550: /* Mark label as having been defined. */ ! 3551: DECL_INITIAL (decl) = error_mark_node; ! 3552: /* Say where in the source. */ ! 3553: DECL_SOURCE_FILE (decl) = filename; ! 3554: DECL_SOURCE_LINE (decl) = line; ! 3555: ! 3556: for (prev = NULL_TREE, uses = named_label_uses; ! 3557: uses; ! 3558: prev = uses, uses = TREE_CHAIN (uses)) ! 3559: if (TREE_VALUE (uses) == decl) ! 3560: { ! 3561: struct binding_level *b = current_binding_level; ! 3562: while (b) ! 3563: { ! 3564: tree new_decls = b->names; ! 3565: tree old_decls = ((tree)b == TREE_TYPE (uses) ! 3566: ? TREE_PURPOSE (uses) : NULL_TREE); ! 3567: while (new_decls != old_decls) ! 3568: { ! 3569: if (TREE_CODE (new_decls) == VAR_DECL ! 3570: /* Don't complain about crossing initialization ! 3571: of internal entities. They can't be accessed, ! 3572: and they should be cleaned up ! 3573: by the time we get to the label. */ ! 3574: && DECL_SOURCE_LINE (new_decls) != 0 ! 3575: && ((DECL_INITIAL (new_decls) != NULL_TREE ! 3576: && DECL_INITIAL (new_decls) != error_mark_node) ! 3577: || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (new_decls)))) ! 3578: { ! 3579: if (IDENTIFIER_ERROR_LOCUS (decl) == NULL_TREE) ! 3580: cp_error ("invalid jump to label `%D'", decl); ! 3581: SET_IDENTIFIER_ERROR_LOCUS (decl, current_function_decl); ! 3582: cp_error ("crosses initialization of `%D'", new_decls); ! 3583: } ! 3584: new_decls = TREE_CHAIN (new_decls); ! 3585: } ! 3586: if ((tree)b == TREE_TYPE (uses)) ! 3587: break; ! 3588: b = b->level_chain; ! 3589: } ! 3590: ! 3591: if (prev) ! 3592: TREE_CHAIN (prev) = TREE_CHAIN (uses); ! 3593: else ! 3594: named_label_uses = TREE_CHAIN (uses); ! 3595: } ! 3596: current_function_return_value = NULL_TREE; ! 3597: return decl; ! 3598: } ! 3599: } ! 3600: ! 3601: /* Same, but for CASE labels. If DECL is NULL_TREE, it's the default. */ ! 3602: /* XXX Note decl is never actually used. (bpk) */ ! 3603: void ! 3604: define_case_label (decl) ! 3605: tree decl; ! 3606: { ! 3607: tree cleanup = last_cleanup_this_contour (); ! 3608: if (cleanup) ! 3609: { ! 3610: static int explained = 0; ! 3611: cp_error_at ("destructor needed for `%#D'", TREE_PURPOSE (cleanup)); ! 3612: error ("where case label appears here"); ! 3613: if (!explained) ! 3614: { ! 3615: error ("(enclose actions of previous case statements requiring"); ! 3616: error ("destructors in their own binding contours.)"); ! 3617: explained = 1; ! 3618: } ! 3619: } ! 3620: ! 3621: /* After labels, make any new cleanups go into their ! 3622: own new (temporary) binding contour. */ ! 3623: ! 3624: current_binding_level->more_cleanups_ok = 0; ! 3625: current_function_return_value = NULL_TREE; ! 3626: } ! 3627: ! 3628: /* Return the list of declarations of the current level. ! 3629: Note that this list is in reverse order unless/until ! 3630: you nreverse it; and when you do nreverse it, you must ! 3631: store the result back using `storedecls' or you will lose. */ ! 3632: ! 3633: tree ! 3634: getdecls () ! 3635: { ! 3636: return current_binding_level->names; ! 3637: } ! 3638: ! 3639: /* Return the list of type-tags (for structs, etc) of the current level. */ ! 3640: ! 3641: tree ! 3642: gettags () ! 3643: { ! 3644: return current_binding_level->tags; ! 3645: } ! 3646: ! 3647: /* Store the list of declarations of the current level. ! 3648: This is done for the parameter declarations of a function being defined, ! 3649: after they are modified in the light of any missing parameters. */ ! 3650: ! 3651: static void ! 3652: storedecls (decls) ! 3653: tree decls; ! 3654: { ! 3655: current_binding_level->names = decls; ! 3656: } ! 3657: ! 3658: /* Similarly, store the list of tags of the current level. */ ! 3659: ! 3660: static void ! 3661: storetags (tags) ! 3662: tree tags; ! 3663: { ! 3664: current_binding_level->tags = tags; ! 3665: } ! 3666: ! 3667: /* Given NAME, an IDENTIFIER_NODE, ! 3668: return the structure (or union or enum) definition for that name. ! 3669: Searches binding levels from BINDING_LEVEL up to the global level. ! 3670: If THISLEVEL_ONLY is nonzero, searches only the specified context ! 3671: (but skips any tag-transparent contexts to find one that is ! 3672: meaningful for tags). ! 3673: FORM says which kind of type the caller wants; ! 3674: it is RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE. ! 3675: If the wrong kind of type is found, and it's not a template, an error is ! 3676: reported. */ ! 3677: ! 3678: static tree ! 3679: lookup_tag (form, name, binding_level, thislevel_only) ! 3680: enum tree_code form; ! 3681: struct binding_level *binding_level; ! 3682: tree name; ! 3683: int thislevel_only; ! 3684: { ! 3685: register struct binding_level *level; ! 3686: ! 3687: for (level = binding_level; level; level = level->level_chain) ! 3688: { ! 3689: register tree tail; ! 3690: if (ANON_AGGRNAME_P (name)) ! 3691: for (tail = level->tags; tail; tail = TREE_CHAIN (tail)) ! 3692: { ! 3693: /* There's no need for error checking here, because ! 3694: anon names are unique throughout the compilation. */ ! 3695: if (TYPE_IDENTIFIER (TREE_VALUE (tail)) == name) ! 3696: return TREE_VALUE (tail); ! 3697: } ! 3698: else ! 3699: for (tail = level->tags; tail; tail = TREE_CHAIN (tail)) ! 3700: { ! 3701: if (TREE_PURPOSE (tail) == name) ! 3702: { ! 3703: enum tree_code code = TREE_CODE (TREE_VALUE (tail)); ! 3704: /* Should tighten this up; it'll probably permit ! 3705: UNION_TYPE and a struct template, for example. */ ! 3706: if (code != form ! 3707: && !(form != ENUMERAL_TYPE ! 3708: && (code == TEMPLATE_DECL ! 3709: || code == UNINSTANTIATED_P_TYPE))) ! 3710: ! 3711: { ! 3712: /* Definition isn't the kind we were looking for. */ ! 3713: cp_error ("`%#D' redeclared as %C", TREE_VALUE (tail), ! 3714: form); ! 3715: } ! 3716: return TREE_VALUE (tail); ! 3717: } ! 3718: } ! 3719: if (thislevel_only && ! level->tag_transparent) ! 3720: return NULL_TREE; ! 3721: if (current_class_type && level->level_chain == global_binding_level) ! 3722: { ! 3723: /* Try looking in this class's tags before heading into ! 3724: global binding level. */ ! 3725: tree context = current_class_type; ! 3726: while (context) ! 3727: { ! 3728: switch (TREE_CODE_CLASS (TREE_CODE (context))) ! 3729: { ! 3730: case 't': ! 3731: { ! 3732: tree these_tags = CLASSTYPE_TAGS (context); ! 3733: if (ANON_AGGRNAME_P (name)) ! 3734: while (these_tags) ! 3735: { ! 3736: if (TYPE_IDENTIFIER (TREE_VALUE (these_tags)) ! 3737: == name) ! 3738: return TREE_VALUE (tail); ! 3739: these_tags = TREE_CHAIN (these_tags); ! 3740: } ! 3741: else ! 3742: while (these_tags) ! 3743: { ! 3744: if (TREE_PURPOSE (these_tags) == name) ! 3745: { ! 3746: if (TREE_CODE (TREE_VALUE (these_tags)) != form) ! 3747: { ! 3748: cp_error ("`%#D' redeclared as %C in class scope", ! 3749: TREE_VALUE (tail), form); ! 3750: } ! 3751: return TREE_VALUE (tail); ! 3752: } ! 3753: these_tags = TREE_CHAIN (these_tags); ! 3754: } ! 3755: /* If this type is not yet complete, then don't ! 3756: look at its context. */ ! 3757: if (TYPE_SIZE (context) == NULL_TREE) ! 3758: goto no_context; ! 3759: /* Go to next enclosing type, if any. */ ! 3760: context = DECL_CONTEXT (TYPE_NAME (context)); ! 3761: break; ! 3762: case 'd': ! 3763: context = DECL_CONTEXT (context); ! 3764: break; ! 3765: default: ! 3766: my_friendly_abort (10); ! 3767: } ! 3768: continue; ! 3769: } ! 3770: no_context: ! 3771: break; ! 3772: } ! 3773: } ! 3774: } ! 3775: return NULL_TREE; ! 3776: } ! 3777: ! 3778: void ! 3779: set_current_level_tags_transparency (tags_transparent) ! 3780: int tags_transparent; ! 3781: { ! 3782: current_binding_level->tag_transparent = tags_transparent; ! 3783: } ! 3784: ! 3785: /* Given a type, find the tag that was defined for it and return the tag name. ! 3786: Otherwise return 0. However, the value can never be 0 ! 3787: in the cases in which this is used. ! 3788: ! 3789: C++: If NAME is non-zero, this is the new name to install. This is ! 3790: done when replacing anonymous tags with real tag names. */ ! 3791: ! 3792: static tree ! 3793: lookup_tag_reverse (type, name) ! 3794: tree type; ! 3795: tree name; ! 3796: { ! 3797: register struct binding_level *level; ! 3798: ! 3799: for (level = current_binding_level; level; level = level->level_chain) ! 3800: { ! 3801: register tree tail; ! 3802: for (tail = level->tags; tail; tail = TREE_CHAIN (tail)) ! 3803: { ! 3804: if (TREE_VALUE (tail) == type) ! 3805: { ! 3806: if (name) ! 3807: TREE_PURPOSE (tail) = name; ! 3808: return TREE_PURPOSE (tail); ! 3809: } ! 3810: } ! 3811: } ! 3812: return NULL_TREE; ! 3813: } ! 3814: ! 3815: /* Given type TYPE which was not declared in C++ language context, ! 3816: attempt to find a name by which it is referred. */ ! 3817: tree ! 3818: typedecl_for_tag (tag) ! 3819: tree tag; ! 3820: { ! 3821: struct binding_level *b = current_binding_level; ! 3822: ! 3823: if (TREE_CODE (TYPE_NAME (tag)) == TYPE_DECL) ! 3824: return TYPE_NAME (tag); ! 3825: ! 3826: while (b) ! 3827: { ! 3828: tree decls = b->names; ! 3829: while (decls) ! 3830: { ! 3831: if (TREE_CODE (decls) == TYPE_DECL && TREE_TYPE (decls) == tag) ! 3832: break; ! 3833: decls = TREE_CHAIN (decls); ! 3834: } ! 3835: if (decls) ! 3836: return decls; ! 3837: b = b->level_chain; ! 3838: } ! 3839: return NULL_TREE; ! 3840: } ! 3841: ! 3842: /* Called when we must retroactively globalize a type we previously ! 3843: thought needed to be nested. This happens, for example, when ! 3844: a `friend class' declaration is seen for an undefined type. */ ! 3845: ! 3846: static void ! 3847: globalize_nested_type (type) ! 3848: tree type; ! 3849: { ! 3850: tree t, prev = NULL_TREE, d = TYPE_NAME (type); ! 3851: struct binding_level *b; ! 3852: tree name = DECL_NAME (d); ! 3853: #if NEW_CLASS_SCOPING ! 3854: tree class_shadower = NULL_TREE, type_shadower = NULL_TREE, shadow; ! 3855: #endif ! 3856: ! 3857: my_friendly_assert (TREE_CODE (d) == TYPE_DECL, 144); ! 3858: /* If the type value has already been globalized, then we're set. */ ! 3859: if (IDENTIFIER_GLOBAL_VALUE (name) == d) ! 3860: return; ! 3861: if (IDENTIFIER_HAS_TYPE_VALUE (name)) ! 3862: { ! 3863: /* If this type already made it into the global tags, ! 3864: silently return. */ ! 3865: if (value_member (type, global_binding_level->tags)) ! 3866: return; ! 3867: } ! 3868: ! 3869: #if NEW_CLASS_SCOPING ! 3870: if (DECL_LANG_SPECIFIC (d)) ! 3871: DECL_CLASS_CONTEXT (d) = NULL_TREE; ! 3872: #else ! 3873: set_identifier_type_value (DECL_NESTED_TYPENAME (d), NULL_TREE); ! 3874: #endif ! 3875: DECL_CONTEXT (d) = NULL_TREE; ! 3876: TYPE_CONTEXT (d) = NULL_TREE; ! 3877: DECL_NESTED_TYPENAME (d) = name; ! 3878: if (class_binding_level) ! 3879: b = class_binding_level; ! 3880: else ! 3881: b = current_binding_level; ! 3882: while (b != global_binding_level) ! 3883: { ! 3884: prev = NULL_TREE; ! 3885: if (b->parm_flag == 2) ! 3886: for (t = b->tags; t != NULL_TREE; prev = t, t = TREE_CHAIN (t)) ! 3887: if (TREE_VALUE (t) == type) ! 3888: goto found; ! 3889: #if NEW_CLASS_SCOPING ! 3890: /* Find (im?)possible objects shadowing the type we're globalizing. */ ! 3891: class_shadower = purpose_member (name, b->class_shadowed); ! 3892: type_shadower = purpose_member (name, b->type_shadowed); ! 3893: #endif ! 3894: b = b->level_chain; ! 3895: } ! 3896: /* We failed to find this tag anywhere up the binding chains. ! 3897: B is now the global binding level... check there. */ ! 3898: prev = NULL_TREE; ! 3899: if (b->parm_flag == 2) ! 3900: for (t = b->tags; t != NULL_TREE; prev = t, t = TREE_CHAIN (t)) ! 3901: if (TREE_VALUE (t) == type) ! 3902: goto foundglobal; ! 3903: /* It wasn't in global scope either, so this is an anonymous forward ref ! 3904: of some kind; let it happen. */ ! 3905: return; ! 3906: ! 3907: foundglobal: ! 3908: print_node_brief (stderr, "Tried to globalize already-global type ", ! 3909: type, 0); ! 3910: my_friendly_abort (11); ! 3911: ! 3912: found: ! 3913: /* Pull the tag out of the nested binding contour. */ ! 3914: if (prev) ! 3915: TREE_CHAIN (prev) = TREE_CHAIN (t); ! 3916: else ! 3917: b->tags = TREE_CHAIN (t); ! 3918: ! 3919: #if NEW_CLASS_SCOPING ! 3920: /* Find and remove the corresponding entry from the class_shadowed list, ! 3921: and move the shadowed value to a possibly later shadow. If there were ! 3922: no such beast (could there ever be?), install the previously shadowed ! 3923: value as the IDENTIFIER_CLASS_VALUE. */ ! 3924: prev = NULL_TREE; ! 3925: for (shadow = b->class_shadowed; ! 3926: shadow != NULL_TREE; ! 3927: prev = shadow, shadow = TREE_CHAIN (shadow)) ! 3928: if (TREE_PURPOSE (shadow) == name) ! 3929: break; ! 3930: ! 3931: if (shadow) ! 3932: { ! 3933: /* An example where shadow is NULL is when you have something ! 3934: like `class foo { public: struct bar; bar *x(); };', since ! 3935: bar isn't added to the class_shadowed list until it's been ! 3936: defined. */ ! 3937: ! 3938: if (prev) ! 3939: TREE_CHAIN (prev) = TREE_CHAIN (shadow); ! 3940: else ! 3941: b->class_shadowed = TREE_CHAIN (shadow); ! 3942: ! 3943: if (class_shadower) ! 3944: TREE_VALUE (class_shadower) = TREE_VALUE (shadow); ! 3945: else ! 3946: IDENTIFIER_CLASS_VALUE (name) = TREE_VALUE (shadow); ! 3947: } ! 3948: ! 3949: /* Find and remove the corresponding entry from the type_shadowed list, ! 3950: and move the shadowed value to a possibly later shadow. If there were ! 3951: no such beast (could there ever be?), install the previously shadowed ! 3952: value as the IDENTIFIER_TYPE_VALUE. */ ! 3953: prev = NULL_TREE; ! 3954: for (shadow = b->type_shadowed; ! 3955: shadow != NULL_TREE; ! 3956: prev = shadow, shadow = TREE_CHAIN (shadow)) ! 3957: if (TREE_PURPOSE (shadow) == name) ! 3958: break; ! 3959: ! 3960: if (shadow) ! 3961: { ! 3962: if (prev) ! 3963: TREE_CHAIN (prev) = TREE_CHAIN (shadow); ! 3964: else ! 3965: b->type_shadowed = TREE_CHAIN (shadow); ! 3966: ! 3967: if (type_shadower) ! 3968: TREE_VALUE (type_shadower) = TREE_VALUE (shadow); ! 3969: else ! 3970: SET_IDENTIFIER_TYPE_VALUE (name, TREE_VALUE (shadow)); ! 3971: } ! 3972: #else ! 3973: set_identifier_type_value (TREE_PURPOSE (t), TREE_VALUE (t)); ! 3974: #endif ! 3975: global_binding_level->tags ! 3976: = perm_tree_cons (TREE_PURPOSE (t), TREE_VALUE (t), ! 3977: global_binding_level->tags); ! 3978: ! 3979: /* Pull the tag out of the class's tags (if there). ! 3980: It won't show up if it appears e.g. in a parameter declaration ! 3981: or definition of a member function of this type. */ ! 3982: if (current_class_type != NULL_TREE) ! 3983: { ! 3984: for (t = CLASSTYPE_TAGS (current_class_type), prev = NULL_TREE; ! 3985: t != NULL_TREE; ! 3986: prev = t, t = TREE_CHAIN (t)) ! 3987: if (TREE_VALUE (t) == type) ! 3988: break; ! 3989: ! 3990: if (t != NULL_TREE) ! 3991: { ! 3992: if (prev) ! 3993: TREE_CHAIN (prev) = TREE_CHAIN (t); ! 3994: else ! 3995: CLASSTYPE_TAGS (current_class_type) = TREE_CHAIN (t); ! 3996: } ! 3997: } ! 3998: ! 3999: pushdecl_top_level (d); ! 4000: } ! 4001: ! 4002: static void ! 4003: maybe_globalize_type (type) ! 4004: tree type; ! 4005: { ! 4006: if ((((TREE_CODE (type) == RECORD_TYPE ! 4007: || TREE_CODE (type) == UNION_TYPE) ! 4008: && ! TYPE_BEING_DEFINED (type)) ! 4009: || TREE_CODE (type) == ENUMERAL_TYPE) ! 4010: && TYPE_SIZE (type) == NULL_TREE ! 4011: /* This part is gross. We keep calling here with types that ! 4012: are instantiations of templates, when that type should is ! 4013: global, or doesn't have the type decl established yet, ! 4014: so globalizing will fail (because it won't find the type in any ! 4015: non-global scope). So we short-circuit that path. */ ! 4016: && !(TYPE_NAME (type) != NULL_TREE ! 4017: && TYPE_IDENTIFIER (type) != NULL_TREE ! 4018: && ! IDENTIFIER_HAS_TYPE_VALUE (TYPE_IDENTIFIER (type))) ! 4019: ) ! 4020: globalize_nested_type (type); ! 4021: } ! 4022: ! 4023: /* Lookup TYPE in CONTEXT (a chain of nested types or a FUNCTION_DECL). ! 4024: Return the type value, or NULL_TREE if not found. */ ! 4025: static tree ! 4026: lookup_nested_type (type, context) ! 4027: tree type; ! 4028: tree context; ! 4029: { ! 4030: if (context == NULL_TREE) ! 4031: return NULL_TREE; ! 4032: while (context) ! 4033: { ! 4034: switch (TREE_CODE (context)) ! 4035: { ! 4036: case TYPE_DECL: ! 4037: { ! 4038: tree ctype = TREE_TYPE (context); ! 4039: tree match = value_member (type, CLASSTYPE_TAGS (ctype)); ! 4040: if (match) ! 4041: return TREE_VALUE (match); ! 4042: context = DECL_CONTEXT (context); ! 4043: ! 4044: /* When we have a nested class whose member functions have ! 4045: local types (e.g., a set of enums), we'll arrive here ! 4046: with the DECL_CONTEXT as the actual RECORD_TYPE node for ! 4047: the enclosing class. Instead, we want to make sure we ! 4048: come back in here with the TYPE_DECL, not the RECORD_TYPE. */ ! 4049: if (context && TREE_CODE (context) == RECORD_TYPE) ! 4050: context = TREE_CHAIN (context); ! 4051: } ! 4052: break; ! 4053: case FUNCTION_DECL: ! 4054: return TYPE_IDENTIFIER (type) ? lookup_name (TYPE_IDENTIFIER (type), 1) : NULL_TREE; ! 4055: break; ! 4056: default: ! 4057: my_friendly_abort (12); ! 4058: } ! 4059: } ! 4060: return NULL_TREE; ! 4061: } ! 4062: ! 4063: /* Look up NAME in the current binding level and its superiors in the ! 4064: namespace of variables, functions and typedefs. Return a ..._DECL ! 4065: node of some kind representing its definition if there is only one ! 4066: such declaration, or return a TREE_LIST with all the overloaded ! 4067: definitions if there are many, or return 0 if it is undefined. ! 4068: ! 4069: If PREFER_TYPE is > 0, we prefer TYPE_DECLs. ! 4070: If PREFER_TYPE is = 0, we prefer non-TYPE_DECLs. ! 4071: If PREFER_TYPE is < 0, we arbitrate according to lexical context. */ ! 4072: ! 4073: tree ! 4074: lookup_name (name, prefer_type) ! 4075: tree name; ! 4076: int prefer_type; ! 4077: { ! 4078: register tree val; ! 4079: ! 4080: if (current_binding_level != global_binding_level ! 4081: && IDENTIFIER_LOCAL_VALUE (name)) ! 4082: val = IDENTIFIER_LOCAL_VALUE (name); ! 4083: /* In C++ class fields are between local and global scope, ! 4084: just before the global scope. */ ! 4085: else if (current_class_type) ! 4086: { ! 4087: val = IDENTIFIER_CLASS_VALUE (name); ! 4088: if (val == NULL_TREE ! 4089: && TYPE_SIZE (current_class_type) == NULL_TREE ! 4090: && CLASSTYPE_LOCAL_TYPEDECLS (current_class_type)) ! 4091: { ! 4092: /* Try to find values from base classes ! 4093: if we are presently defining a type. ! 4094: We are presently only interested in TYPE_DECLs. */ ! 4095: val = lookup_field (current_class_type, name, 0, prefer_type < 0); ! 4096: if (val == error_mark_node) ! 4097: return val; ! 4098: if (val && TREE_CODE (val) != TYPE_DECL) ! 4099: val = NULL_TREE; ! 4100: } ! 4101: ! 4102: /* yylex() calls this with -2, since we should never start digging for ! 4103: the nested name at the point where we haven't even, for example, ! 4104: created the COMPONENT_REF or anything like that. */ ! 4105: if (val == NULL_TREE) ! 4106: val = lookup_nested_field (name, prefer_type != -2); ! 4107: ! 4108: if (val == NULL_TREE) ! 4109: val = IDENTIFIER_GLOBAL_VALUE (name); ! 4110: } ! 4111: else ! 4112: val = IDENTIFIER_GLOBAL_VALUE (name); ! 4113: ! 4114: if (val) ! 4115: { ! 4116: extern int looking_for_typename; ! 4117: ! 4118: /* Arbitrate between finding a TYPE_DECL and finding ! 4119: other kinds of _DECLs. */ ! 4120: if (TREE_CODE (val) == TYPE_DECL || looking_for_typename < 0) ! 4121: return val; ! 4122: ! 4123: if (IDENTIFIER_HAS_TYPE_VALUE (name)) ! 4124: { ! 4125: register tree val_as_type = TYPE_NAME (IDENTIFIER_TYPE_VALUE (name)); ! 4126: ! 4127: if (val == val_as_type || prefer_type > 0 ! 4128: || looking_for_typename > 0) ! 4129: return val_as_type; ! 4130: if (prefer_type == 0) ! 4131: return val; ! 4132: return arbitrate_lookup (name, val, val_as_type); ! 4133: } ! 4134: if (TREE_TYPE (val) == error_mark_node) ! 4135: return error_mark_node; ! 4136: } ! 4137: ! 4138: return val; ! 4139: } ! 4140: ! 4141: /* Similar to `lookup_name' but look only at current binding level. */ ! 4142: ! 4143: tree ! 4144: lookup_name_current_level (name) ! 4145: tree name; ! 4146: { ! 4147: register tree t; ! 4148: ! 4149: if (current_binding_level == global_binding_level) ! 4150: return IDENTIFIER_GLOBAL_VALUE (name); ! 4151: ! 4152: if (IDENTIFIER_LOCAL_VALUE (name) == NULL_TREE) ! 4153: return 0; ! 4154: ! 4155: for (t = current_binding_level->names; t; t = TREE_CHAIN (t)) ! 4156: if (DECL_NAME (t) == name) ! 4157: break; ! 4158: ! 4159: return t; ! 4160: } ! 4161: ! 4162: /* Arrange for the user to get a source line number, even when the ! 4163: compiler is going down in flames, so that she at least has a ! 4164: chance of working around problems in the compiler. We used to ! 4165: call error(), but that let the segmentation fault continue ! 4166: through; now, it's much more passive by asking them to send the ! 4167: maintainers mail about the problem. */ ! 4168: ! 4169: static void ! 4170: signal_catch (sig) ! 4171: int sig; ! 4172: { ! 4173: signal (SIGSEGV, SIG_DFL); ! 4174: #ifdef SIGIOT ! 4175: signal (SIGIOT, SIG_DFL); ! 4176: #endif ! 4177: #ifdef SIGILL ! 4178: signal (SIGILL, SIG_DFL); ! 4179: #endif ! 4180: #ifdef SIGABRT ! 4181: signal (SIGABRT, SIG_DFL); ! 4182: #endif ! 4183: #ifdef SIGBUS ! 4184: signal (SIGBUS, SIG_DFL); ! 4185: #endif ! 4186: printf ("signal_catch=%d\n", sig); ! 4187: my_friendly_abort (0); ! 4188: } ! 4189: ! 4190: /* Array for holding types considered "built-in". These types ! 4191: are output in the module in which `main' is defined. */ ! 4192: static tree *builtin_type_tdescs_arr; ! 4193: static int builtin_type_tdescs_len, builtin_type_tdescs_max; ! 4194: ! 4195: /* Push the declarations of builtin types into the namespace. ! 4196: RID_INDEX, if < RID_MAX is the index of the builtin type ! 4197: in the array RID_POINTERS. NAME is the name used when looking ! 4198: up the builtin type. TYPE is the _TYPE node for the builtin type. */ ! 4199: ! 4200: static void ! 4201: record_builtin_type (rid_index, name, type) ! 4202: enum rid rid_index; ! 4203: char *name; ! 4204: tree type; ! 4205: { ! 4206: tree rname = NULL_TREE, tname = NULL_TREE; ! 4207: tree tdecl; ! 4208: ! 4209: if ((int) rid_index < (int) RID_MAX) ! 4210: rname = ridpointers[(int) rid_index]; ! 4211: if (name) ! 4212: tname = get_identifier (name); ! 4213: ! 4214: TYPE_BUILT_IN (type) = 1; ! 4215: ! 4216: if (tname) ! 4217: { ! 4218: #if 0 /* not yet, should get fixed properly later */ ! 4219: tdecl = pushdecl (make_type_decl (tname, type)); ! 4220: #else ! 4221: tdecl = pushdecl (build_decl (TYPE_DECL, tname, type)); ! 4222: #endif ! 4223: set_identifier_type_value (tname, NULL_TREE); ! 4224: if ((int) rid_index < (int) RID_MAX) ! 4225: IDENTIFIER_GLOBAL_VALUE (tname) = tdecl; ! 4226: } ! 4227: if (rname != NULL_TREE) ! 4228: { ! 4229: if (tname != NULL_TREE) ! 4230: { ! 4231: set_identifier_type_value (rname, NULL_TREE); ! 4232: IDENTIFIER_GLOBAL_VALUE (rname) = tdecl; ! 4233: } ! 4234: else ! 4235: { ! 4236: #if 0 /* not yet, should get fixed properly later */ ! 4237: tdecl = pushdecl (make_type_decl (rname, type)); ! 4238: #else ! 4239: tdecl = pushdecl (build_decl (TYPE_DECL, rname, type)); ! 4240: #endif ! 4241: set_identifier_type_value (rname, NULL_TREE); ! 4242: } ! 4243: } ! 4244: ! 4245: if (flag_dossier) ! 4246: { ! 4247: if (builtin_type_tdescs_len+5 >= builtin_type_tdescs_max) ! 4248: { ! 4249: builtin_type_tdescs_max *= 2; ! 4250: builtin_type_tdescs_arr ! 4251: = (tree *)xrealloc (builtin_type_tdescs_arr, ! 4252: builtin_type_tdescs_max * sizeof (tree)); ! 4253: } ! 4254: builtin_type_tdescs_arr[builtin_type_tdescs_len++] = type; ! 4255: if (TREE_CODE (type) != POINTER_TYPE) ! 4256: { ! 4257: builtin_type_tdescs_arr[builtin_type_tdescs_len++] ! 4258: = build_pointer_type (type); ! 4259: builtin_type_tdescs_arr[builtin_type_tdescs_len++] ! 4260: = build_type_variant (TYPE_POINTER_TO (type), 1, 0); ! 4261: } ! 4262: if (TREE_CODE (type) != VOID_TYPE) ! 4263: { ! 4264: builtin_type_tdescs_arr[builtin_type_tdescs_len++] ! 4265: = build_reference_type (type); ! 4266: builtin_type_tdescs_arr[builtin_type_tdescs_len++] ! 4267: = build_type_variant (TYPE_REFERENCE_TO (type), 1, 0); ! 4268: } ! 4269: } ! 4270: } ! 4271: ! 4272: static void ! 4273: output_builtin_tdesc_entries () ! 4274: { ! 4275: extern struct obstack permanent_obstack; ! 4276: ! 4277: /* If there's more than one main in this file, don't crash. */ ! 4278: if (builtin_type_tdescs_arr == 0) ! 4279: return; ! 4280: ! 4281: push_obstacks (&permanent_obstack, &permanent_obstack); ! 4282: while (builtin_type_tdescs_len > 0) ! 4283: { ! 4284: tree type = builtin_type_tdescs_arr[--builtin_type_tdescs_len]; ! 4285: tree tdesc = build_t_desc (type, 0); ! 4286: TREE_ASM_WRITTEN (tdesc) = 0; ! 4287: build_t_desc (type, 2); ! 4288: } ! 4289: free (builtin_type_tdescs_arr); ! 4290: builtin_type_tdescs_arr = 0; ! 4291: pop_obstacks (); ! 4292: } ! 4293: ! 4294: /* Push overloaded decl, in global scope, with one argument so it ! 4295: can be used as a callback from define_function. */ ! 4296: static void ! 4297: push_overloaded_decl_1 (x) ! 4298: tree x; ! 4299: { ! 4300: push_overloaded_decl (x, 0); ! 4301: } ! 4302: ! 4303: /* Create the predefined scalar types of C, ! 4304: and some nodes representing standard constants (0, 1, (void *)0). ! 4305: Initialize the global binding level. ! 4306: Make definitions for built-in primitive functions. */ ! 4307: ! 4308: void ! 4309: init_decl_processing () ! 4310: { ! 4311: tree decl; ! 4312: register tree endlink, int_endlink, double_endlink, ptr_endlink; ! 4313: tree fields[20]; ! 4314: /* Either char* or void*. */ ! 4315: tree traditional_ptr_type_node; ! 4316: /* Data type of memcpy. */ ! 4317: tree memcpy_ftype; ! 4318: /* Data type of strncpy. */ ! 4319: tree strncpy_ftype; ! 4320: int wchar_type_size; ! 4321: tree temp; ! 4322: tree array_domain_type; ! 4323: ! 4324: /* Have to make these distinct before we try using them. */ ! 4325: lang_name_cplusplus = get_identifier ("C++"); ! 4326: lang_name_c = get_identifier ("C"); ! 4327: #ifdef OBJCPLUS ! 4328: lang_name_objc = get_identifier ("Objective-C"); ! 4329: #endif ! 4330: ! 4331: /* Initially, C. */ ! 4332: current_lang_name = lang_name_c; ! 4333: ! 4334: current_function_decl = NULL_TREE; ! 4335: named_labels = NULL_TREE; ! 4336: named_label_uses = NULL_TREE; ! 4337: current_binding_level = NULL_BINDING_LEVEL; ! 4338: free_binding_level = NULL_BINDING_LEVEL; ! 4339: ! 4340: /* Because most segmentation signals can be traced back into user ! 4341: code, catch them and at least give the user a chance of working ! 4342: around compiler bugs. */ ! 4343: signal (SIGSEGV, signal_catch); ! 4344: ! 4345: /* We will also catch aborts in the back-end through signal_catch and ! 4346: give the user a chance to see where the error might be, and to defeat ! 4347: aborts in the back-end when there have been errors previously in their ! 4348: code. */ ! 4349: #ifdef SIGIOT ! 4350: signal (SIGIOT, signal_catch); ! 4351: #endif ! 4352: #ifdef SIGILL ! 4353: signal (SIGILL, signal_catch); ! 4354: #endif ! 4355: #ifdef SIGABRT ! 4356: signal (SIGABRT, signal_catch); ! 4357: #endif ! 4358: #ifdef SIGBUS ! 4359: signal (SIGBUS, signal_catch); ! 4360: #endif ! 4361: ! 4362: gcc_obstack_init (&decl_obstack); ! 4363: if (flag_dossier) ! 4364: { ! 4365: builtin_type_tdescs_max = 100; ! 4366: builtin_type_tdescs_arr = (tree *)xmalloc (100 * sizeof (tree)); ! 4367: } ! 4368: ! 4369: /* Must lay these out before anything else gets laid out. */ ! 4370: error_mark_node = make_node (ERROR_MARK); ! 4371: TREE_PERMANENT (error_mark_node) = 1; ! 4372: TREE_TYPE (error_mark_node) = error_mark_node; ! 4373: error_mark_list = build_tree_list (error_mark_node, error_mark_node); ! 4374: TREE_TYPE (error_mark_list) = error_mark_node; ! 4375: ! 4376: pushlevel (0); /* make the binding_level structure for global names. */ ! 4377: global_binding_level = current_binding_level; ! 4378: ! 4379: this_identifier = get_identifier (THIS_NAME); ! 4380: in_charge_identifier = get_identifier (IN_CHARGE_NAME); ! 4381: pfn_identifier = get_identifier (VTABLE_PFN_NAME); ! 4382: index_identifier = get_identifier (VTABLE_INDEX_NAME); ! 4383: delta_identifier = get_identifier (VTABLE_DELTA_NAME); ! 4384: delta2_identifier = get_identifier (VTABLE_DELTA2_NAME); ! 4385: pfn_or_delta2_identifier = get_identifier ("__pfn_or_delta2"); ! 4386: ! 4387: /* Define `int' and `char' first so that dbx will output them first. */ ! 4388: ! 4389: integer_type_node = make_signed_type (INT_TYPE_SIZE); ! 4390: record_builtin_type (RID_INT, NULL_PTR, integer_type_node); ! 4391: ! 4392: /* Define `char', which is like either `signed char' or `unsigned char' ! 4393: but not the same as either. */ ! 4394: ! 4395: char_type_node = ! 4396: (flag_signed_char ! 4397: ? make_signed_type (CHAR_TYPE_SIZE) ! 4398: : make_unsigned_type (CHAR_TYPE_SIZE)); ! 4399: record_builtin_type (RID_CHAR, "char", char_type_node); ! 4400: ! 4401: long_integer_type_node = make_signed_type (LONG_TYPE_SIZE); ! 4402: record_builtin_type (RID_LONG, "long int", long_integer_type_node); ! 4403: ! 4404: unsigned_type_node = make_unsigned_type (INT_TYPE_SIZE); ! 4405: record_builtin_type (RID_UNSIGNED, "unsigned int", unsigned_type_node); ! 4406: ! 4407: long_unsigned_type_node = make_unsigned_type (LONG_TYPE_SIZE); ! 4408: record_builtin_type (RID_MAX, "long unsigned int", long_unsigned_type_node); ! 4409: record_builtin_type (RID_MAX, "unsigned long", long_unsigned_type_node); ! 4410: ! 4411: /* `unsigned long' is the standard type for sizeof. ! 4412: Traditionally, use a signed type. ! 4413: Note that stddef.h uses `unsigned long', ! 4414: and this must agree, even of long and int are the same size. */ ! 4415: sizetype ! 4416: = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (SIZE_TYPE))); ! 4417: if (flag_traditional && TREE_UNSIGNED (sizetype)) ! 4418: sizetype = signed_type (sizetype); ! 4419: ! 4420: ptrdiff_type_node ! 4421: = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (PTRDIFF_TYPE))); ! 4422: ! 4423: TREE_TYPE (TYPE_SIZE (integer_type_node)) = sizetype; ! 4424: TREE_TYPE (TYPE_SIZE (char_type_node)) = sizetype; ! 4425: TREE_TYPE (TYPE_SIZE (unsigned_type_node)) = sizetype; ! 4426: TREE_TYPE (TYPE_SIZE (long_unsigned_type_node)) = sizetype; ! 4427: TREE_TYPE (TYPE_SIZE (long_integer_type_node)) = sizetype; ! 4428: ! 4429: short_integer_type_node = make_signed_type (SHORT_TYPE_SIZE); ! 4430: record_builtin_type (RID_SHORT, "short int", short_integer_type_node); ! 4431: long_long_integer_type_node = make_signed_type (LONG_LONG_TYPE_SIZE); ! 4432: record_builtin_type (RID_MAX, "long long int", long_long_integer_type_node); ! 4433: short_unsigned_type_node = make_unsigned_type (SHORT_TYPE_SIZE); ! 4434: record_builtin_type (RID_MAX, "short unsigned int", short_unsigned_type_node); ! 4435: record_builtin_type (RID_MAX, "unsigned short", short_unsigned_type_node); ! 4436: long_long_unsigned_type_node = make_unsigned_type (LONG_LONG_TYPE_SIZE); ! 4437: record_builtin_type (RID_MAX, "long long unsigned int", long_long_unsigned_type_node); ! 4438: record_builtin_type (RID_MAX, "long long unsigned", long_long_unsigned_type_node); ! 4439: ! 4440: /* Define both `signed char' and `unsigned char'. */ ! 4441: signed_char_type_node = make_signed_type (CHAR_TYPE_SIZE); ! 4442: record_builtin_type (RID_MAX, "signed char", signed_char_type_node); ! 4443: unsigned_char_type_node = make_unsigned_type (CHAR_TYPE_SIZE); ! 4444: record_builtin_type (RID_MAX, "unsigned char", unsigned_char_type_node); ! 4445: ! 4446: /* These are types that type_for_size and type_for_mode use. */ ! 4447: intQI_type_node = make_signed_type (GET_MODE_BITSIZE (QImode)); ! 4448: pushdecl (build_decl (TYPE_DECL, NULL_TREE, intQI_type_node)); ! 4449: intHI_type_node = make_signed_type (GET_MODE_BITSIZE (HImode)); ! 4450: pushdecl (build_decl (TYPE_DECL, NULL_TREE, intHI_type_node)); ! 4451: intSI_type_node = make_signed_type (GET_MODE_BITSIZE (SImode)); ! 4452: pushdecl (build_decl (TYPE_DECL, NULL_TREE, intSI_type_node)); ! 4453: intDI_type_node = make_signed_type (GET_MODE_BITSIZE (DImode)); ! 4454: pushdecl (build_decl (TYPE_DECL, NULL_TREE, intDI_type_node)); ! 4455: unsigned_intQI_type_node = make_unsigned_type (GET_MODE_BITSIZE (QImode)); ! 4456: pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intQI_type_node)); ! 4457: unsigned_intHI_type_node = make_unsigned_type (GET_MODE_BITSIZE (HImode)); ! 4458: pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intHI_type_node)); ! 4459: unsigned_intSI_type_node = make_unsigned_type (GET_MODE_BITSIZE (SImode)); ! 4460: pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intSI_type_node)); ! 4461: unsigned_intDI_type_node = make_unsigned_type (GET_MODE_BITSIZE (DImode)); ! 4462: pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intDI_type_node)); ! 4463: ! 4464: float_type_node = make_node (REAL_TYPE); ! 4465: TYPE_PRECISION (float_type_node) = FLOAT_TYPE_SIZE; ! 4466: record_builtin_type (RID_FLOAT, NULL_PTR, float_type_node); ! 4467: layout_type (float_type_node); ! 4468: ! 4469: double_type_node = make_node (REAL_TYPE); ! 4470: if (flag_short_double) ! 4471: TYPE_PRECISION (double_type_node) = FLOAT_TYPE_SIZE; ! 4472: else ! 4473: TYPE_PRECISION (double_type_node) = DOUBLE_TYPE_SIZE; ! 4474: record_builtin_type (RID_DOUBLE, NULL_PTR, double_type_node); ! 4475: layout_type (double_type_node); ! 4476: ! 4477: long_double_type_node = make_node (REAL_TYPE); ! 4478: TYPE_PRECISION (long_double_type_node) = LONG_DOUBLE_TYPE_SIZE; ! 4479: record_builtin_type (RID_MAX, "long double", long_double_type_node); ! 4480: layout_type (long_double_type_node); ! 4481: ! 4482: integer_zero_node = build_int_2 (0, 0); ! 4483: TREE_TYPE (integer_zero_node) = integer_type_node; ! 4484: integer_one_node = build_int_2 (1, 0); ! 4485: TREE_TYPE (integer_one_node) = integer_type_node; ! 4486: integer_two_node = build_int_2 (2, 0); ! 4487: TREE_TYPE (integer_two_node) = integer_type_node; ! 4488: integer_three_node = build_int_2 (3, 0); ! 4489: TREE_TYPE (integer_three_node) = integer_type_node; ! 4490: empty_init_node = build_nt (CONSTRUCTOR, NULL_TREE, NULL_TREE); ! 4491: ! 4492: /* These are needed by stor-layout.c. */ ! 4493: size_zero_node = size_int (0); ! 4494: size_one_node = size_int (1); ! 4495: ! 4496: void_type_node = make_node (VOID_TYPE); ! 4497: record_builtin_type (RID_VOID, NULL_PTR, void_type_node); ! 4498: layout_type (void_type_node); /* Uses integer_zero_node. */ ! 4499: void_list_node = build_tree_list (NULL_TREE, void_type_node); ! 4500: TREE_PARMLIST (void_list_node) = 1; ! 4501: ! 4502: null_pointer_node = build_int_2 (0, 0); ! 4503: TREE_TYPE (null_pointer_node) = build_pointer_type (void_type_node); ! 4504: layout_type (TREE_TYPE (null_pointer_node)); ! 4505: ! 4506: /* Used for expressions that do nothing, but are not errors. */ ! 4507: void_zero_node = build_int_2 (0, 0); ! 4508: TREE_TYPE (void_zero_node) = void_type_node; ! 4509: ! 4510: string_type_node = build_pointer_type (char_type_node); ! 4511: const_string_type_node = build_pointer_type (build_type_variant (char_type_node, 1, 0)); ! 4512: record_builtin_type (RID_MAX, NULL_PTR, string_type_node); ! 4513: ! 4514: /* Make a type to be the domain of a few array types ! 4515: whose domains don't really matter. ! 4516: 200 is small enough that it always fits in size_t ! 4517: and large enough that it can hold most function names for the ! 4518: initializations of __FUNCTION__ and __PRETTY_FUNCTION__. */ ! 4519: array_domain_type = build_index_type (build_int_2 (200, 0)); ! 4520: ! 4521: /* make a type for arrays of characters. ! 4522: With luck nothing will ever really depend on the length of this ! 4523: array type. */ ! 4524: char_array_type_node ! 4525: = build_array_type (char_type_node, array_domain_type); ! 4526: /* Likewise for arrays of ints. */ ! 4527: int_array_type_node ! 4528: = build_array_type (integer_type_node, array_domain_type); ! 4529: ! 4530: /* This is just some anonymous class type. Nobody should ever ! 4531: need to look inside this envelope. */ ! 4532: class_star_type_node = build_pointer_type (make_lang_type (RECORD_TYPE)); ! 4533: ! 4534: default_function_type ! 4535: = build_function_type (integer_type_node, NULL_TREE); ! 4536: build_pointer_type (default_function_type); ! 4537: ! 4538: ptr_type_node = build_pointer_type (void_type_node); ! 4539: const_ptr_type_node = build_pointer_type (build_type_variant (void_type_node, 1, 0)); ! 4540: record_builtin_type (RID_MAX, NULL_PTR, ptr_type_node); ! 4541: endlink = void_list_node; ! 4542: int_endlink = tree_cons (NULL_TREE, integer_type_node, endlink); ! 4543: double_endlink = tree_cons (NULL_TREE, double_type_node, endlink); ! 4544: ptr_endlink = tree_cons (NULL_TREE, ptr_type_node, endlink); ! 4545: ! 4546: double_ftype_double ! 4547: = build_function_type (double_type_node, double_endlink); ! 4548: ! 4549: double_ftype_double_double ! 4550: = build_function_type (double_type_node, ! 4551: tree_cons (NULL_TREE, double_type_node, double_endlink)); ! 4552: ! 4553: int_ftype_int ! 4554: = build_function_type (integer_type_node, int_endlink); ! 4555: ! 4556: long_ftype_long ! 4557: = build_function_type (long_integer_type_node, ! 4558: tree_cons (NULL_TREE, long_integer_type_node, endlink)); ! 4559: ! 4560: void_ftype_ptr_ptr_int ! 4561: = build_function_type (void_type_node, ! 4562: tree_cons (NULL_TREE, ptr_type_node, ! 4563: tree_cons (NULL_TREE, ptr_type_node, ! 4564: int_endlink))); ! 4565: ! 4566: int_ftype_cptr_cptr_sizet ! 4567: = build_function_type (integer_type_node, ! 4568: tree_cons (NULL_TREE, const_ptr_type_node, ! 4569: tree_cons (NULL_TREE, const_ptr_type_node, ! 4570: tree_cons (NULL_TREE, ! 4571: sizetype, ! 4572: endlink)))); ! 4573: ! 4574: void_ftype_ptr_int_int ! 4575: = build_function_type (void_type_node, ! 4576: tree_cons (NULL_TREE, ptr_type_node, ! 4577: tree_cons (NULL_TREE, integer_type_node, ! 4578: int_endlink))); ! 4579: ! 4580: string_ftype_ptr_ptr /* strcpy prototype */ ! 4581: = build_function_type (string_type_node, ! 4582: tree_cons (NULL_TREE, string_type_node, ! 4583: tree_cons (NULL_TREE, ! 4584: const_string_type_node, ! 4585: endlink))); ! 4586: ! 4587: #if 0 ! 4588: /* Not yet. */ ! 4589: strncpy_ftype /* strncpy prototype */ ! 4590: = build_function_type (string_type_node, ! 4591: tree_cons (NULL_TREE, string_type_node, ! 4592: tree_cons (NULL_TREE, const_string_type_node, ! 4593: tree_cons (NULL_TREE, ! 4594: sizetype, ! 4595: endlink)))); ! 4596: #endif ! 4597: ! 4598: int_ftype_string_string /* strcmp prototype */ ! 4599: = build_function_type (integer_type_node, ! 4600: tree_cons (NULL_TREE, const_string_type_node, ! 4601: tree_cons (NULL_TREE, ! 4602: const_string_type_node, ! 4603: endlink))); ! 4604: ! 4605: sizet_ftype_string /* strlen prototype */ ! 4606: = build_function_type (sizetype, ! 4607: tree_cons (NULL_TREE, const_string_type_node, ! 4608: endlink)); ! 4609: ! 4610: traditional_ptr_type_node ! 4611: = (flag_traditional ? string_type_node : ptr_type_node); ! 4612: ! 4613: memcpy_ftype /* memcpy prototype */ ! 4614: = build_function_type (traditional_ptr_type_node, ! 4615: tree_cons (NULL_TREE, ptr_type_node, ! 4616: tree_cons (NULL_TREE, const_ptr_type_node, ! 4617: tree_cons (NULL_TREE, ! 4618: sizetype, ! 4619: endlink)))); ! 4620: ! 4621: #ifdef VTABLE_USES_MASK ! 4622: /* This is primarily for virtual function definition. We ! 4623: declare an array of `void *', which can later be ! 4624: converted to the appropriate function pointer type. ! 4625: To do pointers to members, we need a mask which can ! 4626: distinguish an index value into a virtual function table ! 4627: from an address. */ ! 4628: vtbl_mask = build_int_2 (~((HOST_WIDE_INT) VINDEX_MAX - 1), -1); ! 4629: #endif ! 4630: ! 4631: vtbl_type_node ! 4632: = build_array_type (ptr_type_node, NULL_TREE); ! 4633: layout_type (vtbl_type_node); ! 4634: vtbl_type_node = build_type_variant (vtbl_type_node, 1, 0); ! 4635: record_builtin_type (RID_MAX, NULL_PTR, vtbl_type_node); ! 4636: ! 4637: builtin_function ("__builtin_constant_p", int_ftype_int, ! 4638: BUILT_IN_CONSTANT_P, NULL_PTR); ! 4639: ! 4640: builtin_function ("__builtin_alloca", ! 4641: build_function_type (ptr_type_node, ! 4642: tree_cons (NULL_TREE, ! 4643: sizetype, ! 4644: endlink)), ! 4645: BUILT_IN_ALLOCA, "alloca"); ! 4646: #if 0 ! 4647: builtin_function ("alloca", ! 4648: build_function_type (ptr_type_node, ! 4649: tree_cons (NULL_TREE, ! 4650: sizetype, ! 4651: endlink)), ! 4652: BUILT_IN_ALLOCA, NULL_PTR); ! 4653: #endif ! 4654: ! 4655: builtin_function ("__builtin_abs", int_ftype_int, ! 4656: BUILT_IN_ABS, NULL_PTR); ! 4657: builtin_function ("__builtin_fabs", double_ftype_double, ! 4658: BUILT_IN_FABS, NULL_PTR); ! 4659: builtin_function ("__builtin_labs", long_ftype_long, ! 4660: BUILT_IN_LABS, NULL_PTR); ! 4661: builtin_function ("__builtin_ffs", int_ftype_int, ! 4662: BUILT_IN_FFS, NULL_PTR); ! 4663: builtin_function ("__builtin_fsqrt", double_ftype_double, ! 4664: BUILT_IN_FSQRT, NULL_PTR); ! 4665: builtin_function ("__builtin_sin", double_ftype_double, ! 4666: BUILT_IN_SIN, "sin"); ! 4667: builtin_function ("__builtin_cos", double_ftype_double, ! 4668: BUILT_IN_COS, "cos"); ! 4669: builtin_function ("__builtin_saveregs", ! 4670: build_function_type (ptr_type_node, NULL_TREE), ! 4671: BUILT_IN_SAVEREGS, NULL_PTR); ! 4672: /* EXPAND_BUILTIN_VARARGS is obsolete. */ ! 4673: #if 0 ! 4674: builtin_function ("__builtin_varargs", ! 4675: build_function_type (ptr_type_node, ! 4676: tree_cons (NULL_TREE, ! 4677: integer_type_node, ! 4678: endlink)), ! 4679: BUILT_IN_VARARGS, NULL_PTR); ! 4680: #endif ! 4681: builtin_function ("__builtin_classify_type", default_function_type, ! 4682: BUILT_IN_CLASSIFY_TYPE, NULL_PTR); ! 4683: builtin_function ("__builtin_next_arg", ! 4684: build_function_type (ptr_type_node, endlink), ! 4685: BUILT_IN_NEXT_ARG, NULL_PTR); ! 4686: builtin_function ("__builtin_args_info", ! 4687: build_function_type (integer_type_node, ! 4688: tree_cons (NULL_TREE, ! 4689: integer_type_node, ! 4690: endlink)), ! 4691: BUILT_IN_ARGS_INFO, NULL_PTR); ! 4692: ! 4693: /* Untyped call and return. */ ! 4694: builtin_function ("__builtin_apply_args", ! 4695: build_function_type (ptr_type_node, NULL_TREE), ! 4696: BUILT_IN_APPLY_ARGS, NULL_PTR); ! 4697: ! 4698: temp = tree_cons (NULL_TREE, ! 4699: build_pointer_type (build_function_type (void_type_node, ! 4700: NULL_TREE)), ! 4701: tree_cons (NULL_TREE, ! 4702: ptr_type_node, ! 4703: tree_cons (NULL_TREE, ! 4704: sizetype, ! 4705: endlink))); ! 4706: builtin_function ("__builtin_apply", ! 4707: build_function_type (ptr_type_node, temp), ! 4708: BUILT_IN_APPLY, NULL_PTR); ! 4709: builtin_function ("__builtin_return", ! 4710: build_function_type (void_type_node, ! 4711: tree_cons (NULL_TREE, ! 4712: ptr_type_node, ! 4713: endlink)), ! 4714: BUILT_IN_RETURN, NULL_PTR); ! 4715: ! 4716: /* Currently under experimentation. */ ! 4717: builtin_function ("__builtin_memcpy", memcpy_ftype, ! 4718: BUILT_IN_MEMCPY, "memcpy"); ! 4719: builtin_function ("__builtin_memcmp", int_ftype_cptr_cptr_sizet, ! 4720: BUILT_IN_MEMCMP, "memcmp"); ! 4721: builtin_function ("__builtin_strcmp", int_ftype_string_string, ! 4722: BUILT_IN_STRCMP, "strcmp"); ! 4723: builtin_function ("__builtin_strcpy", string_ftype_ptr_ptr, ! 4724: BUILT_IN_STRCPY, "strcpy"); ! 4725: #if 0 ! 4726: /* Not yet. */ ! 4727: builtin_function ("__builtin_strncpy", strncpy_ftype, ! 4728: BUILT_IN_STRNCPY, "strncpy"); ! 4729: #endif ! 4730: builtin_function ("__builtin_strlen", sizet_ftype_string, ! 4731: BUILT_IN_STRLEN, "strlen"); ! 4732: ! 4733: if (!flag_no_builtin) ! 4734: { ! 4735: #if 0 /* These do not work well with libg++. */ ! 4736: builtin_function ("abs", int_ftype_int, BUILT_IN_ABS, NULL_PTR); ! 4737: builtin_function ("fabs", double_ftype_double, BUILT_IN_FABS, NULL_PTR); ! 4738: builtin_function ("labs", long_ftype_long, BUILT_IN_LABS, NULL_PTR); ! 4739: #endif ! 4740: builtin_function ("memcpy", memcpy_ftype, BUILT_IN_MEMCPY, NULL_PTR); ! 4741: builtin_function ("memcmp", int_ftype_cptr_cptr_sizet, BUILT_IN_MEMCMP, ! 4742: NULL_PTR); ! 4743: builtin_function ("strcmp", int_ftype_string_string, BUILT_IN_STRCMP, NULL_PTR); ! 4744: builtin_function ("strcpy", string_ftype_ptr_ptr, BUILT_IN_STRCPY, NULL_PTR); ! 4745: #if 0 ! 4746: /* Not yet. */ ! 4747: builtin_function ("strncpy", strncpy_ftype, BUILT_IN_STRNCPY, NULL_PTR); ! 4748: #endif ! 4749: builtin_function ("strlen", sizet_ftype_string, BUILT_IN_STRLEN, NULL_PTR); ! 4750: builtin_function ("sin", double_ftype_double, BUILT_IN_SIN, NULL_PTR); ! 4751: builtin_function ("cos", double_ftype_double, BUILT_IN_COS, NULL_PTR); ! 4752: } ! 4753: ! 4754: #if 0 ! 4755: /* Support for these has not been written in either expand_builtin ! 4756: or build_function_call. */ ! 4757: builtin_function ("__builtin_div", default_ftype, BUILT_IN_DIV, 0); ! 4758: builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV, 0); ! 4759: builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR, 0); ! 4760: builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL, 0); ! 4761: builtin_function ("__builtin_fmod", double_ftype_double_double, BUILT_IN_FMOD, 0); ! 4762: builtin_function ("__builtin_frem", double_ftype_double_double, BUILT_IN_FREM, 0); ! 4763: builtin_function ("__builtin_memset", ptr_ftype_ptr_int_int, BUILT_IN_MEMSET, 0); ! 4764: builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP, 0); ! 4765: builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN, 0); ! 4766: #endif ! 4767: ! 4768: /* C++ extensions */ ! 4769: ! 4770: unknown_type_node = make_node (UNKNOWN_TYPE); ! 4771: #if 0 /* not yet, should get fixed properly later */ ! 4772: pushdecl (make_type_decl (get_identifier ("unknown type"), ! 4773: unknown_type_node)); ! 4774: #else ! 4775: decl = pushdecl (build_decl (TYPE_DECL, get_identifier ("unknown type"), ! 4776: unknown_type_node)); ! 4777: /* Make sure the "unknown type" typedecl gets ignored for debug info. */ ! 4778: DECL_IGNORED_P (decl) = 1; ! 4779: #endif ! 4780: TYPE_SIZE (unknown_type_node) = TYPE_SIZE (void_type_node); ! 4781: TYPE_ALIGN (unknown_type_node) = 1; ! 4782: TYPE_MODE (unknown_type_node) = TYPE_MODE (void_type_node); ! 4783: /* Indirecting an UNKNOWN_TYPE node yields an UNKNOWN_TYPE node. */ ! 4784: TREE_TYPE (unknown_type_node) = unknown_type_node; ! 4785: /* Looking up TYPE_POINTER_TO and TYPE_REFERENCE_TO yield the same result. */ ! 4786: TYPE_POINTER_TO (unknown_type_node) = unknown_type_node; ! 4787: TYPE_REFERENCE_TO (unknown_type_node) = unknown_type_node; ! 4788: ! 4789: /* This is special for C++ so functions can be overloaded. */ ! 4790: wchar_type_node ! 4791: = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (WCHAR_TYPE))); ! 4792: wchar_type_size = TYPE_PRECISION (wchar_type_node); ! 4793: signed_wchar_type_node = make_signed_type (wchar_type_size); ! 4794: unsigned_wchar_type_node = make_unsigned_type (wchar_type_size); ! 4795: wchar_type_node ! 4796: = TREE_UNSIGNED (wchar_type_node) ! 4797: ? unsigned_wchar_type_node ! 4798: : signed_wchar_type_node; ! 4799: record_builtin_type (RID_WCHAR, "__wchar_t", wchar_type_node); ! 4800: ! 4801: /* This is for wide string constants. */ ! 4802: wchar_array_type_node ! 4803: = build_array_type (wchar_type_node, array_domain_type); ! 4804: ! 4805: /* This is a hack that should go away when we deliver the ! 4806: real gc code. */ ! 4807: if (flag_gc) ! 4808: { ! 4809: builtin_function ("__gc_main", default_function_type, NOT_BUILT_IN, 0); ! 4810: pushdecl (lookup_name (get_identifier ("__gc_main"), 0)); ! 4811: } ! 4812: ! 4813: /* Simplify life by making a "vtable_entry_type". Give its ! 4814: fields names so that the debugger can use them. */ ! 4815: ! 4816: vtable_entry_type = make_lang_type (RECORD_TYPE); ! 4817: fields[0] = build_lang_field_decl (FIELD_DECL, delta_identifier, short_integer_type_node); ! 4818: fields[1] = build_lang_field_decl (FIELD_DECL, index_identifier, short_integer_type_node); ! 4819: fields[2] = build_lang_field_decl (FIELD_DECL, pfn_identifier, ptr_type_node); ! 4820: finish_builtin_type (vtable_entry_type, VTBL_PTR_TYPE, fields, 2, ! 4821: double_type_node); ! 4822: ! 4823: /* Make this part of an invisible union. */ ! 4824: fields[3] = copy_node (fields[2]); ! 4825: TREE_TYPE (fields[3]) = short_integer_type_node; ! 4826: DECL_NAME (fields[3]) = delta2_identifier; ! 4827: DECL_MODE (fields[3]) = TYPE_MODE (short_integer_type_node); ! 4828: DECL_SIZE (fields[3]) = TYPE_SIZE (short_integer_type_node); ! 4829: TREE_UNSIGNED (fields[3]) = 0; ! 4830: TREE_CHAIN (fields[2]) = fields[3]; ! 4831: vtable_entry_type = build_type_variant (vtable_entry_type, 1, 0); ! 4832: record_builtin_type (RID_MAX, VTBL_PTR_TYPE, vtable_entry_type); ! 4833: ! 4834: if (flag_dossier) ! 4835: { ! 4836: /* Must build __t_desc type. Currently, type descriptors look like this: ! 4837: ! 4838: struct __t_desc ! 4839: { ! 4840: const char *name; ! 4841: int size; ! 4842: int bits; ! 4843: struct __t_desc *points_to; ! 4844: int ivars_count, meths_count; ! 4845: struct __i_desc *ivars[]; ! 4846: struct __m_desc *meths[]; ! 4847: struct __t_desc *parents[]; ! 4848: struct __t_desc *vbases[]; ! 4849: int offsets[]; ! 4850: }; ! 4851: ! 4852: ...as per Linton's paper. */ ! 4853: ! 4854: __t_desc_type_node = make_lang_type (RECORD_TYPE); ! 4855: __i_desc_type_node = make_lang_type (RECORD_TYPE); ! 4856: __m_desc_type_node = make_lang_type (RECORD_TYPE); ! 4857: __t_desc_array_type = build_array_type (TYPE_POINTER_TO (__t_desc_type_node), NULL_TREE); ! 4858: __i_desc_array_type = build_array_type (TYPE_POINTER_TO (__i_desc_type_node), NULL_TREE); ! 4859: __m_desc_array_type = build_array_type (TYPE_POINTER_TO (__m_desc_type_node), NULL_TREE); ! 4860: ! 4861: fields[0] = build_lang_field_decl (FIELD_DECL, get_identifier ("name"), ! 4862: string_type_node); ! 4863: fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier ("size"), ! 4864: unsigned_type_node); ! 4865: fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier ("bits"), ! 4866: unsigned_type_node); ! 4867: fields[3] = build_lang_field_decl (FIELD_DECL, get_identifier ("points_to"), ! 4868: TYPE_POINTER_TO (__t_desc_type_node)); ! 4869: fields[4] = build_lang_field_decl (FIELD_DECL, ! 4870: get_identifier ("ivars_count"), ! 4871: integer_type_node); ! 4872: fields[5] = build_lang_field_decl (FIELD_DECL, ! 4873: get_identifier ("meths_count"), ! 4874: integer_type_node); ! 4875: fields[6] = build_lang_field_decl (FIELD_DECL, get_identifier ("ivars"), ! 4876: build_pointer_type (__i_desc_array_type)); ! 4877: fields[7] = build_lang_field_decl (FIELD_DECL, get_identifier ("meths"), ! 4878: build_pointer_type (__m_desc_array_type)); ! 4879: fields[8] = build_lang_field_decl (FIELD_DECL, get_identifier ("parents"), ! 4880: build_pointer_type (__t_desc_array_type)); ! 4881: fields[9] = build_lang_field_decl (FIELD_DECL, get_identifier ("vbases"), ! 4882: build_pointer_type (__t_desc_array_type)); ! 4883: fields[10] = build_lang_field_decl (FIELD_DECL, get_identifier ("offsets"), ! 4884: build_pointer_type (integer_type_node)); ! 4885: finish_builtin_type (__t_desc_type_node, "__t_desc", fields, 10, integer_type_node); ! 4886: ! 4887: /* ivar descriptors look like this: ! 4888: ! 4889: struct __i_desc ! 4890: { ! 4891: const char *name; ! 4892: int offset; ! 4893: struct __t_desc *type; ! 4894: }; ! 4895: */ ! 4896: ! 4897: fields[0] = build_lang_field_decl (FIELD_DECL, get_identifier ("name"), ! 4898: string_type_node); ! 4899: fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier ("offset"), ! 4900: integer_type_node); ! 4901: fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier ("type"), ! 4902: TYPE_POINTER_TO (__t_desc_type_node)); ! 4903: finish_builtin_type (__i_desc_type_node, "__i_desc", fields, 2, integer_type_node); ! 4904: ! 4905: /* method descriptors look like this: ! 4906: ! 4907: struct __m_desc ! 4908: { ! 4909: const char *name; ! 4910: int vindex; ! 4911: struct __t_desc *vcontext; ! 4912: struct __t_desc *return_type; ! 4913: void (*address)(); ! 4914: short parm_count; ! 4915: short required_parms; ! 4916: struct __t_desc *parm_types[]; ! 4917: }; ! 4918: */ ! 4919: ! 4920: fields[0] = build_lang_field_decl (FIELD_DECL, get_identifier ("name"), ! 4921: string_type_node); ! 4922: fields[1] = build_lang_field_decl (FIELD_DECL, get_identifier ("vindex"), ! 4923: integer_type_node); ! 4924: fields[2] = build_lang_field_decl (FIELD_DECL, get_identifier ("vcontext"), ! 4925: TYPE_POINTER_TO (__t_desc_type_node)); ! 4926: fields[3] = build_lang_field_decl (FIELD_DECL, get_identifier ("return_type"), ! 4927: TYPE_POINTER_TO (__t_desc_type_node)); ! 4928: fields[4] = build_lang_field_decl (FIELD_DECL, get_identifier ("address"), ! 4929: build_pointer_type (default_function_type)); ! 4930: fields[5] = build_lang_field_decl (FIELD_DECL, get_identifier ("parm_count"), ! 4931: short_integer_type_node); ! 4932: fields[6] = build_lang_field_decl (FIELD_DECL, get_identifier ("required_parms"), ! 4933: short_integer_type_node); ! 4934: fields[7] = build_lang_field_decl (FIELD_DECL, get_identifier ("parm_types"), ! 4935: build_pointer_type (build_array_type (TYPE_POINTER_TO (__t_desc_type_node), NULL_TREE))); ! 4936: finish_builtin_type (__m_desc_type_node, "__m_desc", fields, 7, integer_type_node); ! 4937: } ! 4938: ! 4939: /* Now, C++. */ ! 4940: current_lang_name = lang_name_cplusplus; ! 4941: if (flag_dossier) ! 4942: { ! 4943: int i = builtin_type_tdescs_len; ! 4944: while (i > 0) ! 4945: { ! 4946: tree tdesc = build_t_desc (builtin_type_tdescs_arr[--i], 0); ! 4947: TREE_ASM_WRITTEN (tdesc) = 1; ! 4948: TREE_PUBLIC (TREE_OPERAND (tdesc, 0)) = 1; ! 4949: } ! 4950: } ! 4951: ! 4952: auto_function (ansi_opname[(int) NEW_EXPR], ! 4953: build_function_type (ptr_type_node, ! 4954: tree_cons (NULL_TREE, sizetype, ! 4955: void_list_node)), ! 4956: NOT_BUILT_IN); ! 4957: auto_function (ansi_opname[(int) DELETE_EXPR], ! 4958: build_function_type (void_type_node, ! 4959: tree_cons (NULL_TREE, ptr_type_node, ! 4960: void_list_node)), ! 4961: NOT_BUILT_IN); ! 4962: ! 4963: abort_fndecl ! 4964: = define_function ("abort", ! 4965: build_function_type (void_type_node, void_list_node), ! 4966: NOT_BUILT_IN, 0, 0); ! 4967: ! 4968: unhandled_exception_fndecl ! 4969: = define_function ("__unhandled_exception", ! 4970: build_function_type (void_type_node, NULL_TREE), ! 4971: NOT_BUILT_IN, 0, 0); ! 4972: ! 4973: /* Perform other language dependent initializations. */ ! 4974: init_class_processing (); ! 4975: init_init_processing (); ! 4976: init_search_processing (); ! 4977: ! 4978: if (flag_handle_exceptions) ! 4979: { ! 4980: if (flag_handle_exceptions == 2) ! 4981: /* Too much trouble to inline all the trys needed for this. */ ! 4982: flag_this_is_variable = 2; ! 4983: init_exception_processing (); ! 4984: } ! 4985: if (flag_gc) ! 4986: init_gc_processing (); ! 4987: if (flag_no_inline) ! 4988: flag_inline_functions = 0, flag_default_inline = 0; ! 4989: if (flag_cadillac) ! 4990: init_cadillac (); ! 4991: ! 4992: /* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__. */ ! 4993: declare_function_name (); ! 4994: } ! 4995: ! 4996: /* Make a definition for a builtin function named NAME and whose data type ! 4997: is TYPE. TYPE should be a function type with argument types. ! 4998: FUNCTION_CODE tells later passes how to compile calls to this function. ! 4999: See tree.h for its possible values. ! 5000: ! 5001: If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME, ! 5002: the name to be called if we can't opencode the function. */ ! 5003: ! 5004: tree ! 5005: define_function (name, type, function_code, pfn, library_name) ! 5006: char *name; ! 5007: tree type; ! 5008: enum built_in_function function_code; ! 5009: void (*pfn)(); ! 5010: char *library_name; ! 5011: { ! 5012: tree decl = build_lang_decl (FUNCTION_DECL, get_identifier (name), type); ! 5013: DECL_EXTERNAL (decl) = 1; ! 5014: TREE_PUBLIC (decl) = 1; ! 5015: ! 5016: /* Since `pushdecl' relies on DECL_ASSEMBLER_NAME instead of DECL_NAME, ! 5017: we cannot change DECL_ASSEMBLER_NAME until we have installed this ! 5018: function in the namespace. */ ! 5019: if (pfn) (*pfn) (decl); ! 5020: if (library_name) ! 5021: DECL_ASSEMBLER_NAME (decl) = get_identifier (library_name); ! 5022: make_function_rtl (decl); ! 5023: if (function_code != NOT_BUILT_IN) ! 5024: { ! 5025: DECL_BUILT_IN (decl) = 1; ! 5026: DECL_SET_FUNCTION_CODE (decl, function_code); ! 5027: } ! 5028: return decl; ! 5029: } ! 5030: ! 5031: /* Called when a declaration is seen that contains no names to declare. ! 5032: If its type is a reference to a structure, union or enum inherited ! 5033: from a containing scope, shadow that tag name for the current scope ! 5034: with a forward reference. ! 5035: If its type defines a new named structure or union ! 5036: or defines an enum, it is valid but we need not do anything here. ! 5037: Otherwise, it is an error. ! 5038: ! 5039: C++: may have to grok the declspecs to learn about static, ! 5040: complain for anonymous unions. */ ! 5041: ! 5042: void ! 5043: shadow_tag (declspecs) ! 5044: tree declspecs; ! 5045: { ! 5046: int found_tag = 0; ! 5047: int warned = 0; ! 5048: int static_or_extern = 0; ! 5049: register tree link; ! 5050: register enum tree_code code, ok_code = ERROR_MARK; ! 5051: register tree t = NULL_TREE; ! 5052: ! 5053: for (link = declspecs; link; link = TREE_CHAIN (link)) ! 5054: { ! 5055: register tree value = TREE_VALUE (link); ! 5056: ! 5057: code = TREE_CODE (value); ! 5058: if (IS_AGGR_TYPE_CODE (code) || code == ENUMERAL_TYPE) ! 5059: /* Used to test also that TYPE_SIZE (value) != 0. ! 5060: That caused warning for `struct foo;' at top level in the file. */ ! 5061: { ! 5062: register tree name = TYPE_NAME (value); ! 5063: ! 5064: if (name == NULL_TREE) ! 5065: name = lookup_tag_reverse (value, NULL_TREE); ! 5066: ! 5067: if (name && TREE_CODE (name) == TYPE_DECL) ! 5068: name = DECL_NAME (name); ! 5069: ! 5070: if (class_binding_level) ! 5071: t = lookup_tag (code, name, class_binding_level, 1); ! 5072: else ! 5073: t = lookup_tag (code, name, current_binding_level, 1); ! 5074: ! 5075: if (t == NULL_TREE) ! 5076: { ! 5077: push_obstacks (&permanent_obstack, &permanent_obstack); ! 5078: if (IS_AGGR_TYPE_CODE (code)) ! 5079: t = make_lang_type (code); ! 5080: else ! 5081: t = make_node (code); ! 5082: pushtag (name, t); ! 5083: pop_obstacks (); ! 5084: ok_code = code; ! 5085: break; ! 5086: } ! 5087: else if (name != NULL_TREE || code == ENUMERAL_TYPE) ! 5088: ok_code = code; ! 5089: ! 5090: if (ok_code != ERROR_MARK) ! 5091: found_tag++; ! 5092: else ! 5093: { ! 5094: if (!warned) ! 5095: pedwarn ("useless keyword or type name in declaration"); ! 5096: warned = 1; ! 5097: } ! 5098: } ! 5099: else if (value == ridpointers[(int) RID_STATIC] ! 5100: || value == ridpointers[(int) RID_EXTERN]) ! 5101: static_or_extern = 1; ! 5102: } ! 5103: ! 5104: /* This is where the variables in an anonymous union are ! 5105: declared. An anonymous union declaration looks like: ! 5106: union { ... } ; ! 5107: because there is no declarator after the union, the parser ! 5108: sends that declaration here. */ ! 5109: if (ok_code == UNION_TYPE ! 5110: && t != NULL_TREE ! 5111: && ((TREE_CODE (TYPE_NAME (t)) == IDENTIFIER_NODE ! 5112: && ANON_AGGRNAME_P (TYPE_NAME (t))) ! 5113: || (TREE_CODE (TYPE_NAME (t)) == TYPE_DECL ! 5114: && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t))))) ! 5115: { ! 5116: /* ANSI C++ June 5 1992 WP 9.5.3. Anonymous unions may not have ! 5117: function members. */ ! 5118: if (TYPE_FIELDS (t)) ! 5119: { ! 5120: tree decl = grokdeclarator (NULL_TREE, declspecs, NORMAL, 0, NULL_TREE); ! 5121: finish_anon_union (decl); ! 5122: } ! 5123: else ! 5124: error ("anonymous union cannot have a function member"); ! 5125: } ! 5126: else ! 5127: { ! 5128: /* Anonymous unions are objects, that's why we only check for ! 5129: static/extern specifiers in this branch. */ ! 5130: if (static_or_extern) ! 5131: error ("static/extern can only be specified for objects and functions"); ! 5132: ! 5133: if (ok_code == RECORD_TYPE ! 5134: && found_tag == 1 ! 5135: && TYPE_LANG_SPECIFIC (t) ! 5136: && CLASSTYPE_DECLARED_EXCEPTION (t)) ! 5137: { ! 5138: if (TYPE_SIZE (t)) ! 5139: cp_error ("redeclaration of exception `%T'", t); ! 5140: else ! 5141: { ! 5142: tree ename, decl; ! 5143: ! 5144: push_obstacks (&permanent_obstack, &permanent_obstack); ! 5145: ! 5146: pushclass (t, 0); ! 5147: finish_exception (t, NULL_TREE); ! 5148: ! 5149: ename = TYPE_NAME (t); ! 5150: if (TREE_CODE (ename) == TYPE_DECL) ! 5151: ename = DECL_NAME (ename); ! 5152: decl = build_lang_field_decl (VAR_DECL, ename, t); ! 5153: finish_exception_decl (current_class_name, decl); ! 5154: end_exception_decls (); ! 5155: ! 5156: pop_obstacks (); ! 5157: } ! 5158: } ! 5159: else if (!warned && found_tag > 1) ! 5160: warning ("multiple types in one declaration"); ! 5161: } ! 5162: } ! 5163: ! 5164: /* Decode a "typename", such as "int **", returning a ..._TYPE node. */ ! 5165: ! 5166: tree ! 5167: groktypename (typename) ! 5168: tree typename; ! 5169: { ! 5170: if (TREE_CODE (typename) != TREE_LIST) ! 5171: return typename; ! 5172: return grokdeclarator (TREE_VALUE (typename), ! 5173: TREE_PURPOSE (typename), ! 5174: TYPENAME, 0, NULL_TREE); ! 5175: } ! 5176: ! 5177: #ifdef OBJCPLUS ! 5178: /* Return a PARM_DECL node for a given pair of specs and declarator. */ ! 5179: ! 5180: tree ! 5181: groktypename_in_parm_context (typename) ! 5182: tree typename; ! 5183: { ! 5184: if (TREE_CODE (typename) != TREE_LIST) ! 5185: return typename; ! 5186: return grokdeclarator (TREE_VALUE (typename), ! 5187: TREE_PURPOSE (typename), ! 5188: PARM, 0, NULL_TREE); ! 5189: } ! 5190: #endif /* OBJCPLUS */ ! 5191: ! 5192: ! 5193: /* Decode a declarator in an ordinary declaration or data definition. ! 5194: This is called as soon as the type information and variable name ! 5195: have been parsed, before parsing the initializer if any. ! 5196: Here we create the ..._DECL node, fill in its type, ! 5197: and put it on the list of decls for the current context. ! 5198: The ..._DECL node is returned as the value. ! 5199: ! 5200: Exception: for arrays where the length is not specified, ! 5201: the type is left null, to be filled in by `finish_decl'. ! 5202: ! 5203: Function definitions do not come here; they go to start_function ! 5204: instead. However, external and forward declarations of functions ! 5205: do go through here. Structure field declarations are done by ! 5206: grokfield and not through here. */ ! 5207: ! 5208: /* Set this to zero to debug not using the temporary obstack ! 5209: to parse initializers. */ ! 5210: int debug_temp_inits = 1; ! 5211: ! 5212: tree ! 5213: start_decl (declarator, declspecs, initialized, raises) ! 5214: tree declarator, declspecs; ! 5215: int initialized; ! 5216: tree raises; ! 5217: { ! 5218: register tree decl; ! 5219: register tree type, tem; ! 5220: tree context; ! 5221: extern int have_extern_spec; ! 5222: extern int used_extern_spec; ! 5223: ! 5224: int init_written = initialized; ! 5225: ! 5226: /* This should only be done once on the top most decl. */ ! 5227: if (have_extern_spec && !used_extern_spec) ! 5228: { ! 5229: declspecs = decl_tree_cons (NULL_TREE, get_identifier ("extern"), declspecs); ! 5230: used_extern_spec = 1; ! 5231: } ! 5232: ! 5233: decl = grokdeclarator (declarator, declspecs, NORMAL, initialized, raises); ! 5234: if (decl == NULL_TREE || decl == void_type_node) ! 5235: return NULL_TREE; ! 5236: ! 5237: type = TREE_TYPE (decl); ! 5238: ! 5239: /* Don't lose if destructors must be executed at file-level. */ ! 5240: if (TREE_STATIC (decl) ! 5241: && TYPE_NEEDS_DESTRUCTOR (type) ! 5242: && !TREE_PERMANENT (decl)) ! 5243: { ! 5244: push_obstacks (&permanent_obstack, &permanent_obstack); ! 5245: decl = copy_node (decl); ! 5246: if (TREE_CODE (type) == ARRAY_TYPE) ! 5247: { ! 5248: tree itype = TYPE_DOMAIN (type); ! 5249: if (itype && ! TREE_PERMANENT (itype)) ! 5250: { ! 5251: itype = build_index_type (copy_to_permanent (TYPE_MAX_VALUE (itype))); ! 5252: type = build_cplus_array_type (TREE_TYPE (type), itype); ! 5253: TREE_TYPE (decl) = type; ! 5254: } ! 5255: } ! 5256: pop_obstacks (); ! 5257: } ! 5258: ! 5259: /* Interesting work for this is done in `finish_exception_decl'. */ ! 5260: if (TREE_CODE (type) == RECORD_TYPE ! 5261: && CLASSTYPE_DECLARED_EXCEPTION (type)) ! 5262: return decl; ! 5263: ! 5264: /* Corresponding pop_obstacks is done in `finish_decl'. */ ! 5265: push_obstacks_nochange (); ! 5266: ! 5267: context ! 5268: = (TREE_CODE (decl) == FUNCTION_DECL && DECL_VIRTUAL_P (decl)) ! 5269: ? DECL_CLASS_CONTEXT (decl) ! 5270: : DECL_CONTEXT (decl); ! 5271: ! 5272: if (processing_template_decl) ! 5273: { ! 5274: tree d; ! 5275: if (TREE_CODE (decl) == FUNCTION_DECL) ! 5276: { ! 5277: /* Declarator is a call_expr; extract arguments from it, since ! 5278: grokdeclarator didn't do it. */ ! 5279: tree args; ! 5280: args = copy_to_permanent (last_function_parms); ! 5281: if (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE) ! 5282: { ! 5283: tree t = TREE_TYPE (decl); ! 5284: tree decl; ! 5285: ! 5286: t = TYPE_METHOD_BASETYPE (t); /* type method belongs to */ ! 5287: if (TREE_CODE (t) != UNINSTANTIATED_P_TYPE) ! 5288: { ! 5289: t = build_pointer_type (t); /* base type of `this' */ ! 5290: #if 1 ! 5291: /* I suspect this is wrong. */ ! 5292: t = build_type_variant (t, flag_this_is_variable <= 0, ! 5293: 0); /* type of `this' */ ! 5294: #else ! 5295: t = build_type_variant (t, 0, 0); /* type of `this' */ ! 5296: #endif ! 5297: t = build (PARM_DECL, t, this_identifier); ! 5298: TREE_CHAIN (t) = args; ! 5299: args = t; ! 5300: } ! 5301: } ! 5302: DECL_ARGUMENTS (decl) = args; ! 5303: } ! 5304: d = build_lang_decl (TEMPLATE_DECL, DECL_NAME (decl), TREE_TYPE (decl)); ! 5305: if (interface_unknown && flag_external_templates) ! 5306: warn_if_unknown_interface (); ! 5307: TREE_PUBLIC (d) = TREE_PUBLIC (decl) = flag_external_templates && !interface_unknown; ! 5308: TREE_STATIC (d) = TREE_STATIC (decl); ! 5309: DECL_EXTERNAL (d) = (DECL_EXTERNAL (decl) ! 5310: && !(context && !DECL_THIS_EXTERN (decl))); ! 5311: DECL_TEMPLATE_RESULT (d) = decl; ! 5312: DECL_OVERLOADED (d) = 1; ! 5313: decl = d; ! 5314: } ! 5315: ! 5316: if (context && TYPE_SIZE (context) != NULL_TREE) ! 5317: { ! 5318: /* If it was not explicitly declared `extern', ! 5319: revoke any previous claims of DECL_EXTERNAL. */ ! 5320: if (DECL_THIS_EXTERN (decl) == 0) ! 5321: DECL_EXTERNAL (decl) = 0; ! 5322: if (DECL_LANG_SPECIFIC (decl)) ! 5323: DECL_IN_AGGR_P (decl) = 0; ! 5324: pushclass (context, 2); ! 5325: } ! 5326: ! 5327: /* If this type of object needs a cleanup, and control may ! 5328: jump past it, make a new binding level so that it is cleaned ! 5329: up only when it is initialized first. */ ! 5330: if (TYPE_NEEDS_DESTRUCTOR (type) ! 5331: && current_binding_level->more_cleanups_ok == 0) ! 5332: pushlevel_temporary (1); ! 5333: ! 5334: if (initialized) ! 5335: /* Is it valid for this decl to have an initializer at all? ! 5336: If not, set INITIALIZED to zero, which will indirectly ! 5337: tell `finish_decl' to ignore the initializer once it is parsed. */ ! 5338: switch (TREE_CODE (decl)) ! 5339: { ! 5340: case TYPE_DECL: ! 5341: /* typedef foo = bar means give foo the same type as bar. ! 5342: We haven't parsed bar yet, so `finish_decl' will fix that up. ! 5343: Any other case of an initialization in a TYPE_DECL is an error. */ ! 5344: if (pedantic || list_length (declspecs) > 1) ! 5345: { ! 5346: cp_error ("typedef `%D' is initialized", decl); ! 5347: initialized = 0; ! 5348: } ! 5349: break; ! 5350: ! 5351: case FUNCTION_DECL: ! 5352: cp_error ("function `%#D' is initialized like a variable", decl); ! 5353: initialized = 0; ! 5354: break; ! 5355: ! 5356: default: ! 5357: /* Don't allow initializations for incomplete types except for ! 5358: arrays which might be completed by the initialization. */ ! 5359: if (TYPE_SIZE (type) != NULL_TREE) ! 5360: ; /* A complete type is ok. */ ! 5361: else if (TREE_CODE (type) != ARRAY_TYPE) ! 5362: { ! 5363: cp_error ("variable `%#D' has initializer but incomplete type", ! 5364: decl); ! 5365: initialized = 0; ! 5366: } ! 5367: else if (TYPE_SIZE (TREE_TYPE (type)) == NULL_TREE) ! 5368: { ! 5369: cp_error ("elements of array `%#D' have incomplete type", decl); ! 5370: initialized = 0; ! 5371: } ! 5372: } ! 5373: ! 5374: if (!initialized ! 5375: && TREE_CODE (decl) != TYPE_DECL ! 5376: && TREE_CODE (decl) != TEMPLATE_DECL ! 5377: && IS_AGGR_TYPE (type) && ! DECL_EXTERNAL (decl)) ! 5378: { ! 5379: if (TYPE_SIZE (type) == NULL_TREE) ! 5380: { ! 5381: cp_error ("aggregate `%#D' has incomplete type and cannot be initialized", ! 5382: decl); ! 5383: /* Change the type so that assemble_variable will give ! 5384: DECL an rtl we can live with: (mem (const_int 0)). */ ! 5385: TREE_TYPE (decl) = error_mark_node; ! 5386: type = error_mark_node; ! 5387: } ! 5388: else ! 5389: { ! 5390: /* If any base type in the hierarchy of TYPE needs a constructor, ! 5391: then we set initialized to 1. This way any nodes which are ! 5392: created for the purposes of initializing this aggregate ! 5393: will live as long as it does. This is necessary for global ! 5394: aggregates which do not have their initializers processed until ! 5395: the end of the file. */ ! 5396: initialized = TYPE_NEEDS_CONSTRUCTING (type); ! 5397: } ! 5398: } ! 5399: ! 5400: if (initialized) ! 5401: { ! 5402: if (current_binding_level != global_binding_level ! 5403: && DECL_EXTERNAL (decl)) ! 5404: cp_warning ("declaration of `%#D' has `extern' and is initialized", ! 5405: decl); ! 5406: DECL_EXTERNAL (decl) = 0; ! 5407: if (current_binding_level == global_binding_level) ! 5408: TREE_STATIC (decl) = 1; ! 5409: ! 5410: /* Tell `pushdecl' this is an initialized decl ! 5411: even though we don't yet have the initializer expression. ! 5412: Also tell `finish_decl' it may store the real initializer. */ ! 5413: DECL_INITIAL (decl) = error_mark_node; ! 5414: } ! 5415: ! 5416: /* Add this decl to the current binding level, but not if it ! 5417: comes from another scope, e.g. a static member variable. ! 5418: TEM may equal DECL or it may be a previous decl of the same name. */ ! 5419: if ((TREE_CODE (decl) != PARM_DECL && DECL_CONTEXT (decl) != NULL_TREE) ! 5420: || (TREE_CODE (decl) == TEMPLATE_DECL && !global_bindings_p ()) ! 5421: || TREE_CODE (type) == LANG_TYPE) ! 5422: tem = decl; ! 5423: else ! 5424: { ! 5425: tem = pushdecl (decl); ! 5426: if (TREE_CODE (tem) == TREE_LIST) ! 5427: { ! 5428: tree tem2 = value_member (decl, tem); ! 5429: if (tem2 != NULL_TREE) ! 5430: tem = TREE_VALUE (tem2); ! 5431: else ! 5432: { ! 5433: while (tem && ! decls_match (decl, TREE_VALUE (tem))) ! 5434: tem = TREE_CHAIN (tem); ! 5435: if (tem == NULL_TREE) ! 5436: tem = decl; ! 5437: else ! 5438: tem = TREE_VALUE (tem); ! 5439: } ! 5440: } ! 5441: } ! 5442: ! 5443: #if 0 ! 5444: /* We don't do this yet for GNU C++. */ ! 5445: /* For a local variable, define the RTL now. */ ! 5446: if (current_binding_level != global_binding_level ! 5447: /* But not if this is a duplicate decl ! 5448: and we preserved the rtl from the previous one ! 5449: (which may or may not happen). */ ! 5450: && DECL_RTL (tem) == NULL_RTX) ! 5451: { ! 5452: if (TYPE_SIZE (TREE_TYPE (tem)) != NULL_TREE) ! 5453: expand_decl (tem); ! 5454: else if (TREE_CODE (TREE_TYPE (tem)) == ARRAY_TYPE ! 5455: && DECL_INITIAL (tem) != NULL_TREE) ! 5456: expand_decl (tem); ! 5457: } ! 5458: #endif ! 5459: ! 5460: if (TREE_CODE (decl) == FUNCTION_DECL && DECL_OVERLOADED (decl)) ! 5461: /* @@ Also done in start_function. */ ! 5462: tem = push_overloaded_decl (tem, 1); ! 5463: else if (TREE_CODE (decl) == TEMPLATE_DECL) ! 5464: { ! 5465: tree result = DECL_TEMPLATE_RESULT (decl); ! 5466: if (DECL_CONTEXT (result) != NULL_TREE) ! 5467: { ! 5468: tree type; ! 5469: type = DECL_CONTEXT (result); ! 5470: ! 5471: if (TREE_CODE (type) != UNINSTANTIATED_P_TYPE) ! 5472: { ! 5473: cp_error ("declaration of `%D' in non-template type `%T'", ! 5474: decl, type); ! 5475: return NULL_TREE; ! 5476: } ! 5477: ! 5478: if (/* TREE_CODE (result) == VAR_DECL */ 1) ! 5479: { ! 5480: #if 0 ! 5481: tree tmpl = UPT_TEMPLATE (type); ! 5482: ! 5483: fprintf (stderr, "%s:%d: adding ", __FILE__, __LINE__); ! 5484: print_node_brief (stderr, "", DECL_NAME (tem), 0); ! 5485: fprintf (stderr, " to class %s\n", ! 5486: IDENTIFIER_POINTER (DECL_NAME (tmpl))); ! 5487: DECL_TEMPLATE_MEMBERS (tmpl) ! 5488: = perm_tree_cons (DECL_NAME (tem), tem, ! 5489: DECL_TEMPLATE_MEMBERS (tmpl)); ! 5490: #endif ! 5491: return tem; ! 5492: } ! 5493: my_friendly_abort (13); ! 5494: } ! 5495: else if (TREE_CODE (result) == FUNCTION_DECL) ! 5496: tem = push_overloaded_decl (tem, 0); ! 5497: else if (TREE_CODE (result) == VAR_DECL ! 5498: || TREE_CODE (result) == TYPE_DECL) ! 5499: { ! 5500: cp_error ("invalid template `%#D'", result); ! 5501: return NULL_TREE; ! 5502: } ! 5503: else ! 5504: my_friendly_abort (14); ! 5505: } ! 5506: ! 5507: if (init_written ! 5508: && ! (TREE_CODE (tem) == PARM_DECL ! 5509: || (TREE_READONLY (tem) ! 5510: && (TREE_CODE (tem) == VAR_DECL ! 5511: || TREE_CODE (tem) == FIELD_DECL)))) ! 5512: { ! 5513: /* When parsing and digesting the initializer, ! 5514: use temporary storage. Do this even if we will ignore the value. */ ! 5515: if (current_binding_level == global_binding_level && debug_temp_inits) ! 5516: { ! 5517: if (TYPE_NEEDS_CONSTRUCTING (type) || TREE_CODE (type) == REFERENCE_TYPE) ! 5518: /* In this case, the initializer must lay down in permanent ! 5519: storage, since it will be saved until `finish_file' is run. */ ! 5520: ; ! 5521: else ! 5522: temporary_allocation (); ! 5523: } ! 5524: } ! 5525: ! 5526: if (flag_cadillac) ! 5527: cadillac_start_decl (tem); ! 5528: ! 5529: return tem; ! 5530: } ! 5531: ! 5532: static void ! 5533: make_temporary_for_reference (decl, ctor_call, init, cleanupp) ! 5534: tree decl, ctor_call, init; ! 5535: tree *cleanupp; ! 5536: { ! 5537: tree type = TREE_TYPE (decl); ! 5538: tree target_type = TREE_TYPE (type); ! 5539: tree tmp, tmp_addr; ! 5540: ! 5541: if (ctor_call) ! 5542: { ! 5543: tmp_addr = TREE_VALUE (TREE_OPERAND (ctor_call, 1)); ! 5544: if (TREE_CODE (tmp_addr) == NOP_EXPR) ! 5545: tmp_addr = TREE_OPERAND (tmp_addr, 0); ! 5546: my_friendly_assert (TREE_CODE (tmp_addr) == ADDR_EXPR, 146); ! 5547: tmp = TREE_OPERAND (tmp_addr, 0); ! 5548: } ! 5549: else ! 5550: { ! 5551: tmp = get_temp_name (target_type, ! 5552: current_binding_level == global_binding_level); ! 5553: tmp_addr = build_unary_op (ADDR_EXPR, tmp, 0); ! 5554: } ! 5555: ! 5556: TREE_TYPE (tmp_addr) = build_pointer_type (target_type); ! 5557: DECL_INITIAL (decl) = convert (TYPE_POINTER_TO (target_type), tmp_addr); ! 5558: TREE_TYPE (DECL_INITIAL (decl)) = type; ! 5559: if (TYPE_NEEDS_CONSTRUCTING (target_type)) ! 5560: { ! 5561: if (current_binding_level == global_binding_level) ! 5562: { ! 5563: /* lay this variable out now. Otherwise `output_addressed_constants' ! 5564: gets confused by its initializer. */ ! 5565: make_decl_rtl (tmp, NULL_PTR, 1); ! 5566: static_aggregates = perm_tree_cons (init, tmp, static_aggregates); ! 5567: } ! 5568: else ! 5569: { ! 5570: if (ctor_call != NULL_TREE) ! 5571: init = ctor_call; ! 5572: else ! 5573: init = build_method_call (tmp, constructor_name_full (target_type), ! 5574: build_tree_list (NULL_TREE, init), ! 5575: NULL_TREE, LOOKUP_NORMAL); ! 5576: DECL_INITIAL (decl) = build (COMPOUND_EXPR, type, init, ! 5577: DECL_INITIAL (decl)); ! 5578: *cleanupp = maybe_build_cleanup (tmp); ! 5579: } ! 5580: } ! 5581: else ! 5582: { ! 5583: DECL_INITIAL (tmp) = init; ! 5584: TREE_STATIC (tmp) = current_binding_level == global_binding_level; ! 5585: finish_decl (tmp, init, 0, 0); ! 5586: } ! 5587: if (TREE_STATIC (tmp)) ! 5588: preserve_initializer (); ! 5589: } ! 5590: ! 5591: /* Handle initialization of references. ! 5592: These three arguments from from `finish_decl', and have the ! 5593: same meaning here that they do there. */ ! 5594: /* quotes on semantics can be found in ARM 8.4.3. */ ! 5595: static void ! 5596: grok_reference_init (decl, type, init, cleanupp) ! 5597: tree decl, type, init; ! 5598: tree *cleanupp; ! 5599: { ! 5600: char *errstr = NULL; ! 5601: int is_reference; ! 5602: tree tmp; ! 5603: tree this_ptr_type, actual_init; ! 5604: ! 5605: if (init == NULL_TREE) ! 5606: { ! 5607: if (DECL_LANG_SPECIFIC (decl) == 0 ! 5608: || DECL_IN_AGGR_P (decl) == 0) ! 5609: { ! 5610: error ("variable declared as reference not initialized"); ! 5611: if (TREE_CODE (decl) == VAR_DECL) ! 5612: SET_DECL_REFERENCE_SLOT (decl, error_mark_node); ! 5613: } ! 5614: return; ! 5615: } ! 5616: ! 5617: if (TREE_CODE (type) == REFERENCE_TYPE ! 5618: && TREE_CODE (init) == CONSTRUCTOR) ! 5619: { ! 5620: error ("ANSI C++ forbids use of initializer list for a reference initializer"); ! 5621: return; ! 5622: } ! 5623: ! 5624: if (TREE_CODE (init) == TREE_LIST) ! 5625: init = build_compound_expr (init); ! 5626: is_reference = TREE_CODE (TREE_TYPE (init)) == REFERENCE_TYPE; ! 5627: tmp = is_reference ? convert_from_reference (init) : init; ! 5628: ! 5629: if (is_reference) ! 5630: { ! 5631: if (! comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (type)), ! 5632: TYPE_MAIN_VARIANT (TREE_TYPE (tmp)), 0)) ! 5633: errstr = "initialization of `%s' from dissimilar reference type"; ! 5634: else if (TYPE_READONLY (TREE_TYPE (type)) ! 5635: >= TYPE_READONLY (TREE_TYPE (TREE_TYPE (init)))) ! 5636: { ! 5637: is_reference = 0; ! 5638: init = tmp; ! 5639: } ! 5640: } ! 5641: else ! 5642: { ! 5643: if (TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE ! 5644: && TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE) ! 5645: { ! 5646: /* Note: default conversion is only called in very ! 5647: special cases. */ ! 5648: init = default_conversion (init); ! 5649: } ! 5650: if (TREE_CODE (TREE_TYPE (type)) == TREE_CODE (TREE_TYPE (init))) ! 5651: { ! 5652: if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (type)), ! 5653: TYPE_MAIN_VARIANT (TREE_TYPE (init)), 0)) ! 5654: { ! 5655: /* This section implements ANSI C++ June 5 1992 WP 8.4.3.5. */ ! 5656: ! 5657: /* A reference to a volatile T cannot be initialized with ! 5658: a const T, and vice-versa. */ ! 5659: if (TYPE_VOLATILE (TREE_TYPE (type)) && TREE_READONLY (init)) ! 5660: errstr = "cannot initialize a reference to a volatile T with a const T"; ! 5661: else if (TYPE_READONLY (TREE_TYPE (type)) && TREE_THIS_VOLATILE (init)) ! 5662: errstr = "cannot initialize a reference to a const T with a volatile T"; ! 5663: /* A reference to a plain T can be initialized only with ! 5664: a plain T. */ ! 5665: else if (!TYPE_VOLATILE (TREE_TYPE (type)) ! 5666: && !TYPE_READONLY (TREE_TYPE (type))) ! 5667: { ! 5668: if (TREE_READONLY (init)) ! 5669: errstr = "cannot initialize a reference to T with a const T"; ! 5670: else if (TREE_THIS_VOLATILE (init)) ! 5671: errstr = "cannot initialize a reference to T with a volatile T"; ! 5672: } ! 5673: } ! 5674: else ! 5675: init = convert (TREE_TYPE (type), init); ! 5676: } ! 5677: else if (init != error_mark_node ! 5678: && ! comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (type)), ! 5679: TYPE_MAIN_VARIANT (TREE_TYPE (init)), 0)) ! 5680: errstr = "invalid type conversion for reference"; ! 5681: } ! 5682: ! 5683: if (errstr) ! 5684: { ! 5685: /* Things did not go smoothly; look for operator& type conversion. */ ! 5686: if (IS_AGGR_TYPE (TREE_TYPE (tmp))) ! 5687: { ! 5688: tmp = build_type_conversion (CONVERT_EXPR, type, init, 0); ! 5689: if (tmp != NULL_TREE) ! 5690: { ! 5691: init = tmp; ! 5692: if (tmp == error_mark_node) ! 5693: errstr = "ambiguous pointer conversion"; ! 5694: else ! 5695: errstr = NULL; ! 5696: is_reference = 1; ! 5697: } ! 5698: else ! 5699: { ! 5700: tmp = build_type_conversion (CONVERT_EXPR, TREE_TYPE (type), init, 0); ! 5701: if (tmp != NULL_TREE) ! 5702: { ! 5703: init = tmp; ! 5704: if (tmp == error_mark_node) ! 5705: errstr = "ambiguous pointer conversion"; ! 5706: else ! 5707: errstr = NULL; ! 5708: is_reference = 0; ! 5709: } ! 5710: } ! 5711: } ! 5712: /* Look for constructor. */ ! 5713: else if (IS_AGGR_TYPE (TREE_TYPE (type)) ! 5714: && TYPE_HAS_CONSTRUCTOR (TREE_TYPE (type))) ! 5715: { ! 5716: tmp = get_temp_name (TREE_TYPE (type), ! 5717: current_binding_level == global_binding_level); ! 5718: tmp = build_method_call (tmp, constructor_name_full (TREE_TYPE (type)), ! 5719: build_tree_list (NULL_TREE, init), ! 5720: NULL_TREE, LOOKUP_NORMAL); ! 5721: if (tmp == NULL_TREE || tmp == error_mark_node) ! 5722: { ! 5723: if (TREE_CODE (decl) == VAR_DECL) ! 5724: SET_DECL_REFERENCE_SLOT (decl, error_mark_node); ! 5725: cp_error_at ("constructor failed to build reference initializer", decl); ! 5726: return; ! 5727: } ! 5728: make_temporary_for_reference (decl, tmp, init, cleanupp); ! 5729: goto done; ! 5730: } ! 5731: } ! 5732: ! 5733: if (errstr) ! 5734: { ! 5735: error_with_decl (decl, errstr); ! 5736: if (TREE_CODE (decl) == VAR_DECL) ! 5737: SET_DECL_REFERENCE_SLOT (decl, error_mark_node); ! 5738: return; ! 5739: } ! 5740: ! 5741: /* In the case of initialization, it is permissible ! 5742: to assign one reference to another. */ ! 5743: this_ptr_type = build_pointer_type (TREE_TYPE (type)); ! 5744: ! 5745: if (is_reference) ! 5746: { ! 5747: if (TREE_SIDE_EFFECTS (init)) ! 5748: DECL_INITIAL (decl) = save_expr (init); ! 5749: else ! 5750: DECL_INITIAL (decl) = init; ! 5751: } ! 5752: else if (lvalue_p (init)) ! 5753: { ! 5754: tmp = build_unary_op (ADDR_EXPR, init, 0); ! 5755: if (TREE_CODE (tmp) == ADDR_EXPR ! 5756: && TREE_CODE (TREE_OPERAND (tmp, 0)) == WITH_CLEANUP_EXPR) ! 5757: { ! 5758: /* Associate the cleanup with the reference so that we ! 5759: don't get burned by "aggressive" cleanup policy. */ ! 5760: *cleanupp = TREE_OPERAND (TREE_OPERAND (tmp, 0), 2); ! 5761: TREE_OPERAND (TREE_OPERAND (tmp, 0), 2) = error_mark_node; ! 5762: } ! 5763: if (IS_AGGR_TYPE (TREE_TYPE (this_ptr_type))) ! 5764: DECL_INITIAL (decl) = convert_pointer_to (TREE_TYPE (this_ptr_type), tmp); ! 5765: else ! 5766: DECL_INITIAL (decl) = convert (this_ptr_type, tmp); ! 5767: ! 5768: DECL_INITIAL (decl) = save_expr (DECL_INITIAL (decl)); ! 5769: if (DECL_INITIAL (decl) == current_class_decl) ! 5770: DECL_INITIAL (decl) = copy_node (current_class_decl); ! 5771: TREE_TYPE (DECL_INITIAL (decl)) = type; ! 5772: } ! 5773: else if ((actual_init = unary_complex_lvalue (ADDR_EXPR, init))) ! 5774: { ! 5775: /* The initializer for this decl goes into its ! 5776: DECL_REFERENCE_SLOT. Make sure that we can handle ! 5777: multiple evaluations without ill effect. */ ! 5778: if (TREE_CODE (actual_init) == ADDR_EXPR ! 5779: && TREE_CODE (TREE_OPERAND (actual_init, 0)) == TARGET_EXPR) ! 5780: actual_init = save_expr (actual_init); ! 5781: DECL_INITIAL (decl) = convert_pointer_to (TREE_TYPE (this_ptr_type), actual_init); ! 5782: DECL_INITIAL (decl) = save_expr (DECL_INITIAL (decl)); ! 5783: TREE_TYPE (DECL_INITIAL (decl)) = type; ! 5784: } ! 5785: else if (TYPE_READONLY (TREE_TYPE (type))) ! 5786: /* Section 8.4.3 allows us to make a temporary for ! 5787: the initialization of const&. */ ! 5788: make_temporary_for_reference (decl, NULL_TREE, init, cleanupp); ! 5789: else ! 5790: { ! 5791: cp_error ("type mismatch in initialization of `%D' (use `const')", decl); ! 5792: DECL_INITIAL (decl) = error_mark_node; ! 5793: } ! 5794: ! 5795: done: ! 5796: /* ?? Can this be optimized in some cases to ! 5797: hand back the DECL_INITIAL slot?? */ ! 5798: if (TYPE_SIZE (TREE_TYPE (type))) ! 5799: { ! 5800: init = convert_from_reference (decl); ! 5801: if (TREE_PERMANENT (decl)) ! 5802: init = copy_to_permanent (init); ! 5803: SET_DECL_REFERENCE_SLOT (decl, init); ! 5804: } ! 5805: ! 5806: if (TREE_STATIC (decl) && ! TREE_CONSTANT (DECL_INITIAL (decl))) ! 5807: { ! 5808: expand_static_init (decl, DECL_INITIAL (decl)); ! 5809: DECL_INITIAL (decl) = NULL_TREE; ! 5810: } ! 5811: } ! 5812: ! 5813: /* Finish processing of a declaration; ! 5814: install its line number and initial value. ! 5815: If the length of an array type is not known before, ! 5816: it must be determined now, from the initial value, or it is an error. ! 5817: ! 5818: Call `pop_obstacks' iff NEED_POP is nonzero. ! 5819: ! 5820: For C++, `finish_decl' must be fairly evasive: it must keep initializers ! 5821: for aggregates that have constructors alive on the permanent obstack, ! 5822: so that the global initializing functions can be written at the end. ! 5823: ! 5824: INIT0 holds the value of an initializer that should be allowed to escape ! 5825: the normal rules. ! 5826: ! 5827: For functions that take default parameters, DECL points to its ! 5828: "maximal" instantiation. `finish_decl' must then also declared its ! 5829: subsequently lower and lower forms of instantiation, checking for ! 5830: ambiguity as it goes. This can be sped up later. */ ! 5831: ! 5832: void ! 5833: finish_decl (decl, init, asmspec_tree, need_pop) ! 5834: tree decl, init; ! 5835: tree asmspec_tree; ! 5836: int need_pop; ! 5837: { ! 5838: register tree type; ! 5839: tree cleanup = NULL_TREE, ttype; ! 5840: int was_incomplete; ! 5841: int temporary = allocation_temporary_p (); ! 5842: char *asmspec = NULL; ! 5843: int was_readonly = 0; ! 5844: ! 5845: /* If this is 0, then we did not change obstacks. */ ! 5846: if (! decl) ! 5847: { ! 5848: if (init) ! 5849: error ("assignment (not initialization) in declaration"); ! 5850: return; ! 5851: } ! 5852: ! 5853: if (asmspec_tree) ! 5854: { ! 5855: asmspec = TREE_STRING_POINTER (asmspec_tree); ! 5856: /* Zero out old RTL, since we will rewrite it. */ ! 5857: DECL_RTL (decl) = NULL_RTX; ! 5858: } ! 5859: ! 5860: /* If the type of the thing we are declaring either has ! 5861: a constructor, or has a virtual function table pointer, ! 5862: AND its initialization was accepted by `start_decl', ! 5863: then we stayed on the permanent obstack through the ! 5864: declaration, otherwise, changed obstacks as GCC would. */ ! 5865: ! 5866: type = TREE_TYPE (decl); ! 5867: ! 5868: was_incomplete = (DECL_SIZE (decl) == NULL_TREE); ! 5869: ! 5870: /* Take care of TYPE_DECLs up front. */ ! 5871: if (TREE_CODE (decl) == TYPE_DECL) ! 5872: { ! 5873: if (init && DECL_INITIAL (decl)) ! 5874: { ! 5875: /* typedef foo = bar; store the type of bar as the type of foo. */ ! 5876: TREE_TYPE (decl) = type = TREE_TYPE (init); ! 5877: DECL_INITIAL (decl) = init = NULL_TREE; ! 5878: } ! 5879: if (IS_AGGR_TYPE (type) && DECL_NAME (decl)) ! 5880: { ! 5881: if (TREE_TYPE (DECL_NAME (decl)) && TREE_TYPE (decl) != type) ! 5882: cp_warning ("shadowing previous type declaration of `%#D'", decl); ! 5883: set_identifier_type_value (DECL_NAME (decl), type); ! 5884: CLASSTYPE_GOT_SEMICOLON (type) = 1; ! 5885: } ! 5886: GNU_xref_decl (current_function_decl, decl); ! 5887: rest_of_decl_compilation (decl, NULL_PTR, ! 5888: DECL_CONTEXT (decl) == NULL_TREE, 0); ! 5889: goto finish_end; ! 5890: } ! 5891: if (type != error_mark_node && IS_AGGR_TYPE (type) ! 5892: && CLASSTYPE_DECLARED_EXCEPTION (type)) ! 5893: { ! 5894: finish_exception_decl (NULL_TREE, decl); ! 5895: CLASSTYPE_GOT_SEMICOLON (type) = 1; ! 5896: goto finish_end; ! 5897: } ! 5898: if (TREE_CODE (decl) != FUNCTION_DECL) ! 5899: { ! 5900: ttype = target_type (type); ! 5901: #if 0 /* WTF? -KR ! 5902: Leave this out until we can figure out why it was ! 5903: needed/desirable in the first place. Then put a comment ! 5904: here explaining why. Or just delete the code if no ill ! 5905: effects arise. */ ! 5906: if (TYPE_NAME (ttype) ! 5907: && TREE_CODE (TYPE_NAME (ttype)) == TYPE_DECL ! 5908: && ANON_AGGRNAME_P (TYPE_IDENTIFIER (ttype))) ! 5909: { ! 5910: tree old_id = TYPE_IDENTIFIER (ttype); ! 5911: char *newname = (char *)alloca (IDENTIFIER_LENGTH (old_id) + 2); ! 5912: /* Need to preserve template data for UPT nodes. */ ! 5913: tree old_template = IDENTIFIER_TEMPLATE (old_id); ! 5914: newname[0] = '_'; ! 5915: bcopy (IDENTIFIER_POINTER (old_id), newname + 1, ! 5916: IDENTIFIER_LENGTH (old_id) + 1); ! 5917: old_id = get_identifier (newname); ! 5918: lookup_tag_reverse (ttype, old_id); ! 5919: TYPE_IDENTIFIER (ttype) = old_id; ! 5920: IDENTIFIER_TEMPLATE (old_id) = old_template; ! 5921: } ! 5922: #endif ! 5923: } ! 5924: ! 5925: if (! DECL_EXTERNAL (decl) && TREE_READONLY (decl) ! 5926: && TYPE_NEEDS_CONSTRUCTING (type)) ! 5927: { ! 5928: ! 5929: /* Currently, GNU C++ puts constants in text space, making them ! 5930: impossible to initialize. In the future, one would hope for ! 5931: an operating system which understood the difference between ! 5932: initialization and the running of a program. */ ! 5933: was_readonly = 1; ! 5934: TREE_READONLY (decl) = 0; ! 5935: } ! 5936: ! 5937: if (TREE_CODE (decl) == FIELD_DECL) ! 5938: { ! 5939: if (init && init != error_mark_node) ! 5940: my_friendly_assert (TREE_PERMANENT (init), 147); ! 5941: ! 5942: if (asmspec) ! 5943: { ! 5944: /* This must override the asm specifier which was placed ! 5945: by grokclassfn. Lay this out fresh. ! 5946: ! 5947: @@ Should emit an error if this redefines an asm-specified ! 5948: @@ name, or if we have already used the function's name. */ ! 5949: DECL_RTL (TREE_TYPE (decl)) = NULL_RTX; ! 5950: DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec); ! 5951: make_decl_rtl (decl, asmspec, 0); ! 5952: } ! 5953: } ! 5954: /* If `start_decl' didn't like having an initialization, ignore it now. */ ! 5955: else if (init != NULL_TREE && DECL_INITIAL (decl) == NULL_TREE) ! 5956: init = NULL_TREE; ! 5957: else if (DECL_EXTERNAL (decl)) ! 5958: ; ! 5959: else if (TREE_CODE (type) == REFERENCE_TYPE) ! 5960: { ! 5961: grok_reference_init (decl, type, init, &cleanup); ! 5962: init = NULL_TREE; ! 5963: } ! 5964: ! 5965: GNU_xref_decl (current_function_decl, decl); ! 5966: ! 5967: if (TREE_CODE (decl) == FIELD_DECL || DECL_EXTERNAL (decl)) ! 5968: ; ! 5969: else if (TREE_CODE (decl) == CONST_DECL) ! 5970: { ! 5971: my_friendly_assert (TREE_CODE (decl) != REFERENCE_TYPE, 148); ! 5972: ! 5973: DECL_INITIAL (decl) = init; ! 5974: ! 5975: /* This will keep us from needing to worry about our obstacks. */ ! 5976: my_friendly_assert (init != NULL_TREE, 149); ! 5977: init = NULL_TREE; ! 5978: } ! 5979: else if (init) ! 5980: { ! 5981: if (TYPE_NEEDS_CONSTRUCTING (type)) ! 5982: { ! 5983: if (TREE_CODE (type) == ARRAY_TYPE) ! 5984: init = digest_init (type, init, (tree *) 0); ! 5985: else if (TREE_CODE (init) == CONSTRUCTOR ! 5986: && CONSTRUCTOR_ELTS (init) != NULL_TREE) ! 5987: { ! 5988: cp_error ("`%D' must be initialized by constructor, not by `{...}'", decl); ! 5989: init = error_mark_node; ! 5990: } ! 5991: #if 0 ! 5992: /* fix this in `build_functional_cast' instead. ! 5993: Here's the trigger code: ! 5994: ! 5995: struct ostream ! 5996: { ! 5997: ostream (); ! 5998: ostream (int, char *); ! 5999: ostream (char *); ! 6000: operator char *(); ! 6001: ostream (void *); ! 6002: operator void *(); ! 6003: operator << (int); ! 6004: }; ! 6005: int buf_size = 1024; ! 6006: static char buf[buf_size]; ! 6007: const char *debug(int i) { ! 6008: char *b = &buf[0]; ! 6009: ostream o = ostream(buf_size, b); ! 6010: o << i; ! 6011: return buf; ! 6012: } ! 6013: */ ! 6014: ! 6015: else if (TREE_CODE (init) == TARGET_EXPR ! 6016: && TREE_CODE (TREE_OPERAND (init, 1) == NEW_EXPR)) ! 6017: { ! 6018: /* User wrote something like `foo x = foo (args)' */ ! 6019: my_friendly_assert (TREE_CODE (TREE_OPERAND (init, 0)) == VAR_DECL, 150); ! 6020: my_friendly_assert (DECL_NAME (TREE_OPERAND (init, 0)) == NULL_TREE, 151); ! 6021: ! 6022: /* User wrote exactly `foo x = foo (args)' */ ! 6023: if (TYPE_MAIN_VARIANT (type) == TREE_TYPE (init)) ! 6024: { ! 6025: init = build (CALL_EXPR, TREE_TYPE (init), ! 6026: TREE_OPERAND (TREE_OPERAND (init, 1), 0), ! 6027: TREE_OPERAND (TREE_OPERAND (init, 1), 1), 0); ! 6028: TREE_SIDE_EFFECTS (init) = 1; ! 6029: } ! 6030: } ! 6031: #endif ! 6032: ! 6033: /* We must hide the initializer so that expand_decl ! 6034: won't try to do something it does not understand. */ ! 6035: if (current_binding_level == global_binding_level) ! 6036: { ! 6037: tree value = digest_init (type, empty_init_node, (tree *) 0); ! 6038: DECL_INITIAL (decl) = value; ! 6039: } ! 6040: else ! 6041: DECL_INITIAL (decl) = error_mark_node; ! 6042: } ! 6043: else ! 6044: { ! 6045: if (TREE_CODE (init) != TREE_VEC) ! 6046: init = store_init_value (decl, init); ! 6047: ! 6048: if (init) ! 6049: /* Don't let anyone try to initialize this variable ! 6050: until we are ready to do so. */ ! 6051: DECL_INITIAL (decl) = error_mark_node; ! 6052: } ! 6053: } ! 6054: else if (TREE_CODE_CLASS (TREE_CODE (type)) == 't' ! 6055: && (IS_AGGR_TYPE (type) || TYPE_NEEDS_CONSTRUCTING (type)) ! 6056: && init != NULL_TREE) ! 6057: { ! 6058: tree ctype = type; ! 6059: while (TREE_CODE (ctype) == ARRAY_TYPE) ! 6060: ctype = TREE_TYPE (ctype); ! 6061: if (! TYPE_NEEDS_CONSTRUCTOR (ctype)) ! 6062: { ! 6063: if (CLASSTYPE_READONLY_FIELDS_NEED_INIT (ctype)) ! 6064: cp_error ("structure `%D' with uninitialized const members", decl); ! 6065: if (CLASSTYPE_REF_FIELDS_NEED_INIT (ctype)) ! 6066: cp_error ("structure `%D' with uninitialized reference members", decl); ! 6067: } ! 6068: ! 6069: if (TREE_CODE (decl) == VAR_DECL ! 6070: && !TYPE_NEEDS_CONSTRUCTING (type) ! 6071: && (TYPE_READONLY (type) || TREE_READONLY (decl))) ! 6072: cp_error ("uninitialized const `%D'", decl); ! 6073: ! 6074: /* Initialize variables in need of static initialization ! 6075: with `empty_init_node' to keep assemble_variable from putting them ! 6076: in the wrong program space. (Common storage is okay for non-public ! 6077: uninitialized data; the linker can't match it with storage from other ! 6078: files, and we may save some disk space.) */ ! 6079: if (flag_pic == 0 ! 6080: && TREE_STATIC (decl) ! 6081: && TREE_PUBLIC (decl) ! 6082: && ! DECL_EXTERNAL (decl) ! 6083: && TREE_CODE (decl) == VAR_DECL ! 6084: && TYPE_NEEDS_CONSTRUCTING (type) ! 6085: && (DECL_INITIAL (decl) == NULL_TREE ! 6086: || DECL_INITIAL (decl) == error_mark_node)) ! 6087: { ! 6088: tree value = digest_init (type, empty_init_node, (tree *) 0); ! 6089: DECL_INITIAL (decl) = value; ! 6090: } ! 6091: } ! 6092: else if (TREE_CODE (decl) == VAR_DECL ! 6093: && TREE_CODE (type) != REFERENCE_TYPE ! 6094: && (TYPE_READONLY (type) || TREE_READONLY (decl))) ! 6095: { ! 6096: /* ``Unless explicitly declared extern, a const object does not have ! 6097: external linkage and must be initialized. ($8.4; $12.1)'' ARM 7.1.6 ! 6098: However, if it's `const int foo = 1; const int foo;', don't complain ! 6099: about the second decl, since it does have an initializer before. ! 6100: We deliberately don't complain about arrays, because they're ! 6101: supposed to be initialized by a constructor. */ ! 6102: if (! DECL_INITIAL (decl) ! 6103: && TREE_CODE (type) != ARRAY_TYPE ! 6104: && (!pedantic || !current_class_type)) ! 6105: cp_error ("uninitialized const `%#D'", decl); ! 6106: } ! 6107: ! 6108: /* For top-level declaration, the initial value was read in ! 6109: the temporary obstack. MAXINDEX, rtl, etc. to be made below ! 6110: must go in the permanent obstack; but don't discard the ! 6111: temporary data yet. */ ! 6112: ! 6113: if (current_binding_level == global_binding_level && temporary) ! 6114: end_temporary_allocation (); ! 6115: ! 6116: /* Deduce size of array from initialization, if not already known. */ ! 6117: ! 6118: if (TREE_CODE (type) == ARRAY_TYPE ! 6119: && TYPE_DOMAIN (type) == NULL_TREE ! 6120: && TREE_CODE (decl) != TYPE_DECL) ! 6121: { ! 6122: int do_default ! 6123: = (TREE_STATIC (decl) ! 6124: /* Even if pedantic, an external linkage array ! 6125: may have incomplete type at first. */ ! 6126: ? pedantic && DECL_EXTERNAL (decl) ! 6127: : !DECL_EXTERNAL (decl)); ! 6128: tree initializer = init ? init : DECL_INITIAL (decl); ! 6129: int failure = complete_array_type (type, initializer, do_default); ! 6130: ! 6131: if (failure == 1) ! 6132: cp_error ("initializer fails to determine size of `%D'", decl); ! 6133: ! 6134: if (failure == 2) ! 6135: { ! 6136: if (do_default) ! 6137: cp_error ("array size missing in `%D'", decl); ! 6138: /* If a `static' var's size isn't known, make it extern as ! 6139: well as static, so it does not get allocated. If it's not ! 6140: `static', then don't mark it extern; finish_incomplete_decl ! 6141: will give it a default size and it will get allocated. */ ! 6142: else if (!pedantic && TREE_STATIC (decl) && !TREE_PUBLIC (decl)) ! 6143: DECL_EXTERNAL (decl) = 1; ! 6144: } ! 6145: ! 6146: if (pedantic && TYPE_DOMAIN (type) != NULL_TREE ! 6147: && tree_int_cst_lt (TYPE_MAX_VALUE (TYPE_DOMAIN (type)), ! 6148: integer_zero_node)) ! 6149: cp_error ("zero-size array `%D'", decl); ! 6150: ! 6151: layout_decl (decl, 0); ! 6152: } ! 6153: ! 6154: if (TREE_CODE (decl) == VAR_DECL) ! 6155: { ! 6156: if (DECL_SIZE (decl) == NULL_TREE ! 6157: && TYPE_SIZE (TREE_TYPE (decl)) != NULL_TREE) ! 6158: layout_decl (decl, 0); ! 6159: ! 6160: if (TREE_STATIC (decl) && DECL_SIZE (decl) == NULL_TREE) ! 6161: { ! 6162: /* A static variable with an incomplete type: ! 6163: that is an error if it is initialized or `static'. ! 6164: Otherwise, let it through, but if it is not `extern' ! 6165: then it may cause an error message later. */ ! 6166: if (!DECL_EXTERNAL (decl) || DECL_INITIAL (decl) != NULL_TREE) ! 6167: cp_error ("storage size of `%D' isn't known", decl); ! 6168: init = NULL_TREE; ! 6169: } ! 6170: else if (!DECL_EXTERNAL (decl) && DECL_SIZE (decl) == NULL_TREE) ! 6171: { ! 6172: /* An automatic variable with an incomplete type: that is an error. ! 6173: Don't talk about array types here, since we took care of that ! 6174: message in grokdeclarator. */ ! 6175: cp_error ("storage size of `%D' isn't known", decl); ! 6176: TREE_TYPE (decl) = error_mark_node; ! 6177: } ! 6178: else if (!DECL_EXTERNAL (decl) && IS_AGGR_TYPE (ttype)) ! 6179: /* Let debugger know it should output info for this type. */ ! 6180: note_debug_info_needed (ttype); ! 6181: ! 6182: if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl)) ! 6183: && DECL_SIZE (decl) != NULL_TREE ! 6184: && ! TREE_CONSTANT (DECL_SIZE (decl))) ! 6185: { ! 6186: if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST) ! 6187: constant_expression_warning (DECL_SIZE (decl)); ! 6188: else ! 6189: cp_error ("storage size of `%D' isn't constant", decl); ! 6190: } ! 6191: ! 6192: if (!DECL_EXTERNAL (decl) && TYPE_NEEDS_DESTRUCTOR (type)) ! 6193: { ! 6194: int yes = suspend_momentary (); ! 6195: ! 6196: /* If INIT comes from a functional cast, use the cleanup ! 6197: we built for that. Otherwise, make our own cleanup. */ ! 6198: if (init && TREE_CODE (init) == WITH_CLEANUP_EXPR ! 6199: && comptypes (TREE_TYPE (decl), TREE_TYPE (init), 1)) ! 6200: { ! 6201: cleanup = TREE_OPERAND (init, 2); ! 6202: init = TREE_OPERAND (init, 0); ! 6203: current_binding_level->have_cleanups = 1; ! 6204: current_binding_level->more_exceptions_ok = 0; ! 6205: } ! 6206: else ! 6207: cleanup = maybe_build_cleanup (decl); ! 6208: resume_momentary (yes); ! 6209: } ! 6210: } ! 6211: /* PARM_DECLs get cleanups, too. */ ! 6212: else if (TREE_CODE (decl) == PARM_DECL && TYPE_NEEDS_DESTRUCTOR (type)) ! 6213: { ! 6214: if (temporary) ! 6215: end_temporary_allocation (); ! 6216: cleanup = maybe_build_cleanup (decl); ! 6217: if (temporary) ! 6218: resume_temporary_allocation (); ! 6219: } ! 6220: ! 6221: /* Output the assembler code and/or RTL code for variables and functions, ! 6222: unless the type is an undefined structure or union. ! 6223: If not, it will get done when the type is completed. */ ! 6224: ! 6225: if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL ! 6226: || TREE_CODE (decl) == RESULT_DECL) ! 6227: { ! 6228: /* ??? FIXME: What about nested classes? */ ! 6229: int toplev = (current_binding_level == global_binding_level ! 6230: || pseudo_global_level_p ()); ! 6231: int was_temp ! 6232: = ((flag_traditional ! 6233: || (TREE_STATIC (decl) && TYPE_NEEDS_DESTRUCTOR (type))) ! 6234: && allocation_temporary_p ()); ! 6235: ! 6236: if (was_temp) ! 6237: end_temporary_allocation (); ! 6238: ! 6239: /* If we are in need of a cleanup, get out of any implicit ! 6240: handlers that have been established so far. */ ! 6241: if (cleanup && current_binding_level->parm_flag == 3) ! 6242: { ! 6243: pop_implicit_try_blocks (decl); ! 6244: current_binding_level->more_exceptions_ok = 0; ! 6245: } ! 6246: ! 6247: if (TREE_CODE (decl) == VAR_DECL ! 6248: && current_binding_level != global_binding_level ! 6249: && ! TREE_STATIC (decl) ! 6250: && type_needs_gc_entry (type)) ! 6251: DECL_GC_OFFSET (decl) = size_int (++current_function_obstack_index); ! 6252: ! 6253: if (TREE_CODE (decl) == VAR_DECL && DECL_VIRTUAL_P (decl)) ! 6254: make_decl_rtl (decl, NULL_PTR, toplev); ! 6255: else if (TREE_CODE (decl) == VAR_DECL ! 6256: && TREE_READONLY (decl) ! 6257: && DECL_INITIAL (decl) != NULL_TREE ! 6258: && DECL_INITIAL (decl) != error_mark_node ! 6259: && DECL_INITIAL (decl) != empty_init_node) ! 6260: { ! 6261: DECL_INITIAL (decl) = save_expr (DECL_INITIAL (decl)); ! 6262: ! 6263: if (asmspec) ! 6264: DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec); ! 6265: ! 6266: if (! toplev ! 6267: && TREE_STATIC (decl) ! 6268: && ! TREE_SIDE_EFFECTS (decl) ! 6269: && ! TREE_PUBLIC (decl) ! 6270: && ! DECL_EXTERNAL (decl) ! 6271: && ! TYPE_NEEDS_DESTRUCTOR (type) ! 6272: && DECL_MODE (decl) != BLKmode) ! 6273: { ! 6274: /* If this variable is really a constant, then fill its DECL_RTL ! 6275: slot with something which won't take up storage. ! 6276: If something later should take its address, we can always give ! 6277: it legitimate RTL at that time. */ ! 6278: DECL_RTL (decl) = gen_reg_rtx (DECL_MODE (decl)); ! 6279: store_expr (DECL_INITIAL (decl), DECL_RTL (decl), 0); ! 6280: TREE_ASM_WRITTEN (decl) = 1; ! 6281: } ! 6282: else if (toplev) ! 6283: { ! 6284: /* Keep GCC from complaining that this variable ! 6285: is defined but never used. */ ! 6286: TREE_USED (decl) = 1; ! 6287: /* If this is a static const, change its apparent linkage ! 6288: if it belongs to a #pragma interface. */ ! 6289: if (TREE_STATIC (decl) && !interface_unknown) ! 6290: { ! 6291: TREE_PUBLIC (decl) = 1; ! 6292: DECL_EXTERNAL (decl) = interface_only; ! 6293: } ! 6294: make_decl_rtl (decl, asmspec, toplev); ! 6295: } ! 6296: else ! 6297: rest_of_decl_compilation (decl, asmspec, toplev, 0); ! 6298: } ! 6299: else if (TREE_CODE (decl) == VAR_DECL ! 6300: && DECL_LANG_SPECIFIC (decl) ! 6301: && DECL_IN_AGGR_P (decl)) ! 6302: { ! 6303: if (TREE_STATIC (decl)) ! 6304: { ! 6305: if (init == NULL_TREE ! 6306: #ifdef DEFAULT_STATIC_DEFS ! 6307: /* If this code is dead, then users must ! 6308: explicitly declare static member variables ! 6309: outside the class def'n as well. */ ! 6310: && TYPE_NEEDS_CONSTRUCTING (type) ! 6311: #endif ! 6312: ) ! 6313: { ! 6314: DECL_EXTERNAL (decl) = 1; ! 6315: make_decl_rtl (decl, asmspec, 1); ! 6316: } ! 6317: else ! 6318: rest_of_decl_compilation (decl, asmspec, toplev, 0); ! 6319: } ! 6320: else ! 6321: /* Just a constant field. Should not need any rtl. */ ! 6322: goto finish_end0; ! 6323: } ! 6324: else ! 6325: rest_of_decl_compilation (decl, asmspec, toplev, 0); ! 6326: ! 6327: if (was_temp) ! 6328: resume_temporary_allocation (); ! 6329: ! 6330: if (type != error_mark_node ! 6331: && TYPE_LANG_SPECIFIC (type) ! 6332: && CLASSTYPE_ABSTRACT_VIRTUALS (type)) ! 6333: abstract_virtuals_error (decl, type); ! 6334: else if ((TREE_CODE (type) == FUNCTION_TYPE ! 6335: || TREE_CODE (type) == METHOD_TYPE) ! 6336: && TYPE_LANG_SPECIFIC (TREE_TYPE (type)) ! 6337: && CLASSTYPE_ABSTRACT_VIRTUALS (TREE_TYPE (type))) ! 6338: abstract_virtuals_error (decl, TREE_TYPE (type)); ! 6339: ! 6340: if (TREE_CODE (decl) == FUNCTION_DECL) ! 6341: { ! 6342: /* C++: Handle overloaded functions with default parameters. */ ! 6343: if (DECL_OVERLOADED (decl)) ! 6344: { ! 6345: tree parmtypes = TYPE_ARG_TYPES (type); ! 6346: tree prev = NULL_TREE; ! 6347: tree original_name = DECL_NAME (decl); ! 6348: struct lang_decl *tmp_lang_decl = DECL_LANG_SPECIFIC (decl); ! 6349: /* All variants will share an uncollectible lang_decl. */ ! 6350: copy_decl_lang_specific (decl); ! 6351: ! 6352: while (parmtypes && parmtypes != void_list_node) ! 6353: { ! 6354: /* The default value for the parameter in parmtypes is ! 6355: stored in the TREE_PURPOSE of the TREE_LIST. */ ! 6356: if (TREE_PURPOSE (parmtypes)) ! 6357: { ! 6358: tree fnname, fndecl; ! 6359: tree *argp; ! 6360: ! 6361: argp = prev ? & TREE_CHAIN (prev) ! 6362: : & TYPE_ARG_TYPES (type); ! 6363: ! 6364: *argp = NULL_TREE; ! 6365: fnname = build_decl_overload (original_name, TYPE_ARG_TYPES (type), 0); ! 6366: *argp = parmtypes; ! 6367: fndecl = build_decl (FUNCTION_DECL, fnname, type); ! 6368: DECL_EXTERNAL (fndecl) = DECL_EXTERNAL (decl); ! 6369: TREE_PUBLIC (fndecl) = TREE_PUBLIC (decl); ! 6370: DECL_INLINE (fndecl) = DECL_INLINE (decl); ! 6371: /* Keep G++ from thinking this function is unused. ! 6372: It is only used to speed up search in name space. */ ! 6373: TREE_USED (fndecl) = 1; ! 6374: TREE_ASM_WRITTEN (fndecl) = 1; ! 6375: DECL_INITIAL (fndecl) = NULL_TREE; ! 6376: DECL_LANG_SPECIFIC (fndecl) = DECL_LANG_SPECIFIC (decl); ! 6377: fndecl = pushdecl (fndecl); ! 6378: DECL_INITIAL (fndecl) = error_mark_node; ! 6379: DECL_RTL (fndecl) = DECL_RTL (decl); ! 6380: } ! 6381: prev = parmtypes; ! 6382: parmtypes = TREE_CHAIN (parmtypes); ! 6383: } ! 6384: DECL_LANG_SPECIFIC (decl) = tmp_lang_decl; ! 6385: } ! 6386: } ! 6387: else if (DECL_EXTERNAL (decl)) ! 6388: ; ! 6389: else if (TREE_STATIC (decl) && type != error_mark_node) ! 6390: { ! 6391: /* Cleanups for static variables are handled by `finish_file'. */ ! 6392: if (TYPE_NEEDS_CONSTRUCTING (type) || init != NULL_TREE) ! 6393: expand_static_init (decl, init); ! 6394: else if (TYPE_NEEDS_DESTRUCTOR (type)) ! 6395: static_aggregates = perm_tree_cons (NULL_TREE, decl, ! 6396: static_aggregates); ! 6397: ! 6398: /* Make entry in appropriate vector. */ ! 6399: if (flag_gc && type_needs_gc_entry (type)) ! 6400: build_static_gc_entry (decl, type); ! 6401: } ! 6402: else if (! toplev) ! 6403: { ! 6404: /* This is a declared decl which must live until the ! 6405: end of the binding contour. It may need a cleanup. */ ! 6406: ! 6407: /* Recompute the RTL of a local array now ! 6408: if it used to be an incomplete type. */ ! 6409: if (was_incomplete && ! TREE_STATIC (decl)) ! 6410: { ! 6411: /* If we used it already as memory, it must stay in memory. */ ! 6412: TREE_ADDRESSABLE (decl) = TREE_USED (decl); ! 6413: /* If it's still incomplete now, no init will save it. */ ! 6414: if (DECL_SIZE (decl) == NULL_TREE) ! 6415: DECL_INITIAL (decl) = NULL_TREE; ! 6416: expand_decl (decl); ! 6417: } ! 6418: else if (! TREE_ASM_WRITTEN (decl) ! 6419: && (TYPE_SIZE (type) != NULL_TREE ! 6420: || TREE_CODE (type) == ARRAY_TYPE)) ! 6421: { ! 6422: /* Do this here, because we did not expand this decl's ! 6423: rtl in start_decl. */ ! 6424: if (DECL_RTL (decl) == NULL_RTX) ! 6425: expand_decl (decl); ! 6426: else if (cleanup) ! 6427: { ! 6428: expand_decl_cleanup (NULL_TREE, cleanup); ! 6429: /* Cleanup used up here. */ ! 6430: cleanup = NULL_TREE; ! 6431: } ! 6432: } ! 6433: ! 6434: if (DECL_SIZE (decl) && type != error_mark_node) ! 6435: { ! 6436: /* Compute and store the initial value. */ ! 6437: expand_decl_init (decl); ! 6438: ! 6439: if (init || TYPE_NEEDS_CONSTRUCTING (type)) ! 6440: { ! 6441: emit_line_note (DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl)); ! 6442: expand_aggr_init (decl, init, 0); ! 6443: } ! 6444: ! 6445: /* Set this to 0 so we can tell whether an aggregate ! 6446: which was initialized was ever used. */ ! 6447: if (TYPE_NEEDS_CONSTRUCTING (type)) ! 6448: TREE_USED (decl) = 0; ! 6449: ! 6450: /* Store the cleanup, if there was one. */ ! 6451: if (cleanup) ! 6452: { ! 6453: if (! expand_decl_cleanup (decl, cleanup)) ! 6454: cp_error ("parser lost in parsing declaration of `%D'", decl); ! 6455: } ! 6456: } ! 6457: } ! 6458: finish_end0: ! 6459: ! 6460: /* Undo call to `pushclass' that was done in `start_decl' ! 6461: due to initialization of qualified member variable. ! 6462: I.e., Foo::x = 10; */ ! 6463: { ! 6464: tree context = DECL_CONTEXT (decl); ! 6465: if (context ! 6466: && TREE_CODE_CLASS (TREE_CODE (context)) == 't' ! 6467: && (TREE_CODE (decl) == VAR_DECL ! 6468: /* We also have a pushclass done that we need to undo here ! 6469: if we're at top level and declare a method. */ ! 6470: || (TREE_CODE (decl) == FUNCTION_DECL ! 6471: /* If size hasn't been set, we're still defining it, ! 6472: and therefore inside the class body; don't pop ! 6473: the binding level.. */ ! 6474: && TYPE_SIZE (context) != NULL_TREE ! 6475: /* The binding level gets popped elsewhere for a ! 6476: friend declaration inside another class. */ ! 6477: && TYPE_IDENTIFIER (context) == current_class_name ! 6478: ))) ! 6479: popclass (1); ! 6480: } ! 6481: } ! 6482: ! 6483: finish_end: ! 6484: ! 6485: if (need_pop) ! 6486: { ! 6487: /* Resume permanent allocation, if not within a function. */ ! 6488: /* The corresponding push_obstacks_nochange is in start_decl, ! 6489: start_method, groktypename, and in grokfield. */ ! 6490: pop_obstacks (); ! 6491: } ! 6492: ! 6493: if (was_readonly) ! 6494: TREE_READONLY (decl) = 1; ! 6495: ! 6496: if (flag_cadillac) ! 6497: cadillac_finish_decl (decl); ! 6498: } ! 6499: ! 6500: static void ! 6501: expand_static_init (decl, init) ! 6502: tree decl; ! 6503: tree init; ! 6504: { ! 6505: tree oldstatic = value_member (decl, static_aggregates); ! 6506: if (oldstatic) ! 6507: { ! 6508: if (TREE_PURPOSE (oldstatic) && init != NULL_TREE) ! 6509: cp_error ("multiple initializations given for `%D'", decl); ! 6510: } ! 6511: else if (current_binding_level != global_binding_level) ! 6512: { ! 6513: /* Emit code to perform this initialization but once. */ ! 6514: tree temp; ! 6515: ! 6516: /* Remember this information until end of file. */ ! 6517: push_obstacks (&permanent_obstack, &permanent_obstack); ! 6518: ! 6519: /* Emit code to perform this initialization but once. */ ! 6520: temp = get_temp_name (integer_type_node, 1); ! 6521: rest_of_decl_compilation (temp, NULL_PTR, 0, 0); ! 6522: expand_start_cond (build_binary_op (EQ_EXPR, temp, ! 6523: integer_zero_node, 1), 0); ! 6524: expand_assignment (temp, integer_one_node, 0, 0); ! 6525: if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))) ! 6526: { ! 6527: expand_aggr_init (decl, init, 0); ! 6528: do_pending_stack_adjust (); ! 6529: } ! 6530: else ! 6531: expand_assignment (decl, init, 0, 0); ! 6532: expand_end_cond (); ! 6533: if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (decl))) ! 6534: { ! 6535: static_aggregates = perm_tree_cons (temp, decl, static_aggregates); ! 6536: TREE_STATIC (static_aggregates) = 1; ! 6537: } ! 6538: ! 6539: /* Resume old (possibly temporary) allocation. */ ! 6540: pop_obstacks (); ! 6541: } ! 6542: else ! 6543: { ! 6544: /* This code takes into account memory allocation ! 6545: policy of `start_decl'. Namely, if TYPE_NEEDS_CONSTRUCTING ! 6546: does not hold for this object, then we must make permanent ! 6547: the storage currently in the temporary obstack. */ ! 6548: if (! TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))) ! 6549: preserve_initializer (); ! 6550: static_aggregates = perm_tree_cons (init, decl, static_aggregates); ! 6551: } ! 6552: } ! 6553: ! 6554: /* Make TYPE a complete type based on INITIAL_VALUE. ! 6555: Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered, ! 6556: 2 if there was no information (in which case assume 1 if DO_DEFAULT). */ ! 6557: ! 6558: int ! 6559: complete_array_type (type, initial_value, do_default) ! 6560: tree type, initial_value; ! 6561: int do_default; ! 6562: { ! 6563: register tree maxindex = NULL_TREE; ! 6564: int value = 0; ! 6565: ! 6566: if (initial_value) ! 6567: { ! 6568: /* Note MAXINDEX is really the maximum index, ! 6569: one less than the size. */ ! 6570: if (TREE_CODE (initial_value) == STRING_CST) ! 6571: maxindex = build_int_2 (TREE_STRING_LENGTH (initial_value) - 1, 0); ! 6572: else if (TREE_CODE (initial_value) == CONSTRUCTOR) ! 6573: { ! 6574: register int nelts ! 6575: = list_length (CONSTRUCTOR_ELTS (initial_value)); ! 6576: maxindex = build_int_2 (nelts - 1, - (nelts == 0)); ! 6577: } ! 6578: else ! 6579: { ! 6580: /* Make an error message unless that happened already. */ ! 6581: if (initial_value != error_mark_node) ! 6582: value = 1; ! 6583: ! 6584: /* Prevent further error messages. */ ! 6585: maxindex = build_int_2 (0, 0); ! 6586: } ! 6587: } ! 6588: ! 6589: if (!maxindex) ! 6590: { ! 6591: if (do_default) ! 6592: maxindex = build_int_2 (0, 0); ! 6593: value = 2; ! 6594: } ! 6595: ! 6596: if (maxindex) ! 6597: { ! 6598: TYPE_DOMAIN (type) = build_index_type (maxindex); ! 6599: if (!TREE_TYPE (maxindex)) ! 6600: TREE_TYPE (maxindex) = TYPE_DOMAIN (type); ! 6601: } ! 6602: ! 6603: /* Lay out the type now that we can get the real answer. */ ! 6604: ! 6605: layout_type (type); ! 6606: ! 6607: return value; ! 6608: } ! 6609: ! 6610: /* Return zero if something is declared to be a member of type ! 6611: CTYPE when in the context of CUR_TYPE. STRING is the error ! 6612: message to print in that case. Otherwise, quietly return 1. */ ! 6613: static int ! 6614: member_function_or_else (ctype, cur_type, string) ! 6615: tree ctype, cur_type; ! 6616: char *string; ! 6617: { ! 6618: if (ctype && ctype != cur_type) ! 6619: { ! 6620: error (string, TYPE_NAME_STRING (ctype)); ! 6621: return 0; ! 6622: } ! 6623: return 1; ! 6624: } ! 6625: ! 6626: /* Subroutine of `grokdeclarator'. */ ! 6627: ! 6628: /* Generate errors possibly applicable for a given set of specifiers. ! 6629: This is for ARM $7.1.2. */ ! 6630: static void ! 6631: bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises) ! 6632: tree object; ! 6633: char *type; ! 6634: int virtualp, quals, inlinep, friendp, raises; ! 6635: { ! 6636: if (virtualp) ! 6637: cp_error ("`%D' declared as a `virtual' %s", object, type); ! 6638: if (inlinep) ! 6639: cp_error ("`%D' declared as an `inline' %s", object, type); ! 6640: if (quals) ! 6641: cp_error ("`const' and `volatile' function specifiers on `%D' invalid in %s declaration", object, type); ! 6642: if (friendp) ! 6643: cp_error_at ("invalid friend declaration", object); ! 6644: if (raises) ! 6645: cp_error_at ("invalid raises declaration", object); ! 6646: } ! 6647: ! 6648: /* CTYPE is class type, or null if non-class. ! 6649: TYPE is type this FUNCTION_DECL should have, either FUNCTION_TYPE ! 6650: or METHOD_TYPE. ! 6651: DECLARATOR is the function's name. ! 6652: VIRTUALP is truthvalue of whether the function is virtual or not. ! 6653: FLAGS are to be passed through to `grokclassfn'. ! 6654: QUALS are qualifiers indicating whether the function is `const' ! 6655: or `volatile'. ! 6656: RAISES is a list of exceptions that this function can raise. ! 6657: CHECK is 1 if we must find this method in CTYPE, 0 if we should ! 6658: not look, and -1 if we should not call `grokclassfn' at all. */ ! 6659: static tree ! 6660: grokfndecl (ctype, type, declarator, virtualp, flags, quals, raises, check, publicp) ! 6661: tree ctype, type; ! 6662: tree declarator; ! 6663: int virtualp; ! 6664: enum overload_flags flags; ! 6665: tree quals, raises; ! 6666: int check, publicp; ! 6667: { ! 6668: tree cname, decl; ! 6669: int staticp = ctype && TREE_CODE (type) == FUNCTION_TYPE; ! 6670: ! 6671: if (ctype) ! 6672: cname = TREE_CODE (TYPE_NAME (ctype)) == TYPE_DECL ! 6673: ? TYPE_IDENTIFIER (ctype) : TYPE_NAME (ctype); ! 6674: else ! 6675: cname = NULL_TREE; ! 6676: ! 6677: if (raises) ! 6678: { ! 6679: type = build_exception_variant (ctype, type, raises); ! 6680: raises = TYPE_RAISES_EXCEPTIONS (type); ! 6681: } ! 6682: decl = build_lang_decl (FUNCTION_DECL, declarator, type); ! 6683: /* propagate volatile out from type to decl */ ! 6684: if (TYPE_VOLATILE (type)) ! 6685: TREE_THIS_VOLATILE (decl) = 1; ! 6686: ! 6687: /* Should probably propagate const out from type to decl I bet (mrs). */ ! 6688: if (staticp) ! 6689: { ! 6690: DECL_STATIC_FUNCTION_P (decl) = 1; ! 6691: DECL_CONTEXT (decl) = ctype; ! 6692: DECL_CLASS_CONTEXT (decl) = ctype; ! 6693: } ! 6694: ! 6695: if (publicp) ! 6696: TREE_PUBLIC (decl) = 1; ! 6697: ! 6698: DECL_EXTERNAL (decl) = 1; ! 6699: if (quals != NULL_TREE && TREE_CODE (type) == FUNCTION_TYPE) ! 6700: { ! 6701: cp_error ("%smember function `%D' cannot have `%T' method qualifier", ! 6702: (ctype ? "static " : "non-"), decl, TREE_VALUE (quals)); ! 6703: quals = NULL_TREE; ! 6704: } ! 6705: ! 6706: if (IDENTIFIER_OPNAME_P (DECL_NAME (decl))) ! 6707: grok_op_properties (decl, virtualp); ! 6708: ! 6709: /* Caller will do the rest of this. */ ! 6710: if (check < 0) ! 6711: return decl; ! 6712: ! 6713: if (flags == NO_SPECIAL && ctype && constructor_name (cname) == declarator) ! 6714: { ! 6715: tree tmp; ! 6716: /* Just handle constructors here. We could do this ! 6717: inside the following if stmt, but I think ! 6718: that the code is more legible by breaking this ! 6719: case out. See comments below for what each of ! 6720: the following calls is supposed to do. */ ! 6721: DECL_CONSTRUCTOR_P (decl) = 1; ! 6722: ! 6723: grokclassfn (ctype, declarator, decl, flags, quals); ! 6724: if (check) ! 6725: check_classfn (ctype, declarator, decl); ! 6726: grok_ctor_properties (ctype, decl); ! 6727: if (check == 0) ! 6728: { ! 6729: /* FIXME: this should only need to look at IDENTIFIER_GLOBAL_VALUE. */ ! 6730: tmp = lookup_name (DECL_ASSEMBLER_NAME (decl), 0); ! 6731: if (tmp == NULL_TREE) ! 6732: IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (decl)) = decl; ! 6733: else if (TREE_CODE (tmp) != TREE_CODE (decl)) ! 6734: cp_error ("inconsistent declarations for `%D'", decl); ! 6735: else ! 6736: { ! 6737: duplicate_decls (decl, tmp); ! 6738: decl = tmp; ! 6739: /* avoid creating circularities. */ ! 6740: DECL_CHAIN (decl) = NULL_TREE; ! 6741: } ! 6742: make_decl_rtl (decl, NULL_PTR, 1); ! 6743: } ! 6744: } ! 6745: else ! 6746: { ! 6747: tree tmp; ! 6748: ! 6749: /* Function gets the ugly name, field gets the nice one. ! 6750: This call may change the type of the function (because ! 6751: of default parameters)! */ ! 6752: if (ctype != NULL_TREE) ! 6753: grokclassfn (ctype, cname, decl, flags, quals); ! 6754: ! 6755: if (ctype != NULL_TREE && check) ! 6756: check_classfn (ctype, cname, decl); ! 6757: ! 6758: if (ctype == NULL_TREE || check) ! 6759: return decl; ! 6760: ! 6761: /* Now install the declaration of this function so that ! 6762: others may find it (esp. its DECL_FRIENDLIST). ! 6763: Pretend we are at top level, we will get true ! 6764: reference later, perhaps. ! 6765: ! 6766: FIXME: This should only need to look at IDENTIFIER_GLOBAL_VALUE. */ ! 6767: tmp = lookup_name (DECL_ASSEMBLER_NAME (decl), 0); ! 6768: if (tmp == NULL_TREE) ! 6769: IDENTIFIER_GLOBAL_VALUE (DECL_ASSEMBLER_NAME (decl)) = decl; ! 6770: else if (TREE_CODE (tmp) != TREE_CODE (decl)) ! 6771: cp_error ("inconsistent declarations for `%D'", decl); ! 6772: else ! 6773: { ! 6774: duplicate_decls (decl, tmp); ! 6775: decl = tmp; ! 6776: /* avoid creating circularities. */ ! 6777: DECL_CHAIN (decl) = NULL_TREE; ! 6778: } ! 6779: make_decl_rtl (decl, NULL_PTR, 1); ! 6780: ! 6781: /* If this declaration supersedes the declaration of ! 6782: a method declared virtual in the base class, then ! 6783: mark this field as being virtual as well. */ ! 6784: { ! 6785: tree binfos = BINFO_BASETYPES (TYPE_BINFO (ctype)); ! 6786: int i, n_baselinks = binfos ? TREE_VEC_LENGTH (binfos) : 0; ! 6787: ! 6788: for (i = 0; i < n_baselinks; i++) ! 6789: { ! 6790: tree base_binfo = TREE_VEC_ELT (binfos, i); ! 6791: if (TYPE_VIRTUAL_P (BINFO_TYPE (base_binfo)) || flag_all_virtual == 1) ! 6792: { ! 6793: tmp = get_first_matching_virtual (base_binfo, decl, ! 6794: flags == DTOR_FLAG); ! 6795: if (tmp) ! 6796: { ! 6797: /* If this function overrides some virtual in some base ! 6798: class, then the function itself is also necessarily ! 6799: virtual, even if the user didn't explicitly say so. */ ! 6800: DECL_VIRTUAL_P (decl) = 1; ! 6801: ! 6802: /* The TMP we really want is the one from the deepest ! 6803: baseclass on this path, taking care not to ! 6804: duplicate if we have already found it (via another ! 6805: path to its virtual baseclass. */ ! 6806: if (staticp) ! 6807: { ! 6808: cp_error ("method `%D' may not be declared static", decl); ! 6809: cp_error_at ("(since `%D' declared virtual in base class.)", tmp); ! 6810: break; ! 6811: } ! 6812: virtualp = 1; ! 6813: ! 6814: if ((TYPE_USES_VIRTUAL_BASECLASSES (BINFO_TYPE (base_binfo)) ! 6815: || TYPE_USES_MULTIPLE_INHERITANCE (ctype)) ! 6816: && BINFO_TYPE (base_binfo) != DECL_CONTEXT (tmp)) ! 6817: tmp = get_first_matching_virtual (TYPE_BINFO (DECL_CONTEXT (tmp)), ! 6818: decl, flags == DTOR_FLAG); ! 6819: if (value_member (tmp, DECL_VINDEX (decl)) == NULL_TREE) ! 6820: { ! 6821: /* The argument types may have changed... */ ! 6822: tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl)); ! 6823: tree base_variant = TREE_TYPE (TREE_VALUE (argtypes)); ! 6824: ! 6825: argtypes = commonparms (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (tmp))), ! 6826: TREE_CHAIN (argtypes)); ! 6827: /* But the return type has not. */ ! 6828: type = build_cplus_method_type (base_variant, TREE_TYPE (type), argtypes); ! 6829: if (raises) ! 6830: { ! 6831: type = build_exception_variant (ctype, type, raises); ! 6832: raises = TYPE_RAISES_EXCEPTIONS (type); ! 6833: } ! 6834: TREE_TYPE (decl) = type; ! 6835: DECL_VINDEX (decl) ! 6836: = tree_cons (NULL_TREE, tmp, DECL_VINDEX (decl)); ! 6837: } ! 6838: } ! 6839: } ! 6840: } ! 6841: } ! 6842: if (virtualp) ! 6843: { ! 6844: if (DECL_VINDEX (decl) == NULL_TREE) ! 6845: DECL_VINDEX (decl) = error_mark_node; ! 6846: IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)) = 1; ! 6847: if (ctype && CLASSTYPE_VTABLE_NEEDS_WRITING (ctype) ! 6848: /* If this function is derived from a template, don't ! 6849: make it public. This shouldn't be here, but there's ! 6850: no good way to override the interface pragmas for one ! 6851: function or class only. Bletch. */ ! 6852: && IDENTIFIER_TEMPLATE (TYPE_IDENTIFIER (ctype)) == NULL_TREE ! 6853: && (write_virtuals == 2 ! 6854: || (write_virtuals == 3 ! 6855: && CLASSTYPE_INTERFACE_KNOWN (ctype)))) ! 6856: TREE_PUBLIC (decl) = 1; ! 6857: } ! 6858: } ! 6859: return decl; ! 6860: } ! 6861: ! 6862: static tree ! 6863: grokvardecl (type, declarator, specbits, initialized) ! 6864: tree type; ! 6865: tree declarator; ! 6866: RID_BIT_TYPE specbits; ! 6867: int initialized; ! 6868: { ! 6869: tree decl; ! 6870: ! 6871: if (TREE_CODE (type) == OFFSET_TYPE) ! 6872: { ! 6873: /* If you declare a static member so that it ! 6874: can be initialized, the code will reach here. */ ! 6875: tree field = lookup_field (TYPE_OFFSET_BASETYPE (type), ! 6876: declarator, 0, 0); ! 6877: if (field == NULL_TREE || TREE_CODE (field) != VAR_DECL) ! 6878: { ! 6879: tree basetype = TYPE_OFFSET_BASETYPE (type); ! 6880: error ("`%s' is not a static member of class `%s'", ! 6881: IDENTIFIER_POINTER (declarator), ! 6882: TYPE_NAME_STRING (basetype)); ! 6883: type = TREE_TYPE (type); ! 6884: decl = build_lang_field_decl (VAR_DECL, declarator, type); ! 6885: DECL_CONTEXT (decl) = basetype; ! 6886: DECL_CLASS_CONTEXT (decl) = basetype; ! 6887: } ! 6888: else ! 6889: { ! 6890: tree f_type = TREE_TYPE (field); ! 6891: tree o_type = TREE_TYPE (type); ! 6892: ! 6893: if (TYPE_SIZE (f_type) == NULL_TREE) ! 6894: { ! 6895: if (TREE_CODE (f_type) != TREE_CODE (o_type) ! 6896: || (TREE_CODE (f_type) == ARRAY_TYPE ! 6897: && TREE_TYPE (f_type) != TREE_TYPE (o_type))) ! 6898: error ("redeclaration of type for `%s'", ! 6899: IDENTIFIER_POINTER (declarator)); ! 6900: else if (TYPE_SIZE (o_type) != NULL_TREE) ! 6901: TREE_TYPE (field) = type; ! 6902: } ! 6903: else if (f_type != o_type) ! 6904: error ("redeclaration of type for `%s'", ! 6905: IDENTIFIER_POINTER (declarator)); ! 6906: decl = field; ! 6907: if (initialized && DECL_INITIAL (decl) ! 6908: /* Complain about multiply-initialized ! 6909: member variables, but don't be faked ! 6910: out if initializer is faked up from `empty_init_node'. */ ! 6911: && (TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR ! 6912: || CONSTRUCTOR_ELTS (DECL_INITIAL (decl)) != NULL_TREE)) ! 6913: error_with_aggr_type (DECL_CONTEXT (decl), ! 6914: "multiple initializations of static member `%s::%s'", ! 6915: IDENTIFIER_POINTER (DECL_NAME (decl))); ! 6916: } ! 6917: } ! 6918: else ! 6919: decl = build_decl (VAR_DECL, declarator, type); ! 6920: ! 6921: if (RIDBIT_SETP (RID_EXTERN, specbits)) ! 6922: { ! 6923: DECL_THIS_EXTERN (decl) = 1; ! 6924: DECL_EXTERNAL (decl) = !initialized; ! 6925: } ! 6926: ! 6927: /* In class context, static means one per class, ! 6928: public visibility, and static storage. */ ! 6929: if (DECL_FIELD_CONTEXT (decl) != NULL_TREE ! 6930: && IS_AGGR_TYPE (DECL_FIELD_CONTEXT (decl))) ! 6931: { ! 6932: TREE_PUBLIC (decl) = 1; ! 6933: TREE_STATIC (decl) = 1; ! 6934: DECL_EXTERNAL (decl) = !initialized; ! 6935: } ! 6936: /* At top level, either `static' or no s.c. makes a definition ! 6937: (perhaps tentative), and absence of `static' makes it public. */ ! 6938: else if (current_binding_level == global_binding_level) ! 6939: { ! 6940: TREE_PUBLIC (decl) = RIDBIT_NOTSETP (RID_STATIC, specbits); ! 6941: TREE_STATIC (decl) = ! DECL_EXTERNAL (decl); ! 6942: } ! 6943: /* Not at top level, only `static' makes a static definition. */ ! 6944: else ! 6945: { ! 6946: TREE_STATIC (decl) = !! RIDBIT_SETP (RID_STATIC, specbits); ! 6947: TREE_PUBLIC (decl) = DECL_EXTERNAL (decl); ! 6948: } ! 6949: return decl; ! 6950: } ! 6951: ! 6952: /* Create a canonical pointer to member function type. */ ! 6953: ! 6954: static tree ! 6955: build_ptrmemfunc_type (type) ! 6956: tree type; ! 6957: { ! 6958: tree fields[4]; ! 6959: tree t; ! 6960: tree u; ! 6961: ! 6962: /* If a canonical type already exists for this type, use it. We use ! 6963: this method instead of type_hash_canon, because it only does a ! 6964: simple equality check on the list of field members. */ ! 6965: ! 6966: if ((t = TYPE_GET_PTRMEMFUNC_TYPE (type))) ! 6967: return t; ! 6968: ! 6969: u = make_lang_type (UNION_TYPE); ! 6970: fields[0] = build_lang_field_decl (FIELD_DECL, pfn_identifier, type); ! 6971: fields[1] = build_lang_field_decl (FIELD_DECL, delta2_identifier, short_integer_type_node); ! 6972: finish_builtin_type (u, "__ptrmemfunc_type", fields, 1, ptr_type_node); ! 6973: TYPE_NAME (u) = NULL_TREE; ! 6974: ! 6975: t = make_lang_type (RECORD_TYPE); ! 6976: ! 6977: /* Let the front-end know this is a pointer to member function. */ ! 6978: TYPE_PTRMEMFUNC_FLAG(t) = 1; ! 6979: ! 6980: fields[0] = build_lang_field_decl (FIELD_DECL, delta_identifier, short_integer_type_node); ! 6981: fields[1] = build_lang_field_decl (FIELD_DECL, index_identifier, short_integer_type_node); ! 6982: fields[2] = build_lang_field_decl (FIELD_DECL, pfn_or_delta2_identifier, u); ! 6983: finish_builtin_type (t, "__ptrmemfunc_type", fields, 2, ptr_type_node); ! 6984: ! 6985: /* Zap out the name so that the back-end will give us the debugging ! 6986: information for this anonymous RECORD_TYPE. */ ! 6987: TYPE_NAME (t) = NULL_TREE; ! 6988: ! 6989: TYPE_SET_PTRMEMFUNC_TYPE (type, t); ! 6990: ! 6991: /* Seems to be wanted. */ ! 6992: CLASSTYPE_GOT_SEMICOLON (t) = 1; ! 6993: return t; ! 6994: } ! 6995: ! 6996: /* Given declspecs and a declarator, ! 6997: determine the name and type of the object declared ! 6998: and construct a ..._DECL node for it. ! 6999: (In one case we can return a ..._TYPE node instead. ! 7000: For invalid input we sometimes return 0.) ! 7001: ! 7002: DECLSPECS is a chain of tree_list nodes whose value fields ! 7003: are the storage classes and type specifiers. ! 7004: ! 7005: DECL_CONTEXT says which syntactic context this declaration is in: ! 7006: NORMAL for most contexts. Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL. ! 7007: FUNCDEF for a function definition. Like NORMAL but a few different ! 7008: error messages in each case. Return value may be zero meaning ! 7009: this definition is too screwy to try to parse. ! 7010: MEMFUNCDEF for a function definition. Like FUNCDEF but prepares to ! 7011: handle member functions (which have FIELD context). ! 7012: Return value may be zero meaning this definition is too screwy to ! 7013: try to parse. ! 7014: PARM for a parameter declaration (either within a function prototype ! 7015: or before a function body). Make a PARM_DECL, or return void_type_node. ! 7016: TYPENAME if for a typename (in a cast or sizeof). ! 7017: Don't make a DECL node; just return the ..._TYPE node. ! 7018: FIELD for a struct or union field; make a FIELD_DECL. ! 7019: BITFIELD for a field with specified width. ! 7020: INITIALIZED is 1 if the decl has an initializer. ! 7021: ! 7022: In the TYPENAME case, DECLARATOR is really an absolute declarator. ! 7023: It may also be so in the PARM case, for a prototype where the ! 7024: argument type is specified but not the name. ! 7025: ! 7026: This function is where the complicated C meanings of `static' ! 7027: and `extern' are interpreted. ! 7028: ! 7029: For C++, if there is any monkey business to do, the function which ! 7030: calls this one must do it, i.e., prepending instance variables, ! 7031: renaming overloaded function names, etc. ! 7032: ! 7033: Note that for this C++, it is an error to define a method within a class ! 7034: which does not belong to that class. ! 7035: ! 7036: Except in the case where SCOPE_REFs are implicitly known (such as ! 7037: methods within a class being redundantly qualified), ! 7038: declarations which involve SCOPE_REFs are returned as SCOPE_REFs ! 7039: (class_name::decl_name). The caller must also deal with this. ! 7040: ! 7041: If a constructor or destructor is seen, and the context is FIELD, ! 7042: then the type gains the attribute TREE_HAS_x. If such a declaration ! 7043: is erroneous, NULL_TREE is returned. ! 7044: ! 7045: QUALS is used only for FUNCDEF and MEMFUNCDEF cases. For a member ! 7046: function, these are the qualifiers to give to the `this' pointer. ! 7047: ! 7048: May return void_type_node if the declarator turned out to be a friend. ! 7049: See grokfield for details. */ ! 7050: ! 7051: enum return_types { return_normal, return_ctor, return_dtor, return_conversion }; ! 7052: ! 7053: tree ! 7054: grokdeclarator (declarator, declspecs, decl_context, initialized, raises) ! 7055: tree declspecs; ! 7056: tree declarator; ! 7057: enum decl_context decl_context; ! 7058: int initialized; ! 7059: tree raises; ! 7060: { ! 7061: RID_BIT_TYPE specbits; ! 7062: int nclasses = 0; ! 7063: tree spec; ! 7064: tree type = NULL_TREE; ! 7065: int longlong = 0; ! 7066: int constp; ! 7067: int volatilep; ! 7068: int virtualp, friendp, inlinep, staticp; ! 7069: int explicit_int = 0; ! 7070: int explicit_char = 0; ! 7071: tree typedef_decl = NULL_TREE; ! 7072: char *name; ! 7073: tree typedef_type = NULL_TREE; ! 7074: int funcdef_flag = 0; ! 7075: enum tree_code innermost_code = ERROR_MARK; ! 7076: int bitfield = 0; ! 7077: int size_varies = 0; ! 7078: /* Set this to error_mark_node for FIELD_DECLs we could not handle properly. ! 7079: All FIELD_DECLs we build here have `init' put into their DECL_INITIAL. */ ! 7080: tree init = NULL_TREE; ! 7081: ! 7082: /* Keep track of what sort of function is being processed ! 7083: so that we can warn about default return values, or explicit ! 7084: return values which do not match prescribed defaults. */ ! 7085: enum return_types return_type = return_normal; ! 7086: ! 7087: tree dname = NULL_TREE; ! 7088: tree ctype = current_class_type; ! 7089: tree ctor_return_type = NULL_TREE; ! 7090: enum overload_flags flags = NO_SPECIAL; ! 7091: int seen_scope_ref = 0; ! 7092: tree quals = NULL_TREE; ! 7093: ! 7094: RIDBIT_RESET_ALL (specbits); ! 7095: if (decl_context == FUNCDEF) ! 7096: funcdef_flag = 1, decl_context = NORMAL; ! 7097: else if (decl_context == MEMFUNCDEF) ! 7098: funcdef_flag = -1, decl_context = FIELD; ! 7099: else if (decl_context == BITFIELD) ! 7100: bitfield = 1, decl_context = FIELD; ! 7101: ! 7102: if (flag_traditional && allocation_temporary_p ()) ! 7103: end_temporary_allocation (); ! 7104: ! 7105: /* Look inside a declarator for the name being declared ! 7106: and get it as a string, for an error message. */ ! 7107: { ! 7108: tree type, last = NULL_TREE; ! 7109: register tree decl = declarator; ! 7110: name = NULL; ! 7111: ! 7112: /* If we see something of the form `aggr_type xyzzy (a, b, c)' ! 7113: it is either an old-style function declaration or a call to ! 7114: a constructor. The following conditional makes recognizes this ! 7115: case as being a call to a constructor. Too bad if it is not. */ ! 7116: ! 7117: /* For Doug Lea, also grok `aggr_type xyzzy (a, b, c)[10][10][10]'. */ ! 7118: while (decl && TREE_CODE (decl) == ARRAY_REF) ! 7119: { ! 7120: last = decl; ! 7121: decl = TREE_OPERAND (decl, 0); ! 7122: } ! 7123: ! 7124: if (decl && declspecs ! 7125: && TREE_CODE (decl) == CALL_EXPR ! 7126: && TREE_OPERAND (decl, 0) ! 7127: && (TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE ! 7128: || TREE_CODE (TREE_OPERAND (decl, 0)) == SCOPE_REF)) ! 7129: { ! 7130: type = TREE_CODE (TREE_VALUE (declspecs)) == IDENTIFIER_NODE ! 7131: ? lookup_name (TREE_VALUE (declspecs), 1) : ! 7132: (IS_AGGR_TYPE (TREE_VALUE (declspecs)) ! 7133: ? TYPE_NAME (TREE_VALUE (declspecs)) : NULL_TREE); ! 7134: ! 7135: /* We used to restrict this to just aggregate types for ! 7136: function-call notation for initialization. But since it ! 7137: can be done for more than aggregates (e.g., `int a(b);'), ! 7138: it's no longer restrained. */ ! 7139: if (type ! 7140: && TREE_CODE (type) == TYPE_DECL ! 7141: && parmlist_is_exprlist (TREE_OPERAND (decl, 1))) ! 7142: { ! 7143: if (decl_context == FIELD ! 7144: && TREE_CHAIN (TREE_OPERAND (decl, 1))) ! 7145: { ! 7146: /* That was an initializer list. */ ! 7147: sorry ("initializer lists for field declarations"); ! 7148: decl = TREE_OPERAND (decl, 0); ! 7149: if (last) ! 7150: { ! 7151: TREE_OPERAND (last, 0) = decl; ! 7152: decl = declarator; ! 7153: } ! 7154: declarator = decl; ! 7155: init = error_mark_node; ! 7156: goto bot; ! 7157: } ! 7158: else ! 7159: { ! 7160: init = TREE_OPERAND (decl, 1); ! 7161: if (last) ! 7162: { ! 7163: TREE_OPERAND (last, 0) = TREE_OPERAND (decl, 0); ! 7164: if (pedantic && init) ! 7165: { ! 7166: error ("arrays cannot take initializers"); ! 7167: init = error_mark_node; ! 7168: } ! 7169: } ! 7170: else ! 7171: declarator = TREE_OPERAND (declarator, 0); ! 7172: ! 7173: /* When dealing with scalar initializations we have to get ! 7174: rid of the surrounding TREE_LIST around the initializer. */ ! 7175: if (! IS_AGGR_TYPE (TREE_TYPE (type))) ! 7176: init = TREE_VALUE (init); ! 7177: ! 7178: decl = start_decl (declarator, declspecs, 1, NULL_TREE); ! 7179: finish_decl (decl, init, NULL_TREE, 1); ! 7180: return 0; ! 7181: } ! 7182: } ! 7183: ! 7184: if (parmlist_is_random (TREE_OPERAND (decl, 1))) ! 7185: { ! 7186: decl = TREE_OPERAND (decl, 0); ! 7187: if (TREE_CODE (decl) == SCOPE_REF) ! 7188: { ! 7189: if (TREE_COMPLEXITY (decl)) ! 7190: my_friendly_abort (15); ! 7191: decl = TREE_OPERAND (decl, 1); ! 7192: } ! 7193: if (TREE_CODE (decl) == IDENTIFIER_NODE) ! 7194: name = IDENTIFIER_POINTER (decl); ! 7195: if (name) ! 7196: error ("bad parameter list specification for function `%s'", ! 7197: name); ! 7198: else ! 7199: error ("bad parameter list specification for function"); ! 7200: return void_type_node; ! 7201: } ! 7202: bot: ! 7203: ; ! 7204: } ! 7205: else ! 7206: /* It didn't look like we thought it would, leave the ARRAY_REFs on. */ ! 7207: decl = declarator; ! 7208: ! 7209: while (decl) ! 7210: switch (TREE_CODE (decl)) ! 7211: { ! 7212: case COND_EXPR: ! 7213: ctype = NULL_TREE; ! 7214: decl = TREE_OPERAND (decl, 0); ! 7215: break; ! 7216: ! 7217: case BIT_NOT_EXPR: /* for C++ destructors! */ ! 7218: { ! 7219: tree name = TREE_OPERAND (decl, 0); ! 7220: tree rename = NULL_TREE; ! 7221: ! 7222: my_friendly_assert (flags == NO_SPECIAL, 152); ! 7223: flags = DTOR_FLAG; ! 7224: return_type = return_dtor; ! 7225: my_friendly_assert (TREE_CODE (name) == IDENTIFIER_NODE, 153); ! 7226: if (ctype == NULL_TREE) ! 7227: { ! 7228: if (current_class_type == NULL_TREE) ! 7229: { ! 7230: error ("destructors must be member functions"); ! 7231: flags = NO_SPECIAL; ! 7232: } ! 7233: else ! 7234: { ! 7235: tree t = constructor_name (current_class_name); ! 7236: if (t != name) ! 7237: rename = t; ! 7238: } ! 7239: } ! 7240: else ! 7241: { ! 7242: tree t = constructor_name (ctype); ! 7243: if (t != name) ! 7244: rename = t; ! 7245: } ! 7246: ! 7247: if (rename) ! 7248: { ! 7249: error ("destructor `%s' must match class name `%s'", ! 7250: IDENTIFIER_POINTER (name), ! 7251: IDENTIFIER_POINTER (rename)); ! 7252: TREE_OPERAND (decl, 0) = rename; ! 7253: } ! 7254: decl = name; ! 7255: } ! 7256: break; ! 7257: ! 7258: case ADDR_EXPR: /* C++ reference declaration */ ! 7259: /* fall through */ ! 7260: case ARRAY_REF: ! 7261: case INDIRECT_REF: ! 7262: ctype = NULL_TREE; ! 7263: innermost_code = TREE_CODE (decl); ! 7264: decl = TREE_OPERAND (decl, 0); ! 7265: break; ! 7266: ! 7267: case CALL_EXPR: ! 7268: innermost_code = TREE_CODE (decl); ! 7269: decl = TREE_OPERAND (decl, 0); ! 7270: if (decl_context == FIELD && ctype == NULL_TREE) ! 7271: ctype = current_class_type; ! 7272: if (ctype != NULL_TREE ! 7273: && decl != NULL_TREE && flags != DTOR_FLAG ! 7274: && decl == constructor_name (ctype)) ! 7275: { ! 7276: return_type = return_ctor; ! 7277: ctor_return_type = ctype; ! 7278: } ! 7279: ctype = NULL_TREE; ! 7280: break; ! 7281: ! 7282: case IDENTIFIER_NODE: ! 7283: dname = decl; ! 7284: name = IDENTIFIER_POINTER (decl); ! 7285: decl = NULL_TREE; ! 7286: break; ! 7287: ! 7288: case RECORD_TYPE: ! 7289: case UNION_TYPE: ! 7290: case ENUMERAL_TYPE: ! 7291: /* Parse error puts this typespec where ! 7292: a declarator should go. */ ! 7293: error ("declarator name missing"); ! 7294: dname = TYPE_NAME (decl); ! 7295: if (dname && TREE_CODE (dname) == TYPE_DECL) ! 7296: dname = DECL_NAME (dname); ! 7297: name = dname ? IDENTIFIER_POINTER (dname) : "<nameless>"; ! 7298: declspecs = temp_tree_cons (NULL_TREE, decl, declspecs); ! 7299: decl = NULL_TREE; ! 7300: break; ! 7301: ! 7302: case TYPE_EXPR: ! 7303: my_friendly_assert (flags == NO_SPECIAL, 154); ! 7304: flags = TYPENAME_FLAG; ! 7305: name = "operator <typename>"; /* We don't know the type yet. */ ! 7306: /* Go to the absdcl. */ ! 7307: decl = TREE_OPERAND (decl, 0); ! 7308: return_type = return_conversion; ! 7309: break; ! 7310: ! 7311: /* C++ extension */ ! 7312: case SCOPE_REF: ! 7313: if (seen_scope_ref == 1) ! 7314: error ("multiple `::' terms in declarator invalid"); ! 7315: seen_scope_ref += 1; ! 7316: { ! 7317: /* Perform error checking, and convert class names to types. ! 7318: We may call grokdeclarator multiple times for the same ! 7319: tree structure, so only do the conversion once. In this ! 7320: case, we have exactly what we want for `ctype'. */ ! 7321: tree cname = TREE_OPERAND (decl, 0); ! 7322: if (cname == NULL_TREE) ! 7323: ctype = NULL_TREE; ! 7324: /* Can't use IS_AGGR_TYPE because CNAME might not be a type. */ ! 7325: else if (IS_AGGR_TYPE_CODE (TREE_CODE (cname)) ! 7326: || TREE_CODE (cname) == UNINSTANTIATED_P_TYPE) ! 7327: ctype = cname; ! 7328: else if (! is_aggr_typedef (cname, 1)) ! 7329: { ! 7330: TREE_OPERAND (decl, 0) = NULL_TREE; ! 7331: } ! 7332: /* Must test TREE_OPERAND (decl, 1), in case user gives ! 7333: us `typedef (class::memfunc)(int); memfunc *memfuncptr;' */ ! 7334: else if (TREE_OPERAND (decl, 1) ! 7335: && TREE_CODE (TREE_OPERAND (decl, 1)) == INDIRECT_REF) ! 7336: { ! 7337: TREE_OPERAND (decl, 0) = IDENTIFIER_TYPE_VALUE (cname); ! 7338: } ! 7339: else if (ctype == NULL_TREE) ! 7340: { ! 7341: ctype = IDENTIFIER_TYPE_VALUE (cname); ! 7342: TREE_OPERAND (decl, 0) = ctype; ! 7343: } ! 7344: else if (TREE_COMPLEXITY (decl) == current_class_depth) ! 7345: TREE_OPERAND (decl, 0) = ctype; ! 7346: else ! 7347: { ! 7348: if (! UNIQUELY_DERIVED_FROM_P (IDENTIFIER_TYPE_VALUE (cname), ctype)) ! 7349: { ! 7350: error ("type `%s' is not derived from type `%s'", ! 7351: IDENTIFIER_POINTER (cname), ! 7352: TYPE_NAME_STRING (ctype)); ! 7353: TREE_OPERAND (decl, 0) = NULL_TREE; ! 7354: } ! 7355: else ! 7356: { ! 7357: ctype = IDENTIFIER_TYPE_VALUE (cname); ! 7358: TREE_OPERAND (decl, 0) = ctype; ! 7359: } ! 7360: } ! 7361: ! 7362: decl = TREE_OPERAND (decl, 1); ! 7363: if (ctype) ! 7364: { ! 7365: if (TREE_CODE (decl) == IDENTIFIER_NODE ! 7366: && constructor_name (ctype) == decl) ! 7367: { ! 7368: return_type = return_ctor; ! 7369: ctor_return_type = ctype; ! 7370: } ! 7371: else if (TREE_CODE (decl) == BIT_NOT_EXPR ! 7372: && TREE_CODE (TREE_OPERAND (decl, 0)) == IDENTIFIER_NODE ! 7373: && constructor_name (ctype) == TREE_OPERAND (decl, 0)) ! 7374: { ! 7375: return_type = return_dtor; ! 7376: ctor_return_type = ctype; ! 7377: flags = DTOR_FLAG; ! 7378: decl = TREE_OPERAND (decl, 0); ! 7379: } ! 7380: } ! 7381: } ! 7382: break; ! 7383: ! 7384: case ERROR_MARK: ! 7385: decl = NULL_TREE; ! 7386: break; ! 7387: ! 7388: default: ! 7389: return 0; /* We used to do a 155 abort here. */ ! 7390: } ! 7391: if (name == NULL) ! 7392: name = "type name"; ! 7393: } ! 7394: ! 7395: /* A function definition's declarator must have the form of ! 7396: a function declarator. */ ! 7397: ! 7398: if (funcdef_flag && innermost_code != CALL_EXPR) ! 7399: return 0; ! 7400: ! 7401: /* Anything declared one level down from the top level ! 7402: must be one of the parameters of a function ! 7403: (because the body is at least two levels down). */ ! 7404: ! 7405: /* This heuristic cannot be applied to C++ nodes! Fixed, however, ! 7406: by not allowing C++ class definitions to specify their parameters ! 7407: with xdecls (must be spec.d in the parmlist). ! 7408: ! 7409: Since we now wait to push a class scope until we are sure that ! 7410: we are in a legitimate method context, we must set oldcname ! 7411: explicitly (since current_class_name is not yet alive). */ ! 7412: ! 7413: if (decl_context == NORMAL ! 7414: && current_binding_level->level_chain == global_binding_level) ! 7415: decl_context = PARM; ! 7416: ! 7417: /* Look through the decl specs and record which ones appear. ! 7418: Some typespecs are defined as built-in typenames. ! 7419: Others, the ones that are modifiers of other types, ! 7420: are represented by bits in SPECBITS: set the bits for ! 7421: the modifiers that appear. Storage class keywords are also in SPECBITS. ! 7422: ! 7423: If there is a typedef name or a type, store the type in TYPE. ! 7424: This includes builtin typedefs such as `int'. ! 7425: ! 7426: Set EXPLICIT_INT if the type is `int' or `char' and did not ! 7427: come from a user typedef. ! 7428: ! 7429: Set LONGLONG if `long' is mentioned twice. ! 7430: ! 7431: For C++, constructors and destructors have their own fast treatment. */ ! 7432: ! 7433: for (spec = declspecs; spec; spec = TREE_CHAIN (spec)) ! 7434: { ! 7435: register int i; ! 7436: register tree id = TREE_VALUE (spec); ! 7437: ! 7438: /* Certain parse errors slip through. For example, ! 7439: `int class;' is not caught by the parser. Try ! 7440: weakly to recover here. */ ! 7441: if (TREE_CODE (spec) != TREE_LIST) ! 7442: return 0; ! 7443: ! 7444: if (TREE_CODE (id) == IDENTIFIER_NODE) ! 7445: { ! 7446: if (id == ridpointers[(int) RID_INT]) ! 7447: { ! 7448: if (type) ! 7449: error ("extraneous `int' ignored"); ! 7450: else ! 7451: { ! 7452: explicit_int = 1; ! 7453: type = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (id)); ! 7454: } ! 7455: goto found; ! 7456: } ! 7457: if (id == ridpointers[(int) RID_CHAR]) ! 7458: { ! 7459: if (type) ! 7460: error ("extraneous `char' ignored"); ! 7461: else ! 7462: { ! 7463: explicit_char = 1; ! 7464: type = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (id)); ! 7465: } ! 7466: goto found; ! 7467: } ! 7468: if (id == ridpointers[(int) RID_WCHAR]) ! 7469: { ! 7470: if (type) ! 7471: error ("extraneous `__wchar_t' ignored"); ! 7472: else ! 7473: { ! 7474: type = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (id)); ! 7475: } ! 7476: goto found; ! 7477: } ! 7478: /* C++ aggregate types. */ ! 7479: if (IDENTIFIER_HAS_TYPE_VALUE (id)) ! 7480: { ! 7481: if (type) ! 7482: error ("multiple declarations `%s' and `%s'", ! 7483: IDENTIFIER_POINTER (type), ! 7484: IDENTIFIER_POINTER (id)); ! 7485: else ! 7486: type = IDENTIFIER_TYPE_VALUE (id); ! 7487: goto found; ! 7488: } ! 7489: ! 7490: for (i = (int) RID_FIRST_MODIFIER; i < (int) RID_MAX; i++) ! 7491: { ! 7492: if (ridpointers[i] == id) ! 7493: { ! 7494: if (i == (int) RID_LONG && RIDBIT_SETP (i, specbits)) ! 7495: { ! 7496: #if 0 ! 7497: if (pedantic) ! 7498: pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id)); ! 7499: else ! 7500: #endif ! 7501: if (longlong) ! 7502: error ("`long long long' is too long for GCC"); ! 7503: else ! 7504: longlong = 1; ! 7505: } ! 7506: else if (RIDBIT_SETP (i, specbits)) ! 7507: warning ("duplicate `%s'", IDENTIFIER_POINTER (id)); ! 7508: RIDBIT_SET (i, specbits); ! 7509: goto found; ! 7510: } ! 7511: } ! 7512: } ! 7513: if (type) ! 7514: error ("two or more data types in declaration of `%s'", name); ! 7515: else if (TREE_CODE (id) == IDENTIFIER_NODE) ! 7516: { ! 7517: register tree t = lookup_name (id, 1); ! 7518: if (!t || TREE_CODE (t) != TYPE_DECL) ! 7519: error ("`%s' fails to be a typedef or built in type", ! 7520: IDENTIFIER_POINTER (id)); ! 7521: else ! 7522: { ! 7523: type = TREE_TYPE (t); ! 7524: typedef_decl = t; ! 7525: } ! 7526: } ! 7527: else if (TREE_CODE (id) != ERROR_MARK) ! 7528: /* Can't change CLASS nodes into RECORD nodes here! */ ! 7529: type = id; ! 7530: ! 7531: found: {} ! 7532: } ! 7533: ! 7534: typedef_type = type; ! 7535: ! 7536: /* No type at all: default to `int', and set EXPLICIT_INT ! 7537: because it was not a user-defined typedef. */ ! 7538: ! 7539: if (type == NULL_TREE) ! 7540: { ! 7541: explicit_int = -1; ! 7542: if (return_type == return_dtor) ! 7543: type = void_type_node; ! 7544: else if (return_type == return_ctor) ! 7545: type = TYPE_POINTER_TO (ctor_return_type); ! 7546: else ! 7547: { ! 7548: if (funcdef_flag && explicit_warn_return_type ! 7549: && return_type == return_normal ! 7550: && ! (RIDBIT_SETP (RID_SIGNED, specbits) ! 7551: || RIDBIT_SETP (RID_UNSIGNED, specbits) ! 7552: || RIDBIT_SETP (RID_LONG, specbits) ! 7553: || RIDBIT_SETP (RID_SHORT, specbits))) ! 7554: warn_about_return_type = 1; ! 7555: /* Save warning until we know what is really going on. */ ! 7556: type = integer_type_node; ! 7557: } ! 7558: } ! 7559: else if (return_type == return_dtor) ! 7560: { ! 7561: error ("return type specification for destructor invalid"); ! 7562: type = void_type_node; ! 7563: } ! 7564: else if (return_type == return_ctor) ! 7565: { ! 7566: error ("return type specification for constructor invalid"); ! 7567: type = TYPE_POINTER_TO (ctor_return_type); ! 7568: } ! 7569: else if (RIDBIT_SETP (RID_FRIEND, specbits) ! 7570: && IS_AGGR_TYPE (type) ! 7571: && ! TYPE_BEING_DEFINED (type) ! 7572: && TYPE_SIZE (type) == NULL_TREE ! 7573: && ! ANON_AGGRNAME_P (TYPE_IDENTIFIER (type)) ! 7574: && current_function_decl == NULL_TREE ! 7575: && decl_context != PARM) ! 7576: { ! 7577: /* xref_tag will make friend class declarations look like ! 7578: nested class declarations. Retroactively change that ! 7579: if the type has not yet been defined. ! 7580: ! 7581: ??? ANSI C++ doesn't say what to do in this case yet. */ ! 7582: globalize_nested_type (type); ! 7583: } ! 7584: ! 7585: ctype = NULL_TREE; ! 7586: ! 7587: /* Now process the modifiers that were specified ! 7588: and check for invalid combinations. */ ! 7589: ! 7590: /* Long double is a special combination. */ ! 7591: ! 7592: if (RIDBIT_SETP (RID_LONG, specbits) ! 7593: && TYPE_MAIN_VARIANT (type) == double_type_node) ! 7594: { ! 7595: RIDBIT_RESET (RID_LONG, specbits); ! 7596: type = build_type_variant (long_double_type_node, TYPE_READONLY (type), ! 7597: TYPE_VOLATILE (type)); ! 7598: } ! 7599: ! 7600: /* Check all other uses of type modifiers. */ ! 7601: ! 7602: if (RIDBIT_SETP (RID_UNSIGNED, specbits) ! 7603: || RIDBIT_SETP (RID_SIGNED, specbits) ! 7604: || RIDBIT_SETP (RID_LONG, specbits) ! 7605: || RIDBIT_SETP (RID_SHORT, specbits)) ! 7606: { ! 7607: int ok = 0; ! 7608: ! 7609: if (TREE_CODE (type) == REAL_TYPE) ! 7610: error ("short, signed or unsigned invalid for `%s'", name); ! 7611: else if (TREE_CODE (type) != INTEGER_TYPE || type == wchar_type_node) ! 7612: error ("long, short, signed or unsigned invalid for `%s'", name); ! 7613: else if (RIDBIT_SETP (RID_LONG, specbits) ! 7614: && RIDBIT_SETP (RID_SHORT, specbits)) ! 7615: error ("long and short specified together for `%s'", name); ! 7616: else if ((RIDBIT_SETP (RID_LONG, specbits) ! 7617: || RIDBIT_SETP (RID_SHORT, specbits)) ! 7618: && explicit_char) ! 7619: error ("long or short specified with char for `%s'", name); ! 7620: else if ((RIDBIT_SETP (RID_LONG, specbits) ! 7621: || RIDBIT_SETP (RID_SHORT, specbits)) ! 7622: && TREE_CODE (type) == REAL_TYPE) ! 7623: error ("long or short specified with floating type for `%s'", name); ! 7624: else if (RIDBIT_SETP (RID_SIGNED, specbits) ! 7625: && RIDBIT_SETP (RID_UNSIGNED, specbits)) ! 7626: error ("signed and unsigned given together for `%s'", name); ! 7627: else ! 7628: { ! 7629: ok = 1; ! 7630: if (!explicit_int && !explicit_char && pedantic) ! 7631: { ! 7632: pedwarn ("long, short, signed or unsigned used invalidly for `%s'", ! 7633: name); ! 7634: if (flag_pedantic_errors) ! 7635: ok = 0; ! 7636: } ! 7637: } ! 7638: ! 7639: /* Discard the type modifiers if they are invalid. */ ! 7640: if (! ok) ! 7641: { ! 7642: RIDBIT_RESET (RID_UNSIGNED, specbits); ! 7643: RIDBIT_RESET (RID_SIGNED, specbits); ! 7644: RIDBIT_RESET (RID_LONG, specbits); ! 7645: RIDBIT_RESET (RID_SHORT, specbits); ! 7646: longlong = 0; ! 7647: } ! 7648: } ! 7649: ! 7650: /* Decide whether an integer type is signed or not. ! 7651: Optionally treat bitfields as signed by default. */ ! 7652: if (RIDBIT_SETP (RID_UNSIGNED, specbits) ! 7653: /* Traditionally, all bitfields are unsigned. */ ! 7654: || (bitfield && flag_traditional) ! 7655: || (bitfield && ! flag_signed_bitfields ! 7656: && (explicit_int || explicit_char ! 7657: /* A typedef for plain `int' without `signed' ! 7658: can be controlled just like plain `int'. */ ! 7659: || ! (typedef_decl != NULL_TREE ! 7660: && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl))) ! 7661: && TREE_CODE (type) != ENUMERAL_TYPE ! 7662: && RIDBIT_NOTSETP (RID_SIGNED, specbits))) ! 7663: { ! 7664: if (longlong) ! 7665: type = long_long_unsigned_type_node; ! 7666: else if (RIDBIT_SETP (RID_LONG, specbits)) ! 7667: type = long_unsigned_type_node; ! 7668: else if (RIDBIT_SETP (RID_SHORT, specbits)) ! 7669: type = short_unsigned_type_node; ! 7670: else if (type == char_type_node) ! 7671: type = unsigned_char_type_node; ! 7672: else if (typedef_decl) ! 7673: type = unsigned_type (type); ! 7674: else ! 7675: type = unsigned_type_node; ! 7676: } ! 7677: else if (RIDBIT_SETP (RID_SIGNED, specbits) ! 7678: && type == char_type_node) ! 7679: type = signed_char_type_node; ! 7680: else if (longlong) ! 7681: type = long_long_integer_type_node; ! 7682: else if (RIDBIT_SETP (RID_LONG, specbits)) ! 7683: type = long_integer_type_node; ! 7684: else if (RIDBIT_SETP (RID_SHORT, specbits)) ! 7685: type = short_integer_type_node; ! 7686: ! 7687: /* Set CONSTP if this declaration is `const', whether by ! 7688: explicit specification or via a typedef. ! 7689: Likewise for VOLATILEP. */ ! 7690: ! 7691: constp = !! RIDBIT_SETP (RID_CONST, specbits) + TYPE_READONLY (type); ! 7692: volatilep = !! RIDBIT_SETP (RID_VOLATILE, specbits) + TYPE_VOLATILE (type); ! 7693: staticp = 0; ! 7694: inlinep = !! RIDBIT_SETP (RID_INLINE, specbits); ! 7695: if (constp > 1) ! 7696: warning ("duplicate `const'"); ! 7697: if (volatilep > 1) ! 7698: warning ("duplicate `volatile'"); ! 7699: virtualp = RIDBIT_SETP (RID_VIRTUAL, specbits); ! 7700: if (RIDBIT_SETP (RID_STATIC, specbits)) ! 7701: staticp = 1 + (decl_context == FIELD); ! 7702: ! 7703: if (virtualp && staticp == 2) ! 7704: { ! 7705: error ("member `%s' cannot be declared both virtual and static", name); ! 7706: staticp = 0; ! 7707: } ! 7708: friendp = RIDBIT_SETP (RID_FRIEND, specbits); ! 7709: RIDBIT_RESET (RID_VIRTUAL, specbits); ! 7710: RIDBIT_RESET (RID_FRIEND, specbits); ! 7711: ! 7712: if (RIDBIT_SETP (RID_MUTABLE, specbits)) ! 7713: { ! 7714: if (decl_context == PARM) ! 7715: { ! 7716: error ("non-member `%s' cannot be declared mutable", name); ! 7717: RIDBIT_RESET (RID_MUTABLE, specbits); ! 7718: } ! 7719: else if (friendp || decl_context == TYPENAME) ! 7720: { ! 7721: error ("non-object member `%s' cannot be declared mutable", name); ! 7722: RIDBIT_RESET (RID_MUTABLE, specbits); ! 7723: } ! 7724: else if (staticp) ! 7725: { ! 7726: error ("static `%s' cannot be declared mutable", name); ! 7727: RIDBIT_RESET (RID_MUTABLE, specbits); ! 7728: } ! 7729: #if 0 ! 7730: if (RIDBIT_SETP (RID_TYPEDEF, specbits)) ! 7731: { ! 7732: error ("non-object member `%s' cannot be declared mutable", name); ! 7733: RIDBIT_RESET (RID_MUTABLE, specbits); ! 7734: } ! 7735: /* Because local typedefs are parsed twice, we don't want this ! 7736: message here. */ ! 7737: else if (decl_context != FIELD) ! 7738: { ! 7739: error ("non-member `%s' cannot be declared mutable", name); ! 7740: RIDBIT_RESET (RID_MUTABLE, specbits); ! 7741: } ! 7742: #endif ! 7743: } ! 7744: ! 7745: /* Warn if two storage classes are given. Default to `auto'. */ ! 7746: ! 7747: if (RIDBIT_ANY_SET (specbits)) ! 7748: { ! 7749: if (RIDBIT_SETP (RID_STATIC, specbits)) nclasses++; ! 7750: if (RIDBIT_SETP (RID_EXTERN, specbits)) nclasses++; ! 7751: if (decl_context == PARM && nclasses > 0) ! 7752: error ("storage class specifiers invalid in parameter declarations"); ! 7753: if (RIDBIT_SETP (RID_TYPEDEF, specbits)) ! 7754: { ! 7755: if (decl_context == PARM) ! 7756: error ("typedef declaration invalid in parameter declaration"); ! 7757: nclasses++; ! 7758: } ! 7759: if (RIDBIT_SETP (RID_AUTO, specbits)) nclasses++; ! 7760: if (RIDBIT_SETP (RID_REGISTER, specbits)) nclasses++; ! 7761: } ! 7762: ! 7763: /* Give error if `virtual' is used outside of class declaration. */ ! 7764: if (virtualp && current_class_name == NULL_TREE) ! 7765: { ! 7766: error ("virtual outside class declaration"); ! 7767: virtualp = 0; ! 7768: } ! 7769: if (current_class_name == NULL_TREE && RIDBIT_SETP (RID_MUTABLE, specbits)) ! 7770: { ! 7771: error ("only members can be declared mutable"); ! 7772: RIDBIT_RESET (RID_MUTABLE, specbits); ! 7773: } ! 7774: ! 7775: /* Static anonymous unions are dealt with here. */ ! 7776: if (staticp && decl_context == TYPENAME ! 7777: && TREE_CODE (declspecs) == TREE_LIST ! 7778: && TREE_CODE (TREE_VALUE (declspecs)) == UNION_TYPE ! 7779: && ANON_AGGRNAME_P (TYPE_IDENTIFIER (TREE_VALUE (declspecs)))) ! 7780: decl_context = FIELD; ! 7781: ! 7782: /* Warn about storage classes that are invalid for certain ! 7783: kinds of declarations (parameters, typenames, etc.). */ ! 7784: ! 7785: if (nclasses > 1) ! 7786: error ("multiple storage classes in declaration of `%s'", name); ! 7787: else if (decl_context != NORMAL && nclasses > 0) ! 7788: { ! 7789: if (decl_context == PARM ! 7790: && (RIDBIT_SETP (RID_REGISTER, specbits) ! 7791: || RIDBIT_SETP (RID_AUTO, specbits))) ! 7792: ; ! 7793: else if (decl_context == FIELD ! 7794: && RIDBIT_SETP (RID_TYPEDEF, specbits)) ! 7795: { ! 7796: /* Processing a typedef declaration nested within a class type ! 7797: definition. */ ! 7798: register tree scanner; ! 7799: register tree previous_declspec; ! 7800: tree loc_typedecl; ! 7801: ! 7802: if (initialized) ! 7803: error ("typedef declaration includes an initializer"); ! 7804: ! 7805: /* To process a class-local typedef declaration, we descend down ! 7806: the chain of declspecs looking for the `typedef' spec. When we ! 7807: find it, we splice it out of the chain of declspecs, and then ! 7808: recursively call `grokdeclarator' with the original declarator ! 7809: and with the newly adjusted declspecs. This call should return ! 7810: a FIELD_DECL node with the TREE_TYPE (and other parts) set ! 7811: appropriately. We can then just change the TREE_CODE on that ! 7812: from FIELD_DECL to TYPE_DECL and we're done. */ ! 7813: ! 7814: for (previous_declspec = NULL_TREE, scanner = declspecs; ! 7815: scanner; ! 7816: previous_declspec = scanner, scanner = TREE_CHAIN (scanner)) ! 7817: { ! 7818: if (TREE_VALUE (scanner) == ridpointers[(int) RID_TYPEDEF]) ! 7819: break; ! 7820: } ! 7821: if (previous_declspec) ! 7822: TREE_CHAIN (previous_declspec) = TREE_CHAIN (scanner); ! 7823: else ! 7824: declspecs = TREE_CHAIN (scanner); ! 7825: ! 7826: loc_typedecl = ! 7827: grokdeclarator (declarator, declspecs, FIELD, 0, NULL_TREE); ! 7828: ! 7829: if (loc_typedecl != error_mark_node) ! 7830: { ! 7831: register int i = sizeof (struct lang_decl_flags) / sizeof (int); ! 7832: register int *pi; ! 7833: ! 7834: TREE_SET_CODE (loc_typedecl, TYPE_DECL); ! 7835: ! 7836: pi = (int *) permalloc (sizeof (struct lang_decl_flags)); ! 7837: while (i > 0) ! 7838: pi[--i] = 0; ! 7839: DECL_LANG_SPECIFIC (loc_typedecl) = (struct lang_decl *) pi; ! 7840: } ! 7841: ! 7842: return loc_typedecl; ! 7843: } ! 7844: else if (decl_context == FIELD ! 7845: /* C++ allows static class elements */ ! 7846: && RIDBIT_SETP (RID_STATIC, specbits)) ! 7847: /* C++ also allows inlines and signed and unsigned elements, ! 7848: but in those cases we don't come in here. */ ! 7849: ; ! 7850: else ! 7851: { ! 7852: if (decl_context == FIELD) ! 7853: { ! 7854: tree tmp = TREE_OPERAND (declarator, 0); ! 7855: register int op = IDENTIFIER_OPNAME_P (tmp); ! 7856: error ("storage class specified for %s `%s'", ! 7857: op ? "member operator" : "structure field", ! 7858: op ? operator_name_string (tmp) : name); ! 7859: } ! 7860: else ! 7861: error ((decl_context == PARM ! 7862: ? "storage class specified for parameter `%s'" ! 7863: : "storage class specified for typename"), name); ! 7864: RIDBIT_RESET (RID_REGISTER, specbits); ! 7865: RIDBIT_RESET (RID_AUTO, specbits); ! 7866: RIDBIT_RESET (RID_EXTERN, specbits); ! 7867: } ! 7868: } ! 7869: else if (RIDBIT_SETP (RID_EXTERN, specbits) && initialized && !funcdef_flag) ! 7870: { ! 7871: if (current_binding_level == global_binding_level) ! 7872: { ! 7873: /* It's common practice (and completely legal) to have a const ! 7874: be initialized and declared extern. */ ! 7875: if (! constp) ! 7876: warning ("`%s' initialized and declared `extern'", name); ! 7877: } ! 7878: else ! 7879: error ("`%s' has both `extern' and initializer", name); ! 7880: } ! 7881: else if (RIDBIT_SETP (RID_EXTERN, specbits) && funcdef_flag ! 7882: && current_binding_level != global_binding_level) ! 7883: error ("nested function `%s' declared `extern'", name); ! 7884: else if (current_binding_level == global_binding_level) ! 7885: { ! 7886: if (RIDBIT_SETP (RID_AUTO, specbits)) ! 7887: error ("top-level declaration of `%s' specifies `auto'", name); ! 7888: #if 0 ! 7889: if (RIDBIT_SETP (RID_REGISTER, specbits)) ! 7890: error ("top-level declaration of `%s' specifies `register'", name); ! 7891: #endif ! 7892: #if 0 ! 7893: /* I'm not sure under what circumstances we should turn ! 7894: on the extern bit, and under what circumstances we should ! 7895: warn if other bits are turned on. */ ! 7896: if (decl_context == NORMAL ! 7897: && RIDBIT_NOSETP (RID_EXTERN, specbits) ! 7898: && ! root_lang_context_p ()) ! 7899: { ! 7900: RIDBIT_SET (RID_EXTERN, specbits); ! 7901: } ! 7902: #endif ! 7903: } ! 7904: ! 7905: /* Now figure out the structure of the declarator proper. ! 7906: Descend through it, creating more complex types, until we reach ! 7907: the declared identifier (or NULL_TREE, in an absolute declarator). */ ! 7908: ! 7909: while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE) ! 7910: { ! 7911: /* Each level of DECLARATOR is either an ARRAY_REF (for ...[..]), ! 7912: an INDIRECT_REF (for *...), ! 7913: a CALL_EXPR (for ...(...)), ! 7914: an identifier (for the name being declared) ! 7915: or a null pointer (for the place in an absolute declarator ! 7916: where the name was omitted). ! 7917: For the last two cases, we have just exited the loop. ! 7918: ! 7919: For C++ it could also be ! 7920: a SCOPE_REF (for class :: ...). In this case, we have converted ! 7921: sensible names to types, and those are the values we use to ! 7922: qualify the member name. ! 7923: an ADDR_EXPR (for &...), ! 7924: a BIT_NOT_EXPR (for destructors) ! 7925: a TYPE_EXPR (for operator typenames) ! 7926: ! 7927: At this point, TYPE is the type of elements of an array, ! 7928: or for a function to return, or for a pointer to point to. ! 7929: After this sequence of ifs, TYPE is the type of the ! 7930: array or function or pointer, and DECLARATOR has had its ! 7931: outermost layer removed. */ ! 7932: ! 7933: if (TREE_CODE (type) == ERROR_MARK) ! 7934: { ! 7935: if (TREE_CODE (declarator) == SCOPE_REF) ! 7936: declarator = TREE_OPERAND (declarator, 1); ! 7937: else ! 7938: declarator = TREE_OPERAND (declarator, 0); ! 7939: continue; ! 7940: } ! 7941: if (quals != NULL_TREE ! 7942: && (declarator == NULL_TREE ! 7943: || TREE_CODE (declarator) != SCOPE_REF)) ! 7944: { ! 7945: if (ctype == NULL_TREE && TREE_CODE (type) == METHOD_TYPE) ! 7946: ctype = TYPE_METHOD_BASETYPE (type); ! 7947: if (ctype != NULL_TREE) ! 7948: { ! 7949: #if 0 /* not yet, should get fixed properly later */ ! 7950: tree dummy = make_type_decl (NULL_TREE, type); ! 7951: #else ! 7952: tree dummy = build_decl (TYPE_DECL, NULL_TREE, type); ! 7953: #endif ! 7954: ctype = grok_method_quals (ctype, dummy, quals); ! 7955: type = TREE_TYPE (dummy); ! 7956: quals = NULL_TREE; ! 7957: } ! 7958: } ! 7959: switch (TREE_CODE (declarator)) ! 7960: { ! 7961: case ARRAY_REF: ! 7962: maybe_globalize_type (type); ! 7963: { ! 7964: register tree itype = NULL_TREE; ! 7965: register tree size = TREE_OPERAND (declarator, 1); ! 7966: ! 7967: declarator = TREE_OPERAND (declarator, 0); ! 7968: ! 7969: /* Check for some types that there cannot be arrays of. */ ! 7970: ! 7971: if (TYPE_MAIN_VARIANT (type) == void_type_node) ! 7972: { ! 7973: cp_error ("declaration of `%D' as array of voids", dname); ! 7974: type = error_mark_node; ! 7975: } ! 7976: ! 7977: if (TREE_CODE (type) == FUNCTION_TYPE) ! 7978: { ! 7979: cp_error ("declaration of `%D' as array of functions", dname); ! 7980: type = error_mark_node; ! 7981: } ! 7982: ! 7983: /* ARM $8.4.3: Since you can't have a pointer to a reference, ! 7984: you can't have arrays of references. If we allowed them, ! 7985: then we'd be saying x[i] is legal for an array x, but ! 7986: then you'd have to ask: what does `*(x + i)' mean? */ ! 7987: if (TREE_CODE (type) == REFERENCE_TYPE) ! 7988: { ! 7989: cp_error ("declaration of `%D' as array of references", dname); ! 7990: type = error_mark_node; ! 7991: } ! 7992: ! 7993: if (TREE_CODE (type) == OFFSET_TYPE) ! 7994: { ! 7995: cp_error ("declaration of `%D' as array of data members", ! 7996: dname); ! 7997: type = error_mark_node; ! 7998: } ! 7999: ! 8000: if (TREE_CODE (type) == METHOD_TYPE) ! 8001: { ! 8002: cp_error ("declaration of `%D' as array of function members", ! 8003: dname); ! 8004: type = error_mark_node; ! 8005: } ! 8006: ! 8007: if (size == error_mark_node) ! 8008: type = error_mark_node; ! 8009: ! 8010: if (type == error_mark_node) ! 8011: continue; ! 8012: ! 8013: if (size) ! 8014: { ! 8015: /* Must suspend_momentary here because the index ! 8016: type may need to live until the end of the function. ! 8017: For example, it is used in the declaration of a ! 8018: variable which requires destructing at the end of ! 8019: the function; then build_vec_delete will need this ! 8020: value. */ ! 8021: int yes = suspend_momentary (); ! 8022: /* might be a cast */ ! 8023: if (TREE_CODE (size) == NOP_EXPR ! 8024: && TREE_TYPE (size) == TREE_TYPE (TREE_OPERAND (size, 0))) ! 8025: size = TREE_OPERAND (size, 0); ! 8026: ! 8027: /* If this is a template parameter, it'll be constant, but ! 8028: we don't know what the value is yet. */ ! 8029: if (TREE_CODE (size) == TEMPLATE_CONST_PARM) ! 8030: goto dont_grok_size; ! 8031: ! 8032: if (TREE_CODE (TREE_TYPE (size)) != INTEGER_TYPE ! 8033: && TREE_CODE (TREE_TYPE (size)) != ENUMERAL_TYPE) ! 8034: { ! 8035: cp_error ("size of array `%D' has non-integer type", ! 8036: dname); ! 8037: size = integer_one_node; ! 8038: } ! 8039: if (TREE_READONLY_DECL_P (size)) ! 8040: size = decl_constant_value (size); ! 8041: if (pedantic && integer_zerop (size)) ! 8042: cp_pedwarn ("ANSI C++ forbids zero-size array `%D'", dname); ! 8043: if (TREE_CONSTANT (size)) ! 8044: { ! 8045: constant_expression_warning (size); ! 8046: if (INT_CST_LT (size, integer_zero_node)) ! 8047: { ! 8048: cp_error ("size of array `%D' is negative", dname); ! 8049: size = integer_one_node; ! 8050: } ! 8051: itype = build_index_type (size_binop (MINUS_EXPR, size, ! 8052: integer_one_node)); ! 8053: } ! 8054: else ! 8055: { ! 8056: if (pedantic) ! 8057: cp_pedwarn ("ANSI C++ forbids variable-size array `%D'", dname); ! 8058: dont_grok_size: ! 8059: itype = ! 8060: build_binary_op (MINUS_EXPR, size, integer_one_node, 1); ! 8061: /* Make sure the array size remains visibly nonconstant ! 8062: even if it is (eg) a const variable with known value. */ ! 8063: size_varies = 1; ! 8064: itype = variable_size (itype); ! 8065: itype = build_index_type (itype); ! 8066: } ! 8067: resume_momentary (yes); ! 8068: } ! 8069: ! 8070: /* Build the array type itself, then merge any constancy or ! 8071: volatility into the target type. We must do it in this order ! 8072: to ensure that the TYPE_MAIN_VARIANT field of the array type ! 8073: is set correctly. */ ! 8074: ! 8075: type = build_cplus_array_type (type, itype); ! 8076: if (constp || volatilep) ! 8077: type = build_type_variant (type, constp, volatilep); ! 8078: ! 8079: ctype = NULL_TREE; ! 8080: } ! 8081: break; ! 8082: ! 8083: case CALL_EXPR: ! 8084: maybe_globalize_type (type); ! 8085: { ! 8086: tree arg_types; ! 8087: ! 8088: /* Declaring a function type. ! 8089: Make sure we have a valid type for the function to return. */ ! 8090: #if 0 ! 8091: /* Is this an error? Should they be merged into TYPE here? */ ! 8092: if (pedantic && (constp || volatilep)) ! 8093: pedwarn ("function declared to return const or volatile result"); ! 8094: #else ! 8095: /* Merge any constancy or volatility into the target type ! 8096: for the pointer. */ ! 8097: ! 8098: if (constp || volatilep) ! 8099: { ! 8100: type = build_type_variant (type, constp, volatilep); ! 8101: if (IS_AGGR_TYPE (type)) ! 8102: build_pointer_type (type); ! 8103: constp = 0; ! 8104: volatilep = 0; ! 8105: } ! 8106: #endif ! 8107: ! 8108: /* Warn about some types functions can't return. */ ! 8109: ! 8110: if (TREE_CODE (type) == FUNCTION_TYPE) ! 8111: { ! 8112: error ("`%s' declared as function returning a function", name); ! 8113: type = integer_type_node; ! 8114: } ! 8115: if (TREE_CODE (type) == ARRAY_TYPE) ! 8116: { ! 8117: error ("`%s' declared as function returning an array", name); ! 8118: type = integer_type_node; ! 8119: } ! 8120: ! 8121: if (ctype == NULL_TREE ! 8122: && decl_context == FIELD ! 8123: && (friendp == 0 || dname == current_class_name)) ! 8124: ctype = current_class_type; ! 8125: ! 8126: if (ctype && flags == TYPENAME_FLAG) ! 8127: TYPE_HAS_CONVERSION (ctype) = 1; ! 8128: if (ctype && constructor_name (ctype) == dname) ! 8129: { ! 8130: /* We are within a class's scope. If our declarator name ! 8131: is the same as the class name, and we are defining ! 8132: a function, then it is a constructor/destructor, and ! 8133: therefore returns a void type. */ ! 8134: ! 8135: if (flags == DTOR_FLAG) ! 8136: { ! 8137: /* ANSI C++ June 5 1992 WP 12.4.1. A destructor may ! 8138: not be declared const or volatile. A destructor ! 8139: may not be static. */ ! 8140: if (staticp == 2) ! 8141: error ("destructor cannot be static member function"); ! 8142: if (TYPE_READONLY (type)) ! 8143: { ! 8144: error ("destructors cannot be declared `const'"); ! 8145: return void_type_node; ! 8146: } ! 8147: if (TYPE_VOLATILE (type)) ! 8148: { ! 8149: error ("destructors cannot be declared `volatile'"); ! 8150: return void_type_node; ! 8151: } ! 8152: if (decl_context == FIELD) ! 8153: { ! 8154: if (! member_function_or_else (ctype, current_class_type, ! 8155: "destructor for alien class `%s' cannot be a member")) ! 8156: return void_type_node; ! 8157: } ! 8158: } ! 8159: else /* it's a constructor. */ ! 8160: { ! 8161: /* ANSI C++ June 5 1992 WP 12.1.2. A constructor may ! 8162: not be declared const or volatile. A constructor may ! 8163: not be virtual. A constructor may not be static. */ ! 8164: if (staticp == 2) ! 8165: error ("constructor cannot be static member function"); ! 8166: if (virtualp) ! 8167: { ! 8168: pedwarn ("constructors cannot be declared virtual"); ! 8169: virtualp = 0; ! 8170: } ! 8171: if (TYPE_READONLY (type)) ! 8172: { ! 8173: error ("constructors cannot be declared `const'"); ! 8174: return void_type_node; ! 8175: } ! 8176: if (TYPE_VOLATILE (type)) ! 8177: { ! 8178: error ("constructors cannot be declared `volatile'"); ! 8179: return void_type_node; ! 8180: } ! 8181: { ! 8182: int inlinep, staticp; ! 8183: inlinep = RIDBIT_SETP (RID_INLINE, specbits); ! 8184: staticp = RIDBIT_SETP (RID_STATIC, specbits); ! 8185: RIDBIT_RESET (RID_INLINE, specbits); ! 8186: RIDBIT_RESET (RID_STATIC, specbits); ! 8187: if (RIDBIT_ANY_SET (specbits)) ! 8188: error ("return value type specifier for constructor ignored"); ! 8189: if (inlinep) ! 8190: RIDBIT_SET (RID_INLINE, specbits); ! 8191: if (staticp) ! 8192: RIDBIT_SET (RID_STATIC, specbits); ! 8193: } ! 8194: type = TYPE_POINTER_TO (ctype); ! 8195: if (decl_context == FIELD) ! 8196: { ! 8197: if (! member_function_or_else (ctype, current_class_type, ! 8198: "constructor for alien class `%s' cannot be member")) ! 8199: return void_type_node; ! 8200: TYPE_HAS_CONSTRUCTOR (ctype) = 1; ! 8201: if (return_type != return_ctor) ! 8202: return NULL_TREE; ! 8203: } ! 8204: } ! 8205: if (decl_context == FIELD) ! 8206: staticp = 0; ! 8207: } ! 8208: else if (friendp && virtualp) ! 8209: { ! 8210: /* Cannot be both friend and virtual. */ ! 8211: error ("virtual functions cannot be friends"); ! 8212: RIDBIT_RESET (RID_FRIEND, specbits); ! 8213: } ! 8214: ! 8215: if (decl_context == NORMAL && friendp) ! 8216: error ("friend declaration not in class definition"); ! 8217: ! 8218: /* Pick up type qualifiers which should be applied to `this'. */ ! 8219: quals = TREE_OPERAND (declarator, 2); ! 8220: ! 8221: /* Traditionally, declaring return type float means double. */ ! 8222: ! 8223: if (flag_traditional ! 8224: && TYPE_MAIN_VARIANT (type) == float_type_node) ! 8225: { ! 8226: type = build_type_variant (double_type_node, ! 8227: TYPE_READONLY (type), ! 8228: TYPE_VOLATILE (type)); ! 8229: } ! 8230: ! 8231: /* Construct the function type and go to the next ! 8232: inner layer of declarator. */ ! 8233: ! 8234: { ! 8235: int funcdef_p; ! 8236: tree inner_parms = TREE_OPERAND (declarator, 1); ! 8237: tree inner_decl = TREE_OPERAND (declarator, 0); ! 8238: ! 8239: declarator = TREE_OPERAND (declarator, 0); ! 8240: ! 8241: if (inner_decl && TREE_CODE (inner_decl) == SCOPE_REF) ! 8242: inner_decl = TREE_OPERAND (inner_decl, 1); ! 8243: ! 8244: /* Say it's a definition only for the CALL_EXPR ! 8245: closest to the identifier. */ ! 8246: funcdef_p = ! 8247: (inner_decl && ! 8248: (TREE_CODE (inner_decl) == IDENTIFIER_NODE ! 8249: || TREE_CODE (inner_decl) == TYPE_EXPR)) ? funcdef_flag : 0; ! 8250: ! 8251: /* FIXME: This is where default args should be fully processed. */ ! 8252: ! 8253: arg_types = grokparms (inner_parms, funcdef_p); ! 8254: } ! 8255: ! 8256: if (declarator) ! 8257: { ! 8258: /* Get past destructors, etc. ! 8259: We know we have one because FLAGS will be non-zero. ! 8260: ! 8261: Complain about improper parameter lists here. */ ! 8262: if (TREE_CODE (declarator) == BIT_NOT_EXPR) ! 8263: { ! 8264: declarator = TREE_OPERAND (declarator, 0); ! 8265: ! 8266: if (strict_prototype == 0 && arg_types == NULL_TREE) ! 8267: arg_types = void_list_node; ! 8268: else if (arg_types == NULL_TREE ! 8269: || arg_types != void_list_node) ! 8270: { ! 8271: error ("destructors cannot be specified with parameters"); ! 8272: arg_types = void_list_node; ! 8273: } ! 8274: } ! 8275: } ! 8276: /* the top level const or volatile is attached semantically only ! 8277: to the function not the actual type. */ ! 8278: if (TYPE_READONLY (type) || TYPE_VOLATILE (type)) ! 8279: { ! 8280: int constp = TYPE_READONLY (type); ! 8281: int volatilep = TYPE_VOLATILE (type); ! 8282: type = build_function_type (TYPE_MAIN_VARIANT (type), ! 8283: flag_traditional ! 8284: ? 0 ! 8285: : arg_types); ! 8286: type = build_type_variant (type, constp, volatilep); ! 8287: } ! 8288: else ! 8289: type = build_function_type (type, ! 8290: flag_traditional ! 8291: ? 0 ! 8292: : arg_types); ! 8293: } ! 8294: break; ! 8295: ! 8296: case ADDR_EXPR: ! 8297: case INDIRECT_REF: ! 8298: maybe_globalize_type (type); ! 8299: ! 8300: /* Filter out pointers-to-references and references-to-references. ! 8301: We can get these if a TYPE_DECL is used. */ ! 8302: ! 8303: if (TREE_CODE (type) == REFERENCE_TYPE) ! 8304: { ! 8305: error ("cannot declare %s to references", ! 8306: TREE_CODE (declarator) == ADDR_EXPR ! 8307: ? "references" : "pointers"); ! 8308: declarator = TREE_OPERAND (declarator, 0); ! 8309: continue; ! 8310: } ! 8311: ! 8312: /* Merge any constancy or volatility into the target type ! 8313: for the pointer. */ ! 8314: ! 8315: if (constp || volatilep) ! 8316: { ! 8317: type = build_type_variant (type, constp, volatilep); ! 8318: if (IS_AGGR_TYPE (type)) ! 8319: build_pointer_type (type); ! 8320: constp = 0; ! 8321: volatilep = 0; ! 8322: } ! 8323: ! 8324: if (TREE_CODE (declarator) == ADDR_EXPR) ! 8325: { ! 8326: if (TREE_CODE (type) == FUNCTION_TYPE) ! 8327: { ! 8328: error ("cannot declare references to functions; use pointer to function instead"); ! 8329: type = build_pointer_type (type); ! 8330: } ! 8331: else ! 8332: { ! 8333: if (TYPE_MAIN_VARIANT (type) == void_type_node) ! 8334: error ("invalid type: `void &'"); ! 8335: else ! 8336: type = build_reference_type (type); ! 8337: } ! 8338: } ! 8339: else if (TREE_CODE (type) == METHOD_TYPE) ! 8340: { ! 8341: type = build_ptrmemfunc_type (build_pointer_type (type)); ! 8342: } ! 8343: else ! 8344: type = build_pointer_type (type); ! 8345: ! 8346: /* Process a list of type modifier keywords (such as ! 8347: const or volatile) that were given inside the `*' or `&'. */ ! 8348: ! 8349: if (TREE_TYPE (declarator)) ! 8350: { ! 8351: register tree typemodlist; ! 8352: int erred = 0; ! 8353: for (typemodlist = TREE_TYPE (declarator); typemodlist; ! 8354: typemodlist = TREE_CHAIN (typemodlist)) ! 8355: { ! 8356: if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_CONST]) ! 8357: constp++; ! 8358: else if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_VOLATILE]) ! 8359: volatilep++; ! 8360: else if (!erred) ! 8361: { ! 8362: erred = 1; ! 8363: error ("invalid type modifier within %s declarator", ! 8364: TREE_CODE (declarator) == ADDR_EXPR ! 8365: ? "reference" : "pointer"); ! 8366: } ! 8367: } ! 8368: if (constp > 1) ! 8369: warning ("duplicate `const'"); ! 8370: if (volatilep > 1) ! 8371: warning ("duplicate `volatile'"); ! 8372: } ! 8373: declarator = TREE_OPERAND (declarator, 0); ! 8374: ctype = NULL_TREE; ! 8375: break; ! 8376: ! 8377: case SCOPE_REF: ! 8378: { ! 8379: /* We have converted type names to NULL_TREE if the ! 8380: name was bogus, or to a _TYPE node, if not. ! 8381: ! 8382: The variable CTYPE holds the type we will ultimately ! 8383: resolve to. The code here just needs to build ! 8384: up appropriate member types. */ ! 8385: tree sname = TREE_OPERAND (declarator, 1); ! 8386: /* Destructors can have their visibilities changed as well. */ ! 8387: if (TREE_CODE (sname) == BIT_NOT_EXPR) ! 8388: sname = TREE_OPERAND (sname, 0); ! 8389: ! 8390: if (TREE_COMPLEXITY (declarator) == 0) ! 8391: /* This needs to be here, in case we are called ! 8392: multiple times. */ ; ! 8393: else if (friendp && (TREE_COMPLEXITY (declarator) < 2)) ! 8394: /* don't fall out into global scope. Hides real bug? --eichin */ ; ! 8395: else if (TREE_COMPLEXITY (declarator) == current_class_depth) ! 8396: { ! 8397: /* I'm not really sure what pushclass calls this popclass ! 8398: corresponds to. One is in build_push_scope and that has ! 8399: been changed to a push_nested_class call, that's why I ! 8400: try to use pop_nested_class here instead. ! 8401: [email protected] */ ! 8402: #if NEW_CLASS_SCOPING ! 8403: pop_nested_class (1); ! 8404: TREE_COMPLEXITY (declarator) = current_class_depth; ! 8405: #else ! 8406: TREE_COMPLEXITY (declarator) -= 1; ! 8407: /* This popclass conflicts with the poplevel over in ! 8408: grokdeclarator. See ``This poplevel conflicts'' */ ! 8409: popclass (1); ! 8410: #endif ! 8411: } ! 8412: else ! 8413: my_friendly_abort (16); ! 8414: ! 8415: if (TREE_OPERAND (declarator, 0) == NULL_TREE) ! 8416: { ! 8417: /* We had a reference to a global decl, or ! 8418: perhaps we were given a non-aggregate typedef, ! 8419: in which case we cleared this out, and should just ! 8420: keep going as though it wasn't there. */ ! 8421: declarator = sname; ! 8422: continue; ! 8423: } ! 8424: ctype = TREE_OPERAND (declarator, 0); ! 8425: ! 8426: if (sname == NULL_TREE) ! 8427: goto done_scoping; ! 8428: ! 8429: if (TREE_CODE (sname) == IDENTIFIER_NODE) ! 8430: { ! 8431: /* This is the `standard' use of the scoping operator: ! 8432: basetype :: member . */ ! 8433: ! 8434: if (TREE_CODE (type) == FUNCTION_TYPE) ! 8435: { ! 8436: if (current_class_type == NULL_TREE ! 8437: || TYPE_MAIN_VARIANT (ctype) == current_class_type ! 8438: || friendp) ! 8439: type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep), ! 8440: TREE_TYPE (type), TYPE_ARG_TYPES (type)); ! 8441: else ! 8442: { ! 8443: error ("cannot declare member function `%s::%s' within this class", ! 8444: TYPE_NAME_STRING (ctype), name); ! 8445: return void_type_node; ! 8446: } ! 8447: } ! 8448: else if (TYPE_MAIN_VARIANT (ctype) == current_class_type) ! 8449: { ! 8450: if (extra_warnings) ! 8451: warning ("extra qualification `%s' on member `%s' ignored", ! 8452: TYPE_NAME_STRING (ctype), name); ! 8453: type = build_offset_type (ctype, type); ! 8454: } ! 8455: else if (TYPE_SIZE (ctype) != NULL_TREE ! 8456: || (RIDBIT_SETP (RID_TYPEDEF, specbits))) ! 8457: { ! 8458: tree t; ! 8459: /* have to move this code elsewhere in this function. ! 8460: this code is used for i.e., typedef int A::M; M *pm; */ ! 8461: ! 8462: if (explicit_int == -1 && decl_context == FIELD ! 8463: && funcdef_flag == 0) ! 8464: { ! 8465: /* The code in here should only be used to build ! 8466: stuff that will be grokked as visibility decls. */ ! 8467: t = lookup_field (ctype, sname, 0, 0); ! 8468: if (t) ! 8469: { ! 8470: t = build_lang_field_decl (FIELD_DECL, build_nt (SCOPE_REF, ctype, t), type); ! 8471: DECL_INITIAL (t) = init; ! 8472: return t; ! 8473: } ! 8474: /* No such field, try member functions. */ ! 8475: t = lookup_fnfields (TYPE_BINFO (ctype), sname, 0); ! 8476: if (t) ! 8477: { ! 8478: if (flags == DTOR_FLAG) ! 8479: t = TREE_VALUE (t); ! 8480: else if (CLASSTYPE_METHOD_VEC (ctype) ! 8481: && TREE_VALUE (t) == TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (ctype), 0)) ! 8482: { ! 8483: /* Don't include destructor with constructors. */ ! 8484: t = DECL_CHAIN (TREE_VALUE (t)); ! 8485: if (t == NULL_TREE) ! 8486: error ("class `%s' does not have any constructors", IDENTIFIER_POINTER (sname)); ! 8487: t = build_tree_list (NULL_TREE, t); ! 8488: } ! 8489: t = build_lang_field_decl (FIELD_DECL, build_nt (SCOPE_REF, ctype, t), type); ! 8490: DECL_INITIAL (t) = init; ! 8491: return t; ! 8492: } ! 8493: ! 8494: if (flags == TYPENAME_FLAG) ! 8495: cp_error ("type conversion is not a member of structure `%T'", ctype); ! 8496: else ! 8497: cp_error ! 8498: ("field `%D' is not a member of structure `%T'", ! 8499: sname, ctype); ! 8500: } ! 8501: ! 8502: if (current_class_type) ! 8503: { ! 8504: if (TYPE_MAIN_VARIANT (ctype) != current_class_type) ! 8505: { ! 8506: cp_error ("cannot declare member `%T::%s' within `%T'", ! 8507: ctype, name, current_class_type); ! 8508: return void_type_node; ! 8509: } ! 8510: else if (extra_warnings) ! 8511: cp_warning ("extra qualification `%T' on member `%s' ignored", ! 8512: ctype, name); ! 8513: } ! 8514: type = build_offset_type (ctype, type); ! 8515: } ! 8516: else if (uses_template_parms (ctype)) ! 8517: { ! 8518: enum tree_code c; ! 8519: if (TREE_CODE (type) == FUNCTION_TYPE) ! 8520: { ! 8521: type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep), ! 8522: TREE_TYPE (type), ! 8523: TYPE_ARG_TYPES (type)); ! 8524: c = FUNCTION_DECL; ! 8525: } ! 8526: } ! 8527: else ! 8528: { ! 8529: cp_error ("structure `%T' not yet defined", ctype); ! 8530: return error_mark_node; ! 8531: } ! 8532: ! 8533: declarator = sname; ! 8534: } ! 8535: else if (TREE_CODE (sname) == TYPE_EXPR) ! 8536: { ! 8537: /* A TYPE_EXPR will change types out from under us. ! 8538: So do the TYPE_EXPR now, and make this SCOPE_REF ! 8539: inner to the TYPE_EXPR's CALL_EXPR. ! 8540: ! 8541: This does not work if we don't get a CALL_EXPR back. ! 8542: I did not think about error recovery, hence the ! 8543: my_friendly_abort. */ ! 8544: ! 8545: /* Get the CALL_EXPR. */ ! 8546: sname = grokoptypename (sname, 0); ! 8547: my_friendly_assert (TREE_CODE (sname) == CALL_EXPR, 157); ! 8548: type = TREE_TYPE (TREE_OPERAND (sname, 0)); ! 8549: /* Scope the CALL_EXPR's name. */ ! 8550: TREE_OPERAND (declarator, 1) = TREE_OPERAND (sname, 0); ! 8551: /* Put the SCOPE_EXPR in the CALL_EXPR's innermost position. */ ! 8552: TREE_OPERAND (sname, 0) = declarator; ! 8553: /* Now work from the CALL_EXPR. */ ! 8554: declarator = sname; ! 8555: continue; ! 8556: } ! 8557: else if (TREE_CODE (sname) == SCOPE_REF) ! 8558: my_friendly_abort (17); ! 8559: else ! 8560: { ! 8561: done_scoping: ! 8562: declarator = TREE_OPERAND (declarator, 1); ! 8563: if (declarator && TREE_CODE (declarator) == CALL_EXPR) ! 8564: /* In this case, we will deal with it later. */ ! 8565: ; ! 8566: else ! 8567: { ! 8568: if (TREE_CODE (type) == FUNCTION_TYPE) ! 8569: type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep), TREE_TYPE (type), TYPE_ARG_TYPES (type)); ! 8570: else ! 8571: type = build_offset_type (ctype, type); ! 8572: } ! 8573: } ! 8574: } ! 8575: break; ! 8576: ! 8577: case BIT_NOT_EXPR: ! 8578: declarator = TREE_OPERAND (declarator, 0); ! 8579: break; ! 8580: ! 8581: case TYPE_EXPR: ! 8582: declarator = grokoptypename (declarator, 0); ! 8583: if (explicit_int != -1) ! 8584: { ! 8585: tree stype = TREE_TYPE (TREE_OPERAND (declarator, 0)); ! 8586: if (comp_target_types (type, stype, 1) == 0) ! 8587: cp_error ("`operator %T' declared to return `%T'", stype, ! 8588: type); ! 8589: else ! 8590: cp_pedwarn ("return type specified for `operator %T'", type); ! 8591: } ! 8592: dname = declarator; ! 8593: type = TREE_TYPE (TREE_OPERAND (declarator, 0)); ! 8594: maybe_globalize_type (type); ! 8595: break; ! 8596: ! 8597: case RECORD_TYPE: ! 8598: case UNION_TYPE: ! 8599: case ENUMERAL_TYPE: ! 8600: declarator = NULL_TREE; ! 8601: break; ! 8602: ! 8603: case ERROR_MARK: ! 8604: declarator = NULL_TREE; ! 8605: break; ! 8606: ! 8607: default: ! 8608: my_friendly_abort (158); ! 8609: } ! 8610: } ! 8611: ! 8612: /* Now TYPE has the actual type. */ ! 8613: ! 8614: /* If this is declaring a typedef name, return a TYPE_DECL. */ ! 8615: ! 8616: if (RIDBIT_SETP (RID_TYPEDEF, specbits)) ! 8617: { ! 8618: tree decl; ! 8619: ! 8620: /* Note that the grammar rejects storage classes ! 8621: in typenames, fields or parameters. */ ! 8622: if (constp || volatilep) ! 8623: type = build_type_variant (type, constp, volatilep); ! 8624: ! 8625: /* If the user declares "struct {...} foo" then `foo' will have ! 8626: an anonymous name. Fill that name in now. Nothing can ! 8627: refer to it, so nothing needs know about the name change. ! 8628: The TYPE_NAME field was filled in by build_struct_xref. */ ! 8629: if (type != error_mark_node ! 8630: && TYPE_NAME (type) ! 8631: && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL ! 8632: && ANON_AGGRNAME_P (TYPE_IDENTIFIER (type))) ! 8633: { ! 8634: /* replace the anonymous name with the real name everywhere. */ ! 8635: lookup_tag_reverse (type, declarator); ! 8636: TYPE_IDENTIFIER (type) = declarator; ! 8637: } ! 8638: ! 8639: #if 0 /* not yet, should get fixed properly later */ ! 8640: decl = make_type_decl (declarator, type); ! 8641: #else ! 8642: decl = build_decl (TYPE_DECL, declarator, type); ! 8643: #endif ! 8644: if (TREE_CODE (type) == OFFSET_TYPE || TREE_CODE (type) == METHOD_TYPE) ! 8645: { ! 8646: cp_error_at ("typedef name may not be class-qualified", decl); ! 8647: TREE_TYPE (decl) = error_mark_node; ! 8648: } ! 8649: else if (quals) ! 8650: { ! 8651: if (ctype == NULL_TREE) ! 8652: { ! 8653: if (TREE_CODE (type) != METHOD_TYPE) ! 8654: cp_error_at ("invalid type qualifier for non-method type", decl); ! 8655: else ! 8656: ctype = TYPE_METHOD_BASETYPE (type); ! 8657: } ! 8658: if (ctype != NULL_TREE) ! 8659: grok_method_quals (ctype, decl, quals); ! 8660: } ! 8661: ! 8662: if (RIDBIT_SETP (RID_SIGNED, specbits) ! 8663: || (typedef_decl && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl))) ! 8664: C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1; ! 8665: ! 8666: if (RIDBIT_SETP (RID_MUTABLE, specbits)) ! 8667: { ! 8668: error ("non-object member `%s' cannot be declared mutable", name); ! 8669: } ! 8670: ! 8671: return decl; ! 8672: } ! 8673: ! 8674: /* Detect the case of an array type of unspecified size ! 8675: which came, as such, direct from a typedef name. ! 8676: We must copy the type, so that each identifier gets ! 8677: a distinct type, so that each identifier's size can be ! 8678: controlled separately by its own initializer. */ ! 8679: ! 8680: if (type == typedef_type && TREE_CODE (type) == ARRAY_TYPE ! 8681: && TYPE_DOMAIN (type) == NULL_TREE) ! 8682: { ! 8683: type = build_cplus_array_type (TREE_TYPE (type), TYPE_DOMAIN (type)); ! 8684: } ! 8685: ! 8686: /* If this is a type name (such as, in a cast or sizeof), ! 8687: compute the type and return it now. */ ! 8688: ! 8689: if (decl_context == TYPENAME) ! 8690: { ! 8691: /* Note that the grammar rejects storage classes ! 8692: in typenames, fields or parameters. */ ! 8693: if (constp || volatilep) ! 8694: type = build_type_variant (type, constp, volatilep); ! 8695: ! 8696: /* Special case: "friend class foo" looks like a TYPENAME context. */ ! 8697: if (friendp) ! 8698: { ! 8699: /* A friendly class? */ ! 8700: if (current_class_type) ! 8701: make_friend_class (current_class_type, TYPE_MAIN_VARIANT (type)); ! 8702: else ! 8703: error("trying to make class `%s' a friend of global scope", ! 8704: TYPE_NAME_STRING (type)); ! 8705: type = void_type_node; ! 8706: } ! 8707: else if (quals) ! 8708: { ! 8709: #if 0 /* not yet, should get fixed properly later */ ! 8710: tree dummy = make_type_decl (declarator, type); ! 8711: #else ! 8712: tree dummy = build_decl (TYPE_DECL, declarator, type); ! 8713: #endif ! 8714: if (ctype == NULL_TREE) ! 8715: { ! 8716: my_friendly_assert (TREE_CODE (type) == METHOD_TYPE, 159); ! 8717: ctype = TYPE_METHOD_BASETYPE (type); ! 8718: } ! 8719: grok_method_quals (ctype, dummy, quals); ! 8720: type = TREE_TYPE (dummy); ! 8721: } ! 8722: ! 8723: return type; ! 8724: } ! 8725: ! 8726: /* `void' at top level (not within pointer) ! 8727: is allowed only in typedefs or type names. ! 8728: We don't complain about parms either, but that is because ! 8729: a better error message can be made later. */ ! 8730: ! 8731: if (TYPE_MAIN_VARIANT (type) == void_type_node && decl_context != PARM) ! 8732: { ! 8733: if (declarator != NULL_TREE ! 8734: && TREE_CODE (declarator) == IDENTIFIER_NODE) ! 8735: { ! 8736: if (IDENTIFIER_OPNAME_P (declarator)) ! 8737: #if 0 /* How could this happen? */ ! 8738: error ("operator `%s' declared void", ! 8739: operator_name_string (declarator)); ! 8740: #else ! 8741: my_friendly_abort (356); ! 8742: #endif ! 8743: else ! 8744: error ("variable or field `%s' declared void", name); ! 8745: } ! 8746: else ! 8747: error ("variable or field declared void"); ! 8748: type = integer_type_node; ! 8749: } ! 8750: ! 8751: /* Now create the decl, which may be a VAR_DECL, a PARM_DECL ! 8752: or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE. */ ! 8753: ! 8754: { ! 8755: register tree decl; ! 8756: ! 8757: if (decl_context == PARM) ! 8758: { ! 8759: tree parmtype = type; ! 8760: ! 8761: if (ctype) ! 8762: error ("cannot use `::' in parameter declaration"); ! 8763: ! 8764: /* A parameter declared as an array of T is really a pointer to T. ! 8765: One declared as a function is really a pointer to a function. ! 8766: One declared as a member is really a pointer to member. ! 8767: ! 8768: Don't be misled by references. */ ! 8769: ! 8770: if (TREE_CODE (type) == REFERENCE_TYPE) ! 8771: type = TREE_TYPE (type); ! 8772: ! 8773: if (TREE_CODE (type) == ARRAY_TYPE) ! 8774: { ! 8775: if (parmtype == type) ! 8776: { ! 8777: /* Transfer const-ness of array into that of type ! 8778: pointed to. */ ! 8779: type = build_pointer_type ! 8780: (build_type_variant (TREE_TYPE (type), constp, volatilep)); ! 8781: volatilep = constp = 0; ! 8782: } ! 8783: else ! 8784: type = build_pointer_type (TREE_TYPE (type)); ! 8785: } ! 8786: else if (TREE_CODE (type) == FUNCTION_TYPE) ! 8787: type = build_pointer_type (type); ! 8788: else if (TREE_CODE (type) == OFFSET_TYPE) ! 8789: type = build_pointer_type (type); ! 8790: ! 8791: if (TREE_CODE (parmtype) == REFERENCE_TYPE) ! 8792: { ! 8793: /* Transfer const-ness of reference into that of type pointed to. */ ! 8794: type = build_type_variant (build_reference_type (type), constp, volatilep); ! 8795: constp = volatilep = 0; ! 8796: } ! 8797: ! 8798: decl = build_decl (PARM_DECL, declarator, type); ! 8799: ! 8800: bad_specifiers (decl, "parameter", virtualp, quals != NULL_TREE, ! 8801: inlinep, friendp, raises != NULL_TREE); ! 8802: ! 8803: /* Compute the type actually passed in the parmlist, ! 8804: for the case where there is no prototype. ! 8805: (For example, shorts and chars are passed as ints.) ! 8806: When there is a prototype, this is overridden later. */ ! 8807: ! 8808: DECL_ARG_TYPE (decl) = type; ! 8809: if (TYPE_MAIN_VARIANT (type) == float_type_node) ! 8810: DECL_ARG_TYPE (decl) = build_type_variant (double_type_node, ! 8811: TYPE_READONLY (type), ! 8812: TYPE_VOLATILE (type)); ! 8813: else if (C_PROMOTING_INTEGER_TYPE_P (type)) ! 8814: { ! 8815: tree argtype; ! 8816: ! 8817: /* Retain unsignedness if traditional or if not really ! 8818: getting wider. */ ! 8819: if (TREE_UNSIGNED (type) ! 8820: && (flag_traditional ! 8821: || TYPE_PRECISION (type) ! 8822: == TYPE_PRECISION (integer_type_node))) ! 8823: argtype = unsigned_type_node; ! 8824: else ! 8825: argtype = integer_type_node; ! 8826: DECL_ARG_TYPE (decl) = build_type_variant (argtype, ! 8827: TYPE_READONLY (type), ! 8828: TYPE_VOLATILE (type)); ! 8829: } ! 8830: } ! 8831: else if (decl_context == FIELD) ! 8832: { ! 8833: if (type == error_mark_node) ! 8834: { ! 8835: /* Happens when declaring arrays of sizes which ! 8836: are error_mark_node, for example. */ ! 8837: decl = NULL_TREE; ! 8838: } ! 8839: else if (TREE_CODE (type) == FUNCTION_TYPE) ! 8840: { ! 8841: int publicp = 0; ! 8842: ! 8843: if (friendp == 0) ! 8844: { ! 8845: if (ctype == NULL_TREE) ! 8846: ctype = current_class_type; ! 8847: ! 8848: if (ctype == NULL_TREE) ! 8849: { ! 8850: cp_error ("can't make `%D' into a method -- not in a class", ! 8851: declarator); ! 8852: return void_type_node; ! 8853: } ! 8854: ! 8855: /* ``A union may [ ... ] not [ have ] virtual functions.'' ! 8856: ARM 9.5 */ ! 8857: if (virtualp && TREE_CODE (ctype) == UNION_TYPE) ! 8858: { ! 8859: error ("function `%s' declared virtual inside a union", ! 8860: IDENTIFIER_POINTER (declarator)); ! 8861: return void_type_node; ! 8862: } ! 8863: ! 8864: /* Don't convert type of operators new and delete to ! 8865: METHOD_TYPE; they remain FUNCTION_TYPEs. */ ! 8866: if (staticp < 2 ! 8867: && declarator != ansi_opname[(int) NEW_EXPR] ! 8868: && declarator != ansi_opname[(int) DELETE_EXPR]) ! 8869: type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep), ! 8870: TREE_TYPE (type), TYPE_ARG_TYPES (type)); ! 8871: } ! 8872: ! 8873: /* Tell grokfndecl if it needs to set TREE_PUBLIC on the node. */ ! 8874: publicp = (RIDBIT_SETP (RID_EXTERN, specbits) ! 8875: || (ctype != NULL_TREE && funcdef_flag >= 0) ! 8876: || (friendp ! 8877: && RIDBIT_NOTSETP (RID_STATIC, specbits) ! 8878: && RIDBIT_NOTSETP (RID_INLINE, specbits)) ! 8879: ); ! 8880: decl = grokfndecl (ctype, type, declarator, ! 8881: virtualp, flags, quals, ! 8882: raises, friendp ? -1 : 0, publicp); ! 8883: DECL_INLINE (decl) = inlinep; ! 8884: } ! 8885: else if (TREE_CODE (type) == METHOD_TYPE) ! 8886: { ! 8887: /* All method decls are public, so tell grokfndecl to set ! 8888: TREE_PUBLIC, also. */ ! 8889: decl = grokfndecl (ctype, type, declarator, ! 8890: virtualp, flags, quals, ! 8891: raises, friendp ? -1 : 0, 1); ! 8892: DECL_INLINE (decl) = inlinep; ! 8893: } ! 8894: else if (TREE_CODE (type) == RECORD_TYPE ! 8895: && CLASSTYPE_DECLARED_EXCEPTION (type)) ! 8896: { ! 8897: /* Handle a class-local exception declaration. */ ! 8898: decl = build_lang_field_decl (VAR_DECL, declarator, type); ! 8899: if (ctype == NULL_TREE) ! 8900: ctype = current_class_type; ! 8901: finish_exception_decl (TREE_CODE (TYPE_NAME (ctype)) == TYPE_DECL ! 8902: ? TYPE_IDENTIFIER (ctype) : TYPE_NAME (ctype), decl); ! 8903: return void_type_node; ! 8904: } ! 8905: else if (TYPE_SIZE (type) == NULL_TREE && !staticp ! 8906: && (TREE_CODE (type) != ARRAY_TYPE || initialized == 0)) ! 8907: { ! 8908: if (declarator) ! 8909: error ("field `%s' has incomplete type", ! 8910: IDENTIFIER_POINTER (declarator)); ! 8911: else ! 8912: error ("field has incomplete type"); ! 8913: ! 8914: /* If we're instantiating a template, tell them which ! 8915: instantiation made the field's type be incomplete. */ ! 8916: if (current_class_type ! 8917: && TYPE_NAME (current_class_type) ! 8918: && IDENTIFIER_TEMPLATE (DECL_NAME (TYPE_NAME (current_class_type))) ! 8919: && declspecs && TREE_VALUE (declspecs) ! 8920: && TREE_TYPE (TREE_VALUE (declspecs)) == type) ! 8921: error (" in instantiation of template `%s'", ! 8922: TYPE_NAME_STRING (current_class_type)); ! 8923: ! 8924: type = error_mark_node; ! 8925: decl = NULL_TREE; ! 8926: } ! 8927: else ! 8928: { ! 8929: if (friendp) ! 8930: { ! 8931: if (declarator) ! 8932: error ("`%s' is neither function nor method; cannot be declared friend", ! 8933: IDENTIFIER_POINTER (declarator)); ! 8934: else ! 8935: { ! 8936: error ("invalid friend declaration"); ! 8937: return void_type_node; ! 8938: } ! 8939: friendp = 0; ! 8940: } ! 8941: decl = NULL_TREE; ! 8942: } ! 8943: ! 8944: if (friendp) ! 8945: { ! 8946: /* Friends are treated specially. */ ! 8947: if (ctype == current_class_type) ! 8948: warning ("member functions are implicitly friends of their class"); ! 8949: else if (decl && DECL_NAME (decl)) ! 8950: return do_friend (ctype, declarator, decl, ! 8951: last_function_parms, flags, quals); ! 8952: else ! 8953: return void_type_node; ! 8954: } ! 8955: ! 8956: /* Structure field. It may not be a function, except for C++ */ ! 8957: ! 8958: if (decl == NULL_TREE) ! 8959: { ! 8960: /* ANSI C++ June 5 1992 WP 9.2.2 and 9.4.2. A member-declarator ! 8961: cannot have an initializer, and a static member declaration must ! 8962: be defined elsewhere. */ ! 8963: if (initialized) ! 8964: { ! 8965: if (staticp) ! 8966: error ("static member `%s' must be defined separately from its declaration", ! 8967: IDENTIFIER_POINTER (declarator)); ! 8968: /* Note that initialization of const members is prohibited ! 8969: by the draft ANSI standard, though it appears to be in ! 8970: common practice. 12.6.2: The argument list is used to ! 8971: initialize the named nonstatic member.... This (or an ! 8972: aggregate) is the only way to initialize nonstatic const ! 8973: and reference members. */ ! 8974: else if (pedantic && (!constp || flag_ansi)) ! 8975: warning ("ANSI C++ forbids initialization of %s `%s'", ! 8976: constp ? "const member" : "member", ! 8977: IDENTIFIER_POINTER (declarator)); ! 8978: } ! 8979: ! 8980: if (staticp || (constp && initialized)) ! 8981: { ! 8982: /* C++ allows static class members. ! 8983: All other work for this is done by grokfield. ! 8984: This VAR_DECL is built by build_lang_field_decl. ! 8985: All other VAR_DECLs are built by build_decl. */ ! 8986: decl = build_lang_field_decl (VAR_DECL, declarator, type); ! 8987: if (staticp || TREE_CODE (type) == ARRAY_TYPE) ! 8988: TREE_STATIC (decl) = 1; ! 8989: /* In class context, static means public visibility. */ ! 8990: TREE_PUBLIC (decl) = 1; ! 8991: DECL_EXTERNAL (decl) = !initialized; ! 8992: } ! 8993: else ! 8994: { ! 8995: decl = build_lang_field_decl (FIELD_DECL, declarator, type); ! 8996: if (RIDBIT_SETP (RID_MUTABLE, specbits)) ! 8997: { ! 8998: DECL_MUTABLE_P (decl) = 1; ! 8999: RIDBIT_RESET (RID_MUTABLE, specbits); ! 9000: } ! 9001: } ! 9002: ! 9003: bad_specifiers (decl, "field", virtualp, quals != NULL_TREE, ! 9004: inlinep, friendp, raises != NULL_TREE); ! 9005: } ! 9006: } ! 9007: else if (TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE) ! 9008: { ! 9009: int was_overloaded = 0; ! 9010: tree original_name = declarator; ! 9011: int publicp = 0; ! 9012: ! 9013: if (! declarator) ! 9014: return NULL_TREE; ! 9015: ! 9016: if (RIDBIT_SETP (RID_AUTO, specbits) ! 9017: || RIDBIT_SETP (RID_REGISTER, specbits)) ! 9018: error ("invalid storage class for function `%s'", name); ! 9019: ! 9020: /* Function declaration not at top level. ! 9021: Storage classes other than `extern' are not allowed ! 9022: and `extern' makes no difference. */ ! 9023: if (current_binding_level != global_binding_level ! 9024: && (RIDBIT_SETP (RID_STATIC, specbits) || RIDBIT_SETP (RID_INLINE, specbits)) ! 9025: && pedantic) ! 9026: pedwarn ("invalid storage class for function `%s'", name); ! 9027: ! 9028: if (ctype == NULL_TREE) ! 9029: { ! 9030: if (virtualp) ! 9031: { ! 9032: error ("virtual non-class function `%s'", name); ! 9033: virtualp = 0; ! 9034: } ! 9035: ! 9036: if (current_lang_name == lang_name_cplusplus ! 9037: && ! (IDENTIFIER_LENGTH (original_name) == 4 ! 9038: && IDENTIFIER_POINTER (original_name)[0] == 'm' ! 9039: && strcmp (IDENTIFIER_POINTER (original_name), "main") == 0) ! 9040: && ! (IDENTIFIER_LENGTH (original_name) > 10 ! 9041: && IDENTIFIER_POINTER (original_name)[0] == '_' ! 9042: && IDENTIFIER_POINTER (original_name)[1] == '_' ! 9043: && strncmp (IDENTIFIER_POINTER (original_name)+2, "builtin_", 8) == 0)) ! 9044: { ! 9045: /* Plain overloading: will not be grok'd by grokclassfn. */ ! 9046: declarator = build_decl_overload (dname, TYPE_ARG_TYPES (type), 0); ! 9047: was_overloaded = 1; ! 9048: } ! 9049: } ! 9050: else if (TREE_CODE (type) == FUNCTION_TYPE && staticp < 2) ! 9051: type = build_cplus_method_type (build_type_variant (ctype, constp, volatilep), ! 9052: TREE_TYPE (type), TYPE_ARG_TYPES (type)); ! 9053: ! 9054: /* Record presence of `static'. In C++, `inline' is like `static'. ! 9055: Methods of classes should be public, unless we're dropping them ! 9056: into some other file, so we don't clear TREE_PUBLIC for them. */ ! 9057: publicp ! 9058: = ((ctype ! 9059: && CLASSTYPE_INTERFACE_KNOWN (ctype) ! 9060: && ! CLASSTYPE_INTERFACE_ONLY (ctype)) ! 9061: || !(RIDBIT_SETP (RID_STATIC, specbits) ! 9062: || RIDBIT_SETP (RID_INLINE, specbits))); ! 9063: ! 9064: decl = grokfndecl (ctype, type, original_name, ! 9065: virtualp, flags, quals, ! 9066: raises, ! 9067: processing_template_decl ? 0 : friendp ? 2 : 1, ! 9068: publicp); ! 9069: ! 9070: ! 9071: if (ctype == NULL_TREE && DECL_HAS_CPLUSPLUS_LINKAGE(decl)) ! 9072: DECL_ASSEMBLER_NAME (decl) = declarator; ! 9073: ! 9074: if (staticp == 1) ! 9075: { ! 9076: int illegal_static = 0; ! 9077: ! 9078: /* Don't allow a static member function in a class, and forbid ! 9079: declaring main to be static. */ ! 9080: if (TREE_CODE (type) == METHOD_TYPE) ! 9081: { ! 9082: cp_error_at ("cannot declare member function `%D' to have static linkage", decl); ! 9083: illegal_static = 1; ! 9084: } ! 9085: else if (! was_overloaded ! 9086: && ! ctype ! 9087: && IDENTIFIER_LENGTH (original_name) == 4 ! 9088: && IDENTIFIER_POINTER (original_name)[0] == 'm' ! 9089: && ! strcmp (IDENTIFIER_POINTER (original_name), "main")) ! 9090: { ! 9091: error ("cannot declare function `main' to have static linkage"); ! 9092: illegal_static = 1; ! 9093: } ! 9094: ! 9095: if (illegal_static) ! 9096: { ! 9097: staticp = 0; ! 9098: RIDBIT_RESET (RID_STATIC, specbits); ! 9099: } ! 9100: } ! 9101: ! 9102: #ifdef NeXT ! 9103: #ifdef HPPA ! 9104: { ! 9105: tree last = tree_last (TYPE_ARG_TYPES (type)); ! 9106: ! 9107: if (last && (TYPE_MAIN_VARIANT (TREE_VALUE (last)) != void_type_node)) ! 9108: add_vararg_func(IDENTIFIER_POINTER(declarator), '1'); ! 9109: else ! 9110: add_vararg_func(IDENTIFIER_POINTER(declarator), '0'); ! 9111: } ! 9112: #endif ! 9113: #endif ! 9114: ! 9115: /* Record presence of `inline', if it is reasonable. */ ! 9116: if (inlinep) ! 9117: { ! 9118: tree last = tree_last (TYPE_ARG_TYPES (type)); ! 9119: ! 9120: if (! was_overloaded ! 9121: && ! ctype ! 9122: && ! strcmp (IDENTIFIER_POINTER (original_name), "main")) ! 9123: error ("cannot inline function `main'"); ! 9124: else if (last && last != void_list_node) ! 9125: cp_warning ("cannot inline function `%D' which takes `...'", original_name); ! 9126: else ! 9127: /* Assume that otherwise the function can be inlined. */ ! 9128: DECL_INLINE (decl) = 1; ! 9129: ! 9130: if (RIDBIT_SETP (RID_EXTERN, specbits)) ! 9131: { ! 9132: current_extern_inline = 1; ! 9133: if (flag_ansi || pedantic || flag_pedantic_errors) ! 9134: pedwarn ("ANSI C++ does not permit `extern inline'"); ! 9135: } ! 9136: } ! 9137: if (was_overloaded) ! 9138: DECL_OVERLOADED (decl) = 1; ! 9139: } ! 9140: else ! 9141: { ! 9142: /* It's a variable. */ ! 9143: ! 9144: /* An uninitialized decl with `extern' is a reference. */ ! 9145: decl = grokvardecl (type, declarator, specbits, initialized); ! 9146: bad_specifiers (decl, "variable", virtualp, quals != NULL_TREE, ! 9147: inlinep, friendp, raises != NULL_TREE); ! 9148: ! 9149: if (ctype) ! 9150: { ! 9151: if (staticp == 1) ! 9152: { ! 9153: cp_error ("static member `%D' re-declared as static", ! 9154: decl); ! 9155: staticp = 0; ! 9156: RIDBIT_RESET (RID_STATIC, specbits); ! 9157: } ! 9158: if (RIDBIT_SETP (RID_EXTERN, specbits)) ! 9159: { ! 9160: cp_error ("cannot explicitly declare member `%#D' to have extern linkage", ! 9161: decl); ! 9162: RIDBIT_RESET (RID_EXTERN, specbits); ! 9163: } ! 9164: } ! 9165: } ! 9166: ! 9167: if (RIDBIT_SETP (RID_MUTABLE, specbits)) ! 9168: { ! 9169: error ("`%s' cannot be declared mutable", name); ! 9170: } ! 9171: ! 9172: /* Record `register' declaration for warnings on & ! 9173: and in case doing stupid register allocation. */ ! 9174: ! 9175: if (RIDBIT_SETP (RID_REGISTER, specbits)) ! 9176: DECL_REGISTER (decl) = 1; ! 9177: ! 9178: /* Record constancy and volatility. */ ! 9179: ! 9180: if (constp) ! 9181: TREE_READONLY (decl) = TREE_CODE (type) != REFERENCE_TYPE; ! 9182: if (volatilep) ! 9183: { ! 9184: TREE_SIDE_EFFECTS (decl) = 1; ! 9185: TREE_THIS_VOLATILE (decl) = 1; ! 9186: } ! 9187: ! 9188: return decl; ! 9189: } ! 9190: } ! 9191: ! 9192: /* Tell if a parmlist/exprlist looks like an exprlist or a parmlist. ! 9193: An empty exprlist is a parmlist. An exprlist which ! 9194: contains only identifiers at the global level ! 9195: is a parmlist. Otherwise, it is an exprlist. */ ! 9196: int ! 9197: parmlist_is_exprlist (exprs) ! 9198: tree exprs; ! 9199: { ! 9200: if (exprs == NULL_TREE || TREE_PARMLIST (exprs)) ! 9201: return 0; ! 9202: ! 9203: if (current_binding_level == global_binding_level) ! 9204: { ! 9205: /* At the global level, if these are all identifiers, ! 9206: then it is a parmlist. */ ! 9207: while (exprs) ! 9208: { ! 9209: if (TREE_CODE (TREE_VALUE (exprs)) != IDENTIFIER_NODE) ! 9210: return 1; ! 9211: exprs = TREE_CHAIN (exprs); ! 9212: } ! 9213: return 0; ! 9214: } ! 9215: return 1; ! 9216: } ! 9217: ! 9218: /* Make sure that the this list of PARMS has a chance of being ! 9219: grokked by `grokparms'. ! 9220: ! 9221: @@ This is really weak, but the grammar does not allow us ! 9222: @@ to easily reject things that this has to catch as syntax errors. */ ! 9223: static int ! 9224: parmlist_is_random (parms) ! 9225: tree parms; ! 9226: { ! 9227: if (parms == NULL_TREE) ! 9228: return 0; ! 9229: ! 9230: if (TREE_CODE (parms) != TREE_LIST) ! 9231: return 1; ! 9232: ! 9233: while (parms) ! 9234: { ! 9235: if (parms == void_list_node) ! 9236: return 0; ! 9237: ! 9238: if (TREE_CODE (TREE_VALUE (parms)) != TREE_LIST) ! 9239: return 1; ! 9240: /* Don't get faked out by overloaded functions, which ! 9241: masquerade as TREE_LISTs! */ ! 9242: if (TREE_TYPE (TREE_VALUE (parms)) == unknown_type_node) ! 9243: return 1; ! 9244: parms = TREE_CHAIN (parms); ! 9245: } ! 9246: return 0; ! 9247: } ! 9248: ! 9249: /* Subroutine of `grokparms'. In a fcn definition, arg types must ! 9250: be complete. ! 9251: ! 9252: C++: also subroutine of `start_function'. */ ! 9253: static void ! 9254: require_complete_types_for_parms (parms) ! 9255: tree parms; ! 9256: { ! 9257: while (parms) ! 9258: { ! 9259: tree type = TREE_TYPE (parms); ! 9260: if (TYPE_SIZE (type) == NULL_TREE) ! 9261: { ! 9262: if (DECL_NAME (parms)) ! 9263: error ("parameter `%s' has incomplete type", ! 9264: IDENTIFIER_POINTER (DECL_NAME (parms))); ! 9265: else ! 9266: error ("parameter has incomplete type"); ! 9267: TREE_TYPE (parms) = error_mark_node; ! 9268: } ! 9269: #if 0 ! 9270: /* If the arg types are incomplete in a declaration, ! 9271: they must include undefined tags. ! 9272: These tags can never be defined in the scope of the declaration, ! 9273: so the types can never be completed, ! 9274: and no call can be compiled successfully. */ ! 9275: /* This is not the right behavior for C++, but not having ! 9276: it is also probably wrong. */ ! 9277: else ! 9278: { ! 9279: /* Now warn if is a pointer to an incomplete type. */ ! 9280: while (TREE_CODE (type) == POINTER_TYPE ! 9281: || TREE_CODE (type) == REFERENCE_TYPE) ! 9282: type = TREE_TYPE (type); ! 9283: type = TYPE_MAIN_VARIANT (type); ! 9284: if (TYPE_SIZE (type) == NULL_TREE) ! 9285: { ! 9286: if (DECL_NAME (parm) != NULL_TREE) ! 9287: warning ("parameter `%s' points to incomplete type", ! 9288: IDENTIFIER_POINTER (DECL_NAME (parm))); ! 9289: else ! 9290: warning ("parameter points to incomplete type"); ! 9291: } ! 9292: } ! 9293: #endif ! 9294: parms = TREE_CHAIN (parms); ! 9295: } ! 9296: } ! 9297: ! 9298: /* Decode the list of parameter types for a function type. ! 9299: Given the list of things declared inside the parens, ! 9300: return a list of types. ! 9301: ! 9302: The list we receive can have three kinds of elements: ! 9303: an IDENTIFIER_NODE for names given without types, ! 9304: a TREE_LIST node for arguments given as typespecs or names with typespecs, ! 9305: or void_type_node, to mark the end of an argument list ! 9306: when additional arguments are not permitted (... was not used). ! 9307: ! 9308: FUNCDEF_FLAG is nonzero for a function definition, 0 for ! 9309: a mere declaration. A nonempty identifier-list gets an error message ! 9310: when FUNCDEF_FLAG is zero. ! 9311: If FUNCDEF_FLAG is 1, then parameter types must be complete. ! 9312: If FUNCDEF_FLAG is -1, then parameter types may be incomplete. ! 9313: ! 9314: If all elements of the input list contain types, ! 9315: we return a list of the types. ! 9316: If all elements contain no type (except perhaps a void_type_node ! 9317: at the end), we return a null list. ! 9318: If some have types and some do not, it is an error, and we ! 9319: return a null list. ! 9320: ! 9321: Also set last_function_parms to either ! 9322: a list of names (IDENTIFIER_NODEs) or a chain of PARM_DECLs. ! 9323: A list of names is converted to a chain of PARM_DECLs ! 9324: by store_parm_decls so that ultimately it is always a chain of decls. ! 9325: ! 9326: Note that in C++, parameters can take default values. These default ! 9327: values are in the TREE_PURPOSE field of the TREE_LIST. It is ! 9328: an error to specify default values which are followed by parameters ! 9329: that have no default values, or an ELLIPSES. For simplicities sake, ! 9330: only parameters which are specified with their types can take on ! 9331: default values. */ ! 9332: ! 9333: tree ! 9334: grokparms (first_parm, funcdef_flag) ! 9335: tree first_parm; ! 9336: int funcdef_flag; ! 9337: { ! 9338: tree result = NULL_TREE; ! 9339: tree decls = NULL_TREE; ! 9340: ! 9341: if (first_parm != NULL_TREE ! 9342: && TREE_CODE (TREE_VALUE (first_parm)) == IDENTIFIER_NODE) ! 9343: { ! 9344: if (! funcdef_flag) ! 9345: warning ("parameter names (without types) in function declaration"); ! 9346: last_function_parms = first_parm; ! 9347: return NULL_TREE; ! 9348: } ! 9349: else ! 9350: { ! 9351: /* Types were specified. This is a list of declarators ! 9352: each represented as a TREE_LIST node. */ ! 9353: register tree parm, chain; ! 9354: int any_init = 0, any_error = 0, saw_void = 0; ! 9355: ! 9356: if (first_parm != NULL_TREE) ! 9357: { ! 9358: tree last_result = NULL_TREE; ! 9359: tree last_decl = NULL_TREE; ! 9360: ! 9361: for (parm = first_parm; parm != NULL_TREE; parm = chain) ! 9362: { ! 9363: tree type, list_node = parm; ! 9364: register tree decl = TREE_VALUE (parm); ! 9365: tree init = TREE_PURPOSE (parm); ! 9366: ! 9367: chain = TREE_CHAIN (parm); ! 9368: /* @@ weak defense against parse errors. */ ! 9369: if (decl != void_type_node && TREE_CODE (decl) != TREE_LIST) ! 9370: { ! 9371: /* Give various messages as the need arises. */ ! 9372: if (TREE_CODE (decl) == STRING_CST) ! 9373: error ("invalid string constant `%s'", ! 9374: TREE_STRING_POINTER (decl)); ! 9375: else if (TREE_CODE (decl) == INTEGER_CST) ! 9376: error ("invalid integer constant in parameter list, did you forget to give parameter name?"); ! 9377: continue; ! 9378: } ! 9379: ! 9380: if (decl != void_type_node) ! 9381: { ! 9382: /* @@ May need to fetch out a `raises' here. */ ! 9383: decl = grokdeclarator (TREE_VALUE (decl), ! 9384: TREE_PURPOSE (decl), ! 9385: PARM, init != NULL_TREE, NULL_TREE); ! 9386: if (! decl) ! 9387: continue; ! 9388: type = TREE_TYPE (decl); ! 9389: if (TYPE_MAIN_VARIANT (type) == void_type_node) ! 9390: decl = void_type_node; ! 9391: else if (TREE_CODE (type) == METHOD_TYPE) ! 9392: { ! 9393: if (DECL_NAME (decl)) ! 9394: /* Cannot use `error_with_decl' here because ! 9395: we don't have DECL_CONTEXT set up yet. */ ! 9396: error ("parameter `%s' invalidly declared method type", ! 9397: IDENTIFIER_POINTER (DECL_NAME (decl))); ! 9398: else ! 9399: error ("parameter invalidly declared method type"); ! 9400: type = build_pointer_type (type); ! 9401: TREE_TYPE (decl) = type; ! 9402: } ! 9403: else if (TREE_CODE (type) == OFFSET_TYPE) ! 9404: { ! 9405: if (DECL_NAME (decl)) ! 9406: error ("parameter `%s' invalidly declared offset type", ! 9407: IDENTIFIER_POINTER (DECL_NAME (decl))); ! 9408: else ! 9409: error ("parameter invalidly declared offset type"); ! 9410: type = build_pointer_type (type); ! 9411: TREE_TYPE (decl) = type; ! 9412: } ! 9413: else if (TREE_CODE (type) == RECORD_TYPE ! 9414: && TYPE_LANG_SPECIFIC (type) ! 9415: && CLASSTYPE_ABSTRACT_VIRTUALS (type)) ! 9416: { ! 9417: abstract_virtuals_error (decl, type); ! 9418: any_error = 1; /* seems like a good idea */ ! 9419: } ! 9420: } ! 9421: ! 9422: if (decl == void_type_node) ! 9423: { ! 9424: if (result == NULL_TREE) ! 9425: { ! 9426: result = void_list_node; ! 9427: last_result = result; ! 9428: } ! 9429: else ! 9430: { ! 9431: TREE_CHAIN (last_result) = void_list_node; ! 9432: last_result = void_list_node; ! 9433: } ! 9434: saw_void = 1; ! 9435: if (chain ! 9436: && (chain != void_list_node || TREE_CHAIN (chain))) ! 9437: error ("`void' in parameter list must be entire list"); ! 9438: break; ! 9439: } ! 9440: ! 9441: /* Since there is a prototype, args are passed in their own types. */ ! 9442: DECL_ARG_TYPE (decl) = TREE_TYPE (decl); ! 9443: #ifdef PROMOTE_PROTOTYPES ! 9444: if ((TREE_CODE (type) == INTEGER_TYPE ! 9445: || TREE_CODE (type) == ENUMERAL_TYPE) ! 9446: && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)) ! 9447: DECL_ARG_TYPE (decl) = integer_type_node; ! 9448: #endif ! 9449: if (!any_error) ! 9450: { ! 9451: if (init) ! 9452: { ! 9453: any_init++; ! 9454: if (TREE_CODE (init) == SAVE_EXPR) ! 9455: PARM_DECL_EXPR (init) = 1; ! 9456: else if (TREE_CODE (init) == VAR_DECL) ! 9457: { ! 9458: if (IDENTIFIER_LOCAL_VALUE (DECL_NAME (init))) ! 9459: { ! 9460: /* ``Local variables may not be used in default ! 9461: argument expressions.'' dpANSI C++ 8.2.6 */ ! 9462: /* If extern int i; within a function is not ! 9463: considered a local variable, then this code is ! 9464: wrong. */ ! 9465: cp_error ("local variable `%D' may not be used as a default argument", init); ! 9466: any_error = 1; ! 9467: } ! 9468: else if (TREE_READONLY_DECL_P (init)) ! 9469: init = decl_constant_value (init); ! 9470: } ! 9471: else ! 9472: init = require_instantiated_type (type, init, integer_zero_node); ! 9473: } ! 9474: else if (any_init) ! 9475: { ! 9476: error ("all trailing parameters must have default arguments"); ! 9477: any_error = 1; ! 9478: } ! 9479: } ! 9480: else ! 9481: init = NULL_TREE; ! 9482: ! 9483: if (decls == NULL_TREE) ! 9484: { ! 9485: decls = decl; ! 9486: last_decl = decls; ! 9487: } ! 9488: else ! 9489: { ! 9490: TREE_CHAIN (last_decl) = decl; ! 9491: last_decl = decl; ! 9492: } ! 9493: if (TREE_PERMANENT (list_node)) ! 9494: { ! 9495: TREE_PURPOSE (list_node) = init; ! 9496: TREE_VALUE (list_node) = type; ! 9497: TREE_CHAIN (list_node) = NULL_TREE; ! 9498: } ! 9499: else ! 9500: list_node = saveable_tree_cons (init, type, NULL_TREE); ! 9501: if (result == NULL_TREE) ! 9502: { ! 9503: result = list_node; ! 9504: last_result = result; ! 9505: } ! 9506: else ! 9507: { ! 9508: TREE_CHAIN (last_result) = list_node; ! 9509: last_result = list_node; ! 9510: } ! 9511: } ! 9512: if (last_result) ! 9513: TREE_CHAIN (last_result) = NULL_TREE; ! 9514: /* If there are no parameters, and the function does not end ! 9515: with `...', then last_decl will be NULL_TREE. */ ! 9516: if (last_decl != NULL_TREE) ! 9517: TREE_CHAIN (last_decl) = NULL_TREE; ! 9518: } ! 9519: } ! 9520: ! 9521: last_function_parms = decls; ! 9522: ! 9523: /* In a fcn definition, arg types must be complete. */ ! 9524: if (funcdef_flag > 0) ! 9525: require_complete_types_for_parms (last_function_parms); ! 9526: ! 9527: return result; ! 9528: } ! 9529: ! 9530: /* These memoizing functions keep track of special properties which ! 9531: a class may have. `grok_ctor_properties' notices whether a class ! 9532: has a constructor of the form X(X&), and also complains ! 9533: if the class has a constructor of the form X(X). ! 9534: `grok_op_properties' takes notice of the various forms of ! 9535: operator= which are defined, as well as what sorts of type conversion ! 9536: may apply. Both functions take a FUNCTION_DECL as an argument. */ ! 9537: void ! 9538: grok_ctor_properties (ctype, decl) ! 9539: tree ctype, decl; ! 9540: { ! 9541: tree parmtypes = FUNCTION_ARG_CHAIN (decl); ! 9542: tree parmtype = parmtypes ? TREE_VALUE (parmtypes) : void_type_node; ! 9543: ! 9544: /* When a type has virtual baseclasses, a magical first int argument is ! 9545: added to any ctor so we can tell if the class has been initialized ! 9546: yet. This could screw things up in this function, so we deliberately ! 9547: ignore the leading int if we're in that situation. */ ! 9548: if (parmtypes ! 9549: && TREE_VALUE (parmtypes) == integer_type_node ! 9550: && TYPE_USES_VIRTUAL_BASECLASSES (ctype)) ! 9551: { ! 9552: parmtypes = TREE_CHAIN (parmtypes); ! 9553: parmtype = TREE_VALUE (parmtypes); ! 9554: } ! 9555: ! 9556: if (TREE_CODE (parmtype) == REFERENCE_TYPE ! 9557: && TYPE_MAIN_VARIANT (TREE_TYPE (parmtype)) == ctype) ! 9558: { ! 9559: if (TREE_CHAIN (parmtypes) == NULL_TREE ! 9560: || TREE_CHAIN (parmtypes) == void_list_node ! 9561: || TREE_PURPOSE (TREE_CHAIN (parmtypes))) ! 9562: { ! 9563: TYPE_HAS_INIT_REF (ctype) = 1; ! 9564: TYPE_GETS_INIT_REF (ctype) = 1; ! 9565: if (TYPE_READONLY (TREE_TYPE (parmtype))) ! 9566: TYPE_GETS_CONST_INIT_REF (ctype) = 1; ! 9567: } ! 9568: else ! 9569: TYPE_GETS_INIT_AGGR (ctype) = 1; ! 9570: } ! 9571: else if (TYPE_MAIN_VARIANT (parmtype) == ctype) ! 9572: { ! 9573: if (TREE_CHAIN (parmtypes) != NULL_TREE ! 9574: && TREE_CHAIN (parmtypes) == void_list_node) ! 9575: error ("invalid constructor; you probably meant `%s (%s&)'", ! 9576: TYPE_NAME_STRING (ctype), ! 9577: TYPE_NAME_STRING (ctype)); ! 9578: SET_IDENTIFIER_ERROR_LOCUS (DECL_NAME (decl), ctype); ! 9579: TYPE_GETS_INIT_AGGR (ctype) = 1; ! 9580: } ! 9581: else if (TREE_CODE (parmtype) == VOID_TYPE ! 9582: || TREE_PURPOSE (parmtypes) != NULL_TREE) ! 9583: TYPE_HAS_DEFAULT_CONSTRUCTOR (ctype) = 1; ! 9584: } ! 9585: ! 9586: /* An operator with this name can be either unary or binary. */ ! 9587: int ambi_op_p (name) ! 9588: tree name; ! 9589: { ! 9590: return (name == ansi_opname [(int) INDIRECT_REF] ! 9591: || name == ansi_opname [(int) ADDR_EXPR] ! 9592: || name == ansi_opname [(int) NEGATE_EXPR] ! 9593: || name == ansi_opname[(int) POSTINCREMENT_EXPR] ! 9594: || name == ansi_opname[(int) POSTDECREMENT_EXPR] ! 9595: || name == ansi_opname [(int) CONVERT_EXPR]); ! 9596: } ! 9597: ! 9598: /* An operator with this name can only be unary. */ ! 9599: int unary_op_p (name) ! 9600: tree name; ! 9601: { ! 9602: return (name == ansi_opname [(int) TRUTH_NOT_EXPR] ! 9603: || name == ansi_opname [(int) BIT_NOT_EXPR] ! 9604: || name == ansi_opname [(int) COMPONENT_REF] ! 9605: || OPERATOR_TYPENAME_P (name)); ! 9606: } ! 9607: ! 9608: /* Do a little sanity-checking on how they declared their operator. */ ! 9609: static void ! 9610: grok_op_properties (decl, virtualp) ! 9611: tree decl; ! 9612: int virtualp; ! 9613: { ! 9614: tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl)); ! 9615: int methodp = (TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE); ! 9616: tree name = DECL_NAME (decl); ! 9617: ! 9618: if (name == ansi_opname[(int) NEW_EXPR]) ! 9619: { ! 9620: #if 0 /* When the compiler encounters the definition of A::operator new, it ! 9621: doesn't look at the class declaration to find out if it's static. */ ! 9622: my_friendly_assert (!methodp, 355); ! 9623: #endif ! 9624: ! 9625: /* Take care of function decl if we had syntax errors. */ ! 9626: if (argtypes == NULL_TREE) ! 9627: TREE_TYPE (decl) = ! 9628: build_function_type (ptr_type_node, ! 9629: hash_tree_chain (integer_type_node, ! 9630: void_list_node)); ! 9631: else ! 9632: decl = coerce_new_type (TREE_TYPE (decl)); ! 9633: } ! 9634: else if (name == ansi_opname[(int) DELETE_EXPR]) ! 9635: { ! 9636: #if 0 ! 9637: my_friendly_assert (!methodp, 355); ! 9638: #endif ! 9639: ! 9640: if (argtypes == NULL_TREE) ! 9641: TREE_TYPE (decl) = ! 9642: build_function_type (void_type_node, ! 9643: hash_tree_chain (ptr_type_node, ! 9644: void_list_node)); ! 9645: else ! 9646: decl = coerce_delete_type (TREE_TYPE (decl)); ! 9647: } ! 9648: /* 13.4.0.3 */ ! 9649: else if (name == ansi_opname[(int) COND_EXPR]) ! 9650: error("`operator ?:' cannot be overloaded"); ! 9651: else ! 9652: { ! 9653: /* An operator function must either be a non-static member function ! 9654: or have at least one parameter of a class, a reference to a class, ! 9655: an enumeration, or a reference to an enumeration. 13.4.0.6 */ ! 9656: if (! methodp) ! 9657: { ! 9658: if (OPERATOR_TYPENAME_P (name) ! 9659: || name == ansi_opname[(int) CALL_EXPR] ! 9660: || name == ansi_opname[(int) MODIFY_EXPR] ! 9661: || name == ansi_opname[(int) COMPONENT_REF] ! 9662: || name == ansi_opname[(int) ARRAY_REF]) ! 9663: cp_error ("`%D' must be a nonstatic member function", decl); ! 9664: else ! 9665: { ! 9666: tree p = argtypes; ! 9667: ! 9668: if (p) ! 9669: for (; TREE_VALUE (p) != void_type_node ; p = TREE_CHAIN (p)) ! 9670: { ! 9671: tree arg = TREE_VALUE (p); ! 9672: if (TREE_CODE (arg) == REFERENCE_TYPE) ! 9673: arg = TREE_TYPE (arg); ! 9674: ! 9675: /* This lets bad template code slip through. */ ! 9676: if (IS_AGGR_TYPE (arg) ! 9677: || TREE_CODE (arg) == ENUMERAL_TYPE ! 9678: || TREE_CODE (arg) == TEMPLATE_TYPE_PARM) ! 9679: goto foundaggr; ! 9680: } ! 9681: cp_error ! 9682: ("`%D' must have an argument of class or enumerated type", ! 9683: decl); ! 9684: foundaggr: ! 9685: ; ! 9686: } ! 9687: } ! 9688: ! 9689: if (name == ansi_opname[(int) CALL_EXPR] ! 9690: || name == ansi_opname[(int) METHOD_CALL_EXPR]) ! 9691: return; /* no restrictions on args */ ! 9692: ! 9693: if (name == ansi_opname[(int) MODIFY_EXPR]) ! 9694: { ! 9695: tree parmtype; ! 9696: ! 9697: if (list_length (argtypes) != 3 && methodp) ! 9698: { ! 9699: cp_error ("`%D' must take exactly one argument", decl); ! 9700: return; ! 9701: } ! 9702: parmtype = TREE_VALUE (TREE_CHAIN (argtypes)); ! 9703: ! 9704: if (TREE_CODE (parmtype) == REFERENCE_TYPE ! 9705: && TREE_TYPE (parmtype) == current_class_type) ! 9706: { ! 9707: TYPE_HAS_ASSIGN_REF (current_class_type) = 1; ! 9708: TYPE_GETS_ASSIGN_REF (current_class_type) = 1; ! 9709: if (TYPE_READONLY (TREE_TYPE (parmtype))) ! 9710: TYPE_GETS_CONST_INIT_REF (current_class_type) = 1; ! 9711: } ! 9712: } ! 9713: else if (ambi_op_p (name)) ! 9714: { ! 9715: if (list_length (argtypes) == 2) ! 9716: /* prefix */; ! 9717: else if (list_length (argtypes) == 3) ! 9718: { ! 9719: if ((name == ansi_opname[(int) POSTINCREMENT_EXPR] ! 9720: || name == ansi_opname[(int) POSTDECREMENT_EXPR]) ! 9721: && TREE_VALUE (TREE_CHAIN (argtypes)) != integer_type_node) ! 9722: { ! 9723: if (methodp) ! 9724: cp_error ("postfix `%D' must take `int' as its argument", ! 9725: decl); ! 9726: else ! 9727: cp_error ! 9728: ("postfix `%D' must take `int' as its second argument", ! 9729: decl); ! 9730: } ! 9731: } ! 9732: else ! 9733: { ! 9734: if (methodp) ! 9735: cp_error ("`%D' must take either zero or one argument", decl); ! 9736: else ! 9737: cp_error ("`%D' must take either one or two arguments", decl); ! 9738: } ! 9739: } ! 9740: else if (unary_op_p (name)) ! 9741: { ! 9742: if (list_length (argtypes) != 2) ! 9743: { ! 9744: if (methodp) ! 9745: cp_error ("`%D' must take `void'", decl); ! 9746: else ! 9747: cp_error ("`%D' must take exactly one argument", decl); ! 9748: } ! 9749: } ! 9750: else /* if (binary_op_p (name)) */ ! 9751: { ! 9752: if (list_length (argtypes) != 3) ! 9753: { ! 9754: if (methodp) ! 9755: cp_error ("`%D' must take exactly one argument", decl); ! 9756: else ! 9757: cp_error ("`%D' must take exactly two arguments", decl); ! 9758: } ! 9759: } ! 9760: ! 9761: /* 13.4.0.8 */ ! 9762: if (argtypes) ! 9763: for (; argtypes != void_list_node ; argtypes = TREE_CHAIN (argtypes)) ! 9764: if (TREE_PURPOSE (argtypes)) ! 9765: { ! 9766: TREE_PURPOSE (argtypes) = NULL_TREE; ! 9767: cp_error ("`%D' cannot have default arguments", decl); ! 9768: } ! 9769: } ! 9770: } ! 9771: ! 9772: /* Get the struct, enum or union (CODE says which) with tag NAME. ! 9773: Define the tag as a forward-reference if it is not defined. ! 9774: ! 9775: C++: If a class derivation is given, process it here, and report ! 9776: an error if multiple derivation declarations are not identical. ! 9777: ! 9778: If this is a definition, come in through xref_tag and only look in ! 9779: the current frame for the name (since C++ allows new names in any ! 9780: scope.) */ ! 9781: ! 9782: /* avoid rewriting all callers of xref_tag */ ! 9783: static int xref_next_defn = 0; ! 9784: ! 9785: tree ! 9786: xref_defn_tag (code_type_node, name, binfo) ! 9787: tree code_type_node; ! 9788: tree name, binfo; ! 9789: { ! 9790: tree rv, ncp; ! 9791: xref_next_defn = 1; ! 9792: ! 9793: if (class_binding_level) ! 9794: { ! 9795: tree n1; ! 9796: char *buf; ! 9797: /* we need to build a new IDENTIFIER_NODE for name which nukes ! 9798: * the pieces... */ ! 9799: n1 = IDENTIFIER_LOCAL_VALUE (current_class_name); ! 9800: if (n1) ! 9801: n1 = DECL_NAME (n1); ! 9802: else ! 9803: n1 = current_class_name; ! 9804: ! 9805: buf = (char *) alloca (4 + IDENTIFIER_LENGTH (n1) ! 9806: + IDENTIFIER_LENGTH (name)); ! 9807: ! 9808: sprintf (buf, "%s::%s", IDENTIFIER_POINTER (n1), ! 9809: IDENTIFIER_POINTER (name)); ! 9810: ncp = get_identifier (buf); ! 9811: #ifdef SPEW_DEBUG ! 9812: if (spew_debug) ! 9813: printf("*** %s ***\n", IDENTIFIER_POINTER (ncp)); ! 9814: #endif ! 9815: #if 0 ! 9816: IDENTIFIER_LOCAL_VALUE (name) = ! 9817: build_lang_decl (TYPE_DECL, ncp, NULL_TREE); ! 9818: #endif ! 9819: rv = xref_tag (code_type_node, name, binfo); ! 9820: { ! 9821: register tree type_decl = build_lang_decl (TYPE_DECL, ncp, rv); ! 9822: #ifdef DWARF_DEBUGGING_INFO ! 9823: /* Mark the TYPE_DECL node created just above as a gratuitous one ! 9824: so that dwarfout.c will know not to generate a TAG_typedef DIE ! 9825: for it. */ ! 9826: if (write_symbols == DWARF_DEBUG) ! 9827: DECL_IGNORED_P (type_decl) = 1; ! 9828: #endif /* DWARF_DEBUGGING_INFO */ ! 9829: pushdecl_top_level (type_decl); ! 9830: } ! 9831: } ! 9832: else ! 9833: { ! 9834: rv = xref_tag (code_type_node, name, binfo); ! 9835: } ! 9836: xref_next_defn = 0; ! 9837: return rv; ! 9838: } ! 9839: ! 9840: tree ! 9841: xref_tag (code_type_node, name, binfo) ! 9842: tree code_type_node; ! 9843: tree name, binfo; ! 9844: { ! 9845: enum tag_types tag_code; ! 9846: enum tree_code code; ! 9847: int temp = 0; ! 9848: int i, len; ! 9849: register tree ref; ! 9850: struct binding_level *b ! 9851: = (class_binding_level ? class_binding_level : current_binding_level); ! 9852: ! 9853: tag_code = (enum tag_types) TREE_INT_CST_LOW (code_type_node); ! 9854: switch (tag_code) ! 9855: { ! 9856: case record_type: ! 9857: case class_type: ! 9858: case exception_type: ! 9859: code = RECORD_TYPE; ! 9860: len = list_length (binfo); ! 9861: break; ! 9862: case union_type: ! 9863: code = UNION_TYPE; ! 9864: if (binfo) ! 9865: { ! 9866: cp_error ("derived union `%T' invalid", name); ! 9867: binfo = NULL_TREE; ! 9868: } ! 9869: len = 0; ! 9870: break; ! 9871: case enum_type: ! 9872: code = ENUMERAL_TYPE; ! 9873: break; ! 9874: default: ! 9875: my_friendly_abort (18); ! 9876: } ! 9877: ! 9878: /* If a cross reference is requested, look up the type ! 9879: already defined for this tag and return it. */ ! 9880: if (xref_next_defn) ! 9881: { ! 9882: /* If we know we are defining this tag, only look it up in this scope ! 9883: * and don't try to find it as a type. */ ! 9884: xref_next_defn = 0; ! 9885: ref = lookup_tag (code, name, b, 1); ! 9886: } ! 9887: else ! 9888: { ! 9889: ref = lookup_tag (code, name, b, 0); ! 9890: ! 9891: if (! ref) ! 9892: { ! 9893: /* Try finding it as a type declaration. If that wins, use it. */ ! 9894: ref = lookup_name (name, 1); ! 9895: if (ref && TREE_CODE (ref) == TYPE_DECL ! 9896: && TREE_CODE (TREE_TYPE (ref)) == code) ! 9897: ref = TREE_TYPE (ref); ! 9898: else ! 9899: ref = NULL_TREE; ! 9900: } ! 9901: } ! 9902: ! 9903: push_obstacks_nochange (); ! 9904: ! 9905: if (! ref) ! 9906: { ! 9907: /* If no such tag is yet defined, create a forward-reference node ! 9908: and record it as the "definition". ! 9909: When a real declaration of this type is found, ! 9910: the forward-reference will be altered into a real type. */ ! 9911: ! 9912: /* In C++, since these migrate into the global scope, we must ! 9913: build them on the permanent obstack. */ ! 9914: ! 9915: temp = allocation_temporary_p (); ! 9916: if (temp) ! 9917: end_temporary_allocation (); ! 9918: ! 9919: if (code == ENUMERAL_TYPE) ! 9920: { ! 9921: ref = make_node (ENUMERAL_TYPE); ! 9922: ! 9923: /* Give the type a default layout like unsigned int ! 9924: to avoid crashing if it does not get defined. */ ! 9925: TYPE_MODE (ref) = TYPE_MODE (unsigned_type_node); ! 9926: TYPE_ALIGN (ref) = TYPE_ALIGN (unsigned_type_node); ! 9927: TREE_UNSIGNED (ref) = 1; ! 9928: TYPE_PRECISION (ref) = TYPE_PRECISION (unsigned_type_node); ! 9929: TYPE_MIN_VALUE (ref) = TYPE_MIN_VALUE (unsigned_type_node); ! 9930: TYPE_MAX_VALUE (ref) = TYPE_MAX_VALUE (unsigned_type_node); ! 9931: ! 9932: /* Enable us to recognize when a type is created in class context. ! 9933: To do nested classes correctly, this should probably be cleared ! 9934: out when we leave this classes scope. Currently this in only ! 9935: done in `start_enum'. */ ! 9936: ! 9937: pushtag (name, ref); ! 9938: if (flag_cadillac) ! 9939: cadillac_start_enum (ref); ! 9940: } ! 9941: else if (tag_code == exception_type) ! 9942: { ! 9943: ref = make_lang_type (code); ! 9944: /* Enable us to recognize when an exception type is created in ! 9945: class context. To do nested classes correctly, this should ! 9946: probably be cleared out when we leave this class's scope. */ ! 9947: CLASSTYPE_DECLARED_EXCEPTION (ref) = 1; ! 9948: pushtag (name, ref); ! 9949: if (flag_cadillac) ! 9950: cadillac_start_struct (ref); ! 9951: } ! 9952: else ! 9953: { ! 9954: extern tree pending_vtables; ! 9955: struct binding_level *old_b = class_binding_level; ! 9956: int needs_writing; ! 9957: ! 9958: ref = make_lang_type (code); ! 9959: ! 9960: /* Record how to set the visibility of this class's ! 9961: virtual functions. If write_virtuals == 2 or 3, then ! 9962: inline virtuals are ``extern inline''. */ ! 9963: switch (write_virtuals) ! 9964: { ! 9965: case 0: ! 9966: case 1: ! 9967: needs_writing = 1; ! 9968: break; ! 9969: case 2: ! 9970: needs_writing = !! value_member (name, pending_vtables); ! 9971: break; ! 9972: case 3: ! 9973: needs_writing = ! CLASSTYPE_INTERFACE_ONLY (ref) ! 9974: && CLASSTYPE_INTERFACE_KNOWN (ref); ! 9975: break; ! 9976: default: ! 9977: needs_writing = 0; ! 9978: } ! 9979: ! 9980: CLASSTYPE_VTABLE_NEEDS_WRITING (ref) = needs_writing; ! 9981: ! 9982: #ifdef NONNESTED_CLASSES ! 9983: /* Class types don't nest the way enums do. */ ! 9984: class_binding_level = (struct binding_level *)0; ! 9985: #endif ! 9986: pushtag (name, ref); ! 9987: class_binding_level = old_b; ! 9988: ! 9989: if (flag_cadillac) ! 9990: cadillac_start_struct (ref); ! 9991: } ! 9992: } ! 9993: else ! 9994: { ! 9995: if (IS_AGGR_TYPE_CODE (code)) ! 9996: { ! 9997: if (IS_AGGR_TYPE (ref) ! 9998: && ((tag_code == exception_type) ! 9999: != (CLASSTYPE_DECLARED_EXCEPTION (ref) == 1))) ! 10000: { ! 10001: cp_error ("type `%T' is both exception and aggregate type", ref); ! 10002: CLASSTYPE_DECLARED_EXCEPTION (ref) = (tag_code == exception_type); ! 10003: } ! 10004: } ! 10005: ! 10006: /* If it no longer looks like a nested type, make sure it's ! 10007: in global scope. */ ! 10008: if (b == global_binding_level && !class_binding_level ! 10009: && IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE) ! 10010: IDENTIFIER_GLOBAL_VALUE (name) = TYPE_NAME (ref); ! 10011: ! 10012: if (binfo) ! 10013: { ! 10014: tree tt1 = binfo; ! 10015: tree tt2 = TYPE_BINFO_BASETYPES (ref); ! 10016: ! 10017: if (TYPE_BINFO_BASETYPES (ref)) ! 10018: for (i = 0; tt1; i++, tt1 = TREE_CHAIN (tt1)) ! 10019: if (TREE_VALUE (tt1) != TYPE_IDENTIFIER (BINFO_TYPE (TREE_VEC_ELT (tt2, i)))) ! 10020: { ! 10021: cp_error ("redeclaration of derivation chain of type `%#T'", ! 10022: ref); ! 10023: break; ! 10024: } ! 10025: ! 10026: if (tt1 == NULL_TREE) ! 10027: /* The user told us something we already knew. */ ! 10028: goto just_return; ! 10029: ! 10030: /* In C++, since these migrate into the global scope, we must ! 10031: build them on the permanent obstack. */ ! 10032: end_temporary_allocation (); ! 10033: } ! 10034: } ! 10035: ! 10036: if (binfo) ! 10037: { ! 10038: /* In the declaration `A : X, Y, ... Z' we mark all the types ! 10039: (A, X, Y, ..., Z) so we can check for duplicates. */ ! 10040: tree binfos; ! 10041: ! 10042: SET_CLASSTYPE_MARKED (ref); ! 10043: BINFO_BASETYPES (TYPE_BINFO (ref)) = binfos = make_tree_vec (len); ! 10044: ! 10045: for (i = 0; binfo; binfo = TREE_CHAIN (binfo)) ! 10046: { ! 10047: /* The base of a derived struct is public. */ ! 10048: int via_public = (tag_code != class_type ! 10049: || TREE_PURPOSE (binfo) == (tree)visibility_public ! 10050: || TREE_PURPOSE (binfo) == (tree)visibility_public_virtual); ! 10051: int via_protected = TREE_PURPOSE (binfo) == (tree)visibility_protected; ! 10052: int via_virtual = (TREE_PURPOSE (binfo) == (tree)visibility_private_virtual ! 10053: || TREE_PURPOSE (binfo) == (tree)visibility_public_virtual ! 10054: || TREE_PURPOSE (binfo) == (tree)visibility_default_virtual); ! 10055: tree basetype = TREE_TYPE (TREE_VALUE (binfo)); ! 10056: tree base_binfo; ! 10057: ! 10058: GNU_xref_hier (IDENTIFIER_POINTER (name), ! 10059: IDENTIFIER_POINTER (TREE_VALUE (binfo)), ! 10060: via_public, via_virtual, 0); ! 10061: ! 10062: if (basetype && TREE_CODE (basetype) == TYPE_DECL) ! 10063: basetype = TREE_TYPE (basetype); ! 10064: if (!basetype || TREE_CODE (basetype) != RECORD_TYPE) ! 10065: { ! 10066: error ("base type `%s' fails to be a struct or class type", ! 10067: IDENTIFIER_POINTER (TREE_VALUE (binfo))); ! 10068: continue; ! 10069: } ! 10070: #if 1 ! 10071: /* This code replaces similar code in layout_basetypes. */ ! 10072: else if (TYPE_SIZE (basetype) == NULL_TREE) ! 10073: { ! 10074: cp_error ("base class `%T' has incomplete type", basetype); ! 10075: continue; ! 10076: } ! 10077: #endif ! 10078: else ! 10079: { ! 10080: if (CLASSTYPE_MARKED (basetype)) ! 10081: { ! 10082: if (basetype == ref) ! 10083: cp_error ("recursive type `%T' undefined", basetype); ! 10084: else ! 10085: cp_error ("duplicate base type `%T' invalid", basetype); ! 10086: continue; ! 10087: } ! 10088: ! 10089: /* Note that the BINFO records which describe individual ! 10090: inheritances are *not* shared in the lattice! They ! 10091: cannot be shared because a given baseclass may be ! 10092: inherited with different `accessibility' by different ! 10093: derived classes. (Each BINFO record describing an ! 10094: individual inheritance contains flags which say what ! 10095: the `accessibility' of that particular inheritance is.) */ ! 10096: ! 10097: base_binfo = make_binfo (integer_zero_node, basetype, ! 10098: TYPE_BINFO_VTABLE (basetype), ! 10099: TYPE_BINFO_VIRTUALS (basetype), 0); ! 10100: ! 10101: TREE_VEC_ELT (binfos, i) = base_binfo; ! 10102: TREE_VIA_PUBLIC (base_binfo) = via_public; ! 10103: TREE_VIA_PROTECTED (base_binfo) = via_protected; ! 10104: TREE_VIA_VIRTUAL (base_binfo) = via_virtual; ! 10105: ! 10106: SET_CLASSTYPE_MARKED (basetype); ! 10107: #if 0 ! 10108: /* XYZZY TEST VIRTUAL BASECLASSES */ ! 10109: if (CLASSTYPE_N_BASECLASSES (basetype) == NULL_TREE ! 10110: && TYPE_HAS_DEFAULT_CONSTRUCTOR (basetype) ! 10111: && via_virtual == 0) ! 10112: { ! 10113: warning ("making type `%s' a virtual baseclass", ! 10114: TYPE_NAME_STRING (basetype)); ! 10115: via_virtual = 1; ! 10116: } ! 10117: #endif ! 10118: /* We are free to modify these bits because they are meaningless ! 10119: at top level, and BASETYPE is a top-level type. */ ! 10120: if (via_virtual || TYPE_USES_VIRTUAL_BASECLASSES (basetype)) ! 10121: { ! 10122: TYPE_USES_VIRTUAL_BASECLASSES (ref) = 1; ! 10123: TYPE_USES_COMPLEX_INHERITANCE (ref) = 1; ! 10124: } ! 10125: ! 10126: TYPE_GETS_ASSIGNMENT (ref) |= TYPE_GETS_ASSIGNMENT (basetype); ! 10127: TYPE_OVERLOADS_METHOD_CALL_EXPR (ref) |= TYPE_OVERLOADS_METHOD_CALL_EXPR (basetype); ! 10128: TREE_GETS_NEW (ref) |= TREE_GETS_NEW (basetype); ! 10129: TREE_GETS_DELETE (ref) |= TREE_GETS_DELETE (basetype); ! 10130: CLASSTYPE_LOCAL_TYPEDECLS (ref) |= CLASSTYPE_LOCAL_TYPEDECLS (basetype); ! 10131: i += 1; ! 10132: } ! 10133: } ! 10134: if (i) ! 10135: TREE_VEC_LENGTH (binfos) = i; ! 10136: else ! 10137: BINFO_BASETYPES (TYPE_BINFO (ref)) = NULL_TREE; ! 10138: ! 10139: if (i > 1) ! 10140: TYPE_USES_MULTIPLE_INHERITANCE (ref) = 1; ! 10141: else if (i == 1) ! 10142: TYPE_USES_MULTIPLE_INHERITANCE (ref) ! 10143: = TYPE_USES_MULTIPLE_INHERITANCE (BINFO_TYPE (TREE_VEC_ELT (binfos, 0))); ! 10144: if (TYPE_USES_MULTIPLE_INHERITANCE (ref)) ! 10145: TYPE_USES_COMPLEX_INHERITANCE (ref) = 1; ! 10146: ! 10147: /* Unmark all the types. */ ! 10148: while (--i >= 0) ! 10149: CLEAR_CLASSTYPE_MARKED (BINFO_TYPE (TREE_VEC_ELT (binfos, i))); ! 10150: CLEAR_CLASSTYPE_MARKED (ref); ! 10151: } ! 10152: ! 10153: just_return: ! 10154: ! 10155: /* Until the type is defined, tentatively accept whatever ! 10156: structure tag the user hands us. */ ! 10157: if (TYPE_SIZE (ref) == NULL_TREE ! 10158: && ref != current_class_type ! 10159: /* Have to check this, in case we have contradictory tag info. */ ! 10160: && IS_AGGR_TYPE_CODE (TREE_CODE (ref))) ! 10161: { ! 10162: if (tag_code == class_type) ! 10163: CLASSTYPE_DECLARED_CLASS (ref) = 1; ! 10164: else if (tag_code == record_type) ! 10165: CLASSTYPE_DECLARED_CLASS (ref) = 0; ! 10166: } ! 10167: ! 10168: pop_obstacks (); ! 10169: ! 10170: return ref; ! 10171: } ! 10172: ! 10173: static tree current_local_enum = NULL_TREE; ! 10174: ! 10175: /* Begin compiling the definition of an enumeration type. ! 10176: NAME is its name (or null if anonymous). ! 10177: Returns the type object, as yet incomplete. ! 10178: Also records info about it so that build_enumerator ! 10179: may be used to declare the individual values as they are read. */ ! 10180: ! 10181: tree ! 10182: start_enum (name) ! 10183: tree name; ! 10184: { ! 10185: register tree enumtype = NULL_TREE; ! 10186: struct binding_level *b ! 10187: = (class_binding_level ? class_binding_level : current_binding_level); ! 10188: ! 10189: /* If this is the real definition for a previous forward reference, ! 10190: fill in the contents in the same object that used to be the ! 10191: forward reference. */ ! 10192: ! 10193: if (name != NULL_TREE) ! 10194: enumtype = lookup_tag (ENUMERAL_TYPE, name, b, 1); ! 10195: ! 10196: if (enumtype != NULL_TREE && TREE_CODE (enumtype) == ENUMERAL_TYPE) ! 10197: cp_error ("multiple definition of enum `%T'", enumtype); ! 10198: else ! 10199: { ! 10200: enumtype = make_node (ENUMERAL_TYPE); ! 10201: pushtag (name, enumtype); ! 10202: } ! 10203: ! 10204: if (current_class_type) ! 10205: TREE_ADDRESSABLE (b->tags) = 1; ! 10206: current_local_enum = NULL_TREE; ! 10207: ! 10208: if (TYPE_VALUES (enumtype) != NULL_TREE) ! 10209: /* Completely replace its old definition. ! 10210: The old enumerators remain defined, however. */ ! 10211: TYPE_VALUES (enumtype) = NULL_TREE; ! 10212: ! 10213: /* Initially, set up this enum as like `int' ! 10214: so that we can create the enumerators' declarations and values. ! 10215: Later on, the precision of the type may be changed and ! 10216: it may be laid out again. */ ! 10217: ! 10218: TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node); ! 10219: TYPE_SIZE (enumtype) = NULL_TREE; ! 10220: fixup_unsigned_type (enumtype); ! 10221: ! 10222: /* We copy this value because enumerated type constants ! 10223: are really of the type of the enumerator, not integer_type_node. */ ! 10224: enum_next_value = copy_node (integer_zero_node); ! 10225: ! 10226: GNU_xref_decl (current_function_decl, enumtype); ! 10227: return enumtype; ! 10228: } ! 10229: ! 10230: /* After processing and defining all the values of an enumeration type, ! 10231: install their decls in the enumeration type and finish it off. ! 10232: ENUMTYPE is the type object and VALUES a list of name-value pairs. ! 10233: Returns ENUMTYPE. */ ! 10234: ! 10235: tree ! 10236: finish_enum (enumtype, values) ! 10237: register tree enumtype, values; ! 10238: { ! 10239: register tree pair, tem; ! 10240: register HOST_WIDE_INT maxvalue = 0; ! 10241: register HOST_WIDE_INT minvalue = 0; ! 10242: register HOST_WIDE_INT i; ! 10243: ! 10244: TYPE_VALUES (enumtype) = values; ! 10245: ! 10246: /* Calculate the maximum value of any enumerator in this type. */ ! 10247: ! 10248: if (values) ! 10249: { ! 10250: /* Speed up the main loop by performing some precalculations */ ! 10251: ! 10252: HOST_WIDE_INT value = TREE_INT_CST_LOW (TREE_VALUE (values)); ! 10253: TREE_TYPE (TREE_VALUE (values)) = enumtype; ! 10254: minvalue = maxvalue = value; ! 10255: ! 10256: for (pair = TREE_CHAIN (values); pair; pair = TREE_CHAIN (pair)) ! 10257: { ! 10258: value = TREE_INT_CST_LOW (TREE_VALUE (pair)); ! 10259: if (value > maxvalue) ! 10260: maxvalue = value; ! 10261: else if (value < minvalue) ! 10262: minvalue = value; ! 10263: TREE_TYPE (TREE_VALUE (pair)) = enumtype; ! 10264: } ! 10265: } ! 10266: ! 10267: if (flag_short_enums) ! 10268: { ! 10269: /* Determine the precision this type needs, lay it out, and define it. */ ! 10270: ! 10271: for (i = maxvalue; i; i >>= 1) ! 10272: TYPE_PRECISION (enumtype)++; ! 10273: ! 10274: if (!TYPE_PRECISION (enumtype)) ! 10275: TYPE_PRECISION (enumtype) = 1; ! 10276: ! 10277: /* Cancel the laying out previously done for the enum type, ! 10278: so that fixup_unsigned_type will do it over. */ ! 10279: TYPE_SIZE (enumtype) = NULL_TREE; ! 10280: ! 10281: fixup_unsigned_type (enumtype); ! 10282: } ! 10283: ! 10284: TREE_INT_CST_LOW (TYPE_MAX_VALUE (enumtype)) = maxvalue; ! 10285: ! 10286: /* An enum can have some negative values; then it is signed. */ ! 10287: if (minvalue < 0) ! 10288: { ! 10289: TREE_INT_CST_LOW (TYPE_MIN_VALUE (enumtype)) = minvalue; ! 10290: TREE_INT_CST_HIGH (TYPE_MIN_VALUE (enumtype)) = -1; ! 10291: TREE_UNSIGNED (enumtype) = 0; ! 10292: } ! 10293: if (flag_cadillac) ! 10294: cadillac_finish_enum (enumtype); ! 10295: ! 10296: /* Fix up all variant types of this enum type. */ ! 10297: for (tem = TYPE_MAIN_VARIANT (enumtype); tem; tem = TYPE_NEXT_VARIANT (tem)) ! 10298: { ! 10299: TYPE_VALUES (tem) = TYPE_VALUES (enumtype); ! 10300: TYPE_MIN_VALUE (tem) = TYPE_MIN_VALUE (enumtype); ! 10301: TYPE_MAX_VALUE (tem) = TYPE_MAX_VALUE (enumtype); ! 10302: TYPE_SIZE (tem) = TYPE_SIZE (enumtype); ! 10303: TYPE_MODE (tem) = TYPE_MODE (enumtype); ! 10304: TYPE_PRECISION (tem) = TYPE_PRECISION (enumtype); ! 10305: TYPE_ALIGN (tem) = TYPE_ALIGN (enumtype); ! 10306: TREE_UNSIGNED (tem) = TREE_UNSIGNED (enumtype); ! 10307: } ! 10308: ! 10309: /* Finish debugging output for this type. */ ! 10310: #if 0 ! 10311: /* @@ Do we ever generate generate ENUMERAL_TYPE nodes for which debugging ! 10312: information should *not* be generated? I think not. */ ! 10313: if (! DECL_IGNORED_P (TYPE_NAME (enumtype))) ! 10314: #endif ! 10315: rest_of_type_compilation (enumtype, global_bindings_p ()); ! 10316: ! 10317: return enumtype; ! 10318: } ! 10319: ! 10320: /* Build and install a CONST_DECL for one value of the ! 10321: current enumeration type (one that was begun with start_enum). ! 10322: Return a tree-list containing the name and its value. ! 10323: Assignment of sequential values by default is handled here. */ ! 10324: ! 10325: tree ! 10326: build_enumerator (name, value) ! 10327: tree name, value; ! 10328: { ! 10329: tree decl, result; ! 10330: /* Change this to zero if we find VALUE is not shareable. */ ! 10331: int shareable = 1; ! 10332: ! 10333: /* Remove no-op casts from the value. */ ! 10334: if (value) ! 10335: STRIP_TYPE_NOPS (value); ! 10336: ! 10337: /* Validate and default VALUE. */ ! 10338: if (value != NULL_TREE) ! 10339: { ! 10340: if (TREE_READONLY_DECL_P (value)) ! 10341: { ! 10342: value = decl_constant_value (value); ! 10343: shareable = 0; ! 10344: } ! 10345: ! 10346: if (TREE_CODE (value) == INTEGER_CST) ! 10347: { ! 10348: value = default_conversion (value); ! 10349: constant_expression_warning (value); ! 10350: } ! 10351: else ! 10352: { ! 10353: error ("enumerator value for `%s' not integer constant", ! 10354: IDENTIFIER_POINTER (name)); ! 10355: value = NULL_TREE; ! 10356: } ! 10357: } ! 10358: ! 10359: /* The order of things is reversed here so that we ! 10360: can check for possible sharing of enum values, ! 10361: to keep that from happening. */ ! 10362: /* Default based on previous value. */ ! 10363: if (value == NULL_TREE) ! 10364: value = enum_next_value; ! 10365: ! 10366: /* Remove no-op casts from the value. */ ! 10367: if (value) ! 10368: STRIP_TYPE_NOPS (value); ! 10369: ! 10370: /* Make up for hacks in cp-lex.c. */ ! 10371: if (value == integer_zero_node) ! 10372: value = build_int_2 (0, 0); ! 10373: else if (value == integer_one_node) ! 10374: value = build_int_2 (1, 0); ! 10375: else if (TREE_CODE (value) == INTEGER_CST ! 10376: && (shareable == 0 ! 10377: || TREE_CODE (TREE_TYPE (value)) == ENUMERAL_TYPE)) ! 10378: { ! 10379: value = copy_node (value); ! 10380: TREE_TYPE (value) = integer_type_node; ! 10381: } ! 10382: ! 10383: result = saveable_tree_cons (name, value, NULL_TREE); ! 10384: ! 10385: /* C++ associates enums with global, function, or class declarations. */ ! 10386: ! 10387: /* There are a number of cases we need to be aware of here: ! 10388: current_class_type current_function_decl ! 10389: * global enums NULL NULL ! 10390: * fn-local enum NULL SET ! 10391: * class-local enum SET NULL ! 10392: * class->fn->enum SET SET ! 10393: * fn->class->enum SET SET ! 10394: ! 10395: Those last two make life interesting. If it's a fn-local enum which is ! 10396: itself inside a class, we need the enum to go into the fn's decls (our ! 10397: second case below). But if it's a class-local enum and the class itself ! 10398: is inside a function, we need that enum to go into the decls for the ! 10399: class. To achieve this last goal, we must see if, when both ! 10400: current_class_decl and current_function_decl are set, the class was ! 10401: declared inside that function. If so, we know to put the enum into ! 10402: the class's scope. */ ! 10403: ! 10404: if ((current_class_type && ! current_function_decl) ! 10405: || (current_class_type && current_function_decl ! 10406: && TYPE_CONTEXT (current_class_type) == current_function_decl)) ! 10407: { ! 10408: /* This enum declaration is local to the class, so we must put ! 10409: it in that class's list of decls. */ ! 10410: decl = build_lang_field_decl (CONST_DECL, name, integer_type_node); ! 10411: DECL_INITIAL (decl) = value; ! 10412: TREE_READONLY (decl) = 1; ! 10413: pushdecl_class_level (decl); ! 10414: TREE_CHAIN (decl) = current_local_enum; ! 10415: current_local_enum = decl; ! 10416: } ! 10417: else ! 10418: { ! 10419: /* It's a global enum, or it's local to a function. (Note local to ! 10420: a function could mean local to a class method. */ ! 10421: decl = build_decl (CONST_DECL, name, integer_type_node); ! 10422: DECL_INITIAL (decl) = value; ! 10423: ! 10424: pushdecl (decl); ! 10425: GNU_xref_decl (current_function_decl, decl); ! 10426: } ! 10427: ! 10428: /* Set basis for default for next value. */ ! 10429: enum_next_value = build_binary_op_nodefault (PLUS_EXPR, value, ! 10430: integer_one_node, PLUS_EXPR); ! 10431: if (enum_next_value == integer_one_node) ! 10432: enum_next_value = copy_node (enum_next_value); ! 10433: ! 10434: return result; ! 10435: } ! 10436: ! 10437: tree ! 10438: grok_enum_decls (type, decl) ! 10439: tree type, decl; ! 10440: { ! 10441: tree d = current_local_enum; ! 10442: ! 10443: if (d == NULL_TREE) ! 10444: return decl; ! 10445: ! 10446: while (1) ! 10447: { ! 10448: TREE_TYPE (d) = type; ! 10449: if (TREE_CHAIN (d) == NULL_TREE) ! 10450: { ! 10451: TREE_CHAIN (d) = decl; ! 10452: break; ! 10453: } ! 10454: d = TREE_CHAIN (d); ! 10455: } ! 10456: ! 10457: decl = current_local_enum; ! 10458: current_local_enum = NULL_TREE; ! 10459: ! 10460: return decl; ! 10461: } ! 10462: ! 10463: /* Create the FUNCTION_DECL for a function definition. ! 10464: DECLSPECS and DECLARATOR are the parts of the declaration; ! 10465: they describe the function's name and the type it returns, ! 10466: but twisted together in a fashion that parallels the syntax of C. ! 10467: ! 10468: This function creates a binding context for the function body ! 10469: as well as setting up the FUNCTION_DECL in current_function_decl. ! 10470: ! 10471: Returns 1 on success. If the DECLARATOR is not suitable for a function ! 10472: (it defines a datum instead), we return 0, which tells ! 10473: yyparse to report a parse error. ! 10474: ! 10475: For C++, we must first check whether that datum makes any sense. ! 10476: For example, "class A local_a(1,2);" means that variable local_a ! 10477: is an aggregate of type A, which should have a constructor ! 10478: applied to it with the argument list [1, 2]. ! 10479: ! 10480: @@ There is currently no way to retrieve the storage ! 10481: @@ allocated to FUNCTION (or all of its parms) if we return ! 10482: @@ something we had previously. */ ! 10483: ! 10484: int ! 10485: start_function (declspecs, declarator, raises, pre_parsed_p) ! 10486: tree declarator, declspecs, raises; ! 10487: int pre_parsed_p; ! 10488: { ! 10489: extern tree EHS_decl; ! 10490: tree decl1, olddecl; ! 10491: tree ctype = NULL_TREE; ! 10492: tree fntype; ! 10493: tree restype; ! 10494: extern int have_extern_spec; ! 10495: extern int used_extern_spec; ! 10496: int doing_friend = 0; ! 10497: ! 10498: if (flag_handle_exceptions && EHS_decl == NULL_TREE) ! 10499: init_exception_processing_1 (); ! 10500: ! 10501: /* Sanity check. */ ! 10502: my_friendly_assert (TREE_VALUE (void_list_node) == void_type_node, 160); ! 10503: my_friendly_assert (TREE_CHAIN (void_list_node) == NULL_TREE, 161); ! 10504: ! 10505: /* Assume, until we see it does. */ ! 10506: current_function_returns_value = 0; ! 10507: current_function_returns_null = 0; ! 10508: warn_about_return_type = 0; ! 10509: current_extern_inline = 0; ! 10510: current_function_assigns_this = 0; ! 10511: current_function_just_assigned_this = 0; ! 10512: current_function_parms_stored = 0; ! 10513: original_result_rtx = NULL_RTX; ! 10514: current_function_obstack_index = 0; ! 10515: current_function_obstack_usage = 0; ! 10516: ! 10517: clear_temp_name (); ! 10518: ! 10519: /* This should only be done once on the top most decl. */ ! 10520: if (have_extern_spec && !used_extern_spec) ! 10521: { ! 10522: declspecs = decl_tree_cons (NULL_TREE, get_identifier ("extern"), declspecs); ! 10523: used_extern_spec = 1; ! 10524: } ! 10525: ! 10526: if (pre_parsed_p) ! 10527: { ! 10528: decl1 = declarator; ! 10529: ! 10530: if (! DECL_ARGUMENTS (decl1) ! 10531: && !DECL_STATIC_FUNCTION_P (decl1) ! 10532: && DECL_CONTEXT (decl1) ! 10533: && DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl1))) ! 10534: && IDENTIFIER_TEMPLATE (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl1))))) ! 10535: { ! 10536: cp_error ("redeclaration of `%#D'", decl1); ! 10537: if (IDENTIFIER_CLASS_VALUE (DECL_NAME (decl1))) ! 10538: cp_error_at ("previous declaration here", IDENTIFIER_CLASS_VALUE (DECL_NAME (decl1))); ! 10539: else if (IDENTIFIER_GLOBAL_VALUE (DECL_NAME (decl1))) ! 10540: cp_error_at ("previous declaration here", IDENTIFIER_GLOBAL_VALUE (DECL_NAME (decl1))); ! 10541: } ! 10542: ! 10543: last_function_parms = DECL_ARGUMENTS (decl1); ! 10544: last_function_parm_tags = NULL_TREE; ! 10545: fntype = TREE_TYPE (decl1); ! 10546: if (TREE_CODE (fntype) == METHOD_TYPE) ! 10547: ctype = TYPE_METHOD_BASETYPE (fntype); ! 10548: ! 10549: /* ANSI C++ June 5 1992 WP 11.4.5. A friend function defined in a ! 10550: class is in the (lexical) scope of the class in which it is ! 10551: defined. */ ! 10552: if (!ctype && DECL_FRIEND_P (decl1)) ! 10553: { ! 10554: ctype = TREE_TYPE (TREE_CHAIN (decl1)); ! 10555: ! 10556: /* CTYPE could be null here if we're dealing with a template; ! 10557: for example, `inline friend float foo()' inside a template ! 10558: will have no CTYPE set. */ ! 10559: if (ctype && TREE_CODE (ctype) != RECORD_TYPE) ! 10560: ctype = NULL_TREE; ! 10561: else ! 10562: doing_friend = 1; ! 10563: } ! 10564: ! 10565: if ( !(DECL_VINDEX (decl1) ! 10566: && write_virtuals >= 2 ! 10567: && CLASSTYPE_VTABLE_NEEDS_WRITING (ctype))) ! 10568: current_extern_inline = TREE_PUBLIC (decl1) && DECL_INLINE (decl1); ! 10569: ! 10570: raises = TYPE_RAISES_EXCEPTIONS (fntype); ! 10571: ! 10572: /* In a fcn definition, arg types must be complete. */ ! 10573: require_complete_types_for_parms (last_function_parms); ! 10574: } ! 10575: else ! 10576: { ! 10577: decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1, raises); ! 10578: /* If the declarator is not suitable for a function definition, ! 10579: cause a syntax error. */ ! 10580: if (decl1 == NULL_TREE || TREE_CODE (decl1) != FUNCTION_DECL) return 0; ! 10581: ! 10582: fntype = TREE_TYPE (decl1); ! 10583: ! 10584: restype = TREE_TYPE (fntype); ! 10585: if (IS_AGGR_TYPE (restype) && ! TYPE_PTRMEMFUNC_P (restype) ! 10586: && ! CLASSTYPE_GOT_SEMICOLON (restype)) ! 10587: { ! 10588: cp_error ("semicolon missing after declaration of `%#T'", restype); ! 10589: shadow_tag (build_tree_list (NULL_TREE, restype)); ! 10590: CLASSTYPE_GOT_SEMICOLON (restype) = 1; ! 10591: if (TREE_CODE (fntype) == FUNCTION_TYPE) ! 10592: fntype = build_function_type (integer_type_node, ! 10593: TYPE_ARG_TYPES (fntype)); ! 10594: else ! 10595: fntype = build_cplus_method_type (build_type_variant (TYPE_METHOD_BASETYPE (fntype), TREE_READONLY (decl1), TREE_SIDE_EFFECTS (decl1)), ! 10596: integer_type_node, ! 10597: TYPE_ARG_TYPES (fntype)); ! 10598: TREE_TYPE (decl1) = fntype; ! 10599: } ! 10600: ! 10601: if (TREE_CODE (fntype) == METHOD_TYPE) ! 10602: ctype = TYPE_METHOD_BASETYPE (fntype); ! 10603: else if (IDENTIFIER_LENGTH (DECL_NAME (decl1)) == 4 ! 10604: && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (decl1)), "main") ! 10605: && DECL_CONTEXT (decl1) == NULL_TREE) ! 10606: { ! 10607: /* If this doesn't return integer_type, complain. */ ! 10608: if (TREE_TYPE (TREE_TYPE (decl1)) != integer_type_node) ! 10609: { ! 10610: warning ("return type for `main' changed to integer type"); ! 10611: TREE_TYPE (decl1) = fntype = default_function_type; ! 10612: } ! 10613: warn_about_return_type = 0; ! 10614: } ! 10615: } ! 10616: ! 10617: /* Warn if function was previously implicitly declared ! 10618: (but not if we warned then). */ ! 10619: if (! warn_implicit ! 10620: && IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1)) != NULL_TREE) ! 10621: cp_warning_at ("`%D' implicitly declared before its definition", IDENTIFIER_IMPLICIT_DECL (DECL_NAME (decl1))); ! 10622: ! 10623: current_function_decl = decl1; ! 10624: ! 10625: if (flag_cadillac) ! 10626: cadillac_start_function (decl1); ! 10627: else ! 10628: announce_function (decl1); ! 10629: ! 10630: if (TYPE_SIZE (TREE_TYPE (fntype)) == NULL_TREE) ! 10631: { ! 10632: if (IS_AGGR_TYPE (TREE_TYPE (fntype))) ! 10633: error_with_aggr_type (TREE_TYPE (fntype), ! 10634: "return-type `%s' is an incomplete type"); ! 10635: else ! 10636: error ("return-type is an incomplete type"); ! 10637: ! 10638: /* Make it return void instead, but don't change the ! 10639: type of the DECL_RESULT, in case we have a named return value. */ ! 10640: if (ctype) ! 10641: TREE_TYPE (decl1) ! 10642: = build_cplus_method_type (build_type_variant (ctype, ! 10643: TREE_READONLY (decl1), ! 10644: TREE_SIDE_EFFECTS (decl1)), ! 10645: void_type_node, ! 10646: FUNCTION_ARG_CHAIN (decl1)); ! 10647: else ! 10648: TREE_TYPE (decl1) ! 10649: = build_function_type (void_type_node, ! 10650: TYPE_ARG_TYPES (TREE_TYPE (decl1))); ! 10651: DECL_RESULT (decl1) = build_decl (RESULT_DECL, 0, TREE_TYPE (fntype)); ! 10652: } ! 10653: ! 10654: if (warn_about_return_type) ! 10655: warning ("return-type defaults to `int'"); ! 10656: ! 10657: /* Make the init_value nonzero so pushdecl knows this is not tentative. ! 10658: error_mark_node is replaced below (in poplevel) with the BLOCK. */ ! 10659: DECL_INITIAL (decl1) = error_mark_node; ! 10660: ! 10661: /* Didn't get anything from C. */ ! 10662: olddecl = NULL_TREE; ! 10663: ! 10664: /* This function exists in static storage. ! 10665: (This does not mean `static' in the C sense!) */ ! 10666: TREE_STATIC (decl1) = 1; ! 10667: ! 10668: /* If this function belongs to an interface, it is public. ! 10669: If it belongs to someone else's interface, it is also external. ! 10670: It doesn't matter whether it's inline or not. */ ! 10671: if (interface_unknown == 0) ! 10672: { ! 10673: TREE_PUBLIC (decl1) = 1; ! 10674: DECL_EXTERNAL (decl1) = (interface_only ! 10675: || (DECL_INLINE (decl1) ! 10676: && ! flag_implement_inlines)); ! 10677: } ! 10678: else ! 10679: /* This is a definition, not a reference. ! 10680: So normally clear DECL_EXTERNAL. ! 10681: However, `extern inline' acts like a declaration except for ! 10682: defining how to inline. So set DECL_EXTERNAL in that case. */ ! 10683: DECL_EXTERNAL (decl1) = current_extern_inline; ! 10684: ! 10685: /* Now see if this is the implementation of a declared function. */ ! 10686: if (ctype == NULL_TREE && current_lang_name == lang_name_cplusplus ! 10687: && !DECL_CONTEXT (decl1)) ! 10688: { ! 10689: olddecl = lookup_name_current_level (DECL_NAME (decl1)); ! 10690: if (olddecl && TREE_CODE (olddecl) != FUNCTION_DECL) ! 10691: olddecl = NULL_TREE; ! 10692: if (olddecl && DECL_NAME (decl1) != DECL_NAME (olddecl)) ! 10693: { ! 10694: /* Collision between user and internal naming scheme. */ ! 10695: olddecl = lookup_name_current_level (DECL_ASSEMBLER_NAME (decl1)); ! 10696: if (olddecl == NULL_TREE) ! 10697: olddecl = decl1; ! 10698: } ! 10699: if (olddecl && olddecl != decl1 ! 10700: && DECL_NAME (decl1) == DECL_NAME (olddecl)) ! 10701: { ! 10702: if (TREE_CODE (olddecl) == FUNCTION_DECL ! 10703: && decls_match (decl1, olddecl)) ! 10704: { ! 10705: olddecl = DECL_MAIN_VARIANT (olddecl); ! 10706: /* The following copy is needed to handle forcing a function's ! 10707: linkage to obey the linkage of the original decl. */ ! 10708: DECL_ASSEMBLER_NAME (decl1) = DECL_ASSEMBLER_NAME (olddecl); ! 10709: DECL_OVERLOADED (decl1) = DECL_OVERLOADED (olddecl); ! 10710: if (! DECL_BUILT_IN (olddecl) && DECL_INITIAL (olddecl)) ! 10711: redeclaration_error_message (decl1, olddecl); ! 10712: if (duplicate_decls (decl1, olddecl)) ! 10713: decl1 = olddecl; ! 10714: else ! 10715: olddecl = NULL_TREE; ! 10716: } ! 10717: else ! 10718: olddecl = NULL_TREE; ! 10719: } ! 10720: } ! 10721: ! 10722: /* Record the decl so that the function name is defined. ! 10723: If we already have a decl for this name, and it is a FUNCTION_DECL, ! 10724: use the old decl. */ ! 10725: ! 10726: if (olddecl) ! 10727: current_function_decl = olddecl; ! 10728: else if (pre_parsed_p == 0) ! 10729: { ! 10730: current_function_decl = pushdecl (decl1); ! 10731: if (TREE_CODE (current_function_decl) == TREE_LIST) ! 10732: { ! 10733: /* @@ revert to modified original declaration. */ ! 10734: decl1 = DECL_MAIN_VARIANT (decl1); ! 10735: current_function_decl = decl1; ! 10736: } ! 10737: else ! 10738: { ! 10739: decl1 = current_function_decl; ! 10740: DECL_MAIN_VARIANT (decl1) = decl1; ! 10741: } ! 10742: fntype = TREE_TYPE (decl1); ! 10743: } ! 10744: else ! 10745: current_function_decl = decl1; ! 10746: ! 10747: if (DECL_OVERLOADED (decl1)) ! 10748: decl1 = push_overloaded_decl (decl1, 1); ! 10749: ! 10750: if (ctype != NULL_TREE && DECL_STATIC_FUNCTION_P (decl1)) ! 10751: { ! 10752: if (TREE_CODE (fntype) == METHOD_TYPE) ! 10753: TREE_TYPE (decl1) = fntype ! 10754: = build_function_type (TREE_TYPE (fntype), ! 10755: TREE_CHAIN (TYPE_ARG_TYPES (fntype))); ! 10756: last_function_parms = TREE_CHAIN (last_function_parms); ! 10757: DECL_ARGUMENTS (decl1) = last_function_parms; ! 10758: ctype = NULL_TREE; ! 10759: } ! 10760: restype = TREE_TYPE (fntype); ! 10761: ! 10762: pushlevel (0); ! 10763: current_binding_level->parm_flag = 1; ! 10764: ! 10765: /* Save the parm names or decls from this function's declarator ! 10766: where store_parm_decls will find them. */ ! 10767: current_function_parms = last_function_parms; ! 10768: current_function_parm_tags = last_function_parm_tags; ! 10769: ! 10770: GNU_xref_function (decl1, current_function_parms); ! 10771: ! 10772: make_function_rtl (decl1); ! 10773: ! 10774: if (ctype) ! 10775: { ! 10776: #if NEW_CLASS_SCOPING ! 10777: push_nested_class (ctype, 1); ! 10778: #else ! 10779: pushclass (ctype, 1); ! 10780: #endif ! 10781: ! 10782: /* If we're compiling a friend function, neither of the variables ! 10783: current_class_decl nor current_class_type will have values. */ ! 10784: if (! doing_friend) ! 10785: { ! 10786: /* We know that this was set up by `grokclassfn'. ! 10787: We do not wait until `store_parm_decls', since evil ! 10788: parse errors may never get us to that point. Here ! 10789: we keep the consistency between `current_class_type' ! 10790: and `current_class_decl'. */ ! 10791: current_class_decl = last_function_parms; ! 10792: my_friendly_assert (current_class_decl != NULL_TREE ! 10793: && TREE_CODE (current_class_decl) == PARM_DECL, 162); ! 10794: if (TREE_CODE (TREE_TYPE (current_class_decl)) == POINTER_TYPE) ! 10795: { ! 10796: tree variant = TREE_TYPE (TREE_TYPE (current_class_decl)); ! 10797: if (CLASSTYPE_INST_VAR (ctype) == NULL_TREE) ! 10798: { ! 10799: /* Can't call build_indirect_ref here, because it has special ! 10800: logic to return C_C_D given this argument. */ ! 10801: C_C_D = build1 (INDIRECT_REF, current_class_type, current_class_decl); ! 10802: CLASSTYPE_INST_VAR (ctype) = C_C_D; ! 10803: } ! 10804: else ! 10805: { ! 10806: C_C_D = CLASSTYPE_INST_VAR (ctype); ! 10807: /* `current_class_decl' is different for every ! 10808: function we compile. */ ! 10809: TREE_OPERAND (C_C_D, 0) = current_class_decl; ! 10810: } ! 10811: TREE_READONLY (C_C_D) = TYPE_READONLY (variant); ! 10812: TREE_SIDE_EFFECTS (C_C_D) = TYPE_VOLATILE (variant); ! 10813: TREE_THIS_VOLATILE (C_C_D) = TYPE_VOLATILE (variant); ! 10814: } ! 10815: else ! 10816: C_C_D = current_class_decl; ! 10817: } ! 10818: } ! 10819: else ! 10820: { ! 10821: if (DECL_STATIC_FUNCTION_P (decl1)) ! 10822: #if NEW_CLASS_SCOPING ! 10823: push_nested_class (DECL_CONTEXT (decl1), 2); ! 10824: #else ! 10825: pushclass (DECL_CONTEXT (decl1), 2); ! 10826: #endif ! 10827: else ! 10828: push_memoized_context (0, 1); ! 10829: } ! 10830: ! 10831: /* Allocate further tree nodes temporarily during compilation ! 10832: of this function only. Tiemann moved up here from bottom of fn. */ ! 10833: temporary_allocation (); ! 10834: ! 10835: /* Promote the value to int before returning it. */ ! 10836: if (C_PROMOTING_INTEGER_TYPE_P (restype)) ! 10837: { ! 10838: /* It retains unsignedness if traditional or if it isn't ! 10839: really getting wider. */ ! 10840: if (TREE_UNSIGNED (restype) ! 10841: && (flag_traditional ! 10842: || TYPE_PRECISION (restype) ! 10843: == TYPE_PRECISION (integer_type_node))) ! 10844: restype = unsigned_type_node; ! 10845: else ! 10846: restype = integer_type_node; ! 10847: } ! 10848: if (DECL_RESULT (decl1) == NULL_TREE) ! 10849: DECL_RESULT (decl1) = build_decl (RESULT_DECL, 0, restype); ! 10850: ! 10851: if (DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl1))) ! 10852: { ! 10853: dtor_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); ! 10854: ctor_label = NULL_TREE; ! 10855: } ! 10856: else ! 10857: { ! 10858: dtor_label = NULL_TREE; ! 10859: if (DECL_CONSTRUCTOR_P (decl1)) ! 10860: ctor_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); ! 10861: } ! 10862: ! 10863: /* If this fcn was already referenced via a block-scope `extern' decl ! 10864: (or an implicit decl), propagate certain information about the usage. */ ! 10865: if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (decl1))) ! 10866: TREE_ADDRESSABLE (decl1) = 1; ! 10867: ! 10868: return 1; ! 10869: } ! 10870: ! 10871: /* Store the parameter declarations into the current function declaration. ! 10872: This is called after parsing the parameter declarations, before ! 10873: digesting the body of the function. ! 10874: ! 10875: Also install to binding contour return value identifier, if any. */ ! 10876: ! 10877: void ! 10878: store_parm_decls () ! 10879: { ! 10880: register tree fndecl = current_function_decl; ! 10881: register tree parm; ! 10882: int parms_have_cleanups = 0; ! 10883: tree eh_decl; ! 10884: ! 10885: /* This is either a chain of PARM_DECLs (when a prototype is used). */ ! 10886: tree specparms = current_function_parms; ! 10887: ! 10888: /* This is a list of types declared among parms in a prototype. */ ! 10889: tree parmtags = current_function_parm_tags; ! 10890: ! 10891: /* This is a chain of any other decls that came in among the parm ! 10892: declarations. If a parm is declared with enum {foo, bar} x; ! 10893: then CONST_DECLs for foo and bar are put here. */ ! 10894: tree nonparms = NULL_TREE; ! 10895: ! 10896: if (current_binding_level == global_binding_level) ! 10897: fatal ("parse errors have confused me too much"); ! 10898: ! 10899: /* Initialize RTL machinery. */ ! 10900: init_function_start (fndecl, input_filename, lineno); ! 10901: ! 10902: /* Declare __FUNCTION__ and __PRETTY_FUNCTION__ for this function. */ ! 10903: declare_function_name (); ! 10904: ! 10905: /* Create a binding level for the parms. */ ! 10906: expand_start_bindings (0); ! 10907: ! 10908: /* Prepare to catch raises, if appropriate. */ ! 10909: if (flag_handle_exceptions) ! 10910: { ! 10911: /* Get this cleanup to be run last, since it ! 10912: is a call to `longjmp'. */ ! 10913: setup_exception_throw_decl (); ! 10914: eh_decl = current_binding_level->names; ! 10915: current_binding_level->names = TREE_CHAIN (current_binding_level->names); ! 10916: } ! 10917: if (flag_handle_exceptions) ! 10918: expand_start_try (integer_one_node, 0, 1); ! 10919: ! 10920: if (specparms != NULL_TREE) ! 10921: { ! 10922: /* This case is when the function was defined with an ANSI prototype. ! 10923: The parms already have decls, so we need not do anything here ! 10924: except record them as in effect ! 10925: and complain if any redundant old-style parm decls were written. */ ! 10926: ! 10927: register tree next; ! 10928: ! 10929: /* Must clear this because it might contain TYPE_DECLs declared ! 10930: at class level. */ ! 10931: storedecls (NULL_TREE); ! 10932: for (parm = nreverse (specparms); parm; parm = next) ! 10933: { ! 10934: next = TREE_CHAIN (parm); ! 10935: if (TREE_CODE (parm) == PARM_DECL) ! 10936: { ! 10937: tree cleanup = maybe_build_cleanup (parm); ! 10938: if (DECL_NAME (parm) == NULL_TREE) ! 10939: { ! 10940: #if 0 ! 10941: cp_error_at ("parameter name omitted", parm); ! 10942: #else ! 10943: /* for C++, this is not an error. */ ! 10944: pushdecl (parm); ! 10945: #endif ! 10946: } ! 10947: else if (TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == void_type_node) ! 10948: cp_error ("parameter `%D' declared void", parm); ! 10949: else ! 10950: { ! 10951: /* Now fill in DECL_REFERENCE_SLOT for any of the parm decls. ! 10952: A parameter is assumed not to have any side effects. ! 10953: If this should change for any reason, then this ! 10954: will have to wrap the bashed reference type in a save_expr. ! 10955: ! 10956: Also, if the parameter type is declared to be an X ! 10957: and there is an X(X&) constructor, we cannot lay it ! 10958: into the stack (any more), so we make this parameter ! 10959: look like it is really of reference type. Functions ! 10960: which pass parameters to this function will know to ! 10961: create a temporary in their frame, and pass a reference ! 10962: to that. */ ! 10963: ! 10964: if (TREE_CODE (TREE_TYPE (parm)) == REFERENCE_TYPE ! 10965: && TYPE_SIZE (TREE_TYPE (TREE_TYPE (parm)))) ! 10966: SET_DECL_REFERENCE_SLOT (parm, convert_from_reference (parm)); ! 10967: ! 10968: pushdecl (parm); ! 10969: } ! 10970: if (cleanup) ! 10971: { ! 10972: expand_decl (parm); ! 10973: expand_decl_cleanup (parm, cleanup); ! 10974: parms_have_cleanups = 1; ! 10975: } ! 10976: } ! 10977: else ! 10978: { ! 10979: /* If we find an enum constant or a type tag, ! 10980: put it aside for the moment. */ ! 10981: TREE_CHAIN (parm) = NULL_TREE; ! 10982: nonparms = chainon (nonparms, parm); ! 10983: } ! 10984: } ! 10985: ! 10986: /* Get the decls in their original chain order ! 10987: and record in the function. This is all and only the ! 10988: PARM_DECLs that were pushed into scope by the loop above. */ ! 10989: DECL_ARGUMENTS (fndecl) = getdecls (); ! 10990: ! 10991: storetags (chainon (parmtags, gettags ())); ! 10992: } ! 10993: else ! 10994: DECL_ARGUMENTS (fndecl) = NULL_TREE; ! 10995: ! 10996: /* Now store the final chain of decls for the arguments ! 10997: as the decl-chain of the current lexical scope. ! 10998: Put the enumerators in as well, at the front so that ! 10999: DECL_ARGUMENTS is not modified. */ ! 11000: ! 11001: storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl))); ! 11002: ! 11003: /* Initialize the RTL code for the function. */ ! 11004: DECL_SAVED_INSNS (fndecl) = NULL_RTX; ! 11005: expand_function_start (fndecl, parms_have_cleanups); ! 11006: ! 11007: if (flag_handle_exceptions) ! 11008: { ! 11009: /* Make the throw decl visible at this level, just ! 11010: not in the way of the parameters. */ ! 11011: pushdecl (eh_decl); ! 11012: expand_decl_init (eh_decl); ! 11013: } ! 11014: ! 11015: /* Create a binding contour which can be used to catch ! 11016: cleanup-generated temporaries. Also, if the return value needs or ! 11017: has initialization, deal with that now. */ ! 11018: if (parms_have_cleanups) ! 11019: { ! 11020: pushlevel (0); ! 11021: expand_start_bindings (0); ! 11022: } ! 11023: ! 11024: current_function_parms_stored = 1; ! 11025: ! 11026: if (flag_gc) ! 11027: { ! 11028: maybe_gc_cleanup = build_tree_list (NULL_TREE, error_mark_node); ! 11029: expand_decl_cleanup (NULL_TREE, maybe_gc_cleanup); ! 11030: } ! 11031: ! 11032: /* If this function is `main', emit a call to `__main' ! 11033: to run global initializers, etc. */ ! 11034: if (DECL_NAME (fndecl) ! 11035: && IDENTIFIER_LENGTH (DECL_NAME (fndecl)) == 4 ! 11036: && strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "main") == 0 ! 11037: && DECL_CONTEXT (fndecl) == NULL_TREE) ! 11038: { ! 11039: expand_main_function (); ! 11040: ! 11041: if (flag_gc) ! 11042: expand_expr (build_function_call (lookup_name (get_identifier ("__gc_main"), 0), NULL_TREE), ! 11043: 0, VOIDmode, 0); ! 11044: ! 11045: if (flag_dossier) ! 11046: output_builtin_tdesc_entries (); ! 11047: } ! 11048: } ! 11049: ! 11050: /* Bind a name and initialization to the return value of ! 11051: the current function. */ ! 11052: void ! 11053: store_return_init (return_id, init) ! 11054: tree return_id, init; ! 11055: { ! 11056: tree decl = DECL_RESULT (current_function_decl); ! 11057: ! 11058: if (pedantic) ! 11059: /* Give this error as many times as there are occurrences, ! 11060: so that users can use Emacs compilation buffers to find ! 11061: and fix all such places. */ ! 11062: error ("ANSI C++ does not permit named return values"); ! 11063: ! 11064: if (return_id != NULL_TREE) ! 11065: { ! 11066: if (DECL_NAME (decl) == NULL_TREE) ! 11067: { ! 11068: DECL_NAME (decl) = return_id; ! 11069: DECL_ASSEMBLER_NAME (decl) = return_id; ! 11070: } ! 11071: else ! 11072: error ("return identifier `%s' already in place", ! 11073: IDENTIFIER_POINTER (DECL_NAME (decl))); ! 11074: } ! 11075: ! 11076: /* Can't let this happen for constructors. */ ! 11077: if (DECL_CONSTRUCTOR_P (current_function_decl)) ! 11078: { ! 11079: error ("can't redefine default return value for constructors"); ! 11080: return; ! 11081: } ! 11082: ! 11083: /* If we have a named return value, put that in our scope as well. */ ! 11084: if (DECL_NAME (decl) != NULL_TREE) ! 11085: { ! 11086: /* If this named return value comes in a register, ! 11087: put it in a pseudo-register. */ ! 11088: if (DECL_REGISTER (decl)) ! 11089: { ! 11090: original_result_rtx = DECL_RTL (decl); ! 11091: DECL_RTL (decl) = gen_reg_rtx (DECL_MODE (decl)); ! 11092: } ! 11093: ! 11094: /* Let `finish_decl' know that this initializer is ok. */ ! 11095: DECL_INITIAL (decl) = init; ! 11096: pushdecl (decl); ! 11097: finish_decl (decl, init, 0, 0); ! 11098: } ! 11099: } ! 11100: ! 11101: /* Generate code for default X(X&) constructor. */ ! 11102: static void ! 11103: build_default_constructor (fndecl) ! 11104: tree fndecl; ! 11105: { ! 11106: int i = CLASSTYPE_N_BASECLASSES (current_class_type); ! 11107: tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl)); ! 11108: tree fields = TYPE_FIELDS (current_class_type); ! 11109: tree binfos = TYPE_BINFO_BASETYPES (current_class_type); ! 11110: ! 11111: if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)) ! 11112: parm = TREE_CHAIN (parm); ! 11113: parm = DECL_REFERENCE_SLOT (parm); ! 11114: ! 11115: while (--i >= 0) ! 11116: { ! 11117: tree basetype = TREE_VEC_ELT (binfos, i); ! 11118: if (TYPE_GETS_INIT_REF (basetype)) ! 11119: { ! 11120: tree name = TYPE_NAME (basetype); ! 11121: if (TREE_CODE (name) == TYPE_DECL) ! 11122: name = DECL_NAME (name); ! 11123: current_base_init_list = tree_cons (name, parm, current_base_init_list); ! 11124: } ! 11125: } ! 11126: for (; fields; fields = TREE_CHAIN (fields)) ! 11127: { ! 11128: tree name, init; ! 11129: if (TREE_STATIC (fields)) ! 11130: continue; ! 11131: if (TREE_CODE (fields) != FIELD_DECL) ! 11132: continue; ! 11133: if (DECL_NAME (fields)) ! 11134: { ! 11135: if (VFIELD_NAME_P (DECL_NAME (fields))) ! 11136: continue; ! 11137: if (VBASE_NAME_P (DECL_NAME (fields))) ! 11138: continue; ! 11139: ! 11140: /* True for duplicate members. */ ! 11141: if (IDENTIFIER_CLASS_VALUE (DECL_NAME (fields)) != fields) ! 11142: continue; ! 11143: } ! 11144: ! 11145: init = build (COMPONENT_REF, TREE_TYPE (fields), parm, fields); ! 11146: init = build_tree_list (NULL_TREE, init); ! 11147: ! 11148: current_member_init_list ! 11149: = tree_cons (DECL_NAME (fields), init, current_member_init_list); ! 11150: } ! 11151: } ! 11152: ! 11153: ! 11154: /* Get the binfo associated with the vfield. */ ! 11155: ! 11156: tree ! 11157: get_binfo_from_vfield (vfield) ! 11158: tree vfield; ! 11159: { ! 11160: if (VF_BINFO_VALUE (vfield)) ! 11161: return VF_BINFO_VALUE (vfield); ! 11162: /* Not sure where it is. maybe get_binfo on ! 11163: VF_BASETYPE_VALUE (vfield), VF_DERIVED_VALUE (vfield)... */ ! 11164: my_friendly_abort (350); ! 11165: return NULL_TREE; ! 11166: } ! 11167: ! 11168: /* Finish up a function declaration and compile that function ! 11169: all the way to assembler language output. The free the storage ! 11170: for the function definition. ! 11171: ! 11172: This is called after parsing the body of the function definition. ! 11173: LINENO is the current line number. ! 11174: ! 11175: C++: CALL_POPLEVEL is non-zero if an extra call to poplevel ! 11176: (and expand_end_bindings) must be made to take care of the binding ! 11177: contour for the base initializers. This is only relevant for ! 11178: constructors. */ ! 11179: ! 11180: void ! 11181: finish_function (lineno, call_poplevel) ! 11182: int lineno; ! 11183: int call_poplevel; ! 11184: { ! 11185: register tree fndecl = current_function_decl; ! 11186: tree fntype, ctype = NULL_TREE; ! 11187: rtx head, last_parm_insn, mark; ! 11188: extern int sets_exception_throw_decl; ! 11189: /* Label to use if this function is supposed to return a value. */ ! 11190: tree no_return_label = NULL_TREE; ! 11191: tree decls = NULL_TREE; ! 11192: ! 11193: /* When we get some parse errors, we can end up without a ! 11194: current_function_decl, so cope. */ ! 11195: if (fndecl == NULL_TREE) ! 11196: return; ! 11197: ! 11198: fntype = TREE_TYPE (fndecl); ! 11199: ! 11200: /* TREE_READONLY (fndecl) = 1; ! 11201: This caused &foo to be of type ptr-to-const-function ! 11202: which then got a warning when stored in a ptr-to-function variable. */ ! 11203: ! 11204: /* This happens on strange parse errors. */ ! 11205: if (! current_function_parms_stored) ! 11206: { ! 11207: call_poplevel = 0; ! 11208: store_parm_decls (); ! 11209: } ! 11210: ! 11211: if (write_symbols != NO_DEBUG && TREE_CODE (fntype) != METHOD_TYPE) ! 11212: { ! 11213: tree ttype = target_type (fntype); ! 11214: tree parmdecl; ! 11215: ! 11216: if (IS_AGGR_TYPE (ttype)) ! 11217: /* Let debugger know it should output info for this type. */ ! 11218: note_debug_info_needed (ttype); ! 11219: ! 11220: for (parmdecl = DECL_ARGUMENTS (fndecl); parmdecl; parmdecl = TREE_CHAIN (parmdecl)) ! 11221: { ! 11222: ttype = target_type (TREE_TYPE (parmdecl)); ! 11223: if (IS_AGGR_TYPE (ttype)) ! 11224: /* Let debugger know it should output info for this type. */ ! 11225: note_debug_info_needed (ttype); ! 11226: } ! 11227: } ! 11228: ! 11229: /* Clean house because we will need to reorder insns here. */ ! 11230: do_pending_stack_adjust (); ! 11231: ! 11232: if (dtor_label) ! 11233: { ! 11234: tree binfo = TYPE_BINFO (current_class_type); ! 11235: tree cond = integer_one_node; ! 11236: tree exprstmt, vfields; ! 11237: tree in_charge_node = lookup_name (in_charge_identifier, 0); ! 11238: tree virtual_size; ! 11239: int ok_to_optimize_dtor = 0; ! 11240: ! 11241: if (current_function_assigns_this) ! 11242: cond = build (NE_EXPR, integer_type_node, ! 11243: current_class_decl, integer_zero_node); ! 11244: else ! 11245: { ! 11246: int n_baseclasses = CLASSTYPE_N_BASECLASSES (current_class_type); ! 11247: ! 11248: /* If this destructor is empty, then we don't need to check ! 11249: whether `this' is NULL in some cases. */ ! 11250: mark = get_last_insn (); ! 11251: last_parm_insn = get_first_nonparm_insn (); ! 11252: ! 11253: if ((flag_this_is_variable & 1) == 0) ! 11254: ok_to_optimize_dtor = 1; ! 11255: else if (mark == last_parm_insn) ! 11256: ok_to_optimize_dtor ! 11257: = (n_baseclasses == 0 ! 11258: || (n_baseclasses == 1 ! 11259: && TYPE_HAS_DESTRUCTOR (TYPE_BINFO_BASETYPE (current_class_type, 0)))); ! 11260: } ! 11261: ! 11262: /* These initializations might go inline. Protect ! 11263: the binding level of the parms. */ ! 11264: pushlevel (0); ! 11265: expand_start_bindings (0); ! 11266: ! 11267: if (current_function_assigns_this) ! 11268: { ! 11269: current_function_assigns_this = 0; ! 11270: current_function_just_assigned_this = 0; ! 11271: } ! 11272: ! 11273: /* Generate the code to call destructor on base class. ! 11274: If this destructor belongs to a class with virtual ! 11275: functions, then set the virtual function table ! 11276: pointer to represent the type of our base class. */ ! 11277: ! 11278: /* This side-effect makes call to `build_delete' generate the ! 11279: code we have to have at the end of this destructor. */ ! 11280: TYPE_HAS_DESTRUCTOR (current_class_type) = 0; ! 11281: ! 11282: /* These are two cases where we cannot delegate deletion. */ ! 11283: if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type) ! 11284: || TREE_GETS_DELETE (current_class_type)) ! 11285: exprstmt = build_delete (current_class_type, C_C_D, integer_zero_node, ! 11286: LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0); ! 11287: else ! 11288: exprstmt = build_delete (current_class_type, C_C_D, in_charge_node, ! 11289: LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0); ! 11290: ! 11291: /* If we did not assign to this, then `this' is non-zero at ! 11292: the end of a destructor. As a special optimization, don't ! 11293: emit test if this is an empty destructor. If it does nothing, ! 11294: it does nothing. If it calls a base destructor, the base ! 11295: destructor will perform the test. */ ! 11296: ! 11297: if (exprstmt != error_mark_node ! 11298: && (TREE_CODE (exprstmt) != NOP_EXPR ! 11299: || TREE_OPERAND (exprstmt, 0) != integer_zero_node ! 11300: || TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))) ! 11301: { ! 11302: expand_label (dtor_label); ! 11303: if (cond != integer_one_node) ! 11304: expand_start_cond (cond, 0); ! 11305: if (exprstmt != void_zero_node) ! 11306: /* Don't call `expand_expr_stmt' if we're not going to do ! 11307: anything, since -Wall will give a diagnostic. */ ! 11308: expand_expr_stmt (exprstmt); ! 11309: ! 11310: /* Run destructor on all virtual baseclasses. */ ! 11311: if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)) ! 11312: { ! 11313: tree vbases = nreverse (copy_list (CLASSTYPE_VBASECLASSES (current_class_type))); ! 11314: expand_start_cond (build (BIT_AND_EXPR, integer_type_node, ! 11315: in_charge_node, integer_two_node), 0); ! 11316: while (vbases) ! 11317: { ! 11318: if (TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (vbases))) ! 11319: { ! 11320: tree ptr = convert_pointer_to_vbase (vbases, current_class_decl); ! 11321: expand_expr_stmt (build_delete (TYPE_POINTER_TO (BINFO_TYPE (vbases)), ! 11322: ptr, integer_zero_node, ! 11323: LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR|LOOKUP_HAS_IN_CHARGE, 0)); ! 11324: } ! 11325: vbases = TREE_CHAIN (vbases); ! 11326: } ! 11327: expand_end_cond (); ! 11328: } ! 11329: ! 11330: do_pending_stack_adjust (); ! 11331: if (cond != integer_one_node) ! 11332: expand_end_cond (); ! 11333: } ! 11334: ! 11335: TYPE_HAS_DESTRUCTOR (current_class_type) = 1; ! 11336: ! 11337: virtual_size = c_sizeof (current_class_type); ! 11338: ! 11339: /* At the end, call delete if that's what's requested. */ ! 11340: if (TREE_GETS_DELETE (current_class_type)) ! 11341: /* This NOP_EXPR means we are in a static call context. */ ! 11342: exprstmt = ! 11343: build_method_call ! 11344: (build1 (NOP_EXPR, ! 11345: TYPE_POINTER_TO (current_class_type), error_mark_node), ! 11346: ansi_opname[(int) DELETE_EXPR], ! 11347: tree_cons (NULL_TREE, current_class_decl, ! 11348: build_tree_list (NULL_TREE, virtual_size)), ! 11349: NULL_TREE, LOOKUP_NORMAL); ! 11350: else if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)) ! 11351: exprstmt = build_x_delete (ptr_type_node, current_class_decl, 0, ! 11352: virtual_size); ! 11353: else ! 11354: exprstmt = NULL_TREE; ! 11355: ! 11356: if (exprstmt) ! 11357: { ! 11358: cond = build (BIT_AND_EXPR, integer_type_node, ! 11359: in_charge_node, integer_one_node); ! 11360: expand_start_cond (cond, 0); ! 11361: expand_expr_stmt (exprstmt); ! 11362: expand_end_cond (); ! 11363: } ! 11364: ! 11365: /* End of destructor. */ ! 11366: expand_end_bindings (NULL_TREE, getdecls() != NULL_TREE, 0); ! 11367: poplevel (2, 0, 0); /* XXX change to 1 */ ! 11368: ! 11369: /* Back to the top of destructor. */ ! 11370: /* Dont execute destructor code if `this' is NULL. */ ! 11371: mark = get_last_insn (); ! 11372: last_parm_insn = get_first_nonparm_insn (); ! 11373: if (last_parm_insn == NULL_RTX) ! 11374: last_parm_insn = mark; ! 11375: else ! 11376: last_parm_insn = previous_insn (last_parm_insn); ! 11377: ! 11378: /* Make all virtual function table pointers point to CURRENT_CLASS_TYPE's ! 11379: virtual function tables. */ ! 11380: if (CLASSTYPE_VFIELDS (current_class_type)) ! 11381: { ! 11382: for (vfields = CLASSTYPE_VFIELDS (current_class_type); ! 11383: TREE_CHAIN (vfields); ! 11384: vfields = TREE_CHAIN (vfields)) ! 11385: { ! 11386: tree vf_decl = current_class_decl; ! 11387: /* ??? This may need to be a loop if there are multiple ! 11388: levels of replication. */ ! 11389: if (VF_BINFO_VALUE (vfields)) ! 11390: vf_decl = convert_pointer_to (VF_BINFO_VALUE (vfields), vf_decl); ! 11391: if (vf_decl != error_mark_node) ! 11392: { ! 11393: expand_expr_stmt (build_virtual_init (binfo, ! 11394: get_binfo_from_vfield (vfields), ! 11395: vf_decl)); ! 11396: } ! 11397: } ! 11398: expand_expr_stmt (build_virtual_init (binfo, binfo, ! 11399: current_class_decl)); ! 11400: } ! 11401: if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type)) ! 11402: expand_expr_stmt (build_vbase_vtables_init (binfo, binfo, ! 11403: C_C_D, current_class_decl, 0)); ! 11404: if (! ok_to_optimize_dtor) ! 11405: { ! 11406: cond = build_binary_op (NE_EXPR, ! 11407: current_class_decl, integer_zero_node, 1); ! 11408: expand_start_cond (cond, 0); ! 11409: } ! 11410: if (mark != get_last_insn ()) ! 11411: reorder_insns (next_insn (mark), get_last_insn (), last_parm_insn); ! 11412: if (! ok_to_optimize_dtor) ! 11413: expand_end_cond (); ! 11414: } ! 11415: else if (current_function_assigns_this) ! 11416: { ! 11417: /* Does not need to call emit_base_init, because ! 11418: that is done (if needed) just after assignment to this ! 11419: is seen. */ ! 11420: ! 11421: if (DECL_CONSTRUCTOR_P (current_function_decl)) ! 11422: { ! 11423: expand_label (ctor_label); ! 11424: ctor_label = NULL_TREE; ! 11425: ! 11426: if (call_poplevel) ! 11427: { ! 11428: decls = getdecls (); ! 11429: if (flag_handle_exceptions == 2) ! 11430: deactivate_exception_cleanups (); ! 11431: expand_end_bindings (decls, decls != NULL_TREE, 0); ! 11432: poplevel (decls != NULL_TREE, 0, 0); ! 11433: } ! 11434: c_expand_return (current_class_decl); ! 11435: } ! 11436: else if (TYPE_MAIN_VARIANT (TREE_TYPE ( ! 11437: DECL_RESULT (current_function_decl))) != void_type_node ! 11438: && return_label != NULL_RTX) ! 11439: no_return_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); ! 11440: ! 11441: current_function_assigns_this = 0; ! 11442: current_function_just_assigned_this = 0; ! 11443: base_init_insns = NULL_RTX; ! 11444: } ! 11445: else if (DECL_CONSTRUCTOR_P (fndecl)) ! 11446: { ! 11447: tree allocated_this; ! 11448: tree cond, thenclause; ! 11449: /* Allow constructor for a type to get a new instance of the object ! 11450: using `build_new'. */ ! 11451: tree abstract_virtuals = CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type); ! 11452: CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type) = NULL_TREE; ! 11453: ! 11454: DECL_RETURNS_FIRST_ARG (fndecl) = 1; ! 11455: ! 11456: if (flag_this_is_variable > 0) ! 11457: { ! 11458: cond = build_binary_op (EQ_EXPR, ! 11459: current_class_decl, integer_zero_node, 1); ! 11460: thenclause = build_modify_expr (current_class_decl, NOP_EXPR, ! 11461: build_new (NULL_TREE, current_class_type, void_type_node, 0)); ! 11462: if (flag_handle_exceptions == 2) ! 11463: { ! 11464: tree cleanup, cleanup_deallocate; ! 11465: tree virtual_size; ! 11466: ! 11467: /* This is the size of the virtual object pointed to by ! 11468: allocated_this. In this case, it is simple. */ ! 11469: virtual_size = c_sizeof (current_class_type); ! 11470: ! 11471: allocated_this = build_decl (VAR_DECL, NULL_TREE, ptr_type_node); ! 11472: DECL_REGISTER (allocated_this) = 1; ! 11473: DECL_INITIAL (allocated_this) = error_mark_node; ! 11474: expand_decl (allocated_this); ! 11475: expand_decl_init (allocated_this); ! 11476: /* How we cleanup `this' if an exception was raised before ! 11477: we are ready to bail out. */ ! 11478: cleanup = TREE_GETS_DELETE (current_class_type) ! 11479: ? build_opfncall (DELETE_EXPR, LOOKUP_NORMAL, allocated_this, virtual_size, NULL_TREE) ! 11480: /* The size of allocated_this is wrong, and hence the ! 11481: second argument to operator delete will be wrong. */ ! 11482: : build_delete (TREE_TYPE (allocated_this), allocated_this, ! 11483: integer_three_node, ! 11484: LOOKUP_NORMAL|LOOKUP_HAS_IN_CHARGE, 1); ! 11485: cleanup_deallocate ! 11486: = build_modify_expr (current_class_decl, NOP_EXPR, integer_zero_node); ! 11487: cleanup = tree_cons (NULL_TREE, cleanup, ! 11488: build_tree_list (NULL_TREE, cleanup_deallocate)); ! 11489: ! 11490: expand_decl_cleanup (allocated_this, ! 11491: build (COND_EXPR, integer_type_node, ! 11492: build (NE_EXPR, integer_type_node, ! 11493: allocated_this, integer_zero_node), ! 11494: build_compound_expr (cleanup), ! 11495: integer_zero_node)); ! 11496: } ! 11497: } ! 11498: else if (TREE_GETS_NEW (current_class_type)) ! 11499: /* Just check visibility here. */ ! 11500: build_method_call (build1 (NOP_EXPR, TYPE_POINTER_TO (current_class_type), error_mark_node), ! 11501: ansi_opname[(int) NEW_EXPR], ! 11502: build_tree_list (NULL_TREE, integer_zero_node), ! 11503: NULL_TREE, LOOKUP_NORMAL); ! 11504: ! 11505: CLASSTYPE_ABSTRACT_VIRTUALS (current_class_type) = abstract_virtuals; ! 11506: ! 11507: /* must keep the first insn safe. */ ! 11508: head = get_insns (); ! 11509: ! 11510: /* this note will come up to the top with us. */ ! 11511: mark = get_last_insn (); ! 11512: ! 11513: if (flag_this_is_variable > 0) ! 11514: { ! 11515: expand_start_cond (cond, 0); ! 11516: expand_expr_stmt (thenclause); ! 11517: if (flag_handle_exceptions == 2) ! 11518: expand_assignment (allocated_this, current_class_decl, 0, 0); ! 11519: expand_end_cond (); ! 11520: } ! 11521: ! 11522: if (DECL_NAME (fndecl) == NULL_TREE ! 11523: && TREE_CHAIN (DECL_ARGUMENTS (fndecl)) != NULL_TREE) ! 11524: build_default_constructor (fndecl); ! 11525: ! 11526: /* Emit insns from `emit_base_init' which sets up virtual ! 11527: function table pointer(s). */ ! 11528: emit_insns (base_init_insns); ! 11529: base_init_insns = NULL_RTX; ! 11530: ! 11531: /* This is where the body of the constructor begins. ! 11532: If there were no insns in this function body, then the ! 11533: last_parm_insn is also the last insn. ! 11534: ! 11535: If optimization is enabled, last_parm_insn may move, so ! 11536: we don't hold on to it (across emit_base_init). */ ! 11537: last_parm_insn = get_first_nonparm_insn (); ! 11538: if (last_parm_insn == NULL_RTX) ! 11539: last_parm_insn = mark; ! 11540: else ! 11541: last_parm_insn = previous_insn (last_parm_insn); ! 11542: ! 11543: if (mark != get_last_insn ()) ! 11544: reorder_insns (next_insn (mark), get_last_insn (), last_parm_insn); ! 11545: ! 11546: /* This is where the body of the constructor ends. */ ! 11547: expand_label (ctor_label); ! 11548: ctor_label = NULL_TREE; ! 11549: if (flag_handle_exceptions == 2) ! 11550: { ! 11551: expand_assignment (allocated_this, integer_zero_node, 0, 0); ! 11552: if (call_poplevel) ! 11553: deactivate_exception_cleanups (); ! 11554: } ! 11555: ! 11556: pop_implicit_try_blocks (NULL_TREE); ! 11557: ! 11558: if (call_poplevel) ! 11559: { ! 11560: expand_end_bindings (decls = getdecls (), decls != NULL_TREE, 0); ! 11561: poplevel (decls != NULL_TREE, 1, 0); ! 11562: } ! 11563: ! 11564: c_expand_return (current_class_decl); ! 11565: ! 11566: current_function_assigns_this = 0; ! 11567: current_function_just_assigned_this = 0; ! 11568: } ! 11569: else if (IDENTIFIER_LENGTH (DECL_NAME (fndecl)) == 4 ! 11570: && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "main") ! 11571: && DECL_CONTEXT (fndecl) == NULL_TREE) ! 11572: { ! 11573: /* Make it so that `main' always returns 0 by default. */ ! 11574: #ifdef VMS ! 11575: c_expand_return (integer_one_node); ! 11576: #else ! 11577: c_expand_return (integer_zero_node); ! 11578: #endif ! 11579: } ! 11580: else if (return_label != NULL_RTX ! 11581: && current_function_return_value == NULL_TREE ! 11582: && ! DECL_NAME (DECL_RESULT (current_function_decl))) ! 11583: no_return_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); ! 11584: ! 11585: if (flag_gc) ! 11586: expand_gc_prologue_and_epilogue (); ! 11587: ! 11588: /* That's the end of the vtable decl's life. Need to mark it such ! 11589: if doing stupid register allocation. ! 11590: ! 11591: Note that current_vtable_decl is really an INDIRECT_REF ! 11592: on top of a VAR_DECL here. */ ! 11593: if (obey_regdecls && current_vtable_decl) ! 11594: use_variable (DECL_RTL (TREE_OPERAND (current_vtable_decl, 0))); ! 11595: ! 11596: /* If this function is supposed to return a value, ensure that ! 11597: we do not fall into the cleanups by mistake. The end of our ! 11598: function will look like this: ! 11599: ! 11600: user code (may have return stmt somewhere) ! 11601: goto no_return_label ! 11602: cleanup_label: ! 11603: cleanups ! 11604: goto return_label ! 11605: no_return_label: ! 11606: NOTE_INSN_FUNCTION_END ! 11607: return_label: ! 11608: things for return ! 11609: ! 11610: If the user omits a return stmt in the USER CODE section, we ! 11611: will have a control path which reaches NOTE_INSN_FUNCTION_END. ! 11612: Otherwise, we won't. */ ! 11613: if (no_return_label) ! 11614: { ! 11615: DECL_CONTEXT (no_return_label) = fndecl; ! 11616: DECL_INITIAL (no_return_label) = error_mark_node; ! 11617: DECL_SOURCE_FILE (no_return_label) = input_filename; ! 11618: DECL_SOURCE_LINE (no_return_label) = lineno; ! 11619: expand_goto (no_return_label); ! 11620: } ! 11621: ! 11622: if (cleanup_label) ! 11623: { ! 11624: /* remove the binding contour which is used ! 11625: to catch cleanup-generated temporaries. */ ! 11626: expand_end_bindings (0, 0, 0); ! 11627: poplevel (0, 0, 0); ! 11628: } ! 11629: ! 11630: if (cleanup_label) ! 11631: /* Emit label at beginning of cleanup code for parameters. */ ! 11632: emit_label (cleanup_label); ! 11633: ! 11634: #if 1 ! 11635: /* Cheap hack to get better code from GNU C++. Remove when cse is fixed. */ ! 11636: if (exception_throw_decl && sets_exception_throw_decl == 0) ! 11637: expand_assignment (exception_throw_decl, integer_zero_node, 0, 0); ! 11638: #endif ! 11639: ! 11640: if (flag_handle_exceptions) ! 11641: { ! 11642: expand_end_try (); ! 11643: expand_start_except (0, 0); ! 11644: expand_end_except (); ! 11645: } ! 11646: ! 11647: /* Get return value into register if that's where it's supposed to be. */ ! 11648: if (original_result_rtx) ! 11649: fixup_result_decl (DECL_RESULT (fndecl), original_result_rtx); ! 11650: ! 11651: /* Finish building code that will trigger warnings if users forget ! 11652: to make their functions return values. */ ! 11653: if (no_return_label || cleanup_label) ! 11654: emit_jump (return_label); ! 11655: if (no_return_label) ! 11656: { ! 11657: /* We don't need to call `expand_*_return' here because we ! 11658: don't need any cleanups here--this path of code is only ! 11659: for error checking purposes. */ ! 11660: expand_label (no_return_label); ! 11661: } ! 11662: ! 11663: /* reset scope for C++: if we were in the scope of a class, ! 11664: then when we finish this function, we are not longer so. ! 11665: This cannot be done until we know for sure that no more ! 11666: class members will ever be referenced in this function ! 11667: (i.e., calls to destructors). */ ! 11668: if (current_class_name) ! 11669: { ! 11670: ctype = current_class_type; ! 11671: #if NEW_CLASS_SCOPING ! 11672: pop_nested_class (1); ! 11673: #else ! 11674: popclass (1); ! 11675: #endif ! 11676: } ! 11677: else ! 11678: pop_memoized_context (1); ! 11679: ! 11680: /* Forget about all overloaded functions defined in ! 11681: this scope which go away. */ ! 11682: while (overloads_to_forget) ! 11683: { ! 11684: IDENTIFIER_GLOBAL_VALUE (TREE_PURPOSE (overloads_to_forget)) ! 11685: = TREE_VALUE (overloads_to_forget); ! 11686: overloads_to_forget = TREE_CHAIN (overloads_to_forget); ! 11687: } ! 11688: ! 11689: /* Generate rtl for function exit. */ ! 11690: expand_function_end (input_filename, lineno, 1); ! 11691: ! 11692: /* This must come after expand_function_end because cleanups might ! 11693: have declarations (from inline functions) that need to go into ! 11694: this function's blocks. */ ! 11695: if (current_binding_level->parm_flag != 1) ! 11696: my_friendly_abort (122); ! 11697: poplevel (1, 0, 1); ! 11698: ! 11699: /* Must mark the RESULT_DECL as being in this function. */ ! 11700: DECL_CONTEXT (DECL_RESULT (fndecl)) = DECL_INITIAL (fndecl); ! 11701: ! 11702: /* Obey `register' declarations if `setjmp' is called in this fn. */ ! 11703: if (flag_traditional && current_function_calls_setjmp) ! 11704: setjmp_protect (DECL_INITIAL (fndecl)); ! 11705: ! 11706: /* Set the BLOCK_SUPERCONTEXT of the outermost function scope to point ! 11707: to the FUNCTION_DECL node itself. */ ! 11708: BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl; ! 11709: ! 11710: /* So we can tell if jump_optimize sets it to 1. */ ! 11711: can_reach_end = 0; ! 11712: ! 11713: /* ??? Compensate for Sun brain damage in dealing with data segments ! 11714: of PIC code. */ ! 11715: if (flag_pic ! 11716: && (DECL_CONSTRUCTOR_P (fndecl) ! 11717: || DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (fndecl))) ! 11718: && CLASSTYPE_NEEDS_VIRTUAL_REINIT (TYPE_METHOD_BASETYPE (fntype))) ! 11719: DECL_INLINE (fndecl) = 0; ! 11720: ! 11721: if (DECL_EXTERNAL (fndecl) ! 11722: /* This function is just along for the ride. If we can make ! 11723: it inline, that's great. Otherwise, just punt it. */ ! 11724: && (DECL_INLINE (fndecl) == 0 ! 11725: || flag_no_inline ! 11726: || function_cannot_inline_p (fndecl))) ! 11727: { ! 11728: extern int rtl_dump_and_exit; ! 11729: int old_rtl_dump_and_exit = rtl_dump_and_exit; ! 11730: int inline_spec = DECL_INLINE (fndecl); ! 11731: ! 11732: /* This throws away the code for FNDECL. */ ! 11733: rtl_dump_and_exit = 1; ! 11734: /* This throws away the memory of the code for FNDECL. */ ! 11735: if (flag_no_inline) ! 11736: DECL_INLINE (fndecl) = 0; ! 11737: rest_of_compilation (fndecl); ! 11738: rtl_dump_and_exit = old_rtl_dump_and_exit; ! 11739: DECL_INLINE (fndecl) = inline_spec; ! 11740: } ! 11741: else ! 11742: { ! 11743: /* Run the optimizers and output the assembler code for this function. */ ! 11744: rest_of_compilation (fndecl); ! 11745: } ! 11746: ! 11747: if (ctype && TREE_ASM_WRITTEN (fndecl)) ! 11748: note_debug_info_needed (ctype); ! 11749: ! 11750: current_function_returns_null |= can_reach_end; ! 11751: ! 11752: /* Since we don't normally go through c_expand_return for constructors, ! 11753: this normally gets the wrong value. ! 11754: Also, named return values have their return codes emitted after ! 11755: NOTE_INSN_FUNCTION_END, confusing jump.c. */ ! 11756: if (DECL_CONSTRUCTOR_P (fndecl) ! 11757: || DECL_NAME (DECL_RESULT (fndecl)) != NULL_TREE) ! 11758: current_function_returns_null = 0; ! 11759: ! 11760: if (TREE_THIS_VOLATILE (fndecl) && current_function_returns_null) ! 11761: warning ("`volatile' function does return"); ! 11762: else if (warn_return_type && current_function_returns_null ! 11763: && TYPE_MAIN_VARIANT (TREE_TYPE (fntype)) != void_type_node) ! 11764: { ! 11765: /* If this function returns non-void and control can drop through, ! 11766: complain. */ ! 11767: pedwarn ("control reaches end of non-void function"); ! 11768: } ! 11769: /* With just -W, complain only if function returns both with ! 11770: and without a value. */ ! 11771: else if (extra_warnings ! 11772: && current_function_returns_value && current_function_returns_null) ! 11773: warning ("this function may return with or without a value"); ! 11774: ! 11775: /* Free all the tree nodes making up this function. */ ! 11776: /* Switch back to allocating nodes permanently ! 11777: until we start another function. */ ! 11778: permanent_allocation (); ! 11779: ! 11780: if (flag_cadillac) ! 11781: cadillac_finish_function (fndecl); ! 11782: ! 11783: if (DECL_SAVED_INSNS (fndecl) == NULL_RTX) ! 11784: { ! 11785: /* Stop pointing to the local nodes about to be freed. */ ! 11786: /* But DECL_INITIAL must remain nonzero so we know this ! 11787: was an actual function definition. */ ! 11788: DECL_INITIAL (fndecl) = error_mark_node; ! 11789: if (! DECL_CONSTRUCTOR_P (fndecl) ! 11790: || !TYPE_USES_VIRTUAL_BASECLASSES (TYPE_METHOD_BASETYPE (fntype))) ! 11791: DECL_ARGUMENTS (fndecl) = NULL_TREE; ! 11792: } ! 11793: ! 11794: /* Let the error reporting routines know that we're outside a function. */ ! 11795: current_function_decl = NULL_TREE; ! 11796: named_label_uses = NULL_TREE; ! 11797: } ! 11798: ! 11799: /* Create the FUNCTION_DECL for a function definition. ! 11800: LINE1 is the line number that the definition absolutely begins on. ! 11801: LINE2 is the line number that the name of the function appears on. ! 11802: DECLSPECS and DECLARATOR are the parts of the declaration; ! 11803: they describe the function's name and the type it returns, ! 11804: but twisted together in a fashion that parallels the syntax of C. ! 11805: ! 11806: This function creates a binding context for the function body ! 11807: as well as setting up the FUNCTION_DECL in current_function_decl. ! 11808: ! 11809: Returns a FUNCTION_DECL on success. ! 11810: ! 11811: If the DECLARATOR is not suitable for a function (it defines a datum ! 11812: instead), we return 0, which tells yyparse to report a parse error. ! 11813: ! 11814: May return void_type_node indicating that this method is actually ! 11815: a friend. See grokfield for more details. ! 11816: ! 11817: Came here with a `.pushlevel' . ! 11818: ! 11819: DO NOT MAKE ANY CHANGES TO THIS CODE WITHOUT MAKING CORRESPONDING ! 11820: CHANGES TO CODE IN `grokfield'. */ ! 11821: tree ! 11822: start_method (declspecs, declarator, raises) ! 11823: tree declarator, declspecs, raises; ! 11824: { ! 11825: tree fndecl = grokdeclarator (declarator, declspecs, MEMFUNCDEF, 0, raises); ! 11826: ! 11827: /* Something too ugly to handle. */ ! 11828: if (fndecl == NULL_TREE) ! 11829: return NULL_TREE; ! 11830: ! 11831: /* Pass friends other than inline friend functions back. */ ! 11832: if (TYPE_MAIN_VARIANT (fndecl) == void_type_node) ! 11833: return fndecl; ! 11834: ! 11835: if (TREE_CODE (fndecl) != FUNCTION_DECL) ! 11836: /* Not a function, tell parser to report parse error. */ ! 11837: return NULL_TREE; ! 11838: ! 11839: if (DECL_IN_AGGR_P (fndecl)) ! 11840: { ! 11841: if (IDENTIFIER_ERROR_LOCUS (DECL_ASSEMBLER_NAME (fndecl)) != current_class_type) ! 11842: { ! 11843: if (DECL_CONTEXT (fndecl)) ! 11844: cp_error ("`%D' is already defined in class %s", fndecl, ! 11845: TYPE_NAME_STRING (DECL_CONTEXT (fndecl))); ! 11846: } ! 11847: return void_type_node; ! 11848: } ! 11849: ! 11850: /* If we're expanding a template, a function must be explicitly declared ! 11851: inline if we're to compile it now. If it isn't, we have to wait to see ! 11852: whether it's needed, and whether an override exists. */ ! 11853: if (flag_default_inline && !processing_template_defn) ! 11854: DECL_INLINE (fndecl) = 1; ! 11855: ! 11856: /* We read in the parameters on the maybepermanent_obstack, ! 11857: but we won't be getting back to them until after we ! 11858: may have clobbered them. So the call to preserve_data ! 11859: will keep them safe. */ ! 11860: preserve_data (); ! 11861: ! 11862: if (! DECL_FRIEND_P (fndecl)) ! 11863: { ! 11864: if (DECL_CHAIN (fndecl) != NULL_TREE) ! 11865: { ! 11866: /* Need a fresh node here so that we don't get circularity ! 11867: when we link these together. If FNDECL was a friend, then ! 11868: `pushdecl' does the right thing, which is nothing wrt its ! 11869: current value of DECL_CHAIN. */ ! 11870: fndecl = copy_node (fndecl); ! 11871: } ! 11872: if (TREE_CHAIN (fndecl)) ! 11873: { ! 11874: fndecl = copy_node (fndecl); ! 11875: TREE_CHAIN (fndecl) = NULL_TREE; ! 11876: } ! 11877: ! 11878: if (DECL_CONSTRUCTOR_P (fndecl)) ! 11879: grok_ctor_properties (current_class_type, fndecl); ! 11880: else if (IDENTIFIER_OPNAME_P (DECL_NAME (fndecl))) ! 11881: grok_op_properties (fndecl, DECL_VIRTUAL_P (fndecl)); ! 11882: } ! 11883: ! 11884: finish_decl (fndecl, NULL_TREE, NULL_TREE, 0); ! 11885: ! 11886: /* Make a place for the parms */ ! 11887: pushlevel (0); ! 11888: current_binding_level->parm_flag = 1; ! 11889: ! 11890: DECL_IN_AGGR_P (fndecl) = 1; ! 11891: return fndecl; ! 11892: } ! 11893: ! 11894: /* Go through the motions of finishing a function definition. ! 11895: We don't compile this method until after the whole class has ! 11896: been processed. ! 11897: ! 11898: FINISH_METHOD must return something that looks as though it ! 11899: came from GROKFIELD (since we are defining a method, after all). ! 11900: ! 11901: This is called after parsing the body of the function definition. ! 11902: STMTS is the chain of statements that makes up the function body. ! 11903: ! 11904: DECL is the ..._DECL that `start_method' provided. */ ! 11905: ! 11906: tree ! 11907: finish_method (decl) ! 11908: tree decl; ! 11909: { ! 11910: register tree fndecl = decl; ! 11911: tree old_initial; ! 11912: tree context = DECL_CONTEXT (fndecl); ! 11913: ! 11914: register tree link; ! 11915: ! 11916: if (TYPE_MAIN_VARIANT (decl) == void_type_node) ! 11917: return decl; ! 11918: ! 11919: old_initial = DECL_INITIAL (fndecl); ! 11920: ! 11921: /* Undo the level for the parms (from start_method). ! 11922: This is like poplevel, but it causes nothing to be ! 11923: saved. Saving information here confuses symbol-table ! 11924: output routines. Besides, this information will ! 11925: be correctly output when this method is actually ! 11926: compiled. */ ! 11927: ! 11928: /* Clear out the meanings of the local variables of this level; ! 11929: also record in each decl which block it belongs to. */ ! 11930: ! 11931: for (link = current_binding_level->names; link; link = TREE_CHAIN (link)) ! 11932: { ! 11933: if (DECL_NAME (link) != NULL_TREE) ! 11934: IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = 0; ! 11935: my_friendly_assert (TREE_CODE (link) != FUNCTION_DECL, 163); ! 11936: DECL_CONTEXT (link) = NULL_TREE; ! 11937: } ! 11938: ! 11939: /* Restore all name-meanings of the outer levels ! 11940: that were shadowed by this level. */ ! 11941: ! 11942: for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link)) ! 11943: IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link); ! 11944: for (link = current_binding_level->class_shadowed; ! 11945: link; link = TREE_CHAIN (link)) ! 11946: IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link); ! 11947: for (link = current_binding_level->type_shadowed; ! 11948: link; link = TREE_CHAIN (link)) ! 11949: IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link); ! 11950: ! 11951: GNU_xref_end_scope ((HOST_WIDE_INT) current_binding_level, ! 11952: (HOST_WIDE_INT) current_binding_level->level_chain, ! 11953: current_binding_level->parm_flag, ! 11954: current_binding_level->keep, ! 11955: current_binding_level->tag_transparent); ! 11956: ! 11957: poplevel (0, 0, 0); ! 11958: ! 11959: DECL_INITIAL (fndecl) = old_initial; ! 11960: ! 11961: /* We used to check if the context of FNDECL was different from ! 11962: current_class_type as another way to get inside here. This didn't work ! 11963: for String.cc in libg++. */ ! 11964: if (DECL_FRIEND_P (fndecl)) ! 11965: { ! 11966: CLASSTYPE_INLINE_FRIENDS (current_class_type) ! 11967: = tree_cons (NULL_TREE, fndecl, CLASSTYPE_INLINE_FRIENDS (current_class_type)); ! 11968: decl = void_type_node; ! 11969: } ! 11970: ! 11971: return decl; ! 11972: } ! 11973: ! 11974: /* Called when a new struct TYPE is defined. ! 11975: If this structure or union completes the type of any previous ! 11976: variable declaration, lay it out and output its rtl. */ ! 11977: ! 11978: void ! 11979: hack_incomplete_structures (type) ! 11980: tree type; ! 11981: { ! 11982: tree decl; ! 11983: ! 11984: if (current_binding_level->n_incomplete == 0) ! 11985: return; ! 11986: ! 11987: if (!type) /* Don't do this for class templates. */ ! 11988: return; ! 11989: ! 11990: for (decl = current_binding_level->names; decl; decl = TREE_CHAIN (decl)) ! 11991: if (TREE_TYPE (decl) == type ! 11992: || (TREE_TYPE (decl) ! 11993: && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE ! 11994: && TREE_TYPE (TREE_TYPE (decl)) == type)) ! 11995: { ! 11996: if (TREE_CODE (decl) == TYPE_DECL) ! 11997: layout_type (TREE_TYPE (decl)); ! 11998: else ! 11999: { ! 12000: int toplevel = global_binding_level == current_binding_level; ! 12001: if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE ! 12002: && TREE_TYPE (TREE_TYPE (decl)) == type) ! 12003: layout_type (TREE_TYPE (decl)); ! 12004: layout_decl (decl, 0); ! 12005: rest_of_decl_compilation (decl, NULL_PTR, toplevel, 0); ! 12006: if (! toplevel) ! 12007: { ! 12008: expand_decl (decl); ! 12009: expand_decl_cleanup (decl, maybe_build_cleanup (decl)); ! 12010: expand_decl_init (decl); ! 12011: } ! 12012: } ! 12013: my_friendly_assert (current_binding_level->n_incomplete > 0, 164); ! 12014: --current_binding_level->n_incomplete; ! 12015: } ! 12016: } ! 12017: ! 12018: /* Nonzero if presently building a cleanup. Needed because ! 12019: SAVE_EXPRs are not the right things to use inside of cleanups. ! 12020: They are only ever evaluated once, where the cleanup ! 12021: might be evaluated several times. In this case, a later evaluation ! 12022: of the cleanup might fill in the SAVE_EXPR_RTL, and it will ! 12023: not be valid for an earlier cleanup. */ ! 12024: ! 12025: int building_cleanup; ! 12026: ! 12027: /* If DECL is of a type which needs a cleanup, build that cleanup here. ! 12028: We don't build cleanups if just going for syntax checking, since ! 12029: fixup_cleanups does not know how to not handle them. ! 12030: ! 12031: Don't build these on the momentary obstack; they must live ! 12032: the life of the binding contour. */ ! 12033: tree ! 12034: maybe_build_cleanup (decl) ! 12035: tree decl; ! 12036: { ! 12037: tree type = TREE_TYPE (decl); ! 12038: if (TYPE_NEEDS_DESTRUCTOR (type)) ! 12039: { ! 12040: int temp = 0, flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR; ! 12041: tree rval; ! 12042: int old_building_cleanup = building_cleanup; ! 12043: building_cleanup = 1; ! 12044: ! 12045: if (TREE_CODE (decl) != PARM_DECL) ! 12046: temp = suspend_momentary (); ! 12047: ! 12048: if (TREE_CODE (type) == ARRAY_TYPE) ! 12049: rval = decl; ! 12050: else ! 12051: { ! 12052: mark_addressable (decl); ! 12053: rval = build_unary_op (ADDR_EXPR, decl, 0); ! 12054: } ! 12055: ! 12056: /* Optimize for space over speed here. */ ! 12057: if (! TYPE_USES_VIRTUAL_BASECLASSES (type) ! 12058: || flag_expensive_optimizations) ! 12059: flags |= LOOKUP_NONVIRTUAL; ! 12060: ! 12061: /* Use TYPE_MAIN_VARIANT so we don't get a warning about ! 12062: calling delete on a `const' variable. */ ! 12063: if (TYPE_READONLY (TREE_TYPE (TREE_TYPE (rval)))) ! 12064: rval = build1 (NOP_EXPR, TYPE_POINTER_TO (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (rval)))), rval); ! 12065: ! 12066: rval = build_delete (TREE_TYPE (rval), rval, integer_two_node, flags, 0); ! 12067: ! 12068: if (TYPE_USES_VIRTUAL_BASECLASSES (type) ! 12069: && ! TYPE_HAS_DESTRUCTOR (type)) ! 12070: rval = build_compound_expr (tree_cons (NULL_TREE, rval, ! 12071: build_tree_list (NULL_TREE, build_vbase_delete (type, decl)))); ! 12072: ! 12073: current_binding_level->have_cleanups = 1; ! 12074: current_binding_level->more_exceptions_ok = 0; ! 12075: ! 12076: if (TREE_CODE (decl) != PARM_DECL) ! 12077: resume_momentary (temp); ! 12078: ! 12079: building_cleanup = old_building_cleanup; ! 12080: ! 12081: return rval; ! 12082: } ! 12083: return 0; ! 12084: } ! 12085: ! 12086: /* Expand a C++ expression at the statement level. ! 12087: This is needed to ferret out nodes which have UNKNOWN_TYPE. ! 12088: The C++ type checker should get all of these out when ! 12089: expressions are combined with other, type-providing, expressions, ! 12090: leaving only orphan expressions, such as: ! 12091: ! 12092: &class::bar; / / takes its address, but does nothing with it. ! 12093: ! 12094: */ ! 12095: void ! 12096: cplus_expand_expr_stmt (exp) ! 12097: tree exp; ! 12098: { ! 12099: if (TREE_TYPE (exp) == unknown_type_node) ! 12100: { ! 12101: if (TREE_CODE (exp) == ADDR_EXPR || TREE_CODE (exp) == TREE_LIST) ! 12102: error ("address of overloaded function with no contextual type information"); ! 12103: else if (TREE_CODE (exp) == COMPONENT_REF) ! 12104: warning ("useless reference to a member function name, did you forget the ()?"); ! 12105: } ! 12106: else ! 12107: { ! 12108: int remove_implicit_immediately = 0; ! 12109: ! 12110: if (TREE_CODE (exp) == FUNCTION_DECL) ! 12111: { ! 12112: cp_warning ("reference, not call, to function `%D'", exp); ! 12113: warning ("at this point in file"); ! 12114: } ! 12115: if (TREE_RAISES (exp)) ! 12116: { ! 12117: my_friendly_assert (flag_handle_exceptions, 165); ! 12118: if (flag_handle_exceptions == 2) ! 12119: { ! 12120: if (! current_binding_level->more_exceptions_ok) ! 12121: { ! 12122: extern struct nesting *nesting_stack, *block_stack; ! 12123: ! 12124: remove_implicit_immediately ! 12125: = (nesting_stack != block_stack); ! 12126: cplus_expand_start_try (1); ! 12127: } ! 12128: current_binding_level->have_exceptions = 1; ! 12129: } ! 12130: } ! 12131: ! 12132: expand_expr_stmt (break_out_cleanups (exp)); ! 12133: ! 12134: if (remove_implicit_immediately) ! 12135: pop_implicit_try_blocks (NULL_TREE); ! 12136: } ! 12137: ! 12138: /* Clean up any pending cleanups. This happens when a function call ! 12139: returns a cleanup-needing value that nobody uses. */ ! 12140: expand_cleanups_to (NULL_TREE); ! 12141: } ! 12142: ! 12143: /* When a stmt has been parsed, this function is called. ! 12144: ! 12145: Currently, this function only does something within a ! 12146: constructor's scope: if a stmt has just assigned to this, ! 12147: and we are in a derived class, we call `emit_base_init'. */ ! 12148: ! 12149: void ! 12150: finish_stmt () ! 12151: { ! 12152: extern struct nesting *cond_stack, *loop_stack, *case_stack; ! 12153: ! 12154: ! 12155: if (current_function_assigns_this ! 12156: || ! current_function_just_assigned_this) ! 12157: return; ! 12158: if (DECL_CONSTRUCTOR_P (current_function_decl)) ! 12159: { ! 12160: /* Constructors must wait until we are out of control ! 12161: zones before calling base constructors. */ ! 12162: if (cond_stack || loop_stack || case_stack) ! 12163: return; ! 12164: emit_insns (base_init_insns); ! 12165: check_base_init (current_class_type); ! 12166: } ! 12167: current_function_assigns_this = 1; ! 12168: ! 12169: if (flag_cadillac) ! 12170: cadillac_finish_stmt (); ! 12171: } ! 12172: ! 12173: void ! 12174: pop_implicit_try_blocks (decl) ! 12175: tree decl; ! 12176: { ! 12177: if (decl) ! 12178: { ! 12179: my_friendly_assert (current_binding_level->parm_flag == 3, 166); ! 12180: current_binding_level->names = TREE_CHAIN (decl); ! 12181: } ! 12182: ! 12183: while (current_binding_level->parm_flag == 3) ! 12184: { ! 12185: tree name = get_identifier ("(compiler error)"); ! 12186: tree orig_ex_type = current_exception_type; ! 12187: tree orig_ex_decl = current_exception_decl; ! 12188: tree orig_ex_obj = current_exception_object; ! 12189: tree decl = cplus_expand_end_try (2); ! 12190: ! 12191: /* @@ It would be nice to make all these point ! 12192: to exactly the same handler. */ ! 12193: /* Start hidden EXCEPT. */ ! 12194: cplus_expand_start_except (name, decl); ! 12195: /* reraise ALL. */ ! 12196: cplus_expand_reraise (NULL_TREE); ! 12197: current_exception_type = orig_ex_type; ! 12198: current_exception_decl = orig_ex_decl; ! 12199: current_exception_object = orig_ex_obj; ! 12200: /* This will reraise for us. */ ! 12201: cplus_expand_end_except (error_mark_node); ! 12202: } ! 12203: ! 12204: if (decl) ! 12205: { ! 12206: TREE_CHAIN (decl) = current_binding_level->names; ! 12207: current_binding_level->names = decl; ! 12208: } ! 12209: } ! 12210: ! 12211: /* Push a cleanup onto the current binding contour that will cause ! 12212: ADDR to be cleaned up, in the case that an exception propagates ! 12213: through its binding contour. */ ! 12214: ! 12215: void ! 12216: push_exception_cleanup (addr) ! 12217: tree addr; ! 12218: { ! 12219: tree decl = build_decl (VAR_DECL, get_identifier (EXCEPTION_CLEANUP_NAME), ptr_type_node); ! 12220: tree cleanup; ! 12221: ! 12222: decl = pushdecl (decl); ! 12223: DECL_REGISTER (decl) = 1; ! 12224: store_init_value (decl, addr); ! 12225: expand_decl (decl); ! 12226: expand_decl_init (decl); ! 12227: ! 12228: cleanup = build (COND_EXPR, integer_type_node, ! 12229: build (NE_EXPR, integer_type_node, ! 12230: decl, integer_zero_node), ! 12231: build_delete (TREE_TYPE (addr), decl, ! 12232: lookup_name (in_charge_identifier, 0), ! 12233: LOOKUP_NORMAL|LOOKUP_DESTRUCTOR, 0), ! 12234: integer_zero_node); ! 12235: expand_decl_cleanup (decl, cleanup); ! 12236: } ! 12237: ! 12238: /* For each binding contour, emit code that deactivates the ! 12239: exception cleanups. All other cleanups are left as they were. */ ! 12240: ! 12241: static void ! 12242: deactivate_exception_cleanups () ! 12243: { ! 12244: struct binding_level *b = current_binding_level; ! 12245: tree xyzzy = get_identifier (EXCEPTION_CLEANUP_NAME); ! 12246: while (b != class_binding_level) ! 12247: { ! 12248: if (b->parm_flag == 3) ! 12249: { ! 12250: tree decls = b->names; ! 12251: while (decls) ! 12252: { ! 12253: if (DECL_NAME (decls) == xyzzy) ! 12254: expand_assignment (decls, integer_zero_node, 0, 0); ! 12255: decls = TREE_CHAIN (decls); ! 12256: } ! 12257: } ! 12258: b = b->level_chain; ! 12259: } ! 12260: } ! 12261: ! 12262: /* Change a static member function definition into a FUNCTION_TYPE, instead ! 12263: of the METHOD_TYPE that we create when it's originally parsed. */ ! 12264: void ! 12265: revert_static_member_fn (fn, decl, argtypes) ! 12266: tree *fn, *decl, *argtypes; ! 12267: { ! 12268: tree tmp, function = *fn; ! 12269: ! 12270: *argtypes = TREE_CHAIN (*argtypes); ! 12271: tmp = build_function_type (TREE_TYPE (function), *argtypes); ! 12272: tmp = build_type_variant (tmp, TYPE_READONLY (function), ! 12273: TYPE_VOLATILE (function)); ! 12274: tmp = build_exception_variant (TYPE_METHOD_BASETYPE (function), tmp, ! 12275: TYPE_RAISES_EXCEPTIONS (function)); ! 12276: TREE_TYPE (*decl) = tmp; ! 12277: *fn = tmp; ! 12278: DECL_STATIC_FUNCTION_P (*decl) = 1; ! 12279: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.