gcc/libcpp
David Malcolm 470a60b2c4 re PR preprocessor/78680 (ICE in get_substring_ranges_for_loc, at input.c:1398)
Fix for PR preprocessor/78680

PR preprocessor/78680 identifies a crash when attempting to issue
a -Wformat warning, where the format string includes a string token
split across multiple physical source lines via backslash-continued
lines.

The issue is that libcpp is generating bogus range information for
such tokens.

For example, in:

void fn1() {
  __builtin_printf("\
     %ld.\n\
        2\n"); };

the range of the string token is printed as:

   __builtin_printf("\
                    ^~

whereas the range ought to be:

  __builtin_printf("\
                   ^~
     %ld.\n\
     ~~~~~~~
        2\n"); };
        ~~~~

The root cause is that the line notes expressing the update
of the buffer in lex.c aren't yet updated when the end-point of
the token is computed

3095	    tok_range.m_finish
3096	      = linemap_position_for_column (pfile->line_table,
3097					     CPP_BUF_COLUMN (buffer, buffer->cur));

so that the physical line is still regarded as that of the start
of the token, and, where CPP_BUF_COLUMN uses (BUF)->line_base,
line_base is still the location of the first physical line in the
and hence the column information is too large (as if it were the
offset in the *logical* line).

(the printed range is somewhat misleading; the actual buggy range
extends beyond the "\ in the line, but within diagnostic-show-locus.c
layout::print_annotation_line only prints up to the xbound set by
layout::print_source_line and so truncates most of the buggy range).

The fix is to ensure that line notes are handled before calculating
the end-point of the token range.

This leads to the range for the string token being correctly
computed, as:

  __builtin_printf("\
                   ^~
     %ld.\n\
     ~~~~~~~
        2\n"); };
        ~~~~

and this leads to get_substring_ranges_for_loc failing gracefully,
rather than crashing.

gcc/testsuite/ChangeLog:
	PR preprocessor/78680
	* gcc.dg/format/pr78680.c: New test case.
	* gcc.dg/plugin/diagnostic-test-expressions-1.c
	(test_multiline_token): New function.
	* gcc.dg/plugin/diagnostic-test-string-literals-1.c
	(test_backslash_continued_logical_lines): New function.

libcpp/ChangeLog:
	PR preprocessor/78680
	* lex.c (_cpp_lex_direct): Ensure line notes are processed before
	computing the end-point of the token.

From-SVN: r243567
2016-12-12 17:37:48 +00:00
..
include system.h (HAVE_DESIGNATED_INITIALIZERS, [...]): Do not use "defined" in macros. 2016-11-23 10:06:07 +00:00
po * eo.po: Update. 2016-10-29 02:38:09 +01:00
aclocal.m4
ChangeLog re PR preprocessor/78680 (ICE in get_substring_ranges_for_loc, at input.c:1398) 2016-12-12 17:37:48 +00:00
ChangeLog.jit
charset.c Fix locations within raw strings 2016-11-17 15:55:26 +00:00
config.in re PR bootstrap/72823 (r239175 causes build failure) 2016-11-16 21:10:27 +01:00
configure re PR bootstrap/72823 (r239175 causes build failure) 2016-11-16 21:10:27 +01:00
configure.ac re PR bootstrap/72823 (r239175 causes build failure) 2016-11-16 21:10:27 +01:00
directives-only.c
directives.c
errors.c
expr.c system.h (HAVE_DESIGNATED_INITIALIZERS, [...]): Do not use "defined" in macros. 2016-11-23 10:06:07 +00:00
files.c input.c/libcpp: fix lifetimes of path buffers 2016-10-25 19:24:01 +00:00
identifiers.c
init.c gcc/ 2016-10-12 01:19:06 +02:00
internal.h
lex.c re PR preprocessor/78680 (ICE in get_substring_ranges_for_loc, at input.c:1398) 2016-12-12 17:37:48 +00:00
line-map.c Implement ~line_maps () 2016-10-25 18:10:44 +00:00
location-example.txt
macro.c
Makefile.in
makeucnid.c
mkdeps.c
pch.c
symtab.c
system.h system.h (HAVE_DESIGNATED_INITIALIZERS, [...]): Do not use "defined" in macros. 2016-11-23 10:06:07 +00:00
traditional.c
ucnid.h
ucnid.tab