public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-1903] c++: Fix location for -Wunused-macros [PR66290]
@ 2022-07-31 12:13 Lewis Hyatt
  0 siblings, 0 replies; only message in thread
From: Lewis Hyatt @ 2022-07-31 12:13 UTC (permalink / raw)
  To: gcc-cvs

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

commit r13-1903-gb04c399e258e686dddad879bf7e27d9e28fd6fde
Author: Lewis Hyatt <lhyatt@gmail.com>
Date:   Tue Jul 12 09:47:47 2022 -0400

    c++: Fix location for -Wunused-macros [PR66290]
    
    In C++, since all tokens are lexed from libcpp up front, diagnostics generated
    by libcpp after lexing has completed do not get a valid location from libcpp
    (rather, libcpp thinks they all pertain to the end of the file.) This has long
    been addressed using the global variable "done_lexing", which the C++ frontend
    sets at the appropriate time; when done_lexing is true, then c_cpp_diagnostic(),
    which outputs libcpp's diagnostics, uses input_location instead of the wrong
    libcpp location. The C++ frontend arranges that input_location will point to the
    token it is currently processing, so this generally works fine. However, there
    is one exception currently, which is -Wunused-macros. This gets generated at the
    end of processing in cpp_finish (), since we need to wait until then to
    determine whether a macro was eventually used or not. But the locations it
    passes to c_cpp_diagnostic () were remembered from the original lexing and hence
    they should not be overridden with input_location, which is now the one
    incorrectly pointing to the end of the file.
    
    Fixed by setting done_lexing=false again just prior to calling cpp_finish (). I
    also renamed the variable from done_lexing to "override_libcpp_locations", since
    it's now not strictly about lexing anymore.
    
    There is no new testcase with this patch, since we already had an xfailed
    testcase which is now fixed.
    
    gcc/c-family/ChangeLog:
    
            PR c++/66290
            * c-common.h: Rename global done_lexing to
            override_libcpp_locations.
            * c-common.cc (c_cpp_diagnostic): Likewise.
            * c-opts.cc (c_common_finish): Set override_libcpp_locations
            (formerly done_lexing) immediately prior to calling cpp_finish ().
    
    gcc/cp/ChangeLog:
    
            PR c++/66290
            * parser.cc (cp_lexer_new_main): Rename global done_lexing to
            override_libcpp_locations.
    
    gcc/testsuite/ChangeLog:
    
            PR c++/66290
            * c-c++-common/pragma-diag-15.c: Remove xfail for C++.

Diff:
---
 gcc/c-family/c-common.cc                    | 10 ++++++----
 gcc/c-family/c-common.h                     |  8 +++++---
 gcc/c-family/c-opts.cc                      |  6 ++++++
 gcc/cp/parser.cc                            |  2 +-
 gcc/testsuite/c-c++-common/pragma-diag-15.c |  2 +-
 5 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/gcc/c-family/c-common.cc b/gcc/c-family/c-common.cc
index 655c3aefee6..6e41ceb38e9 100644
--- a/gcc/c-family/c-common.cc
+++ b/gcc/c-family/c-common.cc
@@ -284,9 +284,11 @@ int c_inhibit_evaluation_warnings;
    be generated.  */
 bool in_late_binary_op;
 
-/* Whether lexing has been completed, so subsequent preprocessor
-   errors should use the compiler's input_location.  */
-bool done_lexing = false;
+/* Depending on which phase of processing we are in, we may need
+   to prefer input_location to libcpp's locations.  (Specifically,
+   after the C++ lexer is done lexing tokens, but prior to calling
+   cpp_finish (), we need to do so.  */
+bool override_libcpp_locations;
 
 /* Information about how a function name is generated.  */
 struct fname_var_t
@@ -6681,7 +6683,7 @@ c_cpp_diagnostic (cpp_reader *pfile ATTRIBUTE_UNUSED,
     default:
       gcc_unreachable ();
     }
-  if (done_lexing)
+  if (override_libcpp_locations)
     richloc->set_range (0, input_location, SHOW_RANGE_WITH_CARET);
   diagnostic_set_info_translated (&diagnostic, msg, ap,
 				  richloc, dlevel);
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index f9064393b4e..c06769b6f0b 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -767,10 +767,12 @@ extern int max_tinst_depth;
 
 extern int c_inhibit_evaluation_warnings;
 
-/* Whether lexing has been completed, so subsequent preprocessor
-   errors should use the compiler's input_location.  */
+/* Depending on which phase of processing we are in, we may need
+   to prefer input_location to libcpp's locations.  (Specifically,
+   after the C++ lexer is done lexing tokens, but prior to calling
+   cpp_finish (), we need to do so.  */
 
-extern bool done_lexing;
+extern bool override_libcpp_locations;
 
 /* C types are partitioned into three subsets: object, function, and
    incomplete types.  */
diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc
index b9f01a65ed7..4e1463689de 100644
--- a/gcc/c-family/c-opts.cc
+++ b/gcc/c-family/c-opts.cc
@@ -1281,6 +1281,12 @@ c_common_finish (void)
 	}
     }
 
+  /* When we call cpp_finish (), it may generate some diagnostics using
+     locations it remembered from the preprocessing phase, e.g. for
+     -Wunused-macros.  So inform c_cpp_diagnostic () not to override those
+     locations with input_location, which would be incorrect now.  */
+  override_libcpp_locations = false;
+
   /* For performance, avoid tearing down cpplib's internal structures
      with cpp_destroy ().  */
   cpp_finish (parse_in, deps_stream);
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 826595a3722..33926d23179 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -755,7 +755,7 @@ cp_lexer_new_main (void)
 
   /* Subsequent preprocessor diagnostics should use compiler
      diagnostic functions to get the compiler source location.  */
-  done_lexing = true;
+  override_libcpp_locations = true;
 
   maybe_check_all_macros (parse_in);
 
diff --git a/gcc/testsuite/c-c++-common/pragma-diag-15.c b/gcc/testsuite/c-c++-common/pragma-diag-15.c
index d8076b4f93a..8ffff88d5e3 100644
--- a/gcc/testsuite/c-c++-common/pragma-diag-15.c
+++ b/gcc/testsuite/c-c++-common/pragma-diag-15.c
@@ -9,5 +9,5 @@
    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++ } } */
+#define X /* { dg-warning "-:-Wunused-macros" } */
 #pragma GCC diagnostic ignored "-Wunused-macros"


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

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

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-31 12:13 [gcc r13-1903] c++: Fix location for -Wunused-macros [PR66290] Lewis Hyatt

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