📄 error.c
字号:
OB_PUTC (')'); } else { if (TREE_OPERAND (t,0) != NULL_TREE && TREE_TYPE (TREE_OPERAND (t, 0)) && 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 (TREE_TYPE (t) != NULL_TREE && 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: if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t))) { tree idx = build_component_ref (t, index_identifier, NULL_TREE, 0); if (integer_all_onesp (idx)) { tree pfn = PFN_FROM_PTRMEMFUNC (t); dump_unary_op ("&", pfn, 0); break; } else if (TREE_CODE (idx) == INTEGER_CST && tree_int_cst_equal (idx, integer_zero_node)) { /* A NULL pointer-to-member constant. */ OB_PUTS ("(("); dump_type (TREE_TYPE (t), 0); OB_PUTS (") 0)"); break; } else if (TREE_CODE (idx) == INTEGER_CST && TREE_INT_CST_HIGH (idx) == 0) { tree virtuals; unsigned HOST_WIDE_INT n; t = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (t))); t = TYPE_METHOD_BASETYPE (t); virtuals = BINFO_VIRTUALS (TYPE_BINFO (TYPE_MAIN_VARIANT (t))); n = TREE_INT_CST_LOW (idx); /* Map vtable index back one, to allow for the null pointer to member. */ --n; while (n > 0 && virtuals) { --n; virtuals = TREE_CHAIN (virtuals); } if (virtuals) { dump_expr (FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (virtuals)), 0); break; } } } OB_PUTC ('{'); dump_expr_list (CONSTRUCTOR_ELTS (t)); OB_PUTC ('}'); break; case OFFSET_REF: { tree ob = TREE_OPERAND (t, 0); if (is_dummy_object (ob)) { t = TREE_OPERAND (t, 1); if (TREE_CODE (t) == FUNCTION_DECL) /* A::f */ dump_expr (t, 0); else if (BASELINK_P (t)) dump_expr (OVL_CURRENT (TREE_VALUE (t)), 0); else dump_decl (t, 0); } else { if (TREE_CODE (ob) == INDIRECT_REF) { dump_expr (TREE_OPERAND (ob, 0), 0); OB_PUTS (" ->* "); } else { dump_expr (ob, 0); OB_PUTS (" .* "); } dump_expr (TREE_OPERAND (t, 1), 0); } break; } case TEMPLATE_PARM_INDEX: dump_decl (TEMPLATE_PARM_DECL (t), -1); break; case IDENTIFIER_NODE: OB_PUTID (t); break; case SCOPE_REF: dump_type (TREE_OPERAND (t, 0), 0); OB_PUTS ("::"); dump_expr (TREE_OPERAND (t, 1), 0); break; case CAST_EXPR: if (TREE_OPERAND (t, 0) == NULL_TREE || TREE_CHAIN (TREE_OPERAND (t, 0))) { dump_type (TREE_TYPE (t), 0); OB_PUTC ('('); dump_expr_list (TREE_OPERAND (t, 0)); OB_PUTC (')'); } else { OB_PUTC ('('); dump_type (TREE_TYPE (t), 0); OB_PUTC (')'); OB_PUTC ('('); dump_expr_list (TREE_OPERAND (t, 0)); OB_PUTC (')'); } break; case LOOKUP_EXPR: OB_PUTID (TREE_OPERAND (t, 0)); break; case ARROW_EXPR: dump_expr (TREE_OPERAND (t, 0), nop); OB_PUTS ("->"); break; case SIZEOF_EXPR: case ALIGNOF_EXPR: if (TREE_CODE (t) == SIZEOF_EXPR) OB_PUTS ("sizeof ("); else { my_friendly_assert (TREE_CODE (t) == ALIGNOF_EXPR, 0); OB_PUTS ("__alignof__ ("); } if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 0))) == 't') dump_type (TREE_OPERAND (t, 0), 0); else dump_unary_op ("*", t, 0); OB_PUTC (')'); break; case DEFAULT_ARG: OB_PUTS ("{unparsed}"); break; case TRY_CATCH_EXPR: case WITH_CLEANUP_EXPR: case CLEANUP_POINT_EXPR: dump_expr (TREE_OPERAND (t, 0), nop); break; case TEMPLATE_ID_EXPR: dump_decl (t, 0); 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: 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 (')');}/* Print a function decl with exception specification included. */char *fndecl_as_string (fndecl, print_default_args_p) tree fndecl; int print_default_args_p;{ OB_INIT (); dump_function_decl (fndecl, 2 + print_default_args_p); OB_FINISH (); return (char *)obstack_base (&scratch_obstack);}/* Same, but handle a _TYPE. Called from convert_to_reference, mangle_class_name_for_template, build_unary_op, and GNU_xref_decl. If CANONICAL_NAME is non-zero, when describing a typedef, we use the name of the type described, rather than the name of the typedef. */char *type_as_string_real (typ, v, canonical_name) tree typ; int v; int canonical_name;{ OB_INIT (); dump_type_real (typ, v, canonical_name); OB_FINISH (); return (char *)obstack_base (&scratch_obstack);}char *type_as_string (typ, v) tree typ; int v;{ return type_as_string_real (typ, v, 0);}char *expr_as_string (decl, v) tree decl; int v ATTRIBUTE_UNUSED;{ 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);}/* Generate the three forms of printable names for lang_printable_name. */char *lang_decl_name (decl, v) tree decl; int v;{ if (v >= 2) return decl_as_string (decl, 1); OB_INIT (); if (v == 1 && DECL_CLASS_SCOPE_P (decl)) { tree cname; if (TREE_CODE (decl) == FUNCTION_DECL) cname = DECL_CLASS_CONTEXT (decl); else cname = DECL_CONTEXT (decl); dump_type (cname, 0); OB_PUTC2 (':', ':'); } if (TREE_CODE (decl) == FUNCTION_DECL) dump_function_name (decl); else dump_decl (DECL_NAME (decl), 0); OB_FINISH (); return (char *)obstack_base (&scratch_obstack);} char *cp_file_of (t) tree t;{ if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t)) return DECL_SOURCE_FILE (DECL_CONTEXT (t)); else if (TREE_CODE_CLASS (TREE_CODE (t)) == 't') return DECL_SOURCE_FILE (TYPE_MAIN_DECL (t)); else if (TREE_CODE (t) == OVERLOAD) return DECL_SOURCE_FILE (OVL_FUNCTION (t)); else return DECL_SOURCE_FILE (t);}intcp_line_of (t) tree t;{ int line = 0; if (TREE_CODE (t) == PARM_DECL && DECL_CONTEXT (t)) line = DECL_SOURCE_LINE (DECL_CONTEXT (t)); if (TREE_CODE (t) == TYPE_DECL && DECL_ARTIFICIAL (t) && TYPE_MAIN_DECL (TREE_TYPE (t))) t = TREE_TYPE (t); if (TREE_CODE_CLASS (TREE_CODE (t)) == 't') line = DECL_SOURCE_LINE (TYPE_MAIN_DECL (t)); else if (TREE_CODE (t) == OVERLOAD) line = DECL_SOURCE_LINE (OVL_FUNCTION (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 ATTRIBUTE_UNUSED;{ return tree_code_name [c];}char *language_as_string (c, v) enum languages c; int v ATTRIBUTE_UNUSED;{ switch (c) { case lang_c: return "C"; case lang_cplusplus: return "C++"; case lang_java: return "Java"; 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; int v ATTRIBUTE_UNUSED;{ 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 ATTRIBUTE_UNUSED;{ static char buf[] = "operator "; if (p == 0) return "{unknown}"; strcpy (buf + 9, opname_tab [p]); return buf;}char *assop_as_string (p, v) enum tree_code p; int v ATTRIBUTE_UNUSED;{ static char buf[] = "operator "; if (p == 0) return "{unknown}"; strcpy (buf + 9, assignop_tab [p]); return buf;}char *args_as_string (p, v) tree p; int v;{ if (p == NULL_TREE) return ""; if (TREE_CODE_CLASS (TREE_CODE (TREE_VALUE (p))) == 't') return type_as_string (p, v); OB_INIT (); for (; p; p = TREE_CHAIN (p)) { if (TREE_VALUE (p) == null_node) OB_PUTS ("NULL"); else dump_type (error_type (TREE_VALUE (p)), v); if (TREE_CHAIN (p)) OB_PUTS (", "); } OB_FINISH (); return (char *)obstack_base (&scratch_obstack);}char *cv_as_string (p, v) tree p; int v ATTRIBUTE_UNUSED;{ OB_INIT (); dump_qualifiers (p, before); OB_FINISH (); return (char *)obstack_base (&scratch_obstack);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -