[clang] [Clang][OpenMP] Skip Sema actions for invalid assumption clauses (PR #212822)

via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 29 22:56:54 PDT 2026


https://github.com/OHNope updated https://github.com/llvm/llvm-project/pull/212822

>From 8740f20d4e295f895106039181e45b1567e95a4e Mon Sep 17 00:00:00 2001
From: OHNope <ohnopexboy at gmail.com>
Date: Thu, 30 Jul 2026 14:38:40 +0900
Subject: [PATCH] [Clang][OpenMP] Skip Sema actions for invalid assumption
 clauses

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.

Extend the existing invalid-clause regression test to cover all affected clause kinds.

Fixes #212780.
---
 clang/lib/Parse/ParseOpenMP.cpp               | 10 +++++---
 clang/test/SemaOpenMP/gh197162.c              |  6 -----
 .../SemaOpenMP/invalid-clause-on-directive.c  | 25 +++++++++++++++++++
 3 files changed, 31 insertions(+), 10 deletions(-)
 delete mode 100644 clang/test/SemaOpenMP/gh197162.c
 create mode 100644 clang/test/SemaOpenMP/invalid-clause-on-directive.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