! { dg-do run } program main use openacc use iso_c_binding implicit none integer, target :: a_3d_i(10, 10, 10) complex a_3d_c(10, 10, 10) real a_3d_r(10, 10, 10) integer i, j, k complex c real r integer, parameter :: i_size = sizeof (i) integer, parameter :: c_size = sizeof (c) integer, parameter :: r_size = sizeof (r) if (acc_get_num_devices (acc_device_nvidia) .eq. 0) call exit call acc_init (acc_device_nvidia) call set3d (.FALSE., a_3d_i, a_3d_c, a_3d_r) call acc_copyin (a_3d_i) call acc_copyin (a_3d_c) call acc_copyin (a_3d_r) if (acc_is_present (a_3d_i) .neqv. .TRUE.) call abort if (acc_is_present (a_3d_c) .neqv. .TRUE.) call abort if (acc_is_present (a_3d_r) .neqv. .TRUE.) call abort do i = 1, 10 do j = 1, 10 do k = 1, 10 if (acc_is_present (a_3d_i(i, j, k), i_size) .neqv. .TRUE.) call abort if (acc_is_present (a_3d_c(i, j, k), i_size) .neqv. .TRUE.) call abort if (acc_is_present (a_3d_r(i, j, k), i_size) .neqv. .TRUE.) call abort end do end do end do call acc_shutdown (acc_device_nvidia) contains subroutine set3d (clear, a_i, a_c, a_r) logical clear integer, dimension (:,:,:), intent (inout) :: a_i complex, dimension (:,:,:), intent (inout) :: a_c real, dimension (:,:,:), intent (inout) :: a_r integer i, j, k integer lb1, ub1, lb2, ub2, lb3, ub3 lb1 = lbound (a_i, 1) ub1 = ubound (a_i, 1) lb2 = lbound (a_i, 2) ub2 = ubound (a_i, 2) lb3 = lbound (a_i, 3) ub3 = ubound (a_i, 3) do i = lb1, ub1 do j = lb2, ub2 do k = lb3, ub3 if (clear) then a_i(i, j, k) = 0 a_c(i, j, k) = cmplx (0.0, 0.0) a_r(i, j, k) = 0.0 else a_i(i, j, k) = i a_c(i, j, k) = cmplx (i, j) a_r(i, j, k) = i end if end do end do end do end subroutine end program