[Flang][Openmp] Upgrade TASKGROUP construct to 5.0.

In OMP 5.0 specification clause-list with
* task_reduction
* allocate
were allowed on taskgroup construct.

Fix XFAIL - omp-taskloop01.f90.

Reviewed By: kiranchandramohan

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

GitOrigin-RevId: 77ebfba68b9aa89e9ccbcdf8e285afa0661c8ca4
diff --git a/lib/Semantics/resolve-directives.cpp b/lib/Semantics/resolve-directives.cpp
index 67e2bd4..e1fc1ec 100644
--- a/lib/Semantics/resolve-directives.cpp
+++ b/lib/Semantics/resolve-directives.cpp
@@ -1069,12 +1069,12 @@
   case llvm::omp::Directive::OMPD_target:
   case llvm::omp::Directive::OMPD_target_data:
   case llvm::omp::Directive::OMPD_task:
+  case llvm::omp::Directive::OMPD_taskgroup:
   case llvm::omp::Directive::OMPD_teams:
   case llvm::omp::Directive::OMPD_workshare:
   case llvm::omp::Directive::OMPD_parallel_workshare:
   case llvm::omp::Directive::OMPD_target_teams:
   case llvm::omp::Directive::OMPD_target_parallel:
-  case llvm::omp::Directive::OMPD_taskgroup:
     PushContext(beginDir.source, beginDir.v);
     break;
   default:
diff --git a/lib/Semantics/resolve-names.cpp b/lib/Semantics/resolve-names.cpp
index 5582bd7..bdc4082 100644
--- a/lib/Semantics/resolve-names.cpp
+++ b/lib/Semantics/resolve-names.cpp
@@ -1292,6 +1292,7 @@
   case llvm::omp::Directive::OMPD_target_data:
   case llvm::omp::Directive::OMPD_master:
   case llvm::omp::Directive::OMPD_ordered:
+  case llvm::omp::Directive::OMPD_taskgroup:
     return false;
   default:
     return true;
diff --git a/test/Semantics/omp-taskgroup01.f90 b/test/Semantics/omp-taskgroup01.f90
new file mode 100644
index 0000000..c8de9f2
--- /dev/null
+++ b/test/Semantics/omp-taskgroup01.f90
@@ -0,0 +1,49 @@
+! RUN: %S/test_errors.sh %s %t %flang -fopenmp
+! REQUIRES: shell
+
+use omp_lib
+  implicit none
+  integer :: xyz, abc
+  real :: reduction_var
+  !$omp parallel num_threads(4)
+    !$omp single
+      print *, "The"
+    !$omp taskgroup
+      !$omp task
+      print *, "almighty"
+      !$omp end task
+      !$omp task
+      print *, "sun"
+      !$omp end task
+    !$omp end taskgroup
+    !$omp end single
+  !$omp end parallel
+
+  !$omp parallel private(xyz)
+    !$omp taskgroup allocate(xyz)
+      !$omp task
+        print *, "The "
+        !$omp taskgroup allocate(omp_large_cap_mem_space: abc)
+          !$omp task
+          print *, "almighty sun"
+          !$omp end task
+        !$omp end taskgroup
+      !$omp end task
+    !$omp end taskgroup
+  !$omp end parallel
+
+  !ERROR: PRIVATE clause is not allowed on the TASKGROUP directive
+  !$omp taskgroup private(abc)
+  !$omp end taskgroup
+
+  !$omp parallel
+    !$omp task
+      !$omp taskgroup task_reduction(+ : reduction_var)
+          print *, "The "
+        !$omp taskgroup task_reduction(.or. : reduction_var) task_reduction(.and. : reduction_var)
+          print *, "almighty sun"
+        !$omp end taskgroup
+      !$omp end taskgroup
+    !$omp end task
+  !$omp end parallel
+end program
\ No newline at end of file