diff options
Diffstat (limited to 'libgomp/testsuite/libgomp.fortran/associate4.f90')
-rw-r--r-- | libgomp/testsuite/libgomp.fortran/associate4.f90 | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/libgomp/testsuite/libgomp.fortran/associate4.f90 b/libgomp/testsuite/libgomp.fortran/associate4.f90 new file mode 100644 index 0000000..f0949b5 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/associate4.f90 @@ -0,0 +1,92 @@ +! 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 |