blob: b1d696656c0fb8508883f776394270e500b17164 [file] [log] [blame]
! { dg-do run }
!
! Test OpenMP 4.5 structure-element mapping
! TODO: ...%str4 + %uni4 should be tested but that currently fails due to
! PR fortran/95868 (see commented lined)
! TODO: Test also 'var' as array and/or pointer; nested derived types,
! type-extended types.
program main
implicit none
type t2
integer :: a, b
! For complex, assume small integers are exactly representable
complex(kind=8) :: c
integer :: d(10)
integer, pointer :: e => null(), f(:) => null()
character(len=5) :: str1
character(len=5) :: str2(4)
character(len=:), pointer :: str3 => null()
character(len=:), pointer :: str4(:) => null()
character(kind=4, len=5) :: uni1
character(kind=4, len=5) :: uni2(4)
character(kind=4, len=:), pointer :: uni3 => null()
character(kind=4, len=:), pointer :: uni4(:) => null()
end type t2
integer :: i
call one ()
call two ()
call three ()
call four ()
call five ()
call six ()
call seven ()
call eight ()
call nine ()
call ten ()
call eleven ()
call twelve ()
contains
! Implicitly mapped but no pointers are mapped
subroutine one()
type(t2) :: var
print '(g0)', '==== TESTCASE "one" ===='
var = t2(a = 1, &
b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
d = [(-3*i, i = 1, 10)], &
str1 = "abcde", &
str2 = ["12345", "67890", "ABCDE", "FGHIJ"], &
uni1 = 4_"abcde", &
uni2 = [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])
allocate (var%e, source=99)
allocate (var%f, source=[22, 33, 44, 55])
allocate (var%str3, source="HelloWorld")
allocate (var%str4, source=["Let's", "Go!!!"])
allocate (var%uni3, source=4_"HelloWorld")
allocate (var%uni4, source=[4_"Let's", 4_"Go!!!"])
!$omp target map(tofrom:var)
if (var%a /= 1) stop 1
if (var%b /= 2) stop 2
if (var%c%re /= -1.0_8 .or. var%c%im /= 2.0_8) stop 3
if (any (var%d /= [(-3*i, i = 1, 10)])) stop 4
if (var%str1 /= "abcde") stop 5
if (any (var%str2 /= ["12345", "67890", "ABCDE", "FGHIJ"])) stop 6
if (var%uni1 /= 4_"abcde") stop 7
if (any (var%uni2 /= [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])) stop 8
!$omp end target
deallocate(var%e, var%f, var%str3, var%str4, var%uni3, var%uni4)
end subroutine one
! Explicitly mapped all and full arrays
subroutine two()
type(t2) :: var
print '(g0)', '==== TESTCASE "two" ===='
var = t2(a = 1, &
b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
d = [(-3*i, i = 1, 10)], &
str1 = "abcde", &
str2 = ["12345", "67890", "ABCDE", "FGHIJ"], &
uni1 = 4_"abcde", &
uni2 = [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])
allocate (var%e, source=99)
allocate (var%f, source=[22, 33, 44, 55])
allocate (var%str3, source="HelloWorld")
allocate (var%str4, source=["Let's", "Go!!!"])
allocate (var%uni3, source=4_"HelloWorld")
allocate (var%uni4, source=[4_"Let's", 4_"Go!!!"])
!$omp target map(tofrom: var%a, var%b, var%c, var%d, var%e, var%f, &
!$omp& var%str1, var%str2, var%str3, var%str4, &
!$omp& var%uni1, var%uni2, var%uni3, var%uni4)
if (var%a /= 1) stop 1
if (var%b /= 2) stop 2
if (var%c%re /= -1.0_8 .or. var%c%im /= 2.0_8) stop 3
if (any (var%d /= [(-3*i, i = 1, 10)])) stop 4
if (var%str1 /= "abcde") stop 5
if (any (var%str2 /= ["12345", "67890", "ABCDE", "FGHIJ"])) stop 6
if (.not. associated (var%e)) stop 7
if (var%e /= 99) stop 8
if (.not. associated (var%f)) stop 9
if (size (var%f) /= 4) stop 10
if (any (var%f /= [22, 33, 44, 55])) stop 11
if (.not. associated (var%str3)) stop 12
if (len (var%str3) /= len ("HelloWorld")) stop 13
if (var%str3 /= "HelloWorld") stop 14
if (.not. associated (var%str4)) stop 15
if (len (var%str4) /= 5) stop 16
if (size (var%str4) /= 2) stop 17
if (any (var%str4 /= ["Let's", "Go!!!"])) stop 18
if (var%uni1 /= 4_"abcde") stop 19
if (any (var%uni2 /= [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])) stop 20
if (.not. associated (var%uni3)) stop 21
if (len (var%uni3) /= len (4_"HelloWorld")) stop 22
if (var%uni3 /= 4_"HelloWorld") stop 23
if (.not. associated (var%uni4)) stop 24
if (len (var%uni4) /= 5) stop 25
if (size (var%uni4) /= 2) stop 26
if (any (var%uni4 /= [4_"Let's", 4_"Go!!!"])) stop 27
!$omp end target
deallocate(var%e, var%f, var%str3, var%str4, var%uni3, var%uni4)
end subroutine two
! Explicitly mapped one by one but full arrays
subroutine three()
type(t2) :: var
print '(g0)', '==== TESTCASE "three" ===='
var = t2(a = 1, &
b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
d = [(-3*i, i = 1, 10)], &
str1 = "abcde", &
str2 = ["12345", "67890", "ABCDE", "FGHIJ"], &
uni1 = 4_"abcde", &
uni2 = [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])
allocate (var%e, source=99)
allocate (var%f, source=[22, 33, 44, 55])
allocate (var%str3, source="HelloWorld")
allocate (var%str4, source=["Let's", "Go!!!"])
allocate (var%uni3, source=4_"HelloWorld")
allocate (var%uni4, source=[4_"Let's", 4_"Go!!!"])
!$omp target map(tofrom: var%a)
if (var%a /= 1) stop 1
!$omp end target
!$omp target map(tofrom: var%b)
if (var%b /= 2) stop 2
!$omp end target
!$omp target map(tofrom: var%c)
if (var%c%re /= -1.0_8 .or. var%c%im /= 2.0_8) stop 3
!$omp end target
!$omp target map(tofrom: var%d)
if (any (var%d /= [(-3*i, i = 1, 10)])) stop 4
!$omp end target
!$omp target map(tofrom: var%str1)
if (var%str1 /= "abcde") stop 5
!$omp end target
!$omp target map(tofrom: var%str2)
if (any (var%str2 /= ["12345", "67890", "ABCDE", "FGHIJ"])) stop 6
!$omp end target
!$omp target map(tofrom: var%e)
if (.not. associated (var%e)) stop 7
if (var%e /= 99) stop 8
!$omp end target
!$omp target map(tofrom: var%f)
if (.not. associated (var%f)) stop 9
if (size (var%f) /= 4) stop 10
if (any (var%f /= [22, 33, 44, 55])) stop 11
!$omp end target
!$omp target map(tofrom: var%str3)
if (.not. associated (var%str3)) stop 12
if (len (var%str3) /= len ("HelloWorld")) stop 13
if (var%str3 /= "HelloWorld") stop 14
!$omp end target
!$omp target map(tofrom: var%str4)
if (.not. associated (var%str4)) stop 15
if (len (var%str4) /= 5) stop 16
if (size (var%str4) /= 2) stop 17
if (any (var%str4 /= ["Let's", "Go!!!"])) stop 18
!$omp end target
!$omp target map(tofrom: var%uni1)
if (var%uni1 /= 4_"abcde") stop 19
!$omp end target
!$omp target map(tofrom: var%uni2)
if (any (var%uni2 /= [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])) stop 20
!$omp end target
!$omp target map(tofrom: var%uni3)
if (.not. associated (var%uni3)) stop 21
if (len (var%uni3) /= len (4_"HelloWorld")) stop 22
if (var%uni3 /= 4_"HelloWorld") stop 23
!$omp end target
!$omp target map(tofrom: var%uni4)
if (.not. associated (var%uni4)) stop 24
if (len (var%uni4) /= 5) stop 25
if (size (var%uni4) /= 2) stop 26
if (any (var%uni4 /= [4_"Let's", 4_"Go!!!"])) stop 27
!$omp end target
deallocate(var%e, var%f, var%str3, var%str4, var%uni3, var%uni4)
end subroutine three
! Explicitly mapped all but only subarrays
subroutine four()
type(t2) :: var
print '(g0)', '==== TESTCASE "four" ===='
var = t2(a = 1, &
b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
d = [(-3*i, i = 1, 10)], &
str1 = "abcde", &
str2 = ["12345", "67890", "ABCDE", "FGHIJ"], &
uni1 = 4_"abcde", &
uni2 = [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])
allocate (var%f, source=[22, 33, 44, 55])
allocate (var%str4, source=["Let's", "Go!!!"])
allocate (var%uni4, source=[4_"Let's", 4_"Go!!!"])
! !$omp target map(tofrom: var%d(4:7), var%f(2:3), var%str2(2:3)) &
! !$omp& map(tofrom: var%str4(2:2), var%uni2(2:3), var%uni4(2:2))
!$omp target map(tofrom: var%d(4:7), var%f(2:3), var%str2(2:3), var%uni2(2:3))
if (any (var%d(4:7) /= [(-3*i, i = 4, 7)])) stop 4
if (any (var%str2(2:3) /= ["67890", "ABCDE"])) stop 6
if (.not. associated (var%f)) stop 9
if (size (var%f) /= 4) stop 10
if (any (var%f(2:3) /= [33, 44])) stop 11
! if (.not. associated (var%str4)) stop 15
! if (len (var%str4) /= 5) stop 16
! if (size (var%str4) /= 2) stop 17
! if (var%str4(2) /= "Go!!!") stop 18
if (any (var%uni2(2:3) /= [4_"67890", 4_"ABCDE"])) stop 19
! if (.not. associated (var%uni4)) stop 20
! if (len (var%uni4) /= 5) stop 21
! if (size (var%uni4) /= 2) stop 22
! if (var%uni4(2) /= "Go!!!") stop 23
!$omp end target
deallocate(var%f, var%str4)
end subroutine four
! Explicitly mapped all but only subarrays and one by one
subroutine five()
type(t2) :: var
print '(g0)', '==== TESTCASE "five" ===='
var = t2(a = 1, &
b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
d = [(-3*i, i = 1, 10)], &
str1 = "abcde", &
str2 = ["12345", "67890", "ABCDE", "FGHIJ"], &
uni1 = 4_"abcde", &
uni2 = [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])
allocate (var%f, source=[22, 33, 44, 55])
allocate (var%str4, source=["Let's", "Go!!!"])
!$omp target map(tofrom: var%d(4:7))
if (any (var%d(4:7) /= [(-3*i, i = 4, 7)])) stop 4
!$omp end target
!$omp target map(tofrom: var%str2(2:3))
if (any (var%str2(2:3) /= ["67890", "ABCDE"])) stop 6
!$omp end target
!$omp target map(tofrom: var%f(2:3))
if (.not. associated (var%f)) stop 9
if (size (var%f) /= 4) stop 10
if (any (var%f(2:3) /= [33, 44])) stop 11
!$omp end target
! !$omp target map(tofrom: var%str4(2:2))
! if (.not. associated (var%str4)) stop 15
! if (len (var%str4) /= 5) stop 16
! if (size (var%str4) /= 2) stop 17
! if (var%str4(2) /= "Go!!!") stop 18
! !$omp end target
! !$omp target map(tofrom: var%uni4(2:2))
! if (.not. associated (var%uni4)) stop 15
! if (len (var%uni4) /= 5) stop 16
! if (size (var%uni4) /= 2) stop 17
! if (var%uni4(2) /= 4_"Go!!!") stop 18
! !$omp end target
deallocate(var%f, var%str4)
end subroutine five
! Explicitly mapped all but only array elements
subroutine six()
type(t2) :: var
print '(g0)', '==== TESTCASE "six" ===='
var = t2(a = 1, &
b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
d = [(-3*i, i = 1, 10)], &
str1 = "abcde", &
str2 = ["12345", "67890", "ABCDE", "FGHIJ"], &
uni1 = 4_"abcde", &
uni2 = [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])
allocate (var%f, source=[22, 33, 44, 55])
allocate (var%str4, source=["Let's", "Go!!!"])
allocate (var%uni4, source=[4_"Let's", 4_"Go!!!"])
! !$omp target map(tofrom: var%d(5), var%f(3), var%str2(3), &
! !$omp var%str4(2), var%uni2(3), var%uni4(2))
!$omp target map(tofrom: var%d(5), var%f(3), var%str2(3), var%uni2(3))
if (var%d(5) /= -3*5) stop 4
if (var%str2(3) /= "ABCDE") stop 6
if (var%uni2(3) /= 4_"ABCDE") stop 7
if (.not. associated (var%f)) stop 9
if (size (var%f) /= 4) stop 10
if (var%f(3) /= 44) stop 11
! if (.not. associated (var%str4)) stop 15
! if (len (var%str4) /= 5) stop 16
! if (size (var%str4) /= 2) stop 17
! if (var%str4(2) /= "Go!!!") stop 18
! if (.not. associated (var%uni4)) stop 19
! if (len (var%uni4) /= 5) stop 20
! if (size (var%uni4) /= 2) stop 21
! if (var%uni4(2) /= 4_"Go!!!") stop 22
!$omp end target
deallocate(var%f, var%str4, var%uni4)
end subroutine six
! Explicitly mapped all but only array elements and one by one
subroutine seven()
type(t2) :: var
print '(g0)', '==== TESTCASE "seven" ===='
var = t2(a = 1, &
b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
d = [(-3*i, i = 1, 10)], &
str1 = "abcde", &
str2 = ["12345", "67890", "ABCDE", "FGHIJ"], &
uni1 = 4_"abcde", &
uni2 = [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])
allocate (var%f, source=[22, 33, 44, 55])
allocate (var%str4, source=["Let's", "Go!!!"])
allocate (var%uni4, source=[4_"Let's", 4_"Go!!!"])
!$omp target map(tofrom: var%d(5))
if (var%d(5) /= (-3*5)) stop 4
!$omp end target
!$omp target map(tofrom: var%str2(2:3))
if (any (var%str2(2:3) /= ["67890", "ABCDE"])) stop 6
!$omp end target
!$omp target map(tofrom: var%uni2(2:3))
if (any (var%uni2(2:3) /= [4_"67890", 4_"ABCDE"])) stop 7
!$omp end target
!$omp target map(tofrom: var%f(2:3))
if (.not. associated (var%f)) stop 9
if (size (var%f) /= 4) stop 10
if (any (var%f(2:3) /= [33, 44])) stop 11
!$omp end target
! !$omp target map(tofrom: var%str4(2:2))
! if (.not. associated (var%str4)) stop 15
! if (len (var%str4) /= 5) stop 16
! if (size (var%str4) /= 2) stop 17
! if (var%str4(2) /= "Go!!!") stop 18
! !$omp end target
! !$omp target map(tofrom: var%uni4(2:2))
! if (.not. associated (var%uni4)) stop 15
! if (len (var%uni4) /= 5) stop 16
! if (size (var%uni4) /= 2) stop 17
! if (var%uni4(2) /= 4_"Go!!!") stop 18
! !$omp end target
deallocate(var%f, var%str4, var%uni4)
end subroutine seven
! Check mapping of NULL pointers
subroutine eight()
type(t2) :: var
print '(g0)', '==== TESTCASE "eight" ===='
var = t2(a = 1, &
b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
d = [(-3*i, i = 1, 10)], &
str1 = "abcde", &
str2 = ["12345", "67890", "ABCDE", "FGHIJ"], &
uni1 = 4_"abcde", &
uni2 = [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])
! !$omp target map(tofrom: var%e, var%f, var%str3, var%str4, var%uni3, var%uni4)
!$omp target map(tofrom: var%e, var%str3, var%uni3)
if (associated (var%e)) stop 1
! if (associated (var%f)) stop 2
if (associated (var%str3)) stop 3
! if (associated (var%str4)) stop 4
if (associated (var%uni3)) stop 5
! if (associated (var%uni4)) stop 6
!$omp end target
end subroutine eight
! This is "subroutine four" but with explicit base-pointer mappings
! (var%f, etc.).
subroutine nine()
type(t2) :: var
print '(g0)', '==== TESTCASE "nine" ===='
var = t2(a = 1, &
b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
d = [(-3*i, i = 1, 10)], &
str1 = "abcde", &
str2 = ["12345", "67890", "ABCDE", "FGHIJ"], &
uni1 = 4_"abcde", &
uni2 = [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])
allocate (var%f, source=[22, 33, 44, 55])
allocate (var%str4, source=["Let's", "Go!!!"])
allocate (var%uni4, source=[4_"Let's", 4_"Go!!!"])
! !$omp target map(tofrom: var%d(4:7), var%f(2:3), var%str2(2:3)) &
! !$omp& map(tofrom: var%str4(2:2), var%uni2(2:3), var%uni4(2:2))
!$omp target map(to: var%f) map(tofrom: var%d(4:7), var%f(2:3), &
!$omp& var%str2(2:3), var%uni2(2:3))
if (any (var%d(4:7) /= [(-3*i, i = 4, 7)])) stop 4
if (any (var%str2(2:3) /= ["67890", "ABCDE"])) stop 6
if (.not. associated (var%f)) stop 9
if (size (var%f) /= 4) stop 10
if (any (var%f(2:3) /= [33, 44])) stop 11
! if (.not. associated (var%str4)) stop 15
! if (len (var%str4) /= 5) stop 16
! if (size (var%str4) /= 2) stop 17
! if (var%str4(2) /= "Go!!!") stop 18
if (any (var%uni2(2:3) /= [4_"67890", 4_"ABCDE"])) stop 19
! if (.not. associated (var%uni4)) stop 20
! if (len (var%uni4) /= 5) stop 21
! if (size (var%uni4) /= 2) stop 22
! if (var%uni4(2) /= "Go!!!") stop 23
!$omp end target
deallocate(var%f, var%str4)
end subroutine nine
! This is "subroutine five" but with explicit base-pointer mappings.
subroutine ten()
type(t2) :: var
print '(g0)', '==== TESTCASE "ten" ===='
var = t2(a = 1, &
b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
d = [(-3*i, i = 1, 10)], &
str1 = "abcde", &
str2 = ["12345", "67890", "ABCDE", "FGHIJ"], &
uni1 = 4_"abcde", &
uni2 = [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])
allocate (var%f, source=[22, 33, 44, 55])
allocate (var%str4, source=["Let's", "Go!!!"])
!$omp target map(tofrom: var%d(4:7))
if (any (var%d(4:7) /= [(-3*i, i = 4, 7)])) stop 4
!$omp end target
!$omp target map(tofrom: var%str2(2:3))
if (any (var%str2(2:3) /= ["67890", "ABCDE"])) stop 6
!$omp end target
!$omp target map(to: var%f) map(tofrom: var%f(2:3))
if (.not. associated (var%f)) stop 9
if (size (var%f) /= 4) stop 10
if (any (var%f(2:3) /= [33, 44])) stop 11
!$omp end target
! !$omp target map(tofrom: var%str4(2:2))
! if (.not. associated (var%str4)) stop 15
! if (len (var%str4) /= 5) stop 16
! if (size (var%str4) /= 2) stop 17
! if (var%str4(2) /= "Go!!!") stop 18
! !$omp end target
! !$omp target map(tofrom: var%uni4(2:2))
! if (.not. associated (var%uni4)) stop 15
! if (len (var%uni4) /= 5) stop 16
! if (size (var%uni4) /= 2) stop 17
! if (var%uni4(2) /= 4_"Go!!!") stop 18
! !$omp end target
deallocate(var%f, var%str4)
end subroutine ten
! This is "subroutine six" but with explicit base pointer mappings.
subroutine eleven()
type(t2) :: var
print '(g0)', '==== TESTCASE "eleven" ===='
var = t2(a = 1, &
b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
d = [(-3*i, i = 1, 10)], &
str1 = "abcde", &
str2 = ["12345", "67890", "ABCDE", "FGHIJ"], &
uni1 = 4_"abcde", &
uni2 = [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])
allocate (var%f, source=[22, 33, 44, 55])
allocate (var%str4, source=["Let's", "Go!!!"])
allocate (var%uni4, source=[4_"Let's", 4_"Go!!!"])
! !$omp target map(tofrom: var%d(5), var%f(3), var%str2(3), &
! !$omp var%str4(2), var%uni2(3), var%uni4(2))
!$omp target map(to: var%f) map(tofrom: var%d(5), var%f(3), &
!$omp& var%str2(3), var%uni2(3))
if (var%d(5) /= -3*5) stop 4
if (var%str2(3) /= "ABCDE") stop 6
if (var%uni2(3) /= 4_"ABCDE") stop 7
if (.not. associated (var%f)) stop 9
if (size (var%f) /= 4) stop 10
if (var%f(3) /= 44) stop 11
! if (.not. associated (var%str4)) stop 15
! if (len (var%str4) /= 5) stop 16
! if (size (var%str4) /= 2) stop 17
! if (var%str4(2) /= "Go!!!") stop 18
! if (.not. associated (var%uni4)) stop 19
! if (len (var%uni4) /= 5) stop 20
! if (size (var%uni4) /= 2) stop 21
! if (var%uni4(2) /= 4_"Go!!!") stop 22
!$omp end target
deallocate(var%f, var%str4, var%uni4)
end subroutine eleven
! This is "subroutine seven" but with explicit base-pointer mappings.
subroutine twelve()
type(t2) :: var
print '(g0)', '==== TESTCASE "twelve" ===='
var = t2(a = 1, &
b = 2, c = cmplx(-1.0_8, 2.0_8,kind=8), &
d = [(-3*i, i = 1, 10)], &
str1 = "abcde", &
str2 = ["12345", "67890", "ABCDE", "FGHIJ"], &
uni1 = 4_"abcde", &
uni2 = [4_"12345", 4_"67890", 4_"ABCDE", 4_"FGHIJ"])
allocate (var%f, source=[22, 33, 44, 55])
allocate (var%str4, source=["Let's", "Go!!!"])
allocate (var%uni4, source=[4_"Let's", 4_"Go!!!"])
!$omp target map(tofrom: var%d(5))
if (var%d(5) /= (-3*5)) stop 4
!$omp end target
!$omp target map(tofrom: var%str2(2:3))
if (any (var%str2(2:3) /= ["67890", "ABCDE"])) stop 6
!$omp end target
!$omp target map(tofrom: var%uni2(2:3))
if (any (var%uni2(2:3) /= [4_"67890", 4_"ABCDE"])) stop 7
!$omp end target
!$omp target map(to: var%f) map(tofrom: var%f(2:3))
if (.not. associated (var%f)) stop 9
if (size (var%f) /= 4) stop 10
if (any (var%f(2:3) /= [33, 44])) stop 11
!$omp end target
! !$omp target map(tofrom: var%str4(2:2))
! if (.not. associated (var%str4)) stop 15
! if (len (var%str4) /= 5) stop 16
! if (size (var%str4) /= 2) stop 17
! if (var%str4(2) /= "Go!!!") stop 18
! !$omp end target
! !$omp target map(tofrom: var%uni4(2:2))
! if (.not. associated (var%uni4)) stop 15
! if (len (var%uni4) /= 5) stop 16
! if (size (var%uni4) /= 2) stop 17
! if (var%uni4(2) /= 4_"Go!!!") stop 18
! !$omp end target
deallocate(var%f, var%str4, var%uni4)
end subroutine twelve
end program main