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