]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/diagnostic.c
Update copyright years.
[thirdparty/gcc.git] / gcc / diagnostic.c
CommitLineData
25e2ffe1 1/* Language-independent diagnostic subroutines for the GNU Compiler Collection
fbd26352 2 Copyright (C) 1999-2019 Free Software Foundation, Inc.
dfac2e0f 3 Contributed by Gabriel Dos Reis <gdr@codesourcery.com>
076f8fe1 4
f12b58b3 5This file is part of GCC.
076f8fe1 6
f12b58b3 7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
8c4c00c1 9Software Foundation; either version 3, or (at your option) any later
f12b58b3 10version.
076f8fe1 11
f12b58b3 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
076f8fe1 16
17You should have received a copy of the GNU General Public License
8c4c00c1 18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
076f8fe1 20
21
9588521d 22/* This file implements the language independent aspect of diagnostic
076f8fe1 23 message module. */
24
25#include "config.h"
076f8fe1 26#include "system.h"
805e22b2 27#include "coretypes.h"
af225e7d 28#include "version.h"
3f425711 29#include "demangle.h"
076f8fe1 30#include "intl.h"
3f425711 31#include "backtrace.h"
993ca5a5 32#include "diagnostic.h"
41609f8b 33#include "diagnostic-color.h"
40a431fa 34#include "edit-context.h"
6628b04d 35#include "selftest.h"
fd3a7b2d 36#include "selftest-diagnostic.h"
076f8fe1 37
de96a063 38#ifdef HAVE_TERMIOS_H
39# include <termios.h>
40#endif
41
42#ifdef GWINSZ_IN_SYS_IOCTL
43# include <sys/ioctl.h>
44#endif
45
2c2efebb 46#define pedantic_warning_kind(DC) \
47 ((DC)->pedantic_errors ? DK_ERROR : DK_WARNING)
48#define permissive_error_kind(DC) ((DC)->permissive ? DK_WARNING : DK_ERROR)
3c6a9715 49#define permissive_error_option(DC) ((DC)->opt_permissive)
d252af3e 50
6312a35e 51/* Prototypes. */
a262d9cd 52static bool diagnostic_impl (rich_location *, int, const char *,
53 va_list *, diagnostic_t) ATTRIBUTE_GCC_DIAG(3,0);
f4e3e4b1 54static bool diagnostic_n_impl (rich_location *, int, unsigned HOST_WIDE_INT,
55 const char *, const char *, va_list *,
a262d9cd 56 diagnostic_t) ATTRIBUTE_GCC_DIAG(5,0);
c43f5e5c 57
d598ad0d 58static void error_recursion (diagnostic_context *) ATTRIBUTE_NORETURN;
d598ad0d 59static void real_abort (void) ATTRIBUTE_NORETURN;
19fafbd3 60
852f689e 61/* Name of program invoked, sans directories. */
62
63const char *progname;
64
ce601f29 65/* A diagnostic_context surrogate for stderr. */
66static diagnostic_context global_diagnostic_context;
67diagnostic_context *global_dc = &global_diagnostic_context;
076f8fe1 68\f
2faf8f38 69/* Return a malloc'd string containing MSG formatted a la printf. The
70 caller is responsible for freeing the memory. */
dc8078a3 71char *
ee582a61 72build_message_string (const char *msg, ...)
104d5c0c 73{
2f5d30d9 74 char *str;
ee582a61 75 va_list ap;
104d5c0c 76
ee582a61 77 va_start (ap, msg);
5e9ac72e 78 str = xvasprintf (msg, ap);
ee582a61 79 va_end (ap);
104d5c0c 80
81 return str;
82}
83
d716ce75 84/* Same as diagnostic_build_prefix, but only the source FILE is given. */
b9995fca 85char *
2cafe211 86file_name_as_prefix (diagnostic_context *context, const char *f)
b9995fca 87{
2cafe211 88 const char *locus_cs
89 = colorize_start (pp_show_color (context->printer), "locus");
90 const char *locus_ce = colorize_stop (pp_show_color (context->printer));
91 return build_message_string ("%s%s:%s ", locus_cs, f, locus_ce);
b9995fca 92}
93
25e2ffe1 94
076f8fe1 95\f
5a983084 96/* Return the value of the getenv("COLUMNS") as an integer. If the
de96a063 97 value is not set to a positive integer, use ioctl to get the
98 terminal width. If it fails, return INT_MAX. */
99int
100get_terminal_width (void)
5a983084 101{
102 const char * s = getenv ("COLUMNS");
103 if (s != NULL) {
104 int n = atoi (s);
105 if (n > 0)
106 return n;
107 }
de96a063 108
109#ifdef TIOCGWINSZ
110 struct winsize w;
111 w.ws_col = 0;
112 if (ioctl (0, TIOCGWINSZ, &w) == 0 && w.ws_col > 0)
113 return w.ws_col;
114#endif
115
5a983084 116 return INT_MAX;
117}
118
119/* Set caret_max_width to value. */
120void
121diagnostic_set_caret_max_width (diagnostic_context *context, int value)
122{
123 /* One minus to account for the leading empty space. */
124 value = value ? value - 1
6f07f480 125 : (isatty (fileno (pp_buffer (context->printer)->stream))
de96a063 126 ? get_terminal_width () - 1: INT_MAX);
5a983084 127
128 if (value <= 0)
129 value = INT_MAX;
130
131 context->caret_max_width = value;
132}
133
1bcc5c64 134/* Default implementation of final_cb. */
135
136static void
137default_diagnostic_final_cb (diagnostic_context *context)
138{
139 /* Some of the errors may actually have been warnings. */
140 if (diagnostic_kind_count (context, DK_WERROR))
141 {
142 /* -Werror was given. */
143 if (context->warning_as_error_requested)
144 pp_verbatim (context->printer,
145 _("%s: all warnings being treated as errors"),
146 progname);
147 /* At least one -Werror= was given. */
148 else
149 pp_verbatim (context->printer,
150 _("%s: some warnings being treated as errors"),
151 progname);
152 pp_newline_and_flush (context->printer);
153 }
154}
155
25e2ffe1 156/* Initialize the diagnostic message outputting machinery. */
157void
3c6a9715 158diagnostic_initialize (diagnostic_context *context, int n_opts)
25e2ffe1 159{
3c6a9715 160 int i;
161
aa6db498 162 /* Allocate a basic pretty-printer. Clients will replace this a
163 much more elaborated pretty-printer if they wish. */
4c36ffe6 164 context->printer = XNEW (pretty_printer);
eed6bc21 165 new (context->printer) pretty_printer ();
25e2ffe1 166
aa6db498 167 memset (context->diagnostic_count, 0, sizeof context->diagnostic_count);
096f40ca 168 context->warning_as_error_requested = false;
3c6a9715 169 context->n_opts = n_opts;
170 context->classify_diagnostic = XNEWVEC (diagnostic_t, n_opts);
171 for (i = 0; i < n_opts; i++)
172 context->classify_diagnostic[i] = DK_UNSPECIFIED;
5a983084 173 context->show_caret = false;
174 diagnostic_set_caret_max_width (context, pp_line_cutoff (context->printer));
d6dd1b60 175 for (i = 0; i < rich_location::STATICALLY_ALLOCATED_RANGES; i++)
389a9009 176 context->caret_chars[i] = '^';
b0932b2f 177 context->show_option_requested = false;
aa6db498 178 context->abort_on_error = false;
3c6a9715 179 context->show_column = false;
180 context->pedantic_errors = false;
181 context->permissive = false;
182 context->opt_permissive = 0;
183 context->fatal_errors = false;
5ae82d58 184 context->dc_inhibit_warnings = false;
185 context->dc_warn_system_headers = false;
566d7c74 186 context->max_errors = 0;
aa6db498 187 context->internal_error = NULL;
25e2ffe1 188 diagnostic_starter (context) = default_diagnostic_starter;
aec1f4bd 189 context->start_span = default_diagnostic_start_span_fn;
25e2ffe1 190 diagnostic_finalizer (context) = default_diagnostic_finalizer;
3c6a9715 191 context->option_enabled = NULL;
2c5d2e39 192 context->option_state = NULL;
3c6a9715 193 context->option_name = NULL;
d834564a 194 context->last_location = UNKNOWN_LOCATION;
aa6db498 195 context->last_module = 0;
ce084dfc 196 context->x_data = NULL;
aa6db498 197 context->lock = 0;
16b4d5bb 198 context->inhibit_notes_p = false;
48a7392b 199 context->colorize_source_p = false;
b7bb5264 200 context->show_labels_p = false;
ff7410b8 201 context->show_line_numbers_p = false;
31087b7e 202 context->min_margin_width = 0;
48a7392b 203 context->show_ruler_p = false;
204 context->parseable_fixits_p = false;
40a431fa 205 context->edit_context_ptr = NULL;
bc35ef65 206 context->diagnostic_group_nesting_depth = 0;
207 context->diagnostic_group_emission_count = 0;
208 context->begin_group_cb = NULL;
209 context->end_group_cb = NULL;
1bcc5c64 210 context->final_cb = default_diagnostic_final_cb;
25e2ffe1 211}
212
9b11544d 213/* Maybe initialize the color support. We require clients to do this
214 explicitly, since most clients don't want color. When called
215 without a VALUE, it initializes with DIAGNOSTICS_COLOR_DEFAULT. */
216
217void
218diagnostic_color_init (diagnostic_context *context, int value /*= -1 */)
219{
220 /* value == -1 is the default value. */
221 if (value < 0)
222 {
223 /* If DIAGNOSTICS_COLOR_DEFAULT is -1, default to
224 -fdiagnostics-color=auto if GCC_COLORS is in the environment,
225 otherwise default to -fdiagnostics-color=never, for other
226 values default to that
227 -fdiagnostics-color={never,auto,always}. */
228 if (DIAGNOSTICS_COLOR_DEFAULT == -1)
229 {
230 if (!getenv ("GCC_COLORS"))
231 return;
232 value = DIAGNOSTICS_COLOR_AUTO;
233 }
234 else
235 value = DIAGNOSTICS_COLOR_DEFAULT;
236 }
237 pp_show_color (context->printer)
238 = colorize_init ((diagnostic_color_rule_t) value);
239}
240
543725f3 241/* Do any cleaning up required after the last diagnostic is emitted. */
242
243void
244diagnostic_finish (diagnostic_context *context)
245{
1bcc5c64 246 if (context->final_cb)
247 context->final_cb (context);
ffc2c526 248
249 diagnostic_file_cache_fini ();
415309e2 250
251 XDELETEVEC (context->classify_diagnostic);
252 context->classify_diagnostic = NULL;
253
254 /* diagnostic_initialize allocates context->printer using XNEW
255 and placement-new. */
256 context->printer->~pretty_printer ();
257 XDELETE (context->printer);
258 context->printer = NULL;
40a431fa 259
260 if (context->edit_context_ptr)
261 {
262 delete context->edit_context_ptr;
263 context->edit_context_ptr = NULL;
264 }
543725f3 265}
266
eb0d20b7 267/* Initialize DIAGNOSTIC, where the message MSG has already been
268 translated. */
25e2ffe1 269void
eb0d20b7 270diagnostic_set_info_translated (diagnostic_info *diagnostic, const char *msg,
f0479000 271 va_list *args, rich_location *richloc,
eb0d20b7 272 diagnostic_t kind)
25e2ffe1 273{
f0479000 274 gcc_assert (richloc);
d07c9932 275 diagnostic->message.err_no = errno;
25e2ffe1 276 diagnostic->message.args_ptr = args;
eb0d20b7 277 diagnostic->message.format_spec = msg;
f0479000 278 diagnostic->message.m_richloc = richloc;
279 diagnostic->richloc = richloc;
25e2ffe1 280 diagnostic->kind = kind;
efb9d9ee 281 diagnostic->option_index = 0;
25e2ffe1 282}
283
eb0d20b7 284/* Initialize DIAGNOSTIC, where the message GMSGID has not yet been
285 translated. */
286void
287diagnostic_set_info (diagnostic_info *diagnostic, const char *gmsgid,
f0479000 288 va_list *args, rich_location *richloc,
eb0d20b7 289 diagnostic_t kind)
290{
f0479000 291 gcc_assert (richloc);
292 diagnostic_set_info_translated (diagnostic, _(gmsgid), args, richloc, kind);
293}
294
295static const char *const diagnostic_kind_color[] = {
296#define DEFINE_DIAGNOSTIC_KIND(K, T, C) (C),
297#include "diagnostic.def"
298#undef DEFINE_DIAGNOSTIC_KIND
299 NULL
300};
301
302/* Get a color name for diagnostics of type KIND
303 Result could be NULL. */
304
305const char *
306diagnostic_get_color_for_kind (diagnostic_t kind)
307{
308 return diagnostic_kind_color[kind];
eb0d20b7 309}
310
786bf3ad 311/* Return a formatted line and column ':%line:%column'. Elided if
312 zero. The result is a statically allocated buffer. */
313
314static const char *
315maybe_line_and_column (int line, int col)
316{
317 static char result[32];
318
319 if (line)
320 {
321 size_t l = snprintf (result, sizeof (result),
322 col ? ":%d:%d" : ":%d", line, col);
323 gcc_checking_assert (l < sizeof (result));
324 }
325 else
326 result[0] = 0;
327 return result;
328}
329
aec1f4bd 330/* Return a malloc'd string describing a location e.g. "foo.c:42:10".
331 The caller is responsible for freeing the memory. */
332
333static char *
334diagnostic_get_location_text (diagnostic_context *context,
335 expanded_location s)
336{
337 pretty_printer *pp = context->printer;
338 const char *locus_cs = colorize_start (pp_show_color (pp), "locus");
339 const char *locus_ce = colorize_stop (pp_show_color (pp));
786bf3ad 340 const char *file = s.file ? s.file : progname;
341 int line = strcmp (file, N_("<built-in>")) ? s.line : 0;
342 int col = context->show_column ? s.column : 0;
aec1f4bd 343
786bf3ad 344 const char *line_col = maybe_line_and_column (line, col);
345 return build_message_string ("%s%s%s:%s", locus_cs, file,
346 line_col, locus_ce);
aec1f4bd 347}
348
349/* Return a malloc'd string describing a location and the severity of the
350 diagnostic, e.g. "foo.c:42:10: error: ". The caller is responsible for
351 freeing the memory. */
25e2ffe1 352char *
2c2efebb 353diagnostic_build_prefix (diagnostic_context *context,
ff213692 354 const diagnostic_info *diagnostic)
25e2ffe1 355{
11a6a4d0 356 static const char *const diagnostic_kind_text[] = {
41609f8b 357#define DEFINE_DIAGNOSTIC_KIND(K, T, C) (T),
479f88cd 358#include "diagnostic.def"
359#undef DEFINE_DIAGNOSTIC_KIND
360 "must-not-happen"
361 };
aa47f95a 362 gcc_assert (diagnostic->kind < DK_LAST_DIAGNOSTIC_KIND);
363
5cf56417 364 const char *text = _(diagnostic_kind_text[diagnostic->kind]);
41609f8b 365 const char *text_cs = "", *text_ce = "";
41609f8b 366 pretty_printer *pp = context->printer;
367
368 if (diagnostic_kind_color[diagnostic->kind])
369 {
370 text_cs = colorize_start (pp_show_color (pp),
371 diagnostic_kind_color[diagnostic->kind]);
372 text_ce = colorize_stop (pp_show_color (pp));
373 }
41609f8b 374
aa47f95a 375 expanded_location s = diagnostic_expand_location (diagnostic);
aec1f4bd 376 char *location_text = diagnostic_get_location_text (context, s);
377
378 char *result = build_message_string ("%s %s%s%s", location_text,
379 text_cs, text, text_ce);
380 free (location_text);
381 return result;
25e2ffe1 382}
383
3f425711 384/* Functions at which to stop the backtrace print. It's not
385 particularly helpful to print the callers of these functions. */
386
387static const char * const bt_stop[] =
388{
389 "main",
415309e2 390 "toplev::main",
3f425711 391 "execute_one_pass",
392 "compile_file",
393};
394
395/* A callback function passed to the backtrace_full function. */
396
397static int
398bt_callback (void *data, uintptr_t pc, const char *filename, int lineno,
399 const char *function)
400{
401 int *pcount = (int *) data;
402
403 /* If we don't have any useful information, don't print
404 anything. */
405 if (filename == NULL && function == NULL)
406 return 0;
407
408 /* Skip functions in diagnostic.c. */
409 if (*pcount == 0
410 && filename != NULL
9af5ce0c 411 && strcmp (lbasename (filename), "diagnostic.c") == 0)
3f425711 412 return 0;
413
414 /* Print up to 20 functions. We could make this a --param, but
415 since this is only for debugging just use a constant for now. */
416 if (*pcount >= 20)
417 {
418 /* Returning a non-zero value stops the backtrace. */
419 return 1;
420 }
421 ++*pcount;
422
423 char *alc = NULL;
424 if (function != NULL)
425 {
426 char *str = cplus_demangle_v3 (function,
427 (DMGL_VERBOSE | DMGL_ANSI
428 | DMGL_GNU_V3 | DMGL_PARAMS));
429 if (str != NULL)
430 {
431 alc = str;
432 function = str;
433 }
434
435 for (size_t i = 0; i < ARRAY_SIZE (bt_stop); ++i)
436 {
437 size_t len = strlen (bt_stop[i]);
438 if (strncmp (function, bt_stop[i], len) == 0
439 && (function[len] == '\0' || function[len] == '('))
440 {
441 if (alc != NULL)
442 free (alc);
443 /* Returning a non-zero value stops the backtrace. */
444 return 1;
445 }
446 }
447 }
448
449 fprintf (stderr, "0x%lx %s\n\t%s:%d\n",
7de0a5e4 450 (unsigned long) pc,
3f425711 451 function == NULL ? "???" : function,
452 filename == NULL ? "???" : filename,
453 lineno);
454
455 if (alc != NULL)
456 free (alc);
457
458 return 0;
459}
460
461/* A callback function passed to the backtrace_full function. This is
462 called if backtrace_full has an error. */
463
464static void
465bt_err_callback (void *data ATTRIBUTE_UNUSED, const char *msg, int errnum)
466{
467 if (errnum < 0)
468 {
469 /* This means that no debug info was available. Just quietly
470 skip printing backtrace info. */
471 return;
472 }
473 fprintf (stderr, "%s%s%s\n", msg, errnum == 0 ? "" : ": ",
474 errnum == 0 ? "" : xstrerror (errnum));
475}
476
bd257a76 477/* Check if we've met the maximum error limit, and if so fatally exit
478 with a message. CONTEXT is the context to check, and FLUSH
479 indicates whether a diagnostic_finish call is needed. */
480
481void
482diagnostic_check_max_errors (diagnostic_context *context, bool flush)
483{
484 if (!context->max_errors)
485 return;
486
487 int count = (diagnostic_kind_count (context, DK_ERROR)
488 + diagnostic_kind_count (context, DK_SORRY)
489 + diagnostic_kind_count (context, DK_WERROR));
490
491 if (count >= context->max_errors)
492 {
493 fnotice (stderr,
494 "compilation terminated due to -fmax-errors=%u.\n",
495 context->max_errors);
496 if (flush)
497 diagnostic_finish (context);
498 exit (FATAL_EXIT_CODE);
499 }
500}
501
78323b05 502/* Take any action which is expected to happen after the diagnostic
503 is written out. This function does not always return. */
716da296 504void
d598ad0d 505diagnostic_action_after_output (diagnostic_context *context,
716da296 506 diagnostic_t diag_kind)
78323b05 507{
716da296 508 switch (diag_kind)
78323b05 509 {
510 case DK_DEBUG:
511 case DK_NOTE:
512 case DK_ANACHRONISM:
513 case DK_WARNING:
514 break;
515
516 case DK_ERROR:
517 case DK_SORRY:
518 if (context->abort_on_error)
519 real_abort ();
2c2efebb 520 if (context->fatal_errors)
295acf4f 521 {
522 fnotice (stderr, "compilation terminated due to -Wfatal-errors.\n");
543725f3 523 diagnostic_finish (context);
295acf4f 524 exit (FATAL_EXIT_CODE);
525 }
78323b05 526 break;
527
528 case DK_ICE:
9d7131bf 529 case DK_ICE_NOBT:
3f425711 530 {
9d7131bf 531 struct backtrace_state *state = NULL;
532 if (diag_kind == DK_ICE)
533 state = backtrace_create_state (NULL, 0, bt_err_callback, NULL);
3f425711 534 int count = 0;
535 if (state != NULL)
536 backtrace_full (state, 2, bt_callback, bt_err_callback,
537 (void *) &count);
538
539 if (context->abort_on_error)
540 real_abort ();
541
542 fnotice (stderr, "Please submit a full bug report,\n"
543 "with preprocessed source if appropriate.\n");
544 if (count > 0)
545 fnotice (stderr,
546 ("Please include the complete backtrace "
547 "with any bug report.\n"));
548 fnotice (stderr, "See %s for instructions.\n", bug_report_url);
78323b05 549
3f425711 550 exit (ICE_EXIT_CODE);
551 }
78323b05 552
553 case DK_FATAL:
554 if (context->abort_on_error)
555 real_abort ();
543725f3 556 diagnostic_finish (context);
78323b05 557 fnotice (stderr, "compilation terminated.\n");
558 exit (FATAL_EXIT_CODE);
559
560 default:
583fa9e0 561 gcc_unreachable ();
78323b05 562 }
563}
564
29c64b33 565/* True if the last module or file in which a diagnostic was reported is
566 different from the current one. */
567
568static bool
569last_module_changed_p (diagnostic_context *context,
570 const line_map_ordinary *map)
571{
572 return context->last_module != map;
573}
574
575/* Remember the current module or file as being the last one in which we
576 report a diagnostic. */
577
578static void
579set_last_module (diagnostic_context *context, const line_map_ordinary *map)
580{
581 context->last_module = map;
582}
583
076f8fe1 584void
3de02a0f 585diagnostic_report_current_module (diagnostic_context *context, location_t where)
076f8fe1 586{
551e34da 587 const line_map_ordinary *map = NULL;
076f8fe1 588
aa6db498 589 if (pp_needs_newline (context->printer))
2faf8f38 590 {
aa6db498 591 pp_newline (context->printer);
592 pp_needs_newline (context->printer) = false;
2faf8f38 593 }
076f8fe1 594
3de02a0f 595 if (where <= BUILTINS_LOCATION)
26cb3d1c 596 return;
597
3de02a0f 598 linemap_resolve_location (line_table, where,
599 LRK_MACRO_DEFINITION_LOCATION,
600 &map);
601
29c64b33 602 if (map && last_module_changed_p (context, map))
2faf8f38 603 {
29c64b33 604 set_last_module (context, map);
26cb3d1c 605 if (! MAIN_FILE_P (map))
7bd3dcc4 606 {
917dad34 607 bool first = true;
608 do
26cb3d1c 609 {
03410c5e 610 where = linemap_included_from (map);
611 map = linemap_included_from_linemap (line_table, map);
917dad34 612 const char *line_col
03410c5e 613 = maybe_line_and_column (SOURCE_LINE (map, where),
917dad34 614 first && context->show_column
615 ? SOURCE_COLUMN (map, where) : 0);
616 static const char *const msgs[] =
617 {
618 N_("In file included from"),
619 N_(" from"),
620 };
621 unsigned index = !first;
622 pp_verbatim (context->printer, "%s%s %r%s%s%R",
623 first ? "" : ",\n", _(msgs[index]),
624 "locus", LINEMAP_FILE (map), line_col);
625 first = false;
26cb3d1c 626 }
917dad34 627 while (! MAIN_FILE_P (map));
26cb3d1c 628 pp_verbatim (context->printer, ":");
629 pp_newline (context->printer);
7bd3dcc4 630 }
2faf8f38 631 }
632}
f060a027 633
34e5cced 634void
d598ad0d 635default_diagnostic_starter (diagnostic_context *context,
636 diagnostic_info *diagnostic)
076f8fe1 637{
389a9009 638 diagnostic_report_current_module (context, diagnostic_location (diagnostic));
2c2efebb 639 pp_set_prefix (context->printer, diagnostic_build_prefix (context,
640 diagnostic));
2faf8f38 641}
076f8fe1 642
aec1f4bd 643void
644default_diagnostic_start_span_fn (diagnostic_context *context,
645 expanded_location exploc)
646{
287abdae 647 char *text = diagnostic_get_location_text (context, exploc);
648 pp_string (context->printer, text);
649 free (text);
aec1f4bd 650 pp_newline (context->printer);
651}
652
34e5cced 653void
399d4f80 654default_diagnostic_finalizer (diagnostic_context *context,
1bcc5c64 655 diagnostic_info *diagnostic,
656 diagnostic_t)
2faf8f38 657{
48a7392b 658 diagnostic_show_locus (context, diagnostic->richloc, diagnostic->kind);
399d4f80 659 pp_destroy_prefix (context->printer);
3752e5b1 660 pp_flush (context->printer);
076f8fe1 661}
662
76f02516 663/* Interface to specify diagnostic kind overrides. Returns the
664 previous setting, or DK_UNSPECIFIED if the parameters are out of
af776050 665 range. If OPTION_INDEX is zero, the new setting is for all the
666 diagnostics. */
76f02516 667diagnostic_t
668diagnostic_classify_diagnostic (diagnostic_context *context,
669 int option_index,
0955be65 670 diagnostic_t new_kind,
671 location_t where)
76f02516 672{
673 diagnostic_t old_kind;
674
af776050 675 if (option_index < 0
3c6a9715 676 || option_index >= context->n_opts
76f02516 677 || new_kind >= DK_LAST_DIAGNOSTIC_KIND)
678 return DK_UNSPECIFIED;
679
680 old_kind = context->classify_diagnostic[option_index];
0955be65 681
682 /* Handle pragmas separately, since we need to keep track of *where*
683 the pragmas were. */
684 if (where != UNKNOWN_LOCATION)
685 {
686 int i;
687
e472ce46 688 /* Record the command-line status, so we can reset it back on DK_POP. */
689 if (old_kind == DK_UNSPECIFIED)
690 {
0a489f51 691 old_kind = !context->option_enabled (option_index,
692 context->option_state)
693 ? DK_IGNORED : (context->warning_as_error_requested
694 ? DK_ERROR : DK_WARNING);
e472ce46 695 context->classify_diagnostic[option_index] = old_kind;
696 }
697
0955be65 698 for (i = context->n_classification_history - 1; i >= 0; i --)
699 if (context->classification_history[i].option == option_index)
700 {
701 old_kind = context->classification_history[i].kind;
702 break;
703 }
704
705 i = context->n_classification_history;
706 context->classification_history =
707 (diagnostic_classification_change_t *) xrealloc (context->classification_history, (i + 1)
708 * sizeof (diagnostic_classification_change_t));
709 context->classification_history[i].location = where;
710 context->classification_history[i].option = option_index;
711 context->classification_history[i].kind = new_kind;
712 context->n_classification_history ++;
713 }
714 else
715 context->classify_diagnostic[option_index] = new_kind;
716
76f02516 717 return old_kind;
718}
719
0955be65 720/* Save all diagnostic classifications in a stack. */
721void
722diagnostic_push_diagnostics (diagnostic_context *context, location_t where ATTRIBUTE_UNUSED)
723{
724 context->push_list = (int *) xrealloc (context->push_list, (context->n_push + 1) * sizeof (int));
725 context->push_list[context->n_push ++] = context->n_classification_history;
726}
727
728/* Restore the topmost classification set off the stack. If the stack
729 is empty, revert to the state based on command line parameters. */
730void
731diagnostic_pop_diagnostics (diagnostic_context *context, location_t where)
732{
733 int jump_to;
734 int i;
735
736 if (context->n_push)
737 jump_to = context->push_list [-- context->n_push];
738 else
739 jump_to = 0;
740
741 i = context->n_classification_history;
742 context->classification_history =
743 (diagnostic_classification_change_t *) xrealloc (context->classification_history, (i + 1)
744 * sizeof (diagnostic_classification_change_t));
745 context->classification_history[i].location = where;
746 context->classification_history[i].option = jump_to;
747 context->classification_history[i].kind = DK_POP;
748 context->n_classification_history ++;
749}
750
6628b04d 751/* Helper function for print_parseable_fixits. Print TEXT to PP, obeying the
752 escaping rules for -fdiagnostics-parseable-fixits. */
753
754static void
755print_escaped_string (pretty_printer *pp, const char *text)
756{
757 gcc_assert (pp);
758 gcc_assert (text);
759
760 pp_character (pp, '"');
761 for (const char *ch = text; *ch; ch++)
762 {
763 switch (*ch)
764 {
765 case '\\':
766 /* Escape backslash as two backslashes. */
767 pp_string (pp, "\\\\");
768 break;
769 case '\t':
770 /* Escape tab as "\t". */
771 pp_string (pp, "\\t");
772 break;
773 case '\n':
774 /* Escape newline as "\n". */
775 pp_string (pp, "\\n");
776 break;
777 case '"':
778 /* Escape doublequotes as \". */
779 pp_string (pp, "\\\"");
780 break;
781 default:
782 if (ISPRINT (*ch))
783 pp_character (pp, *ch);
784 else
785 /* Use octal for non-printable chars. */
786 {
787 unsigned char c = (*ch & 0xff);
788 pp_printf (pp, "\\%o%o%o", (c / 64), (c / 8) & 007, c & 007);
789 }
790 break;
791 }
792 }
793 pp_character (pp, '"');
794}
795
796/* Implementation of -fdiagnostics-parseable-fixits. Print a
797 machine-parseable version of all fixits in RICHLOC to PP. */
798
799static void
800print_parseable_fixits (pretty_printer *pp, rich_location *richloc)
801{
802 gcc_assert (pp);
803 gcc_assert (richloc);
804
805 for (unsigned i = 0; i < richloc->get_num_fixit_hints (); i++)
806 {
807 const fixit_hint *hint = richloc->get_fixit_hint (i);
be1e7283 808 location_t start_loc = hint->get_start_loc ();
6628b04d 809 expanded_location start_exploc = expand_location (start_loc);
810 pp_string (pp, "fix-it:");
811 print_escaped_string (pp, start_exploc.file);
6628b04d 812 /* For compatibility with clang, print as a half-open range. */
be1e7283 813 location_t next_loc = hint->get_next_loc ();
be45049f 814 expanded_location next_exploc = expand_location (next_loc);
815 pp_printf (pp, ":{%i:%i-%i:%i}:",
816 start_exploc.line, start_exploc.column,
817 next_exploc.line, next_exploc.column);
818 print_escaped_string (pp, hint->get_string ());
6628b04d 819 pp_newline (pp);
820 }
821}
822
85d113d8 823/* Update the diag_class of DIAGNOSTIC based on its location
824 relative to any
825 #pragma GCC diagnostic
826 directives recorded within CONTEXT.
827
828 Return the new diag_class of DIAGNOSTIC if it was updated, or
829 DK_UNSPECIFIED otherwise. */
830
831static diagnostic_t
832update_effective_level_from_pragmas (diagnostic_context *context,
833 diagnostic_info *diagnostic)
834{
835 diagnostic_t diag_class = DK_UNSPECIFIED;
836
837 if (context->n_classification_history > 0)
838 {
839 location_t location = diagnostic_location (diagnostic);
840
841 /* FIXME: Stupid search. Optimize later. */
842 for (int i = context->n_classification_history - 1; i >= 0; i --)
843 {
844 if (linemap_location_before_p
845 (line_table,
846 context->classification_history[i].location,
847 location))
848 {
849 if (context->classification_history[i].kind == (int) DK_POP)
850 {
851 i = context->classification_history[i].option;
852 continue;
853 }
854 int option = context->classification_history[i].option;
855 /* The option 0 is for all the diagnostics. */
856 if (option == 0 || option == diagnostic->option_index)
857 {
858 diag_class = context->classification_history[i].kind;
859 if (diag_class != DK_UNSPECIFIED)
860 diagnostic->kind = diag_class;
861 break;
862 }
863 }
864 }
865 }
866
867 return diag_class;
868}
869
fa1e6801 870/* Print any metadata about the option used to control DIAGNOSTIC to CONTEXT's
871 printer, e.g. " [-Werror=uninitialized]".
872 Subroutine of diagnostic_report_diagnostic. */
873
874static void
875print_option_information (diagnostic_context *context,
876 const diagnostic_info *diagnostic,
877 diagnostic_t orig_diag_kind)
878{
879 char *option_text;
880
881 option_text = context->option_name (context, diagnostic->option_index,
882 orig_diag_kind, diagnostic->kind);
883
884 if (option_text)
885 {
886 pretty_printer *pp = context->printer;
887 pp_string (pp, " [");
888 pp_string (pp, colorize_start (pp_show_color (pp),
889 diagnostic_kind_color[diagnostic->kind]));
890 pp_string (pp, option_text);
891 pp_string (pp, colorize_stop (pp_show_color (pp)));
892 pp_character (pp, ']');
893 free (option_text);
894 }
895}
85d113d8 896
2faf8f38 897/* Report a diagnostic message (an error or a warning) as specified by
898 DC. This function is *the* subroutine in terms of which front-ends
899 should implement their specific diagnostic handling modules. The
900 front-end independent format specifiers are exactly those described
48e1416a 901 in the documentation of output_format.
a52d5726 902 Return true if a diagnostic was printed, false otherwise. */
f060a027 903
a52d5726 904bool
d598ad0d 905diagnostic_report_diagnostic (diagnostic_context *context,
906 diagnostic_info *diagnostic)
f060a027 907{
389a9009 908 location_t location = diagnostic_location (diagnostic);
543725f3 909 diagnostic_t orig_diag_kind = diagnostic->kind;
f9a354ab 910
911 /* Give preference to being able to inhibit warnings, before they
912 get reclassified to something else. */
a52d5726 913 if ((diagnostic->kind == DK_WARNING || diagnostic->kind == DK_PEDWARN)
3c6a9715 914 && !diagnostic_report_warnings_p (context, location))
a52d5726 915 return false;
916
48e1416a 917 if (diagnostic->kind == DK_PEDWARN)
543725f3 918 {
2c2efebb 919 diagnostic->kind = pedantic_warning_kind (context);
543725f3 920 /* We do this to avoid giving the message for -pedantic-errors. */
921 orig_diag_kind = diagnostic->kind;
922 }
16b4d5bb 923
924 if (diagnostic->kind == DK_NOTE && context->inhibit_notes_p)
925 return false;
48e1416a 926
583fa9e0 927 if (context->lock > 0)
928 {
929 /* If we're reporting an ICE in the middle of some other error,
930 try to flush out the previous error, then let this one
931 through. Don't do this more than once. */
9d7131bf 932 if ((diagnostic->kind == DK_ICE || diagnostic->kind == DK_ICE_NOBT)
933 && context->lock == 1)
5f7f600e 934 pp_newline_and_flush (context->printer);
583fa9e0 935 else
936 error_recursion (context);
937 }
938
f9a354ab 939 /* If the user requested that warnings be treated as errors, so be
940 it. Note that we do this before the next block so that
941 individual warnings can be overridden back to warnings with
942 -Wno-error=*. */
943 if (context->warning_as_error_requested
944 && diagnostic->kind == DK_WARNING)
c59a1804 945 diagnostic->kind = DK_ERROR;
48e1416a 946
bba5a206 947 if (diagnostic->option_index
948 && diagnostic->option_index != permissive_error_option (context))
76f02516 949 {
950 /* This tests if the user provided the appropriate -Wfoo or
951 -Wno-foo option. */
2c5d2e39 952 if (! context->option_enabled (diagnostic->option_index,
953 context->option_state))
a52d5726 954 return false;
0955be65 955
956 /* This tests for #pragma diagnostic changes. */
85d113d8 957 diagnostic_t diag_class
958 = update_effective_level_from_pragmas (context, diagnostic);
e917a27c 959
76f02516 960 /* This tests if the user provided the appropriate -Werror=foo
961 option. */
0955be65 962 if (diag_class == DK_UNSPECIFIED
e917a27c 963 && (context->classify_diagnostic[diagnostic->option_index]
964 != DK_UNSPECIFIED))
965 diagnostic->kind
966 = context->classify_diagnostic[diagnostic->option_index];
967
334ec2d8 968 /* This allows for future extensions, like temporarily disabling
76f02516 969 warnings for ranges of source code. */
970 if (diagnostic->kind == DK_IGNORED)
a52d5726 971 return false;
76f02516 972 }
b0932b2f 973
bd257a76 974 if (diagnostic->kind != DK_NOTE)
975 diagnostic_check_max_errors (context);
976
583fa9e0 977 context->lock++;
f060a027 978
9d7131bf 979 if (diagnostic->kind == DK_ICE || diagnostic->kind == DK_ICE_NOBT)
2faf8f38 980 {
43404f28 981 /* When not checking, ICEs are converted to fatal errors when an
982 error has already occurred. This is counteracted by
983 abort_on_error. */
382ecba7 984 if (!CHECKING_P
985 && (diagnostic_kind_count (context, DK_ERROR) > 0
986 || diagnostic_kind_count (context, DK_SORRY) > 0)
43404f28 987 && !context->abort_on_error)
988 {
389a9009 989 expanded_location s
990 = expand_location (diagnostic_location (diagnostic));
43404f28 991 fnotice (stderr, "%s:%d: confused by earlier errors, bailing out\n",
992 s.file, s.line);
993 exit (ICE_EXIT_CODE);
994 }
43404f28 995 if (context->internal_error)
1f63d337 996 (*context->internal_error) (context,
997 diagnostic->message.format_spec,
43404f28 998 diagnostic->message.args_ptr);
b63957b3 999 }
d9d1b0a4 1000 if (diagnostic->kind == DK_ERROR && orig_diag_kind == DK_WARNING)
1001 ++diagnostic_kind_count (context, DK_WERROR);
1002 else
1003 ++diagnostic_kind_count (context, diagnostic->kind);
48e1416a 1004
bc35ef65 1005 /* Is this the initial diagnostic within the stack of groups? */
1006 if (context->diagnostic_group_emission_count == 0)
1007 {
1008 if (context->begin_group_cb)
1009 context->begin_group_cb (context);
1010 }
1011 context->diagnostic_group_emission_count++;
1012
ce084dfc 1013 diagnostic->message.x_data = &diagnostic->x_data;
1014 diagnostic->x_data = NULL;
43404f28 1015 pp_format (context->printer, &diagnostic->message);
1016 (*diagnostic_starter (context)) (context, diagnostic);
1017 pp_output_formatted_text (context->printer);
fa1e6801 1018 if (context->show_option_requested)
1019 print_option_information (context, diagnostic, orig_diag_kind);
1bcc5c64 1020 (*diagnostic_finalizer (context)) (context, diagnostic, orig_diag_kind);
6628b04d 1021 if (context->parseable_fixits_p)
1022 {
1023 print_parseable_fixits (context->printer, diagnostic->richloc);
1024 pp_flush (context->printer);
1025 }
716da296 1026 diagnostic_action_after_output (context, diagnostic->kind);
ce084dfc 1027 diagnostic->x_data = NULL;
78323b05 1028
40a431fa 1029 if (context->edit_context_ptr)
112ca2a8 1030 if (diagnostic->richloc->fixits_can_be_auto_applied_p ())
1031 context->edit_context_ptr->add_fixits (diagnostic->richloc);
40a431fa 1032
78323b05 1033 context->lock--;
a52d5726 1034
1035 return true;
2faf8f38 1036}
b63957b3 1037
934182c6 1038/* Get the number of digits in the decimal representation of VALUE. */
1039
1040int
1041num_digits (int value)
1042{
1043 /* Perhaps simpler to use log10 for this, but doing it this way avoids
1044 using floating point. */
1045 gcc_assert (value >= 0);
1046
1047 if (value == 0)
1048 return 1;
1049
1050 int digits = 0;
1051 while (value > 0)
1052 {
1053 digits++;
1054 value /= 10;
1055 }
1056 return digits;
1057}
1058
2faf8f38 1059/* Given a partial pathname as input, return another pathname that
1060 shares no directory elements with the pathname of __FILE__. This
1061 is used by fancy_abort() to print `Internal compiler error in expr.c'
1062 instead of `Internal compiler error in ../../GCC/gcc/expr.c'. */
1eefe280 1063
2faf8f38 1064const char *
d598ad0d 1065trim_filename (const char *name)
2faf8f38 1066{
1067 static const char this_file[] = __FILE__;
1068 const char *p = name, *q = this_file;
b63957b3 1069
2faf8f38 1070 /* First skip any "../" in each filename. This allows us to give a proper
1071 reference to a file in a subdirectory. */
583fa9e0 1072 while (p[0] == '.' && p[1] == '.' && IS_DIR_SEPARATOR (p[2]))
2faf8f38 1073 p += 3;
1074
583fa9e0 1075 while (q[0] == '.' && q[1] == '.' && IS_DIR_SEPARATOR (q[2]))
2faf8f38 1076 q += 3;
1077
1078 /* Now skip any parts the two filenames have in common. */
1079 while (*p == *q && *p != 0 && *q != 0)
1080 p++, q++;
1081
1082 /* Now go backwards until the previous directory separator. */
7ebd7605 1083 while (p > name && !IS_DIR_SEPARATOR (p[-1]))
2faf8f38 1084 p--;
1085
1086 return p;
076f8fe1 1087}
2faf8f38 1088\f
1089/* Standard error reporting routines in increasing order of severity.
1090 All of these take arguments like printf. */
076f8fe1 1091
2faf8f38 1092/* Text to be emitted verbatim to the error message stream; this
1093 produces no prefix and disables line-wrapping. Use rarely. */
076f8fe1 1094void
380c6697 1095verbatim (const char *gmsgid, ...)
2faf8f38 1096{
1097 text_info text;
ee582a61 1098 va_list ap;
2faf8f38 1099
380c6697 1100 va_start (ap, gmsgid);
d07c9932 1101 text.err_no = errno;
2faf8f38 1102 text.args_ptr = &ap;
380c6697 1103 text.format_spec = _(gmsgid);
ce084dfc 1104 text.x_data = NULL;
aa6db498 1105 pp_format_verbatim (global_dc->printer, &text);
5f7f600e 1106 pp_newline_and_flush (global_dc->printer);
ee582a61 1107 va_end (ap);
2faf8f38 1108}
1109
ff213692 1110/* Add a note with text GMSGID and with LOCATION to the diagnostic CONTEXT. */
1111void
1112diagnostic_append_note (diagnostic_context *context,
1113 location_t location,
1114 const char * gmsgid, ...)
1115{
1116 diagnostic_info diagnostic;
1117 va_list ap;
a96cefb2 1118 rich_location richloc (line_table, location);
ff213692 1119
1120 va_start (ap, gmsgid);
f0479000 1121 diagnostic_set_info (&diagnostic, gmsgid, &ap, &richloc, DK_NOTE);
1122 if (context->inhibit_notes_p)
1123 {
1124 va_end (ap);
1125 return;
1126 }
cba058c7 1127 char *saved_prefix = pp_take_prefix (context->printer);
f0479000 1128 pp_set_prefix (context->printer,
1129 diagnostic_build_prefix (context, &diagnostic));
ff213692 1130 pp_format (context->printer, &diagnostic.message);
1131 pp_output_formatted_text (context->printer);
1132 pp_destroy_prefix (context->printer);
29d52322 1133 pp_set_prefix (context->printer, saved_prefix);
48a7392b 1134 diagnostic_show_locus (context, &richloc, DK_NOTE);
9af5ce0c 1135 va_end (ap);
ff213692 1136}
1137
3b6578b3 1138/* Implement emit_diagnostic, inform, warning, warning_at, pedwarn,
1139 permerror, error, error_at, error_at, sorry, fatal_error, internal_error,
1140 and internal_error_no_backtrace, as documented and defined below. */
a262d9cd 1141static bool
1142diagnostic_impl (rich_location *richloc, int opt,
1143 const char *gmsgid,
1144 va_list *ap, diagnostic_t kind)
076f8fe1 1145{
25e2ffe1 1146 diagnostic_info diagnostic;
a52d5726 1147 if (kind == DK_PERMERROR)
1148 {
a262d9cd 1149 diagnostic_set_info (&diagnostic, gmsgid, ap, richloc,
2c2efebb 1150 permissive_error_kind (global_dc));
3c6a9715 1151 diagnostic.option_index = permissive_error_option (global_dc);
a52d5726 1152 }
a262d9cd 1153 else
1154 {
1155 diagnostic_set_info (&diagnostic, gmsgid, ap, richloc, kind);
a52d5726 1156 if (kind == DK_WARNING || kind == DK_PEDWARN)
1157 diagnostic.option_index = opt;
a262d9cd 1158 }
56b8400f 1159 return diagnostic_report_diagnostic (global_dc, &diagnostic);
a262d9cd 1160}
1161
3b6578b3 1162/* Implement inform_n, warning_n, and error_n, as documented and
1163 defined below. */
c43f5e5c 1164static bool
f4e3e4b1 1165diagnostic_n_impl (rich_location *richloc, int opt, unsigned HOST_WIDE_INT n,
3b6578b3 1166 const char *singular_gmsgid,
1167 const char *plural_gmsgid,
1168 va_list *ap, diagnostic_t kind)
c43f5e5c 1169{
1170 diagnostic_info diagnostic;
f4e3e4b1 1171 unsigned long gtn;
1172
1173 if (sizeof n <= sizeof gtn)
1174 gtn = n;
1175 else
1176 /* Use the largest number ngettext can handle, otherwise
1177 preserve the six least significant decimal digits for
1178 languages where the plural form depends on them. */
1179 gtn = n <= ULONG_MAX ? n : n % 1000000LU + 1000000LU;
1180
1181 const char *text = ngettext (singular_gmsgid, plural_gmsgid, gtn);
1182 diagnostic_set_info_translated (&diagnostic, text, ap, richloc, kind);
c43f5e5c 1183 if (kind == DK_WARNING)
1184 diagnostic.option_index = opt;
56b8400f 1185 return diagnostic_report_diagnostic (global_dc, &diagnostic);
a262d9cd 1186}
a52d5726 1187
88539b96 1188/* Wrapper around diagnostic_impl taking a variable argument list. */
1189
a262d9cd 1190bool
1191emit_diagnostic (diagnostic_t kind, location_t location, int opt,
1192 const char *gmsgid, ...)
1193{
bc35ef65 1194 auto_diagnostic_group d;
a262d9cd 1195 va_list ap;
1196 va_start (ap, gmsgid);
1197 rich_location richloc (line_table, location);
1198 bool ret = diagnostic_impl (&richloc, opt, gmsgid, &ap, kind);
e3d533cf 1199 va_end (ap);
1200 return ret;
076f8fe1 1201}
1202
6639e735 1203/* As above, but for rich_location *. */
1204
1205bool
1206emit_diagnostic (diagnostic_t kind, rich_location *richloc, int opt,
1207 const char *gmsgid, ...)
1208{
1209 auto_diagnostic_group d;
1210 va_list ap;
1211 va_start (ap, gmsgid);
1212 bool ret = diagnostic_impl (richloc, opt, gmsgid, &ap, kind);
1213 va_end (ap);
1214 return ret;
1215}
1216
88539b96 1217/* Wrapper around diagnostic_impl taking a va_list parameter. */
1218
1219bool
1220emit_diagnostic_valist (diagnostic_t kind, location_t location, int opt,
1221 const char *gmsgid, va_list *ap)
1222{
1223 rich_location richloc (line_table, location);
1224 return diagnostic_impl (&richloc, opt, gmsgid, ap, kind);
1225}
1226
5bcc316e 1227/* An informative note at LOCATION. Use this for additional details on an error
a52d5726 1228 message. */
076f8fe1 1229void
5bcc316e 1230inform (location_t location, const char *gmsgid, ...)
f0479000 1231{
bc35ef65 1232 auto_diagnostic_group d;
f0479000 1233 va_list ap;
f0479000 1234 va_start (ap, gmsgid);
a262d9cd 1235 rich_location richloc (line_table, location);
1236 diagnostic_impl (&richloc, -1, gmsgid, &ap, DK_NOTE);
f0479000 1237 va_end (ap);
1238}
1239
3b6578b3 1240/* Same as "inform" above, but at RICHLOC. */
f0479000 1241void
3b6578b3 1242inform (rich_location *richloc, const char *gmsgid, ...)
c3ceba8e 1243{
3b6578b3 1244 gcc_assert (richloc);
1245
bc35ef65 1246 auto_diagnostic_group d;
c3ceba8e 1247 va_list ap;
380c6697 1248 va_start (ap, gmsgid);
a262d9cd 1249 diagnostic_impl (richloc, -1, gmsgid, &ap, DK_NOTE);
c3ceba8e 1250 va_end (ap);
1251}
1252
c0ddc4f8 1253/* An informative note at LOCATION. Use this for additional details on an
1254 error message. */
1255void
f4e3e4b1 1256inform_n (location_t location, unsigned HOST_WIDE_INT n,
1257 const char *singular_gmsgid, const char *plural_gmsgid, ...)
c0ddc4f8 1258{
c0ddc4f8 1259 va_list ap;
c0ddc4f8 1260 va_start (ap, plural_gmsgid);
bc35ef65 1261 auto_diagnostic_group d;
3b6578b3 1262 rich_location richloc (line_table, location);
1263 diagnostic_n_impl (&richloc, -1, n, singular_gmsgid, plural_gmsgid,
a262d9cd 1264 &ap, DK_NOTE);
c0ddc4f8 1265 va_end (ap);
1266}
1267
a52d5726 1268/* A warning at INPUT_LOCATION. Use this for code which is correct according
48e1416a 1269 to the relevant language specification but is likely to be buggy anyway.
a52d5726 1270 Returns true if the warning was printed, false if it was inhibited. */
1271bool
1272warning (int opt, const char *gmsgid, ...)
076f8fe1 1273{
bc35ef65 1274 auto_diagnostic_group d;
ee582a61 1275 va_list ap;
380c6697 1276 va_start (ap, gmsgid);
a262d9cd 1277 rich_location richloc (line_table, input_location);
1278 bool ret = diagnostic_impl (&richloc, opt, gmsgid, &ap, DK_WARNING);
ee582a61 1279 va_end (ap);
e3d533cf 1280 return ret;
076f8fe1 1281}
1282
bdbc474b 1283/* A warning at LOCATION. Use this for code which is correct according to the
a52d5726 1284 relevant language specification but is likely to be buggy anyway.
1285 Returns true if the warning was printed, false if it was inhibited. */
1286
1287bool
bdbc474b 1288warning_at (location_t location, int opt, const char *gmsgid, ...)
f0479000 1289{
bc35ef65 1290 auto_diagnostic_group d;
f0479000 1291 va_list ap;
f0479000 1292 va_start (ap, gmsgid);
a262d9cd 1293 rich_location richloc (line_table, location);
1294 bool ret = diagnostic_impl (&richloc, opt, gmsgid, &ap, DK_WARNING);
f0479000 1295 va_end (ap);
1296 return ret;
1297}
1298
3b6578b3 1299/* Same as "warning at" above, but using RICHLOC. */
f0479000 1300
1301bool
3b6578b3 1302warning_at (rich_location *richloc, int opt, const char *gmsgid, ...)
bdbc474b 1303{
3b6578b3 1304 gcc_assert (richloc);
1305
bc35ef65 1306 auto_diagnostic_group d;
bdbc474b 1307 va_list ap;
bdbc474b 1308 va_start (ap, gmsgid);
a262d9cd 1309 bool ret = diagnostic_impl (richloc, opt, gmsgid, &ap, DK_WARNING);
bdbc474b 1310 va_end (ap);
e3d533cf 1311 return ret;
bdbc474b 1312}
1313
3b6578b3 1314/* Same as warning_n plural variant below, but using RICHLOC. */
c43f5e5c 1315
1316bool
f4e3e4b1 1317warning_n (rich_location *richloc, int opt, unsigned HOST_WIDE_INT n,
3b6578b3 1318 const char *singular_gmsgid, const char *plural_gmsgid, ...)
c43f5e5c 1319{
3b6578b3 1320 gcc_assert (richloc);
1321
bc35ef65 1322 auto_diagnostic_group d;
c43f5e5c 1323 va_list ap;
1324 va_start (ap, plural_gmsgid);
3b6578b3 1325 bool ret = diagnostic_n_impl (richloc, opt, n,
1326 singular_gmsgid, plural_gmsgid,
1327 &ap, DK_WARNING);
c43f5e5c 1328 va_end (ap);
1329 return ret;
1330}
1331
1b355793 1332/* A warning at LOCATION. Use this for code which is correct according to the
1333 relevant language specification but is likely to be buggy anyway.
1334 Returns true if the warning was printed, false if it was inhibited. */
1335
1336bool
f4e3e4b1 1337warning_n (location_t location, int opt, unsigned HOST_WIDE_INT n,
1338 const char *singular_gmsgid, const char *plural_gmsgid, ...)
1b355793 1339{
bc35ef65 1340 auto_diagnostic_group d;
1b355793 1341 va_list ap;
1b355793 1342 va_start (ap, plural_gmsgid);
3b6578b3 1343 rich_location richloc (line_table, location);
1344 bool ret = diagnostic_n_impl (&richloc, opt, n,
a262d9cd 1345 singular_gmsgid, plural_gmsgid,
1346 &ap, DK_WARNING);
1b355793 1347 va_end (ap);
1348 return ret;
1349}
1350
e8fc0d34 1351/* A "pedantic" warning at LOCATION: issues a warning unless
1352 -pedantic-errors was given on the command line, in which case it
1353 issues an error. Use this for diagnostics required by the relevant
1354 language standard, if you have chosen not to make them errors.
78323b05 1355
1356 Note that these diagnostics are issued independent of the setting
29438999 1357 of the -Wpedantic command-line switch. To get a warning enabled
8864917d 1358 only with that switch, use either "if (pedantic) pedwarn
29438999 1359 (OPT_Wpedantic,...)" or just "pedwarn (OPT_Wpedantic,..)". To get a
1360 pedwarn independently of the -Wpedantic switch use "pedwarn (0,...)".
8864917d 1361
a52d5726 1362 Returns true if the warning was printed, false if it was inhibited. */
1363
e8fc0d34 1364bool
21ca8540 1365pedwarn (location_t location, int opt, const char *gmsgid, ...)
e8fc0d34 1366{
bc35ef65 1367 auto_diagnostic_group d;
e8fc0d34 1368 va_list ap;
e8fc0d34 1369 va_start (ap, gmsgid);
a262d9cd 1370 rich_location richloc (line_table, location);
1371 bool ret = diagnostic_impl (&richloc, opt, gmsgid, &ap, DK_PEDWARN);
e8fc0d34 1372 va_end (ap);
e3d533cf 1373 return ret;
e8fc0d34 1374}
1375
3b6578b3 1376/* Same as pedwarn above, but using RICHLOC. */
8469aece 1377
1378bool
3b6578b3 1379pedwarn (rich_location *richloc, int opt, const char *gmsgid, ...)
8469aece 1380{
3b6578b3 1381 gcc_assert (richloc);
1382
bc35ef65 1383 auto_diagnostic_group d;
8469aece 1384 va_list ap;
1385 va_start (ap, gmsgid);
1386 bool ret = diagnostic_impl (richloc, opt, gmsgid, &ap, DK_PEDWARN);
1387 va_end (ap);
1388 return ret;
1389}
1390
2ba27e7e 1391/* A "permissive" error at LOCATION: issues an error unless
1392 -fpermissive was given on the command line, in which case it issues
1393 a warning. Use this for things that really should be errors but we
a52d5726 1394 want to support legacy code.
2ba27e7e 1395
a52d5726 1396 Returns true if the warning was printed, false if it was inhibited. */
1397
1398bool
2b9e3597 1399permerror (location_t location, const char *gmsgid, ...)
2ba27e7e 1400{
bc35ef65 1401 auto_diagnostic_group d;
2ba27e7e 1402 va_list ap;
2ba27e7e 1403 va_start (ap, gmsgid);
a262d9cd 1404 rich_location richloc (line_table, location);
1405 bool ret = diagnostic_impl (&richloc, -1, gmsgid, &ap, DK_PERMERROR);
f0479000 1406 va_end (ap);
1407 return ret;
1408}
1409
3b6578b3 1410/* Same as "permerror" above, but at RICHLOC. */
f0479000 1411
1412bool
3b6578b3 1413permerror (rich_location *richloc, const char *gmsgid, ...)
f0479000 1414{
3b6578b3 1415 gcc_assert (richloc);
1416
bc35ef65 1417 auto_diagnostic_group d;
f0479000 1418 va_list ap;
f0479000 1419 va_start (ap, gmsgid);
a262d9cd 1420 bool ret = diagnostic_impl (richloc, -1, gmsgid, &ap, DK_PERMERROR);
2ba27e7e 1421 va_end (ap);
e3d533cf 1422 return ret;
2ba27e7e 1423}
1424
2faf8f38 1425/* A hard error: the code is definitely ill-formed, and an object file
1426 will not be produced. */
2d6f73d2 1427void
380c6697 1428error (const char *gmsgid, ...)
2d6f73d2 1429{
bc35ef65 1430 auto_diagnostic_group d;
ee582a61 1431 va_list ap;
380c6697 1432 va_start (ap, gmsgid);
a262d9cd 1433 rich_location richloc (line_table, input_location);
1434 diagnostic_impl (&richloc, -1, gmsgid, &ap, DK_ERROR);
ee582a61 1435 va_end (ap);
b7c4d3f3 1436}
1437
c0ddc4f8 1438/* A hard error: the code is definitely ill-formed, and an object file
1439 will not be produced. */
1440void
f4e3e4b1 1441error_n (location_t location, unsigned HOST_WIDE_INT n,
1442 const char *singular_gmsgid, const char *plural_gmsgid, ...)
c0ddc4f8 1443{
bc35ef65 1444 auto_diagnostic_group d;
c0ddc4f8 1445 va_list ap;
c0ddc4f8 1446 va_start (ap, plural_gmsgid);
3b6578b3 1447 rich_location richloc (line_table, location);
1448 diagnostic_n_impl (&richloc, -1, n, singular_gmsgid, plural_gmsgid,
a262d9cd 1449 &ap, DK_ERROR);
c0ddc4f8 1450 va_end (ap);
1451}
1452
a262d9cd 1453/* Same as above, but use location LOC instead of input_location. */
3bc1df45 1454void
1455error_at (location_t loc, const char *gmsgid, ...)
1456{
bc35ef65 1457 auto_diagnostic_group d;
3bc1df45 1458 va_list ap;
3bc1df45 1459 va_start (ap, gmsgid);
a262d9cd 1460 rich_location richloc (line_table, loc);
1461 diagnostic_impl (&richloc, -1, gmsgid, &ap, DK_ERROR);
f0479000 1462 va_end (ap);
1463}
1464
1465/* Same as above, but use RICH_LOC. */
1466
1467void
3b6578b3 1468error_at (rich_location *richloc, const char *gmsgid, ...)
f0479000 1469{
3b6578b3 1470 gcc_assert (richloc);
1471
bc35ef65 1472 auto_diagnostic_group d;
f0479000 1473 va_list ap;
f0479000 1474 va_start (ap, gmsgid);
a262d9cd 1475 diagnostic_impl (richloc, -1, gmsgid, &ap, DK_ERROR);
3bc1df45 1476 va_end (ap);
1477}
1478
2faf8f38 1479/* "Sorry, not implemented." Use for a language feature which is
1480 required by the relevant specification but not implemented by GCC.
1481 An object file will not be produced. */
b7c4d3f3 1482void
380c6697 1483sorry (const char *gmsgid, ...)
b7c4d3f3 1484{
bc35ef65 1485 auto_diagnostic_group d;
ee582a61 1486 va_list ap;
380c6697 1487 va_start (ap, gmsgid);
a262d9cd 1488 rich_location richloc (line_table, input_location);
1489 diagnostic_impl (&richloc, -1, gmsgid, &ap, DK_SORRY);
ee582a61 1490 va_end (ap);
2faf8f38 1491}
b63957b3 1492
02e99bba 1493/* Same as above, but use location LOC instead of input_location. */
1494void
1495sorry_at (location_t loc, const char *gmsgid, ...)
1496{
1497 auto_diagnostic_group d;
1498 va_list ap;
1499 va_start (ap, gmsgid);
1500 rich_location richloc (line_table, loc);
1501 diagnostic_impl (&richloc, -1, gmsgid, &ap, DK_SORRY);
1502 va_end (ap);
1503}
1504
852f689e 1505/* Return true if an error or a "sorry" has been seen. Various
1506 processing is disabled after errors. */
1507bool
1508seen_error (void)
1509{
1510 return errorcount || sorrycount;
1511}
1512
4d0069ee 1513/* An error which is severe enough that we make no attempt to
1514 continue. Do not use this for internal consistency checks; that's
1515 internal_error. Use of this function should be rare. */
1516void
1517fatal_error (location_t loc, const char *gmsgid, ...)
1518{
bc35ef65 1519 auto_diagnostic_group d;
4d0069ee 1520 va_list ap;
4d0069ee 1521 va_start (ap, gmsgid);
a262d9cd 1522 rich_location richloc (line_table, loc);
1523 diagnostic_impl (&richloc, -1, gmsgid, &ap, DK_FATAL);
4d0069ee 1524 va_end (ap);
1525
1526 gcc_unreachable ();
1527}
1528
2faf8f38 1529/* An internal consistency check has failed. We make no attempt to
1530 continue. Note that unless there is debugging value to be had from
1531 a more specific message, or some other good reason, you should use
1532 abort () instead of calling this function directly. */
1533void
380c6697 1534internal_error (const char *gmsgid, ...)
19fafbd3 1535{
bc35ef65 1536 auto_diagnostic_group d;
ee582a61 1537 va_list ap;
380c6697 1538 va_start (ap, gmsgid);
a262d9cd 1539 rich_location richloc (line_table, input_location);
1540 diagnostic_impl (&richloc, -1, gmsgid, &ap, DK_ICE);
ee582a61 1541 va_end (ap);
19fafbd3 1542
583fa9e0 1543 gcc_unreachable ();
19fafbd3 1544}
9d7131bf 1545
1546/* Like internal_error, but no backtrace will be printed. Used when
1547 the internal error does not happen at the current location, but happened
1548 somewhere else. */
1549void
1550internal_error_no_backtrace (const char *gmsgid, ...)
1551{
bc35ef65 1552 auto_diagnostic_group d;
9d7131bf 1553 va_list ap;
9d7131bf 1554 va_start (ap, gmsgid);
a262d9cd 1555 rich_location richloc (line_table, input_location);
1556 diagnostic_impl (&richloc, -1, gmsgid, &ap, DK_ICE_NOBT);
9d7131bf 1557 va_end (ap);
1558
1559 gcc_unreachable ();
1560}
2faf8f38 1561\f
2faf8f38 1562/* Special case error functions. Most are implemented in terms of the
1563 above, or should be. */
88da234d 1564
2faf8f38 1565/* Print a diagnostic MSGID on FILE. This is just fprintf, except it
1566 runs its second argument through gettext. */
9cab5830 1567void
380c6697 1568fnotice (FILE *file, const char *cmsgid, ...)
9cab5830 1569{
ee582a61 1570 va_list ap;
9cab5830 1571
380c6697 1572 va_start (ap, cmsgid);
1573 vfprintf (file, _(cmsgid), ap);
ee582a61 1574 va_end (ap);
9cab5830 1575}
1576
2faf8f38 1577/* Inform the user that an error occurred while trying to report some
1578 other error. This indicates catastrophic internal inconsistencies,
1579 so give up now. But do try to flush out the previous error.
1580 This mustn't use internal_error, that will cause infinite recursion. */
1581
1582static void
d598ad0d 1583error_recursion (diagnostic_context *context)
2faf8f38 1584{
1585 if (context->lock < 3)
5f7f600e 1586 pp_newline_and_flush (context->printer);
2faf8f38 1587
1588 fnotice (stderr,
1589 "Internal compiler error: Error reporting routines re-entered.\n");
583fa9e0 1590
1591 /* Call diagnostic_action_after_output to get the "please submit a bug
716da296 1592 report" message. */
1593 diagnostic_action_after_output (context, DK_ICE);
583fa9e0 1594
1595 /* Do not use gcc_unreachable here; that goes through internal_error
1596 and therefore would cause infinite recursion. */
1597 real_abort ();
2faf8f38 1598}
1599
1600/* Report an internal compiler error in a friendly manner. This is
1601 the function that gets called upon use of abort() in the source
1602 code generally, thanks to a special macro. */
1603
1604void
d598ad0d 1605fancy_abort (const char *file, int line, const char *function)
2faf8f38 1606{
1607 internal_error ("in %s, at %s:%d", function, trim_filename (file), line);
1608}
1609
bc35ef65 1610/* class auto_diagnostic_group. */
1611
1612/* Constructor: "push" this group into global_dc. */
1613
1614auto_diagnostic_group::auto_diagnostic_group ()
1615{
1616 global_dc->diagnostic_group_nesting_depth++;
1617}
1618
1619/* Destructor: "pop" this group from global_dc. */
1620
1621auto_diagnostic_group::~auto_diagnostic_group ()
1622{
1623 if (--global_dc->diagnostic_group_nesting_depth == 0)
1624 {
1625 /* Handle the case where we've popped the final diagnostic group.
1626 If any diagnostics were emitted, give the context a chance
1627 to do something. */
1628 if (global_dc->diagnostic_group_emission_count > 0)
1629 {
1630 if (global_dc->end_group_cb)
1631 global_dc->end_group_cb (global_dc);
1632 }
1633 global_dc->diagnostic_group_emission_count = 0;
1634 }
1635}
1636
5f07bab0 1637/* Really call the system 'abort'. This has to go right at the end of
1638 this file, so that there are no functions after it that call abort
1639 and get the system abort instead of our macro. */
1640#undef abort
d598ad0d 1641static void
1642real_abort (void)
5f07bab0 1643{
1644 abort ();
1645}
6628b04d 1646
1647#if CHECKING_P
1648
1649namespace selftest {
1650
1651/* Helper function for test_print_escaped_string. */
1652
1653static void
1654assert_print_escaped_string (const location &loc, const char *expected_output,
1655 const char *input)
1656{
1657 pretty_printer pp;
1658 print_escaped_string (&pp, input);
1659 ASSERT_STREQ_AT (loc, expected_output, pp_formatted_text (&pp));
1660}
1661
1662#define ASSERT_PRINT_ESCAPED_STRING_STREQ(EXPECTED_OUTPUT, INPUT) \
1663 assert_print_escaped_string (SELFTEST_LOCATION, EXPECTED_OUTPUT, INPUT)
1664
1665/* Tests of print_escaped_string. */
1666
1667static void
1668test_print_escaped_string ()
1669{
1670 /* Empty string. */
1671 ASSERT_PRINT_ESCAPED_STRING_STREQ ("\"\"", "");
1672
1673 /* Non-empty string. */
1674 ASSERT_PRINT_ESCAPED_STRING_STREQ ("\"hello world\"", "hello world");
1675
1676 /* Various things that need to be escaped: */
1677 /* Backslash. */
1678 ASSERT_PRINT_ESCAPED_STRING_STREQ ("\"before\\\\after\"",
1679 "before\\after");
1680 /* Tab. */
1681 ASSERT_PRINT_ESCAPED_STRING_STREQ ("\"before\\tafter\"",
1682 "before\tafter");
1683 /* Newline. */
1684 ASSERT_PRINT_ESCAPED_STRING_STREQ ("\"before\\nafter\"",
1685 "before\nafter");
1686 /* Double quote. */
1687 ASSERT_PRINT_ESCAPED_STRING_STREQ ("\"before\\\"after\"",
1688 "before\"after");
1689
1690 /* Non-printable characters: BEL: '\a': 0x07 */
1691 ASSERT_PRINT_ESCAPED_STRING_STREQ ("\"before\\007after\"",
1692 "before\aafter");
1693 /* Non-printable characters: vertical tab: '\v': 0x0b */
1694 ASSERT_PRINT_ESCAPED_STRING_STREQ ("\"before\\013after\"",
1695 "before\vafter");
1696}
1697
1698/* Tests of print_parseable_fixits. */
1699
1700/* Verify that print_parseable_fixits emits the empty string if there
1701 are no fixits. */
1702
1703static void
1704test_print_parseable_fixits_none ()
1705{
1706 pretty_printer pp;
1707 rich_location richloc (line_table, UNKNOWN_LOCATION);
1708
1709 print_parseable_fixits (&pp, &richloc);
1710 ASSERT_STREQ ("", pp_formatted_text (&pp));
1711}
1712
1713/* Verify that print_parseable_fixits does the right thing if there
1714 is an insertion fixit hint. */
1715
1716static void
1717test_print_parseable_fixits_insert ()
1718{
1719 pretty_printer pp;
1720 rich_location richloc (line_table, UNKNOWN_LOCATION);
1721
1722 linemap_add (line_table, LC_ENTER, false, "test.c", 0);
1723 linemap_line_start (line_table, 5, 100);
1724 linemap_add (line_table, LC_LEAVE, false, NULL, 0);
1725 location_t where = linemap_position_for_column (line_table, 10);
68ef907c 1726 richloc.add_fixit_insert_before (where, "added content");
6628b04d 1727
1728 print_parseable_fixits (&pp, &richloc);
1729 ASSERT_STREQ ("fix-it:\"test.c\":{5:10-5:10}:\"added content\"\n",
1730 pp_formatted_text (&pp));
1731}
1732
1733/* Verify that print_parseable_fixits does the right thing if there
1734 is an removal fixit hint. */
1735
1736static void
1737test_print_parseable_fixits_remove ()
1738{
1739 pretty_printer pp;
1740 rich_location richloc (line_table, UNKNOWN_LOCATION);
1741
1742 linemap_add (line_table, LC_ENTER, false, "test.c", 0);
1743 linemap_line_start (line_table, 5, 100);
1744 linemap_add (line_table, LC_LEAVE, false, NULL, 0);
1745 source_range where;
1746 where.m_start = linemap_position_for_column (line_table, 10);
1747 where.m_finish = linemap_position_for_column (line_table, 20);
1748 richloc.add_fixit_remove (where);
1749
1750 print_parseable_fixits (&pp, &richloc);
1751 ASSERT_STREQ ("fix-it:\"test.c\":{5:10-5:21}:\"\"\n",
1752 pp_formatted_text (&pp));
1753}
1754
1755/* Verify that print_parseable_fixits does the right thing if there
1756 is an replacement fixit hint. */
1757
1758static void
1759test_print_parseable_fixits_replace ()
1760{
1761 pretty_printer pp;
1762 rich_location richloc (line_table, UNKNOWN_LOCATION);
1763
1764 linemap_add (line_table, LC_ENTER, false, "test.c", 0);
1765 linemap_line_start (line_table, 5, 100);
1766 linemap_add (line_table, LC_LEAVE, false, NULL, 0);
1767 source_range where;
1768 where.m_start = linemap_position_for_column (line_table, 10);
1769 where.m_finish = linemap_position_for_column (line_table, 20);
1770 richloc.add_fixit_replace (where, "replacement");
1771
1772 print_parseable_fixits (&pp, &richloc);
1773 ASSERT_STREQ ("fix-it:\"test.c\":{5:10-5:21}:\"replacement\"\n",
1774 pp_formatted_text (&pp));
1775}
1776
fd3a7b2d 1777/* Verify that
1778 diagnostic_get_location_text (..., SHOW_COLUMN)
1779 generates EXPECTED_LOC_TEXT, given FILENAME, LINE, COLUMN, with
1780 colorization disabled. */
1781
1782static void
1783assert_location_text (const char *expected_loc_text,
1784 const char *filename, int line, int column,
1785 bool show_column)
1786{
1787 test_diagnostic_context dc;
1788 dc.show_column = show_column;
1789
1790 expanded_location xloc;
1791 xloc.file = filename;
1792 xloc.line = line;
1793 xloc.column = column;
1794 xloc.data = NULL;
1795 xloc.sysp = false;
1796
1797 char *actual_loc_text = diagnostic_get_location_text (&dc, xloc);
1798 ASSERT_STREQ (expected_loc_text, actual_loc_text);
1799 free (actual_loc_text);
1800}
1801
1802/* Verify that diagnostic_get_location_text works as expected. */
1803
1804static void
1805test_diagnostic_get_location_text ()
1806{
1807 const char *old_progname = progname;
1808 progname = "PROGNAME";
1809 assert_location_text ("PROGNAME:", NULL, 0, 0, true);
1810 assert_location_text ("<built-in>:", "<built-in>", 42, 10, true);
1811 assert_location_text ("foo.c:42:10:", "foo.c", 42, 10, true);
786bf3ad 1812 assert_location_text ("foo.c:42:", "foo.c", 42, 0, true);
1813 assert_location_text ("foo.c:", "foo.c", 0, 10, true);
fd3a7b2d 1814 assert_location_text ("foo.c:42:", "foo.c", 42, 10, false);
786bf3ad 1815 assert_location_text ("foo.c:", "foo.c", 0, 10, false);
1816
1817 maybe_line_and_column (INT_MAX, INT_MAX);
1818 maybe_line_and_column (INT_MIN, INT_MIN);
1819
fd3a7b2d 1820 progname = old_progname;
1821}
1822
934182c6 1823/* Selftest for num_digits. */
1824
1825static void
1826test_num_digits ()
1827{
1828 ASSERT_EQ (1, num_digits (0));
1829 ASSERT_EQ (1, num_digits (9));
1830 ASSERT_EQ (2, num_digits (10));
1831 ASSERT_EQ (2, num_digits (99));
1832 ASSERT_EQ (3, num_digits (100));
1833 ASSERT_EQ (3, num_digits (999));
1834 ASSERT_EQ (4, num_digits (1000));
1835 ASSERT_EQ (4, num_digits (9999));
1836 ASSERT_EQ (5, num_digits (10000));
1837 ASSERT_EQ (5, num_digits (99999));
1838 ASSERT_EQ (6, num_digits (100000));
1839 ASSERT_EQ (6, num_digits (999999));
1840 ASSERT_EQ (7, num_digits (1000000));
1841 ASSERT_EQ (7, num_digits (9999999));
1842 ASSERT_EQ (8, num_digits (10000000));
1843 ASSERT_EQ (8, num_digits (99999999));
1844}
1845
6628b04d 1846/* Run all of the selftests within this file. */
1847
1848void
1849diagnostic_c_tests ()
1850{
1851 test_print_escaped_string ();
1852 test_print_parseable_fixits_none ();
1853 test_print_parseable_fixits_insert ();
1854 test_print_parseable_fixits_remove ();
1855 test_print_parseable_fixits_replace ();
fd3a7b2d 1856 test_diagnostic_get_location_text ();
934182c6 1857 test_num_digits ();
1858
6628b04d 1859}
1860
1861} // namespace selftest
1862
1863#endif /* #if CHECKING_P */