blob: e76d56dd6bc1c05308d0b7b585afe0a1b5b014ea [file] [log] [blame]
! { dg-do run }
! { dg-options "-fcoarray=lib -lcaf_single" }
! { dg-additional-options "-latomic" { target libatomic_available } }
! Contributed by Damian Rouson
! Check the new _caf_get_by_ref()-routine.
! Same like coarray_alloc_comp_1 but for pointers.
program main
implicit none
type :: mytype
integer :: i
integer, pointer :: indices(:)
real, dimension(2,5,3) :: volume
integer, pointer :: scalar
integer :: j
integer, pointer :: matrix(:,:)
real, pointer :: dynvol(:,:,:)
end type
type arrtype
type(mytype), pointer :: vec(:)
type(mytype), pointer :: mat(:,:)
end type arrtype
type(mytype), save :: object[*]
type(arrtype), save :: bar[*]
integer :: i,j,me,neighbor
integer :: idx(5)
real, allocatable :: volume(:,:,:), vol2(:,:,:)
real, target :: vol_static(2,5,3)
idx = (/ 1,2,1,7,5 /)
me=this_image()
allocate(object%indices, source=[(i,i=1,5)])
allocate(object%scalar, object%matrix(10,7))
object%i = 37
object%scalar = 42
vol_static = reshape([(i, i=1, 2*5*3)], [2, 5, 3])
object%volume = vol_static
object%matrix = reshape([(i, i=1, 70)], [10, 7])
object%dynvol => vol_static
sync all
neighbor = merge(1,neighbor,me==num_images())
if (object[neighbor]%scalar /= 42) STOP 1
if (object[neighbor]%indices(4) /= 4) STOP 2
if (object[neighbor]%matrix(3,6) /= 53) STOP 3
if (any( object[neighbor]%indices(:) /= [1,2,3,4,5] )) STOP 4
if (any( object[neighbor]%matrix(:,:) /= reshape([(i, i=1, 70)], [10, 7]))) STOP 5
if (any( object[neighbor]%matrix(3,:) /= [(i * 10 + 3, i=0, 6)])) STOP 6
if (any( object[neighbor]%matrix(:,2) /= [(i + 10, i=1, 10)])) STOP 7
if (any( object[neighbor]%matrix(idx,2) /= [11, 12, 11, 17, 15])) STOP 8
if (any( object[neighbor]%matrix(3,idx) /= [3, 13, 3, 63, 43])) STOP 9
if (any( object[neighbor]%matrix(2:8:4, 5:1:-1) /= reshape([42, 46, 32, 36, 22, 26, 12, 16, 2, 6], [2,5]))) STOP 10
if (any( object[neighbor]%matrix(:8:4, 2::2) /= reshape([11, 15, 31, 35, 51, 55], [2,3]))) STOP 11
if (any( object[neighbor]%volume /= vol_static)) STOP 12
if (any( object[neighbor]%dynvol /= vol_static)) STOP 13
if (any( object[neighbor]%volume(:, 2:4, :) /= vol_static(:, 2:4, :))) STOP 14
if (any( object[neighbor]%dynvol(:, 2:4, :) /= vol_static(:, 2:4, :))) STOP 15
vol2 = vol_static(:, ::2, :)
if (any( object[neighbor]%volume(:, ::2, :) /= vol2)) STOP 16
if (any( object[neighbor]%dynvol(:, ::2, :) /= vol2)) STOP 17
allocate(bar%vec(-2:2))
bar%vec(1)%volume = vol_static
if (any(bar[neighbor]%vec(1)%volume /= vol_static)) STOP 18
i = 15
allocate(bar%vec(1)%scalar, bar%vec(0)%scalar)
bar%vec(1)%scalar = i
if (.not. associated(bar%vec(1)%scalar)) STOP 19
if (bar[neighbor]%vec(1)%scalar /= 15) STOP 20
bar%vec(0)%scalar = 27
if (.not. associated(bar%vec(0)%scalar)) STOP 21
if (bar[neighbor]%vec(0)%scalar /= 27) STOP 22
allocate(bar%vec(1)%indices(3), bar%vec(2)%indices(5))
bar%vec(1)%indices = [ 3, 4, 15 ]
bar%vec(2)%indices = 89
if (.not. associated(bar%vec(1)%indices)) STOP 23
if (associated(bar%vec(-2)%indices)) STOP 24
if (associated(bar%vec(-1)%indices)) STOP 25
if (associated(bar%vec( 0)%indices)) STOP 26
if (.not. associated(bar%vec( 2)%indices)) STOP 27
if (any(bar[me]%vec(2)%indices /= 89)) STOP 28
if (any (bar[neighbor]%vec(1)%indices /= [ 3,4,15])) STOP 29
deallocate(bar%vec(2)%indices, bar%vec(1)%indices, bar%vec(1)%scalar, bar%vec(0)%scalar)
deallocate(object%indices, object%scalar, object%matrix)
deallocate(bar%vec)
end program