static void pp_c_type_cast (c_pretty_printer *pp, tree t) { pp_c_left_paren (pp); pp_type_id (pp, t); pp_c_right_paren (pp); }
void pp_c_postfix_expression (c_pretty_printer *pp, tree e) { enum tree_code code = TREE_CODE (e); switch (code) { case POSTINCREMENT_EXPR: case POSTDECREMENT_EXPR: pp_postfix_expression (pp, TREE_OPERAND (e, 0)); pp_identifier (pp, code == POSTINCREMENT_EXPR ? "++" : "--"); break; case ARRAY_REF: pp_postfix_expression (pp, TREE_OPERAND (e, 0)); pp_c_left_bracket (pp); pp_expression (pp, TREE_OPERAND (e, 1)); pp_c_right_bracket (pp); break; case CALL_EXPR: pp_postfix_expression (pp, TREE_OPERAND (e, 0)); pp_c_call_argument_list (pp, TREE_OPERAND (e, 1)); break; case UNORDERED_EXPR: pp_c_identifier (pp, flag_isoc99 ? "isunordered" : "__builtin_isunordered"); goto two_args_fun; case ORDERED_EXPR: pp_c_identifier (pp, flag_isoc99 ? "!isunordered" : "!__builtin_isunordered"); goto two_args_fun; case UNLT_EXPR: pp_c_identifier (pp, flag_isoc99 ? "!isgreaterequal" : "!__builtin_isgreaterequal"); goto two_args_fun; case UNLE_EXPR: pp_c_identifier (pp, flag_isoc99 ? "!isgreater" : "!__builtin_isgreater"); goto two_args_fun; case UNGT_EXPR: pp_c_identifier (pp, flag_isoc99 ? "!islessequal" : "!__builtin_islessequal"); goto two_args_fun; case UNGE_EXPR: pp_c_identifier (pp, flag_isoc99 ? "!isless" : "!__builtin_isless"); goto two_args_fun; case UNEQ_EXPR: pp_c_identifier (pp, flag_isoc99 ? "!islessgreater" : "!__builtin_islessgreater"); goto two_args_fun; case LTGT_EXPR: pp_c_identifier (pp, flag_isoc99 ? "islessgreater" : "__builtin_islessgreater"); goto two_args_fun; two_args_fun: pp_c_left_paren (pp); pp_expression (pp, TREE_OPERAND (e, 0)); pp_separate_with (pp, ','); pp_expression (pp, TREE_OPERAND (e, 1)); pp_c_right_paren (pp); break; case ABS_EXPR: pp_c_identifier (pp, "__builtin_abs"); pp_c_left_paren (pp); pp_expression (pp, TREE_OPERAND (e, 0)); pp_c_right_paren (pp); break; case COMPONENT_REF: { tree object = TREE_OPERAND (e, 0); if (TREE_CODE (object) == INDIRECT_REF) { pp_postfix_expression (pp, TREE_OPERAND (object, 0)); pp_c_arrow (pp); } else { pp_postfix_expression (pp, object); pp_c_dot (pp); } pp_expression (pp, TREE_OPERAND (e, 1)); } break; case COMPLEX_CST: case VECTOR_CST: case COMPLEX_EXPR: pp_c_compound_literal (pp, e); break; case COMPOUND_LITERAL_EXPR: e = DECL_INITIAL (COMPOUND_LITERAL_EXPR_DECL (e)); /* Fall through. */ case CONSTRUCTOR: pp_initializer (pp, e); break; case VA_ARG_EXPR: pp_c_identifier (pp, "__builtin_va_arg"); pp_c_left_paren (pp); pp_assignment_expression (pp, TREE_OPERAND (e, 0)); pp_separate_with (pp, ','); pp_type_id (pp, TREE_TYPE (e)); pp_c_right_paren (pp); break; case ADDR_EXPR: if (TREE_CODE (TREE_OPERAND (e, 0)) == FUNCTION_DECL) { pp_c_id_expression (pp, TREE_OPERAND (e, 0)); break; } /* else fall through. */ default: pp_primary_expression (pp, e); break; } }
/* Called during diagnostic message formatting process to print a source-level entity onto BUFFER. The meaning of the format specifiers is as follows: %D: a general decl, %E: an identifier or expression, %F: a function declaration, %T: a type. These format specifiers form a subset of the format specifiers set used by the C++ front-end. Please notice when called, the `%' part was already skipped by the diagnostic machinery. */ static bool c_tree_printer (pretty_printer *pp, text_info *text, const char *spec, int precision, bool wide, bool set_locus, bool hash) { tree t = va_arg (*text->args_ptr, tree); tree name; c_pretty_printer *cpp = (c_pretty_printer *) pp; pp->padding = pp_none; if (precision != 0 || wide || hash) return false; if (set_locus && text->locus) *text->locus = DECL_SOURCE_LOCATION (t); switch (*spec) { case 'D': if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t)) { t = DECL_DEBUG_EXPR (t); if (!DECL_P (t)) { pp_c_expression (cpp, t); return true; } } /* FALLTHRU */ case 'F': if (DECL_NAME (t)) { pp_identifier (cpp, lang_hooks.decl_printable_name (t, 2)); return true; } break; case 'T': gcc_assert (TYPE_P (t)); name = TYPE_NAME (t); if (name && TREE_CODE (name) == TYPE_DECL) { if (DECL_NAME (name)) pp_identifier (cpp, lang_hooks.decl_printable_name (name, 2)); else pp_type_id (cpp, t); return true; } else { pp_type_id (cpp, t); return true; } break; case 'E': if (TREE_CODE (t) == IDENTIFIER_NODE) pp_identifier (cpp, IDENTIFIER_POINTER (t)); else pp_expression (cpp, t); return true; default: return false; } pp_string (cpp, _("({anonymous})")); return true; }