diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp index 717982f66027c..fde97e74b1121 100644 --- a/flang/lib/Semantics/check-omp-structure.cpp +++ b/flang/lib/Semantics/check-omp-structure.cpp @@ -849,8 +849,6 @@ void OmpStructureChecker::CheckSIMDNest(const parser::OpenMPConstruct &c) { // The only OpenMP constructs that can be encountered during execution of // a simd region are the `atomic` construct, the `loop` construct, the `simd` // construct and the `ordered` construct with the `simd` clause. - // TODO: Expand the check to include `LOOP` construct as well when it is - // supported. // Check if the parent context has the SIMD clause // Please note that we use GetContext() instead of GetContextParent() @@ -893,14 +891,15 @@ void OmpStructureChecker::CheckSIMDNest(const parser::OpenMPConstruct &c) { } } }, - // Allowing SIMD construct + // Allowing SIMD and loop construct [&](const parser::OpenMPLoopConstruct &c) { const auto &beginLoopDir{ std::get(c.t)}; const auto &beginDir{ std::get(beginLoopDir.t)}; if ((beginDir.v == llvm::omp::Directive::OMPD_simd) || - (beginDir.v == llvm::omp::Directive::OMPD_do_simd)) { + (beginDir.v == llvm::omp::Directive::OMPD_do_simd) || + (beginDir.v == llvm::omp::Directive::OMPD_loop)) { eligibleSIMD = true; } }, diff --git a/flang/test/Semantics/OpenMP/nested-simd.f90 b/flang/test/Semantics/OpenMP/nested-simd.f90 index c9fb90cdeceb2..9b2e40a9f5ab6 100644 --- a/flang/test/Semantics/OpenMP/nested-simd.f90 +++ b/flang/test/Semantics/OpenMP/nested-simd.f90 @@ -189,3 +189,18 @@ SUBROUTINE NESTED_BAD(N) END SUBROUTINE NESTED_BAD + +SUBROUTINE SIMD_LOOP(A, B, N) + REAL :: A(100), B(100) + INTEGER :: I, J, N + + !$OMP SIMD + DO I = 1, N + !$OMP LOOP + DO J = 1, N + B(J) = B(J) + A(J) + END DO + !$OMP END LOOP + END DO + !$OMP END SIMD +END SUBROUTINE