diff options
author | Lewis Hyatt <lhyatt@gmail.com> | 2022-12-29 16:55:21 -0500 |
---|---|---|
committer | Lewis Hyatt <lhyatt@gmail.com> | 2023-01-11 19:02:42 -0500 |
commit | 9ca4899144de6db61a782b03a1257489bd26f750 (patch) | |
tree | a1320804b3636dd81ad2ca9d73a89ec84336f53a /gcc | |
parent | 688fc162b76dc6747a30fcfd470f4770da0f4924 (diff) | |
download | gcc-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.cc | 56 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/cpp/pr108244-1.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/cpp/pr108244-2.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/gomp/pr108244-3.c | 5 |
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 |