This patch implements -fdiagnostics-nn-line-numbers, a new option which makes diagnostic_show_locus print "NN" rather than specific line numbers when printing the left margin.
This is intended purely to make it easier to write certain kinds of DejaGnu test; various integration tests for diagnostic paths later in the patch kit make use of it. gcc/ChangeLog: * common.opt (fdiagnostics-nn-line-numbers): New option. * diagnostic-show-locus.c (layout::m_use_nn_for_line_numbers_p): New field. (layout::layout): Initialize it and use it when computing m_linenum_width. (layout::print_source_line): Implement printing "NN" rather than the line number. (selftest::test_line_numbers_multiline_range): Add a test of "NN" printing. * diagnostic.c (diagnostic_initialize): Initialize use_nn_for_line_numbers_p. (num_digits): Add "use_nn_p" param. (selftest::test_num_digits): Add a test for use_nn_p==true. * diagnostic.h (diagnostic_context::use_nn_for_line_numbers_p): New field. (num_digits): Add optional "use_nn_p" param. * doc/invoke.texi (-fdiagnostics-nn-line-numbers): New option. * dwarf2out.c (gen_producer_string): Ignore OPT_fdiagnostics_nn_line_numbers. * lto-wrapper.c (merge_and_complain): Handle OPT_fdiagnostics_nn_line_numbers. (append_compiler_options): Likewise. (append_diag_options): Likewise. * opts.c (common_handle_option): Likewise. * toplev.c (general_init): Initialize global_dc->use_nn_for_line_numbers_p. --- gcc/common.opt | 4 ++++ gcc/diagnostic-show-locus.c | 51 ++++++++++++++++++++++++++++++++------------- gcc/diagnostic.c | 13 ++++++++++-- gcc/diagnostic.h | 6 +++++- gcc/doc/invoke.texi | 7 +++++++ gcc/dwarf2out.c | 1 + gcc/lto-wrapper.c | 3 +++ gcc/opts.c | 4 ++++ gcc/toplev.c | 2 ++ 9 files changed, 73 insertions(+), 18 deletions(-) diff --git a/gcc/common.opt b/gcc/common.opt index 124e8cf..3c024b3 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -1257,6 +1257,10 @@ fdiagnostics-show-line-numbers Common Var(flag_diagnostics_show_line_numbers) Init(1) Show line numbers in the left margin when showing source. +fdiagnostics-nn-line-numbers +Common Var(flag_diagnostics_nn_line_numbers) Init(0) +Replace line numbers with 'NN' when showing source. + fdiagnostics-color Common Alias(fdiagnostics-color=,always,never) ; diff --git a/gcc/diagnostic-show-locus.c b/gcc/diagnostic-show-locus.c index 412b0d4..ec5fdc0 100644 --- a/gcc/diagnostic-show-locus.c +++ b/gcc/diagnostic-show-locus.c @@ -303,6 +303,7 @@ class layout bool m_colorize_source_p; bool m_show_labels_p; bool m_show_line_numbers_p; + bool m_use_nn_for_line_numbers_p; auto_vec <layout_range> m_layout_ranges; auto_vec <const fixit_hint *> m_fixit_hints; auto_vec <line_span> m_line_spans; @@ -849,6 +850,7 @@ layout::layout (diagnostic_context * context, m_colorize_source_p (context->colorize_source_p), m_show_labels_p (context->show_labels_p), m_show_line_numbers_p (context->show_line_numbers_p), + m_use_nn_for_line_numbers_p (context->use_nn_for_line_numbers_p), m_layout_ranges (richloc->get_num_locations ()), m_fixit_hints (richloc->get_num_fixit_hints ()), m_line_spans (1 + richloc->get_num_locations ()), @@ -884,7 +886,7 @@ layout::layout (diagnostic_context * context, int highest_line = last_span->m_last_line; if (highest_line < 0) highest_line = 0; - m_linenum_width = num_digits (highest_line); + m_linenum_width = num_digits (highest_line, m_use_nn_for_line_numbers_p); /* If we're showing jumps in the line-numbering, allow at least 3 chars. */ if (m_line_spans.length () > 1) m_linenum_width = MAX (m_linenum_width, 3); @@ -1272,10 +1274,13 @@ layout::print_source_line (linenum_type row, const char *line, int line_width, if (m_show_line_numbers_p) { - int width = num_digits (row); + int width = num_digits (row, m_use_nn_for_line_numbers_p); for (int i = 0; i < m_linenum_width - width; i++) pp_space (m_pp); - pp_printf (m_pp, "%i | ", row); + if (m_use_nn_for_line_numbers_p) + pp_printf (m_pp, "%s | ", "NN"); + else + pp_printf (m_pp, "%i | ", row); } else pp_space (m_pp); @@ -3778,18 +3783,34 @@ test_line_numbers_multiline_range () = linemap_position_for_line_and_column (line_table, ord_map, 11, 4); location_t loc = make_location (caret, start, finish); - test_diagnostic_context dc; - dc.show_line_numbers_p = true; - dc.min_margin_width = 0; - gcc_rich_location richloc (loc); - diagnostic_show_locus (&dc, &richloc, DK_ERROR); - ASSERT_STREQ (" 9 | this is line 9\n" - " | ~~~~~~\n" - "10 | this is line 10\n" - " | ~~~~~^~~~~~~~~~\n" - "11 | this is line 11\n" - " | ~~~~ \n", - pp_formatted_text (dc.printer)); + { + test_diagnostic_context dc; + dc.show_line_numbers_p = true; + dc.min_margin_width = 0; + gcc_rich_location richloc (loc); + diagnostic_show_locus (&dc, &richloc, DK_ERROR); + ASSERT_STREQ (" 9 | this is line 9\n" + " | ~~~~~~\n" + "10 | this is line 10\n" + " | ~~~~~^~~~~~~~~~\n" + "11 | this is line 11\n" + " | ~~~~ \n", + pp_formatted_text (dc.printer)); + } + + /* Verify that obscuring line numbers via "NN" works (and always uses + at least two columns). */ + { + test_diagnostic_context dc; + dc.show_line_numbers_p = true; + dc.use_nn_for_line_numbers_p = true; + dc.min_margin_width = 0; + gcc_rich_location richloc (start); + diagnostic_show_locus (&dc, &richloc, DK_ERROR); + ASSERT_STREQ ("NN | this is line 9\n" + " | ^\n", + pp_formatted_text (dc.printer)); + } } /* Run all of the selftests within this file. */ diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index d6604e6..81e0a10 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -209,6 +209,7 @@ diagnostic_initialize (diagnostic_context *context, int n_opts) context->colorize_source_p = false; context->show_labels_p = false; context->show_line_numbers_p = false; + context->use_nn_for_line_numbers_p = false; context->min_margin_width = 0; context->show_ruler_p = false; context->parseable_fixits_p = false; @@ -1078,15 +1079,21 @@ diagnostic_report_diagnostic (diagnostic_context *context, return true; } -/* Get the number of digits in the decimal representation of VALUE. */ +/* Get the number of digits in the decimal representation of VALUE. + + If USE_NN_P is true, return 2 (for the case where all numbers are to + be printed as just "NN"). */ int -num_digits (int value) +num_digits (int value, bool use_nn_p) { /* Perhaps simpler to use log10 for this, but doing it this way avoids using floating point. */ gcc_assert (value >= 0); + if (use_nn_p) + return 2; + if (value == 0) return 1; @@ -1885,6 +1892,8 @@ test_num_digits () ASSERT_EQ (7, num_digits (9999999)); ASSERT_EQ (8, num_digits (10000000)); ASSERT_EQ (8, num_digits (99999999)); + + ASSERT_EQ (2, num_digits (1000, true)); } /* Run all of the selftests within this file. */ diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h index 91e4c50..2fb75e6 100644 --- a/gcc/diagnostic.h +++ b/gcc/diagnostic.h @@ -233,6 +233,10 @@ struct diagnostic_context showing line numbers? */ bool show_line_numbers_p; + /* When printing line numbers, should the actual numbers be replaced with + "NN"? (for ease of DejaGnu testing) */ + bool use_nn_for_line_numbers_p; + /* If printing source code, what should the minimum width of the margin be? Line numbers will be right-aligned, and padded to this width. */ int min_margin_width; @@ -432,6 +436,6 @@ extern void diagnostic_output_format_init (diagnostic_context *, enum diagnostics_output_format); /* Compute the number of digits in the decimal representation of an integer. */ -extern int num_digits (int); +extern int num_digits (int, bool use_nn_p = false); #endif /* ! GCC_DIAGNOSTIC_H */ diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 384848a..fc92913 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -278,6 +278,7 @@ Objective-C and Objective-C++ Dialects}. -fdiagnostics-format=@r{[}text@r{|}json@r{]} @gol -fno-diagnostics-show-option -fno-diagnostics-show-caret @gol -fno-diagnostics-show-labels -fno-diagnostics-show-line-numbers @gol +-fdiagnostics-nn-line-numbers @gol -fdiagnostics-minimum-margin-width=@var{width} @gol -fdiagnostics-parseable-fixits -fdiagnostics-generate-patch @gol -fdiagnostics-show-template-tree -fno-elide-type @gol @@ -4018,6 +4019,12 @@ By default, when printing source code (via @option{-fdiagnostics-show-caret}), a left margin is printed, showing line numbers. This option suppresses this left margin. +@item -fdiagnostics-nn-line-numbers +@opindex fdiagnostics-nn-line-numbers +When printing source code in diagnostics, replace line numbers ``NN''. +This option is intended for GCC developers, to make it easier to write +certain kinds of automated test. + @item -fdiagnostics-minimum-margin-width=@var{width} @opindex fdiagnostics-minimum-margin-width This option controls the minimum width of the left margin printed by diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index bf69ce4..3207040 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -24490,6 +24490,7 @@ gen_producer_string (void) case OPT_fdiagnostics_show_caret: case OPT_fdiagnostics_show_labels: case OPT_fdiagnostics_show_line_numbers: + case OPT_fdiagnostics_nn_line_numbers: case OPT_fdiagnostics_color_: case OPT_fdiagnostics_format_: case OPT_fverbose_asm: diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c index 9a7bbd0..aabfe6d 100644 --- a/gcc/lto-wrapper.c +++ b/gcc/lto-wrapper.c @@ -260,6 +260,7 @@ merge_and_complain (struct cl_decoded_option **decoded_options, case OPT_fdiagnostics_show_caret: case OPT_fdiagnostics_show_labels: case OPT_fdiagnostics_show_line_numbers: + case OPT_fdiagnostics_nn_line_numbers: case OPT_fdiagnostics_show_option: case OPT_fdiagnostics_show_location_: case OPT_fshow_column: @@ -605,6 +606,7 @@ append_compiler_options (obstack *argv_obstack, struct cl_decoded_option *opts, case OPT_fdiagnostics_show_caret: case OPT_fdiagnostics_show_labels: case OPT_fdiagnostics_show_line_numbers: + case OPT_fdiagnostics_nn_line_numbers: case OPT_fdiagnostics_show_option: case OPT_fdiagnostics_show_location_: case OPT_fshow_column: @@ -653,6 +655,7 @@ append_diag_options (obstack *argv_obstack, struct cl_decoded_option *opts, case OPT_fdiagnostics_format_: case OPT_fdiagnostics_show_caret: case OPT_fdiagnostics_show_labels: + case OPT_fdiagnostics_nn_line_numbers: case OPT_fdiagnostics_show_line_numbers: case OPT_fdiagnostics_show_option: case OPT_fdiagnostics_show_location_: diff --git a/gcc/opts.c b/gcc/opts.c index 32869ca..9928d01 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -2470,6 +2470,10 @@ common_handle_option (struct gcc_options *opts, dc->show_line_numbers_p = value; break; + case OPT_fdiagnostics_nn_line_numbers: + dc->use_nn_for_line_numbers_p = value; + break; + case OPT_fdiagnostics_color_: diagnostic_color_init (dc, value); break; diff --git a/gcc/toplev.c b/gcc/toplev.c index 1c7002f..2d0a390 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1100,6 +1100,8 @@ general_init (const char *argv0, bool init_signals) = global_options_init.x_flag_diagnostics_show_labels; global_dc->show_line_numbers_p = global_options_init.x_flag_diagnostics_show_line_numbers; + global_dc->use_nn_for_line_numbers_p + = global_options_init.x_flag_diagnostics_nn_line_numbers; global_dc->show_option_requested = global_options_init.x_flag_diagnostics_show_option; global_dc->min_margin_width -- 1.8.5.3