kernel - Fix races created by a comedy of circumstansces (3)
[dragonfly.git] / contrib / gcc-4.7 / gcc / diagnostic.c
bloba68d6ce88eed9c17752dc68d99c461dfea9ae6d3
1 /* Language-independent diagnostic subroutines for the GNU Compiler Collection
2 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
4 Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
23 /* This file implements the language independent aspect of diagnostic
24 message module. */
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "version.h"
30 #include "input.h"
31 #include "intl.h"
32 #include "diagnostic.h"
34 #define pedantic_warning_kind(DC) \
35 ((DC)->pedantic_errors ? DK_ERROR : DK_WARNING)
36 #define permissive_error_kind(DC) ((DC)->permissive ? DK_WARNING : DK_ERROR)
37 #define permissive_error_option(DC) ((DC)->opt_permissive)
39 /* Prototypes. */
40 static char *build_message_string (const char *, ...) ATTRIBUTE_PRINTF_1;
42 static void error_recursion (diagnostic_context *) ATTRIBUTE_NORETURN;
44 static void diagnostic_action_after_output (diagnostic_context *,
45 diagnostic_info *);
46 static void real_abort (void) ATTRIBUTE_NORETURN;
48 /* Name of program invoked, sans directories. */
50 const char *progname;
52 /* A diagnostic_context surrogate for stderr. */
53 static diagnostic_context global_diagnostic_context;
54 diagnostic_context *global_dc = &global_diagnostic_context;
57 /* Return a malloc'd string containing MSG formatted a la printf. The
58 caller is responsible for freeing the memory. */
59 static char *
60 build_message_string (const char *msg, ...)
62 char *str;
63 va_list ap;
65 va_start (ap, msg);
66 vasprintf (&str, msg, ap);
67 va_end (ap);
69 return str;
72 /* Same as diagnostic_build_prefix, but only the source FILE is given. */
73 char *
74 file_name_as_prefix (const char *f)
76 return build_message_string ("%s: ", f);
81 /* Initialize the diagnostic message outputting machinery. */
82 void
83 diagnostic_initialize (diagnostic_context *context, int n_opts)
85 int i;
87 /* Allocate a basic pretty-printer. Clients will replace this a
88 much more elaborated pretty-printer if they wish. */
89 context->printer = XNEW (pretty_printer);
90 pp_construct (context->printer, NULL, 0);
91 /* By default, diagnostics are sent to stderr. */
92 context->printer->buffer->stream = stderr;
93 /* By default, we emit prefixes once per message. */
94 context->printer->wrapping.rule = DIAGNOSTICS_SHOW_PREFIX_ONCE;
96 memset (context->diagnostic_count, 0, sizeof context->diagnostic_count);
97 context->some_warnings_are_errors = false;
98 context->warning_as_error_requested = false;
99 context->n_opts = n_opts;
100 context->classify_diagnostic = XNEWVEC (diagnostic_t, n_opts);
101 for (i = 0; i < n_opts; i++)
102 context->classify_diagnostic[i] = DK_UNSPECIFIED;
103 context->show_option_requested = false;
104 context->abort_on_error = false;
105 context->show_column = false;
106 context->pedantic_errors = false;
107 context->permissive = false;
108 context->opt_permissive = 0;
109 context->fatal_errors = false;
110 context->dc_inhibit_warnings = false;
111 context->dc_warn_system_headers = false;
112 context->max_errors = 0;
113 context->internal_error = NULL;
114 diagnostic_starter (context) = default_diagnostic_starter;
115 diagnostic_finalizer (context) = default_diagnostic_finalizer;
116 context->option_enabled = NULL;
117 context->option_state = NULL;
118 context->option_name = NULL;
119 context->last_module = 0;
120 context->x_data = NULL;
121 context->lock = 0;
122 context->inhibit_notes_p = false;
125 /* Do any cleaning up required after the last diagnostic is emitted. */
127 void
128 diagnostic_finish (diagnostic_context *context)
130 /* Some of the errors may actually have been warnings. */
131 if (context->some_warnings_are_errors)
133 /* -Werror was given. */
134 if (context->warning_as_error_requested)
135 pp_verbatim (context->printer,
136 _("%s: all warnings being treated as errors"),
137 progname);
138 /* At least one -Werror= was given. */
139 else
140 pp_verbatim (context->printer,
141 _("%s: some warnings being treated as errors"),
142 progname);
143 pp_flush (context->printer);
147 /* Initialize DIAGNOSTIC, where the message MSG has already been
148 translated. */
149 void
150 diagnostic_set_info_translated (diagnostic_info *diagnostic, const char *msg,
151 va_list *args, location_t location,
152 diagnostic_t kind)
154 diagnostic->message.err_no = errno;
155 diagnostic->message.args_ptr = args;
156 diagnostic->message.format_spec = msg;
157 diagnostic->location = location;
158 diagnostic->override_column = 0;
159 diagnostic->kind = kind;
160 diagnostic->option_index = 0;
163 /* Initialize DIAGNOSTIC, where the message GMSGID has not yet been
164 translated. */
165 void
166 diagnostic_set_info (diagnostic_info *diagnostic, const char *gmsgid,
167 va_list *args, location_t location,
168 diagnostic_t kind)
170 diagnostic_set_info_translated (diagnostic, _(gmsgid), args, location, kind);
173 /* Return a malloc'd string describing a location. The caller is
174 responsible for freeing the memory. */
175 char *
176 diagnostic_build_prefix (diagnostic_context *context,
177 diagnostic_info *diagnostic)
179 static const char *const diagnostic_kind_text[] = {
180 #define DEFINE_DIAGNOSTIC_KIND(K, T) (T),
181 #include "diagnostic.def"
182 #undef DEFINE_DIAGNOSTIC_KIND
183 "must-not-happen"
185 const char *text = _(diagnostic_kind_text[diagnostic->kind]);
186 expanded_location s = expand_location (diagnostic->location);
187 if (diagnostic->override_column)
188 s.column = diagnostic->override_column;
189 gcc_assert (diagnostic->kind < DK_LAST_DIAGNOSTIC_KIND);
191 return
192 (s.file == NULL
193 ? build_message_string ("%s: %s", progname, text)
194 : context->show_column
195 ? build_message_string ("%s:%d:%d: %s", s.file, s.line, s.column, text)
196 : build_message_string ("%s:%d: %s", s.file, s.line, text));
199 /* Take any action which is expected to happen after the diagnostic
200 is written out. This function does not always return. */
201 static void
202 diagnostic_action_after_output (diagnostic_context *context,
203 diagnostic_info *diagnostic)
205 switch (diagnostic->kind)
207 case DK_DEBUG:
208 case DK_NOTE:
209 case DK_ANACHRONISM:
210 case DK_WARNING:
211 break;
213 case DK_ERROR:
214 case DK_SORRY:
215 if (context->abort_on_error)
216 real_abort ();
217 if (context->fatal_errors)
219 fnotice (stderr, "compilation terminated due to -Wfatal-errors.\n");
220 diagnostic_finish (context);
221 exit (FATAL_EXIT_CODE);
223 if (context->max_errors != 0
224 && ((unsigned) (diagnostic_kind_count (context, DK_ERROR)
225 + diagnostic_kind_count (context, DK_SORRY))
226 >= context->max_errors))
228 fnotice (stderr,
229 "compilation terminated due to -fmax-errors=%u.\n",
230 context->max_errors);
231 diagnostic_finish (context);
232 exit (FATAL_EXIT_CODE);
234 break;
236 case DK_ICE:
237 if (context->abort_on_error)
238 real_abort ();
240 fnotice (stderr, "Please submit a full bug report,\n"
241 "with preprocessed source if appropriate.\n"
242 "See %s for instructions.\n", bug_report_url);
243 exit (ICE_EXIT_CODE);
245 case DK_FATAL:
246 if (context->abort_on_error)
247 real_abort ();
248 diagnostic_finish (context);
249 fnotice (stderr, "compilation terminated.\n");
250 exit (FATAL_EXIT_CODE);
252 default:
253 gcc_unreachable ();
257 void
258 diagnostic_report_current_module (diagnostic_context *context, location_t where)
260 const struct line_map *map = NULL;
262 if (pp_needs_newline (context->printer))
264 pp_newline (context->printer);
265 pp_needs_newline (context->printer) = false;
268 if (where <= BUILTINS_LOCATION)
269 return;
271 linemap_resolve_location (line_table, where,
272 LRK_MACRO_DEFINITION_LOCATION,
273 &map);
275 if (map && diagnostic_last_module_changed (context, map))
277 diagnostic_set_last_module (context, map);
278 if (! MAIN_FILE_P (map))
280 map = INCLUDED_FROM (line_table, map);
281 if (context->show_column)
282 pp_verbatim (context->printer,
283 "In file included from %s:%d:%d",
284 LINEMAP_FILE (map),
285 LAST_SOURCE_LINE (map), LAST_SOURCE_COLUMN (map));
286 else
287 pp_verbatim (context->printer,
288 "In file included from %s:%d",
289 LINEMAP_FILE (map), LAST_SOURCE_LINE (map));
290 while (! MAIN_FILE_P (map))
292 map = INCLUDED_FROM (line_table, map);
293 pp_verbatim (context->printer,
294 ",\n from %s:%d",
295 LINEMAP_FILE (map), LAST_SOURCE_LINE (map));
297 pp_verbatim (context->printer, ":");
298 pp_newline (context->printer);
303 void
304 default_diagnostic_starter (diagnostic_context *context,
305 diagnostic_info *diagnostic)
307 diagnostic_report_current_module (context, diagnostic->location);
308 pp_set_prefix (context->printer, diagnostic_build_prefix (context,
309 diagnostic));
312 void
313 default_diagnostic_finalizer (diagnostic_context *context,
314 diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
316 pp_destroy_prefix (context->printer);
319 /* Interface to specify diagnostic kind overrides. Returns the
320 previous setting, or DK_UNSPECIFIED if the parameters are out of
321 range. */
322 diagnostic_t
323 diagnostic_classify_diagnostic (diagnostic_context *context,
324 int option_index,
325 diagnostic_t new_kind,
326 location_t where)
328 diagnostic_t old_kind;
330 if (option_index <= 0
331 || option_index >= context->n_opts
332 || new_kind >= DK_LAST_DIAGNOSTIC_KIND)
333 return DK_UNSPECIFIED;
335 old_kind = context->classify_diagnostic[option_index];
337 /* Handle pragmas separately, since we need to keep track of *where*
338 the pragmas were. */
339 if (where != UNKNOWN_LOCATION)
341 int i;
343 for (i = context->n_classification_history - 1; i >= 0; i --)
344 if (context->classification_history[i].option == option_index)
346 old_kind = context->classification_history[i].kind;
347 break;
350 i = context->n_classification_history;
351 context->classification_history =
352 (diagnostic_classification_change_t *) xrealloc (context->classification_history, (i + 1)
353 * sizeof (diagnostic_classification_change_t));
354 context->classification_history[i].location = where;
355 context->classification_history[i].option = option_index;
356 context->classification_history[i].kind = new_kind;
357 context->n_classification_history ++;
359 else
360 context->classify_diagnostic[option_index] = new_kind;
362 return old_kind;
365 /* Save all diagnostic classifications in a stack. */
366 void
367 diagnostic_push_diagnostics (diagnostic_context *context, location_t where ATTRIBUTE_UNUSED)
369 context->push_list = (int *) xrealloc (context->push_list, (context->n_push + 1) * sizeof (int));
370 context->push_list[context->n_push ++] = context->n_classification_history;
373 /* Restore the topmost classification set off the stack. If the stack
374 is empty, revert to the state based on command line parameters. */
375 void
376 diagnostic_pop_diagnostics (diagnostic_context *context, location_t where)
378 int jump_to;
379 int i;
381 if (context->n_push)
382 jump_to = context->push_list [-- context->n_push];
383 else
384 jump_to = 0;
386 i = context->n_classification_history;
387 context->classification_history =
388 (diagnostic_classification_change_t *) xrealloc (context->classification_history, (i + 1)
389 * sizeof (diagnostic_classification_change_t));
390 context->classification_history[i].location = where;
391 context->classification_history[i].option = jump_to;
392 context->classification_history[i].kind = DK_POP;
393 context->n_classification_history ++;
396 /* Report a diagnostic message (an error or a warning) as specified by
397 DC. This function is *the* subroutine in terms of which front-ends
398 should implement their specific diagnostic handling modules. The
399 front-end independent format specifiers are exactly those described
400 in the documentation of output_format.
401 Return true if a diagnostic was printed, false otherwise. */
403 bool
404 diagnostic_report_diagnostic (diagnostic_context *context,
405 diagnostic_info *diagnostic)
407 location_t location = diagnostic->location;
408 diagnostic_t orig_diag_kind = diagnostic->kind;
409 const char *saved_format_spec;
411 /* Give preference to being able to inhibit warnings, before they
412 get reclassified to something else. */
413 if ((diagnostic->kind == DK_WARNING || diagnostic->kind == DK_PEDWARN)
414 && !diagnostic_report_warnings_p (context, location))
415 return false;
417 if (diagnostic->kind == DK_PEDWARN)
419 diagnostic->kind = pedantic_warning_kind (context);
420 /* We do this to avoid giving the message for -pedantic-errors. */
421 orig_diag_kind = diagnostic->kind;
424 if (diagnostic->kind == DK_NOTE && context->inhibit_notes_p)
425 return false;
427 if (context->lock > 0)
429 /* If we're reporting an ICE in the middle of some other error,
430 try to flush out the previous error, then let this one
431 through. Don't do this more than once. */
432 if (diagnostic->kind == DK_ICE && context->lock == 1)
433 pp_flush (context->printer);
434 else
435 error_recursion (context);
438 /* If the user requested that warnings be treated as errors, so be
439 it. Note that we do this before the next block so that
440 individual warnings can be overridden back to warnings with
441 -Wno-error=*. */
442 if (context->warning_as_error_requested
443 && diagnostic->kind == DK_WARNING)
445 diagnostic->kind = DK_ERROR;
448 if (diagnostic->option_index)
450 diagnostic_t diag_class = DK_UNSPECIFIED;
452 /* This tests if the user provided the appropriate -Wfoo or
453 -Wno-foo option. */
454 if (! context->option_enabled (diagnostic->option_index,
455 context->option_state))
456 return false;
458 /* This tests for #pragma diagnostic changes. */
459 if (context->n_classification_history > 0)
461 int i;
462 /* FIXME: Stupid search. Optimize later. */
463 for (i = context->n_classification_history - 1; i >= 0; i --)
465 if (linemap_location_before_p
466 (line_table,
467 context->classification_history[i].location,
468 location))
470 if (context->classification_history[i].kind == (int) DK_POP)
472 i = context->classification_history[i].option;
473 continue;
475 if (context->classification_history[i].option == diagnostic->option_index)
477 diag_class = context->classification_history[i].kind;
478 if (diag_class != DK_UNSPECIFIED)
479 diagnostic->kind = diag_class;
480 break;
485 /* This tests if the user provided the appropriate -Werror=foo
486 option. */
487 if (diag_class == DK_UNSPECIFIED
488 && context->classify_diagnostic[diagnostic->option_index] != DK_UNSPECIFIED)
490 diagnostic->kind = context->classify_diagnostic[diagnostic->option_index];
492 /* This allows for future extensions, like temporarily disabling
493 warnings for ranges of source code. */
494 if (diagnostic->kind == DK_IGNORED)
495 return false;
498 if (orig_diag_kind == DK_WARNING && diagnostic->kind == DK_ERROR)
499 context->some_warnings_are_errors = true;
501 context->lock++;
503 if (diagnostic->kind == DK_ICE)
505 #ifndef ENABLE_CHECKING
506 /* When not checking, ICEs are converted to fatal errors when an
507 error has already occurred. This is counteracted by
508 abort_on_error. */
509 if ((diagnostic_kind_count (context, DK_ERROR) > 0
510 || diagnostic_kind_count (context, DK_SORRY) > 0)
511 && !context->abort_on_error)
513 expanded_location s = expand_location (diagnostic->location);
514 fnotice (stderr, "%s:%d: confused by earlier errors, bailing out\n",
515 s.file, s.line);
516 exit (ICE_EXIT_CODE);
518 #endif
519 if (context->internal_error)
520 (*context->internal_error) (context,
521 diagnostic->message.format_spec,
522 diagnostic->message.args_ptr);
524 ++diagnostic_kind_count (context, diagnostic->kind);
526 saved_format_spec = diagnostic->message.format_spec;
527 if (context->show_option_requested)
529 char *option_text;
531 option_text = context->option_name (context, diagnostic->option_index,
532 orig_diag_kind, diagnostic->kind);
534 if (option_text)
536 diagnostic->message.format_spec
537 = ACONCAT ((diagnostic->message.format_spec,
538 " ",
539 "[", option_text, "]",
540 NULL));
541 free (option_text);
544 diagnostic->message.locus = &diagnostic->location;
545 diagnostic->message.x_data = &diagnostic->x_data;
546 diagnostic->x_data = NULL;
547 pp_format (context->printer, &diagnostic->message);
548 (*diagnostic_starter (context)) (context, diagnostic);
549 pp_output_formatted_text (context->printer);
550 (*diagnostic_finalizer (context)) (context, diagnostic);
551 pp_flush (context->printer);
552 diagnostic_action_after_output (context, diagnostic);
553 diagnostic->message.format_spec = saved_format_spec;
554 diagnostic->x_data = NULL;
556 context->lock--;
558 return true;
561 /* Given a partial pathname as input, return another pathname that
562 shares no directory elements with the pathname of __FILE__. This
563 is used by fancy_abort() to print `Internal compiler error in expr.c'
564 instead of `Internal compiler error in ../../GCC/gcc/expr.c'. */
566 const char *
567 trim_filename (const char *name)
569 static const char this_file[] = __FILE__;
570 const char *p = name, *q = this_file;
572 /* First skip any "../" in each filename. This allows us to give a proper
573 reference to a file in a subdirectory. */
574 while (p[0] == '.' && p[1] == '.' && IS_DIR_SEPARATOR (p[2]))
575 p += 3;
577 while (q[0] == '.' && q[1] == '.' && IS_DIR_SEPARATOR (q[2]))
578 q += 3;
580 /* Now skip any parts the two filenames have in common. */
581 while (*p == *q && *p != 0 && *q != 0)
582 p++, q++;
584 /* Now go backwards until the previous directory separator. */
585 while (p > name && !IS_DIR_SEPARATOR (p[-1]))
586 p--;
588 return p;
591 /* Standard error reporting routines in increasing order of severity.
592 All of these take arguments like printf. */
594 /* Text to be emitted verbatim to the error message stream; this
595 produces no prefix and disables line-wrapping. Use rarely. */
596 void
597 verbatim (const char *gmsgid, ...)
599 text_info text;
600 va_list ap;
602 va_start (ap, gmsgid);
603 text.err_no = errno;
604 text.args_ptr = &ap;
605 text.format_spec = _(gmsgid);
606 text.locus = NULL;
607 text.x_data = NULL;
608 pp_format_verbatim (global_dc->printer, &text);
609 pp_flush (global_dc->printer);
610 va_end (ap);
613 bool
614 emit_diagnostic (diagnostic_t kind, location_t location, int opt,
615 const char *gmsgid, ...)
617 diagnostic_info diagnostic;
618 va_list ap;
620 va_start (ap, gmsgid);
621 if (kind == DK_PERMERROR)
623 diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
624 permissive_error_kind (global_dc));
625 diagnostic.option_index = permissive_error_option (global_dc);
627 else {
628 diagnostic_set_info (&diagnostic, gmsgid, &ap, location, kind);
629 if (kind == DK_WARNING || kind == DK_PEDWARN)
630 diagnostic.option_index = opt;
632 va_end (ap);
634 return report_diagnostic (&diagnostic);
637 /* An informative note at LOCATION. Use this for additional details on an error
638 message. */
639 void
640 inform (location_t location, const char *gmsgid, ...)
642 diagnostic_info diagnostic;
643 va_list ap;
645 va_start (ap, gmsgid);
646 diagnostic_set_info (&diagnostic, gmsgid, &ap, location, DK_NOTE);
647 report_diagnostic (&diagnostic);
648 va_end (ap);
651 /* An informative note at LOCATION. Use this for additional details on an
652 error message. */
653 void
654 inform_n (location_t location, int n, const char *singular_gmsgid,
655 const char *plural_gmsgid, ...)
657 diagnostic_info diagnostic;
658 va_list ap;
660 va_start (ap, plural_gmsgid);
661 diagnostic_set_info_translated (&diagnostic,
662 ngettext (singular_gmsgid, plural_gmsgid, n),
663 &ap, location, DK_NOTE);
664 report_diagnostic (&diagnostic);
665 va_end (ap);
668 /* A warning at INPUT_LOCATION. Use this for code which is correct according
669 to the relevant language specification but is likely to be buggy anyway.
670 Returns true if the warning was printed, false if it was inhibited. */
671 bool
672 warning (int opt, const char *gmsgid, ...)
674 diagnostic_info diagnostic;
675 va_list ap;
677 va_start (ap, gmsgid);
678 diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_WARNING);
679 diagnostic.option_index = opt;
681 va_end (ap);
682 return report_diagnostic (&diagnostic);
685 /* A warning at LOCATION. Use this for code which is correct according to the
686 relevant language specification but is likely to be buggy anyway.
687 Returns true if the warning was printed, false if it was inhibited. */
689 bool
690 warning_at (location_t location, int opt, const char *gmsgid, ...)
692 diagnostic_info diagnostic;
693 va_list ap;
695 va_start (ap, gmsgid);
696 diagnostic_set_info (&diagnostic, gmsgid, &ap, location, DK_WARNING);
697 diagnostic.option_index = opt;
698 va_end (ap);
699 return report_diagnostic (&diagnostic);
702 /* A "pedantic" warning at LOCATION: issues a warning unless
703 -pedantic-errors was given on the command line, in which case it
704 issues an error. Use this for diagnostics required by the relevant
705 language standard, if you have chosen not to make them errors.
707 Note that these diagnostics are issued independent of the setting
708 of the -pedantic command-line switch. To get a warning enabled
709 only with that switch, use either "if (pedantic) pedwarn
710 (OPT_pedantic,...)" or just "pedwarn (OPT_pedantic,..)". To get a
711 pedwarn independently of the -pedantic switch use "pedwarn (0,...)".
713 Returns true if the warning was printed, false if it was inhibited. */
715 bool
716 pedwarn (location_t location, int opt, const char *gmsgid, ...)
718 diagnostic_info diagnostic;
719 va_list ap;
721 va_start (ap, gmsgid);
722 diagnostic_set_info (&diagnostic, gmsgid, &ap, location, DK_PEDWARN);
723 diagnostic.option_index = opt;
724 va_end (ap);
725 return report_diagnostic (&diagnostic);
728 /* A "permissive" error at LOCATION: issues an error unless
729 -fpermissive was given on the command line, in which case it issues
730 a warning. Use this for things that really should be errors but we
731 want to support legacy code.
733 Returns true if the warning was printed, false if it was inhibited. */
735 bool
736 permerror (location_t location, const char *gmsgid, ...)
738 diagnostic_info diagnostic;
739 va_list ap;
741 va_start (ap, gmsgid);
742 diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
743 permissive_error_kind (global_dc));
744 diagnostic.option_index = permissive_error_option (global_dc);
745 va_end (ap);
746 return report_diagnostic (&diagnostic);
749 /* A hard error: the code is definitely ill-formed, and an object file
750 will not be produced. */
751 void
752 error (const char *gmsgid, ...)
754 diagnostic_info diagnostic;
755 va_list ap;
757 va_start (ap, gmsgid);
758 diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ERROR);
759 report_diagnostic (&diagnostic);
760 va_end (ap);
763 /* A hard error: the code is definitely ill-formed, and an object file
764 will not be produced. */
765 void
766 error_n (location_t location, int n, const char *singular_gmsgid,
767 const char *plural_gmsgid, ...)
769 diagnostic_info diagnostic;
770 va_list ap;
772 va_start (ap, plural_gmsgid);
773 diagnostic_set_info_translated (&diagnostic,
774 ngettext (singular_gmsgid, plural_gmsgid, n),
775 &ap, location, DK_ERROR);
776 report_diagnostic (&diagnostic);
777 va_end (ap);
780 /* Same as ebove, but use location LOC instead of input_location. */
781 void
782 error_at (location_t loc, const char *gmsgid, ...)
784 diagnostic_info diagnostic;
785 va_list ap;
787 va_start (ap, gmsgid);
788 diagnostic_set_info (&diagnostic, gmsgid, &ap, loc, DK_ERROR);
789 report_diagnostic (&diagnostic);
790 va_end (ap);
793 /* "Sorry, not implemented." Use for a language feature which is
794 required by the relevant specification but not implemented by GCC.
795 An object file will not be produced. */
796 void
797 sorry (const char *gmsgid, ...)
799 diagnostic_info diagnostic;
800 va_list ap;
802 va_start (ap, gmsgid);
803 diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_SORRY);
804 report_diagnostic (&diagnostic);
805 va_end (ap);
808 /* Return true if an error or a "sorry" has been seen. Various
809 processing is disabled after errors. */
810 bool
811 seen_error (void)
813 return errorcount || sorrycount;
816 /* An error which is severe enough that we make no attempt to
817 continue. Do not use this for internal consistency checks; that's
818 internal_error. Use of this function should be rare. */
819 void
820 fatal_error (const char *gmsgid, ...)
822 diagnostic_info diagnostic;
823 va_list ap;
825 va_start (ap, gmsgid);
826 diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_FATAL);
827 report_diagnostic (&diagnostic);
828 va_end (ap);
830 gcc_unreachable ();
833 /* An internal consistency check has failed. We make no attempt to
834 continue. Note that unless there is debugging value to be had from
835 a more specific message, or some other good reason, you should use
836 abort () instead of calling this function directly. */
837 void
838 internal_error (const char *gmsgid, ...)
840 diagnostic_info diagnostic;
841 va_list ap;
843 va_start (ap, gmsgid);
844 diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ICE);
845 report_diagnostic (&diagnostic);
846 va_end (ap);
848 gcc_unreachable ();
851 /* Special case error functions. Most are implemented in terms of the
852 above, or should be. */
854 /* Print a diagnostic MSGID on FILE. This is just fprintf, except it
855 runs its second argument through gettext. */
856 void
857 fnotice (FILE *file, const char *cmsgid, ...)
859 va_list ap;
861 va_start (ap, cmsgid);
862 vfprintf (file, _(cmsgid), ap);
863 va_end (ap);
866 /* Inform the user that an error occurred while trying to report some
867 other error. This indicates catastrophic internal inconsistencies,
868 so give up now. But do try to flush out the previous error.
869 This mustn't use internal_error, that will cause infinite recursion. */
871 static void
872 error_recursion (diagnostic_context *context)
874 diagnostic_info diagnostic;
876 if (context->lock < 3)
877 pp_flush (context->printer);
879 fnotice (stderr,
880 "Internal compiler error: Error reporting routines re-entered.\n");
882 /* Call diagnostic_action_after_output to get the "please submit a bug
883 report" message. It only looks at the kind field of diagnostic_info. */
884 diagnostic.kind = DK_ICE;
885 diagnostic_action_after_output (context, &diagnostic);
887 /* Do not use gcc_unreachable here; that goes through internal_error
888 and therefore would cause infinite recursion. */
889 real_abort ();
892 /* Report an internal compiler error in a friendly manner. This is
893 the function that gets called upon use of abort() in the source
894 code generally, thanks to a special macro. */
896 void
897 fancy_abort (const char *file, int line, const char *function)
899 internal_error ("in %s, at %s:%d", function, trim_filename (file), line);
902 /* Really call the system 'abort'. This has to go right at the end of
903 this file, so that there are no functions after it that call abort
904 and get the system abort instead of our macro. */
905 #undef abort
906 static void
907 real_abort (void)
909 abort ();