[clang] 7ed5bbe - [Clang][OpenMP] Skip Sema actions for invalid assumption clauses (#212822)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Aug 2 07:06:37 PDT 2026
Author: OHNope
Date: 2026-08-02T14:06:31Z
New Revision: 7ed5bbedff3fa9dae894c2d939c7936f7a51a91f
URL: https://github.com/llvm/llvm-project/commit/7ed5bbedff3fa9dae894c2d939c7936f7a51a91f
DIFF: https://github.com/llvm/llvm-project/commit/7ed5bbedff3fa9dae894c2d939c7936f7a51a91f.diff
LOG: [Clang][OpenMP] Skip Sema actions for invalid assumption clauses (#212822)
Do not call the Sema actions for absent, contains, and nullary assumption
clauses after the parser has diagnosed that the clause is not allowed on the
current directive.
Add assertions documenting that these Sema actions must only receive clauses
allowed on the current directive, and add tests covering all affected clause
kinds.
Fixes #212780.
Added:
clang/test/SemaOpenMP/invalid-clause-on-directive.c
Modified:
clang/lib/Parse/ParseOpenMP.cpp
Removed:
clang/test/SemaOpenMP/gh197162.c
################################################################################
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index dd2dc60a99156..6b4a6017669b2 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -3569,8 +3569,9 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
} while (TryConsumeToken(tok::comma));
RLoc = Tok.getLocation();
T.consumeClose();
- Clause = Actions.OpenMP().ActOnOpenMPDirectivePresenceClause(
- CKind, DKVec, Loc, LLoc, RLoc);
+ if (!WrongDirective)
+ Clause = Actions.OpenMP().ActOnOpenMPDirectivePresenceClause(
+ CKind, DKVec, Loc, LLoc, RLoc);
break;
}
case OMPC_no_openmp:
@@ -3584,8 +3585,9 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
ErrorFound = true;
}
SourceLocation Loc = ConsumeToken();
- Clause = Actions.OpenMP().ActOnOpenMPNullaryAssumptionClause(
- CKind, Loc, Tok.getLocation());
+ if (!WrongDirective)
+ Clause = Actions.OpenMP().ActOnOpenMPNullaryAssumptionClause(
+ CKind, Loc, Tok.getLocation());
break;
}
case OMPC_ompx_attribute:
diff --git a/clang/test/SemaOpenMP/gh197162.c b/clang/test/SemaOpenMP/gh197162.c
deleted file mode 100644
index ffdf2ec3c3d8e..0000000000000
--- a/clang/test/SemaOpenMP/gh197162.c
+++ /dev/null
@@ -1,6 +0,0 @@
-// RUN: %clang_cc1 -fopenmp -fsyntax-only -verify %s
-
-void foo() {
-#pragma omp taskloop transparent // expected-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp taskloop'}}
- for(int i = 0; i < 2; i++);
-}
diff --git a/clang/test/SemaOpenMP/invalid-clause-on-directive.c b/clang/test/SemaOpenMP/invalid-clause-on-directive.c
new file mode 100644
index 0000000000000..a7c60f1b8224e
--- /dev/null
+++ b/clang/test/SemaOpenMP/invalid-clause-on-directive.c
@@ -0,0 +1,25 @@
+// RUN: %clang_cc1 -fopenmp -fopenmp-version=51 -fsyntax-only -verify %s
+
+void test(void) {
+#pragma omp taskloop transparent // expected-error {{unexpected OpenMP clause 'transparent' in directive '#pragma omp taskloop'}}
+ for (int i = 0; i < 2; ++i)
+ ;
+
+#pragma omp parallel absent(target) // expected-error {{unexpected OpenMP clause 'absent' in directive '#pragma omp parallel'}}
+ {}
+
+#pragma omp parallel contains(target) // expected-error {{unexpected OpenMP clause 'contains' in directive '#pragma omp parallel'}}
+ {}
+
+#pragma omp parallel no_openmp // expected-error {{unexpected OpenMP clause 'no_openmp' in directive '#pragma omp parallel'}}
+ {}
+
+#pragma omp parallel no_openmp_routines // expected-error {{unexpected OpenMP clause 'no_openmp_routines' in directive '#pragma omp parallel'}}
+ {}
+
+#pragma omp parallel no_openmp_constructs // expected-error {{unexpected OpenMP clause 'no_openmp_constructs' in directive '#pragma omp parallel'}}
+ {}
+
+#pragma omp parallel no_parallelism // expected-error {{unexpected OpenMP clause 'no_parallelism' in directive '#pragma omp parallel'}}
+ {}
+}
More information about the cfe-commits
mailing list