diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1c2e61292188..b97a8a2461b6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2018-10-18 David Malcolm + + PR tree-optimization/87562 + * input.c (get_substring_ranges_for_loc): Use + LRK_SPELLING_LOCATION rather than LRK_MACRO_EXPANSION_POINT when + getting the linemap for the endpoint. Verify that it's either + in the same linemap as the start point's spelling location, or + at least in the same file. + 2018-10-18 Richard Biener * config/i386/i386.c (ix86_builtin_vectorization_cost): Do not diff --git a/gcc/input.c b/gcc/input.c index eeeb11ecc0ab..57a1a3c42d31 100644 --- a/gcc/input.c +++ b/gcc/input.c @@ -1457,9 +1457,17 @@ get_substring_ranges_for_loc (cpp_reader *pfile, halfway through the token. Ensure that the loc_reader uses the linemap of the *end* of the token for its start location. */ + const line_map_ordinary *start_ord_map; + linemap_resolve_location (line_table, src_range.m_start, + LRK_SPELLING_LOCATION, &start_ord_map); const line_map_ordinary *final_ord_map; linemap_resolve_location (line_table, src_range.m_finish, - LRK_MACRO_EXPANSION_POINT, &final_ord_map); + LRK_SPELLING_LOCATION, &final_ord_map); + /* Bulletproofing. We ought to only have different ordinary maps + for start vs finish due to line-length jumps. */ + if (start_ord_map != final_ord_map + && start_ord_map->to_file != final_ord_map->to_file) + return "start and finish are spelled in different ordinary maps"; location_t start_loc = linemap_position_for_line_and_column (line_table, final_ord_map, start.line, start.column); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6f7d3b9e8838..4929e368f417 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2018-10-18 David Malcolm + + PR tree-optimization/87562 + * c-c++-common/substring-location-PR-87562-1-a.h: New file. + * c-c++-common/substring-location-PR-87562-1-b.h: New file. + * c-c++-common/substring-location-PR-87562-1.c: New test. + * gcc.dg/plugin/diagnostic-test-string-literals-1.c: Add test for + PR 87562. + * gcc.dg/plugin/pr87562-a.h: New file. + * gcc.dg/plugin/pr87562-b.h: New file. + 2018-10-18 Paul Thomas PR fortran/58618 diff --git a/gcc/testsuite/c-c++-common/substring-location-PR-87562-1-a.h b/gcc/testsuite/c-c++-common/substring-location-PR-87562-1-a.h new file mode 100644 index 000000000000..369c9d076cea --- /dev/null +++ b/gcc/testsuite/c-c++-common/substring-location-PR-87562-1-a.h @@ -0,0 +1,7 @@ +#undef ASM_GENERATE_INTERNAL_LABEL +#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \ + do \ + { \ + __builtin_sprintf (LABEL, "*.%s%u", PREFIX, (unsigned) (NUM)); \ + } \ + while (0) diff --git a/gcc/testsuite/c-c++-common/substring-location-PR-87562-1-b.h b/gcc/testsuite/c-c++-common/substring-location-PR-87562-1-b.h new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/gcc/testsuite/c-c++-common/substring-location-PR-87562-1.c b/gcc/testsuite/c-c++-common/substring-location-PR-87562-1.c new file mode 100644 index 000000000000..6afd22c80549 --- /dev/null +++ b/gcc/testsuite/c-c++-common/substring-location-PR-87562-1.c @@ -0,0 +1,15 @@ +/* Reproducing this ICE is dependent on line numbering, hence the blank + lines below. */ +#include "substring-location-PR-87562-1-a.h" + + + + +#include "substring-location-PR-87562-1-b.h" + +void +dbxout_stab_value_internal_label (const char *stem, int counter) +{ + char label[100]; + ASM_GENERATE_INTERNAL_LABEL (label, stem, counter); +} diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-1.c b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-1.c index 73770aa1bee1..b7350955e991 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-1.c +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic-test-string-literals-1.c @@ -296,3 +296,26 @@ test_backslash_continued_logical_lines (void) ~~~~~~ { dg-end-multiline-output "" } */ } + +/* Reproducer for PR 87652; this is whitespace-sensitive. */ + +#include "pr87562-a.h" + + + + +#include "pr87562-b.h" + +void +pr87652 (const char *stem, int counter) +{ + char label[100]; + ASM_GENERATE_INTERNAL_LABEL (label, stem, counter); + + /* This warning is actually in "pr87562-a.h". */ + /* { dg-warning "39: range" "" { target *-*-* } 5 } */ + /* { dg-begin-multiline-output "" } + __emit_string_literal_range ("*.%s%u", 2, 2, 3); \ + ^~ + { dg-end-multiline-output "" } */ +} diff --git a/gcc/testsuite/gcc.dg/plugin/pr87562-a.h b/gcc/testsuite/gcc.dg/plugin/pr87562-a.h new file mode 100644 index 000000000000..0e5a9f19a19f --- /dev/null +++ b/gcc/testsuite/gcc.dg/plugin/pr87562-a.h @@ -0,0 +1,7 @@ +#undef ASM_GENERATE_INTERNAL_LABEL +#define ASM_GENERATE_INTERNAL_LABEL(LABEL, PREFIX, NUM) \ + do \ + { \ + __emit_string_literal_range ("*.%s%u", 2, 2, 3); \ + } \ + while (0) diff --git a/gcc/testsuite/gcc.dg/plugin/pr87562-b.h b/gcc/testsuite/gcc.dg/plugin/pr87562-b.h new file mode 100644 index 000000000000..e69de29bb2d1