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.
This commit is contained in:
Lewis Hyatt 2022-12-29 16:55:21 -05:00
parent 688fc162b7
commit 9ca4899144
4 changed files with 45 additions and 24 deletions

View 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)
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)

View file

@ -0,0 +1,5 @@
/* { dg-do preprocess } */
/* { dg-additional-options "-fdirectives-only" } */
#pragma GCC diagnostic push
#ifdef t
#endif

View file

@ -0,0 +1,5 @@
/* { dg-do preprocess } */
/* { dg-additional-options "-fdirectives-only" } */
#pragma message "hello"
#ifdef t
#endif

View file

@ -0,0 +1,5 @@
/* { dg-do preprocess } */
/* { dg-additional-options "-fdirectives-only -fopenmp" } */
#pragma omp parallel
#ifdef t
#endif