From 9ca4899144de6db61a782b03a1257489bd26f750 Mon Sep 17 00:00:00 2001 From: Lewis Hyatt Date: Thu, 29 Dec 2022 16:55:21 -0500 Subject: [PATCH] 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. --- gcc/c-family/c-pragma.cc | 54 +++++++++++--------- gcc/testsuite/c-c++-common/cpp/pr108244-1.c | 5 ++ gcc/testsuite/c-c++-common/cpp/pr108244-2.c | 5 ++ gcc/testsuite/c-c++-common/gomp/pr108244-3.c | 5 ++ 4 files changed, 45 insertions(+), 24 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/cpp/pr108244-1.c create mode 100644 gcc/testsuite/c-c++-common/cpp/pr108244-2.c create mode 100644 gcc/testsuite/c-c++-common/gomp/pr108244-3.c diff --git a/gcc/c-family/c-pragma.cc b/gcc/c-family/c-pragma.cc index 142a46441ac..91fabf0a513 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) + + if (!cpp_get_options (parse_in)->directives_only) { - const int n_oacc_pragmas = ARRAY_SIZE (oacc_pragmas); - int i; + 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); - } + 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; + if (flag_openmp) + { + const int n_omp_pragmas = ARRAY_SIZE (omp_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_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); + 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 00000000000..1678004a4d9 --- /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 00000000000..017682ad186 --- /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 00000000000..e99fd52a313 --- /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