public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/sphinx] preprocessor: Set input_location to the most recently seen token
@ 2022-07-28 12:11 Martin Liska
  0 siblings, 0 replies; only message in thread
From: Martin Liska @ 2022-07-28 12:11 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:a4ac487b9b35114a1cc4a58605f90558f2875e43

commit a4ac487b9b35114a1cc4a58605f90558f2875e43
Author: Lewis Hyatt <lhyatt@gmail.com>
Date:   Sun Jul 10 09:30:29 2022 -0400

    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.

Diff:
---
 gcc/c-family/c-ppoutput.cc                  |  4 ++++
 gcc/testsuite/c-c++-common/pragma-diag-14.c |  9 +++++++++
 gcc/testsuite/c-c++-common/pragma-diag-15.c | 13 +++++++++++++
 3 files changed, 26 insertions(+)

diff --git a/gcc/c-family/c-ppoutput.cc b/gcc/c-family/c-ppoutput.cc
index cd38c969ea0..98081ccfbb0 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 00000000000..618e7e1ef27
--- /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 00000000000..d8076b4f93a
--- /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"


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-07-28 12:11 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-28 12:11 [gcc/devel/sphinx] preprocessor: Set input_location to the most recently seen token Martin Liska

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).