summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/input.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/format/pr78569.c24
4 files changed, 45 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6c37db0f22d..2af1d979dcf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-11-29 David Malcolm <dmalcolm@redhat.com>
+
+ PR preprocessor/78569
+ * input.c (get_substring_ranges_for_loc): Fail gracefully if
+ line directives were present.
+
2016-11-30 Matthias Klose <doko@ubuntu.com>
* doc/install.texi: Document configure options --enable-objc-gc
diff --git a/gcc/input.c b/gcc/input.c
index 611e18b541e..1c7228a0080 100644
--- a/gcc/input.c
+++ b/gcc/input.c
@@ -1331,6 +1331,16 @@ get_substring_ranges_for_loc (cpp_reader *pfile,
if (cpp_get_options (pfile)->track_macro_expansion != 2)
return "track_macro_expansion != 2";
+ /* If #line or # 44 "file"-style directives are present, then there's
+ no guarantee that the line numbers we have can be used to locate
+ the strings. For example, we might have a .i file with # directives
+ pointing back to lines within a .c file, but the .c file might
+ have been edited since the .i file was created.
+ In such a case, the safest course is to disable on-demand substring
+ locations. */
+ if (line_table->seen_line_directive)
+ return "seen line directive";
+
/* If string concatenation has occurred at STRLOC, get the locations
of all of the literal tokens making up the compound string.
Otherwise, just use STRLOC. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f548855d2e1..aeac71a5847 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-11-29 David Malcolm <dmalcolm@redhat.com>
+
+ PR preprocessor/78569
+ * gcc.dg/format/pr78569.c: New test case.
+
2016-11-29 Martin Sebor <msebor@redhat.com>
avoid false positives on ILP32 targets.
diff --git a/gcc/testsuite/gcc.dg/format/pr78569.c b/gcc/testsuite/gcc.dg/format/pr78569.c
new file mode 100644
index 00000000000..e827087e1c3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/format/pr78569.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-Wformat-length" } */
+
+/* A run of blank lines, so that we would fail the assertion in input.c:1388:
+ gcc_assert (line_width >= (start.column - 1 + literal_length)); */
+
+
+
+
+
+void test (void)
+{
+ char tmp[128];
+ /* Point to the run of blank lines, so that the components of the overlong
+ string appear to be present within the run of blank lines. */
+# 6 "../../../../src/gcc/testsuite/gcc.dg/format/pr78569.c"
+ __builtin_snprintf (tmp, sizeof(tmp),
+ "The Base Band sends this value as a response to a "
+ "request for IMSI detach sent over the control "
+ "channel uplink (see section 7.6.1).");
+
+ /* { dg-warning "output truncated" "" { target *-*-* } 7 } */
+ /* { dg-message "format output" "" { target *-*-* } 6 } */
+}