diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-09-27 09:24:58 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-09-27 09:24:58 +0200 |
commit | c94ed7a1ae35d90b76e04cc7d8a9d72a7aa1451c (patch) | |
tree | da9ad83a363c4d770588541c6c1fc6b8fc3e0b7a /gcc/cp/error.c | |
parent | dcbb0d145f6999926d17f7d7a3e6b84f6f2182b0 (diff) | |
download | gcc-c94ed7a1ae35d90b76e04cc7d8a9d72a7aa1451c.zip gcc-c94ed7a1ae35d90b76e04cc7d8a9d72a7aa1451c.tar.gz gcc-c94ed7a1ae35d90b76e04cc7d8a9d72a7aa1451c.tar.bz2 |
builtins.c (expand_builtin, [...]): Use new %K format string specifier for diagnostics.
* builtins.c (expand_builtin, expand_builtin_object_size,
expand_builtin_memory_chk, maybe_emit_chk_warning,
maybe_emit_sprintf_chk_warning): Use new %K format string specifier
for diagnostics.
* expr.c (expand_expr_real_1): Likewise.
* langhooks-def.h (struct diagnostic_info): Add forward decl.
(lhd_print_error_function): Add third argument.
* langhooks.h (struct diagnostic_info): Add forward decl.
(struct lang_hooks): Add third argument to print_error_function.
* diagnostic.h (diagnostic_info): Add abstract_origin field.
(diagnostic_last_function_changed, diagnostic_set_last_function): Add
second argument.
(diagnostic_report_current_function): Likewise.
* toplev.c (announce_function): Pass NULL as second argument to
diagnostic_set_last_function.
* diagnostic.c (diagnostic_report_current_function): Add second
argument, pass it as third argument to lang_hooks.print_error_function.
(default_diagnostic_starter): Pass DIAGNOSTIC as second argument
to diagnostic_report_current_function.
(diagnostic_report_diagnostic): Initialize diagnostic->abstract_origin
and message.abstract_origin.
(verbatim): Initialize abstract_origin.
* pretty-print.h (text_info): Add abstract_origin field.
* pretty-print.c (pp_base_format): Handle %K.
* langhooks.c (lhd_print_error_function): Add third argument. If
diagnostic->abstract_origin, print virtual backtrace.
* c-format.c (gcc_diag_char_table, gcc_tdiag_char_table,
gcc_cdiag_char_table, gcc_cxxdiag_char_table): Support %K.
(init_dynamic_diag_info): Likewise.
cp/
* error.c (cxx_print_error_function): Add third argument, pass
it over to lhd_print_error_function.
(cp_print_error_function): If diagnostic->abstract_origin, print
virtual backtrace.
* cp-tree.h (struct diagnostic_info): New forward decl.
(cxx_print_error_function): Add third argument.
java/
* lang.c (java_print_error_function): Add third argument.
testsuite/
* lib/prune.exp: Prune also "^In function .*$" lines and
"^ inlined from .*$" lines.
From-SVN: r128830
Diffstat (limited to 'gcc/cp/error.c')
-rw-r--r-- | gcc/cp/error.c | 99 |
1 files changed, 91 insertions, 8 deletions
diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 602426a..24f1d83 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -2329,9 +2329,10 @@ cv_to_string (tree p, int v) /* Langhook for print_error_function. */ void -cxx_print_error_function (diagnostic_context *context, const char *file) +cxx_print_error_function (diagnostic_context *context, const char *file, + diagnostic_info *diagnostic) { - lhd_print_error_function (context, file); + lhd_print_error_function (context, file, diagnostic); pp_base_set_prefix (context->printer, file); maybe_print_instantiation_context (context); } @@ -2359,23 +2360,105 @@ static void cp_print_error_function (diagnostic_context *context, diagnostic_info *diagnostic) { - if (diagnostic_last_function_changed (context)) + if (diagnostic_last_function_changed (context, diagnostic)) { const char *old_prefix = context->printer->prefix; const char *file = LOCATION_FILE (diagnostic->location); - char *new_prefix = file ? file_name_as_prefix (file) : NULL; + tree abstract_origin = diagnostic->abstract_origin; + char *new_prefix = (file && abstract_origin == NULL) + ? file_name_as_prefix (file) : NULL; pp_base_set_prefix (context->printer, new_prefix); if (current_function_decl == NULL) pp_base_string (context->printer, "At global scope:"); else - pp_printf (context->printer, "In %s %qs:", - function_category (current_function_decl), - cxx_printable_name (current_function_decl, 2)); + { + tree fndecl, ao; + + if (abstract_origin) + { + ao = BLOCK_ABSTRACT_ORIGIN (abstract_origin); + while (TREE_CODE (ao) == BLOCK && BLOCK_ABSTRACT_ORIGIN (ao)) + ao = BLOCK_ABSTRACT_ORIGIN (ao); + gcc_assert (TREE_CODE (ao) == FUNCTION_DECL); + fndecl = ao; + } + else + fndecl = current_function_decl; + + pp_printf (context->printer, "In %s %qs", + function_category (fndecl), + cxx_printable_name (fndecl, 2)); + + while (abstract_origin) + { + location_t *locus; + tree block = abstract_origin; + + locus = &BLOCK_SOURCE_LOCATION (block); + fndecl = NULL; + block = BLOCK_SUPERCONTEXT (block); + while (block && TREE_CODE (block) == BLOCK + && BLOCK_ABSTRACT_ORIGIN (block)) + { + ao = BLOCK_ABSTRACT_ORIGIN (block); + + while (TREE_CODE (ao) == BLOCK && BLOCK_ABSTRACT_ORIGIN (ao)) + ao = BLOCK_ABSTRACT_ORIGIN (ao); + + if (TREE_CODE (ao) == FUNCTION_DECL) + { + fndecl = ao; + break; + } + else if (TREE_CODE (ao) != BLOCK) + break; + + block = BLOCK_SUPERCONTEXT (block); + } + if (fndecl) + abstract_origin = block; + else + { + while (block && TREE_CODE (block) == BLOCK) + block = BLOCK_SUPERCONTEXT (block); + + if (TREE_CODE (block) == FUNCTION_DECL) + fndecl = block; + abstract_origin = NULL; + } + if (fndecl) + { + expanded_location s = expand_location (*locus); + pp_base_character (context->printer, ','); + pp_base_newline (context->printer); + if (s.file != NULL) + { +#ifdef USE_MAPPED_LOCATION + if (flag_show_column && s.column != 0) + pp_printf (context->printer, + " inlined from %qs at %s:%d:%d", + cxx_printable_name (fndecl, 2), + s.file, s.line, s.column); + else +#endif + pp_printf (context->printer, + " inlined from %qs at %s:%d", + cxx_printable_name (fndecl, 2), + s.file, s.line); + + } + else + pp_printf (context->printer, " inlined from %qs", + cxx_printable_name (fndecl, 2)); + } + } + pp_base_character (context->printer, ':'); + } pp_base_newline (context->printer); - diagnostic_set_last_function (context); + diagnostic_set_last_function (context, diagnostic); pp_base_destroy_prefix (context->printer); context->printer->prefix = old_prefix; } |