| 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 |