]> gcc.gnu.org Git - gcc.git/commit
c++: Fix location for -Wunused-macros [PR66290]
authorLewis Hyatt <lhyatt@gmail.com>
Tue, 12 Jul 2022 13:47:47 +0000 (09:47 -0400)
committerLewis Hyatt <lhyatt@gmail.com>
Sun, 31 Jul 2022 11:48:47 +0000 (07:48 -0400)
commitb04c399e258e686dddad879bf7e27d9e28fd6fde
tree3622374d5d78bfc193a2a43e8da5304ec168143d
parent351e3cad2c5d4dfe43d68ba333bde1d70fa0b807
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++.
gcc/c-family/c-common.cc
gcc/c-family/c-common.h
gcc/c-family/c-opts.cc
gcc/cp/parser.cc
gcc/testsuite/c-c++-common/pragma-diag-15.c
This page took 0.058579 seconds and 5 git commands to generate.