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'}}
+  {}
+}


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to