1! { dg-do run }
2! PR 66680: ICE with openmp, a loop and a type bound procedure
3! Contributed by Miha Polajnar <polajnar.miha@gmail.com>
4!
5module m1
6  implicit none
7  integer :: n = 5
8  type :: t1
9  contains
10    procedure :: s => s1
11  end type t1
12contains
13  pure subroutine s1(self,p,esta)
14    class(t1), intent(in) :: self
15    integer, optional, intent(in) :: p
16    integer, intent(out) :: esta
17  end subroutine s1
18end module m1
19module m2
20  use m1, only: t1, n
21  implicit none
22  type(t1), allocatable :: test(:)
23contains
24  pure subroutine s2(test1,esta)
25    type(t1), intent(in) :: test1
26    integer, intent(out) :: esta
27    integer :: p, i
28    do p = 1, n
29      i = p ! using i instead of p works
30      call test1%s(p=p,esta=esta)
31      if ( esta /= 0 ) return
32    end do
33  end subroutine s2
34  subroutine s3()
35    integer :: i, esta
36    !$omp parallel do  &
37    !$omp private(i)
38    do i = 1, n
39        call s2(test(i),esta)
40    end do
41    !$omp end parallel do
42  end subroutine s3
43end module m2
44program main
45  implicit none
46end program main
47