📄 tree.c
字号:
break; case VAR_DECL: case FUNCTION_DECL: case CONST_DECL: case TEMPLATE_DECL: case NAMESPACE_DECL: break; case TYPE_DECL: TRY (TREE_TYPE (t)); break; case PARM_DECL: TRY (TREE_TYPE (t)); TRY (TREE_CHAIN (t)); break; case TREE_LIST: TRY (TREE_PURPOSE (t)); TRY (TREE_VALUE (t)); TRY (TREE_CHAIN (t)); break; case OVERLOAD: TRY (OVL_FUNCTION (t)); TRY (OVL_CHAIN (t)); break; case TREE_VEC: { int len = TREE_VEC_LENGTH (t); t = copy_node (t); while (len--) TRY (TREE_VEC_ELT (t, len)); } break; case INTEGER_CST: case REAL_CST: case STRING_CST: case DEFAULT_ARG: break; case PTRMEM_CST: TRY (TREE_TYPE (t)); break; case COND_EXPR: case TARGET_EXPR: case AGGR_INIT_EXPR: case NEW_EXPR: TRY (TREE_OPERAND (t, 0)); TRY (TREE_OPERAND (t, 1)); TRY (TREE_OPERAND (t, 2)); break; case MODIFY_EXPR: case PLUS_EXPR: case MINUS_EXPR: case MULT_EXPR: case TRUNC_DIV_EXPR: case TRUNC_MOD_EXPR: case MIN_EXPR: case MAX_EXPR: case LSHIFT_EXPR: case RSHIFT_EXPR: case BIT_IOR_EXPR: case BIT_XOR_EXPR: case BIT_AND_EXPR: case BIT_ANDTC_EXPR: case TRUTH_ANDIF_EXPR: case TRUTH_ORIF_EXPR: case LT_EXPR: case LE_EXPR: case GT_EXPR: case GE_EXPR: case EQ_EXPR: case NE_EXPR: case CEIL_DIV_EXPR: case FLOOR_DIV_EXPR: case ROUND_DIV_EXPR: case CEIL_MOD_EXPR: case FLOOR_MOD_EXPR: case ROUND_MOD_EXPR: case COMPOUND_EXPR: case PREDECREMENT_EXPR: case PREINCREMENT_EXPR: case POSTDECREMENT_EXPR: case POSTINCREMENT_EXPR: case ARRAY_REF: case SCOPE_REF: case TRY_CATCH_EXPR: case WITH_CLEANUP_EXPR: case CALL_EXPR: TRY (TREE_OPERAND (t, 0)); TRY (TREE_OPERAND (t, 1)); break; case SAVE_EXPR: case CONVERT_EXPR: case ADDR_EXPR: case INDIRECT_REF: case NEGATE_EXPR: case BIT_NOT_EXPR: case TRUTH_NOT_EXPR: case NOP_EXPR: case NON_LVALUE_EXPR: case COMPONENT_REF: case CLEANUP_POINT_EXPR: case LOOKUP_EXPR: case SIZEOF_EXPR: case ALIGNOF_EXPR: TRY (TREE_OPERAND (t, 0)); break; case MODOP_EXPR: case CAST_EXPR: case REINTERPRET_CAST_EXPR: case CONST_CAST_EXPR: case STATIC_CAST_EXPR: case DYNAMIC_CAST_EXPR: case ARROW_EXPR: case DOTSTAR_EXPR: case TYPEID_EXPR: break; case COMPLEX_CST: TRY (TREE_REALPART (t)); TRY (TREE_IMAGPART (t)); break; case CONSTRUCTOR: TRY (CONSTRUCTOR_ELTS (t)); break; case TEMPLATE_TEMPLATE_PARM: case TEMPLATE_PARM_INDEX: case TEMPLATE_TYPE_PARM: break; case BIND_EXPR: break; case REAL_TYPE: case COMPLEX_TYPE: case VOID_TYPE: case BOOLEAN_TYPE: case TYPENAME_TYPE: case UNION_TYPE: case ENUMERAL_TYPE: case TYPEOF_TYPE: break; case POINTER_TYPE: case REFERENCE_TYPE: TRY (TREE_TYPE (t)); break; case FUNCTION_TYPE: case METHOD_TYPE: TRY (TREE_TYPE (t)); TRY (TYPE_ARG_TYPES (t)); break; case ARRAY_TYPE: TRY (TREE_TYPE (t)); TRY (TYPE_DOMAIN (t)); break; case INTEGER_TYPE: TRY (TYPE_MAX_VALUE (t)); break; case OFFSET_TYPE: TRY (TREE_TYPE (t)); TRY (TYPE_OFFSET_BASETYPE (t)); break; case RECORD_TYPE: if (TYPE_PTRMEMFUNC_P (t)) TRY (TYPE_PTRMEMFUNC_FN_TYPE (t)); break; /* This list is incomplete, but should suffice for now. It is very important that `sorry' not call `report_error_function'. That could cause an infinite loop. */ default: sorry ("initializer contains unrecognized tree code"); return error_mark_node; } return NULL_TREE;#undef TRY}/* Passed to search_tree. Checks for the use of types with no linkage. */static treeno_linkage_helper (t) tree t;{ if (TYPE_P (t) && (IS_AGGR_TYPE (t) || TREE_CODE (t) == ENUMERAL_TYPE) && (decl_function_context (TYPE_MAIN_DECL (t)) || ANON_AGGRNAME_P (TYPE_IDENTIFIER (t)))) return t; return NULL_TREE;}/* Check if the type T depends on a type with no linkage and if so, return it. */treeno_linkage_check (t) tree t;{ t = search_tree (t, no_linkage_helper); if (t != error_mark_node) return t; return NULL_TREE;}/* Make copies of all the nodes below T. If FUNC is non-NULL, call it for each node. */treemapcar (t, func) tree t; tree (*func) PROTO((tree));{ tree tmp; if (t == NULL_TREE) return t; if (func) { tmp = func (t); if (tmp) return tmp; } switch (TREE_CODE (t)) { case ERROR_MARK: return error_mark_node; case VAR_DECL: case FUNCTION_DECL: case CONST_DECL: /* Rather than aborting, return error_mark_node. This allows us to report a sensible error message on code like this: void g() { int i; f<i>(7); } In a case like: void g() { const int i = 7; f<i>(7); } however, we must actually return the constant initializer. */ if (TREE_READONLY_DECL_P (t)) { tmp = decl_constant_value (t); if (tmp != t) return mapcar (tmp, func); } return error_mark_node; case PARM_DECL: { tree chain = TREE_CHAIN (t); t = copy_node (t); TREE_CHAIN (t) = mapcar (chain, func); TREE_TYPE (t) = mapcar (TREE_TYPE (t), func); DECL_INITIAL (t) = mapcar (DECL_INITIAL (t), func); DECL_SIZE (t) = mapcar (DECL_SIZE (t), func); return t; } case TREE_LIST: { tree chain = TREE_CHAIN (t); t = copy_node (t); TREE_PURPOSE (t) = mapcar (TREE_PURPOSE (t), func); TREE_VALUE (t) = mapcar (TREE_VALUE (t), func); TREE_CHAIN (t) = mapcar (chain, func); return t; } case OVERLOAD: { tree chain = OVL_CHAIN (t); t = copy_node (t); OVL_FUNCTION (t) = mapcar (OVL_FUNCTION (t), func); OVL_CHAIN (t) = mapcar (chain, func); return t; } case TREE_VEC: { int len = TREE_VEC_LENGTH (t); t = copy_node (t); while (len--) TREE_VEC_ELT (t, len) = mapcar (TREE_VEC_ELT (t, len), func); return t; } case INTEGER_CST: case REAL_CST: case STRING_CST: return copy_node (t); case PTRMEM_CST: t = copy_node (t); TREE_TYPE (t) = mapcar (TREE_TYPE (t), func); PTRMEM_CST_MEMBER (t) = mapcar (PTRMEM_CST_MEMBER (t), func); return t; case COND_EXPR: case TARGET_EXPR: case AGGR_INIT_EXPR: t = copy_node (t); TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func); TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func); TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func); return t; case SAVE_EXPR: t = copy_node (t); TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func); return t; case MODIFY_EXPR: case PLUS_EXPR: case MINUS_EXPR: case MULT_EXPR: case TRUNC_DIV_EXPR: case TRUNC_MOD_EXPR: case MIN_EXPR: case MAX_EXPR: case LSHIFT_EXPR: case RSHIFT_EXPR: case BIT_IOR_EXPR: case BIT_XOR_EXPR: case BIT_AND_EXPR: case BIT_ANDTC_EXPR: case TRUTH_ANDIF_EXPR: case TRUTH_ORIF_EXPR: case LT_EXPR: case LE_EXPR: case GT_EXPR: case GE_EXPR: case EQ_EXPR: case NE_EXPR: case CEIL_DIV_EXPR: case FLOOR_DIV_EXPR: case ROUND_DIV_EXPR: case CEIL_MOD_EXPR: case FLOOR_MOD_EXPR: case ROUND_MOD_EXPR: case COMPOUND_EXPR: case PREDECREMENT_EXPR: case PREINCREMENT_EXPR: case POSTDECREMENT_EXPR: case POSTINCREMENT_EXPR: case ARRAY_REF: case SCOPE_REF: case TRY_CATCH_EXPR: case WITH_CLEANUP_EXPR: t = copy_node (t); TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func); TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func); return t; case CALL_EXPR: t = copy_node (t); TREE_TYPE (t) = mapcar (TREE_TYPE (t), func); TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func); TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func); /* tree.def says that operand two is RTL, but make_call_declarator puts trees in there. */ if (TREE_OPERAND (t, 2) && TREE_CODE (TREE_OPERAND (t, 2)) == TREE_LIST) TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func); else TREE_OPERAND (t, 2) = NULL_TREE; return t; case CONVERT_EXPR: case ADDR_EXPR: case INDIRECT_REF: case NEGATE_EXPR: case BIT_NOT_EXPR: case TRUTH_NOT_EXPR: case NOP_EXPR: case COMPONENT_REF: case CLEANUP_POINT_EXPR: case NON_LVALUE_EXPR: t = copy_node (t); TREE_TYPE (t) = mapcar (TREE_TYPE (t), func); TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func); return t; case POINTER_TYPE: tmp = build_pointer_type (mapcar (TREE_TYPE (t), func)); return cp_build_qualified_type (tmp, TYPE_QUALS (t)); case REFERENCE_TYPE: tmp = build_reference_type (mapcar (TREE_TYPE (t), func)); return cp_build_qualified_type (tmp, TYPE_QUALS (t)); case FUNCTION_TYPE: tmp = build_function_type (mapcar (TREE_TYPE (t), func), mapcar (TYPE_ARG_TYPES (t), func)); return cp_build_qualified_type (tmp, TYPE_QUALS (t)); case ARRAY_TYPE: tmp = build_cplus_array_type (mapcar (TREE_TYPE (t), func), mapcar (TYPE_DOMAIN (t), func)); return cp_build_qualified_type (tmp, CP_TYPE_QUALS (t)); case INTEGER_TYPE: tmp = build_index_type (mapcar (TYPE_MAX_VALUE (t), func)); return cp_build_qualified_type (tmp, TYPE_QUALS (t)); case OFFSET_TYPE: tmp = build_offset_type (mapcar (TYPE_OFFSET_BASETYPE (t), func), mapcar (TREE_TYPE (t), func)); return cp_build_qualified_type (tmp, TYPE_QUALS (t)); case METHOD_TYPE: tmp = build_cplus_method_type (mapcar (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), func), mapcar (TREE_TYPE (t), func), mapcar (TREE_CHAIN (TYPE_ARG_TYPES (t)), func)); return cp_build_qualified_type (tmp, TYPE_QUALS (t)); case COMPLEX_CST: t = copy_node (t); TREE_REALPART (t) = mapcar (TREE_REALPART (t), func); TREE_IMAGPART (t) = mapcar (TREE_REALPART (t), func); return t; case CONSTRUCTOR: t = copy_node (t); CONSTRUCTOR_ELTS (t) = mapcar (CONSTRUCTOR_ELTS (t), func); return t; case TEMPLATE_TEMPLATE_PARM: return copy_template_template_parm (t); case BIND_EXPR: t = copy_node (t); TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func); TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func); TREE_OPERAND (t, 2) = NULL_TREE; return t; case NEW_EXPR: t = copy_node (t); TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func); TREE_OPERAND (t, 1) = mapcar (TREE_OPERAND (t, 1), func); TREE_OPERAND (t, 2) = mapcar (TREE_OPERAND (t, 2), func); return t; case LOOKUP_EXPR: t = copy_node (t); TREE_OPERAND (t, 0) = mapcar (TREE_OPERAND (t, 0), func); return t; case RECORD_TYPE: if (TYPE_PTRMEMFUNC_P (t)) return build_ptrmemfunc_type (mapcar (TYPE_PTRMEMFUNC_FN_TYPE (t), func)); /* else fall through */ /* This list is incomplete, but should suffice for now. It is very important that `sorry' not call `report_error_function'. That could cause an infinite loop. */ default: sorry ("initializer contains unrecognized tree code"); return error_mark_node; } my_friendly_abort (107); /* NOTREACHED */ return NULL_TREE;}/* Returns T if T is allocated on the permanent obstack, NULL_TREE otherwise. */treepermanent_p (t) tree t;{ return TREE_PERMANENT (t) ? t : NULL_TREE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -