xref: /openbsd/gnu/gcc/gcc/diagnostic.c (revision 404b540a)
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>
5 
6 This file is part of GCC.
7 
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
11 version.
12 
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17 
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
21 02110-1301, USA.  */
22 
23 
24 /* This file implements the language independent aspect of diagnostic
25    message module.  */
26 
27 #include "config.h"
28 #undef FLOAT /* This is for hpux. They should change hpux.  */
29 #undef FFS  /* Some systems define this in param.h.  */
30 #include "system.h"
31 #include "coretypes.h"
32 #include "tm.h"
33 #include "tree.h"
34 #include "version.h"
35 #include "tm_p.h"
36 #include "flags.h"
37 #include "input.h"
38 #include "toplev.h"
39 #include "intl.h"
40 #include "diagnostic.h"
41 #include "langhooks.h"
42 #include "langhooks-def.h"
43 #include "opts.h"
44 
45 
46 /* Prototypes.  */
47 static char *build_message_string (const char *, ...) ATTRIBUTE_PRINTF_1;
48 
49 static void default_diagnostic_starter (diagnostic_context *,
50 					diagnostic_info *);
51 static void default_diagnostic_finalizer (diagnostic_context *,
52 					  diagnostic_info *);
53 
54 static void error_recursion (diagnostic_context *) ATTRIBUTE_NORETURN;
55 static bool diagnostic_count_diagnostic (diagnostic_context *,
56 					 diagnostic_info *);
57 static void diagnostic_action_after_output (diagnostic_context *,
58 					    diagnostic_info *);
59 static void real_abort (void) ATTRIBUTE_NORETURN;
60 
61 /* A diagnostic_context surrogate for stderr.  */
62 static diagnostic_context global_diagnostic_context;
63 diagnostic_context *global_dc = &global_diagnostic_context;
64 
65 
66 /* Return a malloc'd string containing MSG formatted a la printf.  The
67    caller is responsible for freeing the memory.  */
68 static char *
build_message_string(const char * msg,...)69 build_message_string (const char *msg, ...)
70 {
71   char *str;
72   va_list ap;
73 
74   va_start (ap, msg);
75   vasprintf (&str, msg, ap);
76   va_end (ap);
77 
78   return str;
79 }
80 
81 /* Same as diagnostic_build_prefix, but only the source FILE is given.  */
82 char *
file_name_as_prefix(const char * f)83 file_name_as_prefix (const char *f)
84 {
85   return build_message_string ("%s: ", f);
86 }
87 
88 
89 
90 /* Initialize the diagnostic message outputting machinery.  */
91 void
diagnostic_initialize(diagnostic_context * context)92 diagnostic_initialize (diagnostic_context *context)
93 {
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;
102 
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;
115   context->lock = 0;
116 }
117 
118 /* Initialize DIAGNOSTIC, where the message MSG has already been
119    translated.  */
120 void
diagnostic_set_info_translated(diagnostic_info * diagnostic,const char * msg,va_list * args,location_t location,diagnostic_t kind)121 diagnostic_set_info_translated (diagnostic_info *diagnostic, const char *msg,
122 				va_list *args, location_t location,
123 				diagnostic_t kind)
124 {
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;
131 }
132 
133 /* Initialize DIAGNOSTIC, where the message GMSGID has not yet been
134    translated.  */
135 void
diagnostic_set_info(diagnostic_info * diagnostic,const char * gmsgid,va_list * args,location_t location,diagnostic_t kind)136 diagnostic_set_info (diagnostic_info *diagnostic, const char *gmsgid,
137 		     va_list *args, location_t location,
138 		     diagnostic_t kind)
139 {
140   diagnostic_set_info_translated (diagnostic, _(gmsgid), args, location, kind);
141 }
142 
143 /* Return a malloc'd string describing a location.  The caller is
144    responsible for freeing the memory.  */
145 char *
diagnostic_build_prefix(diagnostic_info * diagnostic)146 diagnostic_build_prefix (diagnostic_info *diagnostic)
147 {
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
152     "must-not-happen"
153   };
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);
157 
158   return
159     (s.file == NULL
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)
164 #endif
165      : build_message_string ("%s:%d: %s", s.file, s.line, text));
166 }
167 
168 /* Count a diagnostic.  Return true if the message should be printed.  */
169 static bool
diagnostic_count_diagnostic(diagnostic_context * context,diagnostic_info * diagnostic)170 diagnostic_count_diagnostic (diagnostic_context *context,
171 			     diagnostic_info *diagnostic)
172 {
173   diagnostic_t kind = diagnostic->kind;
174   switch (kind)
175     {
176     default:
177       gcc_unreachable ();
178 
179     case DK_ICE:
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
183 	 abort_on_error.  */
184       if ((diagnostic_kind_count (context, DK_ERROR) > 0
185 	   || diagnostic_kind_count (context, DK_SORRY) > 0)
186 	  && !context->abort_on_error)
187 	{
188 	  expanded_location s = expand_location (diagnostic->location);
189 	  fnotice (stderr, "%s:%d: confused by earlier errors, bailing out\n",
190 		   s.file, s.line);
191 	  exit (ICE_EXIT_CODE);
192 	}
193 #endif
194       if (context->internal_error)
195 	(*context->internal_error) (diagnostic->message.format_spec,
196 				    diagnostic->message.args_ptr);
197       /* Fall through.  */
198 
199     case DK_FATAL: case DK_SORRY:
200     case DK_ANACHRONISM: case DK_NOTE:
201       ++diagnostic_kind_count (context, kind);
202       break;
203 
204     case DK_WARNING:
205       if (!diagnostic_report_warnings_p ())
206         return false;
207 
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]
213 	      == DK_WARNING))
214         {
215           ++diagnostic_kind_count (context, DK_WARNING);
216           break;
217         }
218       else if (context->issue_warnings_are_errors_message)
219         {
220 	  pp_verbatim (context->printer,
221                        "%s: warnings being treated as errors\n", progname);
222           context->issue_warnings_are_errors_message = false;
223         }
224 
225       /* And fall through.  */
226     case DK_ERROR:
227       ++diagnostic_kind_count (context, DK_ERROR);
228       break;
229     }
230 
231   return true;
232 }
233 
234 /* Take any action which is expected to happen after the diagnostic
235    is written out.  This function does not always return.  */
236 static void
diagnostic_action_after_output(diagnostic_context * context,diagnostic_info * diagnostic)237 diagnostic_action_after_output (diagnostic_context *context,
238 				diagnostic_info *diagnostic)
239 {
240   switch (diagnostic->kind)
241     {
242     case DK_DEBUG:
243     case DK_NOTE:
244     case DK_ANACHRONISM:
245     case DK_WARNING:
246       break;
247 
248     case DK_ERROR:
249     case DK_SORRY:
250       if (context->abort_on_error)
251 	real_abort ();
252       if (flag_fatal_errors)
253 	{
254 	  fnotice (stderr, "compilation terminated due to -Wfatal-errors.\n");
255 	  exit (FATAL_EXIT_CODE);
256 	}
257       break;
258 
259     case DK_ICE:
260       if (context->abort_on_error)
261 	real_abort ();
262 
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);
267 
268     case DK_FATAL:
269       if (context->abort_on_error)
270 	real_abort ();
271 
272       fnotice (stderr, "compilation terminated.\n");
273       exit (FATAL_EXIT_CODE);
274 
275     default:
276       gcc_unreachable ();
277     }
278 }
279 
280 /* Prints out, if necessary, the name of the current function
281    that caused an error.  Called from all error and warning functions.  */
282 void
diagnostic_report_current_function(diagnostic_context * context)283 diagnostic_report_current_function (diagnostic_context *context)
284 {
285   diagnostic_report_current_module (context);
286   lang_hooks.print_error_function (context, input_filename);
287 }
288 
289 void
diagnostic_report_current_module(diagnostic_context * context)290 diagnostic_report_current_module (diagnostic_context *context)
291 {
292   struct file_stack *p;
293 
294   if (pp_needs_newline (context->printer))
295     {
296       pp_newline (context->printer);
297       pp_needs_newline (context->printer) = false;
298     }
299 
300   p = input_file_stack;
301   if (p && diagnostic_last_module_changed (context))
302     {
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)
308 	{
309 	  xloc = expand_location (p->location);
310 	  pp_verbatim (context->printer,
311 		       ",\n                 from %s:%d",
312 		       xloc.file, xloc.line);
313 	}
314       pp_verbatim (context->printer, ":");
315       diagnostic_set_last_module (context);
316       pp_newline (context->printer);
317     }
318 }
319 
320 static void
default_diagnostic_starter(diagnostic_context * context,diagnostic_info * diagnostic)321 default_diagnostic_starter (diagnostic_context *context,
322 			    diagnostic_info *diagnostic)
323 {
324   diagnostic_report_current_function (context);
325   pp_set_prefix (context->printer, diagnostic_build_prefix (diagnostic));
326 }
327 
328 static void
default_diagnostic_finalizer(diagnostic_context * context,diagnostic_info * diagnostic ATTRIBUTE_UNUSED)329 default_diagnostic_finalizer (diagnostic_context *context,
330 			      diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
331 {
332   pp_destroy_prefix (context->printer);
333 }
334 
335 /* Interface to specify diagnostic kind overrides.  Returns the
336    previous setting, or DK_UNSPECIFIED if the parameters are out of
337    range.  */
338 diagnostic_t
diagnostic_classify_diagnostic(diagnostic_context * context,int option_index,diagnostic_t new_kind)339 diagnostic_classify_diagnostic (diagnostic_context *context,
340 				int option_index,
341 				diagnostic_t new_kind)
342 {
343   diagnostic_t old_kind;
344 
345   if (option_index <= 0
346       || option_index >= N_OPTS
347       || new_kind >= DK_LAST_DIAGNOSTIC_KIND)
348     return DK_UNSPECIFIED;
349 
350   old_kind = context->classify_diagnostic[option_index];
351   context->classify_diagnostic[option_index] = new_kind;
352   return old_kind;
353 }
354 
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.  */
360 
361 void
diagnostic_report_diagnostic(diagnostic_context * context,diagnostic_info * diagnostic)362 diagnostic_report_diagnostic (diagnostic_context *context,
363 			      diagnostic_info *diagnostic)
364 {
365   if (context->lock > 0)
366     {
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);
372       else
373 	error_recursion (context);
374     }
375 
376   if (diagnostic->option_index)
377     {
378       /* This tests if the user provided the appropriate -Wfoo or
379 	 -Wno-foo option.  */
380       if (! option_enabled (diagnostic->option_index))
381 	return;
382       /* This tests if the user provided the appropriate -Werror=foo
383 	 option.  */
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)
389 	return;
390     }
391 
392   context->lock++;
393 
394   if (diagnostic_count_diagnostic (context, diagnostic))
395     {
396       const char *saved_format_spec = diagnostic->message.format_spec;
397 
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));
402 
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;
411     }
412 
413   context->lock--;
414 }
415 
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'.  */
420 
421 const char *
trim_filename(const char * name)422 trim_filename (const char *name)
423 {
424   static const char this_file[] = __FILE__;
425   const char *p = name, *q = this_file;
426 
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]))
430     p += 3;
431 
432   while (q[0] == '.' && q[1] == '.' && IS_DIR_SEPARATOR (q[2]))
433     q += 3;
434 
435   /* Now skip any parts the two filenames have in common.  */
436   while (*p == *q && *p != 0 && *q != 0)
437     p++, q++;
438 
439   /* Now go backwards until the previous directory separator.  */
440   while (p > name && !IS_DIR_SEPARATOR (p[-1]))
441     p--;
442 
443   return p;
444 }
445 
446 /* Standard error reporting routines in increasing order of severity.
447    All of these take arguments like printf.  */
448 
449 /* Text to be emitted verbatim to the error message stream; this
450    produces no prefix and disables line-wrapping.  Use rarely.  */
451 void
verbatim(const char * gmsgid,...)452 verbatim (const char *gmsgid, ...)
453 {
454   text_info text;
455   va_list ap;
456 
457   va_start (ap, gmsgid);
458   text.err_no = errno;
459   text.args_ptr = &ap;
460   text.format_spec = _(gmsgid);
461   text.locus = NULL;
462   pp_format_verbatim (global_dc->printer, &text);
463   pp_flush (global_dc->printer);
464   va_end (ap);
465 }
466 
467 /* An informative note.  Use this for additional details on an error
468    message.  */
469 void
inform(const char * gmsgid,...)470 inform (const char *gmsgid, ...)
471 {
472   diagnostic_info diagnostic;
473   va_list ap;
474 
475   va_start (ap, gmsgid);
476   diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_NOTE);
477   report_diagnostic (&diagnostic);
478   va_end (ap);
479 }
480 
481 /* A warning.  Use this for code which is correct according to the
482    relevant language specification but is likely to be buggy anyway.  */
483 void
warning(int opt,const char * gmsgid,...)484 warning (int opt, const char *gmsgid, ...)
485 {
486   diagnostic_info diagnostic;
487   va_list ap;
488 
489   va_start (ap, gmsgid);
490   diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_WARNING);
491   diagnostic.option_index = opt;
492 
493   report_diagnostic (&diagnostic);
494   va_end (ap);
495 }
496 
497 void
warning0(const char * gmsgid,...)498 warning0 (const char *gmsgid, ...)
499 {
500   diagnostic_info diagnostic;
501   va_list ap;
502 
503   va_start (ap, gmsgid);
504   diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_WARNING);
505   report_diagnostic (&diagnostic);
506   va_end (ap);
507 }
508 
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.
513 
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 (...);"  */
517 void
pedwarn(const char * gmsgid,...)518 pedwarn (const char *gmsgid, ...)
519 {
520   diagnostic_info diagnostic;
521   va_list ap;
522 
523   va_start (ap, gmsgid);
524   diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location,
525 		       pedantic_error_kind ());
526   report_diagnostic (&diagnostic);
527   va_end (ap);
528 }
529 
530 /* A hard error: the code is definitely ill-formed, and an object file
531    will not be produced.  */
532 void
error(const char * gmsgid,...)533 error (const char *gmsgid, ...)
534 {
535   diagnostic_info diagnostic;
536   va_list ap;
537 
538   va_start (ap, gmsgid);
539   diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ERROR);
540   report_diagnostic (&diagnostic);
541   va_end (ap);
542 }
543 
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.  */
547 void
sorry(const char * gmsgid,...)548 sorry (const char *gmsgid, ...)
549 {
550   diagnostic_info diagnostic;
551   va_list ap;
552 
553   va_start (ap, gmsgid);
554   diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_SORRY);
555   report_diagnostic (&diagnostic);
556   va_end (ap);
557 }
558 
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.  */
562 void
fatal_error(const char * gmsgid,...)563 fatal_error (const char *gmsgid, ...)
564 {
565   diagnostic_info diagnostic;
566   va_list ap;
567 
568   va_start (ap, gmsgid);
569   diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_FATAL);
570   report_diagnostic (&diagnostic);
571   va_end (ap);
572 
573   gcc_unreachable ();
574 }
575 
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.  */
580 void
internal_error(const char * gmsgid,...)581 internal_error (const char *gmsgid, ...)
582 {
583   diagnostic_info diagnostic;
584   va_list ap;
585 
586   va_start (ap, gmsgid);
587   diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ICE);
588   report_diagnostic (&diagnostic);
589   va_end (ap);
590 
591   gcc_unreachable ();
592 }
593 
594 /* Special case error functions.  Most are implemented in terms of the
595    above, or should be.  */
596 
597 /* Print a diagnostic MSGID on FILE.  This is just fprintf, except it
598    runs its second argument through gettext.  */
599 void
fnotice(FILE * file,const char * cmsgid,...)600 fnotice (FILE *file, const char *cmsgid, ...)
601 {
602   va_list ap;
603 
604   va_start (ap, cmsgid);
605   vfprintf (file, _(cmsgid), ap);
606   va_end (ap);
607 }
608 
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.  */
613 
614 static void
error_recursion(diagnostic_context * context)615 error_recursion (diagnostic_context *context)
616 {
617   diagnostic_info diagnostic;
618 
619   if (context->lock < 3)
620     pp_flush (context->printer);
621 
622   fnotice (stderr,
623 	   "Internal compiler error: Error reporting routines re-entered.\n");
624 
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);
629 
630   /* Do not use gcc_unreachable here; that goes through internal_error
631      and therefore would cause infinite recursion.  */
632   real_abort ();
633 }
634 
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.  */
638 
639 void
fancy_abort(const char * file,int line,const char * function)640 fancy_abort (const char *file, int line, const char *function)
641 {
642   internal_error ("in %s, at %s:%d", function, trim_filename (file), line);
643 }
644 
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.  */
648 #undef abort
649 static void
real_abort(void)650 real_abort (void)
651 {
652   abort ();
653 }
654