! Test ACC UPDATE with derived types. ! { dg-do run } module dt integer, parameter :: n = 10 type inner integer :: d(n) end type inner type mytype integer(8) :: a, b, c(n) type(inner) :: in end type mytype end module dt program derived_acc use dt implicit none integer i, res type(mytype) :: var var%a = 0 var%b = 1 var%c(:) = 10 var%in%d(:) = 100 var%c(:) = 10 !$acc enter data copyin(var) !$acc parallel loop present(var) do i = 1, 1 var%a = var%b end do !$acc end parallel loop !$acc update host(var%a) if (var%a /= var%b) stop 1 var%b = 100 !$acc update device(var%b) !$acc parallel loop present(var) do i = 1, 1 var%a = var%b end do !$acc end parallel loop !$acc update host(var%a) if (var%a /= var%b) stop 2 !$acc parallel loop present (var) do i = 1, n var%c(i) = i end do !$acc end parallel loop !$acc update host(var%c) var%a = -1 do i = 1, n if (var%c(i) /= i) stop 3 var%c(i) = var%a end do !$acc update device(var%a) !$acc update device(var%c) res = 0 !$acc parallel loop present(var) reduction(+:res) do i = 1, n if (var%c(i) /= var%a) res = res + 1 end do if (res /= 0) stop 4 var%c(:) = 0 !$acc update device(var%c) !$acc parallel loop present(var) do i = 5, 5 var%c(i) = 1 end do !$acc end parallel loop !$acc update host(var%c(5)) do i = 1, n if (i /= 5 .and. var%c(i) /= 0) stop 5 if (i == 5 .and. var%c(i) /= 1) stop 6 end do !$acc parallel loop present(var) do i = 1, n var%in%d = var%a end do !$acc end parallel loop !$acc update host(var%in%d) do i = 1, n if (var%in%d(i) /= var%a) stop 7 end do var%c(:) = 0 !$acc update device(var%c) var%c(:) = -1 !$acc parallel loop present(var) do i = n/2, n var%c(i) = i end do !$acc end parallel loop !$acc update host(var%c(n/2:n)) do i = 1,n if (i < n/2 .and. var%c(i) /= -1) stop 8 if (i >= n/2 .and. var%c(i) /= i) stop 9 end do var%in%d(:) = 0 !$acc update device(var%in%d) !$acc parallel loop present(var) do i = 5, 5 var%in%d(i) = 1 end do !$acc end parallel loop !$acc update host(var%in%d(5)) do i = 1, n if (i /= 5 .and. var%in%d(i) /= 0) stop 10 if (i == 5 .and. var%in%d(i) /= 1) stop 11 end do !$acc exit data delete(var) call derived_acc_subroutine(var) end program derived_acc subroutine derived_acc_subroutine(var) use dt implicit none integer i, res type(mytype) :: var var%a = 0 var%b = 1 var%c(:) = 10 var%in%d(:) = 100 var%c(:) = 10 !$acc enter data copyin(var) !$acc parallel loop present(var) do i = 1, 1 var%a = var%b end do !$acc end parallel loop !$acc update host(var%a) if (var%a /= var%b) stop 12 var%b = 100 !$acc update device(var%b) !$acc parallel loop present(var) do i = 1, 1 var%a = var%b end do !$acc end parallel loop !$acc update host(var%a) if (var%a /= var%b) stop 13 !$acc parallel loop present (var) do i = 1, n var%c(i) = i end do !$acc end parallel loop !$acc update host(var%c) var%a = -1 do i = 1, n if (var%c(i) /= i) stop 14 var%c(i) = var%a end do !$acc update device(var%a) !$acc update device(var%c) res = 0 !$acc parallel loop present(var) reduction(+:res) do i = 1, n if (var%c(i) /= var%a) res = res + 1 end do if (res /= 0) stop 15 var%c(:) = 0 !$acc update device(var%c) !$acc parallel loop present(var) do i = 5, 5 var%c(i) = 1 end do !$acc end parallel loop !$acc update host(var%c(5)) do i = 1, n if (i /= 5 .and. var%c(i) /= 0) stop 16 if (i == 5 .and. var%c(i) /= 1) stop 17 end do !$acc parallel loop present(var) do i = 1, n var%in%d = var%a end do !$acc end parallel loop !$acc update host(var%in%d) do i = 1, n if (var%in%d(i) /= var%a) stop 18 end do var%c(:) = 0 !$acc update device(var%c) var%c(:) = -1 !$acc parallel loop present(var) do i = n/2, n var%c(i) = i end do !$acc end parallel loop !$acc update host(var%c(n/2:n)) do i = 1,n if (i < n/2 .and. var%c(i) /= -1) stop 19 if (i >= n/2 .and. var%c(i) /= i) stop 20 end do var%in%d(:) = 0 !$acc update device(var%in%d) !$acc parallel loop present(var) do i = 5, 5 var%in%d(i) = 1 end do !$acc end parallel loop !$acc update host(var%in%d(5)) do i = 1, n if (i /= 5 .and. var%in%d(i) /= 0) stop 21 if (i == 5 .and. var%in%d(i) /= 1) stop 22 end do !$acc exit data delete(var) end subroutine derived_acc_subroutine