rtti.c revision 169689
150397Sobrien/* RunTime Type Identification 2169689Skan Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 3169689Skan 2005, 2006 490075Sobrien Free Software Foundation, Inc. 550397Sobrien Mostly written by Jason Merrill (jason@cygnus.com). 650397Sobrien 7132718SkanThis file is part of GCC. 850397Sobrien 9132718SkanGCC is free software; you can redistribute it and/or modify 1050397Sobrienit under the terms of the GNU General Public License as published by 1150397Sobrienthe Free Software Foundation; either version 2, or (at your option) 1250397Sobrienany later version. 1350397Sobrien 14132718SkanGCC is distributed in the hope that it will be useful, 1550397Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of 1650397SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1750397SobrienGNU General Public License for more details. 1850397Sobrien 1950397SobrienYou should have received a copy of the GNU General Public License 20132718Skanalong with GCC; see the file COPYING. If not, write to 21169689Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor, 22169689SkanBoston, MA 02110-1301, USA. */ 2350397Sobrien 2450397Sobrien#include "config.h" 2550397Sobrien#include "system.h" 26132718Skan#include "coretypes.h" 27132718Skan#include "tm.h" 2850397Sobrien#include "tree.h" 2950397Sobrien#include "cp-tree.h" 3050397Sobrien#include "flags.h" 3150397Sobrien#include "output.h" 3250397Sobrien#include "assert.h" 3350397Sobrien#include "toplev.h" 34132718Skan#include "convert.h" 3550397Sobrien 36102780Skan/* C++ returns type information to the user in struct type_info 37102780Skan objects. We also use type information to implement dynamic_cast and 38102780Skan exception handlers. Type information for a particular type is 39102780Skan indicated with an ABI defined structure derived from type_info. 40102780Skan This would all be very straight forward, but for the fact that the 41102780Skan runtime library provides the definitions of the type_info structure 42102780Skan and the ABI defined derived classes. We cannot build declarations 43102780Skan of them directly in the compiler, but we need to layout objects of 44102780Skan their type. Somewhere we have to lie. 45102780Skan 46102780Skan We define layout compatible POD-structs with compiler-defined names 47102780Skan and generate the appropriate initializations for them (complete 48102780Skan with explicit mention of their vtable). When we have to provide a 49102780Skan type_info to the user we reinterpret_cast the internal compiler 50102780Skan type to type_info. A well formed program can only explicitly refer 51102780Skan to the type_infos of complete types (& cv void). However, we chain 52102780Skan pointer type_infos to the pointed-to-type, and that can be 53102780Skan incomplete. We only need the addresses of such incomplete 54102780Skan type_info objects for static initialization. 55102780Skan 56102780Skan The type information VAR_DECL of a type is held on the 57102780Skan IDENTIFIER_GLOBAL_VALUE of the type's mangled name. That VAR_DECL 58102780Skan will be the internal type. It will usually have the correct 59102780Skan internal type reflecting the kind of type it represents (pointer, 60102780Skan array, function, class, inherited class, etc). When the type it 61102780Skan represents is incomplete, it will have the internal type 62102780Skan corresponding to type_info. That will only happen at the end of 63102780Skan translation, when we are emitting the type info objects. */ 64102780Skan 65169689Skan/* Auxiliary data we hold for each type_info derived object we need. */ 66169689Skantypedef struct tinfo_s GTY (()) 67169689Skan{ 68169689Skan tree type; /* The RECORD_TYPE for this type_info object */ 6950397Sobrien 70169689Skan tree vtable; /* The VAR_DECL of the vtable. Only filled at end of 71169689Skan translation. */ 7250397Sobrien 73169689Skan tree name; /* IDENTIFIER_NODE for the ABI specified name of 74169689Skan the type_info derived type. */ 75169689Skan} tinfo_s; 76169689Skan 77169689SkanDEF_VEC_O(tinfo_s); 78169689SkanDEF_VEC_ALLOC_O(tinfo_s,gc); 79169689Skan 80169689Skantypedef enum tinfo_kind 81169689Skan{ 82169689Skan TK_TYPE_INFO_TYPE, /* std::type_info */ 83169689Skan TK_BASE_TYPE, /* abi::__base_class_type_info */ 84169689Skan TK_BUILTIN_TYPE, /* abi::__fundamental_type_info */ 85169689Skan TK_ARRAY_TYPE, /* abi::__array_type_info */ 86169689Skan TK_FUNCTION_TYPE, /* abi::__function_type_info */ 87169689Skan TK_ENUMERAL_TYPE, /* abi::__enum_type_info */ 88169689Skan TK_POINTER_TYPE, /* abi::__pointer_type_info */ 89169689Skan TK_POINTER_MEMBER_TYPE, /* abi::__pointer_to_member_type_info */ 90169689Skan TK_CLASS_TYPE, /* abi::__class_type_info */ 91169689Skan TK_SI_CLASS_TYPE, /* abi::__si_class_type_info */ 92169689Skan TK_FIXED /* end of fixed descriptors. */ 93169689Skan /* ... abi::__vmi_type_info<I> */ 94169689Skan} tinfo_kind; 95169689Skan 96169689Skan/* A vector of all tinfo decls that haven't yet been emitted. */ 97169689SkanVEC(tree,gc) *unemitted_tinfo_decls; 98169689Skan 99169689Skan/* A vector of all type_info derived types we need. The first few are 100169689Skan fixed and created early. The remainder are for multiple inheritance 101169689Skan and are generated as needed. */ 102169689Skanstatic GTY (()) VEC(tinfo_s,gc) *tinfo_descs; 103169689Skan 104132718Skanstatic tree build_headof (tree); 105132718Skanstatic tree ifnonnull (tree, tree); 106132718Skanstatic tree tinfo_name (tree); 107132718Skanstatic tree build_dynamic_cast_1 (tree, tree); 108132718Skanstatic tree throw_bad_cast (void); 109132718Skanstatic tree throw_bad_typeid (void); 110132718Skanstatic tree get_tinfo_decl_dynamic (tree); 111132718Skanstatic tree get_tinfo_ptr (tree); 112132718Skanstatic bool typeid_ok_p (void); 113132718Skanstatic int qualifier_flags (tree); 114132718Skanstatic bool target_incomplete_p (tree); 115169689Skanstatic tree tinfo_base_init (tinfo_s *, tree); 116169689Skanstatic tree generic_initializer (tinfo_s *, tree); 117169689Skanstatic tree ptr_initializer (tinfo_s *, tree); 118169689Skanstatic tree ptm_initializer (tinfo_s *, tree); 119169689Skanstatic tree class_initializer (tinfo_s *, tree, tree); 120169689Skanstatic void create_pseudo_type_info (int, const char *, ...); 121169689Skanstatic tree get_pseudo_ti_init (tree, unsigned); 122169689Skanstatic unsigned get_pseudo_ti_index (tree); 123132718Skanstatic void create_tinfo_types (void); 124132718Skanstatic bool typeinfo_in_lib_p (tree); 125132718Skan 12690075Sobrienstatic int doing_runtime = 0; 12750397Sobrien 128102780Skan 129102780Skan/* Declare language defined type_info type and a pointer to const 130102780Skan type_info. This is incomplete here, and will be completed when 131102780Skan the user #includes <typeinfo>. There are language defined 132102780Skan restrictions on what can be done until that is included. Create 133102780Skan the internal versions of the ABI types. */ 134102780Skan 13550397Sobrienvoid 136132718Skaninit_rtti_processing (void) 13750397Sobrien{ 138169689Skan tree type_info_type; 139132718Skan 14090075Sobrien push_namespace (std_identifier); 141169689Skan type_info_type = xref_tag (class_type, get_identifier ("type_info"), 142169689Skan /*tag_scope=*/ts_current, false); 14390075Sobrien pop_namespace (); 144169689Skan const_type_info_type_node 145169689Skan = build_qualified_type (type_info_type, TYPE_QUAL_CONST); 146169689Skan type_info_ptr_type = build_pointer_type (const_type_info_type_node); 147102780Skan 148169689Skan unemitted_tinfo_decls = VEC_alloc (tree, gc, 124); 149132718Skan 150102780Skan create_tinfo_types (); 15150397Sobrien} 15250397Sobrien 15350397Sobrien/* Given the expression EXP of type `class *', return the head of the 15450397Sobrien object pointed to by EXP with type cv void*, if the class has any 15590075Sobrien virtual functions (TYPE_POLYMORPHIC_P), else just return the 15650397Sobrien expression. */ 15750397Sobrien 15850397Sobrienstatic tree 159132718Skanbuild_headof (tree exp) 16050397Sobrien{ 16150397Sobrien tree type = TREE_TYPE (exp); 16250397Sobrien tree offset; 16390075Sobrien tree index; 16450397Sobrien 165169689Skan gcc_assert (TREE_CODE (type) == POINTER_TYPE); 16650397Sobrien type = TREE_TYPE (type); 16750397Sobrien 16890075Sobrien if (!TYPE_POLYMORPHIC_P (type)) 16950397Sobrien return exp; 17050397Sobrien 17150397Sobrien /* We use this a couple of times below, protect it. */ 17250397Sobrien exp = save_expr (exp); 17350397Sobrien 17490075Sobrien /* The offset-to-top field is at index -2 from the vptr. */ 175169689Skan index = build_int_cst (NULL_TREE, 176169689Skan -2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE); 17750397Sobrien 17890075Sobrien offset = build_vtbl_ref (build_indirect_ref (exp, NULL), index); 17950397Sobrien 180169689Skan type = build_qualified_type (ptr_type_node, 18190075Sobrien cp_type_quals (TREE_TYPE (exp))); 182169689Skan return build2 (PLUS_EXPR, type, exp, 183169689Skan convert_to_integer (ptrdiff_type_node, offset)); 18450397Sobrien} 18550397Sobrien 18650397Sobrien/* Get a bad_cast node for the program to throw... 18750397Sobrien 18850397Sobrien See libstdc++/exception.cc for __throw_bad_cast */ 18950397Sobrien 19050397Sobrienstatic tree 191132718Skanthrow_bad_cast (void) 19250397Sobrien{ 19390075Sobrien tree fn = get_identifier ("__cxa_bad_cast"); 194132718Skan if (!get_global_value_if_present (fn, &fn)) 19590075Sobrien fn = push_throw_library_fn (fn, build_function_type (ptr_type_node, 19690075Sobrien void_list_node)); 197169689Skan 198169689Skan return build_cxx_call (fn, NULL_TREE); 19950397Sobrien} 20050397Sobrien 201132718Skan/* Return an expression for "__cxa_bad_typeid()". The expression 202132718Skan returned is an lvalue of type "const std::type_info". */ 203132718Skan 20450397Sobrienstatic tree 205132718Skanthrow_bad_typeid (void) 20650397Sobrien{ 20790075Sobrien tree fn = get_identifier ("__cxa_bad_typeid"); 208132718Skan if (!get_global_value_if_present (fn, &fn)) 20990075Sobrien { 210169689Skan tree t; 211169689Skan 212169689Skan t = build_reference_type (const_type_info_type_node); 213169689Skan t = build_function_type (t, void_list_node); 21490075Sobrien fn = push_throw_library_fn (fn, t); 21590075Sobrien } 21690075Sobrien 217169689Skan return build_cxx_call (fn, NULL_TREE); 21850397Sobrien} 21950397Sobrien 220132718Skan/* Return an lvalue expression whose type is "const std::type_info" 221132718Skan and whose value indicates the type of the expression EXP. If EXP 222132718Skan is a reference to a polymorphic class, return the dynamic type; 22350397Sobrien otherwise return the static type of the expression. */ 22450397Sobrien 22590075Sobrienstatic tree 226132718Skanget_tinfo_decl_dynamic (tree exp) 22750397Sobrien{ 22850397Sobrien tree type; 229132718Skan tree t; 230169689Skan 231169689Skan if (error_operand_p (exp)) 23250397Sobrien return error_mark_node; 23350397Sobrien 23450397Sobrien /* peel back references, so they match. */ 235132718Skan type = non_reference (TREE_TYPE (exp)); 23650397Sobrien 23750397Sobrien /* Peel off cv qualifiers. */ 23850397Sobrien type = TYPE_MAIN_VARIANT (type); 239169689Skan 24090075Sobrien if (!VOID_TYPE_P (type)) 24190075Sobrien type = complete_type_or_else (type, exp); 242169689Skan 24390075Sobrien if (!type) 24490075Sobrien return error_mark_node; 24550397Sobrien 24650397Sobrien /* If exp is a reference to polymorphic type, get the real type_info. */ 24790075Sobrien if (TYPE_POLYMORPHIC_P (type) && ! resolves_to_fixed_type_p (exp, 0)) 24850397Sobrien { 24950397Sobrien /* build reference to type_info from vtable. */ 25090075Sobrien tree index; 25150397Sobrien 25290075Sobrien /* The RTTI information is at index -1. */ 253169689Skan index = build_int_cst (NULL_TREE, 254169689Skan -1 * TARGET_VTABLE_DATA_ENTRY_DISTANCE); 25590075Sobrien t = build_vtbl_ref (exp, index); 256169689Skan t = convert (type_info_ptr_type, t); 25750397Sobrien } 258132718Skan else 259132718Skan /* Otherwise return the type_info for the static type of the expr. */ 260132718Skan t = get_tinfo_ptr (TYPE_MAIN_VARIANT (type)); 26150397Sobrien 262132718Skan return build_indirect_ref (t, NULL); 26350397Sobrien} 26450397Sobrien 26590075Sobrienstatic bool 266132718Skantypeid_ok_p (void) 26750397Sobrien{ 26852284Sobrien if (! flag_rtti) 26952284Sobrien { 27052284Sobrien error ("cannot use typeid with -fno-rtti"); 27190075Sobrien return false; 27252284Sobrien } 273169689Skan 274169689Skan if (!COMPLETE_TYPE_P (const_type_info_type_node)) 27552284Sobrien { 27652284Sobrien error ("must #include <typeinfo> before using typeid"); 27790075Sobrien return false; 27852284Sobrien } 279169689Skan 28090075Sobrien return true; 28190075Sobrien} 28290075Sobrien 283132718Skan/* Return an expression for "typeid(EXP)". The expression returned is 284132718Skan an lvalue of type "const std::type_info". */ 285132718Skan 28690075Sobrientree 287132718Skanbuild_typeid (tree exp) 28890075Sobrien{ 28990075Sobrien tree cond = NULL_TREE; 29090075Sobrien int nonnull = 0; 29190075Sobrien 29290075Sobrien if (exp == error_mark_node || !typeid_ok_p ()) 29390075Sobrien return error_mark_node; 29490075Sobrien 29550397Sobrien if (processing_template_decl) 296169689Skan return build_min (TYPEID_EXPR, const_type_info_type_node, exp); 29750397Sobrien 29850397Sobrien if (TREE_CODE (exp) == INDIRECT_REF 29950397Sobrien && TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == POINTER_TYPE 30090075Sobrien && TYPE_POLYMORPHIC_P (TREE_TYPE (exp)) 30150397Sobrien && ! resolves_to_fixed_type_p (exp, &nonnull) 30250397Sobrien && ! nonnull) 30350397Sobrien { 30450397Sobrien exp = stabilize_reference (exp); 30550397Sobrien cond = cp_convert (boolean_type_node, TREE_OPERAND (exp, 0)); 30650397Sobrien } 30750397Sobrien 30890075Sobrien exp = get_tinfo_decl_dynamic (exp); 30950397Sobrien 31050397Sobrien if (exp == error_mark_node) 31150397Sobrien return error_mark_node; 31250397Sobrien 31350397Sobrien if (cond) 31450397Sobrien { 31550397Sobrien tree bad = throw_bad_typeid (); 31650397Sobrien 317169689Skan exp = build3 (COND_EXPR, TREE_TYPE (exp), cond, exp, bad); 31850397Sobrien } 31950397Sobrien 320132718Skan return exp; 32150397Sobrien} 32250397Sobrien 32390075Sobrien/* Generate the NTBS name of a type. */ 32450397Sobrienstatic tree 325132718Skantinfo_name (tree type) 32650397Sobrien{ 32790075Sobrien const char *name; 32890075Sobrien tree name_string; 32950397Sobrien 33090075Sobrien name = mangle_type_string (type); 331117395Skan name_string = fix_string_type (build_string (strlen (name) + 1, name)); 33290075Sobrien return name_string; 33350397Sobrien} 33450397Sobrien 335102780Skan/* Return a VAR_DECL for the internal ABI defined type_info object for 336102780Skan TYPE. You must arrange that the decl is mark_used, if actually use 337169689Skan it --- decls in vtables are only used if the vtable is output. */ 33860967Sobrien 33950397Sobrientree 340132718Skanget_tinfo_decl (tree type) 34150397Sobrien{ 34250397Sobrien tree name; 34350397Sobrien tree d; 34450397Sobrien 345169689Skan if (variably_modified_type_p (type, /*fn=*/NULL_TREE)) 34690075Sobrien { 347169689Skan error ("cannot create type information for type %qT because " 348169689Skan "it involves types of variable size", 349102780Skan type); 35090075Sobrien return error_mark_node; 35190075Sobrien } 35290075Sobrien 35350397Sobrien if (TREE_CODE (type) == METHOD_TYPE) 35450397Sobrien type = build_function_type (TREE_TYPE (type), 35550397Sobrien TREE_CHAIN (TYPE_ARG_TYPES (type))); 35650397Sobrien 357110611Skan /* For a class type, the variable is cached in the type node 358110611Skan itself. */ 359110611Skan if (CLASS_TYPE_P (type)) 360110611Skan { 361110611Skan d = CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)); 362110611Skan if (d) 363110611Skan return d; 364110611Skan } 365169689Skan 36690075Sobrien name = mangle_typeinfo_for_type (type); 36750397Sobrien 36890075Sobrien d = IDENTIFIER_GLOBAL_VALUE (name); 369102780Skan if (!d) 37090075Sobrien { 371169689Skan int ix = get_pseudo_ti_index (type); 372169689Skan tinfo_s *ti = VEC_index (tinfo_s, tinfo_descs, ix); 373102780Skan 374169689Skan d = build_lang_decl (VAR_DECL, name, ti->type); 375169689Skan SET_DECL_ASSEMBLER_NAME (d, name); 376169689Skan /* Remember the type it is for. */ 377169689Skan TREE_TYPE (name) = type; 378169689Skan DECL_TINFO_P (d) = 1; 37990075Sobrien DECL_ARTIFICIAL (d) = 1; 380169689Skan DECL_IGNORED_P (d) = 1; 38190075Sobrien TREE_READONLY (d) = 1; 38290075Sobrien TREE_STATIC (d) = 1; 383169689Skan /* Mark the variable as undefined -- but remember that we can 384169689Skan define it later if we need to do so. */ 38590075Sobrien DECL_EXTERNAL (d) = 1; 386169689Skan DECL_NOT_REALLY_EXTERN (d) = 1; 387110611Skan if (CLASS_TYPE_P (type)) 388110611Skan CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)) = d; 389169689Skan set_linkage_according_to_type (type, d); 390169689Skan pushdecl_top_level_and_finish (d, NULL_TREE); 391110611Skan 392132718Skan /* Add decl to the global array of tinfo decls. */ 393169689Skan VEC_safe_push (tree, gc, unemitted_tinfo_decls, d); 39490075Sobrien } 395102780Skan 39650397Sobrien return d; 39750397Sobrien} 39850397Sobrien 399102780Skan/* Return a pointer to a type_info object describing TYPE, suitably 400102780Skan cast to the language defined type. */ 401102780Skan 402102780Skanstatic tree 403132718Skanget_tinfo_ptr (tree type) 404102780Skan{ 405132718Skan tree decl = get_tinfo_decl (type); 406102780Skan 407132718Skan mark_used (decl); 408169689Skan return build_nop (type_info_ptr_type, 409132718Skan build_address (decl)); 410102780Skan} 411102780Skan 41290075Sobrien/* Return the type_info object for TYPE. */ 41360967Sobrien 41452284Sobrientree 415132718Skanget_typeid (tree type) 41650397Sobrien{ 41790075Sobrien if (type == error_mark_node || !typeid_ok_p ()) 41850397Sobrien return error_mark_node; 419169689Skan 42050397Sobrien if (processing_template_decl) 421169689Skan return build_min (TYPEID_EXPR, const_type_info_type_node, type); 42250397Sobrien 42350397Sobrien /* If the type of the type-id is a reference type, the result of the 42450397Sobrien typeid expression refers to a type_info object representing the 42550397Sobrien referenced type. */ 426132718Skan type = non_reference (type); 42750397Sobrien 42850397Sobrien /* The top-level cv-qualifiers of the lvalue expression or the type-id 42950397Sobrien that is the operand of typeid are always ignored. */ 43050397Sobrien type = TYPE_MAIN_VARIANT (type); 43150397Sobrien 43290075Sobrien if (!VOID_TYPE_P (type)) 43390075Sobrien type = complete_type_or_else (type, NULL_TREE); 434169689Skan 43590075Sobrien if (!type) 43690075Sobrien return error_mark_node; 43752284Sobrien 438102780Skan return build_indirect_ref (get_tinfo_ptr (type), NULL); 43950397Sobrien} 44050397Sobrien 44150397Sobrien/* Check whether TEST is null before returning RESULT. If TEST is used in 44250397Sobrien RESULT, it must have previously had a save_expr applied to it. */ 44350397Sobrien 44450397Sobrienstatic tree 445132718Skanifnonnull (tree test, tree result) 44650397Sobrien{ 447169689Skan return build3 (COND_EXPR, TREE_TYPE (result), 448169689Skan build2 (EQ_EXPR, boolean_type_node, test, 449169689Skan cp_convert (TREE_TYPE (test), integer_zero_node)), 450169689Skan cp_convert (TREE_TYPE (result), integer_zero_node), 451169689Skan result); 45250397Sobrien} 45350397Sobrien 45450397Sobrien/* Execute a dynamic cast, as described in section 5.2.6 of the 9/93 working 45550397Sobrien paper. */ 45650397Sobrien 45750397Sobrienstatic tree 458132718Skanbuild_dynamic_cast_1 (tree type, tree expr) 45950397Sobrien{ 46050397Sobrien enum tree_code tc = TREE_CODE (type); 46190075Sobrien tree exprtype = TREE_TYPE (expr); 46250397Sobrien tree dcast_fn; 46352284Sobrien tree old_expr = expr; 46490075Sobrien const char *errstr = NULL; 46550397Sobrien 466169689Skan /* Save casted types in the function's used types hash table. */ 467169689Skan used_types_insert (type); 468169689Skan 46990075Sobrien /* T shall be a pointer or reference to a complete class type, or 47090075Sobrien `pointer to cv void''. */ 47150397Sobrien switch (tc) 47250397Sobrien { 47350397Sobrien case POINTER_TYPE: 47490075Sobrien if (TREE_CODE (TREE_TYPE (type)) == VOID_TYPE) 47590075Sobrien break; 476169689Skan /* Fall through. */ 47790075Sobrien case REFERENCE_TYPE: 47890075Sobrien if (! IS_AGGR_TYPE (TREE_TYPE (type))) 47950397Sobrien { 48090075Sobrien errstr = "target is not pointer or reference to class"; 48190075Sobrien goto fail; 48250397Sobrien } 48390075Sobrien if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (type)))) 48490075Sobrien { 48590075Sobrien errstr = "target is not pointer or reference to complete type"; 48690075Sobrien goto fail; 48790075Sobrien } 48850397Sobrien break; 48990075Sobrien 49050397Sobrien default: 49190075Sobrien errstr = "target is not pointer or reference"; 49250397Sobrien goto fail; 49350397Sobrien } 49450397Sobrien 49590075Sobrien if (tc == POINTER_TYPE) 49690075Sobrien { 49790075Sobrien /* If T is a pointer type, v shall be an rvalue of a pointer to 49890075Sobrien complete class type, and the result is an rvalue of type T. */ 49990075Sobrien 50090075Sobrien if (TREE_CODE (exprtype) != POINTER_TYPE) 50190075Sobrien { 50290075Sobrien errstr = "source is not a pointer"; 50390075Sobrien goto fail; 50490075Sobrien } 50590075Sobrien if (! IS_AGGR_TYPE (TREE_TYPE (exprtype))) 50690075Sobrien { 50790075Sobrien errstr = "source is not a pointer to class"; 50890075Sobrien goto fail; 50990075Sobrien } 51090075Sobrien if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype)))) 51190075Sobrien { 51290075Sobrien errstr = "source is a pointer to incomplete type"; 51390075Sobrien goto fail; 51490075Sobrien } 51550397Sobrien } 51690075Sobrien else 51790075Sobrien { 518169689Skan exprtype = build_reference_type (exprtype); 519169689Skan 52090075Sobrien /* T is a reference type, v shall be an lvalue of a complete class 52190075Sobrien type, and the result is an lvalue of the type referred to by T. */ 52250397Sobrien 52390075Sobrien if (! IS_AGGR_TYPE (TREE_TYPE (exprtype))) 52490075Sobrien { 52590075Sobrien errstr = "source is not of class type"; 52690075Sobrien goto fail; 52790075Sobrien } 52890075Sobrien if (!COMPLETE_TYPE_P (complete_type (TREE_TYPE (exprtype)))) 52990075Sobrien { 53090075Sobrien errstr = "source is of incomplete class type"; 53190075Sobrien goto fail; 53290075Sobrien } 533169689Skan 534169689Skan /* Apply trivial conversion T -> T& for dereferenced ptrs. */ 535169689Skan expr = convert_to_reference (exprtype, expr, CONV_IMPLICIT, 536169689Skan LOOKUP_NORMAL, NULL_TREE); 53790075Sobrien } 53890075Sobrien 53990075Sobrien /* The dynamic_cast operator shall not cast away constness. */ 54090075Sobrien if (!at_least_as_qualified_p (TREE_TYPE (type), 54190075Sobrien TREE_TYPE (exprtype))) 54290075Sobrien { 54390075Sobrien errstr = "conversion casts away constness"; 54490075Sobrien goto fail; 54590075Sobrien } 54690075Sobrien 54750397Sobrien /* If *type is an unambiguous accessible base class of *exprtype, 54850397Sobrien convert statically. */ 54950397Sobrien { 55090075Sobrien tree binfo; 55150397Sobrien 55290075Sobrien binfo = lookup_base (TREE_TYPE (exprtype), TREE_TYPE (type), 553169689Skan ba_check, NULL); 55452284Sobrien 55590075Sobrien if (binfo) 55652284Sobrien { 55790075Sobrien expr = build_base_path (PLUS_EXPR, convert_from_reference (expr), 55890075Sobrien binfo, 0); 55990075Sobrien if (TREE_CODE (exprtype) == POINTER_TYPE) 560169689Skan expr = rvalue (expr); 56190075Sobrien return expr; 56252284Sobrien } 56350397Sobrien } 56450397Sobrien 56550397Sobrien /* Otherwise *exprtype must be a polymorphic class (have a vtbl). */ 56690075Sobrien if (TYPE_POLYMORPHIC_P (TREE_TYPE (exprtype))) 56750397Sobrien { 56850397Sobrien tree expr1; 56950397Sobrien /* if TYPE is `void *', return pointer to complete object. */ 57090075Sobrien if (tc == POINTER_TYPE && VOID_TYPE_P (TREE_TYPE (type))) 57150397Sobrien { 57250397Sobrien /* if b is an object, dynamic_cast<void *>(&b) == (void *)&b. */ 57350397Sobrien if (TREE_CODE (expr) == ADDR_EXPR 57450397Sobrien && TREE_CODE (TREE_OPERAND (expr, 0)) == VAR_DECL 57550397Sobrien && TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == RECORD_TYPE) 57650397Sobrien return build1 (NOP_EXPR, type, expr); 57750397Sobrien 57850397Sobrien /* Since expr is used twice below, save it. */ 57950397Sobrien expr = save_expr (expr); 58050397Sobrien 58150397Sobrien expr1 = build_headof (expr); 58250397Sobrien if (TREE_TYPE (expr1) != type) 58350397Sobrien expr1 = build1 (NOP_EXPR, type, expr1); 58450397Sobrien return ifnonnull (expr, expr1); 58550397Sobrien } 58650397Sobrien else 58750397Sobrien { 58850397Sobrien tree retval; 589169689Skan tree result, td2, td3, elems; 590169689Skan tree static_type, target_type, boff; 59150397Sobrien 592169689Skan /* If we got here, we can't convert statically. Therefore, 59350397Sobrien dynamic_cast<D&>(b) (b an object) cannot succeed. */ 59490075Sobrien if (tc == REFERENCE_TYPE) 59550397Sobrien { 59652284Sobrien if (TREE_CODE (old_expr) == VAR_DECL 59752284Sobrien && TREE_CODE (TREE_TYPE (old_expr)) == RECORD_TYPE) 59850397Sobrien { 599169689Skan tree expr = throw_bad_cast (); 600169689Skan warning (0, "dynamic_cast of %q#D to %q#T can never succeed", 601169689Skan old_expr, type); 602169689Skan /* Bash it to the expected type. */ 603169689Skan TREE_TYPE (expr) = type; 60490075Sobrien return expr; 60550397Sobrien } 60650397Sobrien } 60750397Sobrien /* Ditto for dynamic_cast<D*>(&b). */ 60850397Sobrien else if (TREE_CODE (expr) == ADDR_EXPR) 60950397Sobrien { 61050397Sobrien tree op = TREE_OPERAND (expr, 0); 61150397Sobrien if (TREE_CODE (op) == VAR_DECL 61250397Sobrien && TREE_CODE (TREE_TYPE (op)) == RECORD_TYPE) 61350397Sobrien { 614169689Skan warning (0, "dynamic_cast of %q#D to %q#T can never succeed", 615169689Skan op, type); 616169689Skan retval = build_int_cst (type, 0); 61750397Sobrien return retval; 61850397Sobrien } 61950397Sobrien } 62050397Sobrien 621169689Skan /* Use of dynamic_cast when -fno-rtti is prohibited. */ 622169689Skan if (!flag_rtti) 623169689Skan { 624169689Skan error ("%<dynamic_cast%> not permitted with -fno-rtti"); 625169689Skan return error_mark_node; 626169689Skan } 627169689Skan 62890075Sobrien target_type = TYPE_MAIN_VARIANT (TREE_TYPE (type)); 62990075Sobrien static_type = TYPE_MAIN_VARIANT (TREE_TYPE (exprtype)); 630132718Skan td2 = get_tinfo_decl (target_type); 631132718Skan mark_used (td2); 632132718Skan td2 = build_unary_op (ADDR_EXPR, td2, 0); 633132718Skan td3 = get_tinfo_decl (static_type); 634132718Skan mark_used (td3); 635132718Skan td3 = build_unary_op (ADDR_EXPR, td3, 0); 63690075Sobrien 637169689Skan /* Determine how T and V are related. */ 638169689Skan boff = dcast_base_hint (static_type, target_type); 639169689Skan 64050397Sobrien /* Since expr is used twice below, save it. */ 64150397Sobrien expr = save_expr (expr); 64250397Sobrien 64350397Sobrien expr1 = expr; 64450397Sobrien if (tc == REFERENCE_TYPE) 64550397Sobrien expr1 = build_unary_op (ADDR_EXPR, expr1, 0); 64650397Sobrien 64790075Sobrien elems = tree_cons 64890075Sobrien (NULL_TREE, expr1, tree_cons 64990075Sobrien (NULL_TREE, td3, tree_cons 65090075Sobrien (NULL_TREE, td2, tree_cons 65190075Sobrien (NULL_TREE, boff, NULL_TREE)))); 65250397Sobrien 65390075Sobrien dcast_fn = dynamic_cast_node; 65490075Sobrien if (!dcast_fn) 65550397Sobrien { 65650397Sobrien tree tmp; 65790075Sobrien tree tinfo_ptr; 65890075Sobrien tree ns = abi_node; 65990075Sobrien const char *name; 660169689Skan 66190075Sobrien push_nested_namespace (ns); 662117395Skan tinfo_ptr = xref_tag (class_type, 66390075Sobrien get_identifier ("__class_type_info"), 664169689Skan /*tag_scope=*/ts_current, false); 665169689Skan 66690075Sobrien tinfo_ptr = build_pointer_type 66790075Sobrien (build_qualified_type 66890075Sobrien (tinfo_ptr, TYPE_QUAL_CONST)); 66990075Sobrien name = "__dynamic_cast"; 67050397Sobrien tmp = tree_cons 67190075Sobrien (NULL_TREE, const_ptr_type_node, tree_cons 67290075Sobrien (NULL_TREE, tinfo_ptr, tree_cons 67390075Sobrien (NULL_TREE, tinfo_ptr, tree_cons 67490075Sobrien (NULL_TREE, ptrdiff_type_node, void_list_node)))); 67550397Sobrien tmp = build_function_type (ptr_type_node, tmp); 67690075Sobrien dcast_fn = build_library_fn_ptr (name, tmp); 677132718Skan DECL_IS_PURE (dcast_fn) = 1; 678169689Skan pop_nested_namespace (ns); 679169689Skan dynamic_cast_node = dcast_fn; 68050397Sobrien } 681169689Skan result = build_cxx_call (dcast_fn, elems); 68250397Sobrien 68350397Sobrien if (tc == REFERENCE_TYPE) 68450397Sobrien { 68590075Sobrien tree bad = throw_bad_cast (); 686169689Skan tree neq; 687169689Skan 68850397Sobrien result = save_expr (result); 689169689Skan neq = c_common_truthvalue_conversion (result); 690169689Skan return build3 (COND_EXPR, type, neq, result, bad); 69150397Sobrien } 69250397Sobrien 69350397Sobrien /* Now back to the type we want from a void*. */ 69450397Sobrien result = cp_convert (type, result); 695169689Skan return ifnonnull (expr, result); 69650397Sobrien } 69750397Sobrien } 69890075Sobrien else 69990075Sobrien errstr = "source type is not polymorphic"; 70050397Sobrien 70150397Sobrien fail: 702169689Skan error ("cannot dynamic_cast %qE (of type %q#T) to type %q#T (%s)", 703169689Skan expr, exprtype, type, errstr); 70450397Sobrien return error_mark_node; 70550397Sobrien} 70650397Sobrien 70750397Sobrientree 708132718Skanbuild_dynamic_cast (tree type, tree expr) 70950397Sobrien{ 71050397Sobrien if (type == error_mark_node || expr == error_mark_node) 71150397Sobrien return error_mark_node; 712169689Skan 71350397Sobrien if (processing_template_decl) 714132718Skan { 715132718Skan expr = build_min (DYNAMIC_CAST_EXPR, type, expr); 716132718Skan TREE_SIDE_EFFECTS (expr) = 1; 717169689Skan 718132718Skan return expr; 719132718Skan } 72050397Sobrien 72150397Sobrien return convert_from_reference (build_dynamic_cast_1 (type, expr)); 72250397Sobrien} 72350397Sobrien 72490075Sobrien/* Return the runtime bit mask encoding the qualifiers of TYPE. */ 72550397Sobrien 72690075Sobrienstatic int 727132718Skanqualifier_flags (tree type) 72890075Sobrien{ 72990075Sobrien int flags = 0; 730117395Skan int quals = cp_type_quals (type); 731169689Skan 73290075Sobrien if (quals & TYPE_QUAL_CONST) 73390075Sobrien flags |= 1; 73490075Sobrien if (quals & TYPE_QUAL_VOLATILE) 73590075Sobrien flags |= 2; 73690075Sobrien if (quals & TYPE_QUAL_RESTRICT) 73790075Sobrien flags |= 4; 73890075Sobrien return flags; 73990075Sobrien} 74050397Sobrien 741132718Skan/* Return true, if the pointer chain TYPE ends at an incomplete type, or 74290075Sobrien contains a pointer to member of an incomplete class. */ 74350397Sobrien 744132718Skanstatic bool 745132718Skantarget_incomplete_p (tree type) 74690075Sobrien{ 747132718Skan while (true) 74890075Sobrien if (TYPE_PTRMEM_P (type)) 74990075Sobrien { 750132718Skan if (!COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type))) 751132718Skan return true; 752132718Skan type = TYPE_PTRMEM_POINTED_TO_TYPE (type); 75390075Sobrien } 754132718Skan else if (TREE_CODE (type) == POINTER_TYPE) 755132718Skan type = TREE_TYPE (type); 75690075Sobrien else 757132718Skan return !COMPLETE_OR_VOID_TYPE_P (type); 75890075Sobrien} 75950397Sobrien 760169689Skan/* Returns true if TYPE involves an incomplete class type; in that 761169689Skan case, typeinfo variables for TYPE should be emitted with internal 762169689Skan linkage. */ 763169689Skan 764169689Skanstatic bool 765169689Skaninvolves_incomplete_p (tree type) 766169689Skan{ 767169689Skan switch (TREE_CODE (type)) 768169689Skan { 769169689Skan case POINTER_TYPE: 770169689Skan return target_incomplete_p (TREE_TYPE (type)); 771169689Skan 772169689Skan case OFFSET_TYPE: 773169689Skan ptrmem: 774169689Skan return 775169689Skan (target_incomplete_p (TYPE_PTRMEM_POINTED_TO_TYPE (type)) 776169689Skan || !COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type))); 777169689Skan 778169689Skan case RECORD_TYPE: 779169689Skan if (TYPE_PTRMEMFUNC_P (type)) 780169689Skan goto ptrmem; 781169689Skan /* Fall through. */ 782169689Skan case UNION_TYPE: 783169689Skan if (!COMPLETE_TYPE_P (type)) 784169689Skan return true; 785169689Skan 786169689Skan default: 787169689Skan /* All other types do not involve incomplete class types. */ 788169689Skan return false; 789169689Skan } 790169689Skan} 791169689Skan 79290075Sobrien/* Return a CONSTRUCTOR for the common part of the type_info objects. This 79390075Sobrien is the vtable pointer and NTBS name. The NTBS name is emitted as a 79490075Sobrien comdat const char array, so it becomes a unique key for the type. Generate 79590075Sobrien and emit that VAR_DECL here. (We can't always emit the type_info itself 79690075Sobrien as comdat, because of pointers to incomplete.) */ 79750397Sobrien 79890075Sobrienstatic tree 799169689Skantinfo_base_init (tinfo_s *ti, tree target) 80050397Sobrien{ 80190075Sobrien tree init = NULL_TREE; 80290075Sobrien tree name_decl; 803102780Skan tree vtable_ptr; 804169689Skan 80590075Sobrien { 80690075Sobrien tree name_name; 807169689Skan 80890075Sobrien /* Generate the NTBS array variable. */ 80990075Sobrien tree name_type = build_cplus_array_type 810169689Skan (build_qualified_type (char_type_node, TYPE_QUAL_CONST), 811169689Skan NULL_TREE); 81290075Sobrien tree name_string = tinfo_name (target); 81350397Sobrien 814169689Skan /* Determine the name of the variable -- and remember with which 815169689Skan type it is associated. */ 81690075Sobrien name_name = mangle_typeinfo_string_for_type (target); 817169689Skan TREE_TYPE (name_name) = target; 818169689Skan 81990075Sobrien name_decl = build_lang_decl (VAR_DECL, name_name, name_type); 820169689Skan SET_DECL_ASSEMBLER_NAME (name_decl, name_name); 82190075Sobrien DECL_ARTIFICIAL (name_decl) = 1; 822169689Skan DECL_IGNORED_P (name_decl) = 1; 82390075Sobrien TREE_READONLY (name_decl) = 1; 82490075Sobrien TREE_STATIC (name_decl) = 1; 82590075Sobrien DECL_EXTERNAL (name_decl) = 0; 826169689Skan DECL_TINFO_P (name_decl) = 1; 827169689Skan set_linkage_according_to_type (target, name_decl); 828169689Skan import_export_decl (name_decl); 82990075Sobrien DECL_INITIAL (name_decl) = name_string; 830132718Skan mark_used (name_decl); 831117395Skan pushdecl_top_level_and_finish (name_decl, name_string); 83290075Sobrien } 833102780Skan 834169689Skan vtable_ptr = ti->vtable; 835102780Skan if (!vtable_ptr) 836102780Skan { 837102780Skan tree real_type; 838102780Skan push_nested_namespace (abi_node); 839169689Skan real_type = xref_tag (class_type, ti->name, 840169689Skan /*tag_scope=*/ts_current, false); 841102780Skan pop_nested_namespace (abi_node); 842169689Skan 843102780Skan if (!COMPLETE_TYPE_P (real_type)) 844102780Skan { 845169689Skan /* We never saw a definition of this type, so we need to 846102780Skan tell the compiler that this is an exported class, as 847102780Skan indeed all of the __*_type_info classes are. */ 848102780Skan SET_CLASSTYPE_INTERFACE_KNOWN (real_type); 849102780Skan CLASSTYPE_INTERFACE_ONLY (real_type) = 1; 850102780Skan } 851102780Skan 852102780Skan vtable_ptr = get_vtable_decl (real_type, /*complete=*/1); 853102780Skan vtable_ptr = build_unary_op (ADDR_EXPR, vtable_ptr, 0); 854102780Skan 855102780Skan /* We need to point into the middle of the vtable. */ 856169689Skan vtable_ptr = build2 857102780Skan (PLUS_EXPR, TREE_TYPE (vtable_ptr), vtable_ptr, 858102780Skan size_binop (MULT_EXPR, 859117395Skan size_int (2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE), 860102780Skan TYPE_SIZE_UNIT (vtable_entry_type))); 861102780Skan 862169689Skan ti->vtable = vtable_ptr; 86390075Sobrien } 864102780Skan 865102780Skan init = tree_cons (NULL_TREE, vtable_ptr, init); 866169689Skan 86790075Sobrien init = tree_cons (NULL_TREE, decay_conversion (name_decl), init); 868169689Skan 869169689Skan init = build_constructor_from_list (NULL_TREE, nreverse (init)); 870169689Skan TREE_CONSTANT (init) = 1; 871169689Skan TREE_INVARIANT (init) = 1; 872169689Skan TREE_STATIC (init) = 1; 87390075Sobrien init = tree_cons (NULL_TREE, init, NULL_TREE); 874169689Skan 87590075Sobrien return init; 87690075Sobrien} 87750397Sobrien 878169689Skan/* Return the CONSTRUCTOR expr for a type_info of TYPE. TI provides the 87990075Sobrien information about the particular type_info derivation, which adds no 88090075Sobrien additional fields to the type_info base. */ 88190075Sobrien 88290075Sobrienstatic tree 883169689Skangeneric_initializer (tinfo_s *ti, tree target) 88490075Sobrien{ 885169689Skan tree init = tinfo_base_init (ti, target); 886169689Skan 887169689Skan init = build_constructor_from_list (NULL_TREE, init); 888169689Skan TREE_CONSTANT (init) = 1; 889169689Skan TREE_INVARIANT (init) = 1; 890169689Skan TREE_STATIC (init) = 1; 89190075Sobrien return init; 89250397Sobrien} 89350397Sobrien 89490075Sobrien/* Return the CONSTRUCTOR expr for a type_info of pointer TYPE. 895169689Skan TI provides information about the particular type_info derivation, 89690075Sobrien which adds target type and qualifier flags members to the type_info base. */ 89750397Sobrien 89890075Sobrienstatic tree 899169689Skanptr_initializer (tinfo_s *ti, tree target) 90050397Sobrien{ 901169689Skan tree init = tinfo_base_init (ti, target); 90290075Sobrien tree to = TREE_TYPE (target); 90390075Sobrien int flags = qualifier_flags (to); 904132718Skan bool incomplete = target_incomplete_p (to); 905169689Skan 90690075Sobrien if (incomplete) 907169689Skan flags |= 8; 908169689Skan init = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, flags), init); 90990075Sobrien init = tree_cons (NULL_TREE, 910169689Skan get_tinfo_ptr (TYPE_MAIN_VARIANT (to)), 911169689Skan init); 912169689Skan 913169689Skan init = build_constructor_from_list (NULL_TREE, nreverse (init)); 914169689Skan TREE_CONSTANT (init) = 1; 915169689Skan TREE_INVARIANT (init) = 1; 916169689Skan TREE_STATIC (init) = 1; 91790075Sobrien return init; 91890075Sobrien} 91950397Sobrien 92090075Sobrien/* Return the CONSTRUCTOR expr for a type_info of pointer to member data TYPE. 921169689Skan TI provides information about the particular type_info derivation, 92290075Sobrien which adds class, target type and qualifier flags members to the type_info 92390075Sobrien base. */ 92450397Sobrien 92590075Sobrienstatic tree 926169689Skanptm_initializer (tinfo_s *ti, tree target) 92790075Sobrien{ 928169689Skan tree init = tinfo_base_init (ti, target); 92990075Sobrien tree to = TYPE_PTRMEM_POINTED_TO_TYPE (target); 93090075Sobrien tree klass = TYPE_PTRMEM_CLASS_TYPE (target); 93190075Sobrien int flags = qualifier_flags (to); 932132718Skan bool incomplete = target_incomplete_p (to); 933169689Skan 93490075Sobrien if (incomplete) 935169689Skan flags |= 0x8; 93690075Sobrien if (!COMPLETE_TYPE_P (klass)) 937169689Skan flags |= 0x10; 938169689Skan init = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, flags), init); 93990075Sobrien init = tree_cons (NULL_TREE, 940102780Skan get_tinfo_ptr (TYPE_MAIN_VARIANT (to)), 941169689Skan init); 94290075Sobrien init = tree_cons (NULL_TREE, 943102780Skan get_tinfo_ptr (klass), 944169689Skan init); 94550397Sobrien 946169689Skan init = build_constructor_from_list (NULL_TREE, nreverse (init)); 947169689Skan TREE_CONSTANT (init) = 1; 948169689Skan TREE_INVARIANT (init) = 1; 949169689Skan TREE_STATIC (init) = 1; 950169689Skan return init; 951132718Skan} 95250397Sobrien 95390075Sobrien/* Return the CONSTRUCTOR expr for a type_info of class TYPE. 954169689Skan TI provides information about the particular __class_type_info derivation, 95590075Sobrien which adds hint flags and TRAIL initializers to the type_info base. */ 95650397Sobrien 95790075Sobrienstatic tree 958169689Skanclass_initializer (tinfo_s *ti, tree target, tree trail) 95990075Sobrien{ 960169689Skan tree init = tinfo_base_init (ti, target); 961169689Skan 96290075Sobrien TREE_CHAIN (init) = trail; 963169689Skan init = build_constructor_from_list (NULL_TREE, init); 964169689Skan TREE_CONSTANT (init) = 1; 965169689Skan TREE_INVARIANT (init) = 1; 966169689Skan TREE_STATIC (init) = 1; 967169689Skan return init; 96890075Sobrien} 96950397Sobrien 970132718Skan/* Returns true if the typeinfo for type should be placed in 97190075Sobrien the runtime library. */ 97250397Sobrien 973132718Skanstatic bool 974132718Skantypeinfo_in_lib_p (tree type) 97590075Sobrien{ 97690075Sobrien /* The typeinfo objects for `T*' and `const T*' are in the runtime 97790075Sobrien library for simple types T. */ 97890075Sobrien if (TREE_CODE (type) == POINTER_TYPE 97990075Sobrien && (cp_type_quals (TREE_TYPE (type)) == TYPE_QUAL_CONST 98090075Sobrien || cp_type_quals (TREE_TYPE (type)) == TYPE_UNQUALIFIED)) 98190075Sobrien type = TREE_TYPE (type); 98250397Sobrien 98390075Sobrien switch (TREE_CODE (type)) 98490075Sobrien { 98590075Sobrien case INTEGER_TYPE: 98690075Sobrien case BOOLEAN_TYPE: 98790075Sobrien case REAL_TYPE: 98890075Sobrien case VOID_TYPE: 989132718Skan return true; 990169689Skan 99190075Sobrien default: 992132718Skan return false; 99390075Sobrien } 99490075Sobrien} 99550397Sobrien 996169689Skan/* Generate the initializer for the type info describing TYPE. TK_INDEX is 997169689Skan the index of the descriptor in the tinfo_desc vector. */ 99890075Sobrien 99990075Sobrienstatic tree 1000169689Skanget_pseudo_ti_init (tree type, unsigned tk_index) 100190075Sobrien{ 1002169689Skan tinfo_s *ti = VEC_index (tinfo_s, tinfo_descs, tk_index); 1003169689Skan 1004169689Skan gcc_assert (at_eof); 1005169689Skan switch (tk_index) 100690075Sobrien { 1007169689Skan case TK_POINTER_MEMBER_TYPE: 1008169689Skan return ptm_initializer (ti, type); 1009102780Skan 1010169689Skan case TK_POINTER_TYPE: 1011169689Skan return ptr_initializer (ti, type); 101250397Sobrien 1013169689Skan case TK_BUILTIN_TYPE: 1014169689Skan case TK_ENUMERAL_TYPE: 1015169689Skan case TK_FUNCTION_TYPE: 1016169689Skan case TK_ARRAY_TYPE: 1017169689Skan return generic_initializer (ti, type); 1018169689Skan 1019169689Skan case TK_CLASS_TYPE: 1020169689Skan return class_initializer (ti, type, NULL_TREE); 1021169689Skan 1022169689Skan case TK_SI_CLASS_TYPE: 1023169689Skan { 1024169689Skan tree base_binfo = BINFO_BASE_BINFO (TYPE_BINFO (type), 0); 1025169689Skan tree tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo)); 1026169689Skan tree base_inits = tree_cons (NULL_TREE, tinfo, NULL_TREE); 1027169689Skan 1028169689Skan /* get_tinfo_ptr might have reallocated the tinfo_descs vector. */ 1029169689Skan ti = VEC_index (tinfo_s, tinfo_descs, tk_index); 1030169689Skan return class_initializer (ti, type, base_inits); 1031169689Skan } 1032169689Skan 103390075Sobrien default: 1034169689Skan { 1035169689Skan int hint = ((CLASSTYPE_REPEATED_BASE_P (type) << 0) 1036169689Skan | (CLASSTYPE_DIAMOND_SHAPED_P (type) << 1)); 1037169689Skan tree binfo = TYPE_BINFO (type); 1038169689Skan int nbases = BINFO_N_BASE_BINFOS (binfo); 1039169689Skan VEC(tree,gc) *base_accesses = BINFO_BASE_ACCESSES (binfo); 1040169689Skan tree base_inits = NULL_TREE; 1041169689Skan int ix; 1042169689Skan 1043169689Skan gcc_assert (tk_index >= TK_FIXED); 1044169689Skan 1045169689Skan /* Generate the base information initializer. */ 1046169689Skan for (ix = nbases; ix--;) 1047169689Skan { 1048169689Skan tree base_binfo = BINFO_BASE_BINFO (binfo, ix); 1049169689Skan tree base_init = NULL_TREE; 1050169689Skan int flags = 0; 1051169689Skan tree tinfo; 1052169689Skan tree offset; 1053169689Skan 1054169689Skan if (VEC_index (tree, base_accesses, ix) == access_public_node) 1055169689Skan flags |= 2; 1056169689Skan tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo)); 1057169689Skan if (BINFO_VIRTUAL_P (base_binfo)) 1058169689Skan { 1059169689Skan /* We store the vtable offset at which the virtual 1060169689Skan base offset can be found. */ 1061169689Skan offset = BINFO_VPTR_FIELD (base_binfo); 1062169689Skan offset = convert (sizetype, offset); 1063169689Skan flags |= 1; 1064169689Skan } 1065169689Skan else 1066169689Skan offset = BINFO_OFFSET (base_binfo); 1067169689Skan 1068169689Skan /* Combine offset and flags into one field. */ 1069169689Skan offset = cp_build_binary_op (LSHIFT_EXPR, offset, 1070169689Skan build_int_cst (NULL_TREE, 8)); 1071169689Skan offset = cp_build_binary_op (BIT_IOR_EXPR, offset, 1072169689Skan build_int_cst (NULL_TREE, flags)); 1073169689Skan base_init = tree_cons (NULL_TREE, offset, base_init); 1074169689Skan base_init = tree_cons (NULL_TREE, tinfo, base_init); 1075169689Skan base_init = build_constructor_from_list (NULL_TREE, base_init); 1076169689Skan base_inits = tree_cons (NULL_TREE, base_init, base_inits); 1077169689Skan } 1078169689Skan base_inits = build_constructor_from_list (NULL_TREE, base_inits); 1079169689Skan base_inits = tree_cons (NULL_TREE, base_inits, NULL_TREE); 1080169689Skan /* Prepend the number of bases. */ 1081169689Skan base_inits = tree_cons (NULL_TREE, 1082169689Skan build_int_cst (NULL_TREE, nbases), 1083169689Skan base_inits); 1084169689Skan /* Prepend the hint flags. */ 1085169689Skan base_inits = tree_cons (NULL_TREE, 1086169689Skan build_int_cst (NULL_TREE, hint), 1087169689Skan base_inits); 1088169689Skan 1089169689Skan /* get_tinfo_ptr might have reallocated the tinfo_descs vector. */ 1090169689Skan ti = VEC_index (tinfo_s, tinfo_descs, tk_index); 1091169689Skan return class_initializer (ti, type, base_inits); 1092169689Skan } 109350397Sobrien } 109490075Sobrien} 109550397Sobrien 109690075Sobrien/* Generate the RECORD_TYPE containing the data layout of a type_info 109790075Sobrien derivative as used by the runtime. This layout must be consistent with 109890075Sobrien that defined in the runtime support. Also generate the VAR_DECL for the 109990075Sobrien type's vtable. We explicitly manage the vtable member, and name it for 110090075Sobrien real type as used in the runtime. The RECORD type has a different name, 110190075Sobrien to avoid collisions. Return a TREE_LIST who's TINFO_PSEUDO_TYPE 1102102780Skan is the generated type and TINFO_VTABLE_NAME is the name of the 1103102780Skan vtable. We have to delay generating the VAR_DECL of the vtable 1104102780Skan until the end of the translation, when we'll have seen the library 1105102780Skan definition, if there was one. 1106169689Skan 110790075Sobrien REAL_NAME is the runtime's name of the type. Trailing arguments are 110890075Sobrien additional FIELD_DECL's for the structure. The final argument must be 110990075Sobrien NULL. */ 111050397Sobrien 1111169689Skanstatic void 1112169689Skancreate_pseudo_type_info (int tk, const char *real_name, ...) 111350397Sobrien{ 1114169689Skan tinfo_s *ti; 1115102780Skan tree pseudo_type; 111690075Sobrien char *pseudo_name; 1117132718Skan tree fields; 111890075Sobrien tree field_decl; 1119132718Skan va_list ap; 112050397Sobrien 1121169689Skan va_start (ap, real_name); 112250397Sobrien 1123117395Skan /* Generate the pseudo type name. */ 1124169689Skan pseudo_name = (char *) alloca (strlen (real_name) + 30); 112590075Sobrien strcpy (pseudo_name, real_name); 112690075Sobrien strcat (pseudo_name, "_pseudo"); 1127169689Skan if (tk >= TK_FIXED) 1128169689Skan sprintf (pseudo_name + strlen (pseudo_name), "%d", tk - TK_FIXED); 1129169689Skan 1130117395Skan /* First field is the pseudo type_info base class. */ 1131169689Skan fields = build_decl (FIELD_DECL, NULL_TREE, 1132169689Skan VEC_index (tinfo_s, tinfo_descs, 1133169689Skan TK_TYPE_INFO_TYPE)->type); 1134169689Skan 113590075Sobrien /* Now add the derived fields. */ 1136132718Skan while ((field_decl = va_arg (ap, tree))) 1137132718Skan { 1138132718Skan TREE_CHAIN (field_decl) = fields; 1139132718Skan fields = field_decl; 1140132718Skan } 1141169689Skan 1142117395Skan /* Create the pseudo type. */ 114390075Sobrien pseudo_type = make_aggr_type (RECORD_TYPE); 1144132718Skan finish_builtin_struct (pseudo_type, pseudo_name, fields, NULL_TREE); 1145117395Skan CLASSTYPE_AS_BASE (pseudo_type) = pseudo_type; 114690075Sobrien 1147169689Skan ti = VEC_index (tinfo_s, tinfo_descs, tk); 1148169689Skan ti->type = cp_build_qualified_type (pseudo_type, TYPE_QUAL_CONST); 1149169689Skan ti->name = get_identifier (real_name); 1150169689Skan ti->vtable = NULL_TREE; 1151169689Skan 1152169689Skan /* Pretend this is public so determine_visibility doesn't give vtables 1153169689Skan internal linkage. */ 1154169689Skan TREE_PUBLIC (TYPE_MAIN_DECL (ti->type)) = 1; 1155169689Skan 1156132718Skan va_end (ap); 115750397Sobrien} 115850397Sobrien 1159169689Skan/* Return the index of a pseudo type info type node used to describe 1160169689Skan TYPE. TYPE must be a complete type (or cv void), except at the end 1161169689Skan of the translation unit. */ 116250397Sobrien 1163169689Skanstatic unsigned 1164169689Skanget_pseudo_ti_index (tree type) 116550397Sobrien{ 1166169689Skan unsigned ix; 1167169689Skan 1168102780Skan switch (TREE_CODE (type)) 116950397Sobrien { 1170132718Skan case OFFSET_TYPE: 1171169689Skan ix = TK_POINTER_MEMBER_TYPE; 1172169689Skan break; 1173169689Skan 1174102780Skan case POINTER_TYPE: 1175169689Skan ix = TK_POINTER_TYPE; 1176169689Skan break; 1177169689Skan 1178102780Skan case ENUMERAL_TYPE: 1179169689Skan ix = TK_ENUMERAL_TYPE; 1180169689Skan break; 1181169689Skan 1182102780Skan case FUNCTION_TYPE: 1183169689Skan ix = TK_FUNCTION_TYPE; 1184169689Skan break; 1185169689Skan 1186102780Skan case ARRAY_TYPE: 1187169689Skan ix = TK_ARRAY_TYPE; 1188169689Skan break; 1189169689Skan 1190102780Skan case UNION_TYPE: 1191102780Skan case RECORD_TYPE: 1192102780Skan if (TYPE_PTRMEMFUNC_P (type)) 1193169689Skan { 1194169689Skan ix = TK_POINTER_MEMBER_TYPE; 1195169689Skan break; 1196169689Skan } 1197102780Skan else if (!COMPLETE_TYPE_P (type)) 1198102780Skan { 1199117395Skan if (!at_eof) 1200117395Skan cxx_incomplete_type_error (NULL_TREE, type); 1201169689Skan ix = TK_CLASS_TYPE; 1202169689Skan break; 1203102780Skan } 1204169689Skan else if (!BINFO_N_BASE_BINFOS (TYPE_BINFO (type))) 1205169689Skan { 1206169689Skan ix = TK_CLASS_TYPE; 1207169689Skan break; 1208169689Skan } 1209102780Skan else 1210102780Skan { 1211132718Skan tree binfo = TYPE_BINFO (type); 1212169689Skan VEC(tree,gc) *base_accesses = BINFO_BASE_ACCESSES (binfo); 1213169689Skan tree base_binfo = BINFO_BASE_BINFO (binfo, 0); 1214169689Skan int num_bases = BINFO_N_BASE_BINFOS (binfo); 1215169689Skan 1216102780Skan if (num_bases == 1 1217169689Skan && VEC_index (tree, base_accesses, 0) == access_public_node 1218169689Skan && !BINFO_VIRTUAL_P (base_binfo) 1219102780Skan && integer_zerop (BINFO_OFFSET (base_binfo))) 1220169689Skan { 1221169689Skan /* single non-virtual public. */ 1222169689Skan ix = TK_SI_CLASS_TYPE; 1223169689Skan break; 1224169689Skan } 1225102780Skan else 1226102780Skan { 1227169689Skan tinfo_s *ti; 1228102780Skan tree array_domain, base_array; 1229169689Skan 1230169689Skan ix = TK_FIXED + num_bases; 1231169689Skan if (VEC_length (tinfo_s, tinfo_descs) <= ix) 1232102780Skan { 1233169689Skan /* too short, extend. */ 1234169689Skan unsigned len = VEC_length (tinfo_s, tinfo_descs); 1235169689Skan 1236169689Skan VEC_safe_grow (tinfo_s, gc, tinfo_descs, ix + 1); 1237169689Skan while (VEC_iterate (tinfo_s, tinfo_descs, len++, ti)) 1238169689Skan ti->type = ti->vtable = ti->name = NULL_TREE; 1239102780Skan } 1240169689Skan else if (VEC_index (tinfo_s, tinfo_descs, ix)->type) 1241169689Skan /* already created. */ 1242169689Skan break; 1243169689Skan 1244132718Skan /* Create the array of __base_class_type_info entries. 1245132718Skan G++ 3.2 allocated an array that had one too many 1246132718Skan entries, and then filled that extra entries with 1247132718Skan zeros. */ 1248132718Skan if (abi_version_at_least (2)) 1249132718Skan array_domain = build_index_type (size_int (num_bases - 1)); 1250132718Skan else 1251132718Skan array_domain = build_index_type (size_int (num_bases)); 1252102780Skan base_array = 1253169689Skan build_array_type (VEC_index (tinfo_s, tinfo_descs, 1254169689Skan TK_BASE_TYPE)->type, 1255169689Skan array_domain); 125650397Sobrien 1257102780Skan push_nested_namespace (abi_node); 1258169689Skan create_pseudo_type_info 1259169689Skan (ix, "__vmi_class_type_info", 1260102780Skan build_decl (FIELD_DECL, NULL_TREE, integer_type_node), 1261102780Skan build_decl (FIELD_DECL, NULL_TREE, integer_type_node), 1262102780Skan build_decl (FIELD_DECL, NULL_TREE, base_array), 1263102780Skan NULL); 1264102780Skan pop_nested_namespace (abi_node); 1265169689Skan break; 1266102780Skan } 1267102780Skan } 1268102780Skan default: 1269169689Skan ix = TK_BUILTIN_TYPE; 1270169689Skan break; 1271102780Skan } 1272169689Skan return ix; 127350397Sobrien} 127450397Sobrien 127590075Sobrien/* Make sure the required builtin types exist for generating the type_info 1276169689Skan variable definitions. */ 127750397Sobrien 127850397Sobrienstatic void 1279132718Skancreate_tinfo_types (void) 128050397Sobrien{ 1281169689Skan tinfo_s *ti; 1282102780Skan 1283169689Skan gcc_assert (!tinfo_descs); 1284169689Skan 1285169689Skan VEC_safe_grow (tinfo_s, gc, tinfo_descs, TK_FIXED); 1286169689Skan 128790075Sobrien push_nested_namespace (abi_node); 1288169689Skan 128990075Sobrien /* Create the internal type_info structure. This is used as a base for 129090075Sobrien the other structures. */ 129190075Sobrien { 1292132718Skan tree field, fields; 129350397Sobrien 1294132718Skan field = build_decl (FIELD_DECL, NULL_TREE, const_ptr_type_node); 1295132718Skan fields = field; 1296169689Skan 1297132718Skan field = build_decl (FIELD_DECL, NULL_TREE, const_string_type_node); 1298132718Skan TREE_CHAIN (field) = fields; 1299132718Skan fields = field; 1300169689Skan 1301169689Skan ti = VEC_index (tinfo_s, tinfo_descs, TK_TYPE_INFO_TYPE); 1302169689Skan ti->type = make_aggr_type (RECORD_TYPE); 1303169689Skan ti->vtable = NULL_TREE; 1304169689Skan ti->name = NULL_TREE; 1305169689Skan finish_builtin_struct (ti->type, "__type_info_pseudo", 1306132718Skan fields, NULL_TREE); 1307169689Skan TYPE_HAS_CONSTRUCTOR (ti->type) = 1; 130890075Sobrien } 1309169689Skan 131090075Sobrien /* Fundamental type_info */ 1311169689Skan create_pseudo_type_info (TK_BUILTIN_TYPE, "__fundamental_type_info", NULL); 131250397Sobrien 1313117395Skan /* Array, function and enum type_info. No additional fields. */ 1314169689Skan create_pseudo_type_info (TK_ARRAY_TYPE, "__array_type_info", NULL); 1315169689Skan create_pseudo_type_info (TK_FUNCTION_TYPE, "__function_type_info", NULL); 1316169689Skan create_pseudo_type_info (TK_ENUMERAL_TYPE, "__enum_type_info", NULL); 1317169689Skan 1318169689Skan /* Class type_info. No additional fields. */ 1319169689Skan create_pseudo_type_info (TK_CLASS_TYPE, "__class_type_info", NULL); 1320169689Skan 1321169689Skan /* Single public non-virtual base class. Add pointer to base class. 132290075Sobrien This is really a descendant of __class_type_info. */ 1323169689Skan create_pseudo_type_info (TK_SI_CLASS_TYPE, "__si_class_type_info", 1324169689Skan build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type), 1325169689Skan NULL); 1326169689Skan 132790075Sobrien /* Base class internal helper. Pointer to base type, offset to base, 1328117395Skan flags. */ 132990075Sobrien { 1330132718Skan tree field, fields; 1331169689Skan 1332132718Skan field = build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type); 1333132718Skan fields = field; 1334169689Skan 1335132718Skan field = build_decl (FIELD_DECL, NULL_TREE, integer_types[itk_long]); 1336132718Skan TREE_CHAIN (field) = fields; 1337132718Skan fields = field; 1338169689Skan 1339169689Skan ti = VEC_index (tinfo_s, tinfo_descs, TK_BASE_TYPE); 1340169689Skan 1341169689Skan ti->type = make_aggr_type (RECORD_TYPE); 1342169689Skan ti->vtable = NULL_TREE; 1343169689Skan ti->name = NULL_TREE; 1344169689Skan finish_builtin_struct (ti->type, "__base_class_type_info_pseudo", 1345132718Skan fields, NULL_TREE); 1346169689Skan TYPE_HAS_CONSTRUCTOR (ti->type) = 1; 134790075Sobrien } 1348169689Skan 134990075Sobrien /* Pointer type_info. Adds two fields, qualification mask 135090075Sobrien and pointer to the pointed to type. This is really a descendant of 1351117395Skan __pbase_type_info. */ 1352169689Skan create_pseudo_type_info (TK_POINTER_TYPE, "__pointer_type_info", 135390075Sobrien build_decl (FIELD_DECL, NULL_TREE, integer_type_node), 1354102780Skan build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type), 135590075Sobrien NULL); 135650397Sobrien 135790075Sobrien /* Pointer to member data type_info. Add qualifications flags, 135890075Sobrien pointer to the member's type info and pointer to the class. 135990075Sobrien This is really a descendant of __pbase_type_info. */ 1360169689Skan create_pseudo_type_info (TK_POINTER_MEMBER_TYPE, 1361169689Skan "__pointer_to_member_type_info", 1362169689Skan build_decl (FIELD_DECL, NULL_TREE, integer_type_node), 1363169689Skan build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type), 1364169689Skan build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type), 1365169689Skan NULL); 136650397Sobrien 136790075Sobrien pop_nested_namespace (abi_node); 136890075Sobrien} 136950397Sobrien 137090075Sobrien/* Emit the type_info descriptors which are guaranteed to be in the runtime 137190075Sobrien support. Generating them here guarantees consistency with the other 137290075Sobrien structures. We use the following heuristic to determine when the runtime 137390075Sobrien is being generated. If std::__fundamental_type_info is defined, and its 137490075Sobrien destructor is defined, then the runtime is being built. */ 137590075Sobrien 137650397Sobrienvoid 1377132718Skanemit_support_tinfos (void) 137850397Sobrien{ 137990075Sobrien static tree *const fundamentals[] = 138090075Sobrien { 138190075Sobrien &void_type_node, 138290075Sobrien &boolean_type_node, 138390075Sobrien &wchar_type_node, 138490075Sobrien &char_type_node, &signed_char_type_node, &unsigned_char_type_node, 138590075Sobrien &short_integer_type_node, &short_unsigned_type_node, 138690075Sobrien &integer_type_node, &unsigned_type_node, 138790075Sobrien &long_integer_type_node, &long_unsigned_type_node, 138890075Sobrien &long_long_integer_type_node, &long_long_unsigned_type_node, 138990075Sobrien &float_type_node, &double_type_node, &long_double_type_node, 139090075Sobrien 0 139190075Sobrien }; 139290075Sobrien int ix; 139390075Sobrien tree bltn_type, dtor; 1394169689Skan 139590075Sobrien push_nested_namespace (abi_node); 1396117395Skan bltn_type = xref_tag (class_type, 1397169689Skan get_identifier ("__fundamental_type_info"), 1398169689Skan /*tag_scope=*/ts_current, false); 139990075Sobrien pop_nested_namespace (abi_node); 140090075Sobrien if (!COMPLETE_TYPE_P (bltn_type)) 140190075Sobrien return; 1402169689Skan dtor = CLASSTYPE_DESTRUCTORS (bltn_type); 1403169689Skan if (!dtor || DECL_EXTERNAL (dtor)) 140490075Sobrien return; 140590075Sobrien doing_runtime = 1; 140690075Sobrien for (ix = 0; fundamentals[ix]; ix++) 140750397Sobrien { 140890075Sobrien tree bltn = *fundamentals[ix]; 1409169689Skan tree types[3]; 1410169689Skan int i; 141150397Sobrien 1412169689Skan types[0] = bltn; 1413169689Skan types[1] = build_pointer_type (bltn); 1414169689Skan types[2] = build_pointer_type (build_qualified_type (bltn, 1415169689Skan TYPE_QUAL_CONST)); 141650397Sobrien 1417169689Skan for (i = 0; i < 3; ++i) 1418169689Skan { 1419169689Skan tree tinfo; 1420169689Skan 1421169689Skan tinfo = get_tinfo_decl (types[i]); 1422169689Skan TREE_USED (tinfo) = 1; 1423169689Skan mark_needed (tinfo); 1424169689Skan /* The C++ ABI requires that these objects be COMDAT. But, 1425169689Skan On systems without weak symbols, initialized COMDAT 1426169689Skan objects are emitted with internal linkage. (See 1427169689Skan comdat_linkage for details.) Since we want these objects 1428169689Skan to have external linkage so that copies do not have to be 1429169689Skan emitted in code outside the runtime library, we make them 1430169689Skan non-COMDAT here. */ 1431169689Skan if (!flag_weak) 1432169689Skan { 1433169689Skan gcc_assert (TREE_PUBLIC (tinfo) && !DECL_COMDAT (tinfo)); 1434169689Skan DECL_INTERFACE_KNOWN (tinfo) = 1; 1435169689Skan } 1436169689Skan } 1437169689Skan } 143890075Sobrien} 143950397Sobrien 1440102780Skan/* Finish a type info decl. DECL_PTR is a pointer to an unemitted 1441102780Skan tinfo decl. Determine whether it needs emitting, and if so 1442102780Skan generate the initializer. */ 144350397Sobrien 1444132718Skanbool 1445132718Skanemit_tinfo_decl (tree decl) 144690075Sobrien{ 1447102780Skan tree type = TREE_TYPE (DECL_NAME (decl)); 1448102780Skan int in_library = typeinfo_in_lib_p (type); 1449132718Skan 1450169689Skan gcc_assert (DECL_TINFO_P (decl)); 1451102780Skan 1452169689Skan if (in_library) 1453169689Skan { 1454169689Skan if (doing_runtime) 1455169689Skan DECL_EXTERNAL (decl) = 0; 1456169689Skan else 1457169689Skan { 1458169689Skan /* If we're not in the runtime, then DECL (which is already 1459169689Skan DECL_EXTERNAL) will not be defined here. */ 1460169689Skan DECL_INTERFACE_KNOWN (decl) = 1; 1461169689Skan return false; 1462169689Skan } 1463169689Skan } 1464169689Skan else if (involves_incomplete_p (type)) 1465169689Skan { 1466169689Skan if (!decl_needed_p (decl)) 1467169689Skan return false; 1468169689Skan /* If TYPE involves an incomplete class type, then the typeinfo 1469169689Skan object will be emitted with internal linkage. There is no 1470169689Skan way to know whether or not types are incomplete until the end 1471169689Skan of the compilation, so this determination must be deferred 1472169689Skan until this point. */ 1473169689Skan TREE_PUBLIC (decl) = 0; 1474169689Skan DECL_EXTERNAL (decl) = 0; 1475169689Skan DECL_INTERFACE_KNOWN (decl) = 1; 1476169689Skan } 1477102780Skan 1478169689Skan import_export_decl (decl); 1479169689Skan if (DECL_NOT_REALLY_EXTERN (decl) && decl_needed_p (decl)) 1480169689Skan { 1481169689Skan tree init; 1482102780Skan 1483169689Skan DECL_EXTERNAL (decl) = 0; 1484169689Skan init = get_pseudo_ti_init (type, get_pseudo_ti_index (type)); 1485169689Skan DECL_INITIAL (decl) = init; 1486169689Skan mark_used (decl); 1487169689Skan finish_decl (decl, init, NULL_TREE); 1488169689Skan return true; 1489169689Skan } 1490169689Skan else 1491169689Skan return false; 1492169689Skan} 1493102780Skan 1494169689Skan#include "gt-cp-rtti.h" 1495