[clang] 3abd77a - [clang][OpenMP] Treat "workshare" as unknown OpenMP directive (#139793)
via cfe-commits
cfe-commits at lists.llvm.org
Wed May 14 05:06:14 PDT 2025
Author: Krzysztof Parzyszek
Date: 2025-05-14T07:06:11-05:00
New Revision: 3abd77ac157f87f2fa0c8083b9f27c1dd2896a25
URL: https://github.com/llvm/llvm-project/commit/3abd77ac157f87f2fa0c8083b9f27c1dd2896a25
DIFF: https://github.com/llvm/llvm-project/commit/3abd77ac157f87f2fa0c8083b9f27c1dd2896a25.diff
LOG: [clang][OpenMP] Treat "workshare" as unknown OpenMP directive (#139793)
The "workshare" construct is only present in Fortran. The common OpenMP
code does treat it as any other directive, but in clang we need to
reject it, and do so gracefully before it encounters an internal
assertion.
Fixes https://github.com/llvm/llvm-project/issues/139424
Added:
clang/test/OpenMP/openmp_workshare.c
Modified:
clang/lib/Parse/ParseOpenMP.cpp
Removed:
################################################################################
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index 6f64cadc00af5..c409409602e75 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -2613,6 +2613,11 @@ 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.
+ DKind = OMPD_unknown;
+ }
StmtResult Directive = StmtError();
diff --git a/clang/test/OpenMP/openmp_workshare.c b/clang/test/OpenMP/openmp_workshare.c
new file mode 100644
index 0000000000000..0302eb19f9ef4
--- /dev/null
+++ b/clang/test/OpenMP/openmp_workshare.c
@@ -0,0 +1,8 @@
+// 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}}
+}
+
More information about the cfe-commits
mailing list