aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorLewis Hyatt <lhyatt@gmail.com>2022-12-29 16:55:21 -0500
committerLewis Hyatt <lhyatt@gmail.com>2023-01-11 19:02:42 -0500
commit9ca4899144de6db61a782b03a1257489bd26f750 (patch)
treea1320804b3636dd81ad2ca9d73a89ec84336f53a /gcc
parent688fc162b76dc6747a30fcfd470f4770da0f4924 (diff)
downloadgcc-9ca4899144de6db61a782b03a1257489bd26f750.zip
gcc-9ca4899144de6db61a782b03a1257489bd26f750.tar.gz
gcc-9ca4899144de6db61a782b03a1257489bd26f750.tar.bz2
preprocessor: Don't register pragmas in directives-only mode [PR108244]
libcpp's directives-only mode does not expect deferred pragmas to be registered, but to date the c-family registration process has not checked for this case. That issue became more visible since r13-1544, which added the commonly used GCC diagnostic pragmas to the set of those registered in preprocessing modes. Fix it by checking for directives-only mode in c-family/c-pragma.cc. gcc/c-family/ChangeLog: PR preprocessor/108244 * c-pragma.cc (c_register_pragma_1): Don't attempt to register any deferred pragmas if -fdirectives-only. (init_pragma): Likewise. gcc/testsuite/ChangeLog: * c-c++-common/cpp/pr108244-1.c: New test. * c-c++-common/cpp/pr108244-2.c: New test. * c-c++-common/gomp/pr108244-3.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-family/c-pragma.cc56
-rw-r--r--gcc/testsuite/c-c++-common/cpp/pr108244-1.c5
-rw-r--r--gcc/testsuite/c-c++-common/cpp/pr108244-2.c5
-rw-r--r--gcc/testsuite/c-c++-common/gomp/pr108244-3.c5
4 files changed, 46 insertions, 25 deletions
diff --git a/gcc/c-family/c-pragma.cc b/gcc/c-family/c-pragma.cc
index 142a464..91fabf0 100644
--- a/gcc/c-family/c-pragma.cc
+++ b/gcc/c-family/c-pragma.cc
@@ -1647,7 +1647,8 @@ c_register_pragma_1 (const char *space, const char *name,
if (flag_preprocess_only)
{
- if (!(allow_expansion || ihandler.early_handler.handler_1arg))
+ if (cpp_get_options (parse_in)->directives_only
+ || !(allow_expansion || ihandler.early_handler.handler_1arg))
return;
pragma_pp_data pp_data;
@@ -1811,34 +1812,39 @@ c_pp_invoke_early_pragma_handler (unsigned int id)
void
init_pragma (void)
{
- if (flag_openacc)
- {
- const int n_oacc_pragmas = ARRAY_SIZE (oacc_pragmas);
- int i;
-
- for (i = 0; i < n_oacc_pragmas; ++i)
- cpp_register_deferred_pragma (parse_in, "acc", oacc_pragmas[i].name,
- oacc_pragmas[i].id, true, true);
- }
- if (flag_openmp)
+ if (!cpp_get_options (parse_in)->directives_only)
{
- const int n_omp_pragmas = ARRAY_SIZE (omp_pragmas);
- int i;
+ if (flag_openacc)
+ {
+ const int n_oacc_pragmas = ARRAY_SIZE (oacc_pragmas);
+ int i;
- for (i = 0; i < n_omp_pragmas; ++i)
- cpp_register_deferred_pragma (parse_in, "omp", omp_pragmas[i].name,
- omp_pragmas[i].id, true, true);
- }
- if (flag_openmp || flag_openmp_simd)
- {
- const int n_omp_pragmas_simd = sizeof (omp_pragmas_simd)
- / sizeof (*omp_pragmas);
- int i;
+ for (i = 0; i < n_oacc_pragmas; ++i)
+ cpp_register_deferred_pragma (parse_in, "acc", oacc_pragmas[i].name,
+ oacc_pragmas[i].id, true, true);
+ }
+
+ if (flag_openmp)
+ {
+ const int n_omp_pragmas = ARRAY_SIZE (omp_pragmas);
+ int i;
- for (i = 0; i < n_omp_pragmas_simd; ++i)
- cpp_register_deferred_pragma (parse_in, "omp", omp_pragmas_simd[i].name,
- omp_pragmas_simd[i].id, true, true);
+ for (i = 0; i < n_omp_pragmas; ++i)
+ cpp_register_deferred_pragma (parse_in, "omp", omp_pragmas[i].name,
+ omp_pragmas[i].id, true, true);
+ }
+ if (flag_openmp || flag_openmp_simd)
+ {
+ const int n_omp_pragmas_simd
+ = sizeof (omp_pragmas_simd) / sizeof (*omp_pragmas);
+ int i;
+
+ for (i = 0; i < n_omp_pragmas_simd; ++i)
+ cpp_register_deferred_pragma (parse_in, "omp",
+ omp_pragmas_simd[i].name,
+ omp_pragmas_simd[i].id, true, true);
+ }
}
if (!flag_preprocess_only)
diff --git a/gcc/testsuite/c-c++-common/cpp/pr108244-1.c b/gcc/testsuite/c-c++-common/cpp/pr108244-1.c
new file mode 100644
index 0000000..1678004
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cpp/pr108244-1.c
@@ -0,0 +1,5 @@
+/* { dg-do preprocess } */
+/* { dg-additional-options "-fdirectives-only" } */
+#pragma GCC diagnostic push
+#ifdef t
+#endif
diff --git a/gcc/testsuite/c-c++-common/cpp/pr108244-2.c b/gcc/testsuite/c-c++-common/cpp/pr108244-2.c
new file mode 100644
index 0000000..017682a
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cpp/pr108244-2.c
@@ -0,0 +1,5 @@
+/* { dg-do preprocess } */
+/* { dg-additional-options "-fdirectives-only" } */
+#pragma message "hello"
+#ifdef t
+#endif
diff --git a/gcc/testsuite/c-c++-common/gomp/pr108244-3.c b/gcc/testsuite/c-c++-common/gomp/pr108244-3.c
new file mode 100644
index 0000000..e99fd52
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/gomp/pr108244-3.c
@@ -0,0 +1,5 @@
+/* { dg-do preprocess } */
+/* { dg-additional-options "-fdirectives-only -fopenmp" } */
+#pragma omp parallel
+#ifdef t
+#endif