[flang] [OpenMP] structural checks for `PARALLEL SECTIONS`
authorJinxin Yang <jinxiny@nvidia.com>
Tue, 27 Aug 2019 20:55:18 +0000 (13:55 -0700)
committerJinxin (Brian) Yang <brianyang1106@gmail.com>
Thu, 29 Aug 2019 17:19:36 +0000 (10:19 -0700)
Original-commit: flang-compiler/f18@c18452159d462c98c6a888c272e24ea9d54032f4

flang/lib/semantics/check-omp-structure.cc
flang/test/semantics/omp-clause-validity01.f90

index 8eafd5a..6b2fa2e 100644 (file)
@@ -277,7 +277,14 @@ void OmpStructureChecker::Enter(const parser::OpenMPSectionsConstruct &x) {
     SetContextAllowed(allowed);
   } break;
   case parser::OmpSectionsDirective::Directive::ParallelSections: {
-    // TODO
+    PushContext(beginDir.source, OmpDirective::PARALLEL_SECTIONS);
+    OmpClauseSet allowed{OmpClause::DEFAULT, OmpClause::PRIVATE,
+        OmpClause::FIRSTPRIVATE, OmpClause::LASTPRIVATE, OmpClause::SHARED,
+        OmpClause::COPYIN, OmpClause::REDUCTION};
+    SetContextAllowed(allowed);
+    OmpClauseSet allowedOnce{
+        OmpClause::IF, OmpClause::NUM_THREADS, OmpClause::PROC_BIND};
+    SetContextAllowedOnce(allowedOnce);
   } break;
   }
 }
index 309ead6..2985999 100644 (file)
   !$omp end sections num_threads(4)
   !$omp end parallel
 
+! 2.11.2 parallel-sections-clause -> parallel-clause |
+!                                    sections-clause
+
+  !$omp parallel sections num_threads(4) private(b) lastprivate(d)
+  a = 0.0
+  !$omp section
+  b = 1
+  c = 2
+  !$omp section
+  d = 3
+  !$omp end parallel sections
+
+  !ERROR: At most one NUM_THREADS clause can appear on the PARALLEL SECTIONS directive
+  !$omp parallel sections num_threads(1) num_threads(4)
+  a = 0.0
+  !ERROR: Unmatched END SECTIONS directive
+  !$omp end sections
+
+  !$omp parallel sections
+  !ERROR: NOWAIT clause is not allowed on the END PARALLEL SECTIONS directive
+  !$omp end parallel sections nowait
+
 ! 2.7.3 single-clause -> private-clause |
 !                        firstprivate-clause
 !   end-single-clause -> copyprivate-clause |