| ! { dg-do run } |
| |
| program test |
| use omp_lib |
| |
| implicit none |
| integer, parameter :: N = 100 |
| integer :: a(N) |
| logical :: is_parallel, is_static |
| |
| ! is_static is always set if run_parallel is false. |
| call f (a, .false., .false., is_parallel, is_static) |
| if (is_parallel .or. .not. is_static) stop 1 |
| |
| call f (a, .false., .true., is_parallel, is_static) |
| if (is_parallel .or. .not. is_static) stop 2 |
| |
| call f (a, .true., .false., is_parallel, is_static) |
| if (.not. is_parallel .or. is_static) stop 3 |
| |
| call f (a, .true., .true., is_parallel, is_static) |
| if (.not. is_parallel .or. .not. is_static) stop 4 |
| contains |
| subroutine f (a, run_parallel, run_static, is_parallel, is_static) |
| integer :: a(N) |
| logical, intent(in) :: run_parallel, run_static |
| logical, intent(out) :: is_parallel, is_static |
| integer :: i |
| |
| is_parallel = .false. |
| is_static = .false. |
| |
| !$omp begin metadirective when(user={condition(run_parallel)}: parallel) |
| if (omp_in_parallel ()) is_parallel = .true. |
| |
| !$omp metadirective & |
| !$omp& when(construct={parallel}, user={condition(.not. run_static)}: & |
| !$omp& do schedule(guided) private(is_static)) & |
| !$omp& when(construct={parallel}: do schedule(static)) |
| do i = 1, N |
| a(i) = i |
| is_static = .true. |
| end do |
| !$omp end metadirective |
| end subroutine |
| end program |