]> git.ipfire.org Git - thirdparty/gcc.git/commit
c-family: Improve location for -Wunknown-pragmas in a _Pragma [PR118838]
authorLewis Hyatt <lhyatt@gmail.com>
Tue, 11 Feb 2025 18:45:41 +0000 (13:45 -0500)
committerLewis Hyatt <lhyatt@gcc.gnu.org>
Mon, 28 Apr 2025 02:35:25 +0000 (22:35 -0400)
commit78673484b4055b93207eee0efd60a434b0bf96ab
tree2072b64344552e1acf6fa4c106d05ab96c272c8f
parentdea7b9a78b11b5ca0c85b971521144ba07a66aca
c-family: Improve location for -Wunknown-pragmas in a _Pragma [PR118838]

The warning for -Wunknown-pragmas is issued at the location provided by
libcpp to the def_pragma() callback. This location is
cpp_reader::directive_line, which is a location for the start of the line
only; it is also not a valid location in case the unknown pragma was lexed
from a _Pragma string. These factors make it impossible to suppress
-Wunknown-pragmas via _Pragma("GCC diagnostic...") directives on the same
source line, as in the PR and the test case. Address that by issuing the
warning at a better location returned by cpp_get_diagnostic_override_loc().
libcpp already maintains this location to handle _Pragma-related diagnostics
internally; it was needed also to make a publicly accessible version of it.

gcc/c-family/ChangeLog:

PR c/118838
* c-lex.cc (cb_def_pragma): Call cpp_get_diagnostic_override_loc()
to get a valid location at which to issue -Wunknown-pragmas, in case
it was triggered from a _Pragma.

libcpp/ChangeLog:

PR c/118838
* errors.cc (cpp_get_diagnostic_override_loc): New function.
* include/cpplib.h (cpp_get_diagnostic_override_loc): Declare.

gcc/testsuite/ChangeLog:

PR c/118838
* c-c++-common/cpp/pragma-diagnostic-loc-2.c: New test.
* g++.dg/gomp/macro-4.C: Adjust expected output.
* gcc.dg/gomp/macro-4.c: Likewise.
* gcc.dg/cpp/Wunknown-pragmas-1.c: Likewise.
gcc/c-family/c-lex.cc
gcc/testsuite/c-c++-common/cpp/pragma-diagnostic-loc-2.c [new file with mode: 0644]
gcc/testsuite/g++.dg/gomp/macro-4.C
gcc/testsuite/gcc.dg/cpp/Wunknown-pragmas-1.c
gcc/testsuite/gcc.dg/gomp/macro-4.c
libcpp/errors.cc
libcpp/include/cpplib.h