1 /* Language-independent diagnostic subroutines for the GNU Compiler Collection
2 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
3 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 2, 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 COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
24 /* This file implements the language independent aspect of diagnostic
28 #undef FLOAT /* This is for hpux. They should change hpux. */
29 #undef FFS /* Some systems define this in param.h. */
31 #include "coretypes.h"
40 #include "diagnostic.h"
41 #include "langhooks.h"
42 #include "langhooks-def.h"
47 static char *build_message_string (const char *, ...) ATTRIBUTE_PRINTF_1
;
49 static void default_diagnostic_starter (diagnostic_context
*,
51 static void default_diagnostic_finalizer (diagnostic_context
*,
54 static void error_recursion (diagnostic_context
*) ATTRIBUTE_NORETURN
;
55 static bool diagnostic_count_diagnostic (diagnostic_context
*,
57 static void diagnostic_action_after_output (diagnostic_context
*,
59 static void real_abort (void) ATTRIBUTE_NORETURN
;
61 /* A diagnostic_context surrogate for stderr. */
62 static diagnostic_context global_diagnostic_context
;
63 diagnostic_context
*global_dc
= &global_diagnostic_context
;
66 /* Return a malloc'd string containing MSG formatted a la printf. The
67 caller is responsible for freeing the memory. */
69 build_message_string (const char *msg
, ...)
75 vasprintf (&str
, msg
, ap
);
81 /* Same as diagnostic_build_prefix, but only the source FILE is given. */
83 file_name_as_prefix (const char *f
)
85 return build_message_string ("%s: ", f
);
90 /* Initialize the diagnostic message outputting machinery. */
92 diagnostic_initialize (diagnostic_context
*context
)
94 /* Allocate a basic pretty-printer. Clients will replace this a
95 much more elaborated pretty-printer if they wish. */
96 context
->printer
= XNEW (pretty_printer
);
97 pp_construct (context
->printer
, NULL
, 0);
98 /* By default, diagnostics are sent to stderr. */
99 context
->printer
->buffer
->stream
= stderr
;
100 /* By default, we emit prefixes once per message. */
101 context
->printer
->wrapping
.rule
= DIAGNOSTICS_SHOW_PREFIX_ONCE
;
103 memset (context
->diagnostic_count
, 0, sizeof context
->diagnostic_count
);
104 context
->issue_warnings_are_errors_message
= true;
105 context
->warning_as_error_requested
= false;
106 memset (context
->classify_diagnostic
, DK_UNSPECIFIED
,
107 sizeof context
->classify_diagnostic
);
108 context
->show_option_requested
= false;
109 context
->abort_on_error
= false;
110 context
->internal_error
= NULL
;
111 diagnostic_starter (context
) = default_diagnostic_starter
;
112 diagnostic_finalizer (context
) = default_diagnostic_finalizer
;
113 context
->last_module
= 0;
114 context
->last_function
= NULL
;
118 /* Initialize DIAGNOSTIC, where the message MSG has already been
121 diagnostic_set_info_translated (diagnostic_info
*diagnostic
, const char *msg
,
122 va_list *args
, location_t location
,
125 diagnostic
->message
.err_no
= errno
;
126 diagnostic
->message
.args_ptr
= args
;
127 diagnostic
->message
.format_spec
= msg
;
128 diagnostic
->location
= location
;
129 diagnostic
->kind
= kind
;
130 diagnostic
->option_index
= 0;
133 /* Initialize DIAGNOSTIC, where the message GMSGID has not yet been
136 diagnostic_set_info (diagnostic_info
*diagnostic
, const char *gmsgid
,
137 va_list *args
, location_t location
,
140 diagnostic_set_info_translated (diagnostic
, _(gmsgid
), args
, location
, kind
);
143 /* Return a malloc'd string describing a location. The caller is
144 responsible for freeing the memory. */
146 diagnostic_build_prefix (diagnostic_info
*diagnostic
)
148 static const char *const diagnostic_kind_text
[] = {
149 #define DEFINE_DIAGNOSTIC_KIND(K, T) (T),
150 #include "diagnostic.def"
151 #undef DEFINE_DIAGNOSTIC_KIND
154 const char *text
= _(diagnostic_kind_text
[diagnostic
->kind
]);
155 expanded_location s
= expand_location (diagnostic
->location
);
156 gcc_assert (diagnostic
->kind
< DK_LAST_DIAGNOSTIC_KIND
);
160 ? build_message_string ("%s: %s", progname
, text
)
161 #ifdef USE_MAPPED_LOCATION
162 : flag_show_column
&& s
.column
!= 0
163 ? build_message_string ("%s:%d:%d: %s", s
.file
, s
.line
, s
.column
, text
)
165 : build_message_string ("%s:%d: %s", s
.file
, s
.line
, text
));
168 /* Count a diagnostic. Return true if the message should be printed. */
170 diagnostic_count_diagnostic (diagnostic_context
*context
,
171 diagnostic_info
*diagnostic
)
173 diagnostic_t kind
= diagnostic
->kind
;
180 #ifndef ENABLE_CHECKING
181 /* When not checking, ICEs are converted to fatal errors when an
182 error has already occurred. This is counteracted by
184 if ((diagnostic_kind_count (context
, DK_ERROR
) > 0
185 || diagnostic_kind_count (context
, DK_SORRY
) > 0)
186 && !context
->abort_on_error
)
188 expanded_location s
= expand_location (diagnostic
->location
);
189 fnotice (stderr
, "%s:%d: confused by earlier errors, bailing out\n",
191 exit (ICE_EXIT_CODE
);
194 if (context
->internal_error
)
195 (*context
->internal_error
) (diagnostic
->message
.format_spec
,
196 diagnostic
->message
.args_ptr
);
199 case DK_FATAL
: case DK_SORRY
:
200 case DK_ANACHRONISM
: case DK_NOTE
:
201 ++diagnostic_kind_count (context
, kind
);
205 if (!diagnostic_report_warnings_p ())
208 /* -Werror can reclassify warnings as errors, but
209 classify_diagnostic can reclassify it back to a warning. The
210 second part of this test detects that case. */
211 if (!context
->warning_as_error_requested
212 || (context
->classify_diagnostic
[diagnostic
->option_index
]
215 ++diagnostic_kind_count (context
, DK_WARNING
);
218 else if (context
->issue_warnings_are_errors_message
)
220 pp_verbatim (context
->printer
,
221 "%s: warnings being treated as errors\n", progname
);
222 context
->issue_warnings_are_errors_message
= false;
225 /* And fall through. */
227 ++diagnostic_kind_count (context
, DK_ERROR
);
234 /* Take any action which is expected to happen after the diagnostic
235 is written out. This function does not always return. */
237 diagnostic_action_after_output (diagnostic_context
*context
,
238 diagnostic_info
*diagnostic
)
240 switch (diagnostic
->kind
)
250 if (context
->abort_on_error
)
252 if (flag_fatal_errors
)
254 fnotice (stderr
, "compilation terminated due to -Wfatal-errors.\n");
255 exit (FATAL_EXIT_CODE
);
260 if (context
->abort_on_error
)
263 fnotice (stderr
, "Please submit a full bug report,\n"
264 "with preprocessed source if appropriate.\n"
265 "See %s for instructions.\n", bug_report_url
);
266 exit (ICE_EXIT_CODE
);
269 if (context
->abort_on_error
)
272 fnotice (stderr
, "compilation terminated.\n");
273 exit (FATAL_EXIT_CODE
);
280 /* Prints out, if necessary, the name of the current function
281 that caused an error. Called from all error and warning functions. */
283 diagnostic_report_current_function (diagnostic_context
*context
)
285 diagnostic_report_current_module (context
);
286 lang_hooks
.print_error_function (context
, input_filename
);
290 diagnostic_report_current_module (diagnostic_context
*context
)
292 struct file_stack
*p
;
294 if (pp_needs_newline (context
->printer
))
296 pp_newline (context
->printer
);
297 pp_needs_newline (context
->printer
) = false;
300 p
= input_file_stack
;
301 if (p
&& diagnostic_last_module_changed (context
))
303 expanded_location xloc
= expand_location (p
->location
);
304 pp_verbatim (context
->printer
,
305 "In file included from %s:%d",
306 xloc
.file
, xloc
.line
);
307 while ((p
= p
->next
) != NULL
)
309 xloc
= expand_location (p
->location
);
310 pp_verbatim (context
->printer
,
312 xloc
.file
, xloc
.line
);
314 pp_verbatim (context
->printer
, ":");
315 diagnostic_set_last_module (context
);
316 pp_newline (context
->printer
);
321 default_diagnostic_starter (diagnostic_context
*context
,
322 diagnostic_info
*diagnostic
)
324 diagnostic_report_current_function (context
);
325 pp_set_prefix (context
->printer
, diagnostic_build_prefix (diagnostic
));
329 default_diagnostic_finalizer (diagnostic_context
*context
,
330 diagnostic_info
*diagnostic ATTRIBUTE_UNUSED
)
332 pp_destroy_prefix (context
->printer
);
335 /* Interface to specify diagnostic kind overrides. Returns the
336 previous setting, or DK_UNSPECIFIED if the parameters are out of
339 diagnostic_classify_diagnostic (diagnostic_context
*context
,
341 diagnostic_t new_kind
)
343 diagnostic_t old_kind
;
345 if (option_index
<= 0
346 || option_index
>= N_OPTS
347 || new_kind
>= DK_LAST_DIAGNOSTIC_KIND
)
348 return DK_UNSPECIFIED
;
350 old_kind
= context
->classify_diagnostic
[option_index
];
351 context
->classify_diagnostic
[option_index
] = new_kind
;
355 /* Report a diagnostic message (an error or a warning) as specified by
356 DC. This function is *the* subroutine in terms of which front-ends
357 should implement their specific diagnostic handling modules. The
358 front-end independent format specifiers are exactly those described
359 in the documentation of output_format. */
362 diagnostic_report_diagnostic (diagnostic_context
*context
,
363 diagnostic_info
*diagnostic
)
365 if (context
->lock
> 0)
367 /* If we're reporting an ICE in the middle of some other error,
368 try to flush out the previous error, then let this one
369 through. Don't do this more than once. */
370 if (diagnostic
->kind
== DK_ICE
&& context
->lock
== 1)
371 pp_flush (context
->printer
);
373 error_recursion (context
);
376 if (diagnostic
->option_index
)
378 /* This tests if the user provided the appropriate -Wfoo or
380 if (! option_enabled (diagnostic
->option_index
))
382 /* This tests if the user provided the appropriate -Werror=foo
384 if (context
->classify_diagnostic
[diagnostic
->option_index
] != DK_UNSPECIFIED
)
385 diagnostic
->kind
= context
->classify_diagnostic
[diagnostic
->option_index
];
386 /* This allows for future extensions, like temporarily disabling
387 warnings for ranges of source code. */
388 if (diagnostic
->kind
== DK_IGNORED
)
394 if (diagnostic_count_diagnostic (context
, diagnostic
))
396 const char *saved_format_spec
= diagnostic
->message
.format_spec
;
398 if (context
->show_option_requested
&& diagnostic
->option_index
)
399 diagnostic
->message
.format_spec
400 = ACONCAT ((diagnostic
->message
.format_spec
,
401 " [", cl_options
[diagnostic
->option_index
].opt_text
, "]", NULL
));
403 diagnostic
->message
.locus
= &diagnostic
->location
;
404 pp_format (context
->printer
, &diagnostic
->message
);
405 (*diagnostic_starter (context
)) (context
, diagnostic
);
406 pp_output_formatted_text (context
->printer
);
407 (*diagnostic_finalizer (context
)) (context
, diagnostic
);
408 pp_flush (context
->printer
);
409 diagnostic_action_after_output (context
, diagnostic
);
410 diagnostic
->message
.format_spec
= saved_format_spec
;
416 /* Given a partial pathname as input, return another pathname that
417 shares no directory elements with the pathname of __FILE__. This
418 is used by fancy_abort() to print `Internal compiler error in expr.c'
419 instead of `Internal compiler error in ../../GCC/gcc/expr.c'. */
422 trim_filename (const char *name
)
424 static const char this_file
[] = __FILE__
;
425 const char *p
= name
, *q
= this_file
;
427 /* First skip any "../" in each filename. This allows us to give a proper
428 reference to a file in a subdirectory. */
429 while (p
[0] == '.' && p
[1] == '.' && IS_DIR_SEPARATOR (p
[2]))
432 while (q
[0] == '.' && q
[1] == '.' && IS_DIR_SEPARATOR (q
[2]))
435 /* Now skip any parts the two filenames have in common. */
436 while (*p
== *q
&& *p
!= 0 && *q
!= 0)
439 /* Now go backwards until the previous directory separator. */
440 while (p
> name
&& !IS_DIR_SEPARATOR (p
[-1]))
446 /* Standard error reporting routines in increasing order of severity.
447 All of these take arguments like printf. */
449 /* Text to be emitted verbatim to the error message stream; this
450 produces no prefix and disables line-wrapping. Use rarely. */
452 verbatim (const char *gmsgid
, ...)
457 va_start (ap
, gmsgid
);
460 text
.format_spec
= _(gmsgid
);
462 pp_format_verbatim (global_dc
->printer
, &text
);
463 pp_flush (global_dc
->printer
);
467 /* An informative note. Use this for additional details on an error
470 inform (const char *gmsgid
, ...)
472 diagnostic_info diagnostic
;
475 va_start (ap
, gmsgid
);
476 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_NOTE
);
477 report_diagnostic (&diagnostic
);
481 /* A warning. Use this for code which is correct according to the
482 relevant language specification but is likely to be buggy anyway. */
484 warning (int opt
, const char *gmsgid
, ...)
486 diagnostic_info diagnostic
;
489 va_start (ap
, gmsgid
);
490 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_WARNING
);
491 diagnostic
.option_index
= opt
;
493 report_diagnostic (&diagnostic
);
498 warning0 (const char *gmsgid
, ...)
500 diagnostic_info diagnostic
;
503 va_start (ap
, gmsgid
);
504 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_WARNING
);
505 report_diagnostic (&diagnostic
);
509 /* A "pedantic" warning: issues a warning unless -pedantic-errors was
510 given on the command line, in which case it issues an error. Use
511 this for diagnostics required by the relevant language standard,
512 if you have chosen not to make them errors.
514 Note that these diagnostics are issued independent of the setting
515 of the -pedantic command-line switch. To get a warning enabled
516 only with that switch, write "if (pedantic) pedwarn (...);" */
518 pedwarn (const char *gmsgid
, ...)
520 diagnostic_info diagnostic
;
523 va_start (ap
, gmsgid
);
524 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
,
525 pedantic_error_kind ());
526 report_diagnostic (&diagnostic
);
530 /* A hard error: the code is definitely ill-formed, and an object file
531 will not be produced. */
533 error (const char *gmsgid
, ...)
535 diagnostic_info diagnostic
;
538 va_start (ap
, gmsgid
);
539 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_ERROR
);
540 report_diagnostic (&diagnostic
);
544 /* "Sorry, not implemented." Use for a language feature which is
545 required by the relevant specification but not implemented by GCC.
546 An object file will not be produced. */
548 sorry (const char *gmsgid
, ...)
550 diagnostic_info diagnostic
;
553 va_start (ap
, gmsgid
);
554 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_SORRY
);
555 report_diagnostic (&diagnostic
);
559 /* An error which is severe enough that we make no attempt to
560 continue. Do not use this for internal consistency checks; that's
561 internal_error. Use of this function should be rare. */
563 fatal_error (const char *gmsgid
, ...)
565 diagnostic_info diagnostic
;
568 va_start (ap
, gmsgid
);
569 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_FATAL
);
570 report_diagnostic (&diagnostic
);
576 /* An internal consistency check has failed. We make no attempt to
577 continue. Note that unless there is debugging value to be had from
578 a more specific message, or some other good reason, you should use
579 abort () instead of calling this function directly. */
581 internal_error (const char *gmsgid
, ...)
583 diagnostic_info diagnostic
;
586 va_start (ap
, gmsgid
);
587 diagnostic_set_info (&diagnostic
, gmsgid
, &ap
, input_location
, DK_ICE
);
588 report_diagnostic (&diagnostic
);
594 /* Special case error functions. Most are implemented in terms of the
595 above, or should be. */
597 /* Print a diagnostic MSGID on FILE. This is just fprintf, except it
598 runs its second argument through gettext. */
600 fnotice (FILE *file
, const char *cmsgid
, ...)
604 va_start (ap
, cmsgid
);
605 vfprintf (file
, _(cmsgid
), ap
);
609 /* Inform the user that an error occurred while trying to report some
610 other error. This indicates catastrophic internal inconsistencies,
611 so give up now. But do try to flush out the previous error.
612 This mustn't use internal_error, that will cause infinite recursion. */
615 error_recursion (diagnostic_context
*context
)
617 diagnostic_info diagnostic
;
619 if (context
->lock
< 3)
620 pp_flush (context
->printer
);
623 "Internal compiler error: Error reporting routines re-entered.\n");
625 /* Call diagnostic_action_after_output to get the "please submit a bug
626 report" message. It only looks at the kind field of diagnostic_info. */
627 diagnostic
.kind
= DK_ICE
;
628 diagnostic_action_after_output (context
, &diagnostic
);
630 /* Do not use gcc_unreachable here; that goes through internal_error
631 and therefore would cause infinite recursion. */
635 /* Report an internal compiler error in a friendly manner. This is
636 the function that gets called upon use of abort() in the source
637 code generally, thanks to a special macro. */
640 fancy_abort (const char *file
, int line
, const char *function
)
642 internal_error ("in %s, at %s:%d", function
, trim_filename (file
), line
);
645 /* Really call the system 'abort'. This has to go right at the end of
646 this file, so that there are no functions after it that call abort
647 and get the system abort instead of our macro. */