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

📄 error.c

📁 gcc库的原代码,对编程有很大帮助.
💻 C
📖 第 1 页 / 共 3 页
字号:
    case REAL_CST:#ifndef REAL_IS_NOT_DOUBLE      sprintf (digit_buffer, "%g", TREE_REAL_CST (t));#else      {	unsigned char *p = (unsigned char *) &TREE_REAL_CST (t);	int i;	strcpy (digit_buffer, "0x");	for (i = 0; i < sizeof TREE_REAL_CST (t); i++)	  sprintf (digit_buffer + 2 + 2*i, "%02x", *p++);      }#endif      OB_PUTCP (digit_buffer);      break;    case STRING_CST:      {	char *p = TREE_STRING_POINTER (t);	int len = TREE_STRING_LENGTH (t) - 1;	int i;	OB_PUTC ('\"');	for (i = 0; i < len; i++)	  dump_char (p[i]);	OB_PUTC ('\"');      }      break;    case COMPOUND_EXPR:      dump_binary_op (",", t);      break;    case COND_EXPR:      OB_PUTC ('(');      dump_expr (TREE_OPERAND (t, 0), 0);      OB_PUTS (" ? ");      dump_expr (TREE_OPERAND (t, 1), 0);      OB_PUTS (" : ");      dump_expr (TREE_OPERAND (t, 2), 0);      OB_PUTC (')');      break;    case SAVE_EXPR:      if (TREE_HAS_CONSTRUCTOR (t))	{	  OB_PUTS ("new ");	  dump_type (TREE_TYPE (TREE_TYPE (t)), 0);	  PARM_DECL_EXPR (t) = 1;	}      else	{	  dump_expr (TREE_OPERAND (t, 0), 0);	}      break;    case NEW_EXPR:      OB_PUTID (TYPE_IDENTIFIER (TREE_TYPE (t)));      OB_PUTC ('(');      dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)));      OB_PUTC (')');      break;    case CALL_EXPR:      {	tree fn = TREE_OPERAND (t, 0);	tree args = TREE_OPERAND (t, 1);		if (TREE_CODE (fn) == ADDR_EXPR)	  fn = TREE_OPERAND (fn, 0);	if (NEXT_CODE (fn) == METHOD_TYPE)	  {	    tree ob = TREE_VALUE (args);	    if (TREE_CODE (ob) == ADDR_EXPR)	      {		dump_expr (TREE_OPERAND (ob, 0), 0);		OB_PUTC ('.');	      }	    else if (TREE_CODE (ob) != PARM_DECL		     || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))	      {		dump_expr (ob, 0);		OB_PUTC2 ('-', '>');	      }	    args = TREE_CHAIN (args);	  }	dump_expr (fn, 0);	OB_PUTC('(');	dump_expr_list (args);	OB_PUTC (')');      }      break;    case WITH_CLEANUP_EXPR:      /* Note that this only works for G++ cleanups.  If somebody	 builds a general cleanup, there's no way to represent it.  */      dump_expr (TREE_OPERAND (t, 0), 0);      break;    case TARGET_EXPR:      /* Note that this only works for G++ target exprs.  If somebody	 builds a general TARGET_EXPR, there's no way to represent that	 it initializes anything other that the parameter slot for the	 default argument.  Note we may have cleared out the first	 operand in expand_expr, so don't go killing ourselves.  */      if (TREE_OPERAND (t, 1))	dump_expr (TREE_OPERAND (t, 1), 0);      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:      dump_binary_op (opname_tab[(int) TREE_CODE (t)], t);      break;    case CEIL_DIV_EXPR:    case FLOOR_DIV_EXPR:    case ROUND_DIV_EXPR:      dump_binary_op ("/", t);      break;    case CEIL_MOD_EXPR:    case FLOOR_MOD_EXPR:    case ROUND_MOD_EXPR:      dump_binary_op ("%", t);      break;    case COMPONENT_REF:      {	tree ob = TREE_OPERAND (t, 0);	if (TREE_CODE (ob) == INDIRECT_REF)	  {	    ob = TREE_OPERAND (ob, 0);	    if (TREE_CODE (ob) != PARM_DECL		|| strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))	      {		dump_expr (ob, 0);		OB_PUTC2 ('-', '>');	      }	  }	else	  {	    dump_expr (ob, 0);	    OB_PUTC ('.');	  }	dump_expr (TREE_OPERAND (t, 1), 1);      }      break;    case ARRAY_REF:      dump_expr (TREE_OPERAND (t, 0), 0);      OB_PUTC ('[');      dump_expr (TREE_OPERAND (t, 1), 0);      OB_PUTC (']');      break;    case CONVERT_EXPR:      dump_unary_op ("+", t, nop);      break;    case ADDR_EXPR:      if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL	  || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST)	dump_expr (TREE_OPERAND (t, 0), 0);      else	dump_unary_op ("&", t, nop);      break;    case INDIRECT_REF:      if (TREE_HAS_CONSTRUCTOR (t))	{	  t = TREE_OPERAND (t, 0);	  my_friendly_assert (TREE_CODE (t) == CALL_EXPR, 237);	  dump_expr (TREE_OPERAND (t, 0), 0);	  OB_PUTC ('(');	  dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1)));	  OB_PUTC (')');	}      else	{	  if (NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE)	    dump_expr (TREE_OPERAND (t, 0), nop);	  else	    dump_unary_op ("*", t, nop);	}      break;    case NEGATE_EXPR:    case BIT_NOT_EXPR:    case TRUTH_NOT_EXPR:    case PREDECREMENT_EXPR:    case PREINCREMENT_EXPR:      dump_unary_op (opname_tab [(int)TREE_CODE (t)], t, nop);      break;    case POSTDECREMENT_EXPR:    case POSTINCREMENT_EXPR:      OB_PUTC ('(');      dump_expr (TREE_OPERAND (t, 0), 0);      OB_PUTCP (opname_tab[(int)TREE_CODE (t)]);      OB_PUTC (')');      break;    case NON_LVALUE_EXPR:      /* FIXME: This is a KLUDGE workaround for a parsing problem.  There	 should be another level of INDIRECT_REF so that I don't have to do	 this.  */      if (NEXT_CODE (t) == POINTER_TYPE)	{	  tree next = TREE_TYPE (TREE_TYPE (t));	  while (TREE_CODE (next) == POINTER_TYPE)	    next = TREE_TYPE (next);	  	  if (TREE_CODE (next) == FUNCTION_TYPE)	    {	      if (!nop) OB_PUTC ('(');	      OB_PUTC ('*');	      dump_expr (TREE_OPERAND (t, 0), 1);	      if (!nop) OB_PUTC (')');	      break;	    }	  /* else FALLTHRU */	}      dump_expr (TREE_OPERAND (t, 0), 0);      break;    case NOP_EXPR:      dump_expr (TREE_OPERAND (t, 0), nop);      break;    case CONSTRUCTOR:      OB_PUTC ('{');      dump_expr_list (CONSTRUCTOR_ELTS (t), 0);      OB_PUTC ('}');      break;    case OFFSET_REF:      {	tree ob = TREE_OPERAND (t, 0);	if (TREE_CODE (ob) == NOP_EXPR	    && TREE_OPERAND (ob, 0) == error_mark_node	    && TREE_CODE (TREE_OPERAND (t, 1)) == FUNCTION_DECL)	    /* A::f */	  dump_expr (TREE_OPERAND (t, 1), 0);	else	  {	    sorry ("operand of OFFSET_REF not understood");	    goto error;	  }	break;      }    case TREE_LIST:      if (TREE_VALUE (t) && TREE_CODE (TREE_VALUE (t)) == FUNCTION_DECL)	{	  OB_PUTID (DECL_NAME (TREE_VALUE (t)));	  break;	}      /* else fall through */	      /*  This list is incomplete, but should suffice for now.	  It is very important that `sorry' does not call	  `report_error_function'.  That could cause an infinite loop.  */    default:      sorry ("`%s' not supported by dump_expr",	     tree_code_name[(int) TREE_CODE (t)]);      /* fall through to ERROR_MARK...  */    case ERROR_MARK:    error:      OB_PUTCP ("{error}");      break;    }}static voiddump_binary_op (opstring, t)     char *opstring;     tree t;{  OB_PUTC ('(');  dump_expr (TREE_OPERAND (t, 0), 1);  OB_PUTC (' ');  OB_PUTCP (opstring);  OB_PUTC (' ');  dump_expr (TREE_OPERAND (t, 1), 1);  OB_PUTC (')');}static voiddump_unary_op (opstring, t, nop)     char *opstring;     tree t;     int nop;{  if (!nop) OB_PUTC ('(');  OB_PUTCP (opstring);  dump_expr (TREE_OPERAND (t, 0), 1);  if (!nop) OB_PUTC (')');}char *fndecl_as_string (cname, fndecl, print_ret_type_p)     tree cname, fndecl;     int print_ret_type_p;{  return decl_as_string (fndecl, print_ret_type_p);}/* Same, but handtype a _TYPE.   Called from convert_to_reference, mangle_class_name_for_template,   build_unary_op, and GNU_xref_decl.  */char *type_as_string (typ, v)     tree typ;     int v;{  OB_INIT ();  dump_type (typ, v);  OB_FINISH ();  return (char *)obstack_base (&scratch_obstack);}char *expr_as_string (decl, v)     tree decl;     int v;{  OB_INIT ();  dump_expr (decl, 1);  OB_FINISH ();  return (char *)obstack_base (&scratch_obstack);}/* A cross between type_as_string and fndecl_as_string.   Only called from substitute_nice_name.  */char *decl_as_string (decl, v)     tree decl;     int v;{  OB_INIT ();  dump_decl (decl, v);  OB_FINISH ();  return (char *)obstack_base (&scratch_obstack);}char *cp_file_of (t)     tree t;{  if (TREE_CODE (t) == PARM_DECL)    return DECL_SOURCE_FILE (DECL_CONTEXT (t));  else if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')    return DECL_SOURCE_FILE (TYPE_NAME (t));  else    return DECL_SOURCE_FILE (t);}intcp_line_of (t)     tree t;{  int line = 0;  if (TREE_CODE (t) == PARM_DECL)    line = DECL_SOURCE_LINE (DECL_CONTEXT (t));  if (TREE_CODE (t) == TYPE_DECL && DECL_ARTIFICIAL (t))    t = TREE_TYPE (t);  if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')    {      if (IS_AGGR_TYPE (t))	line = CLASSTYPE_SOURCE_LINE (t);      else	line = DECL_SOURCE_LINE (TYPE_NAME (t));    }  else    line = DECL_SOURCE_LINE (t);  if (line == 0)    return lineno;  return line;}char *code_as_string (c, v)     enum tree_code c;     int v;{  return tree_code_name [c];}char *language_as_string (c, v)     enum languages c;     int v;{  switch (c)    {    case lang_c:      return "C";    case lang_cplusplus:      return "C++";    default:      my_friendly_abort (355);      return 0;    }}/* Return the proper printed version of a parameter to a C++ function.  */char *parm_as_string (p, v)     int p, v;{  if (p < 0)    return "`this'";  sprintf (digit_buffer, "%d", p+1);  return digit_buffer;}char *op_as_string (p, v)     enum tree_code p;     int v;{  static char buf[] = "operator                ";  if (p == 0)    return "{unknown}";    strcpy (buf + 9, opname_tab [p]);  return buf;}char *args_as_string (p, v)     tree p;     int v;{  if (p == NULL_TREE)    return "...";  return type_as_string (p, v);}char *cv_as_string (p, v)     tree p;     int v;{  OB_INIT ();  dump_readonly_or_volatile (p, before);  OB_FINISH ();  return (char *)obstack_base (&scratch_obstack);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -