]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
preprocessor: Don't register pragmas in directives-only mode [PR108244]
authorLewis Hyatt <lhyatt@gmail.com>
Thu, 29 Dec 2022 21:55:21 +0000 (16:55 -0500)
committerLewis Hyatt <lhyatt@gmail.com>
Thu, 12 Jan 2023 00:02:42 +0000 (19:02 -0500)
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.

gcc/c-family/c-pragma.cc
gcc/testsuite/c-c++-common/cpp/pr108244-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/cpp/pr108244-2.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/pr108244-3.c [new file with mode: 0644]

index 142a46441ac2d65fd95aa05a89b8f8c3be0eba4b..91fabf0a513344b60f006362fe5e578421f9bcb1 100644 (file)
@@ -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 (file)
index 0000000..1678004
--- /dev/null
@@ -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 (file)
index 0000000..017682a
--- /dev/null
@@ -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 (file)
index 0000000..e99fd52
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-do preprocess } */
+/* { dg-additional-options "-fdirectives-only -fopenmp" } */
+#pragma omp parallel
+#ifdef t
+#endif