type = TREE_TYPE (ovar);
if (lang_hooks.decls.omp_array_data (ovar, true))
- var = lang_hooks.decls.omp_array_data (ovar, false);
+ var = lang_hooks.decls.omp_array_data (var, false);
else if (((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_ADDR
|| OMP_CLAUSE_CODE (c) == OMP_CLAUSE_HAS_DEVICE_ADDR)
&& !omp_privatize_by_reference (ovar)
--- /dev/null
+! { dg-do run }
+!
+! Test user_device_ptr nested within another parallel
+! construct
+!
+program test_nested_use_device_ptr
+ use iso_c_binding, only: c_loc, c_ptr
+ implicit none
+ real, allocatable, target :: arr(:,:)
+ integer :: width = 1024, height = 1024, i
+ type(c_ptr) :: devptr
+
+ allocate(arr(width,height))
+
+ !$omp target enter data map(alloc: arr)
+
+ !$omp target data use_device_ptr(arr)
+ devptr = c_loc(arr(1,1))
+ !$omp end target data
+
+ !$omp parallel default(none) shared(arr, devptr)
+ !$omp single
+
+ !$omp target data use_device_ptr(arr)
+ call thing(c_loc(arr), devptr)
+ !$omp end target data
+
+ !$omp end single
+ !$omp end parallel
+ !$omp target exit data map(delete: arr)
+
+contains
+
+ subroutine thing(myarr, devptr)
+ use iso_c_binding, only: c_ptr, c_associated
+ implicit none
+ type(c_ptr) :: myarr, devptr
+ if (.not.c_associated(myarr, devptr)) stop 1
+ end subroutine thing
+
+end program