! { dg-do run } ! { dg-xfail-run-if "PR92790 - acc declare device_resident - Fortran common blocks not handled" { *-*-* } { "*" } { "-DACC_DEVICE_TYPE_host=1" } } module vars implicit none real b !$acc declare device_resident (b) integer :: x, y, z common /block/ x, y, z !$acc declare device_resident (/block/) end module vars subroutine set() use openacc implicit none integer :: a(5), b(1), c, vals(7) common /another/ a, b, c !$acc declare device_resident (/another/) if (.not. acc_is_present (a)) stop 10 if (.not. acc_is_present (b)) stop 11 if (.not. acc_is_present (c)) stop 12 vals = 99 ! NOTE: The current (Nov 2019) implementation requires the 'present' ! as it tries to otherwises map the device_resident variables; ! following OpenMP 4.0 semantic: 'a' + 'b' are 'copy' (map fromto) and ! 'c' is firstprivate. !$acc parallel copyout(vals) present(a, b, c) a = [11,12,13,14,15] b = 16 c = 47 vals(1:5) = a vals(6:6) = b vals(7) = c !$acc end parallel if (.not. acc_is_present (a)) stop 13 if (.not. acc_is_present (b)) stop 14 if (.not. acc_is_present (c)) stop 15 if (any (vals /= [11,12,13,14,15,16,47])) stop 16 end subroutine set subroutine check() use openacc implicit none integer :: g, h(3), i(3) common /another/ g, h, i integer :: val(7) !$acc declare device_resident (/another/) if (.not. acc_is_present (g)) stop 20 if (.not. acc_is_present (h)) stop 21 if (.not. acc_is_present (i)) stop 22 val = 99 !$acc parallel copyout(val) present(g, h, i) val(5:7) = i val(1) = g val(2:4) = h !$acc end parallel if (.not. acc_is_present (g)) stop 23 if (.not. acc_is_present (h)) stop 24 if (.not. acc_is_present (i)) stop 25 !print *, val if (any (val /= [11,12,13,14,15,16,47])) stop 26 end subroutine check program test use vars use openacc implicit none real a integer :: k call set() call check() if (.not. acc_is_present (b)) stop 1 if (.not. acc_is_present (x)) stop 2 if (.not. acc_is_present (y)) stop 3 if (.not. acc_is_present (z)) stop 4 a = 2.0 k = 42 !$acc parallel copy (a, k) b = a a = 1.0 a = a + b x = k y = 7*k - 2*x z = 3*y k = k - z + y !$acc end parallel if (.not. acc_is_present (b)) stop 5 if (.not. acc_is_present (x)) stop 6 if (.not. acc_is_present (y)) stop 7 if (.not. acc_is_present (z)) stop 8 if (a /= 3.0) stop 30 if (k /= -378) stop 31 end program test