! { dg-do run } type t integer, allocatable :: A(:,:) end type t type(t), allocatable :: b(:) integer :: i allocate(b(1:20)) do i=1,20 allocate(b(i)%A(1:20,1:20)) end do do i=1,20 b(i)%A(:,:) = 0 end do !$acc enter data copyin(b) do i=1,20 !$acc enter data copyin(b(i)%A) end do b(1)%A(:,:) = 5 !$acc update device(b(::2)) !$acc update device(b(1)%A(::3,::4)) do i=1,20 !$acc exit data copyout(b(i)%A) end do !$acc exit data copyout(b) ! This is necessarily conservative because the "update" is allowed to copy ! e.g. the whole of the containing block for a discontinuous update. ! Try to ensure that the update covers a sufficient portion of the array. if (any(b(1)%A(::3,::4) .ne. 5)) stop 1 do i=2,20 if (any(b(i)%A(:,:) .ne. 0)) stop 2 end do end