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 = ≈
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