! PR fortran/51722 module m implicit none contains subroutine seltype type :: a integer :: p = 2 end type a type, extends(a) :: b integer :: cnt = 0 end type b integer :: k, s class(a), pointer :: x allocate(a :: x) s = 0 select type (y => x) class is (a) !$omp parallel do default(shared) private(k) reduction(+:s) do k = 1,10 s = s + k*y%p end do !$omp end parallel do end select if (s /= 110) error stop deallocate(x) allocate(b :: x) s = 0 select type (y => x) class is (b) !$omp parallel do default(shared) private(k) reduction(+:s) do k = 1,10 s = s + k*y%p !$omp atomic update y%cnt = y%cnt + 2 end do !$omp end parallel do if (s /= 110) error stop if (y%p /= 2) error stop if (y%cnt /= 10*2) error stop end select deallocate(x) end subroutine seltype subroutine assoc type :: b integer :: r = 3 end type b type :: a integer :: p = 2 class(b), pointer :: u => null() end type a integer :: k, s class(a), pointer :: x s = 0 allocate(a :: x) allocate(b :: x%u) associate(f => x%u) !$omp parallel do default(shared) private(k) reduction(+:s) do k = 1,10 s = s + k*f%r end do !$omp end parallel do end associate deallocate(x%u) deallocate(x) if (s /= 165) error stop end subroutine assoc end module m use m implicit none (type, external) call seltype call assoc end