diff options
author | David Malcolm <dmalcolm@redhat.com> | 2017-06-09 20:57:38 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2017-06-09 20:57:38 +0000 |
commit | b09649fdc609c79ea5acb9668636c7d8a5f64a7c (patch) | |
tree | 8ee5ecb323a5f1d30224c7950f593ad2f112c2f9 /gcc/testsuite | |
parent | c5d6c6d94e74dd2f72e323ff01ad2506115ffe05 (diff) | |
download | gcc-b09649fdc609c79ea5acb9668636c7d8a5f64a7c.zip gcc-b09649fdc609c79ea5acb9668636c7d8a5f64a7c.tar.gz gcc-b09649fdc609c79ea5acb9668636c7d8a5f64a7c.tar.bz2 |
Add support for mutually-incompatible fix-it hints
This patch adds a method:
rich_location::fixits_cannot_be_auto_applied
for ensuring that mutually-incompatible fix-its hints don't
lead to insane output from -fdiagnostics-generate-patch.
Fix-it hints within such rich_location instances are printed
as normal by diagnostic_show_locus, but don't affect the output
of -fdiagnostics-generate-patch.
gcc/ChangeLog:
* diagnostic.c (diagnostic_report_diagnostic): Only add fixits
to the edit_context if they can be auto-applied.
gcc/testsuite/ChangeLog:
* gcc.dg/plugin/diagnostic-test-show-locus-bw.c
(test_mutually_exclusive_suggestions): New test function.
* gcc.dg/plugin/diagnostic-test-show-locus-generate-patch.c
(test_mutually_exclusive_suggestions): New test function.
* gcc.dg/plugin/diagnostic-test-show-locus-parseable-fixits.c
(test_mutually_exclusive_suggestions): New test function.
* gcc.dg/plugin/diagnostic_plugin_test_show_locus.c
(test_show_locus): Add special-case for
"test_mutually_exclusive_suggestions".
libcpp/ChangeLog:
* include/line-map.h
(rich_location::fixits_cannot_be_auto_applied): New method.
(rich_location::fixits_can_be_auto_applied_p): New accessor.
(rich_location::m_fixits_cannot_be_auto_applied): New field.
* line-map.c (rich_location::rich_location): Initialize new field.
From-SVN: r249081
Diffstat (limited to 'gcc/testsuite')
5 files changed, 83 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 05a5827..cc36d7a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2017-06-09 David Malcolm <dmalcolm@redhat.com> + + * gcc.dg/plugin/diagnostic-test-show-locus-bw.c + (test_mutually_exclusive_suggestions): New test function. + * gcc.dg/plugin/diagnostic-test-show-locus-generate-patch.c + (test_mutually_exclusive_suggestions): New test function. + * gcc.dg/plugin/diagnostic-test-show-locus-parseable-fixits.c + (test_mutually_exclusive_suggestions): New test function. + * gcc.dg/plugin/diagnostic_plugin_test_show_locus.c + (test_show_locus): Add special-case for + "test_mutually_exclusive_suggestions". + 2017-06-09 Ian Lance Taylor <iant@golang.org> * gcc.dg/tree-prof/split-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw.c index 25b9d6c..100fa38 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-bw.c @@ -269,3 +269,23 @@ void test_fixit_insert_newline (void) { dg-end-multiline-output "" } */ #endif } + +/* Unit test for mutually-exclusive suggestions. */ + +void test_mutually_exclusive_suggestions (void) +{ +#if 0 + original; /* { dg-warning "warning 1" } */ +/* { dg-warning "warning 2" "" { target *-*-* } .-1 } */ +/* { dg-begin-multiline-output "" } + original; + ^~~~~~~~ + replacement_1 + { dg-end-multiline-output "" } */ +/* { dg-begin-multiline-output "" } + original; + ^~~~~~~~ + replacement_2 + { dg-end-multiline-output "" } */ +#endif +} diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-generate-patch.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-generate-patch.c index 4522dcd..f1963dd 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-generate-patch.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-generate-patch.c @@ -51,6 +51,19 @@ void test_fixit_insert_newline (void) #endif } +/* Unit test for mutually-exclusive suggestions. */ + +void test_mutually_exclusive_suggestions (void) +{ +#if 0 + original; /* { dg-warning "warning 1" } */ +/* { dg-warning "warning 2" "" { target *-*-* } .-1 } */ +/* We should not print the mutually-incompatible fix-it hints within + the generated patch; they are not listed in the big expected + multiline output below. */ +#endif +} + /* Verify the output from -fdiagnostics-generate-patch. We expect a header, containing the filename. This is the absolute path, so we can only capture it via regexps. */ diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-parseable-fixits.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-parseable-fixits.c index 25a7c3c..16162ba 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-parseable-fixits.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-show-locus-parseable-fixits.c @@ -55,3 +55,17 @@ void test_fixit_insert_newline (void) /* { dg-regexp "fix-it:.*\\{52:1-52:1\\}:.*\\n" } */ #endif } + +/* Unit test for mutually-exclusive suggestions. */ + +void test_mutually_exclusive_suggestions (void) +{ +#if 0 + original; /* { dg-warning "warning 1" } */ +/* { dg-warning "warning 2" "" { target *-*-* } .-1 } */ +/* We should print the mutually-incompatible fix-it hints within + -fdiagnostics-parseable-fixits; verify that they are printed. */ +/* { dg-regexp "fix-it:.*\\{64:3-64:11}:.*\\n" } */ +/* { dg-regexp "fix-it:.*\\{64:3-64:11}:.*\\n" } */ +#endif +} diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c index 6afb584..0a8eeba 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.c @@ -306,6 +306,30 @@ test_show_locus (function *fun) warning_at_rich_loc (&richloc, 0, "example of a replacement hint"); } + if (0 == strcmp (fnname, "test_mutually_exclusive_suggestions")) + { + const int line = fnstart_line + 2; + location_t start = get_loc (line, 2); + location_t finish = get_loc (line, 9); + source_range src_range; + src_range.m_start = start; + src_range.m_finish = finish; + + { + rich_location richloc (line_table, make_location (start, start, finish)); + richloc.add_fixit_replace (src_range, "replacement_1"); + richloc.fixits_cannot_be_auto_applied (); + warning_at_rich_loc (&richloc, 0, "warning 1"); + } + + { + rich_location richloc (line_table, make_location (start, start, finish)); + richloc.add_fixit_replace (src_range, "replacement_2"); + richloc.fixits_cannot_be_auto_applied (); + warning_at_rich_loc (&richloc, 0, "warning 2"); + } + } + /* Example of two carets where both carets appear to have an off-by-one error appearing one column early. Seen with gfortran.dg/associate_5.f03. |