⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tree.c

📁 gcc-2.95.3 Linux下最常用的C编译器
💻 C
📖 第 1 页 / 共 5 页
字号:
      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 + -