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 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
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
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
28 #include "coretypes.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)
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
*,
46 static void real_abort (void) ATTRIBUTE_NORETURN
;
48 /* Name of program invoked, sans directories. */
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. */
60 build_message_string (const char *msg
, ...)
66 vasprintf (&str
, msg
, ap
);
72 /* Same as diagnostic_build_prefix, but only the source FILE is given. */
74 file_name_as_prefix (const char *f
)
76 return build_message_string ("%s: ", f
);
81 /* Initialize the diagnostic message outputting machinery. */
83 diagnostic_initialize (diagnostic_context
*context
, int n_opts
)
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
;
122 context
->inhibit_notes_p
= false;
125 /* Do any cleaning up required after the last diagnostic is emitted. */
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\n"),
138 /* At least one -Werror= was given. */
140 pp_verbatim (context
->printer
,
141 _("%s: some warnings being treated as errors\n"),
143 pp_flush (context
->printer
);
147 /* Initialize DIAGNOSTIC, where the message MSG has already been
150 diagnostic_set_info_translated (diagnostic_info
*diagnostic
, const char *msg
,
151 va_list *args
, location_t location
,
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
166 diagnostic_set_info (diagnostic_info
*diagnostic
, const char *gmsgid
,
167 va_list *args
, location_t location
,
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. */
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
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
);
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. */
202 diagnostic_action_after_output (diagnostic_context
*context
,
203 diagnostic_info
*diagnostic
)
205 switch (diagnostic
->kind
)
215 if (context
->abort_on_error
)
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
))
229 "compilation terminated due to -fmax-errors=%u.\n",
230 context
->max_errors
);
231 diagnostic_finish (context
);
232 exit (FATAL_EXIT_CODE
);
237 if (context
->abort_on_error
)
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
);
246 if (context
->abort_on_error
)
248 diagnostic_finish (context
);
249 fnotice (stderr
, "compilation terminated.\n");
250 exit (FATAL_EXIT_CODE
);
258 diagnostic_report_current_module (diagnostic_context
*context
)
260 const struct line_map
*map
;
262 if (pp_needs_newline (context
->printer
))
264 pp_newline (context
->printer
);
265 pp_needs_newline (context
->printer
) = false;
268 if (input_location
<= BUILTINS_LOCATION
)
271 map
= linemap_lookup (line_table
, input_location
);
272 if (map
&& diagnostic_last_module_changed (context
, map
))
274 diagnostic_set_last_module (context
, map
);
275 if (! MAIN_FILE_P (map
))
277 map
= INCLUDED_FROM (line_table
, map
);
278 if (context
->show_column
)
279 pp_verbatim (context
->printer
,
280 "In file included from %s:%d:%d",
282 LAST_SOURCE_LINE (map
), LAST_SOURCE_COLUMN (map
));
284 pp_verbatim (context
->printer
,
285 "In file included from %s:%d",
286 map
->to_file
, LAST_SOURCE_LINE (map
));
287 while (! MAIN_FILE_P (map
))
289 map
= INCLUDED_FROM (line_table
, map
);
290 pp_verbatim (context
->printer
,
292 map
->to_file
, LAST_SOURCE_LINE (map
));
294 pp_verbatim (context
->printer
, ":");
295 pp_newline (context
->printer
);
301 default_diagnostic_starter (diagnostic_context
*context
,
302 diagnostic_info
*diagnostic
)
304 diagnostic_report_current_module (context
);
305 pp_set_prefix (context
->printer
, diagnostic_build_prefix (context
,
310 default_diagnostic_finalizer (diagnostic_context
*context
,
311 diagnostic_info
*diagnostic ATTRIBUTE_UNUSED
)
313 pp_destroy_prefix (context
->printer
);
316 /* Interface to specify diagnostic kind overrides. Returns the
317 previous setting, or DK_UNSPECIFIED if the parameters are out of
320 diagnostic_classify_diagnostic (diagnostic_context
*context
,
322 diagnostic_t new_kind
,
325 diagnostic_t old_kind
;
327 if (option_index
<= 0
328 || option_index
>= context
->n_opts
329 || new_kind
>= DK_LAST_DIAGNOSTIC_KIND
)
330 return DK_UNSPECIFIED
;
332 old_kind
= context
->classify_diagnostic
[option_index
];
334 /* Handle pragmas separately, since we need to keep track of *where*
336 if (where
!= UNKNOWN_LOCATION
)
340 for (i
= context
->n_classification_history
- 1; i
>= 0; i
--)
341 if (context
->classification_history
[i
].option
== option_index
)
343 old_kind
= context
->classification_history
[i
].kind
;
347 i
= context
->n_classification_history
;
348 context
->classification_history
=
349 (diagnostic_classification_change_t
*) xrealloc (context
->classification_history
, (i
+ 1)
350 * sizeof (diagnostic_classification_change_t
));
351 context
->classification_history
[i
].location
= where
;
352 context
->classification_history
[i
].option
= option_index
;
353 context
->classification_history
[i
].kind
= new_kind
;
354 context
->n_classification_history
++;
357 context
->classify_diagnostic
[option_index
] = new_kind
;
362 /* Save all diagnostic classifications in a stack. */
364 diagnostic_push_diagnostics (diagnostic_context
*context
, location_t where ATTRIBUTE_UNUSED
)
366 context
->push_list
= (int *) xrealloc (context
->push_list
, (context
->n_push
+ 1) * sizeof (int));
367 context
->push_list
[context
->n_push
++] = context
->n_classification_history
;
370 /* Restore the topmost classification set off the stack. If the stack
371 is empty, revert to the state based on command line parameters. */
373 diagnostic_pop_diagnostics (diagnostic_context
*context
, location_t where
)
379 jump_to
= context
->push_list
[-- context
->n_push
];
383 i
= context
->n_classification_history
;
384 context
->classification_history
=
385 (diagnostic_classification_change_t
*) xrealloc (context
->classification_history
, (i
+ 1)
386 * sizeof (diagnostic_classification_change_t
));
387 context
->classification_history
[i
].location
= where
;
388 context
->classification_history
[i
].option
= jump_to
;
389 context
->classification_history
[i
].kind
= DK_POP
;
390 context
->n_classification_history
++;
393 /* Report a diagnostic message (an error or a warning) as specified by
394 DC. This function is *the* subroutine in terms of which front-ends
395 should implement their specific diagnostic handling modules. The
396 front-end independent format specifiers are exactly those described
397 in the documentation of output_format.
398 Return true if a diagnostic was printed, false otherwise. */
401 diagnostic_report_diagnostic (diagnostic_context
*context
,
402 diagnostic_info
*diagnostic
)
404 location_t location
= diagnostic
->location
;
405 diagnostic_t orig_diag_kind
= diagnostic
->kind
;
406 const char *saved_format_spec
;
408 /* Give preference to being able to inhibit warnings, before they
409 get reclassified to something else. */
410 if ((diagnostic
->kind
== DK_WARNING
|| diagnostic
->kind
== DK_PEDWARN
)
411 && !diagnostic_report_warnings_p (context
, location
))
414 if (diagnostic
->kind
== DK_PEDWARN
)
416 diagnostic
->kind
= pedantic_warning_kind (context
);
417 /* We do this to avoid giving the message for -pedantic-errors. */
418 orig_diag_kind
= diagnostic
->kind
;
421 if (diagnostic
->kind
== DK_NOTE
&& context
->inhibit_notes_p
)
424 if (context
->lock
> 0)
426 /* If we're reporting an ICE in the middle of some other error,
427 try to flush out the previous error, then let this one
428 through. Don't do this more than once. */
429 if (diagnostic
->kind
== DK_ICE
&& context
->lock
== 1)
430 pp_flush (context
->printer
);
432 error_recursion (context
);
435 /* If the user requested that warnings be treated as errors, so be
436 it. Note that we do this before the next block so that
437 individual warnings can be overridden back to warnings with
439 if (context
->warning_as_error_requested
440 && diagnostic
->kind
== DK_WARNING
)
442 diagnostic
->kind
= DK_ERROR
;
445 if (diagnostic
->option_index
)
447 diagnostic_t diag_class
= DK_UNSPECIFIED
;
449 /* This tests if the user provided the appropriate -Wfoo or
451 if (! context
->option_enabled (diagnostic
->option_index
,
452 context
->option_state
))
455 /* This tests for #pragma diagnostic changes. */
456 if (context
->n_classification_history
> 0)
459 /* FIXME: Stupid search. Optimize later. */
460 for (i
= context
->n_classification_history
- 1; i
>= 0; i
--)
462 if (context
->classification_history
[i
].location
<= location
)
464 if (context
->classification_history
[i
].kind
== (int) DK_POP
)
466 i
= context
->classification_history
[i
].option
;
469 if (context
->classification_history
[i
].option
== diagnostic
->option_index
)
471 diag_class
= context
->classification_history
[i
].kind
;
472 if (diag_class
!= DK_UNSPECIFIED
)
473 diagnostic
->kind
= diag_class
;
479 /* This tests if the user provided the appropriate -Werror=foo
481 if (diag_class
== DK_UNSPECIFIED
482 && context
->classify_diagnostic
[diagnostic
->option_index
] != DK_UNSPECIFIED
)
484 diagnostic
->kind
= context
->classify_diagnostic
[diagnostic
->option_index
];
486 /* This allows for future extensions, like temporarily disabling
487 warnings for ranges of source code. */
488 if (diagnostic
->kind
== DK_IGNORED
)
492 if (orig_diag_kind
== DK_WARNING
&& diagnostic
->kind
== DK_ERROR
)
493 context
->some_warnings_are_errors
= true;
497 if (diagnostic
->kind
== DK_ICE
)
499 #ifndef ENABLE_CHECKING
500 /* When not checking, ICEs are converted to fatal errors when an
501 error has already occurred. This is counteracted by
503 if ((diagnostic_kind_count (context
, DK_ERROR
) > 0
504 || diagnostic_kind_count (context
, DK_SORRY
) > 0)
505 && !context
->abort_on_error
)
507 expanded_location s
= expand_location (diagnostic
->location
);
508 fnotice (stderr
, "%s:%d: confused by earlier errors, bailing out\n",
510 exit (ICE_EXIT_CODE
);
513 if (context
->internal_error
)
514 (*context
->internal_error
) (context
,
515 diagnostic
->message
.format_spec
,
516 diagnostic
->message
.args_ptr
);
518 ++diagnostic_kind_count (context
, diagnostic
->kind
);
520 saved_format_spec
= diagnostic
->message
.format_spec
;
521 if (context
->show_option_requested
)
525 option_text
= context
->option_name (context
, diagnostic
->option_index
,
526 orig_diag_kind
, diagnostic
->kind
);
530 diagnostic
->message
.format_spec
531 = ACONCAT ((diagnostic
->message
.format_spec
,
533 "[", option_text
, "]",
538 diagnostic
->message
.locus
= &diagnostic
->location
;
539 diagnostic
->message
.x_data
= &diagnostic
->x_data
;
540 diagnostic
->x_data
= NULL
;
541 pp_format (context
->printer
, &diagnostic
->message
);
542 (*diagnostic_starter (context
)) (context
, diagnostic
);
543 pp_output_formatted_text (context
->printer
);
544 (*diagnostic_finalizer (context
)) (context
, diagnostic
);
545 pp_flush (context
->printer
);
546 diagnostic_action_after_output (context
, diagnostic
);
547 diagnostic
->message
.format_spec
= saved_format_spec
;
548 diagnostic
->x_data
= NULL
;
555 /* Given a partial pathname as input, return another pathname that
556 shares no directory elements with the pathname of __FILE__. This
557 is used by fancy_abort() to print `Internal compiler error in expr.c'
558 instead of `Internal compiler error in ../../GCC/gcc/expr.c'. */
561 trim_filename (const char *name
)
563 static const char this_file
[] = __FILE__
;
564 const char *p
= name
, *q
= this_file
;
566 /* First skip any "../" in each filename. This allows us to give a proper
567 reference to a file in a subdirectory. */
568 while (p
[0] == '.' && p
[1] == '.' && IS_DIR_SEPARATOR (p
[2]))
571 while (q
[0] == '.' && q
[1] == '.' && IS_DIR_SEPARATOR (q
[2]))
574 /* Now skip any parts the two filenames have in common. */
575 while (*p
== *q
&& *p
!= 0 && *q
!= 0)
578 /* Now go backwards until the previous directory separator. */
579 while (p
> name
&& !IS_DIR_SEPARATOR (p
[-1]))
585 /* Standard error reporting routines in increasing order of severity.
586 All of these take arguments like printf. */
588 /* Text to be emitted verbatim to the error message stream; this
589 produces no prefix and disables line-wrapping. Use rarely. */
591 verbatim (const char *gmsgid
, ...)
596 va_start (ap
, gmsgid
);
599 text
.format_spec
= _(gmsgid
);
602 pp_format_verbatim (global_dc
->printer
, &text
);
603 pp_flush (global_dc
->printer
);
608 emit_diagnostic (diagnostic_t kind
, location_t location
, int opt
,
609 const char *gmsgid
, ...)
611 diagnostic_info diagnostic
;
614 va_start (ap
, gmsgid
);
615 if (kind
== DK_PERMERROR
)
617 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
,
618 permissive_error_kind (global_dc
));
619 diagnostic
.option_index
= permissive_error_option (global_dc
);
622 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
, kind
);
623 if (kind
== DK_WARNING
|| kind
== DK_PEDWARN
)
624 diagnostic
.option_index
= opt
;
628 return report_diagnostic (&diagnostic
);
631 /* An informative note at LOCATION. Use this for additional details on an error
634 inform (location_t location
, const char *gmsgid
, ...)
636 diagnostic_info diagnostic
;
639 va_start (ap
, gmsgid
);
640 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
, DK_NOTE
);
641 report_diagnostic (&diagnostic
);
645 /* An informative note at LOCATION. Use this for additional details on an
648 inform_n (location_t location
, int n
, const char *singular_gmsgid
,
649 const char *plural_gmsgid
, ...)
651 diagnostic_info diagnostic
;
654 va_start (ap
, plural_gmsgid
);
655 diagnostic_set_info_translated (&diagnostic
,
656 ngettext (singular_gmsgid
, plural_gmsgid
, n
),
657 &ap
, location
, DK_NOTE
);
658 report_diagnostic (&diagnostic
);
662 /* A warning at INPUT_LOCATION. Use this for code which is correct according
663 to the relevant language specification but is likely to be buggy anyway.
664 Returns true if the warning was printed, false if it was inhibited. */
666 warning (int opt
, const char *gmsgid
, ...)
668 diagnostic_info diagnostic
;
671 va_start (ap
, gmsgid
);
672 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_WARNING
);
673 diagnostic
.option_index
= opt
;
676 return report_diagnostic (&diagnostic
);
679 /* A warning at LOCATION. Use this for code which is correct according to the
680 relevant language specification but is likely to be buggy anyway.
681 Returns true if the warning was printed, false if it was inhibited. */
684 warning_at (location_t location
, int opt
, const char *gmsgid
, ...)
686 diagnostic_info diagnostic
;
689 va_start (ap
, gmsgid
);
690 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
, DK_WARNING
);
691 diagnostic
.option_index
= opt
;
693 return report_diagnostic (&diagnostic
);
696 /* A "pedantic" warning at LOCATION: issues a warning unless
697 -pedantic-errors was given on the command line, in which case it
698 issues an error. Use this for diagnostics required by the relevant
699 language standard, if you have chosen not to make them errors.
701 Note that these diagnostics are issued independent of the setting
702 of the -pedantic command-line switch. To get a warning enabled
703 only with that switch, use either "if (pedantic) pedwarn
704 (OPT_pedantic,...)" or just "pedwarn (OPT_pedantic,..)". To get a
705 pedwarn independently of the -pedantic switch use "pedwarn (0,...)".
707 Returns true if the warning was printed, false if it was inhibited. */
710 pedwarn (location_t location
, int opt
, const char *gmsgid
, ...)
712 diagnostic_info diagnostic
;
715 va_start (ap
, gmsgid
);
716 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
, DK_PEDWARN
);
717 diagnostic
.option_index
= opt
;
719 return report_diagnostic (&diagnostic
);
722 /* A "permissive" error at LOCATION: issues an error unless
723 -fpermissive was given on the command line, in which case it issues
724 a warning. Use this for things that really should be errors but we
725 want to support legacy code.
727 Returns true if the warning was printed, false if it was inhibited. */
730 permerror (location_t location
, const char *gmsgid
, ...)
732 diagnostic_info diagnostic
;
735 va_start (ap
, gmsgid
);
736 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
,
737 permissive_error_kind (global_dc
));
738 diagnostic
.option_index
= permissive_error_option (global_dc
);
740 return report_diagnostic (&diagnostic
);
743 /* A hard error: the code is definitely ill-formed, and an object file
744 will not be produced. */
746 error (const char *gmsgid
, ...)
748 diagnostic_info diagnostic
;
751 va_start (ap
, gmsgid
);
752 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_ERROR
);
753 report_diagnostic (&diagnostic
);
757 /* A hard error: the code is definitely ill-formed, and an object file
758 will not be produced. */
760 error_n (location_t location
, int n
, const char *singular_gmsgid
,
761 const char *plural_gmsgid
, ...)
763 diagnostic_info diagnostic
;
766 va_start (ap
, plural_gmsgid
);
767 diagnostic_set_info_translated (&diagnostic
,
768 ngettext (singular_gmsgid
, plural_gmsgid
, n
),
769 &ap
, location
, DK_ERROR
);
770 report_diagnostic (&diagnostic
);
774 /* Same as ebove, but use location LOC instead of input_location. */
776 error_at (location_t loc
, const char *gmsgid
, ...)
778 diagnostic_info diagnostic
;
781 va_start (ap
, gmsgid
);
782 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, loc
, DK_ERROR
);
783 report_diagnostic (&diagnostic
);
787 /* "Sorry, not implemented." Use for a language feature which is
788 required by the relevant specification but not implemented by GCC.
789 An object file will not be produced. */
791 sorry (const char *gmsgid
, ...)
793 diagnostic_info diagnostic
;
796 va_start (ap
, gmsgid
);
797 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_SORRY
);
798 report_diagnostic (&diagnostic
);
802 /* Return true if an error or a "sorry" has been seen. Various
803 processing is disabled after errors. */
807 return errorcount
|| sorrycount
;
810 /* An error which is severe enough that we make no attempt to
811 continue. Do not use this for internal consistency checks; that's
812 internal_error. Use of this function should be rare. */
814 fatal_error (const char *gmsgid
, ...)
816 diagnostic_info diagnostic
;
819 va_start (ap
, gmsgid
);
820 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_FATAL
);
821 report_diagnostic (&diagnostic
);
827 /* An internal consistency check has failed. We make no attempt to
828 continue. Note that unless there is debugging value to be had from
829 a more specific message, or some other good reason, you should use
830 abort () instead of calling this function directly. */
832 internal_error (const char *gmsgid
, ...)
834 diagnostic_info diagnostic
;
837 va_start (ap
, gmsgid
);
838 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_ICE
);
839 report_diagnostic (&diagnostic
);
845 /* Special case error functions. Most are implemented in terms of the
846 above, or should be. */
848 /* Print a diagnostic MSGID on FILE. This is just fprintf, except it
849 runs its second argument through gettext. */
851 fnotice (FILE *file
, const char *cmsgid
, ...)
855 va_start (ap
, cmsgid
);
856 vfprintf (file
, _(cmsgid
), ap
);
860 /* Inform the user that an error occurred while trying to report some
861 other error. This indicates catastrophic internal inconsistencies,
862 so give up now. But do try to flush out the previous error.
863 This mustn't use internal_error, that will cause infinite recursion. */
866 error_recursion (diagnostic_context
*context
)
868 diagnostic_info diagnostic
;
870 if (context
->lock
< 3)
871 pp_flush (context
->printer
);
874 "Internal compiler error: Error reporting routines re-entered.\n");
876 /* Call diagnostic_action_after_output to get the "please submit a bug
877 report" message. It only looks at the kind field of diagnostic_info. */
878 diagnostic
.kind
= DK_ICE
;
879 diagnostic_action_after_output (context
, &diagnostic
);
881 /* Do not use gcc_unreachable here; that goes through internal_error
882 and therefore would cause infinite recursion. */
886 /* Report an internal compiler error in a friendly manner. This is
887 the function that gets called upon use of abort() in the source
888 code generally, thanks to a special macro. */
891 fancy_abort (const char *file
, int line
, const char *function
)
893 internal_error ("in %s, at %s:%d", function
, trim_filename (file
), line
);
896 /* Really call the system 'abort'. This has to go right at the end of
897 this file, so that there are no functions after it that call abort
898 and get the system abort instead of our macro. */