[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:
committed by
GitHub
parent
8e2ac7d619
commit
9273091502
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
12
clang/test/OpenMP/openmp_non_c_directives.c
Normal file
12
clang/test/OpenMP/openmp_non_c_directives.c
Normal 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}}
|
||||
}
|
||||
|
||||
@@ -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}}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user