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
->internal_error
= NULL
;
113 diagnostic_starter (context
) = default_diagnostic_starter
;
114 diagnostic_finalizer (context
) = default_diagnostic_finalizer
;
115 context
->option_enabled
= NULL
;
116 context
->option_state
= NULL
;
117 context
->option_name
= NULL
;
118 context
->last_module
= 0;
119 context
->x_data
= NULL
;
121 context
->inhibit_notes_p
= false;
124 /* Do any cleaning up required after the last diagnostic is emitted. */
127 diagnostic_finish (diagnostic_context
*context
)
129 /* Some of the errors may actually have been warnings. */
130 if (context
->some_warnings_are_errors
)
132 /* -Werror was given. */
133 if (context
->warning_as_error_requested
)
134 pp_verbatim (context
->printer
,
135 _("%s: all warnings being treated as errors\n"),
137 /* At least one -Werror= was given. */
139 pp_verbatim (context
->printer
,
140 _("%s: some warnings being treated as errors\n"),
142 pp_flush (context
->printer
);
146 /* Initialize DIAGNOSTIC, where the message MSG has already been
149 diagnostic_set_info_translated (diagnostic_info
*diagnostic
, const char *msg
,
150 va_list *args
, location_t location
,
153 diagnostic
->message
.err_no
= errno
;
154 diagnostic
->message
.args_ptr
= args
;
155 diagnostic
->message
.format_spec
= msg
;
156 diagnostic
->location
= location
;
157 diagnostic
->override_column
= 0;
158 diagnostic
->kind
= kind
;
159 diagnostic
->option_index
= 0;
162 /* Initialize DIAGNOSTIC, where the message GMSGID has not yet been
165 diagnostic_set_info (diagnostic_info
*diagnostic
, const char *gmsgid
,
166 va_list *args
, location_t location
,
169 diagnostic_set_info_translated (diagnostic
, _(gmsgid
), args
, location
, kind
);
172 /* Return a malloc'd string describing a location. The caller is
173 responsible for freeing the memory. */
175 diagnostic_build_prefix (diagnostic_context
*context
,
176 diagnostic_info
*diagnostic
)
178 static const char *const diagnostic_kind_text
[] = {
179 #define DEFINE_DIAGNOSTIC_KIND(K, T) (T),
180 #include "diagnostic.def"
181 #undef DEFINE_DIAGNOSTIC_KIND
184 const char *text
= _(diagnostic_kind_text
[diagnostic
->kind
]);
185 expanded_location s
= expand_location (diagnostic
->location
);
186 if (diagnostic
->override_column
)
187 s
.column
= diagnostic
->override_column
;
188 gcc_assert (diagnostic
->kind
< DK_LAST_DIAGNOSTIC_KIND
);
192 ? build_message_string ("%s: %s", progname
, text
)
193 : context
->show_column
194 ? build_message_string ("%s:%d:%d: %s", s
.file
, s
.line
, s
.column
, text
)
195 : build_message_string ("%s:%d: %s", s
.file
, s
.line
, text
));
198 /* Take any action which is expected to happen after the diagnostic
199 is written out. This function does not always return. */
201 diagnostic_action_after_output (diagnostic_context
*context
,
202 diagnostic_info
*diagnostic
)
204 switch (diagnostic
->kind
)
214 if (context
->abort_on_error
)
216 if (context
->fatal_errors
)
218 fnotice (stderr
, "compilation terminated due to -Wfatal-errors.\n");
219 diagnostic_finish (context
);
220 exit (FATAL_EXIT_CODE
);
225 if (context
->abort_on_error
)
228 fnotice (stderr
, "Please submit a full bug report,\n"
229 "with preprocessed source if appropriate.\n"
230 "See %s for instructions.\n", bug_report_url
);
231 exit (ICE_EXIT_CODE
);
234 if (context
->abort_on_error
)
236 diagnostic_finish (context
);
237 fnotice (stderr
, "compilation terminated.\n");
238 exit (FATAL_EXIT_CODE
);
246 diagnostic_report_current_module (diagnostic_context
*context
)
248 const struct line_map
*map
;
250 if (pp_needs_newline (context
->printer
))
252 pp_newline (context
->printer
);
253 pp_needs_newline (context
->printer
) = false;
256 if (input_location
<= BUILTINS_LOCATION
)
259 map
= linemap_lookup (line_table
, input_location
);
260 if (map
&& diagnostic_last_module_changed (context
, map
))
262 diagnostic_set_last_module (context
, map
);
263 if (! MAIN_FILE_P (map
))
265 map
= INCLUDED_FROM (line_table
, map
);
266 if (context
->show_column
)
267 pp_verbatim (context
->printer
,
268 "In file included from %s:%d:%d",
270 LAST_SOURCE_LINE (map
), LAST_SOURCE_COLUMN (map
));
272 pp_verbatim (context
->printer
,
273 "In file included from %s:%d",
274 map
->to_file
, LAST_SOURCE_LINE (map
));
275 while (! MAIN_FILE_P (map
))
277 map
= INCLUDED_FROM (line_table
, map
);
278 pp_verbatim (context
->printer
,
280 map
->to_file
, LAST_SOURCE_LINE (map
));
282 pp_verbatim (context
->printer
, ":");
283 pp_newline (context
->printer
);
289 default_diagnostic_starter (diagnostic_context
*context
,
290 diagnostic_info
*diagnostic
)
292 diagnostic_report_current_module (context
);
293 pp_set_prefix (context
->printer
, diagnostic_build_prefix (context
,
298 default_diagnostic_finalizer (diagnostic_context
*context
,
299 diagnostic_info
*diagnostic ATTRIBUTE_UNUSED
)
301 pp_destroy_prefix (context
->printer
);
304 /* Interface to specify diagnostic kind overrides. Returns the
305 previous setting, or DK_UNSPECIFIED if the parameters are out of
308 diagnostic_classify_diagnostic (diagnostic_context
*context
,
310 diagnostic_t new_kind
,
313 diagnostic_t old_kind
;
315 if (option_index
<= 0
316 || option_index
>= context
->n_opts
317 || new_kind
>= DK_LAST_DIAGNOSTIC_KIND
)
318 return DK_UNSPECIFIED
;
320 old_kind
= context
->classify_diagnostic
[option_index
];
322 /* Handle pragmas separately, since we need to keep track of *where*
324 if (where
!= UNKNOWN_LOCATION
)
328 for (i
= context
->n_classification_history
- 1; i
>= 0; i
--)
329 if (context
->classification_history
[i
].option
== option_index
)
331 old_kind
= context
->classification_history
[i
].kind
;
335 i
= context
->n_classification_history
;
336 context
->classification_history
=
337 (diagnostic_classification_change_t
*) xrealloc (context
->classification_history
, (i
+ 1)
338 * sizeof (diagnostic_classification_change_t
));
339 context
->classification_history
[i
].location
= where
;
340 context
->classification_history
[i
].option
= option_index
;
341 context
->classification_history
[i
].kind
= new_kind
;
342 context
->n_classification_history
++;
345 context
->classify_diagnostic
[option_index
] = new_kind
;
350 /* Save all diagnostic classifications in a stack. */
352 diagnostic_push_diagnostics (diagnostic_context
*context
, location_t where ATTRIBUTE_UNUSED
)
354 context
->push_list
= (int *) xrealloc (context
->push_list
, (context
->n_push
+ 1) * sizeof (int));
355 context
->push_list
[context
->n_push
++] = context
->n_classification_history
;
358 /* Restore the topmost classification set off the stack. If the stack
359 is empty, revert to the state based on command line parameters. */
361 diagnostic_pop_diagnostics (diagnostic_context
*context
, location_t where
)
367 jump_to
= context
->push_list
[-- context
->n_push
];
371 i
= context
->n_classification_history
;
372 context
->classification_history
=
373 (diagnostic_classification_change_t
*) xrealloc (context
->classification_history
, (i
+ 1)
374 * sizeof (diagnostic_classification_change_t
));
375 context
->classification_history
[i
].location
= where
;
376 context
->classification_history
[i
].option
= jump_to
;
377 context
->classification_history
[i
].kind
= DK_POP
;
378 context
->n_classification_history
++;
381 /* Report a diagnostic message (an error or a warning) as specified by
382 DC. This function is *the* subroutine in terms of which front-ends
383 should implement their specific diagnostic handling modules. The
384 front-end independent format specifiers are exactly those described
385 in the documentation of output_format.
386 Return true if a diagnostic was printed, false otherwise. */
389 diagnostic_report_diagnostic (diagnostic_context
*context
,
390 diagnostic_info
*diagnostic
)
392 location_t location
= diagnostic
->location
;
393 diagnostic_t orig_diag_kind
= diagnostic
->kind
;
394 const char *saved_format_spec
;
396 /* Give preference to being able to inhibit warnings, before they
397 get reclassified to something else. */
398 if ((diagnostic
->kind
== DK_WARNING
|| diagnostic
->kind
== DK_PEDWARN
)
399 && !diagnostic_report_warnings_p (context
, location
))
402 if (diagnostic
->kind
== DK_PEDWARN
)
404 diagnostic
->kind
= pedantic_warning_kind (context
);
405 /* We do this to avoid giving the message for -pedantic-errors. */
406 orig_diag_kind
= diagnostic
->kind
;
409 if (diagnostic
->kind
== DK_NOTE
&& context
->inhibit_notes_p
)
412 if (context
->lock
> 0)
414 /* If we're reporting an ICE in the middle of some other error,
415 try to flush out the previous error, then let this one
416 through. Don't do this more than once. */
417 if (diagnostic
->kind
== DK_ICE
&& context
->lock
== 1)
418 pp_flush (context
->printer
);
420 error_recursion (context
);
423 /* If the user requested that warnings be treated as errors, so be
424 it. Note that we do this before the next block so that
425 individual warnings can be overridden back to warnings with
427 if (context
->warning_as_error_requested
428 && diagnostic
->kind
== DK_WARNING
)
430 diagnostic
->kind
= DK_ERROR
;
433 if (diagnostic
->option_index
)
435 diagnostic_t diag_class
= DK_UNSPECIFIED
;
437 /* This tests if the user provided the appropriate -Wfoo or
439 if (! context
->option_enabled (diagnostic
->option_index
,
440 context
->option_state
))
443 /* This tests for #pragma diagnostic changes. */
444 if (context
->n_classification_history
> 0)
447 /* FIXME: Stupid search. Optimize later. */
448 for (i
= context
->n_classification_history
- 1; i
>= 0; i
--)
450 if (context
->classification_history
[i
].location
<= location
)
452 if (context
->classification_history
[i
].kind
== (int) DK_POP
)
454 i
= context
->classification_history
[i
].option
;
457 if (context
->classification_history
[i
].option
== diagnostic
->option_index
)
459 diag_class
= context
->classification_history
[i
].kind
;
460 if (diag_class
!= DK_UNSPECIFIED
)
461 diagnostic
->kind
= diag_class
;
467 /* This tests if the user provided the appropriate -Werror=foo
469 if (diag_class
== DK_UNSPECIFIED
470 && context
->classify_diagnostic
[diagnostic
->option_index
] != DK_UNSPECIFIED
)
472 diagnostic
->kind
= context
->classify_diagnostic
[diagnostic
->option_index
];
474 /* This allows for future extensions, like temporarily disabling
475 warnings for ranges of source code. */
476 if (diagnostic
->kind
== DK_IGNORED
)
480 if (orig_diag_kind
== DK_WARNING
&& diagnostic
->kind
== DK_ERROR
)
481 context
->some_warnings_are_errors
= true;
485 if (diagnostic
->kind
== DK_ICE
)
487 #ifndef ENABLE_CHECKING
488 /* When not checking, ICEs are converted to fatal errors when an
489 error has already occurred. This is counteracted by
491 if ((diagnostic_kind_count (context
, DK_ERROR
) > 0
492 || diagnostic_kind_count (context
, DK_SORRY
) > 0)
493 && !context
->abort_on_error
)
495 expanded_location s
= expand_location (diagnostic
->location
);
496 fnotice (stderr
, "%s:%d: confused by earlier errors, bailing out\n",
498 exit (ICE_EXIT_CODE
);
501 if (context
->internal_error
)
502 (*context
->internal_error
) (context
,
503 diagnostic
->message
.format_spec
,
504 diagnostic
->message
.args_ptr
);
506 ++diagnostic_kind_count (context
, diagnostic
->kind
);
508 saved_format_spec
= diagnostic
->message
.format_spec
;
509 if (context
->show_option_requested
)
513 option_text
= context
->option_name (context
, diagnostic
->option_index
,
514 orig_diag_kind
, diagnostic
->kind
);
518 diagnostic
->message
.format_spec
519 = ACONCAT ((diagnostic
->message
.format_spec
,
521 "[", option_text
, "]",
526 diagnostic
->message
.locus
= &diagnostic
->location
;
527 diagnostic
->message
.x_data
= &diagnostic
->x_data
;
528 diagnostic
->x_data
= NULL
;
529 pp_format (context
->printer
, &diagnostic
->message
);
530 (*diagnostic_starter (context
)) (context
, diagnostic
);
531 pp_output_formatted_text (context
->printer
);
532 (*diagnostic_finalizer (context
)) (context
, diagnostic
);
533 pp_flush (context
->printer
);
534 diagnostic_action_after_output (context
, diagnostic
);
535 diagnostic
->message
.format_spec
= saved_format_spec
;
536 diagnostic
->x_data
= NULL
;
543 /* Given a partial pathname as input, return another pathname that
544 shares no directory elements with the pathname of __FILE__. This
545 is used by fancy_abort() to print `Internal compiler error in expr.c'
546 instead of `Internal compiler error in ../../GCC/gcc/expr.c'. */
549 trim_filename (const char *name
)
551 static const char this_file
[] = __FILE__
;
552 const char *p
= name
, *q
= this_file
;
554 /* First skip any "../" in each filename. This allows us to give a proper
555 reference to a file in a subdirectory. */
556 while (p
[0] == '.' && p
[1] == '.' && IS_DIR_SEPARATOR (p
[2]))
559 while (q
[0] == '.' && q
[1] == '.' && IS_DIR_SEPARATOR (q
[2]))
562 /* Now skip any parts the two filenames have in common. */
563 while (*p
== *q
&& *p
!= 0 && *q
!= 0)
566 /* Now go backwards until the previous directory separator. */
567 while (p
> name
&& !IS_DIR_SEPARATOR (p
[-1]))
573 /* Standard error reporting routines in increasing order of severity.
574 All of these take arguments like printf. */
576 /* Text to be emitted verbatim to the error message stream; this
577 produces no prefix and disables line-wrapping. Use rarely. */
579 verbatim (const char *gmsgid
, ...)
584 va_start (ap
, gmsgid
);
587 text
.format_spec
= _(gmsgid
);
590 pp_format_verbatim (global_dc
->printer
, &text
);
591 pp_flush (global_dc
->printer
);
596 emit_diagnostic (diagnostic_t kind
, location_t location
, int opt
,
597 const char *gmsgid
, ...)
599 diagnostic_info diagnostic
;
602 va_start (ap
, gmsgid
);
603 if (kind
== DK_PERMERROR
)
605 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
,
606 permissive_error_kind (global_dc
));
607 diagnostic
.option_index
= permissive_error_option (global_dc
);
610 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
, kind
);
611 if (kind
== DK_WARNING
|| kind
== DK_PEDWARN
)
612 diagnostic
.option_index
= opt
;
616 return report_diagnostic (&diagnostic
);
619 /* An informative note at LOCATION. Use this for additional details on an error
622 inform (location_t location
, const char *gmsgid
, ...)
624 diagnostic_info diagnostic
;
627 va_start (ap
, gmsgid
);
628 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
, DK_NOTE
);
629 report_diagnostic (&diagnostic
);
633 /* An informative note at LOCATION. Use this for additional details on an
636 inform_n (location_t location
, int n
, const char *singular_gmsgid
,
637 const char *plural_gmsgid
, ...)
639 diagnostic_info diagnostic
;
642 va_start (ap
, plural_gmsgid
);
643 diagnostic_set_info_translated (&diagnostic
,
644 ngettext (singular_gmsgid
, plural_gmsgid
, n
),
645 &ap
, location
, DK_NOTE
);
646 report_diagnostic (&diagnostic
);
650 /* A warning at INPUT_LOCATION. Use this for code which is correct according
651 to the relevant language specification but is likely to be buggy anyway.
652 Returns true if the warning was printed, false if it was inhibited. */
654 warning (int opt
, const char *gmsgid
, ...)
656 diagnostic_info diagnostic
;
659 va_start (ap
, gmsgid
);
660 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_WARNING
);
661 diagnostic
.option_index
= opt
;
664 return report_diagnostic (&diagnostic
);
667 /* A warning at LOCATION. Use this for code which is correct according to the
668 relevant language specification but is likely to be buggy anyway.
669 Returns true if the warning was printed, false if it was inhibited. */
672 warning_at (location_t location
, int opt
, const char *gmsgid
, ...)
674 diagnostic_info diagnostic
;
677 va_start (ap
, gmsgid
);
678 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
, DK_WARNING
);
679 diagnostic
.option_index
= opt
;
681 return report_diagnostic (&diagnostic
);
684 /* A "pedantic" warning at LOCATION: issues a warning unless
685 -pedantic-errors was given on the command line, in which case it
686 issues an error. Use this for diagnostics required by the relevant
687 language standard, if you have chosen not to make them errors.
689 Note that these diagnostics are issued independent of the setting
690 of the -pedantic command-line switch. To get a warning enabled
691 only with that switch, use either "if (pedantic) pedwarn
692 (OPT_pedantic,...)" or just "pedwarn (OPT_pedantic,..)". To get a
693 pedwarn independently of the -pedantic switch use "pedwarn (0,...)".
695 Returns true if the warning was printed, false if it was inhibited. */
698 pedwarn (location_t location
, int opt
, const char *gmsgid
, ...)
700 diagnostic_info diagnostic
;
703 va_start (ap
, gmsgid
);
704 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
, DK_PEDWARN
);
705 diagnostic
.option_index
= opt
;
707 return report_diagnostic (&diagnostic
);
710 /* A "permissive" error at LOCATION: issues an error unless
711 -fpermissive was given on the command line, in which case it issues
712 a warning. Use this for things that really should be errors but we
713 want to support legacy code.
715 Returns true if the warning was printed, false if it was inhibited. */
718 permerror (location_t location
, const char *gmsgid
, ...)
720 diagnostic_info diagnostic
;
723 va_start (ap
, gmsgid
);
724 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, location
,
725 permissive_error_kind (global_dc
));
726 diagnostic
.option_index
= permissive_error_option (global_dc
);
728 return report_diagnostic (&diagnostic
);
731 /* A hard error: the code is definitely ill-formed, and an object file
732 will not be produced. */
734 error (const char *gmsgid
, ...)
736 diagnostic_info diagnostic
;
739 va_start (ap
, gmsgid
);
740 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_ERROR
);
741 report_diagnostic (&diagnostic
);
745 /* A hard error: the code is definitely ill-formed, and an object file
746 will not be produced. */
748 error_n (location_t location
, int n
, const char *singular_gmsgid
,
749 const char *plural_gmsgid
, ...)
751 diagnostic_info diagnostic
;
754 va_start (ap
, plural_gmsgid
);
755 diagnostic_set_info_translated (&diagnostic
,
756 ngettext (singular_gmsgid
, plural_gmsgid
, n
),
757 &ap
, location
, DK_ERROR
);
758 report_diagnostic (&diagnostic
);
762 /* Same as ebove, but use location LOC instead of input_location. */
764 error_at (location_t loc
, const char *gmsgid
, ...)
766 diagnostic_info diagnostic
;
769 va_start (ap
, gmsgid
);
770 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, loc
, DK_ERROR
);
771 report_diagnostic (&diagnostic
);
775 /* "Sorry, not implemented." Use for a language feature which is
776 required by the relevant specification but not implemented by GCC.
777 An object file will not be produced. */
779 sorry (const char *gmsgid
, ...)
781 diagnostic_info diagnostic
;
784 va_start (ap
, gmsgid
);
785 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_SORRY
);
786 report_diagnostic (&diagnostic
);
790 /* Return true if an error or a "sorry" has been seen. Various
791 processing is disabled after errors. */
795 return errorcount
|| sorrycount
;
798 /* An error which is severe enough that we make no attempt to
799 continue. Do not use this for internal consistency checks; that's
800 internal_error. Use of this function should be rare. */
802 fatal_error (const char *gmsgid
, ...)
804 diagnostic_info diagnostic
;
807 va_start (ap
, gmsgid
);
808 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_FATAL
);
809 report_diagnostic (&diagnostic
);
815 /* An internal consistency check has failed. We make no attempt to
816 continue. Note that unless there is debugging value to be had from
817 a more specific message, or some other good reason, you should use
818 abort () instead of calling this function directly. */
820 internal_error (const char *gmsgid
, ...)
822 diagnostic_info diagnostic
;
825 va_start (ap
, gmsgid
);
826 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_ICE
);
827 report_diagnostic (&diagnostic
);
833 /* Special case error functions. Most are implemented in terms of the
834 above, or should be. */
836 /* Print a diagnostic MSGID on FILE. This is just fprintf, except it
837 runs its second argument through gettext. */
839 fnotice (FILE *file
, const char *cmsgid
, ...)
843 va_start (ap
, cmsgid
);
844 vfprintf (file
, _(cmsgid
), ap
);
848 /* Inform the user that an error occurred while trying to report some
849 other error. This indicates catastrophic internal inconsistencies,
850 so give up now. But do try to flush out the previous error.
851 This mustn't use internal_error, that will cause infinite recursion. */
854 error_recursion (diagnostic_context
*context
)
856 diagnostic_info diagnostic
;
858 if (context
->lock
< 3)
859 pp_flush (context
->printer
);
862 "Internal compiler error: Error reporting routines re-entered.\n");
864 /* Call diagnostic_action_after_output to get the "please submit a bug
865 report" message. It only looks at the kind field of diagnostic_info. */
866 diagnostic
.kind
= DK_ICE
;
867 diagnostic_action_after_output (context
, &diagnostic
);
869 /* Do not use gcc_unreachable here; that goes through internal_error
870 and therefore would cause infinite recursion. */
874 /* Report an internal compiler error in a friendly manner. This is
875 the function that gets called upon use of abort() in the source
876 code generally, thanks to a special macro. */
879 fancy_abort (const char *file
, int line
, const char *function
)
881 internal_error ("in %s, at %s:%d", function
, trim_filename (file
), line
);
884 /* Really call the system 'abort'. This has to go right at the end of
885 this file, so that there are no functions after it that call abort
886 and get the system abort instead of our macro. */