1/* Language-independent diagnostic subroutines for the GNU Compiler Collection
2   Copyright (C) 1999-2015 Free Software Foundation, Inc.
3   Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3.  If not see
19<http://www.gnu.org/licenses/>.  */
20
21
22/* This file implements the language independent aspect of diagnostic
23   message module.  */
24
25#include "config.h"
26#include "system.h"
27#include "coretypes.h"
28#include "version.h"
29#include "demangle.h"
30#include "input.h"
31#include "intl.h"
32#include "backtrace.h"
33#include "diagnostic.h"
34#include "diagnostic-color.h"
35
36#ifdef HAVE_TERMIOS_H
37# include <termios.h>
38#endif
39
40#ifdef GWINSZ_IN_SYS_IOCTL
41# include <sys/ioctl.h>
42#endif
43
44#include <new>                     // For placement new.
45
46#define pedantic_warning_kind(DC)			\
47  ((DC)->pedantic_errors ? DK_ERROR : DK_WARNING)
48#define permissive_error_kind(DC) ((DC)->permissive ? DK_WARNING : DK_ERROR)
49#define permissive_error_option(DC) ((DC)->opt_permissive)
50
51/* Prototypes.  */
52static void error_recursion (diagnostic_context *) ATTRIBUTE_NORETURN;
53
54static void real_abort (void) ATTRIBUTE_NORETURN;
55
56/* Name of program invoked, sans directories.  */
57
58const char *progname;
59
60/* A diagnostic_context surrogate for stderr.  */
61static diagnostic_context global_diagnostic_context;
62diagnostic_context *global_dc = &global_diagnostic_context;
63
64/* Return a malloc'd string containing MSG formatted a la printf.  The
65   caller is responsible for freeing the memory.  */
66char *
67build_message_string (const char *msg, ...)
68{
69  char *str;
70  va_list ap;
71
72  va_start (ap, msg);
73  str = xvasprintf (msg, ap);
74  va_end (ap);
75
76  return str;
77}
78
79/* Same as diagnostic_build_prefix, but only the source FILE is given.  */
80char *
81file_name_as_prefix (diagnostic_context *context, const char *f)
82{
83  const char *locus_cs
84    = colorize_start (pp_show_color (context->printer), "locus");
85  const char *locus_ce = colorize_stop (pp_show_color (context->printer));
86  return build_message_string ("%s%s:%s ", locus_cs, f, locus_ce);
87}
88
89
90
91/* Return the value of the getenv("COLUMNS") as an integer. If the
92   value is not set to a positive integer, use ioctl to get the
93   terminal width. If it fails, return INT_MAX.  */
94int
95get_terminal_width (void)
96{
97  const char * s = getenv ("COLUMNS");
98  if (s != NULL) {
99    int n = atoi (s);
100    if (n > 0)
101      return n;
102  }
103
104#ifdef TIOCGWINSZ
105  struct winsize w;
106  w.ws_col = 0;
107  if (ioctl (0, TIOCGWINSZ, &w) == 0 && w.ws_col > 0)
108    return w.ws_col;
109#endif
110
111  return INT_MAX;
112}
113
114/* Set caret_max_width to value.  */
115void
116diagnostic_set_caret_max_width (diagnostic_context *context, int value)
117{
118  /* One minus to account for the leading empty space.  */
119  value = value ? value - 1
120    : (isatty (fileno (pp_buffer (context->printer)->stream))
121       ? get_terminal_width () - 1: INT_MAX);
122
123  if (value <= 0)
124    value = INT_MAX;
125
126  context->caret_max_width = value;
127}
128
129/* Initialize the diagnostic message outputting machinery.  */
130void
131diagnostic_initialize (diagnostic_context *context, int n_opts)
132{
133  int i;
134
135  /* Allocate a basic pretty-printer.  Clients will replace this a
136     much more elaborated pretty-printer if they wish.  */
137  context->printer = XNEW (pretty_printer);
138  new (context->printer) pretty_printer ();
139
140  memset (context->diagnostic_count, 0, sizeof context->diagnostic_count);
141  context->warning_as_error_requested = false;
142  context->n_opts = n_opts;
143  context->classify_diagnostic = XNEWVEC (diagnostic_t, n_opts);
144  for (i = 0; i < n_opts; i++)
145    context->classify_diagnostic[i] = DK_UNSPECIFIED;
146  context->show_caret = false;
147  diagnostic_set_caret_max_width (context, pp_line_cutoff (context->printer));
148  context->caret_char = '^';
149  context->show_option_requested = false;
150  context->abort_on_error = false;
151  context->show_column = false;
152  context->pedantic_errors = false;
153  context->permissive = false;
154  context->opt_permissive = 0;
155  context->fatal_errors = false;
156  context->dc_inhibit_warnings = false;
157  context->dc_warn_system_headers = false;
158  context->max_errors = 0;
159  context->internal_error = NULL;
160  diagnostic_starter (context) = default_diagnostic_starter;
161  diagnostic_finalizer (context) = default_diagnostic_finalizer;
162  context->option_enabled = NULL;
163  context->option_state = NULL;
164  context->option_name = NULL;
165  context->last_location = UNKNOWN_LOCATION;
166  context->last_module = 0;
167  context->x_data = NULL;
168  context->lock = 0;
169  context->inhibit_notes_p = false;
170}
171
172/* Maybe initialize the color support. We require clients to do this
173   explicitly, since most clients don't want color.  When called
174   without a VALUE, it initializes with DIAGNOSTICS_COLOR_DEFAULT.  */
175
176void
177diagnostic_color_init (diagnostic_context *context, int value /*= -1 */)
178{
179  /* value == -1 is the default value.  */
180  if (value < 0)
181    {
182      /* If DIAGNOSTICS_COLOR_DEFAULT is -1, default to
183	 -fdiagnostics-color=auto if GCC_COLORS is in the environment,
184	 otherwise default to -fdiagnostics-color=never, for other
185	 values default to that
186	 -fdiagnostics-color={never,auto,always}.  */
187      if (DIAGNOSTICS_COLOR_DEFAULT == -1)
188	{
189	  if (!getenv ("GCC_COLORS"))
190	    return;
191	  value = DIAGNOSTICS_COLOR_AUTO;
192	}
193      else
194	value = DIAGNOSTICS_COLOR_DEFAULT;
195    }
196  pp_show_color (context->printer)
197    = colorize_init ((diagnostic_color_rule_t) value);
198}
199
200/* Do any cleaning up required after the last diagnostic is emitted.  */
201
202void
203diagnostic_finish (diagnostic_context *context)
204{
205  /* Some of the errors may actually have been warnings.  */
206  if (diagnostic_kind_count (context, DK_WERROR))
207    {
208      /* -Werror was given.  */
209      if (context->warning_as_error_requested)
210	pp_verbatim (context->printer,
211		     _("%s: all warnings being treated as errors"),
212		     progname);
213      /* At least one -Werror= was given.  */
214      else
215	pp_verbatim (context->printer,
216		     _("%s: some warnings being treated as errors"),
217		     progname);
218      pp_newline_and_flush (context->printer);
219    }
220
221  diagnostic_file_cache_fini ();
222
223  XDELETEVEC (context->classify_diagnostic);
224  context->classify_diagnostic = NULL;
225
226  /* diagnostic_initialize allocates context->printer using XNEW
227     and placement-new.  */
228  context->printer->~pretty_printer ();
229  XDELETE (context->printer);
230  context->printer = NULL;
231}
232
233/* Initialize DIAGNOSTIC, where the message MSG has already been
234   translated.  */
235void
236diagnostic_set_info_translated (diagnostic_info *diagnostic, const char *msg,
237				va_list *args, location_t location,
238				diagnostic_t kind)
239{
240  diagnostic->message.err_no = errno;
241  diagnostic->message.args_ptr = args;
242  diagnostic->message.format_spec = msg;
243  diagnostic->location = location;
244  diagnostic->override_column = 0;
245  diagnostic->kind = kind;
246  diagnostic->option_index = 0;
247}
248
249/* Initialize DIAGNOSTIC, where the message GMSGID has not yet been
250   translated.  */
251void
252diagnostic_set_info (diagnostic_info *diagnostic, const char *gmsgid,
253		     va_list *args, location_t location,
254		     diagnostic_t kind)
255{
256  diagnostic_set_info_translated (diagnostic, _(gmsgid), args, location, kind);
257}
258
259/* Return a malloc'd string describing a location.  The caller is
260   responsible for freeing the memory.  */
261char *
262diagnostic_build_prefix (diagnostic_context *context,
263			 const diagnostic_info *diagnostic)
264{
265  static const char *const diagnostic_kind_text[] = {
266#define DEFINE_DIAGNOSTIC_KIND(K, T, C) (T),
267#include "diagnostic.def"
268#undef DEFINE_DIAGNOSTIC_KIND
269    "must-not-happen"
270  };
271  static const char *const diagnostic_kind_color[] = {
272#define DEFINE_DIAGNOSTIC_KIND(K, T, C) (C),
273#include "diagnostic.def"
274#undef DEFINE_DIAGNOSTIC_KIND
275    NULL
276  };
277  gcc_assert (diagnostic->kind < DK_LAST_DIAGNOSTIC_KIND);
278
279  const char *text = _(diagnostic_kind_text[diagnostic->kind]);
280  const char *text_cs = "", *text_ce = "";
281  const char *locus_cs, *locus_ce;
282  pretty_printer *pp = context->printer;
283
284  if (diagnostic_kind_color[diagnostic->kind])
285    {
286      text_cs = colorize_start (pp_show_color (pp),
287				diagnostic_kind_color[diagnostic->kind]);
288      text_ce = colorize_stop (pp_show_color (pp));
289    }
290  locus_cs = colorize_start (pp_show_color (pp), "locus");
291  locus_ce = colorize_stop (pp_show_color (pp));
292
293  expanded_location s = diagnostic_expand_location (diagnostic);
294  return
295    (s.file == NULL
296     ? build_message_string ("%s%s:%s %s%s%s", locus_cs, progname, locus_ce,
297			     text_cs, text, text_ce)
298     : !strcmp (s.file, N_("<built-in>"))
299     ? build_message_string ("%s%s:%s %s%s%s", locus_cs, s.file, locus_ce,
300			     text_cs, text, text_ce)
301     : context->show_column
302     ? build_message_string ("%s%s:%d:%d:%s %s%s%s", locus_cs, s.file, s.line,
303			     s.column, locus_ce, text_cs, text, text_ce)
304     : build_message_string ("%s%s:%d:%s %s%s%s", locus_cs, s.file, s.line,
305			     locus_ce, text_cs, text, text_ce));
306}
307
308/* If LINE is longer than MAX_WIDTH, and COLUMN is not smaller than
309   MAX_WIDTH by some margin, then adjust the start of the line such
310   that the COLUMN is smaller than MAX_WIDTH minus the margin.  The
311   margin is either 10 characters or the difference between the column
312   and the length of the line, whatever is smaller.  The length of
313   LINE is given by LINE_WIDTH.  */
314static const char *
315adjust_line (const char *line, int line_width,
316	     int max_width, int *column_p)
317{
318  int right_margin = 10;
319  int column = *column_p;
320
321  gcc_checking_assert (line_width >= column);
322  right_margin = MIN (line_width - column, right_margin);
323  right_margin = max_width - right_margin;
324  if (line_width >= max_width && column > right_margin)
325    {
326      line += column - right_margin;
327      *column_p = right_margin;
328    }
329  return line;
330}
331
332/* Print the physical source line corresponding to the location of
333   this diagnostic, and a caret indicating the precise column.  */
334void
335diagnostic_show_locus (diagnostic_context * context,
336		       const diagnostic_info *diagnostic)
337{
338  const char *line;
339  int line_width;
340  char *buffer;
341  expanded_location s;
342  int max_width;
343  const char *saved_prefix;
344  const char *caret_cs, *caret_ce;
345
346  if (!context->show_caret
347      || diagnostic->location <= BUILTINS_LOCATION
348      || diagnostic->location == context->last_location)
349    return;
350
351  context->last_location = diagnostic->location;
352  s = diagnostic_expand_location (diagnostic);
353  line = location_get_source_line (s, &line_width);
354  if (line == NULL || s.column > line_width)
355    return;
356
357  max_width = context->caret_max_width;
358  line = adjust_line (line, line_width, max_width, &(s.column));
359
360  pp_newline (context->printer);
361  saved_prefix = pp_get_prefix (context->printer);
362  pp_set_prefix (context->printer, NULL);
363  pp_space (context->printer);
364  while (max_width > 0 && line_width > 0)
365    {
366      char c = *line == '\t' ? ' ' : *line;
367      if (c == '\0')
368	c = ' ';
369      pp_character (context->printer, c);
370      max_width--;
371      line_width--;
372      line++;
373    }
374  pp_newline (context->printer);
375  caret_cs = colorize_start (pp_show_color (context->printer), "caret");
376  caret_ce = colorize_stop (pp_show_color (context->printer));
377
378  /* pp_printf does not implement %*c.  */
379  size_t len = s.column + 3 + strlen (caret_cs) + strlen (caret_ce);
380  buffer = XALLOCAVEC (char, len);
381  snprintf (buffer, len, "%s %*c%s", caret_cs, s.column, context->caret_char,
382	    caret_ce);
383  pp_string (context->printer, buffer);
384  pp_set_prefix (context->printer, saved_prefix);
385  pp_needs_newline (context->printer) = true;
386}
387
388/* Functions at which to stop the backtrace print.  It's not
389   particularly helpful to print the callers of these functions.  */
390
391static const char * const bt_stop[] =
392{
393  "main",
394  "toplev::main",
395  "execute_one_pass",
396  "compile_file",
397};
398
399/* A callback function passed to the backtrace_full function.  */
400
401static int
402bt_callback (void *data, uintptr_t pc, const char *filename, int lineno,
403	     const char *function)
404{
405  int *pcount = (int *) data;
406
407  /* If we don't have any useful information, don't print
408     anything.  */
409  if (filename == NULL && function == NULL)
410    return 0;
411
412  /* Skip functions in diagnostic.c.  */
413  if (*pcount == 0
414      && filename != NULL
415      && strcmp (lbasename (filename), "diagnostic.c") == 0)
416    return 0;
417
418  /* Print up to 20 functions.  We could make this a --param, but
419     since this is only for debugging just use a constant for now.  */
420  if (*pcount >= 20)
421    {
422      /* Returning a non-zero value stops the backtrace.  */
423      return 1;
424    }
425  ++*pcount;
426
427  char *alc = NULL;
428  if (function != NULL)
429    {
430      char *str = cplus_demangle_v3 (function,
431				     (DMGL_VERBOSE | DMGL_ANSI
432				      | DMGL_GNU_V3 | DMGL_PARAMS));
433      if (str != NULL)
434	{
435	  alc = str;
436	  function = str;
437	}
438
439      for (size_t i = 0; i < ARRAY_SIZE (bt_stop); ++i)
440	{
441	  size_t len = strlen (bt_stop[i]);
442	  if (strncmp (function, bt_stop[i], len) == 0
443	      && (function[len] == '\0' || function[len] == '('))
444	    {
445	      if (alc != NULL)
446		free (alc);
447	      /* Returning a non-zero value stops the backtrace.  */
448	      return 1;
449	    }
450	}
451    }
452
453  fprintf (stderr, "0x%lx %s\n\t%s:%d\n",
454	   (unsigned long) pc,
455	   function == NULL ? "???" : function,
456	   filename == NULL ? "???" : filename,
457	   lineno);
458
459  if (alc != NULL)
460    free (alc);
461
462  return 0;
463}
464
465/* A callback function passed to the backtrace_full function.  This is
466   called if backtrace_full has an error.  */
467
468static void
469bt_err_callback (void *data ATTRIBUTE_UNUSED, const char *msg, int errnum)
470{
471  if (errnum < 0)
472    {
473      /* This means that no debug info was available.  Just quietly
474	 skip printing backtrace info.  */
475      return;
476    }
477  fprintf (stderr, "%s%s%s\n", msg, errnum == 0 ? "" : ": ",
478	   errnum == 0 ? "" : xstrerror (errnum));
479}
480
481/* Take any action which is expected to happen after the diagnostic
482   is written out.  This function does not always return.  */
483void
484diagnostic_action_after_output (diagnostic_context *context,
485				diagnostic_t diag_kind)
486{
487  switch (diag_kind)
488    {
489    case DK_DEBUG:
490    case DK_NOTE:
491    case DK_ANACHRONISM:
492    case DK_WARNING:
493      break;
494
495    case DK_ERROR:
496    case DK_SORRY:
497      if (context->abort_on_error)
498	real_abort ();
499      if (context->fatal_errors)
500	{
501	  fnotice (stderr, "compilation terminated due to -Wfatal-errors.\n");
502	  diagnostic_finish (context);
503	  exit (FATAL_EXIT_CODE);
504	}
505      if (context->max_errors != 0
506	  && ((unsigned) (diagnostic_kind_count (context, DK_ERROR)
507			  + diagnostic_kind_count (context, DK_SORRY)
508			  + diagnostic_kind_count (context, DK_WERROR))
509	      >= context->max_errors))
510	{
511	  fnotice (stderr,
512		   "compilation terminated due to -fmax-errors=%u.\n",
513		   context->max_errors);
514	  diagnostic_finish (context);
515	  exit (FATAL_EXIT_CODE);
516	}
517      break;
518
519    case DK_ICE:
520    case DK_ICE_NOBT:
521      {
522	struct backtrace_state *state = NULL;
523	if (diag_kind == DK_ICE)
524	  state = backtrace_create_state (NULL, 0, bt_err_callback, NULL);
525	int count = 0;
526	if (state != NULL)
527	  backtrace_full (state, 2, bt_callback, bt_err_callback,
528			  (void *) &count);
529
530	if (context->abort_on_error)
531	  real_abort ();
532
533	fnotice (stderr, "Please submit a full bug report,\n"
534		 "with preprocessed source if appropriate.\n");
535	if (count > 0)
536	  fnotice (stderr,
537		   ("Please include the complete backtrace "
538		    "with any bug report.\n"));
539	fnotice (stderr, "See %s for instructions.\n", bug_report_url);
540
541	exit (ICE_EXIT_CODE);
542      }
543
544    case DK_FATAL:
545      if (context->abort_on_error)
546	real_abort ();
547      diagnostic_finish (context);
548      fnotice (stderr, "compilation terminated.\n");
549      exit (FATAL_EXIT_CODE);
550
551    default:
552      gcc_unreachable ();
553    }
554}
555
556void
557diagnostic_report_current_module (diagnostic_context *context, location_t where)
558{
559  const struct line_map *map = NULL;
560
561  if (pp_needs_newline (context->printer))
562    {
563      pp_newline (context->printer);
564      pp_needs_newline (context->printer) = false;
565    }
566
567  if (where <= BUILTINS_LOCATION)
568    return;
569
570  linemap_resolve_location (line_table, where,
571			    LRK_MACRO_DEFINITION_LOCATION,
572			    &map);
573
574  if (map && diagnostic_last_module_changed (context, map))
575    {
576      diagnostic_set_last_module (context, map);
577      if (! MAIN_FILE_P (map))
578	{
579	  map = INCLUDED_FROM (line_table, map);
580	  if (context->show_column)
581	    pp_verbatim (context->printer,
582			 "In file included from %r%s:%d:%d%R", "locus",
583			 LINEMAP_FILE (map),
584			 LAST_SOURCE_LINE (map), LAST_SOURCE_COLUMN (map));
585	  else
586	    pp_verbatim (context->printer,
587			 "In file included from %r%s:%d%R", "locus",
588			 LINEMAP_FILE (map), LAST_SOURCE_LINE (map));
589	  while (! MAIN_FILE_P (map))
590	    {
591	      map = INCLUDED_FROM (line_table, map);
592	      pp_verbatim (context->printer,
593			   ",\n                 from %r%s:%d%R", "locus",
594			   LINEMAP_FILE (map), LAST_SOURCE_LINE (map));
595	    }
596	  pp_verbatim (context->printer, ":");
597	  pp_newline (context->printer);
598	}
599    }
600}
601
602void
603default_diagnostic_starter (diagnostic_context *context,
604			    diagnostic_info *diagnostic)
605{
606  diagnostic_report_current_module (context, diagnostic->location);
607  pp_set_prefix (context->printer, diagnostic_build_prefix (context,
608							    diagnostic));
609}
610
611void
612default_diagnostic_finalizer (diagnostic_context *context,
613			      diagnostic_info *diagnostic)
614{
615  diagnostic_show_locus (context, diagnostic);
616  pp_destroy_prefix (context->printer);
617  pp_newline_and_flush (context->printer);
618}
619
620/* Interface to specify diagnostic kind overrides.  Returns the
621   previous setting, or DK_UNSPECIFIED if the parameters are out of
622   range.  If OPTION_INDEX is zero, the new setting is for all the
623   diagnostics.  */
624diagnostic_t
625diagnostic_classify_diagnostic (diagnostic_context *context,
626				int option_index,
627				diagnostic_t new_kind,
628				location_t where)
629{
630  diagnostic_t old_kind;
631
632  if (option_index < 0
633      || option_index >= context->n_opts
634      || new_kind >= DK_LAST_DIAGNOSTIC_KIND)
635    return DK_UNSPECIFIED;
636
637  old_kind = context->classify_diagnostic[option_index];
638
639  /* Handle pragmas separately, since we need to keep track of *where*
640     the pragmas were.  */
641  if (where != UNKNOWN_LOCATION)
642    {
643      int i;
644
645      /* Record the command-line status, so we can reset it back on DK_POP. */
646      if (old_kind == DK_UNSPECIFIED)
647	{
648	  old_kind = !context->option_enabled (option_index,
649					       context->option_state)
650	    ? DK_IGNORED : (context->warning_as_error_requested
651			    ? DK_ERROR : DK_WARNING);
652	  context->classify_diagnostic[option_index] = old_kind;
653	}
654
655      for (i = context->n_classification_history - 1; i >= 0; i --)
656	if (context->classification_history[i].option == option_index)
657	  {
658	    old_kind = context->classification_history[i].kind;
659	    break;
660	  }
661
662      i = context->n_classification_history;
663      context->classification_history =
664	(diagnostic_classification_change_t *) xrealloc (context->classification_history, (i + 1)
665							 * sizeof (diagnostic_classification_change_t));
666      context->classification_history[i].location = where;
667      context->classification_history[i].option = option_index;
668      context->classification_history[i].kind = new_kind;
669      context->n_classification_history ++;
670    }
671  else
672    context->classify_diagnostic[option_index] = new_kind;
673
674  return old_kind;
675}
676
677/* Save all diagnostic classifications in a stack.  */
678void
679diagnostic_push_diagnostics (diagnostic_context *context, location_t where ATTRIBUTE_UNUSED)
680{
681  context->push_list = (int *) xrealloc (context->push_list, (context->n_push + 1) * sizeof (int));
682  context->push_list[context->n_push ++] = context->n_classification_history;
683}
684
685/* Restore the topmost classification set off the stack.  If the stack
686   is empty, revert to the state based on command line parameters.  */
687void
688diagnostic_pop_diagnostics (diagnostic_context *context, location_t where)
689{
690  int jump_to;
691  int i;
692
693  if (context->n_push)
694    jump_to = context->push_list [-- context->n_push];
695  else
696    jump_to = 0;
697
698  i = context->n_classification_history;
699  context->classification_history =
700    (diagnostic_classification_change_t *) xrealloc (context->classification_history, (i + 1)
701						     * sizeof (diagnostic_classification_change_t));
702  context->classification_history[i].location = where;
703  context->classification_history[i].option = jump_to;
704  context->classification_history[i].kind = DK_POP;
705  context->n_classification_history ++;
706}
707
708/* Report a diagnostic message (an error or a warning) as specified by
709   DC.  This function is *the* subroutine in terms of which front-ends
710   should implement their specific diagnostic handling modules.  The
711   front-end independent format specifiers are exactly those described
712   in the documentation of output_format.
713   Return true if a diagnostic was printed, false otherwise.  */
714
715bool
716diagnostic_report_diagnostic (diagnostic_context *context,
717			      diagnostic_info *diagnostic)
718{
719  location_t location = diagnostic->location;
720  diagnostic_t orig_diag_kind = diagnostic->kind;
721  const char *saved_format_spec;
722
723  /* Give preference to being able to inhibit warnings, before they
724     get reclassified to something else.  */
725  if ((diagnostic->kind == DK_WARNING || diagnostic->kind == DK_PEDWARN)
726      && !diagnostic_report_warnings_p (context, location))
727    return false;
728
729  if (diagnostic->kind == DK_PEDWARN)
730    {
731      diagnostic->kind = pedantic_warning_kind (context);
732      /* We do this to avoid giving the message for -pedantic-errors.  */
733      orig_diag_kind = diagnostic->kind;
734    }
735
736  if (diagnostic->kind == DK_NOTE && context->inhibit_notes_p)
737    return false;
738
739  if (context->lock > 0)
740    {
741      /* If we're reporting an ICE in the middle of some other error,
742	 try to flush out the previous error, then let this one
743	 through.  Don't do this more than once.  */
744      if ((diagnostic->kind == DK_ICE || diagnostic->kind == DK_ICE_NOBT)
745	  && context->lock == 1)
746	pp_newline_and_flush (context->printer);
747      else
748	error_recursion (context);
749    }
750
751  /* If the user requested that warnings be treated as errors, so be
752     it.  Note that we do this before the next block so that
753     individual warnings can be overridden back to warnings with
754     -Wno-error=*.  */
755  if (context->warning_as_error_requested
756      && diagnostic->kind == DK_WARNING)
757    {
758      diagnostic->kind = DK_ERROR;
759    }
760
761  if (diagnostic->option_index
762      && diagnostic->option_index != permissive_error_option (context))
763    {
764      diagnostic_t diag_class = DK_UNSPECIFIED;
765
766      /* This tests if the user provided the appropriate -Wfoo or
767	 -Wno-foo option.  */
768      if (! context->option_enabled (diagnostic->option_index,
769				     context->option_state))
770	return false;
771
772      /* This tests for #pragma diagnostic changes.  */
773      if (context->n_classification_history > 0)
774	{
775	  /* FIXME: Stupid search.  Optimize later. */
776	  for (int i = context->n_classification_history - 1; i >= 0; i --)
777	    {
778	      if (linemap_location_before_p
779		  (line_table,
780		   context->classification_history[i].location,
781		   location))
782		{
783		  if (context->classification_history[i].kind == (int) DK_POP)
784		    {
785		      i = context->classification_history[i].option;
786		      continue;
787		    }
788		  int option = context->classification_history[i].option;
789		  /* The option 0 is for all the diagnostics.  */
790		  if (option == 0 || option == diagnostic->option_index)
791		    {
792		      diag_class = context->classification_history[i].kind;
793		      if (diag_class != DK_UNSPECIFIED)
794			diagnostic->kind = diag_class;
795		      break;
796		    }
797		}
798	    }
799	}
800      /* This tests if the user provided the appropriate -Werror=foo
801	 option.  */
802      if (diag_class == DK_UNSPECIFIED
803	  && context->classify_diagnostic[diagnostic->option_index] != DK_UNSPECIFIED)
804	{
805	  diagnostic->kind = context->classify_diagnostic[diagnostic->option_index];
806	}
807      /* This allows for future extensions, like temporarily disabling
808	 warnings for ranges of source code.  */
809      if (diagnostic->kind == DK_IGNORED)
810	return false;
811    }
812
813  context->lock++;
814
815  if (diagnostic->kind == DK_ICE || diagnostic->kind == DK_ICE_NOBT)
816    {
817#ifndef ENABLE_CHECKING
818      /* When not checking, ICEs are converted to fatal errors when an
819	 error has already occurred.  This is counteracted by
820	 abort_on_error.  */
821      if ((diagnostic_kind_count (context, DK_ERROR) > 0
822	   || diagnostic_kind_count (context, DK_SORRY) > 0)
823	  && !context->abort_on_error)
824	{
825	  expanded_location s = expand_location (diagnostic->location);
826	  fnotice (stderr, "%s:%d: confused by earlier errors, bailing out\n",
827		   s.file, s.line);
828	  exit (ICE_EXIT_CODE);
829	}
830#endif
831      if (context->internal_error)
832	(*context->internal_error) (context,
833				    diagnostic->message.format_spec,
834				    diagnostic->message.args_ptr);
835    }
836  if (diagnostic->kind == DK_ERROR && orig_diag_kind == DK_WARNING)
837    ++diagnostic_kind_count (context, DK_WERROR);
838  else
839    ++diagnostic_kind_count (context, diagnostic->kind);
840
841  saved_format_spec = diagnostic->message.format_spec;
842  if (context->show_option_requested)
843    {
844      char *option_text;
845
846      option_text = context->option_name (context, diagnostic->option_index,
847					  orig_diag_kind, diagnostic->kind);
848
849      if (option_text)
850	{
851	  diagnostic->message.format_spec
852	    = ACONCAT ((diagnostic->message.format_spec,
853			" ",
854			"[", option_text, "]",
855			NULL));
856	  free (option_text);
857	}
858    }
859  diagnostic->message.locus = &diagnostic->location;
860  diagnostic->message.x_data = &diagnostic->x_data;
861  diagnostic->x_data = NULL;
862  pp_format (context->printer, &diagnostic->message);
863  (*diagnostic_starter (context)) (context, diagnostic);
864  pp_output_formatted_text (context->printer);
865  (*diagnostic_finalizer (context)) (context, diagnostic);
866  diagnostic_action_after_output (context, diagnostic->kind);
867  diagnostic->message.format_spec = saved_format_spec;
868  diagnostic->x_data = NULL;
869
870  context->lock--;
871
872  return true;
873}
874
875/* Given a partial pathname as input, return another pathname that
876   shares no directory elements with the pathname of __FILE__.  This
877   is used by fancy_abort() to print `Internal compiler error in expr.c'
878   instead of `Internal compiler error in ../../GCC/gcc/expr.c'.  */
879
880const char *
881trim_filename (const char *name)
882{
883  static const char this_file[] = __FILE__;
884  const char *p = name, *q = this_file;
885
886  /* First skip any "../" in each filename.  This allows us to give a proper
887     reference to a file in a subdirectory.  */
888  while (p[0] == '.' && p[1] == '.' && IS_DIR_SEPARATOR (p[2]))
889    p += 3;
890
891  while (q[0] == '.' && q[1] == '.' && IS_DIR_SEPARATOR (q[2]))
892    q += 3;
893
894  /* Now skip any parts the two filenames have in common.  */
895  while (*p == *q && *p != 0 && *q != 0)
896    p++, q++;
897
898  /* Now go backwards until the previous directory separator.  */
899  while (p > name && !IS_DIR_SEPARATOR (p[-1]))
900    p--;
901
902  return p;
903}
904
905/* Standard error reporting routines in increasing order of severity.
906   All of these take arguments like printf.  */
907
908/* Text to be emitted verbatim to the error message stream; this
909   produces no prefix and disables line-wrapping.  Use rarely.  */
910void
911verbatim (const char *gmsgid, ...)
912{
913  text_info text;
914  va_list ap;
915
916  va_start (ap, gmsgid);
917  text.err_no = errno;
918  text.args_ptr = &ap;
919  text.format_spec = _(gmsgid);
920  text.locus = NULL;
921  text.x_data = NULL;
922  pp_format_verbatim (global_dc->printer, &text);
923  pp_newline_and_flush (global_dc->printer);
924  va_end (ap);
925}
926
927/* Add a note with text GMSGID and with LOCATION to the diagnostic CONTEXT.  */
928void
929diagnostic_append_note (diagnostic_context *context,
930                        location_t location,
931                        const char * gmsgid, ...)
932{
933  diagnostic_info diagnostic;
934  va_list ap;
935  const char *saved_prefix;
936
937  va_start (ap, gmsgid);
938  diagnostic_set_info (&diagnostic, gmsgid, &ap, location, DK_NOTE);
939  if (context->inhibit_notes_p)
940    {
941      va_end (ap);
942      return;
943    }
944  saved_prefix = pp_get_prefix (context->printer);
945  pp_set_prefix (context->printer,
946                 diagnostic_build_prefix (context, &diagnostic));
947  pp_newline (context->printer);
948  pp_format (context->printer, &diagnostic.message);
949  pp_output_formatted_text (context->printer);
950  pp_destroy_prefix (context->printer);
951  pp_set_prefix (context->printer, saved_prefix);
952  diagnostic_show_locus (context, &diagnostic);
953  va_end (ap);
954}
955
956bool
957emit_diagnostic (diagnostic_t kind, location_t location, int opt,
958		 const char *gmsgid, ...)
959{
960  diagnostic_info diagnostic;
961  va_list ap;
962  bool ret;
963
964  va_start (ap, gmsgid);
965  if (kind == DK_PERMERROR)
966    {
967      diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
968			   permissive_error_kind (global_dc));
969      diagnostic.option_index = permissive_error_option (global_dc);
970    }
971  else {
972      diagnostic_set_info (&diagnostic, gmsgid, &ap, location, kind);
973      if (kind == DK_WARNING || kind == DK_PEDWARN)
974	diagnostic.option_index = opt;
975  }
976
977  ret = report_diagnostic (&diagnostic);
978  va_end (ap);
979  return ret;
980}
981
982/* An informative note at LOCATION.  Use this for additional details on an error
983   message.  */
984void
985inform (location_t location, const char *gmsgid, ...)
986{
987  diagnostic_info diagnostic;
988  va_list ap;
989
990  va_start (ap, gmsgid);
991  diagnostic_set_info (&diagnostic, gmsgid, &ap, location, DK_NOTE);
992  report_diagnostic (&diagnostic);
993  va_end (ap);
994}
995
996/* An informative note at LOCATION.  Use this for additional details on an
997   error message.  */
998void
999inform_n (location_t location, int n, const char *singular_gmsgid,
1000          const char *plural_gmsgid, ...)
1001{
1002  diagnostic_info diagnostic;
1003  va_list ap;
1004
1005  va_start (ap, plural_gmsgid);
1006  diagnostic_set_info_translated (&diagnostic,
1007                                  ngettext (singular_gmsgid, plural_gmsgid, n),
1008                                  &ap, location, DK_NOTE);
1009  report_diagnostic (&diagnostic);
1010  va_end (ap);
1011}
1012
1013/* A warning at INPUT_LOCATION.  Use this for code which is correct according
1014   to the relevant language specification but is likely to be buggy anyway.
1015   Returns true if the warning was printed, false if it was inhibited.  */
1016bool
1017warning (int opt, const char *gmsgid, ...)
1018{
1019  diagnostic_info diagnostic;
1020  va_list ap;
1021  bool ret;
1022
1023  va_start (ap, gmsgid);
1024  diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_WARNING);
1025  diagnostic.option_index = opt;
1026
1027  ret = report_diagnostic (&diagnostic);
1028  va_end (ap);
1029  return ret;
1030}
1031
1032/* A warning at LOCATION.  Use this for code which is correct according to the
1033   relevant language specification but is likely to be buggy anyway.
1034   Returns true if the warning was printed, false if it was inhibited.  */
1035
1036bool
1037warning_at (location_t location, int opt, const char *gmsgid, ...)
1038{
1039  diagnostic_info diagnostic;
1040  va_list ap;
1041  bool ret;
1042
1043  va_start (ap, gmsgid);
1044  diagnostic_set_info (&diagnostic, gmsgid, &ap, location, DK_WARNING);
1045  diagnostic.option_index = opt;
1046  ret = report_diagnostic (&diagnostic);
1047  va_end (ap);
1048  return ret;
1049}
1050
1051/* A warning at LOCATION.  Use this for code which is correct according to the
1052   relevant language specification but is likely to be buggy anyway.
1053   Returns true if the warning was printed, false if it was inhibited.  */
1054
1055bool
1056warning_n (location_t location, int opt, int n, const char *singular_gmsgid,
1057	   const char *plural_gmsgid, ...)
1058{
1059  diagnostic_info diagnostic;
1060  va_list ap;
1061  bool ret;
1062
1063  va_start (ap, plural_gmsgid);
1064  diagnostic_set_info_translated (&diagnostic,
1065                                  ngettext (singular_gmsgid, plural_gmsgid, n),
1066                                  &ap, location, DK_WARNING);
1067  diagnostic.option_index = opt;
1068  ret = report_diagnostic (&diagnostic);
1069  va_end (ap);
1070  return ret;
1071}
1072
1073/* A "pedantic" warning at LOCATION: issues a warning unless
1074   -pedantic-errors was given on the command line, in which case it
1075   issues an error.  Use this for diagnostics required by the relevant
1076   language standard, if you have chosen not to make them errors.
1077
1078   Note that these diagnostics are issued independent of the setting
1079   of the -Wpedantic command-line switch.  To get a warning enabled
1080   only with that switch, use either "if (pedantic) pedwarn
1081   (OPT_Wpedantic,...)" or just "pedwarn (OPT_Wpedantic,..)".  To get a
1082   pedwarn independently of the -Wpedantic switch use "pedwarn (0,...)".
1083
1084   Returns true if the warning was printed, false if it was inhibited.  */
1085
1086bool
1087pedwarn (location_t location, int opt, const char *gmsgid, ...)
1088{
1089  diagnostic_info diagnostic;
1090  va_list ap;
1091  bool ret;
1092
1093  va_start (ap, gmsgid);
1094  diagnostic_set_info (&diagnostic, gmsgid, &ap, location,  DK_PEDWARN);
1095  diagnostic.option_index = opt;
1096  ret = report_diagnostic (&diagnostic);
1097  va_end (ap);
1098  return ret;
1099}
1100
1101/* A "permissive" error at LOCATION: issues an error unless
1102   -fpermissive was given on the command line, in which case it issues
1103   a warning.  Use this for things that really should be errors but we
1104   want to support legacy code.
1105
1106   Returns true if the warning was printed, false if it was inhibited.  */
1107
1108bool
1109permerror (location_t location, const char *gmsgid, ...)
1110{
1111  diagnostic_info diagnostic;
1112  va_list ap;
1113  bool ret;
1114
1115  va_start (ap, gmsgid);
1116  diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
1117                       permissive_error_kind (global_dc));
1118  diagnostic.option_index = permissive_error_option (global_dc);
1119  ret = report_diagnostic (&diagnostic);
1120  va_end (ap);
1121  return ret;
1122}
1123
1124/* A hard error: the code is definitely ill-formed, and an object file
1125   will not be produced.  */
1126void
1127error (const char *gmsgid, ...)
1128{
1129  diagnostic_info diagnostic;
1130  va_list ap;
1131
1132  va_start (ap, gmsgid);
1133  diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ERROR);
1134  report_diagnostic (&diagnostic);
1135  va_end (ap);
1136}
1137
1138/* A hard error: the code is definitely ill-formed, and an object file
1139   will not be produced.  */
1140void
1141error_n (location_t location, int n, const char *singular_gmsgid,
1142         const char *plural_gmsgid, ...)
1143{
1144  diagnostic_info diagnostic;
1145  va_list ap;
1146
1147  va_start (ap, plural_gmsgid);
1148  diagnostic_set_info_translated (&diagnostic,
1149                                  ngettext (singular_gmsgid, plural_gmsgid, n),
1150                                  &ap, location, DK_ERROR);
1151  report_diagnostic (&diagnostic);
1152  va_end (ap);
1153}
1154
1155/* Same as ebove, but use location LOC instead of input_location.  */
1156void
1157error_at (location_t loc, const char *gmsgid, ...)
1158{
1159  diagnostic_info diagnostic;
1160  va_list ap;
1161
1162  va_start (ap, gmsgid);
1163  diagnostic_set_info (&diagnostic, gmsgid, &ap, loc, DK_ERROR);
1164  report_diagnostic (&diagnostic);
1165  va_end (ap);
1166}
1167
1168/* "Sorry, not implemented."  Use for a language feature which is
1169   required by the relevant specification but not implemented by GCC.
1170   An object file will not be produced.  */
1171void
1172sorry (const char *gmsgid, ...)
1173{
1174  diagnostic_info diagnostic;
1175  va_list ap;
1176
1177  va_start (ap, gmsgid);
1178  diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_SORRY);
1179  report_diagnostic (&diagnostic);
1180  va_end (ap);
1181}
1182
1183/* Return true if an error or a "sorry" has been seen.  Various
1184   processing is disabled after errors.  */
1185bool
1186seen_error (void)
1187{
1188  return errorcount || sorrycount;
1189}
1190
1191/* An error which is severe enough that we make no attempt to
1192   continue.  Do not use this for internal consistency checks; that's
1193   internal_error.  Use of this function should be rare.  */
1194void
1195fatal_error (location_t loc, const char *gmsgid, ...)
1196{
1197  diagnostic_info diagnostic;
1198  va_list ap;
1199
1200  va_start (ap, gmsgid);
1201  diagnostic_set_info (&diagnostic, gmsgid, &ap, loc, DK_FATAL);
1202  report_diagnostic (&diagnostic);
1203  va_end (ap);
1204
1205  gcc_unreachable ();
1206}
1207
1208/* An internal consistency check has failed.  We make no attempt to
1209   continue.  Note that unless there is debugging value to be had from
1210   a more specific message, or some other good reason, you should use
1211   abort () instead of calling this function directly.  */
1212void
1213internal_error (const char *gmsgid, ...)
1214{
1215  diagnostic_info diagnostic;
1216  va_list ap;
1217
1218  va_start (ap, gmsgid);
1219  diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ICE);
1220  report_diagnostic (&diagnostic);
1221  va_end (ap);
1222
1223  gcc_unreachable ();
1224}
1225
1226/* Like internal_error, but no backtrace will be printed.  Used when
1227   the internal error does not happen at the current location, but happened
1228   somewhere else.  */
1229void
1230internal_error_no_backtrace (const char *gmsgid, ...)
1231{
1232  diagnostic_info diagnostic;
1233  va_list ap;
1234
1235  va_start (ap, gmsgid);
1236  diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ICE_NOBT);
1237  report_diagnostic (&diagnostic);
1238  va_end (ap);
1239
1240  gcc_unreachable ();
1241}
1242
1243/* Special case error functions.  Most are implemented in terms of the
1244   above, or should be.  */
1245
1246/* Print a diagnostic MSGID on FILE.  This is just fprintf, except it
1247   runs its second argument through gettext.  */
1248void
1249fnotice (FILE *file, const char *cmsgid, ...)
1250{
1251  va_list ap;
1252
1253  va_start (ap, cmsgid);
1254  vfprintf (file, _(cmsgid), ap);
1255  va_end (ap);
1256}
1257
1258/* Inform the user that an error occurred while trying to report some
1259   other error.  This indicates catastrophic internal inconsistencies,
1260   so give up now.  But do try to flush out the previous error.
1261   This mustn't use internal_error, that will cause infinite recursion.  */
1262
1263static void
1264error_recursion (diagnostic_context *context)
1265{
1266  if (context->lock < 3)
1267    pp_newline_and_flush (context->printer);
1268
1269  fnotice (stderr,
1270	   "Internal compiler error: Error reporting routines re-entered.\n");
1271
1272  /* Call diagnostic_action_after_output to get the "please submit a bug
1273     report" message.  */
1274  diagnostic_action_after_output (context, DK_ICE);
1275
1276  /* Do not use gcc_unreachable here; that goes through internal_error
1277     and therefore would cause infinite recursion.  */
1278  real_abort ();
1279}
1280
1281/* Report an internal compiler error in a friendly manner.  This is
1282   the function that gets called upon use of abort() in the source
1283   code generally, thanks to a special macro.  */
1284
1285void
1286fancy_abort (const char *file, int line, const char *function)
1287{
1288  internal_error ("in %s, at %s:%d", function, trim_filename (file), line);
1289}
1290
1291/* Really call the system 'abort'.  This has to go right at the end of
1292   this file, so that there are no functions after it that call abort
1293   and get the system abort instead of our macro.  */
1294#undef abort
1295static void
1296real_abort (void)
1297{
1298  abort ();
1299}
1300