Index: flang/lib/Semantics/check-omp-structure.cpp =================================================================== --- flang/lib/Semantics/check-omp-structure.cpp +++ flang/lib/Semantics/check-omp-structure.cpp @@ -394,8 +394,7 @@ } // Other disallowed nestings, these directives do not support // ordered clause in them, so no need to check - else if (llvm::omp::nestedOrderedErrSet.test( - GetContextParent().directive)) { + else if (IsCloselyNestedRegion(llvm::omp::nestedOrderedErrSet)) { context_.Say(blkDirective.source, "`ORDERED` region may not be closely nested inside of " "`CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region."_err_en_US); Index: flang/test/Semantics/omp-ordered-simd.f90 =================================================================== --- flang/test/Semantics/omp-ordered-simd.f90 +++ flang/test/Semantics/omp-ordered-simd.f90 @@ -92,4 +92,54 @@ END DO !$OMP END TASKLOOP + !$OMP CRITICAL + C = C - A * B + !$OMP MASTER + DO I = 1,N + !ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region. + !$OMP ORDERED + CALL WORK(I) + !$OMP END ORDERED + END DO + !$OMP END MASTER + !$OMP END CRITICAL + + !$OMP ORDERED + C = C - A * B + !$OMP MASTER + DO I = 1,N + !ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region. + !$OMP ORDERED + CALL WORK(I) + !$OMP END ORDERED + END DO + !$OMP END MASTER + !$OMP END ORDERED + + !$OMP TASK + C = C - A * B + !$OMP MASTER + DO I = 1,N + !ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region. + !$OMP ORDERED + CALL WORK(I) + !$OMP END ORDERED + END DO + !$OMP END MASTER + !$OMP END TASK + + !$OMP TASKLOOP + DO J= 1,N + C = C - A * B + !$OMP MASTER + DO I = 1,N + !ERROR: `ORDERED` region may not be closely nested inside of `CRITICAL`, `ORDERED`, explicit `TASK` or `TASKLOOP` region. + !$OMP ORDERED + CALL WORK(I) + !$OMP END ORDERED + END DO + !$OMP END MASTER + END DO + !$OMP END TASKLOOP + END SUBROUTINE ORDERED_BAD