[OpenMP][FIX] Allow multiple `depend` clauses on a `taskwait nowait`
authorJohannes Doerfert <johannes@jdoerfert.de>
Wed, 11 Jan 2023 19:22:11 +0000 (11:22 -0800)
committerJohannes Doerfert <johannes@jdoerfert.de>
Thu, 12 Jan 2023 06:24:23 +0000 (22:24 -0800)
Fixes https://github.com/llvm/llvm-project/issues/59941

Differential Revision: https://reviews.llvm.org/D141531

clang/lib/Sema/SemaOpenMP.cpp
clang/test/OpenMP/taskwait_ast_print.cpp

index e603557..f48707d 100644 (file)
@@ -11109,9 +11109,10 @@ StmtResult Sema::ActOnOpenMPTaskwaitDirective(ArrayRef<OMPClause *> Clauses,
                                               SourceLocation EndLoc) {
   const OMPNowaitClause *NowaitC =
       OMPExecutableDirective::getSingleClause<OMPNowaitClause>(Clauses);
-  const OMPDependClause *DependC =
-      OMPExecutableDirective::getSingleClause<OMPDependClause>(Clauses);
-  if (NowaitC && !DependC) {
+  bool HasDependC =
+      !OMPExecutableDirective::getClausesOfKind<OMPDependClause>(Clauses)
+           .empty();
+  if (NowaitC && !HasDependC) {
     Diag(StartLoc, diag::err_omp_nowait_clause_without_depend);
     return StmtError();
   }
index 670e1fb..10823c6 100644 (file)
@@ -25,6 +25,7 @@ T ndmain(T argc) {
   static T a;
 #pragma omp taskwait
 #pragma omp taskwait depend(in:a, argc) nowait
+#pragma omp taskwait depend(in:a) depend(in:argc) nowait
   return a + argc;
 }
 
@@ -41,12 +42,15 @@ T ndmain(T argc) {
 // CHECK:      static T a;
 // CHECK-NEXT: #pragma omp taskwait{{$}}
 // CHECK-NEXT: #pragma omp taskwait depend(in : a,argc) nowait{{$}}
+// CHECK-NEXT: #pragma omp taskwait depend(in : a) depend(in : argc) nowait{{$}}
 // CHECK:      static int a;
 // CHECK-NEXT: #pragma omp taskwait
 // CHECK-NEXT: #pragma omp taskwait depend(in : a,argc) nowait{{$}}
+// CHECK-NEXT: #pragma omp taskwait depend(in : a) depend(in : argc) nowait{{$}}
 // CHECK:      static char a;
 // CHECK-NEXT: #pragma omp taskwait
 // CHECK-NEXT: #pragma omp taskwait depend(in : a,argc) nowait{{$}}
+// CHECK-NEXT: #pragma omp taskwait depend(in : a) depend(in : argc) nowait{{$}}
 
 int main(int argc, char **argv) {
   static int a;