OSDN Git Service

* system.h (strerror): Poison.
[pf3gnuchains/gcc-fork.git] / gcc / diagnostic.c
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>
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 3, 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 COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22
23 /* This file implements the language independent aspect of diagnostic
24    message module.  */
25
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "version.h"
30 #include "input.h"
31 #include "intl.h"
32 #include "diagnostic.h"
33
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)
38
39 /* Prototypes.  */
40 static char *build_message_string (const char *, ...) ATTRIBUTE_PRINTF_1;
41
42 static void error_recursion (diagnostic_context *) ATTRIBUTE_NORETURN;
43
44 static void diagnostic_action_after_output (diagnostic_context *,
45                                             diagnostic_info *);
46 static void real_abort (void) ATTRIBUTE_NORETURN;
47
48 /* Name of program invoked, sans directories.  */
49
50 const char *progname;
51
52 /* A diagnostic_context surrogate for stderr.  */
53 static diagnostic_context global_diagnostic_context;
54 diagnostic_context *global_dc = &global_diagnostic_context;
55
56 \f
57 /* Return a malloc'd string containing MSG formatted a la printf.  The
58    caller is responsible for freeing the memory.  */
59 static char *
60 build_message_string (const char *msg, ...)
61 {
62   char *str;
63   va_list ap;
64
65   va_start (ap, msg);
66   vasprintf (&str, msg, ap);
67   va_end (ap);
68
69   return str;
70 }
71
72 /* Same as diagnostic_build_prefix, but only the source FILE is given.  */
73 char *
74 file_name_as_prefix (const char *f)
75 {
76   return build_message_string ("%s: ", f);
77 }
78
79
80 \f
81 /* Initialize the diagnostic message outputting machinery.  */
82 void
83 diagnostic_initialize (diagnostic_context *context, int n_opts)
84 {
85   int i;
86
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;
95
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;
121   context->lock = 0;
122   context->inhibit_notes_p = false;
123 }
124
125 /* Do any cleaning up required after the last diagnostic is emitted.  */
126
127 void
128 diagnostic_finish (diagnostic_context *context)
129 {
130   /* Some of the errors may actually have been warnings.  */
131   if (context->some_warnings_are_errors)
132     {
133       /* -Werror was given.  */
134       if (context->warning_as_error_requested)
135         pp_verbatim (context->printer,
136                      _("%s: all warnings being treated as errors\n"),
137                      progname);
138       /* At least one -Werror= was given.  */
139       else
140         pp_verbatim (context->printer,
141                      _("%s: some warnings being treated as errors\n"),
142                      progname);
143       pp_flush (context->printer);
144     }
145 }
146
147 /* Initialize DIAGNOSTIC, where the message MSG has already been
148    translated.  */
149 void
150 diagnostic_set_info_translated (diagnostic_info *diagnostic, const char *msg,
151                                 va_list *args, location_t location,
152                                 diagnostic_t kind)
153 {
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;
161 }
162
163 /* Initialize DIAGNOSTIC, where the message GMSGID has not yet been
164    translated.  */
165 void
166 diagnostic_set_info (diagnostic_info *diagnostic, const char *gmsgid,
167                      va_list *args, location_t location,
168                      diagnostic_t kind)
169 {
170   diagnostic_set_info_translated (diagnostic, _(gmsgid), args, location, kind);
171 }
172
173 /* Return a malloc'd string describing a location.  The caller is
174    responsible for freeing the memory.  */
175 char *
176 diagnostic_build_prefix (diagnostic_context *context,
177                          diagnostic_info *diagnostic)
178 {
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
183     "must-not-happen"
184   };
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);
190
191   return
192     (s.file == NULL
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));
197 }
198
199 /* Take any action which is expected to happen after the diagnostic
200    is written out.  This function does not always return.  */
201 static void
202 diagnostic_action_after_output (diagnostic_context *context,
203                                 diagnostic_info *diagnostic)
204 {
205   switch (diagnostic->kind)
206     {
207     case DK_DEBUG:
208     case DK_NOTE:
209     case DK_ANACHRONISM:
210     case DK_WARNING:
211       break;
212
213     case DK_ERROR:
214     case DK_SORRY:
215       if (context->abort_on_error)
216         real_abort ();
217       if (context->fatal_errors)
218         {
219           fnotice (stderr, "compilation terminated due to -Wfatal-errors.\n");
220           diagnostic_finish (context);
221           exit (FATAL_EXIT_CODE);
222         }
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))
227         {
228           fnotice (stderr,
229                    "compilation terminated due to -fmax-errors=%u.\n",
230                    context->max_errors);
231           diagnostic_finish (context);
232           exit (FATAL_EXIT_CODE);
233         }
234       break;
235
236     case DK_ICE:
237       if (context->abort_on_error)
238         real_abort ();
239
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);
244
245     case DK_FATAL:
246       if (context->abort_on_error)
247         real_abort ();
248       diagnostic_finish (context);
249       fnotice (stderr, "compilation terminated.\n");
250       exit (FATAL_EXIT_CODE);
251
252     default:
253       gcc_unreachable ();
254     }
255 }
256
257 void
258 diagnostic_report_current_module (diagnostic_context *context)
259 {
260   const struct line_map *map;
261
262   if (pp_needs_newline (context->printer))
263     {
264       pp_newline (context->printer);
265       pp_needs_newline (context->printer) = false;
266     }
267
268   if (input_location <= BUILTINS_LOCATION)
269     return;
270
271   map = linemap_lookup (line_table, input_location);
272   if (map && diagnostic_last_module_changed (context, map))
273     {
274       diagnostic_set_last_module (context, map);
275       if (! MAIN_FILE_P (map))
276         {
277           map = INCLUDED_FROM (line_table, map);
278           if (context->show_column)
279             pp_verbatim (context->printer,
280                          "In file included from %s:%d:%d",
281                          map->to_file,
282                          LAST_SOURCE_LINE (map), LAST_SOURCE_COLUMN (map));
283           else
284             pp_verbatim (context->printer,
285                          "In file included from %s:%d",
286                          map->to_file, LAST_SOURCE_LINE (map));
287           while (! MAIN_FILE_P (map))
288             {
289               map = INCLUDED_FROM (line_table, map);
290               pp_verbatim (context->printer,
291                            ",\n                 from %s:%d",
292                            map->to_file, LAST_SOURCE_LINE (map));
293             }
294           pp_verbatim (context->printer, ":");
295           pp_newline (context->printer);
296         }
297     }
298 }
299
300 void
301 default_diagnostic_starter (diagnostic_context *context,
302                             diagnostic_info *diagnostic)
303 {
304   diagnostic_report_current_module (context);
305   pp_set_prefix (context->printer, diagnostic_build_prefix (context,
306                                                             diagnostic));
307 }
308
309 void
310 default_diagnostic_finalizer (diagnostic_context *context,
311                               diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
312 {
313   pp_destroy_prefix (context->printer);
314 }
315
316 /* Interface to specify diagnostic kind overrides.  Returns the
317    previous setting, or DK_UNSPECIFIED if the parameters are out of
318    range.  */
319 diagnostic_t
320 diagnostic_classify_diagnostic (diagnostic_context *context,
321                                 int option_index,
322                                 diagnostic_t new_kind,
323                                 location_t where)
324 {
325   diagnostic_t old_kind;
326
327   if (option_index <= 0
328       || option_index >= context->n_opts
329       || new_kind >= DK_LAST_DIAGNOSTIC_KIND)
330     return DK_UNSPECIFIED;
331
332   old_kind = context->classify_diagnostic[option_index];
333
334   /* Handle pragmas separately, since we need to keep track of *where*
335      the pragmas were.  */
336   if (where != UNKNOWN_LOCATION)
337     {
338       int i;
339
340       for (i = context->n_classification_history - 1; i >= 0; i --)
341         if (context->classification_history[i].option == option_index)
342           {
343             old_kind = context->classification_history[i].kind;
344             break;
345           }
346
347       i = context->n_classification_history;
348       context->classification_history =
349         (diagnostic_classification_change_t *) xrealloc (context->classification_history, (i + 1)
350                                                          * sizeof (diagnostic_classification_change_t));
351       context->classification_history[i].location = where;
352       context->classification_history[i].option = option_index;
353       context->classification_history[i].kind = new_kind;
354       context->n_classification_history ++;
355     }
356   else
357     context->classify_diagnostic[option_index] = new_kind;
358
359   return old_kind;
360 }
361
362 /* Save all diagnostic classifications in a stack.  */
363 void
364 diagnostic_push_diagnostics (diagnostic_context *context, location_t where ATTRIBUTE_UNUSED)
365 {
366   context->push_list = (int *) xrealloc (context->push_list, (context->n_push + 1) * sizeof (int));
367   context->push_list[context->n_push ++] = context->n_classification_history;
368 }
369
370 /* Restore the topmost classification set off the stack.  If the stack
371    is empty, revert to the state based on command line parameters.  */
372 void
373 diagnostic_pop_diagnostics (diagnostic_context *context, location_t where)
374 {
375   int jump_to;
376   int i;
377
378   if (context->n_push)
379     jump_to = context->push_list [-- context->n_push];
380   else
381     jump_to = 0;
382
383   i = context->n_classification_history;
384   context->classification_history =
385     (diagnostic_classification_change_t *) xrealloc (context->classification_history, (i + 1)
386                                                      * sizeof (diagnostic_classification_change_t));
387   context->classification_history[i].location = where;
388   context->classification_history[i].option = jump_to;
389   context->classification_history[i].kind = DK_POP;
390   context->n_classification_history ++;
391 }
392
393 /* Report a diagnostic message (an error or a warning) as specified by
394    DC.  This function is *the* subroutine in terms of which front-ends
395    should implement their specific diagnostic handling modules.  The
396    front-end independent format specifiers are exactly those described
397    in the documentation of output_format.
398    Return true if a diagnostic was printed, false otherwise.  */
399
400 bool
401 diagnostic_report_diagnostic (diagnostic_context *context,
402                               diagnostic_info *diagnostic)
403 {
404   location_t location = diagnostic->location;
405   diagnostic_t orig_diag_kind = diagnostic->kind;
406   const char *saved_format_spec;
407
408   /* Give preference to being able to inhibit warnings, before they
409      get reclassified to something else.  */
410   if ((diagnostic->kind == DK_WARNING || diagnostic->kind == DK_PEDWARN)
411       && !diagnostic_report_warnings_p (context, location))
412     return false;
413
414   if (diagnostic->kind == DK_PEDWARN)
415     {
416       diagnostic->kind = pedantic_warning_kind (context);
417       /* We do this to avoid giving the message for -pedantic-errors.  */
418       orig_diag_kind = diagnostic->kind;
419     }
420  
421   if (diagnostic->kind == DK_NOTE && context->inhibit_notes_p)
422     return false;
423
424   if (context->lock > 0)
425     {
426       /* If we're reporting an ICE in the middle of some other error,
427          try to flush out the previous error, then let this one
428          through.  Don't do this more than once.  */
429       if (diagnostic->kind == DK_ICE && context->lock == 1)
430         pp_flush (context->printer);
431       else
432         error_recursion (context);
433     }
434
435   /* If the user requested that warnings be treated as errors, so be
436      it.  Note that we do this before the next block so that
437      individual warnings can be overridden back to warnings with
438      -Wno-error=*.  */
439   if (context->warning_as_error_requested
440       && diagnostic->kind == DK_WARNING)
441     {
442       diagnostic->kind = DK_ERROR;
443     }
444
445   if (diagnostic->option_index)
446     {
447       diagnostic_t diag_class = DK_UNSPECIFIED;
448
449       /* This tests if the user provided the appropriate -Wfoo or
450          -Wno-foo option.  */
451       if (! context->option_enabled (diagnostic->option_index,
452                                      context->option_state))
453         return false;
454
455       /* This tests for #pragma diagnostic changes.  */
456       if (context->n_classification_history > 0)
457         {
458           int i;
459           /* FIXME: Stupid search.  Optimize later. */
460           for (i = context->n_classification_history - 1; i >= 0; i --)
461             {
462               if (context->classification_history[i].location <= location)
463                 {
464                   if (context->classification_history[i].kind == (int) DK_POP)
465                     {
466                       i = context->classification_history[i].option;
467                       continue;
468                     }
469                   if (context->classification_history[i].option == diagnostic->option_index)
470                     {
471                       diag_class = context->classification_history[i].kind;
472                       if (diag_class != DK_UNSPECIFIED)
473                         diagnostic->kind = diag_class;
474                       break;
475                     }
476                 }
477             }
478         }
479       /* This tests if the user provided the appropriate -Werror=foo
480          option.  */
481       if (diag_class == DK_UNSPECIFIED
482           && context->classify_diagnostic[diagnostic->option_index] != DK_UNSPECIFIED)
483         {
484           diagnostic->kind = context->classify_diagnostic[diagnostic->option_index];
485         }
486       /* This allows for future extensions, like temporarily disabling
487          warnings for ranges of source code.  */
488       if (diagnostic->kind == DK_IGNORED)
489         return false;
490     }
491
492   if (orig_diag_kind == DK_WARNING && diagnostic->kind == DK_ERROR)
493     context->some_warnings_are_errors = true;
494
495   context->lock++;
496
497   if (diagnostic->kind == DK_ICE)
498     {
499 #ifndef ENABLE_CHECKING
500       /* When not checking, ICEs are converted to fatal errors when an
501          error has already occurred.  This is counteracted by
502          abort_on_error.  */
503       if ((diagnostic_kind_count (context, DK_ERROR) > 0
504            || diagnostic_kind_count (context, DK_SORRY) > 0)
505           && !context->abort_on_error)
506         {
507           expanded_location s = expand_location (diagnostic->location);
508           fnotice (stderr, "%s:%d: confused by earlier errors, bailing out\n",
509                    s.file, s.line);
510           exit (ICE_EXIT_CODE);
511         }
512 #endif
513       if (context->internal_error)
514         (*context->internal_error) (context,
515                                     diagnostic->message.format_spec,
516                                     diagnostic->message.args_ptr);
517     }
518   ++diagnostic_kind_count (context, diagnostic->kind);
519
520   saved_format_spec = diagnostic->message.format_spec;
521   if (context->show_option_requested)
522     {
523       char *option_text;
524
525       option_text = context->option_name (context, diagnostic->option_index,
526                                           orig_diag_kind, diagnostic->kind);
527
528       if (option_text)
529         {
530           diagnostic->message.format_spec
531             = ACONCAT ((diagnostic->message.format_spec,
532                         " ", 
533                         "[", option_text, "]",
534                         NULL));
535           free (option_text);
536         }
537     }
538   diagnostic->message.locus = &diagnostic->location;
539   diagnostic->message.x_data = &diagnostic->x_data;
540   diagnostic->x_data = NULL;
541   pp_format (context->printer, &diagnostic->message);
542   (*diagnostic_starter (context)) (context, diagnostic);
543   pp_output_formatted_text (context->printer);
544   (*diagnostic_finalizer (context)) (context, diagnostic);
545   pp_flush (context->printer);
546   diagnostic_action_after_output (context, diagnostic);
547   diagnostic->message.format_spec = saved_format_spec;
548   diagnostic->x_data = NULL;
549
550   context->lock--;
551
552   return true;
553 }
554
555 /* Given a partial pathname as input, return another pathname that
556    shares no directory elements with the pathname of __FILE__.  This
557    is used by fancy_abort() to print `Internal compiler error in expr.c'
558    instead of `Internal compiler error in ../../GCC/gcc/expr.c'.  */
559
560 const char *
561 trim_filename (const char *name)
562 {
563   static const char this_file[] = __FILE__;
564   const char *p = name, *q = this_file;
565
566   /* First skip any "../" in each filename.  This allows us to give a proper
567      reference to a file in a subdirectory.  */
568   while (p[0] == '.' && p[1] == '.' && IS_DIR_SEPARATOR (p[2]))
569     p += 3;
570
571   while (q[0] == '.' && q[1] == '.' && IS_DIR_SEPARATOR (q[2]))
572     q += 3;
573
574   /* Now skip any parts the two filenames have in common.  */
575   while (*p == *q && *p != 0 && *q != 0)
576     p++, q++;
577
578   /* Now go backwards until the previous directory separator.  */
579   while (p > name && !IS_DIR_SEPARATOR (p[-1]))
580     p--;
581
582   return p;
583 }
584 \f
585 /* Standard error reporting routines in increasing order of severity.
586    All of these take arguments like printf.  */
587
588 /* Text to be emitted verbatim to the error message stream; this
589    produces no prefix and disables line-wrapping.  Use rarely.  */
590 void
591 verbatim (const char *gmsgid, ...)
592 {
593   text_info text;
594   va_list ap;
595
596   va_start (ap, gmsgid);
597   text.err_no = errno;
598   text.args_ptr = &ap;
599   text.format_spec = _(gmsgid);
600   text.locus = NULL;
601   text.x_data = NULL;
602   pp_format_verbatim (global_dc->printer, &text);
603   pp_flush (global_dc->printer);
604   va_end (ap);
605 }
606
607 bool
608 emit_diagnostic (diagnostic_t kind, location_t location, int opt,
609                  const char *gmsgid, ...)
610 {
611   diagnostic_info diagnostic;
612   va_list ap;
613
614   va_start (ap, gmsgid);
615   if (kind == DK_PERMERROR)
616     {
617       diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
618                            permissive_error_kind (global_dc));
619       diagnostic.option_index = permissive_error_option (global_dc);
620     }
621   else {
622       diagnostic_set_info (&diagnostic, gmsgid, &ap, location, kind);
623       if (kind == DK_WARNING || kind == DK_PEDWARN)
624         diagnostic.option_index = opt;
625   }
626   va_end (ap);
627
628   return report_diagnostic (&diagnostic);
629 }
630
631 /* An informative note at LOCATION.  Use this for additional details on an error
632    message.  */
633 void
634 inform (location_t location, const char *gmsgid, ...)
635 {
636   diagnostic_info diagnostic;
637   va_list ap;
638
639   va_start (ap, gmsgid);
640   diagnostic_set_info (&diagnostic, gmsgid, &ap, location, DK_NOTE);
641   report_diagnostic (&diagnostic);
642   va_end (ap);
643 }
644
645 /* An informative note at LOCATION.  Use this for additional details on an
646    error message.  */
647 void
648 inform_n (location_t location, int n, const char *singular_gmsgid,
649           const char *plural_gmsgid, ...)
650 {
651   diagnostic_info diagnostic;
652   va_list ap;
653
654   va_start (ap, plural_gmsgid);
655   diagnostic_set_info_translated (&diagnostic,
656                                   ngettext (singular_gmsgid, plural_gmsgid, n),
657                                   &ap, location, DK_NOTE);
658   report_diagnostic (&diagnostic);
659   va_end (ap);
660 }
661
662 /* A warning at INPUT_LOCATION.  Use this for code which is correct according
663    to the relevant language specification but is likely to be buggy anyway.
664    Returns true if the warning was printed, false if it was inhibited.  */
665 bool
666 warning (int opt, const char *gmsgid, ...)
667 {
668   diagnostic_info diagnostic;
669   va_list ap;
670
671   va_start (ap, gmsgid);
672   diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_WARNING);
673   diagnostic.option_index = opt;
674
675   va_end (ap);
676   return report_diagnostic (&diagnostic);
677 }
678
679 /* A warning at LOCATION.  Use this for code which is correct according to the
680    relevant language specification but is likely to be buggy anyway.
681    Returns true if the warning was printed, false if it was inhibited.  */
682
683 bool
684 warning_at (location_t location, int opt, const char *gmsgid, ...)
685 {
686   diagnostic_info diagnostic;
687   va_list ap;
688
689   va_start (ap, gmsgid);
690   diagnostic_set_info (&diagnostic, gmsgid, &ap, location, DK_WARNING);
691   diagnostic.option_index = opt;
692   va_end (ap);
693   return report_diagnostic (&diagnostic);
694 }
695
696 /* A "pedantic" warning at LOCATION: issues a warning unless
697    -pedantic-errors was given on the command line, in which case it
698    issues an error.  Use this for diagnostics required by the relevant
699    language standard, if you have chosen not to make them errors.
700
701    Note that these diagnostics are issued independent of the setting
702    of the -pedantic command-line switch.  To get a warning enabled
703    only with that switch, use either "if (pedantic) pedwarn
704    (OPT_pedantic,...)" or just "pedwarn (OPT_pedantic,..)".  To get a
705    pedwarn independently of the -pedantic switch use "pedwarn (0,...)".
706
707    Returns true if the warning was printed, false if it was inhibited.  */
708
709 bool
710 pedwarn (location_t location, int opt, const char *gmsgid, ...)
711 {
712   diagnostic_info diagnostic;
713   va_list ap;
714
715   va_start (ap, gmsgid);
716   diagnostic_set_info (&diagnostic, gmsgid, &ap, location,  DK_PEDWARN);
717   diagnostic.option_index = opt;
718   va_end (ap);
719   return report_diagnostic (&diagnostic);
720 }
721
722 /* A "permissive" error at LOCATION: issues an error unless
723    -fpermissive was given on the command line, in which case it issues
724    a warning.  Use this for things that really should be errors but we
725    want to support legacy code.
726
727    Returns true if the warning was printed, false if it was inhibited.  */
728
729 bool
730 permerror (location_t location, const char *gmsgid, ...)
731 {
732   diagnostic_info diagnostic;
733   va_list ap;
734
735   va_start (ap, gmsgid);
736   diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
737                        permissive_error_kind (global_dc));
738   diagnostic.option_index = permissive_error_option (global_dc);
739   va_end (ap);
740   return report_diagnostic (&diagnostic);
741 }
742
743 /* A hard error: the code is definitely ill-formed, and an object file
744    will not be produced.  */
745 void
746 error (const char *gmsgid, ...)
747 {
748   diagnostic_info diagnostic;
749   va_list ap;
750
751   va_start (ap, gmsgid);
752   diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ERROR);
753   report_diagnostic (&diagnostic);
754   va_end (ap);
755 }
756
757 /* A hard error: the code is definitely ill-formed, and an object file
758    will not be produced.  */
759 void
760 error_n (location_t location, int n, const char *singular_gmsgid,
761          const char *plural_gmsgid, ...)
762 {
763   diagnostic_info diagnostic;
764   va_list ap;
765
766   va_start (ap, plural_gmsgid);
767   diagnostic_set_info_translated (&diagnostic,
768                                   ngettext (singular_gmsgid, plural_gmsgid, n),
769                                   &ap, location, DK_ERROR);
770   report_diagnostic (&diagnostic);
771   va_end (ap);
772 }
773
774 /* Same as ebove, but use location LOC instead of input_location.  */
775 void
776 error_at (location_t loc, const char *gmsgid, ...)
777 {
778   diagnostic_info diagnostic;
779   va_list ap;
780
781   va_start (ap, gmsgid);
782   diagnostic_set_info (&diagnostic, gmsgid, &ap, loc, DK_ERROR);
783   report_diagnostic (&diagnostic);
784   va_end (ap);
785 }
786
787 /* "Sorry, not implemented."  Use for a language feature which is
788    required by the relevant specification but not implemented by GCC.
789    An object file will not be produced.  */
790 void
791 sorry (const char *gmsgid, ...)
792 {
793   diagnostic_info diagnostic;
794   va_list ap;
795
796   va_start (ap, gmsgid);
797   diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_SORRY);
798   report_diagnostic (&diagnostic);
799   va_end (ap);
800 }
801
802 /* Return true if an error or a "sorry" has been seen.  Various
803    processing is disabled after errors.  */
804 bool
805 seen_error (void)
806 {
807   return errorcount || sorrycount;
808 }
809
810 /* An error which is severe enough that we make no attempt to
811    continue.  Do not use this for internal consistency checks; that's
812    internal_error.  Use of this function should be rare.  */
813 void
814 fatal_error (const char *gmsgid, ...)
815 {
816   diagnostic_info diagnostic;
817   va_list ap;
818
819   va_start (ap, gmsgid);
820   diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_FATAL);
821   report_diagnostic (&diagnostic);
822   va_end (ap);
823
824   gcc_unreachable ();
825 }
826
827 /* An internal consistency check has failed.  We make no attempt to
828    continue.  Note that unless there is debugging value to be had from
829    a more specific message, or some other good reason, you should use
830    abort () instead of calling this function directly.  */
831 void
832 internal_error (const char *gmsgid, ...)
833 {
834   diagnostic_info diagnostic;
835   va_list ap;
836
837   va_start (ap, gmsgid);
838   diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ICE);
839   report_diagnostic (&diagnostic);
840   va_end (ap);
841
842   gcc_unreachable ();
843 }
844 \f
845 /* Special case error functions.  Most are implemented in terms of the
846    above, or should be.  */
847
848 /* Print a diagnostic MSGID on FILE.  This is just fprintf, except it
849    runs its second argument through gettext.  */
850 void
851 fnotice (FILE *file, const char *cmsgid, ...)
852 {
853   va_list ap;
854
855   va_start (ap, cmsgid);
856   vfprintf (file, _(cmsgid), ap);
857   va_end (ap);
858 }
859
860 /* Inform the user that an error occurred while trying to report some
861    other error.  This indicates catastrophic internal inconsistencies,
862    so give up now.  But do try to flush out the previous error.
863    This mustn't use internal_error, that will cause infinite recursion.  */
864
865 static void
866 error_recursion (diagnostic_context *context)
867 {
868   diagnostic_info diagnostic;
869
870   if (context->lock < 3)
871     pp_flush (context->printer);
872
873   fnotice (stderr,
874            "Internal compiler error: Error reporting routines re-entered.\n");
875
876   /* Call diagnostic_action_after_output to get the "please submit a bug
877      report" message.  It only looks at the kind field of diagnostic_info.  */
878   diagnostic.kind = DK_ICE;
879   diagnostic_action_after_output (context, &diagnostic);
880
881   /* Do not use gcc_unreachable here; that goes through internal_error
882      and therefore would cause infinite recursion.  */
883   real_abort ();
884 }
885
886 /* Report an internal compiler error in a friendly manner.  This is
887    the function that gets called upon use of abort() in the source
888    code generally, thanks to a special macro.  */
889
890 void
891 fancy_abort (const char *file, int line, const char *function)
892 {
893   internal_error ("in %s, at %s:%d", function, trim_filename (file), line);
894 }
895
896 /* Really call the system 'abort'.  This has to go right at the end of
897    this file, so that there are no functions after it that call abort
898    and get the system abort instead of our macro.  */
899 #undef abort
900 static void
901 real_abort (void)
902 {
903   abort ();
904 }