[clang][OpenMP] Improve handling of non-C/C++ directives (#139961)

The PR139793 added handling of the Fortran-only "workshare" directive,
however there are more such directives, e.g. "allocators". Use the
genDirectiveLanguages function to detect non-C/C++ directives instead of
enumerating them.
This commit is contained in:
Krzysztof Parzyszek
2025-05-15 07:37:41 -05:00
committed by GitHub
parent 8e2ac7d619
commit 9273091502
3 changed files with 14 additions and 11 deletions

View File

@@ -2613,9 +2613,8 @@ StmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(
Diag(Tok, diag::err_omp_unknown_directive);
return StmtError();
}
if (DKind == OMPD_workshare) {
// "workshare" is an executable, Fortran-only directive. Treat it
// as unknown.
if (!(getDirectiveLanguages(DKind) & SourceLanguage::C)) {
// Treat directives that are not allowed in C/C++ as unknown.
DKind = OMPD_unknown;
}

View File

@@ -0,0 +1,12 @@
// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s
// Test the reaction to some Fortran-only directives.
void foo() {
#pragma omp allocators // expected-error {{expected an OpenMP directive}}
#pragma omp do // expected-error {{expected an OpenMP directive}}
#pragma omp end workshare // expected-error {{expected an OpenMP directive}}
#pragma omp parallel workshare // expected-warning {{extra tokens at the end of '#pragma omp parallel' are ignored}}
#pragma omp workshare // expected-error {{expected an OpenMP directive}}
}

View File

@@ -1,8 +0,0 @@
// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s
// Workshare is a Fortran-only directive.
void foo() {
#pragma omp workshare // expected-error {{expected an OpenMP directive}}
}