diagnostics: Support conversion of tabs to spaces [PR49973] [PR86904]
authorLewis Hyatt <lhyatt@gmail.com>
Tue, 14 Jul 2020 16:05:56 +0000 (12:05 -0400)
committerLewis Hyatt <lhyatt@gmail.com>
Tue, 14 Jul 2020 16:05:56 +0000 (12:05 -0400)
commit004bb936d6d5f177af26ad4905595e843d5665a5
treefe3ee343abc249a14509943f4e731f8fb73f6206
parent5f809982e8e05c39029431363e08759d6c750f0e
diagnostics: Support conversion of tabs to spaces [PR49973] [PR86904]

Supports conversion of tabs to spaces when outputting diagnostics. Also
adds -fdiagnostics-column-unit and -fdiagnostics-column-origin options to
control how the column number is output, thereby resolving the two PRs.

gcc/c-family/ChangeLog:

PR other/86904
* c-indentation.c (should_warn_for_misleading_indentation): Get
global tabstop from the new source.
* c-opts.c (c_common_handle_option): Remove handling of -ftabstop, which
is now a common option.
* c.opt: Likewise.

gcc/ChangeLog:

PR preprocessor/49973
PR other/86904
* common.opt: Handle -ftabstop here instead of in c-family
options.  Add -fdiagnostics-column-unit= and
-fdiagnostics-column-origin= options.
* opts.c (common_handle_option): Handle the new options.
* diagnostic-format-json.cc (json_from_expanded_location): Add
diagnostic_context argument.  Use it to convert column numbers as per
the new options.
(json_from_location_range): Likewise.
(json_from_fixit_hint): Likewise.
(json_end_diagnostic): Pass the new context argument to helper
functions above.  Add "column-origin" field to the output.
(test_unknown_location): Add the new context argument to calls to
helper functions.
(test_bad_endpoints): Likewise.
* diagnostic-show-locus.c
(exploc_with_display_col::exploc_with_display_col): Support
tabstop parameter.
(layout_point::layout_point): Make use of class
exploc_with_display_col.
(layout_range::layout_range): Likewise.
(struct line_bounds): Clarify that the units are now always
display columns.  Rename members accordingly.  Add constructor.
(layout::print_source_line): Add support for tab expansion.
(make_range): Adapt to class layout_range changes.
(layout::maybe_add_location_range): Likewise.
(layout::layout): Adapt to class exploc_with_display_col changes.
(layout::calculate_x_offset_display): Support tabstop parameter.
(layout::print_annotation_line): Adapt to struct line_bounds changes.
(layout::print_line): Likewise.
(line_label::line_label): Add diagnostic_context argument.
(get_affected_range): Likewise.
(get_printed_columns): Likewise.
(layout::print_any_labels): Adapt to struct line_label changes.
(class correction): Add m_tabstop member.
(correction::correction): Add tabstop argument.
(correction::compute_display_cols): Use m_tabstop.
(class line_corrections): Add m_context member.
(line_corrections::line_corrections): Add diagnostic_context argument.
(line_corrections::add_hint): Use m_context to handle tabstops.
(layout::print_trailing_fixits): Adapt to class line_corrections
changes.
(test_layout_x_offset_display_utf8): Support tabstop parameter.
(test_layout_x_offset_display_tab): New selftest.
(test_one_liner_colorized_utf8): Likewise.
(test_tab_expansion): Likewise.
(test_diagnostic_show_locus_one_liner_utf8): Call the new tests.
(diagnostic_show_locus_c_tests): Likewise.
(test_overlapped_fixit_printing): Adapt to helper class and
function changes.
(test_overlapped_fixit_printing_utf8): Likewise.
(test_overlapped_fixit_printing_2): Likewise.
* diagnostic.h (enum diagnostics_column_unit): New enum.
(struct diagnostic_context): Add members for the new options.
(diagnostic_converted_column): Declare.
(json_from_expanded_location): Add new context argument.
* diagnostic.c (diagnostic_initialize): Initialize new members.
(diagnostic_converted_column): New function.
(maybe_line_and_column): Be willing to output a column of 0.
(diagnostic_get_location_text): Convert column number as per the new
options.
(diagnostic_report_current_module): Likewise.
(assert_location_text): Add origin and column_unit arguments for
testing the new functionality.
(test_diagnostic_get_location_text): Test the new functionality.
* doc/invoke.texi: Document the new options and behavior.
* input.h (location_compute_display_column): Add tabstop argument.
* input.c (location_compute_display_column): Likewise.
(test_cpp_utf8): Add selftests for tab expansion.
* tree-diagnostic-path.cc (default_tree_make_json_for_path): Pass the
new context argument to json_from_expanded_location().

libcpp/ChangeLog:

PR preprocessor/49973
PR other/86904
* include/cpplib.h (struct cpp_options):  Removed support for -ftabstop,
which is now handled by diagnostic_context.
(class cpp_display_width_computation): New class.
(cpp_byte_column_to_display_column): Add optional tabstop argument.
(cpp_display_width): Likewise.
(cpp_display_column_to_byte_column): Likewise.
* charset.c
(cpp_display_width_computation::cpp_display_width_computation): New
function.
(cpp_display_width_computation::advance_display_cols): Likewise.
(compute_next_display_width): Removed and implemented this
functionality in a new function...
(cpp_display_width_computation::process_next_codepoint): ...here.
(cpp_byte_column_to_display_column): Added tabstop argument.
Reimplemented in terms of class cpp_display_width_computation.
(cpp_display_column_to_byte_column): Likewise.
* init.c (cpp_create_reader): Remove handling of -ftabstop, which is now
handled by diagnostic_context.

gcc/testsuite/ChangeLog:

PR preprocessor/49973
PR other/86904
* c-c++-common/Wmisleading-indentation-3.c: Adjust expected output
for new defaults.
* c-c++-common/Wmisleading-indentation.c: Likewise.
* c-c++-common/diagnostic-format-json-1.c: Likewise.
* c-c++-common/diagnostic-format-json-2.c: Likewise.
* c-c++-common/diagnostic-format-json-3.c: Likewise.
* c-c++-common/diagnostic-format-json-4.c: Likewise.
* c-c++-common/diagnostic-format-json-5.c: Likewise.
* c-c++-common/missing-close-symbol.c: Likewise.
* g++.dg/diagnostic/bad-binary-ops.C: Likewise.
* g++.dg/parse/error4.C: Likewise.
* g++.old-deja/g++.brendan/crash11.C: Likewise.
* g++.old-deja/g++.pt/overload2.C: Likewise.
* g++.old-deja/g++.robertl/eb109.C: Likewise.
* gcc.dg/analyzer/malloc-paths-9.c: Likewise.
* gcc.dg/bad-binary-ops.c: Likewise.
* gcc.dg/format/branch-1.c: Likewise.
* gcc.dg/format/pr79210.c: Likewise.
* gcc.dg/plugin/diagnostic-test-expressions-1.c: Likewise.
* gcc.dg/plugin/diagnostic-test-string-literals-1.c: Likewise.
* gcc.dg/redecl-4.c: Likewise.
* gfortran.dg/diagnostic-format-json-1.F90: Likewise.
* gfortran.dg/diagnostic-format-json-2.F90: Likewise.
* gfortran.dg/diagnostic-format-json-3.F90: Likewise.
* go.dg/arrayclear.go: Add a comment explaining why adding a
comment was necessary to work around a dejagnu bug.
* c-c++-common/diagnostic-units-1.c: New test.
* c-c++-common/diagnostic-units-2.c: New test.
* c-c++-common/diagnostic-units-3.c: New test.
* c-c++-common/diagnostic-units-4.c: New test.
* c-c++-common/diagnostic-units-5.c: New test.
* c-c++-common/diagnostic-units-6.c: New test.
* c-c++-common/diagnostic-units-7.c: New test.
* c-c++-common/diagnostic-units-8.c: New test.
48 files changed:
gcc/c-family/c-indentation.c
gcc/c-family/c-opts.c
gcc/c-family/c.opt
gcc/common.opt
gcc/diagnostic-format-json.cc
gcc/diagnostic-show-locus.c
gcc/diagnostic.c
gcc/diagnostic.h
gcc/doc/invoke.texi
gcc/input.c
gcc/input.h
gcc/opts.c
gcc/testsuite/c-c++-common/Wmisleading-indentation-3.c
gcc/testsuite/c-c++-common/Wmisleading-indentation.c
gcc/testsuite/c-c++-common/diagnostic-format-json-1.c
gcc/testsuite/c-c++-common/diagnostic-format-json-2.c
gcc/testsuite/c-c++-common/diagnostic-format-json-3.c
gcc/testsuite/c-c++-common/diagnostic-format-json-4.c
gcc/testsuite/c-c++-common/diagnostic-format-json-5.c
gcc/testsuite/c-c++-common/diagnostic-units-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/diagnostic-units-2.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/diagnostic-units-3.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/diagnostic-units-4.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/diagnostic-units-5.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/diagnostic-units-6.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/diagnostic-units-7.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/diagnostic-units-8.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/missing-close-symbol.c
gcc/testsuite/g++.dg/diagnostic/bad-binary-ops.C
gcc/testsuite/g++.dg/parse/error4.C
gcc/testsuite/g++.old-deja/g++.brendan/crash11.C
gcc/testsuite/g++.old-deja/g++.pt/overload2.C
gcc/testsuite/g++.old-deja/g++.robertl/eb109.C
gcc/testsuite/gcc.dg/analyzer/malloc-paths-9.c
gcc/testsuite/gcc.dg/bad-binary-ops.c
gcc/testsuite/gcc.dg/format/branch-1.c
gcc/testsuite/gcc.dg/format/pr79210.c
gcc/testsuite/gcc.dg/plugin/diagnostic-test-expressions-1.c
gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-1.c
gcc/testsuite/gcc.dg/redecl-4.c
gcc/testsuite/gfortran.dg/diagnostic-format-json-1.F90
gcc/testsuite/gfortran.dg/diagnostic-format-json-2.F90
gcc/testsuite/gfortran.dg/diagnostic-format-json-3.F90
gcc/testsuite/go.dg/arrayclear.go
gcc/tree-diagnostic-path.cc
libcpp/charset.c
libcpp/include/cpplib.h
libcpp/init.c