blob: f5a286ef0b71e399663fc191ac9e8ba4b1dfab1e [file] [log] [blame]
module m
implicit none (type, external)
type t
integer, allocatable :: A(:)
end type t
type t2
type(t), allocatable :: vT
integer, allocatable :: x
end type t2
contains
subroutine test_alloc()
type(t) :: var
type(t), allocatable :: var2
allocate(var2)
allocate(var%A(4), var2%A(5))
!$omp target enter data map(alloc: var, var2)
!$omp target
if (.not. allocated(Var2)) stop 1
if (.not. allocated(Var%A)) stop 2
if (.not. allocated(Var2%A)) stop 3
if (lbound(var%A, 1) /= 1 .or. ubound(var%A, 1) /= 4) stop 4
if (lbound(var2%A, 1) /= 1 .or. ubound(var2%A, 1) /= 5) stop 5
var%A = [1,2,3,4]
var2%A = [11,22,33,44,55]
!$omp end target
!$omp target exit data map(from: var, var2)
if (.not. allocated(Var2)) error stop
if (.not. allocated(Var%A)) error stop
if (.not. allocated(Var2%A)) error stop
if (lbound(var%A, 1) /= 1 .or. ubound(var%A, 1) /= 4) error stop
if (lbound(var2%A, 1) /= 1 .or. ubound(var2%A, 1) /= 5) error stop
if (any(var%A /= [1,2,3,4])) error stop
if (any(var2%A /= [11,22,33,44,55])) error stop
end subroutine test_alloc
subroutine test2_alloc()
type(t2) :: var
type(t2), allocatable :: var2
allocate(var2)
allocate(var%x, var2%x)
!$omp target enter data map(alloc: var, var2)
!$omp target
if (.not. allocated(Var2)) stop 6
if (.not. allocated(Var%x)) stop 7
if (.not. allocated(Var2%x)) stop 8
var%x = 42
var2%x = 43
!$omp end target
!$omp target exit data map(from: var, var2)
if (.not. allocated(Var2)) error stop
if (.not. allocated(Var%x)) error stop
if (.not. allocated(Var2%x)) error stop
if (var%x /= 42) error stop
if (var2%x /= 43) error stop
allocate(var%vt, var2%vt)
allocate(var%vt%A(-1:3), var2%vt%A(0:4))
!$omp target enter data map(alloc: var, var2)
!$omp target
if (.not. allocated(Var2)) stop 11
if (.not. allocated(Var%x)) stop 12
if (.not. allocated(Var2%x)) stop 13
if (.not. allocated(Var%vt)) stop 14
if (.not. allocated(Var2%vt)) stop 15
if (.not. allocated(Var%vt%a)) stop 16
if (.not. allocated(Var2%vt%a)) stop 17
var%x = 42
var2%x = 43
if (lbound(var%vt%A, 1) /= -1 .or. ubound(var%vt%A, 1) /= 3) stop 4
if (lbound(var2%vt%A, 1) /= 0 .or. ubound(var2%vt%A, 1) /= 4) stop 5
var%vt%A = [1,2,3,4,5]
var2%vt%A = [11,22,33,44,55]
!$omp end target
!$omp target exit data map(from: var, var2)
if (.not. allocated(Var2)) error stop
if (.not. allocated(Var%x)) error stop
if (.not. allocated(Var2%x)) error stop
if (.not. allocated(Var%vt)) error stop
if (.not. allocated(Var2%vt)) error stop
if (.not. allocated(Var%vt%a)) error stop
if (.not. allocated(Var2%vt%a)) error stop
if (var%x /= 42) error stop
if (var2%x /= 43) error stop
if (lbound(var%vt%A, 1) /= -1 .or. ubound(var%vt%A, 1) /= 3) error stop
if (lbound(var2%vt%A, 1) /= 0 .or. ubound(var2%vt%A, 1) /= 4) error stop
if (any(var%vt%A /= [1,2,3,4,5])) error stop
if (any(var2%vt%A /= [11,22,33,44,55])) error stop
end subroutine test2_alloc
subroutine test_alloc_target()
type(t) :: var
type(t), allocatable :: var2
allocate(var2)
allocate(var%A(4), var2%A(5))
!$omp target map(alloc: var, var2)
if (.not. allocated(Var2)) stop 1
if (.not. allocated(Var%A)) stop 2
if (.not. allocated(Var2%A)) stop 3
if (lbound(var%A, 1) /= 1 .or. ubound(var%A, 1) /= 4) stop 4
if (lbound(var2%A, 1) /= 1 .or. ubound(var2%A, 1) /= 5) stop 5
var%A = [1,2,3,4]
var2%A = [11,22,33,44,55]
!$omp end target
if (.not. allocated(Var2)) error stop
if (.not. allocated(Var%A)) error stop
if (.not. allocated(Var2%A)) error stop
if (lbound(var%A, 1) /= 1 .or. ubound(var%A, 1) /= 4) error stop
if (lbound(var2%A, 1) /= 1 .or. ubound(var2%A, 1) /= 5) error stop
end subroutine test_alloc_target
subroutine test2_alloc_target()
type(t2) :: var
type(t2), allocatable :: var2
allocate(var2)
allocate(var%x, var2%x)
!$omp target map(alloc: var, var2)
if (.not. allocated(Var2)) stop 6
if (.not. allocated(Var%x)) stop 7
if (.not. allocated(Var2%x)) stop 8
var%x = 42
var2%x = 43
!$omp end target
if (.not. allocated(Var2)) error stop
if (.not. allocated(Var%x)) error stop
if (.not. allocated(Var2%x)) error stop
allocate(var%vt, var2%vt)
allocate(var%vt%A(-1:3), var2%vt%A(0:4))
!$omp target map(alloc: var, var2)
if (.not. allocated(Var2)) stop 11
if (.not. allocated(Var%x)) stop 12
if (.not. allocated(Var2%x)) stop 13
if (.not. allocated(Var%vt)) stop 14
if (.not. allocated(Var2%vt)) stop 15
if (.not. allocated(Var%vt%a)) stop 16
if (.not. allocated(Var2%vt%a)) stop 17
var%x = 42
var2%x = 43
if (lbound(var%vt%A, 1) /= -1 .or. ubound(var%vt%A, 1) /= 3) stop 4
if (lbound(var2%vt%A, 1) /= 0 .or. ubound(var2%vt%A, 1) /= 4) stop 5
var%vt%A = [1,2,3,4,5]
var2%vt%A = [11,22,33,44,55]
!$omp end target
if (.not. allocated(Var2)) error stop
if (.not. allocated(Var%x)) error stop
if (.not. allocated(Var2%x)) error stop
if (.not. allocated(Var%vt)) error stop
if (.not. allocated(Var2%vt)) error stop
if (.not. allocated(Var%vt%a)) error stop
if (.not. allocated(Var2%vt%a)) error stop
if (lbound(var%vt%A, 1) /= -1 .or. ubound(var%vt%A, 1) /= 3) error stop
if (lbound(var2%vt%A, 1) /= 0 .or. ubound(var2%vt%A, 1) /= 4) error stop
end subroutine test2_alloc_target
subroutine test_from()
type(t) :: var
type(t), allocatable :: var2
allocate(var2)
allocate(var%A(4), var2%A(5))
!$omp target map(from: var, var2)
if (.not. allocated(Var2)) stop 1
if (.not. allocated(Var%A)) stop 2
if (.not. allocated(Var2%A)) stop 3
if (lbound(var%A, 1) /= 1 .or. ubound(var%A, 1) /= 4) stop 4
if (lbound(var2%A, 1) /= 1 .or. ubound(var2%A, 1) /= 5) stop 5
var%A = [1,2,3,4]
var2%A = [11,22,33,44,55]
!$omp end target
if (.not. allocated(Var2)) error stop
if (.not. allocated(Var%A)) error stop
if (.not. allocated(Var2%A)) error stop
if (lbound(var%A, 1) /= 1 .or. ubound(var%A, 1) /= 4) error stop
if (lbound(var2%A, 1) /= 1 .or. ubound(var2%A, 1) /= 5) error stop
if (any(var%A /= [1,2,3,4])) error stop
if (any(var2%A /= [11,22,33,44,55])) error stop
end subroutine test_from
subroutine test2_from()
type(t2) :: var
type(t2), allocatable :: var2
allocate(var2)
allocate(var%x, var2%x)
!$omp target map(from: var, var2)
if (.not. allocated(Var2)) stop 6
if (.not. allocated(Var%x)) stop 7
if (.not. allocated(Var2%x)) stop 8
var%x = 42
var2%x = 43
!$omp end target
if (.not. allocated(Var2)) error stop
if (.not. allocated(Var%x)) error stop
if (.not. allocated(Var2%x)) error stop
if (var%x /= 42) error stop
if (var2%x /= 43) error stop
allocate(var%vt, var2%vt)
allocate(var%vt%A(-1:3), var2%vt%A(0:4))
!$omp target map(from: var, var2)
if (.not. allocated(Var2)) stop 11
if (.not. allocated(Var%x)) stop 12
if (.not. allocated(Var2%x)) stop 13
if (.not. allocated(Var%vt)) stop 14
if (.not. allocated(Var2%vt)) stop 15
if (.not. allocated(Var%vt%a)) stop 16
if (.not. allocated(Var2%vt%a)) stop 17
var%x = 42
var2%x = 43
if (lbound(var%vt%A, 1) /= -1 .or. ubound(var%vt%A, 1) /= 3) stop 4
if (lbound(var2%vt%A, 1) /= 0 .or. ubound(var2%vt%A, 1) /= 4) stop 5
var%vt%A = [1,2,3,4,5]
var2%vt%A = [11,22,33,44,55]
!$omp end target
if (.not. allocated(Var2)) error stop
if (.not. allocated(Var%x)) error stop
if (.not. allocated(Var2%x)) error stop
if (.not. allocated(Var%vt)) error stop
if (.not. allocated(Var2%vt)) error stop
if (.not. allocated(Var%vt%a)) error stop
if (.not. allocated(Var2%vt%a)) error stop
if (var%x /= 42) error stop
if (var2%x /= 43) error stop
if (lbound(var%vt%A, 1) /= -1 .or. ubound(var%vt%A, 1) /= 3) error stop
if (lbound(var2%vt%A, 1) /= 0 .or. ubound(var2%vt%A, 1) /= 4) error stop
if (any(var%vt%A /= [1,2,3,4,5])) error stop
if (any(var2%vt%A /= [11,22,33,44,55])) error stop
end subroutine test2_from
end module m
use m
implicit none (type, external)
call test_alloc
call test2_alloc
call test_alloc_target
call test2_alloc_target
call test_from
call test2_from
end