module m use iso_c_binding, only: c_loc implicit none (type, external) integer :: v interface subroutine foo (); end integer function omp_get_thread_num (); end integer function omp_get_num_threads (); end integer function omp_get_cancellation (); end integer(c_int) function omp_target_is_present(ptr, device_num) bind(c) use, intrinsic :: iso_c_binding, only : c_ptr, c_int type(c_ptr), value :: ptr integer(c_int), value :: device_num end end interface contains subroutine f1(a) integer :: a(0:) integer :: i, j !$omp simd order(concurrent) do i = 0, 63 !$omp loop do j = 0, 63 a(64 * i + j) = i + j end do end do end subroutine f2 (a) integer :: a(0:) integer :: i, j !$omp do simd order(concurrent) do i = 0, 63 !$omp loop do j = 0, 63 a(64 * i + j) = i + j end do end do end subroutine f3 (a) integer :: a(0:) integer :: i, j !$omp do order(concurrent) do i = 0, 63 !$omp loop do j = 0, 63 a(64 * i + j) = i + j end do end do end subroutine f4 (a) integer, target :: a(0:) integer :: i, j !$omp loop order(concurrent) bind(parallel) do i = 0, 63 !$omp parallel call foo () !$omp end parallel end do !$omp loop order(concurrent) bind(parallel) do i = 0, 63 !$omp simd do j = 0, 63 a(64 * i + j) = i + j end do end do !$omp loop order(concurrent) bind(parallel) do i = 0, 63 !$omp loop do j = 0, 63 a(64 * i + j) = i + j end do end do !$omp loop order(concurrent) bind(parallel) do i = 0, 63 !$omp critical ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } call foo () !$omp end critical end do !$omp loop order(concurrent) bind(parallel) do i = 0, 63 !$omp ordered simd ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } call foo () !$omp end ordered end do !$omp loop order(concurrent) bind(parallel) do i = 0, 63 !$omp atomic ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } v = v + 1 end do !$omp loop order(concurrent) bind(parallel) do i = 0, 63 !$omp atomic read ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } a(i) = v end do !$omp loop order(concurrent) bind(parallel) do i = 0, 63 !$omp atomic write ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } v = a(i) end do !$omp loop order(concurrent) bind(parallel) do i = 0, 63 a(i) = a(i) + omp_get_thread_num () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_thread_num\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } end do !$omp loop order(concurrent) bind(parallel) do i = 0, 63 a(i) = a(i) + omp_get_num_threads () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_num_threads\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } end do !$omp loop order(concurrent) bind(parallel) do i = 0, 63 a(i) = a(i) + omp_target_is_present (c_loc (a(i)), 0) ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_target_is_present\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } end do !$omp loop order(concurrent) bind(parallel) do i = 0, 63 a(i) = a(i) + omp_get_cancellation () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_cancellation\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } end do end subroutine f5 (a) integer, target :: a(0:) integer :: i, j !$omp parallel !$omp loop do i = 0, 63 !$omp parallel call foo () !$omp end parallel end do !$omp loop do i = 0, 63 !$omp simd do j = 0, 63 a(64 * i + j) = i + j end do end do !$omp loop do i = 0, 63 !$omp loop do j = 0, 63 a(64 * i + j) = i + j end do end do !$omp loop do i = 0, 63 !$omp critical ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } call foo () !$omp end critical end do !$omp loop do i = 0, 63 !$omp ordered simd ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } call foo () !$omp end ordered end do !$omp loop do i = 0, 63 !$omp atomic ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } v = v + 1 end do !$omp loop do i = 0, 63 !$omp atomic read ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } a(i) = v end do !$omp loop do i = 0, 63 !$omp atomic write ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } v = a(i) end do !$omp loop do i = 0, 63 !$omp master ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } call foo () !$omp end master end do !$omp loop do i = 0, 63 !$omp masked ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } call foo () !$omp end masked end do !$omp loop do i = 0, 63 !$omp scope ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } call foo () !$omp end scope end do !$omp loop do i = 0, 63 a(i) = a(i) + omp_get_thread_num () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_thread_num\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } end do !$omp loop do i = 0, 63 a(i) = a(i) + omp_get_num_threads () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_num_threads\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } end do !$omp loop do i = 0, 63 a(i) = a(i) + omp_target_is_present (c_loc(a(i)), 0) ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_target_is_present\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } end do !$omp loop do i = 0, 63 a(i) = a(i) + omp_get_cancellation () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_cancellation\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } end do !$omp end parallel end subroutine f6 (a) integer, target :: a(0:) integer :: i, j !$omp master !$omp loop do i = 0, 63 !$omp parallel call foo () !$omp end parallel end do !$omp loop do i = 0, 63 !$omp simd do j = 0, 63 a(64 * i + j) = i + j end do end do !$omp loop do i = 0, 63 !$omp loop do j = 0, 63 a(64 * i + j) = i + j end do end do !$omp loop do i = 0, 63 !$omp critical ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } call foo () !$omp end critical end do !$omp loop do i = 0, 63 !$omp ordered simd ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } call foo () !$omp end ordered end do !$omp loop do i = 0, 63 !$omp atomic ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } v = v + 1 end do !$omp loop do i = 0, 63 !$omp atomic read ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } a(i) = v end do !$omp loop do i = 0, 63 !$omp atomic write ! { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } v = a(i) end do !$omp loop do i = 0, 63 a(i) = a(i) + omp_get_thread_num () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_thread_num\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } end do !$omp loop do i = 0, 63 a(i) = a(i) + omp_get_num_threads () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_num_threads\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } end do !$omp loop do i = 0, 63 a(i) = a(i) + omp_target_is_present (c_loc(a(i)), 0) ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_target_is_present\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } end do !$omp loop do i = 0, 63 a(i) = a(i) + omp_get_cancellation () ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_cancellation\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } end do !$omp end master end end module