* [committed] Fix ICE in substring locations from macros in header files (PR preprocessor/88257)
@ 2018-11-30 15:59 David Malcolm
0 siblings, 0 replies; only message in thread
From: David Malcolm @ 2018-11-30 15:59 UTC (permalink / raw)
To: gcc-patches; +Cc: David Malcolm
PR preprocessor/88257 reports an ICE on gcc.dg/format/pr78304.c
when compiled using g++:
void test (const char *msg)
{
printf ("size: %" PRIu32 "\n", msg);
}
due to mismatching files (and line maps) between
linemap_resolve_location and expand_location_to_spelling_point
when PRIu32 is defined in a system header.
The root cause is that expand_location_to_spelling_point stops
unwinding locations when it reaches a system header, whereas
linemap_resolve_location can resolve into a system header,
which can lead to locations within get_substring_ranges_for_loc
getting out of sync, and using the wrong line map.
This patch fixes the issue by checking that the files are the
same.
Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Committed to trunk as r266671.
gcc/ChangeLog:
PR preprocessor/88257
* input.c (get_substring_ranges_for_loc): Fix indentation.
Bulletproof against getting a different files back from
linemap_resolve_location and expand_location_to_spelling_point.
gcc/testsuite/ChangeLog:
PR preprocessor/88257
* c-c++-common/Wformat-pr88257.c: New test.
* c-c++-common/Wformat-pr88257.h: New test header.
* c-c++-common/empty.h: New test header.
---
gcc/input.c | 7 ++++++-
gcc/testsuite/c-c++-common/Wformat-pr88257.c | 23 +++++++++++++++++++++++
gcc/testsuite/c-c++-common/Wformat-pr88257.h | 26 ++++++++++++++++++++++++++
gcc/testsuite/c-c++-common/empty.h | 0
4 files changed, 55 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/c-c++-common/Wformat-pr88257.c
create mode 100644 gcc/testsuite/c-c++-common/Wformat-pr88257.h
create mode 100644 gcc/testsuite/c-c++-common/empty.h
diff --git a/gcc/input.c b/gcc/input.c
index 237c0d5..b4d53d5 100644
--- a/gcc/input.c
+++ b/gcc/input.c
@@ -1432,7 +1432,12 @@ get_substring_ranges_for_loc (cpp_reader *pfile,
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";
+ return "start and finish are spelled in different ordinary maps";
+ /* The file from linemap_resolve_location ought to match that from
+ expand_location_to_spelling_point. */
+ if (start_ord_map->to_file != start.file)
+ return "mismatching file after resolving linemap";
+
location_t start_loc
= linemap_position_for_line_and_column (line_table, final_ord_map,
start.line, start.column);
diff --git a/gcc/testsuite/c-c++-common/Wformat-pr88257.c b/gcc/testsuite/c-c++-common/Wformat-pr88257.c
new file mode 100644
index 0000000..59e4db5
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/Wformat-pr88257.c
@@ -0,0 +1,23 @@
+/* { dg-options "-Wformat -fdiagnostics-show-caret" } */
+
+#include "Wformat-pr88257.h"
+
+void test (const char *msg)
+{
+ __builtin_printf ("size: %" PRIu32 "\n", msg); /* { dg-warning "expects argument of type" } */
+ /* { dg-begin-multiline-output "" }
+ __builtin_printf ("size: %" PRIu32 "\n", msg);
+ ^~~~~~~~~ ~~~
+ |
+ const char *
+ { dg-end-multiline-output "" { target c } } */
+ /* { dg-begin-multiline-output "" }
+ # define PRIu32 "u"
+ { dg-end-multiline-output "" { target c } } */
+ /* { dg-begin-multiline-output "" }
+ __builtin_printf ("size: %" PRIu32 "\n", msg);
+ ^~~~~~~~~~~~~~~~~~~~~ ~~~
+ |
+ const char*
+ { dg-end-multiline-output "" { target c++ } } */
+}
diff --git a/gcc/testsuite/c-c++-common/Wformat-pr88257.h b/gcc/testsuite/c-c++-common/Wformat-pr88257.h
new file mode 100644
index 0000000..c778e93
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/Wformat-pr88257.h
@@ -0,0 +1,26 @@
+#pragma GCC system_header
+
+/* Whitespace is significant here, due to line numbering.
+ See the comment below.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ End of significant whitespace */
+
+#include "empty.h"
+/* The preceding include ensures a line map starts here, with a line
+ number greater than that of the usage site, to try to trigger
+ an assertion failure. */
+
+# define PRIu32 "u"
diff --git a/gcc/testsuite/c-c++-common/empty.h b/gcc/testsuite/c-c++-common/empty.h
new file mode 100644
index 0000000..e69de29
--
1.8.5.3
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2018-11-30 15:59 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-30 15:59 [committed] Fix ICE in substring locations from macros in header files (PR preprocessor/88257) David Malcolm
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).