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
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"),
138 /* At least one -Werror= was given. */
140 pp_verbatim (context
->printer
,
141 _("%s: some warnings being treated as errors"),
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
, 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
)
271 linemap_resolve_location (line_table
, where
,
272 LRK_MACRO_DEFINITION_LOCATION
,
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",
285 LAST_SOURCE_LINE (map
), LAST_SOURCE_COLUMN (map
));
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
,
295 LINEMAP_FILE (map
), LAST_SOURCE_LINE (map
));
297 pp_verbatim (context
->printer
, ":");
298 pp_newline (context
->printer
);
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
,
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
323 diagnostic_classify_diagnostic (diagnostic_context
*context
,
325 diagnostic_t new_kind
,
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*
339 if (where
!= UNKNOWN_LOCATION
)
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
;
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
++;
360 context
->classify_diagnostic
[option_index
] = new_kind
;
365 /* Save all diagnostic classifications in a stack. */
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. */
376 diagnostic_pop_diagnostics (diagnostic_context
*context
, location_t where
)
382 jump_to
= context
->push_list
[-- context
->n_push
];
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. */
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
))
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
)
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
);
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
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
454 if (! context
->option_enabled (diagnostic
->option_index
,
455 context
->option_state
))
458 /* This tests for #pragma diagnostic changes. */
459 if (context
->n_classification_history
> 0)
462 /* FIXME: Stupid search. Optimize later. */
463 for (i
= context
->n_classification_history
- 1; i
>= 0; i
--)
465 if (linemap_location_before_p
467 context
->classification_history
[i
].location
,
470 if (context
->classification_history
[i
].kind
== (int) DK_POP
)
472 i
= context
->classification_history
[i
].option
;
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
;
485 /* This tests if the user provided the appropriate -Werror=foo
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
)
498 if (orig_diag_kind
== DK_WARNING
&& diagnostic
->kind
== DK_ERROR
)
499 context
->some_warnings_are_errors
= true;
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
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",
516 exit (ICE_EXIT_CODE
);
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
)
531 option_text
= context
->option_name (context
, diagnostic
->option_index
,
532 orig_diag_kind
, diagnostic
->kind
);
536 diagnostic
->message
.format_spec
537 = ACONCAT ((diagnostic
->message
.format_spec
,
539 "[", 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
;
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'. */
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]))
577 while (q
[0] == '.' && q
[1] == '.' && IS_DIR_SEPARATOR (q
[2]))
580 /* Now skip any parts the two filenames have in common. */
581 while (*p
== *q
&& *p
!= 0 && *q
!= 0)
584 /* Now go backwards until the previous directory separator. */
585 while (p
> name
&& !IS_DIR_SEPARATOR (p
[-1]))
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. */
597 verbatim (const char *gmsgid
, ...)
602 va_start (ap
, gmsgid
);
605 text
.format_spec
= _(gmsgid
);
608 pp_format_verbatim (global_dc
->printer
, &text
);
609 pp_flush (global_dc
->printer
);
614 emit_diagnostic (diagnostic_t kind
, location_t location
, int opt
,
615 const char *gmsgid
, ...)
617 diagnostic_info diagnostic
;
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
);
628 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
, kind
);
629 if (kind
== DK_WARNING
|| kind
== DK_PEDWARN
)
630 diagnostic
.option_index
= opt
;
634 return report_diagnostic (&diagnostic
);
637 /* An informative note at LOCATION. Use this for additional details on an error
640 inform (location_t location
, const char *gmsgid
, ...)
642 diagnostic_info diagnostic
;
645 va_start (ap
, gmsgid
);
646 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
, DK_NOTE
);
647 report_diagnostic (&diagnostic
);
651 /* An informative note at LOCATION. Use this for additional details on an
654 inform_n (location_t location
, int n
, const char *singular_gmsgid
,
655 const char *plural_gmsgid
, ...)
657 diagnostic_info diagnostic
;
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
);
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. */
672 warning (int opt
, const char *gmsgid
, ...)
674 diagnostic_info diagnostic
;
677 va_start (ap
, gmsgid
);
678 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_WARNING
);
679 diagnostic
.option_index
= opt
;
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. */
690 warning_at (location_t location
, int opt
, const char *gmsgid
, ...)
692 diagnostic_info diagnostic
;
695 va_start (ap
, gmsgid
);
696 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
, DK_WARNING
);
697 diagnostic
.option_index
= opt
;
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. */
716 pedwarn (location_t location
, int opt
, const char *gmsgid
, ...)
718 diagnostic_info diagnostic
;
721 va_start (ap
, gmsgid
);
722 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
, DK_PEDWARN
);
723 diagnostic
.option_index
= opt
;
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. */
736 permerror (location_t location
, const char *gmsgid
, ...)
738 diagnostic_info diagnostic
;
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
);
746 return report_diagnostic (&diagnostic
);
749 /* A hard error: the code is definitely ill-formed, and an object file
750 will not be produced. */
752 error (const char *gmsgid
, ...)
754 diagnostic_info diagnostic
;
757 va_start (ap
, gmsgid
);
758 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_ERROR
);
759 report_diagnostic (&diagnostic
);
763 /* A hard error: the code is definitely ill-formed, and an object file
764 will not be produced. */
766 error_n (location_t location
, int n
, const char *singular_gmsgid
,
767 const char *plural_gmsgid
, ...)
769 diagnostic_info diagnostic
;
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
);
780 /* Same as ebove, but use location LOC instead of input_location. */
782 error_at (location_t loc
, const char *gmsgid
, ...)
784 diagnostic_info diagnostic
;
787 va_start (ap
, gmsgid
);
788 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, loc
, DK_ERROR
);
789 report_diagnostic (&diagnostic
);
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. */
797 sorry (const char *gmsgid
, ...)
799 diagnostic_info diagnostic
;
802 va_start (ap
, gmsgid
);
803 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_SORRY
);
804 report_diagnostic (&diagnostic
);
808 /* Return true if an error or a "sorry" has been seen. Various
809 processing is disabled after errors. */
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. */
820 fatal_error (const char *gmsgid
, ...)
822 diagnostic_info diagnostic
;
825 va_start (ap
, gmsgid
);
826 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_FATAL
);
827 report_diagnostic (&diagnostic
);
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. */
838 internal_error (const char *gmsgid
, ...)
840 diagnostic_info diagnostic
;
843 va_start (ap
, gmsgid
);
844 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_ICE
);
845 report_diagnostic (&diagnostic
);
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. */
857 fnotice (FILE *file
, const char *cmsgid
, ...)
861 va_start (ap
, cmsgid
);
862 vfprintf (file
, _(cmsgid
), 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. */
872 error_recursion (diagnostic_context
*context
)
874 diagnostic_info diagnostic
;
876 if (context
->lock
< 3)
877 pp_flush (context
->printer
);
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. */
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. */
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. */