diagnostics: show an extra line of context in line-insertion fix-it hints (PR 87091)

This patch tweaks how we print line-insertion fix-it hints, so that
the line before the insertion point is also printed, to give the user
more context on the proposed change.

For example, it changes:

  ../x86_64-pc-linux-gnu/libstdc++-v3/include/vector:87:22: note: message
  +++ |+#include <vector>
   74 | #endif
  ....
   87 |       using vector = std::vector<_Tp, polymorphic_allocator<_Tp>>;
      |                      ^~~

to:

  ../x86_64-pc-linux-gnu/libstdc++-v3/include/vector:87:22: note: message
   73 | # include <debug/vector>
  +++ |+#include <vector>
   74 | #endif
  ....
   87 |       using vector = std::vector<_Tp, polymorphic_allocator<_Tp>>;
      |                      ^~~

gcc/ChangeLog:
	PR 87091
	* diagnostic-show-locus.c (get_line_span_for_fixit_hint): Show the
	line above for line-insertion fix-it hints.
	(selftest::test_fixit_insert_containing_newline): Update the
	expected results, and add a test with line-numbering enabled.

gcc/testsuite/ChangeLog:
	PR 87091
	* g++.dg/pr85523.C: Extend expected output to show line
	before line-insertion fix-it hint.
	* gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c
	(test_fixit_insert_newline): Add previous line to expected output.
	* gcc.dg/plugin/diagnostic-test-show-locus-bw.c: Likewise.
	* gcc.dg/plugin/diagnostic-test-show-locus-color.c: Likewise.

From-SVN: r263884
This commit is contained in:
David Malcolm 2018-08-27 13:46:32 +00:00 committed by David Malcolm
parent 47c3496bf8
commit df308f8160
7 changed files with 59 additions and 8 deletions

View File

@ -1,3 +1,11 @@
2018-08-27 David Malcolm <dmalcolm@redhat.com>
PR 87091
* diagnostic-show-locus.c (get_line_span_for_fixit_hint): Show the
line above for line-insertion fix-it hints.
(selftest::test_fixit_insert_containing_newline): Update the
expected results, and add a test with line-numbering enabled.
2018-08-27 Martin Liska <mliska@suse.cz>
PR sanitizer/86962

View File

@ -1159,7 +1159,16 @@ static line_span
get_line_span_for_fixit_hint (const fixit_hint *hint)
{
gcc_assert (hint);
return line_span (LOCATION_LINE (hint->get_start_loc ()),
int start_line = LOCATION_LINE (hint->get_start_loc ());
/* For line-insertion fix-it hints, add the previous line to the
span, to give the user more context on the proposed change. */
if (hint->ends_with_newline_p ())
if (start_line > 1)
start_line--;
return line_span (start_line,
LOCATION_LINE (hint->get_next_loc ()));
}
@ -3479,13 +3488,31 @@ test_fixit_insert_containing_newline (const line_table_case &case_)
{
rich_location richloc (line_table, case_loc);
richloc.add_fixit_insert_before (line_start, " break;\n");
test_diagnostic_context dc;
diagnostic_show_locus (&dc, &richloc, DK_ERROR);
ASSERT_STREQ ("\n"
"+ break;\n"
" case 'b':\n"
" ^~~~~~~~~\n",
pp_formatted_text (dc.printer));
/* Without line numbers. */
{
test_diagnostic_context dc;
diagnostic_show_locus (&dc, &richloc, DK_ERROR);
ASSERT_STREQ ("\n"
" x = a;\n"
"+ break;\n"
" case 'b':\n"
" ^~~~~~~~~\n",
pp_formatted_text (dc.printer));
}
/* With line numbers. */
{
test_diagnostic_context dc;
dc.show_line_numbers_p = true;
diagnostic_show_locus (&dc, &richloc, DK_ERROR);
ASSERT_STREQ ("\n"
"2 | x = a;\n"
"+ |+ break;\n"
"3 | case 'b':\n"
" | ^~~~~~~~~\n",
pp_formatted_text (dc.printer));
}
}
/* Verify that attempts to add text with a newline fail when the

View File

@ -1,3 +1,13 @@
2018-08-27 David Malcolm <dmalcolm@redhat.com>
PR 87091
* g++.dg/pr85523.C: Extend expected output to show line
before line-insertion fix-it hint.
* gcc.dg/plugin/diagnostic-test-show-locus-bw-line-numbers.c
(test_fixit_insert_newline): Add previous line to expected output.
* gcc.dg/plugin/diagnostic-test-show-locus-bw.c: Likewise.
* gcc.dg/plugin/diagnostic-test-show-locus-color.c: Likewise.
2018-08-27 Martin Liska <mliska@suse.cz>
PR sanitizer/86962

View File

@ -47,6 +47,7 @@ struct s5 {
i = z.i;
} // { dg-warning "no return statement in function returning non-void" }
/* { dg-begin-multiline-output "" }
i = z.i;
+ return *this;
}
^
@ -63,6 +64,7 @@ struct s6 {
i = z.i;
} // { dg-warning "no return statement in function returning non-void" }
/* { dg-begin-multiline-output "" }
i = z.i;
+ return *this;
}
^
@ -81,6 +83,7 @@ struct s7 {
i = z.i;
} // { dg-warning "no return statement in function returning non-void" }
/* { dg-begin-multiline-output "" }
i = z.i;
+ return *this;
}
^

View File

@ -111,6 +111,7 @@ void test_fixit_insert_newline (void)
x = b;
}
/* { dg-begin-multiline-output "" }
109 | x = a;
+++ |+ break;
110 | case 'b':
| ^~~~~~~~

View File

@ -332,6 +332,7 @@ void test_fixit_insert_newline (void)
x = b;
}
/* { dg-begin-multiline-output "" }
x = a;
+ break;
case 'b':
^~~~~~~~

View File

@ -217,6 +217,7 @@ void test_fixit_insert_newline (void)
x = b;
}
/* { dg-begin-multiline-output "" }
x = a;
+ break;
case 'b':
^~~~~~~~