diff options
author | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-06 04:47:42 +0000 |
---|---|---|
committer | zack <zack@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-06 04:47:42 +0000 |
commit | 583fa9e06b1af1cd0c6da01a9ab0ee8a1c4569ce (patch) | |
tree | 5a3ce60061200b7754e09f04fceb0b0f6076a700 /gcc/diagnostic.c | |
parent | f05fc0af2354a187ef812ad910f82ee829fcf326 (diff) | |
download | gcc-583fa9e06b1af1cd0c6da01a9ab0ee8a1c4569ce.tar.gz |
* pretty-print.c: Include tree.h.
(pp_base_prepare_to_format): New function, logic from
text_specifies_location.
(pp_base_format_text): Use gcc_assert.
* pretty-print.h (pp_prepare_to_format): New macro.
(pp_base_prepare_to_format): Prototype.
* diagnostic.c (text_specifies_location): Delete.
(bug_report_request): Delete.
(diagnostic_set_info): Don't call text_specifies_location.
(diagnostic_action_after_output): Put text from
bug_report_request inline here. Use gcc_unreachable.
(diagnostic_report_current_function): Fix comment.
(diagnostic_report_diagnostic): Clarify logic for error recursion.
Call pp_prepare_to_format before diagnostic_starter.
(trim_filename): Use IS_DIR_SEPARATOR.
(fatal_error, internal_error): Use gcc_unreachable.
(error_recursion): Call diagnostic_action_after_output to
issue the bug_report_request message and exit.
* Makefile.in (diagnostic.o, pretty-print.o): Update dependencies.
* c-parse.in: Add list of diagnostic messages to insulate
translation template from version of yacc/bison used to
compile the grammar.
java:
* parse.y, parse-scan.y: Add list of diagnostic messages to
insulate translation template from version of yacc/bison used
to compile the grammar.
treelang:
* parse.y: Add list of diagnostic messages to insulate
translation template from version of yacc/bison used to
compile the grammar.
po:
* gcc.pot: Regenerate.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@88590 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/diagnostic.c')
-rw-r--r-- | gcc/diagnostic.c | 107 |
1 files changed, 36 insertions, 71 deletions
diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index d6b6ea724a2..0705c638600 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -51,7 +51,6 @@ static void default_diagnostic_finalizer (diagnostic_context *, diagnostic_info *); static void error_recursion (diagnostic_context *) ATTRIBUTE_NORETURN; -static bool text_specifies_location (text_info *, location_t *); static bool diagnostic_count_diagnostic (diagnostic_context *, diagnostic_info *); static void diagnostic_action_after_output (diagnostic_context *, @@ -61,13 +60,6 @@ static void real_abort (void) ATTRIBUTE_NORETURN; /* A diagnostic_context surrogate for stderr. */ static diagnostic_context global_diagnostic_context; diagnostic_context *global_dc = &global_diagnostic_context; - -/* Boilerplate text used in two locations. */ -#define bug_report_request \ -"Please submit a full bug report,\n\ -with preprocessed source if appropriate.\n\ -See %s for instructions.\n" - /* Return a malloc'd string containing MSG formatted a la printf. The caller is responsible for freeing the memory. */ @@ -118,35 +110,6 @@ diagnostic_initialize (diagnostic_context *context) context->lock = 0; } -/* Returns true if the next format specifier in TEXT is a format specifier - for a location_t. If so, update the object pointed by LOCUS to reflect - the specified location in *TEXT->args_ptr. */ -static bool -text_specifies_location (text_info *text, location_t *locus) -{ - const char *p; - /* Skip any leading text. */ - for (p = text->format_spec; *p && *p != '%'; ++p) - ; - - /* Extract the location information if any. */ - if (p[0] == '%' && p[1] == 'H') - { - *locus = *va_arg (*text->args_ptr, location_t *); - text->format_spec = p + 2; - return true; - } - else if (p[0] == '%' && p[1] == 'J') - { - tree t = va_arg (*text->args_ptr, tree); - *locus = DECL_SOURCE_LOCATION (t); - text->format_spec = p + 2; - return true; - } - - return false; -} - void diagnostic_set_info (diagnostic_info *diagnostic, const char *msgid, va_list *args, location_t location, @@ -155,10 +118,7 @@ diagnostic_set_info (diagnostic_info *diagnostic, const char *msgid, diagnostic->message.err_no = errno; diagnostic->message.args_ptr = args; diagnostic->message.format_spec = _(msgid); - /* If the diagnostic message doesn't specify a location, - use LOCATION. */ - if (!text_specifies_location (&diagnostic->message, &diagnostic->location)) - diagnostic->location = location; + diagnostic->location = location; diagnostic->kind = kind; } @@ -274,7 +234,9 @@ diagnostic_action_after_output (diagnostic_context *context, if (context->abort_on_error) real_abort (); - fnotice (stderr, bug_report_request, bug_report_url); + fnotice (stderr, "Please submit a full bug report,\n" + "with preprocessed source if appropriate.\n" + "See %s for instructions.\n", bug_report_url); exit (FATAL_EXIT_CODE); case DK_FATAL: @@ -285,14 +247,12 @@ diagnostic_action_after_output (diagnostic_context *context, exit (FATAL_EXIT_CODE); default: - real_abort (); + gcc_unreachable (); } } /* Prints out, if necessary, the name of the current function - that caused an error. Called from all error and warning functions. - We ignore the FILE parameter, as it cannot be relied upon. */ - + that caused an error. Called from all error and warning functions. */ void diagnostic_report_current_function (diagnostic_context *context) { @@ -355,11 +315,23 @@ void diagnostic_report_diagnostic (diagnostic_context *context, diagnostic_info *diagnostic) { - if (context->lock++ && diagnostic->kind < DK_SORRY) - error_recursion (context); + if (context->lock > 0) + { + /* If we're reporting an ICE in the middle of some other error, + try to flush out the previous error, then let this one + through. Don't do this more than once. */ + if (diagnostic->kind == DK_ICE && context->lock == 1) + pp_flush (context->printer); + else + error_recursion (context); + } + + context->lock++; if (diagnostic_count_diagnostic (context, diagnostic)) { + pp_prepare_to_format (context->printer, &diagnostic->message, + &diagnostic->location); (*diagnostic_starter (context)) (context, diagnostic); pp_format_text (context->printer, &diagnostic->message); (*diagnostic_finalizer (context)) (context, diagnostic); @@ -383,20 +355,10 @@ trim_filename (const char *name) /* First skip any "../" in each filename. This allows us to give a proper reference to a file in a subdirectory. */ - while (p[0] == '.' && p[1] == '.' - && (p[2] == DIR_SEPARATOR -#ifdef DIR_SEPARATOR_2 - || p[2] == DIR_SEPARATOR_2 -#endif - )) + while (p[0] == '.' && p[1] == '.' && IS_DIR_SEPARATOR (p[2])) p += 3; - while (q[0] == '.' && q[1] == '.' - && (q[2] == DIR_SEPARATOR -#ifdef DIR_SEPARATOR_2 - || p[2] == DIR_SEPARATOR_2 -#endif - )) + while (q[0] == '.' && q[1] == '.' && IS_DIR_SEPARATOR (q[2])) q += 3; /* Now skip any parts the two filenames have in common. */ @@ -404,11 +366,7 @@ trim_filename (const char *name) p++, q++; /* Now go backwards until the previous directory separator. */ - while (p > name && p[-1] != DIR_SEPARATOR -#ifdef DIR_SEPARATOR_2 - && p[-1] != DIR_SEPARATOR_2 -#endif - ) + while (p > name && IS_DIR_SEPARATOR (p[-1])) p--; return p; @@ -526,8 +484,7 @@ fatal_error (const char *msgid, ...) report_diagnostic (&diagnostic); va_end (ap); - /* NOTREACHED */ - real_abort (); + gcc_unreachable (); } /* An internal consistency check has failed. We make no attempt to @@ -545,8 +502,7 @@ internal_error (const char *msgid, ...) report_diagnostic (&diagnostic); va_end (ap); - /* NOTREACHED */ - real_abort (); + gcc_unreachable (); } /* Special case error functions. Most are implemented in terms of the @@ -572,13 +528,22 @@ fnotice (FILE *file, const char *msgid, ...) static void error_recursion (diagnostic_context *context) { + diagnostic_info diagnostic; + if (context->lock < 3) pp_flush (context->printer); fnotice (stderr, "Internal compiler error: Error reporting routines re-entered.\n"); - fnotice (stderr, bug_report_request, bug_report_url); - exit (FATAL_EXIT_CODE); + + /* Call diagnostic_action_after_output to get the "please submit a bug + report" message. It only looks at the kind field of diagnostic_info. */ + diagnostic.kind = DK_ICE; + diagnostic_action_after_output (context, &diagnostic); + + /* Do not use gcc_unreachable here; that goes through internal_error + and therefore would cause infinite recursion. */ + real_abort (); } /* Report an internal compiler error in a friendly manner. This is |