blob: 26c73d75c09b512acbe32d9bf5c62a1d7183eb37 [file] [log] [blame]
! { dg-additional-options "-cpp" }
!
! Ensure that polymorphic mapping is diagnosed as undefined behavior
! Ensure that static access to polymorphic variables works
! Some extended tests are only run with shared memory
! To enforce this (where possible) on the device side:
! #define USE_USM_REQUIREMENT
! which is done in map-alloc-comp-9-usm.f90
subroutine test(case)
implicit none(type, external)
#ifdef USE_USM_REQUIREMENT
!$omp requires unified_shared_memory
#endif
type t
integer :: x(4)
end type t
type ta
integer, allocatable :: x(:)
end type ta
type t2
class(t), allocatable :: x
class(t), allocatable :: x2(:)
end type t2
type t3
type(t2) :: y
type(t2) :: y2(2)
end type t3
type t4
type(t3), allocatable :: y
type(t3), allocatable :: y2(:)
end type t4
integer, value :: case
logical :: is_shared_mem
! Mangle stack addresses
integer, volatile :: case_var(100*case)
type(t), allocatable :: var1
type(ta), allocatable :: var1a
class(t), allocatable :: var2
type(t2), allocatable :: var3
type(t4), allocatable :: var4
case_var(100) = 0
!print *, 'case', case
var1 = t([1,2,3,4])
var1a = ta([-1,-2,-3,-4,-5])
var2 = t([11,22,33,44])
allocate(t2 :: var3)
allocate(t :: var3%x)
allocate(t :: var3%x2(2))
var3%x%x = [111,222,333,444]
var3%x2(1)%x = 2*[111,222,333,444]
var3%x2(2)%x = 3*[111,222,333,444]
allocate(t4 :: var4)
allocate(t3 :: var4%y)
allocate(t3 :: var4%y2(2))
allocate(t :: var4%y%y%x)
allocate(t :: var4%y%y%x2(2))
allocate(t :: var4%y2(1)%y%x)
allocate(t :: var4%y2(1)%y%x2(2))
allocate(t :: var4%y2(2)%y%x)
allocate(t :: var4%y2(2)%y%x2(2))
var4%y%y%x%x = -1 * [1111,2222,3333,4444]
var4%y%y%x2(1)%x = -2 * [1111,2222,3333,4444]
var4%y%y%x2(2)%x = -3 * [1111,2222,3333,4444]
var4%y2(1)%y%x%x = -4 * [1111,2222,3333,4444]
var4%y2(1)%y%x2(1)%x = -5 * [1111,2222,3333,4444]
var4%y2(1)%y%x2(2)%x = -6 * [1111,2222,3333,4444]
var4%y2(2)%y%x%x = -7 * [1111,2222,3333,4444]
var4%y2(2)%y%x2(1)%x = -8 * [1111,2222,3333,4444]
var4%y2(2)%y%x2(2)%x = -9 * [1111,2222,3333,4444]
#ifdef USE_USM_REQUIREMENT
is_shared_mem = .true.
#else
is_shared_mem = .false.
!$omp target map(to: is_shared_mem)
is_shared_mem = .true.
!$omp end target
#endif
if (case == 1) then
! implicit mapping
!$omp target
if (any (var1%x /= [1,2,3,4])) stop 1
var1%x = 2 * var1%x
!$omp end target
!$omp target
if (any (var1a%x /= [-1,-2,-3,-4])) stop 2
var1a%x = 3 * var1a%x
!$omp end target
!$omp target ! { dg-warning "Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var2%x /= [11,22,33,44])) stop 3
var2%x = 4 * var2%x
!$omp end target
!$omp target ! { dg-warning "Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var3%x%x /= [111,222,333,444])) stop 4
var3%x%x = 5 * var3%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 4
if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 4
var3%x2(1)%x = 5 * var3%x2(1)%x
var3%x2(2)%x = 5 * var3%x2(2)%x
end if
!$omp end target
!$omp target ! { dg-warning "Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 5
if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 5
endif
if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 5
if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 5
endif
if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 5
if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 5
end if
var4%y%y%x%x = 6 * var4%y%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y%y%x2(1)%x = 6 * var4%y%y%x2(1)%x
var4%y%y%x2(2)%x = 6 * var4%y%y%x2(2)%x
endif
var4%y2(1)%y%x%x = 6 * var4%y2(1)%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y2(1)%y%x2(1)%x = 6 * var4%y2(1)%y%x2(1)%x
var4%y2(1)%y%x2(2)%x = 6 * var4%y2(1)%y%x2(2)%x
endif
var4%y2(2)%y%x%x = 6 * var4%y2(2)%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y2(2)%y%x2(1)%x = 6 * var4%y2(2)%y%x2(1)%x
var4%y2(2)%y%x2(2)%x = 6 * var4%y2(2)%y%x2(2)%x
endif
!$omp end target
else if (case == 2) then
! Use target with defaultmap(TO)
!$omp target defaultmap(to : all)
if (any (var1%x /= [1,2,3,4])) stop 1
var1%x = 2 * var1%x
!$omp end target
!$omp target defaultmap(to : all)
if (any (var1a%x /= [-1,-2,-3,-4])) stop 2
var1a%x = 3 * var1a%x
!$omp end target
!$omp target defaultmap(to : all) ! { dg-warning "Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var2%x /= [11,22,33,44])) stop 3
var2%x = 4 * var2%x
!$omp end target
!$omp target defaultmap(to : all) ! { dg-warning "Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var3%x%x /= [111,222,333,444])) stop 4
var3%x%x = 5 * var3%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 4
if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 4
var3%x2(1)%x = 5 * var3%x2(1)%x
var3%x2(2)%x = 5 * var3%x2(2)%x
endif
!$omp end target
!$omp target defaultmap(to : all) firstprivate(is_shared_mem) ! { dg-warning "Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 5
if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 5
endif
if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 5
if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 5
endif
if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 5
if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 5
endif
var4%y%y%x%x = 6 * var4%y%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y%y%x2(1)%x = 6 * var4%y%y%x2(1)%x
var4%y%y%x2(2)%x = 6 * var4%y%y%x2(2)%x
endif
var4%y2(1)%y%x%x = 6 * var4%y2(1)%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y2(1)%y%x2(1)%x = 6 * var4%y2(1)%y%x2(1)%x
var4%y2(1)%y%x2(2)%x = 6 * var4%y2(1)%y%x2(2)%x
endif
var4%y2(2)%y%x%x = 6 * var4%y2(2)%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y2(2)%y%x2(1)%x = 6 * var4%y2(2)%y%x2(1)%x
var4%y2(2)%y%x2(2)%x = 6 * var4%y2(2)%y%x2(2)%x
endif
!$omp end target
else if (case == 3) then
! Use target with map clause
!$omp target map(tofrom: var1)
if (any (var1%x /= [1,2,3,4])) stop 1
var1%x = 2 * var1%x
!$omp end target
!$omp target map(tofrom: var1a)
if (any (var1a%x /= [-1,-2,-3,-4])) stop 2
var1a%x = 3 * var1a%x
!$omp end target
!$omp target map(tofrom: var2) ! { dg-warning "28: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var2%x /= [11,22,33,44])) stop 3
var2%x = 4 * var2%x
!$omp end target
!$omp target map(tofrom: var3) ! { dg-warning "28: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var3%x%x /= [111,222,333,444])) stop 4
var3%x%x = 5 * var3%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 4
if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 4
var3%x2(1)%x = 5 * var3%x2(1)%x
var3%x2(2)%x = 5 * var3%x2(2)%x
endif
!$omp end target
!$omp target map(tofrom: var4) ! { dg-warning "28: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 5
if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 5
end if
if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 5
if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 5
endif
if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 5
if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 5
endif
var4%y%y%x%x = 6 * var4%y%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y%y%x2(1)%x = 6 * var4%y%y%x2(1)%x
var4%y%y%x2(2)%x = 6 * var4%y%y%x2(2)%x
endif
var4%y2(1)%y%x%x = 6 * var4%y2(1)%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y2(1)%y%x2(1)%x = 6 * var4%y2(1)%y%x2(1)%x
var4%y2(1)%y%x2(2)%x = 6 * var4%y2(1)%y%x2(2)%x
endif
var4%y2(2)%y%x%x = 6 * var4%y2(2)%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y2(2)%y%x2(1)%x = 6 * var4%y2(2)%y%x2(1)%x
var4%y2(2)%y%x2(2)%x = 6 * var4%y2(2)%y%x2(2)%x
endif
!$omp end target
else if (case == 4) then
! Use target with map clause -- NOTE: This uses TO not TOFROM
!$omp target map(to: var1)
if (any (var1%x /= [1,2,3,4])) stop 1
var1%x = 2 * var1%x
!$omp end target
!$omp target map(to: var1a)
if (any (var1a%x /= [-1,-2,-3,-4])) stop 2
var1a%x = 3 * var1a%x
!$omp end target
!$omp target map(to: var2) ! { dg-warning "24: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var2%x /= [11,22,33,44])) stop 3
var2%x = 4 * var2%x
!$omp end target
!$omp target map(to: var3) ! { dg-warning "24: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var3%x%x /= [111,222,333,444])) stop 4
var3%x%x = 5 * var3%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 4
if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 4
var3%x2(1)%x = 5 * var3%x2(1)%x
var3%x2(2)%x = 5 * var3%x2(2)%x
endif
!$omp end target
!$omp target map(to: var4) ! { dg-warning "24: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 5
if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 5
endif
if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 5
if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 5
endif
if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 5
if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 5
endif
var4%y%y%x%x = 6 * var4%y%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y%y%x2(1)%x = 6 * var4%y%y%x2(1)%x
var4%y%y%x2(2)%x = 6 * var4%y%y%x2(2)%x
endif
var4%y2(1)%y%x%x = 6 * var4%y2(1)%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y2(1)%y%x2(1)%x = 6 * var4%y2(1)%y%x2(1)%x
var4%y2(1)%y%x2(2)%x = 6 * var4%y2(1)%y%x2(2)%x
endif
var4%y2(2)%y%x%x = 6 * var4%y2(2)%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y2(2)%y%x2(1)%x = 6 * var4%y2(2)%y%x2(1)%x
var4%y2(2)%y%x2(2)%x = 6 * var4%y2(2)%y%x2(2)%x
endif
!$omp end target
else if (case == 5) then
! Use target enter/exit data + target with explicit map
!$omp target enter data map(to: var1)
!$omp target enter data map(to: var1a)
!$omp target enter data map(to: var2) ! { dg-warning "35: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" }
!$omp target enter data map(to: var3) ! { dg-warning "35: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" }
!$omp target enter data map(to: var4) ! { dg-warning "35: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" }
!$omp target map(to: var1)
if (any (var1%x /= [1,2,3,4])) stop 1
var1%x = 2 * var1%x
!$omp end target
!$omp target map(to: var1a)
if (any (var1a%x /= [-1,-2,-3,-4])) stop 2
var1a%x = 3 * var1a%x
!$omp end target
!$omp target map(to: var2) ! { dg-warning "24: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var2%x /= [11,22,33,44])) stop 3
var2%x = 4 * var2%x
!$omp end target
!$omp target map(to: var3) ! { dg-warning "24: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var3%x%x /= [111,222,333,444])) stop 4
var3%x%x = 5 * var3%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 4
if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 4
var3%x2(1)%x = 5 * var3%x2(1)%x
var3%x2(2)%x = 5 * var3%x2(2)%x
endif
!$omp end target
!$omp target map(to: var4) ! { dg-warning "24: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 5
if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 5
endif
if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 5
if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 5
endif
if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 5
if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 5
endif
var4%y%y%x%x = 6 * var4%y%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y%y%x2(1)%x = 6 * var4%y%y%x2(1)%x
var4%y%y%x2(2)%x = 6 * var4%y%y%x2(2)%x
endif
var4%y2(1)%y%x%x = 6 * var4%y2(1)%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y2(1)%y%x2(1)%x = 6 * var4%y2(1)%y%x2(1)%x
var4%y2(1)%y%x2(2)%x = 6 * var4%y2(1)%y%x2(2)%x
endif
var4%y2(2)%y%x%x = 6 * var4%y2(2)%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y2(2)%y%x2(1)%x = 6 * var4%y2(2)%y%x2(1)%x
var4%y2(2)%y%x2(2)%x = 6 * var4%y2(2)%y%x2(2)%x
endif
!$omp end target
!$omp target exit data map(from: var1)
!$omp target exit data map(from: var1a)
!$omp target exit data map(from: var2) ! { dg-warning "36: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" }
!$omp target exit data map(from: var3) ! { dg-warning "36: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" }
!$omp target exit data map(from: var4) ! { dg-warning "36: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" }
else if (case == 6) then
! Use target enter/exit data + target with implicit map
!$omp target enter data map(to: var1)
!$omp target enter data map(to: var1a)
!$omp target enter data map(to: var2) ! { dg-warning "35: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" }
!$omp target enter data map(to: var3) ! { dg-warning "35: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" }
!$omp target enter data map(to: var4) ! { dg-warning "35: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" }
!$omp target
if (any (var1%x /= [1,2,3,4])) stop 1
var1%x = 2 * var1%x
!$omp end target
!$omp target
if (any (var1a%x /= [-1,-2,-3,-4])) stop 2
var1a%x = 3 * var1a%x
!$omp end target
!$omp target ! { dg-warning "Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var2%x /= [11,22,33,44])) stop 3
var2%x = 4 * var2%x
!$omp end target
!$omp target ! { dg-warning "Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var3%x%x /= [111,222,333,444])) stop 4
var3%x%x = 5 * var3%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 4
if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 4
var3%x2(1)%x = 5 * var3%x2(1)%x
var3%x2(2)%x = 5 * var3%x2(2)%x
endif
!$omp end target
!$omp target ! { dg-warning "Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" }
if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 5
if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 5
endif
if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 5
if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 5
endif
if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 5
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 5
if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 5
endif
var4%y%y%x%x = 6 * var4%y%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y%y%x2(1)%x = 6 * var4%y%y%x2(1)%x
var4%y%y%x2(2)%x = 6 * var4%y%y%x2(2)%x
endif
var4%y2(1)%y%x%x = 6 * var4%y2(1)%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y2(1)%y%x2(1)%x = 6 * var4%y2(1)%y%x2(1)%x
var4%y2(1)%y%x2(2)%x = 6 * var4%y2(1)%y%x2(2)%x
endif
var4%y2(2)%y%x%x = 6 * var4%y2(2)%y%x%x
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
var4%y2(2)%y%x2(1)%x = 6 * var4%y2(2)%y%x2(1)%x
var4%y2(2)%y%x2(2)%x = 6 * var4%y2(2)%y%x2(2)%x
endif
!$omp end target
!$omp target exit data map(from: var1)
!$omp target exit data map(from: var1a)
!$omp target exit data map(from: var2) ! { dg-warning "36: Mapping of polymorphic list item 'var2' is unspecified behavior \\\[-Wopenmp\\\]" }
!$omp target exit data map(from: var3) ! { dg-warning "36: Mapping of polymorphic list item 'var3->x' is unspecified behavior \\\[-Wopenmp\\\]" }
!$omp target exit data map(from: var4) ! { dg-warning "36: Mapping of polymorphic list item 'var4\.\[0-9\]+->y->y\.x' is unspecified behavior \\\[-Wopenmp\\\]" }
else
error stop
end if
if ((case /= 2 .and. case /= 4) .or. is_shared_mem) then
! The target update should have been active, check for the updated values
if (any (var1%x /= 2 * [1,2,3,4])) stop 11
if (any (var1a%x /= 3 * [-1,-2,-3,-4])) stop 22
if (any (var2%x /= 4 * [11,22,33,44])) stop 33
if (any (var3%x%x /= 5 * [111,222,333,444])) stop 44
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var3%x2(1)%x /= 2 * 5 * [111,222,333,444])) stop 44
if (any (var3%x2(2)%x /= 3 * 5 * [111,222,333,444])) stop 44
endif
if (any (var4%y%y%x%x /= -1 * 6 * [1111,2222,3333,4444])) stop 55
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y%y%x2(1)%x /= -2 * 6 * [1111,2222,3333,4444])) stop 55
if (any (var4%y%y%x2(2)%x /= -3 * 6 * [1111,2222,3333,4444])) stop 55
endif
if (any (var4%y2(1)%y%x%x /= -4 * 6 * [1111,2222,3333,4444])) stop 55
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(1)%y%x2(1)%x /= -5 * 6 * [1111,2222,3333,4444])) stop 55
if (any (var4%y2(1)%y%x2(2)%x /= -6 * 6 * [1111,2222,3333,4444])) stop 55
endif
if (any (var4%y2(2)%y%x%x /= -7 * 6 * [1111,2222,3333,4444])) stop 55
if (is_shared_mem) then ! For stride data, this accesses the host's _vtab
if (any (var4%y2(2)%y%x2(1)%x /= -8 * 6 * [1111,2222,3333,4444])) stop 55
if (any (var4%y2(2)%y%x2(2)%x /= -9 * 6 * [1111,2222,3333,4444])) stop 55
endif
else
! The old host values should still be there as 'to:' created a device copy
if (any (var1%x /= [1,2,3,4])) stop 12
if (any (var1a%x /= [-1,-2,-3,-4])) stop 22
if (any (var2%x /= [11,22,33,44])) stop 33
if (any (var3%x%x /= [111,222,333,444])) stop 44
! .not. is_shared_mem:
! if (any (var3%x2(1)%x /= 2*[111,222,333,444])) stop 44
! if (any (var3%x2(2)%x /= 3*[111,222,333,444])) stop 44
if (any (var4%y%y%x%x /= -1 * [1111,2222,3333,4444])) stop 55
if (any (var4%y%y%x2(1)%x /= -2 * [1111,2222,3333,4444])) stop 55
if (any (var4%y%y%x2(2)%x /= -3 * [1111,2222,3333,4444])) stop 55
if (any (var4%y2(1)%y%x%x /= -4 * [1111,2222,3333,4444])) stop 55
! .not. is_shared_mem:
!if (any (var4%y2(1)%y%x2(1)%x /= -5 * [1111,2222,3333,4444])) stop 55
!if (any (var4%y2(1)%y%x2(2)%x /= -6 * [1111,2222,3333,4444])) stop 55
if (any (var4%y2(2)%y%x%x /= -7 * [1111,2222,3333,4444])) stop 55
! .not. is_shared_mem:
!if (any (var4%y2(2)%y%x2(1)%x /= -8 * [1111,2222,3333,4444])) stop 55
!if (any (var4%y2(2)%y%x2(2)%x /= -9 * [1111,2222,3333,4444])) stop 55
end if
if (case_var(100) /= 0) stop 123
end subroutine test
program main
use omp_lib
implicit none(type, external)
#ifdef USE_USM_REQUIREMENT
!$omp requires unified_shared_memory
#endif
interface
subroutine test(case)
integer, value :: case
end
end interface
integer :: dev
call run_it(omp_get_default_device())
do dev = 0, omp_get_num_devices()
call run_it(dev)
end do
call run_it(omp_initial_device)
! print *, 'all done'
contains
subroutine run_it(dev)
integer, value :: dev
! print *, 'DEVICE', dev
call omp_set_default_device(dev)
call test(1)
call test(2)
call test(3)
call test(4)
call test(5)
call test(6)
end
end