[PATCH] openacc: Fix up C++ #pragma acc routine handling [PR101731]

Jakub Jelinek jakub@redhat.com
Mon Nov 22 15:02:31 GMT 2021

On Mon, Nov 22, 2021 at 03:49:42PM +0100, Thomas Schwinge wrote:
> Then, regarding the user-visible behavior:
> > +#pragma acc routine  /* { dg-error "not immediately followed by a single function declaration or definition" "" { target c++ } } */
> > +int foo (int bar ());
> So in C++ we now refuse, but in C we do accept this.  I suppose I shall
> look into making C behave the same way -- unless there is a reason for
> the different behavior?  And/or, is it actually is useful to allow such
> nested usage?  Per its associated clauses, an OpenACC 'routine' directive
> really is meant to apply to one function only, in contrast to OpenMP
> 'target declare'.  But the question is whether we should raise an error
> for the example above, or whether the 'routine' shall just apply to 'foo'
> but not 'bar', but without an error diagnostic?

All I've verified is that our OpenMP code handles it the same way,
#pragma omp declare simd
int foo (int bar ());
is accepted in C and rejected in C++.
I guess one question is to check if it is in both languages actually
the same thing.  If we want to accept it in C++ and let the pragma
apply only to the outer declaration, I guess we'd need to temporarily
set to NULL parser->omp_declare_simd and parser->oacc_routine while
parsing the parameters of a function declaration or definition.
At least OpenMP is fairly fuzzy here, the reason we error on
#pragma omp declare simd
int foo (), i;
has been mainly some discussions in the lang committee and the fact
that it talks about a single declaration, not all affected declarations.
Whether int foo (int bar ()); should be in that light treated as two
function declarations or one with another one nested in it and irrelevant
for it is unclear.


More information about the Gcc-patches mailing list