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