aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorLewis Hyatt <lhyatt@gmail.com>2025-02-11 13:45:41 -0500
committerLewis Hyatt <lhyatt@gcc.gnu.org>2025-04-27 22:35:25 -0400
commit78673484b4055b93207eee0efd60a434b0bf96ab (patch)
tree2072b64344552e1acf6fa4c106d05ab96c272c8f /gcc
parentdea7b9a78b11b5ca0c85b971521144ba07a66aca (diff)
downloadgcc-78673484b4055b93207eee0efd60a434b0bf96ab.zip
gcc-78673484b4055b93207eee0efd60a434b0bf96ab.tar.gz
gcc-78673484b4055b93207eee0efd60a434b0bf96ab.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/c-lex.cc7
-rw-r--r--gcc/testsuite/c-c++-common/cpp/pragma-diagnostic-loc-2.c15
-rw-r--r--gcc/testsuite/g++.dg/gomp/macro-4.C8
-rw-r--r--gcc/testsuite/gcc.dg/cpp/Wunknown-pragmas-1.c22
-rw-r--r--gcc/testsuite/gcc.dg/gomp/macro-4.c8
5 files changed, 42 insertions, 18 deletions
diff --git a/gcc/c-family/c-lex.cc b/gcc/c-family/c-lex.cc
index e450c9a..fef6ae6 100644
--- a/gcc/c-family/c-lex.cc
+++ b/gcc/c-family/c-lex.cc
@@ -248,7 +248,12 @@ cb_def_pragma (cpp_reader *pfile, location_t loc)
{
const unsigned char *space, *name;
const cpp_token *s;
- location_t fe_loc = loc;
+
+ /* If we are processing a _Pragma, LOC is not a valid location, but libcpp
+ will provide a good location via this function instead. */
+ location_t fe_loc = cpp_get_diagnostic_override_loc (pfile);
+ if (fe_loc == UNKNOWN_LOCATION)
+ fe_loc = loc;
space = name = (const unsigned char *) "";
diff --git a/gcc/testsuite/c-c++-common/cpp/pragma-diagnostic-loc-2.c b/gcc/testsuite/c-c++-common/cpp/pragma-diagnostic-loc-2.c
new file mode 100644
index 0000000..734da21
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cpp/pragma-diagnostic-loc-2.c
@@ -0,0 +1,15 @@
+/* PR c/118838 */
+/* { dg-do compile } */
+/* { dg-additional-options "-Wunknown-pragmas" } */
+
+/* Make sure the warnings are suppressed as expected. */
+
+/* The tokens need to be all on the same line here. */
+_Pragma ("GCC diagnostic push") _Pragma ("GCC diagnostic ignored \"-Wunknown-pragmas\"") _Pragma ("__unknown__") _Pragma ("GCC diagnostic pop")
+
+#define MACRO \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wunknown-pragmas\"") \
+ _Pragma ("__unknown__") \
+ _Pragma ("GCC diagnostic pop")
+MACRO
diff --git a/gcc/testsuite/g++.dg/gomp/macro-4.C b/gcc/testsuite/g++.dg/gomp/macro-4.C
index dcc8bcb..5aa6d97 100644
--- a/gcc/testsuite/g++.dg/gomp/macro-4.C
+++ b/gcc/testsuite/g++.dg/gomp/macro-4.C
@@ -3,7 +3,7 @@
// { dg-options "-fopenmp -Wunknown-pragmas" }
#define p _Pragma ("omp parallel")
-#define omp_p _Pragma ("omp p")
+#define omp_p _Pragma ("omp p") // { dg-warning "ignoring '#pragma omp _Pragma'" }
void bar (void);
@@ -12,18 +12,18 @@ foo (void)
{
#pragma omp p // { dg-warning "-:ignoring '#pragma omp _Pragma'" }
bar ();
- omp_p // { dg-warning "-:ignoring '#pragma omp _Pragma'" }
+ omp_p // { dg-note "in expansion of macro 'omp_p'" }
bar ();
}
#define parallel serial
-#define omp_parallel _Pragma ("omp parallel")
+#define omp_parallel _Pragma ("omp parallel") // { dg-warning "ignoring '#pragma omp serial'" }
void
baz (void)
{
#pragma omp parallel // { dg-warning "-:ignoring '#pragma omp serial'" }
bar ();
- omp_parallel // { dg-warning "-:ignoring '#pragma omp serial'" }
+ omp_parallel // { dg-note "in expansion of macro 'omp_parallel'" }
bar ();
}
diff --git a/gcc/testsuite/gcc.dg/cpp/Wunknown-pragmas-1.c b/gcc/testsuite/gcc.dg/cpp/Wunknown-pragmas-1.c
index 06a244e..f3c7901 100644
--- a/gcc/testsuite/gcc.dg/cpp/Wunknown-pragmas-1.c
+++ b/gcc/testsuite/gcc.dg/cpp/Wunknown-pragmas-1.c
@@ -8,21 +8,25 @@
#pragma unknown1 /* { dg-warning "-:unknown1" "unknown1" } */
#define COMMA ,
-#define FOO(x) x
-#define BAR(x) _Pragma("unknown_before") x
-#define BAZ(x) x _Pragma("unknown_after")
+#define FOO(x) x /* { dg-note "in definition of macro 'FOO'" } */
-int _Pragma("unknown2") bar1; /* { dg-warning "-:unknown2" "unknown2" } */
+#define BAR1(x) _Pragma("unknown_before1") x /* { dg-warning "unknown_before1" } */
+#define BAR2(x) _Pragma("unknown_before2") x /* { dg-warning "unknown_before2" } */
-FOO(int _Pragma("unknown3") bar2); /* { dg-warning "-:unknown3" "unknown3" } */
+#define BAZ1(x) x _Pragma("unknown_after1") /* { dg-warning "unknown_after1" } */
+#define BAZ2(x) x _Pragma("unknown_after2") /* { dg-warning "unknown_after2" } */
-int BAR(bar3); /* { dg-warning "-:unknown_before" "unknown_before 1" } */
+int _Pragma("unknown2") bar1; /* { dg-warning "unknown2" "unknown2" } */
-BAR(int bar4); /* { dg-warning "-:unknown_before" "unknown_before 2" } */
+FOO(int _Pragma("unknown3") bar2); /* { dg-warning "unknown3" "unknown3" } */
-int BAZ(bar5); /* { dg-warning "-:unknown_after" "unknown_after 1" } */
+int BAR1(bar3); /* { dg-note "in expansion of macro 'BAR1'" } */
-int BAZ(bar6;) /* { dg-warning "-:unknown_after" "unknown_after 2" } */
+BAR2(int bar4); /* { dg-note "in expansion of macro 'BAR2'" } */
+
+int BAZ1(bar5); /* { dg-note "in expansion of macro 'BAZ1'" } */
+
+int BAZ2(bar6;) /* { dg-note "in expansion of macro 'BAZ2'" } */
FOO(int bar7; _Pragma("unknown4")) /* { dg-warning "-:unknown4" "unknown4" } */
diff --git a/gcc/testsuite/gcc.dg/gomp/macro-4.c b/gcc/testsuite/gcc.dg/gomp/macro-4.c
index a4ed9a3..961c599 100644
--- a/gcc/testsuite/gcc.dg/gomp/macro-4.c
+++ b/gcc/testsuite/gcc.dg/gomp/macro-4.c
@@ -3,7 +3,7 @@
/* { dg-options "-fopenmp -Wunknown-pragmas" } */
#define p _Pragma ("omp parallel")
-#define omp_p _Pragma ("omp p")
+#define omp_p _Pragma ("omp p") /* { dg-warning "ignoring '#pragma omp _Pragma'" } */
void bar (void);
@@ -12,18 +12,18 @@ foo (void)
{
#pragma omp p /* { dg-warning "-:ignoring '#pragma omp _Pragma'" } */
bar ();
- omp_p /* { dg-warning "-:ignoring '#pragma omp _Pragma'" } */
+ omp_p /* { dg-note "in expansion of macro 'omp_p'" } */
bar ();
}
#define parallel serial
-#define omp_parallel _Pragma ("omp parallel")
+#define omp_parallel _Pragma ("omp parallel") /* { dg-warning "ignoring '#pragma omp serial'" } */
void
baz (void)
{
#pragma omp parallel /* { dg-warning "-:ignoring '#pragma omp serial'" } */
bar ();
- omp_parallel /* { dg-warning "-:ignoring '#pragma omp serial'" } */
+ omp_parallel /* { dg-note "in expansion of macro 'omp_parallel'" } */
bar ();
}