📄 cp-tree.h
字号:
#define CP_TYPE_VOLATILE_P(NODE) \ ((CP_TYPE_QUALS (NODE) & TYPE_QUAL_VOLATILE) != 0)/* Nonzero if this type is restrict-qualified. */#define CP_TYPE_RESTRICT_P(NODE) \ ((CP_TYPE_QUALS (NODE) & TYPE_QUAL_RESTRICT) != 0)/* Nonzero if this type is const-qualified, but not volatile-qualified. Other qualifiers are ignored. This macro is used to test whether or not it is OK to bind an rvalue to a reference. */#define CP_TYPE_CONST_NON_VOLATILE_P(NODE) \ ((CP_TYPE_QUALS (NODE) & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)) \ == TYPE_QUAL_CONST)#define DELTA_FROM_VTABLE_ENTRY(ENTRY) \ (!flag_vtable_thunks ? \ TREE_VALUE (CONSTRUCTOR_ELTS (ENTRY)) \ : TREE_CODE (TREE_OPERAND ((ENTRY), 0)) != THUNK_DECL ? integer_zero_node \ : build_int_2 (THUNK_DELTA (TREE_OPERAND ((ENTRY), 0)), 0))/* Virtual function addresses can be gotten from a virtual function table entry using this macro. */#define FNADDR_FROM_VTABLE_ENTRY(ENTRY) \ (!flag_vtable_thunks ? \ TREE_VALUE (TREE_CHAIN (TREE_CHAIN (CONSTRUCTOR_ELTS (ENTRY)))) \ : TREE_CODE (TREE_OPERAND ((ENTRY), 0)) != THUNK_DECL ? (ENTRY) \ : DECL_INITIAL (TREE_OPERAND ((ENTRY), 0)))#define SET_FNADDR_FROM_VTABLE_ENTRY(ENTRY,VALUE) \ (TREE_VALUE (TREE_CHAIN (TREE_CHAIN (CONSTRUCTOR_ELTS (ENTRY)))) = (VALUE))#define FUNCTION_ARG_CHAIN(NODE) (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (NODE))))#define PROMOTES_TO_AGGR_TYPE(NODE,CODE) \ (((CODE) == TREE_CODE (NODE) \ && IS_AGGR_TYPE (TREE_TYPE (NODE))) \ || IS_AGGR_TYPE (NODE))/* Nonzero iff TYPE is uniquely derived from PARENT. Under MI, PARENT can be an ambiguous base class of TYPE, and this macro will be false. */#define UNIQUELY_DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 0, (tree *)0) >= 0)#define ACCESSIBLY_DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, -1, (tree *)0) >= 0)#define ACCESSIBLY_UNIQUELY_DERIVED_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 1, (tree *)0) >= 0)#define DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 0, (tree *)0) != -1)/* This structure provides additional information above and beyond what is provide in the ordinary tree_type. In the past, we used it for the types of class types, template parameters types, typename types, and so forth. However, there can be many (tens to hundreds of thousands) of template parameter types in a compilation, and there's no need for this additional information in that case. Therefore, we now use this data structure only for class types. In the past, it was thought that there would be relatively few class types. However, in the presence of heavy use of templates, many (i.e., thousands) of classes can easily be generated. Therefore, we should endeavor to keep the size of this structure to a minimum. */struct lang_type{ struct { unsigned has_type_conversion : 1; unsigned has_init_ref : 1; unsigned has_default_ctor : 1; unsigned uses_multiple_inheritance : 1; unsigned const_needs_init : 1; unsigned ref_needs_init : 1; unsigned has_const_assign_ref : 1; unsigned anon_union : 1; unsigned has_nonpublic_ctor : 2; unsigned has_nonpublic_assign_ref : 2; unsigned vtable_needs_writing : 1; unsigned has_assign_ref : 1; unsigned gets_new : 2; unsigned gets_delete : 2; unsigned has_call_overloaded : 1; unsigned has_array_ref_overloaded : 1; unsigned has_arrow_overloaded : 1; unsigned interface_only : 1; unsigned interface_unknown : 1; unsigned needs_virtual_reinit : 1; unsigned marks: 6; unsigned vec_delete_takes_size : 1; unsigned declared_class : 1; unsigned being_defined : 1; unsigned redefined : 1; unsigned debug_requested : 1; unsigned use_template : 2; unsigned got_semicolon : 1; unsigned ptrmemfunc_flag : 1; unsigned is_signature : 1; unsigned is_signature_pointer : 1; unsigned is_signature_reference : 1; unsigned has_opaque_typedecls : 1; unsigned sigtable_has_been_generated : 1; unsigned was_anonymous : 1; unsigned has_real_assign_ref : 1; unsigned has_const_init_ref : 1; unsigned has_complex_init_ref : 1; unsigned has_complex_assign_ref : 1; unsigned has_abstract_assign_ref : 1; unsigned non_aggregate : 1; unsigned is_partial_instantiation : 1; unsigned has_mutable : 1; unsigned com_interface : 1; /* When adding a flag here, consider whether or not it ought to apply to a template instance if it applies to the template. If so, make sure to copy it in instantiate_class_template! */ /* The MIPS compiler gets it wrong if this struct also does not fill out to a multiple of 4 bytes. Add a member `dummy' with new bits if you go over the edge. */ unsigned dummy : 10; } type_flags; int vsize; int vfield_parent; union tree_node *vfields; union tree_node *vbases; union tree_node *tags; union tree_node *search_slot; unsigned char align; /* Room for another three unsigned chars. */ union tree_node *size; union tree_node *abstract_virtuals; union tree_node *friend_classes; union tree_node *rtti; union tree_node *methods; union tree_node *signature; union tree_node *signature_pointer_to; union tree_node *signature_reference_to; union tree_node *template_info; tree befriending_classes;};/* Indicates whether or not (and how) a template was expanded for this class. 0=no information yet/non-template class 1=implicit template instantiation 2=explicit template specialization 3=explicit template instantiation */#define CLASSTYPE_USE_TEMPLATE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.use_template)/* Fields used for storing information before the class is defined. After the class is defined, these fields hold other information. *//* List of friends which were defined inline in this class definition. */#define CLASSTYPE_INLINE_FRIENDS(NODE) (TYPE_NONCOPIED_PARTS (NODE))/* Nonzero for _CLASSTYPE means that operator new and delete are defined, respectively. */#define TYPE_GETS_NEW(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.gets_new)#define TYPE_GETS_DELETE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.gets_delete)#define TYPE_GETS_REG_DELETE(NODE) (TYPE_GETS_DELETE (NODE) & 1)/* Nonzero for _CLASSTYPE means that operator vec delete is defined and takes the optional size_t argument. */#define TYPE_VEC_DELETE_TAKES_SIZE(NODE) \ (TYPE_LANG_SPECIFIC(NODE)->type_flags.vec_delete_takes_size)#define TYPE_VEC_NEW_USES_COOKIE(NODE) \ (TYPE_NEEDS_DESTRUCTOR (NODE) \ || (TYPE_LANG_SPECIFIC (NODE) && TYPE_VEC_DELETE_TAKES_SIZE (NODE)))/* Nonzero means that this _CLASSTYPE node defines ways of converting itself to other types. */#define TYPE_HAS_CONVERSION(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_type_conversion)/* Nonzero means that this _CLASSTYPE node overloads operator=(X&). */#define TYPE_HAS_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_assign_ref)#define TYPE_HAS_CONST_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_const_assign_ref)/* Nonzero means that this _CLASSTYPE node has an X(X&) constructor. */#define TYPE_HAS_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_init_ref)#define TYPE_HAS_CONST_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_const_init_ref)/* Nonzero means that this type is being defined. I.e., the left brace starting the definition of this type has been seen. */#define TYPE_BEING_DEFINED(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.being_defined)/* Nonzero means that this type has been redefined. In this case, if convenient, don't reprocess any methods that appear in its redefinition. */#define TYPE_REDEFINED(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.redefined)/* Nonzero means that this type is a signature. */# define IS_SIGNATURE(NODE) (TYPE_LANG_SPECIFIC(NODE)?TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature:0)# define SET_SIGNATURE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature=1)# define CLEAR_SIGNATURE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature=0)/* Nonzero means that this type is a signature pointer type. */# define IS_SIGNATURE_POINTER(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature_pointer)/* Nonzero means that this type is a signature reference type. */# define IS_SIGNATURE_REFERENCE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature_reference)/* Nonzero means that this signature contains opaque type declarations. */#define SIGNATURE_HAS_OPAQUE_TYPEDECLS(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_opaque_typedecls)/* Nonzero means that a signature table has been generated for this signature. */#define SIGTABLE_HAS_BEEN_GENERATED(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.sigtable_has_been_generated)/* If NODE is a class, this is the signature type that contains NODE's signature after it has been computed using sigof(). */#define CLASSTYPE_SIGNATURE(NODE) (TYPE_LANG_SPECIFIC(NODE)->signature)/* If NODE is a signature pointer or signature reference, this is the signature type the pointer/reference points to. */#define SIGNATURE_TYPE(NODE) (TYPE_LANG_SPECIFIC(NODE)->signature)/* If NODE is a signature, this is a vector of all methods defined in the signature or in its base types together with their default implementations. */#define SIGNATURE_METHOD_VEC(NODE) (TYPE_LANG_SPECIFIC(NODE)->signature)/* If NODE is a signature, this is the _TYPE node that contains NODE's signature pointer type. */#define SIGNATURE_POINTER_TO(NODE) (TYPE_LANG_SPECIFIC(NODE)->signature_pointer_to)/* If NODE is a signature, this is the _TYPE node that contains NODE's signature reference type. */#define SIGNATURE_REFERENCE_TO(NODE) (TYPE_LANG_SPECIFIC(NODE)->signature_reference_to)/* The is the basetype that contains NODE's rtti. */#define CLASSTYPE_RTTI(NODE) (TYPE_LANG_SPECIFIC(NODE)->rtti)/* Nonzero means that this _CLASSTYPE node overloads operator(). */#define TYPE_OVERLOADS_CALL_EXPR(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_call_overloaded)/* Nonzero means that this _CLASSTYPE node overloads operator[]. */#define TYPE_OVERLOADS_ARRAY_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_array_ref_overloaded)/* Nonzero means that this _CLASSTYPE node overloads operator->. */#define TYPE_OVERLOADS_ARROW(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_arrow_overloaded)/* Nonzero means that this _CLASSTYPE (or one of its ancestors) uses multiple inheritance. If this is 0 for the root of a type hierarchy, then we can use more efficient search techniques. */#define TYPE_USES_MULTIPLE_INHERITANCE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.uses_multiple_inheritance)/* Nonzero means that this _CLASSTYPE (or one of its ancestors) uses virtual base classes. If this is 0 for the root of a type hierarchy, then we can use more efficient search techniques. */#define TYPE_USES_VIRTUAL_BASECLASSES(NODE) (TREE_LANG_FLAG_3(NODE))/* Nonzero means that this _CLASSTYPE uses polymorphic virtual bases. This flag is set only when we use vtable thunks. */#define TYPE_USES_PVBASES(NODE) (TREE_LANG_FLAG_5(NODE))/* Vector member functions defined in this class. Each element is either a FUNCTION_DECL, a TEMPLATE_DECL, or an OVERLOAD. All functions with the same name end up in the same slot. The first two elements are for constructors, and destructors, respectively. These are followed by ordinary member functions. There may be empty entries at the end of the vector. */#define CLASSTYPE_METHOD_VEC(NODE) (TYPE_LANG_SPECIFIC(NODE)->methods)/* The first type conversion operator in the class (the others can be searched with TREE_CHAIN), or the first non-constructor function if there are no type conversion operators. */#define CLASSTYPE_FIRST_CONVERSION(NODE) \ TREE_VEC_LENGTH (CLASSTYPE_METHOD_VEC (NODE)) > 2 \ ? TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (NODE), 2) \ : NULL_TREE;/* Mark bits for depth-first and breath-first searches. *//* Get the value of the Nth mark bit. */#define CLASSTYPE_MARKED_N(NODE, N) \ (((CLASS_TYPE_P (NODE) ? TYPE_LANG_SPECIFIC (NODE)->type_flags.marks \ : TYPE_ALIAS_SET (NODE)) & (1 << N)) != 0)/* Set the Nth mark bit. */#define SET_CLASSTYPE_MARKED_N(NODE, N) \ (CLASS_TYPE_P (NODE) \ ? (TYPE_LANG_SPECIFIC (NODE)->type_flags.marks |= (1 << (N))) \ : (TYPE_ALIAS_SET (NODE) |= (1 << (N))))/* Clear the Nth mark bit. */#define CLEAR_CLASSTYPE_MARKED_N(NODE, N) \ (CLASS_TYPE_P (NODE) \ ? (TYPE_LANG_SPECIFIC (NODE)->type_flags.marks &= ~(1 << (N))) \ : (TYPE_ALIAS_SET (NODE) &= ~(1 << (N))))/* Get the value of the mark bits. */#define CLASSTYPE_MARKED(NODE) CLASSTYPE_MARKED_N(NODE, 0)#define CLASSTYPE_MARKED2(NODE) CLASSTYPE_MARKED_N(NODE, 1)#define CLASSTYPE_MARKED3(NODE) CLASSTYPE_MARKED_N(NODE, 2)#define CLASSTYPE_MARKED4(NODE) CLASSTYPE_MARKED_N(NODE, 3)#define CLASSTYPE_MARKED5(NODE) CLASSTYPE_MARKED_N(NODE, 4)#define CLASSTYPE_MARKED6(NODE) CLASSTYPE_MARKED_N(NODE, 5)/* Macros to modify the above flags */#define SET_CLASSTYPE_MARKED(NODE) SET_CLASSTYPE_MARKED_N(NODE, 0)#define CLEAR_CLASSTYPE_MARKED(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 0)#define SET_CLASSTYPE_MARKED2(NODE) SET_CLASSTYPE_MARKED_N(NODE, 1)#define CLEAR_CLASSTYPE_MARKED2(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 1)#define SET_CLASSTYPE_MARKED3(NODE) SET_CLASSTYPE_MARKED_N(NODE, 2)#define CLEAR_CLASSTYPE_MARKED3(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 2) #define SET_CLASSTYPE_MARKED4(NODE) SET_CLASSTYPE_MARKED_N(NODE, 3)#define CLEAR_CLASSTYPE_MARKED4(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 3)#define SET_CLASSTYPE_MARKED5(NODE) SET_CLASSTYPE_MARKED_N(NODE, 4)#define CLEAR_CLASSTYPE_MARKED5(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 4)#define SET_CLASSTYPE_MARKED6(NODE) SET_CLASSTYPE_MARKED_N(NODE, 5)#define CLEAR_CLASSTYPE_MARKED6(NODE) CLEAR_CLASSTYPE_MARKED_N(NODE, 5)/* A list of the nested tag-types (class, struct, union, or enum)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -