aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorLewis Hyatt <lhyatt@gmail.com>2022-07-10 09:30:29 -0400
committerLewis Hyatt <lhyatt@gmail.com>2022-07-27 18:09:17 -0400
commit219f86495791fd27b012678f13e10cada211daab (patch)
treec8ff636aad2d31c05cabfa408d3e56cdc3bac5f0 /gcc
parent66fb08fec305f7a847cb1d7fae1c01cb06bbd176 (diff)
downloadgcc-219f86495791fd27b012678f13e10cada211daab.zip
gcc-219f86495791fd27b012678f13e10cada211daab.tar.gz
gcc-219f86495791fd27b012678f13e10cada211daab.tar.bz2
preprocessor: Set input_location to the most recently seen token
When preprocessing with -E and -save-temps, input_location points always to the first character of the current file. This was previously irrelevant because nothing was called during the token streaming process that would inspect input_location. But since r13-1544, "#pragma GCC diagnostic" is supported in preprocess-only mode, and that pragma relies on input_location to decide if a given source code location is subject to a diagnostic or not. Most diagnostics work fine anyway, because they are handled as soon as they are seen and so everything is still seen in the expected order even though all the diagnostic pragmas are treated as if they applied at the start of the file. One example that doesn't work correctly is the new testcase, since here the warning is not triggered until the end of the file and so it is necessary to track the location properly. Fixed by setting input_location to point to each token as it is being streamed, similar to how C++ mode sets it. gcc/c-family/ChangeLog: * c-ppoutput.cc (token_streamer::stream): Update input_location prior to streaming each token. gcc/testsuite/ChangeLog: * c-c++-common/pragma-diag-14.c: New test. * c-c++-common/pragma-diag-15.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/c-ppoutput.cc4
-rw-r--r--gcc/testsuite/c-c++-common/pragma-diag-14.c9
-rw-r--r--gcc/testsuite/c-c++-common/pragma-diag-15.c13
3 files changed, 26 insertions, 0 deletions
diff --git a/gcc/c-family/c-ppoutput.cc b/gcc/c-family/c-ppoutput.cc
index cd38c96..98081cc 100644
--- a/gcc/c-family/c-ppoutput.cc
+++ b/gcc/c-family/c-ppoutput.cc
@@ -210,6 +210,10 @@ void
token_streamer::stream (cpp_reader *pfile, const cpp_token *token,
location_t loc)
{
+ /* Keep input_location up to date, since it is needed for processing early
+ pragmas such as #pragma GCC diagnostic. */
+ input_location = loc;
+
if (token->type == CPP_PADDING)
{
avoid_paste = true;
diff --git a/gcc/testsuite/c-c++-common/pragma-diag-14.c b/gcc/testsuite/c-c++-common/pragma-diag-14.c
new file mode 100644
index 0000000..618e7e1
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pragma-diag-14.c
@@ -0,0 +1,9 @@
+/* { dg-do preprocess } */
+/* { dg-additional-options "-Wunused-macros" } */
+
+/* In the past, the pragma has erroneously disabled the warning because the
+ location was not tracked properly with -E or -save-temps; check that it works
+ now. */
+
+#define X /* { dg-warning "-:-Wunused-macros" } */
+#pragma GCC diagnostic ignored "-Wunused-macros"
diff --git a/gcc/testsuite/c-c++-common/pragma-diag-15.c b/gcc/testsuite/c-c++-common/pragma-diag-15.c
new file mode 100644
index 0000000..d8076b4
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pragma-diag-15.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-Wunused-macros" } */
+
+/* In the past, the pragma has erroneously disabled the warning because the
+ location was not tracked properly with -E or -save-temps; check that it works
+ now.
+
+ This test currently fails for C++ but it's not because of the pragma, it's
+ because the location of the macro definition is incorrectly set. This is a
+ separate issue, will resolve it in a later patch. */
+
+#define X /* { dg-warning "-:-Wunused-macros" {} { xfail c++ } } */
+#pragma GCC diagnostic ignored "-Wunused-macros"