! { dg-additional-options "-fdump-tree-gimple" } ! ! { dg-additional-sources my-usleep.c } ! { dg-prune-output "command-line option '-fintrinsic-modules-path=.*' is valid for Fortran but not for C" } ! ! Ensure that 'depend(...: var)' and 'depobj(...) depend(...: var)' ! depend on the same variable when 'var' is a pointer ! program main use omp_lib use iso_c_binding implicit none (external, type) interface subroutine usleep(t) bind(C, name="my_usleep") use iso_c_binding integer(c_int), value :: t end subroutine end interface integer :: bbb integer, target :: c integer(omp_depend_kind) :: obj(2) integer, pointer :: ppp integer :: x1, x2, x3 c = 42 ppp => c if (.not. associated (ppp)) & stop 0; x1 = 43 x2 = 44 x3 = 45 !$omp depobj(obj(1)) depend(inout: ppp) !$omp depobj(obj(2)) depend(in: bbb) !$omp parallel num_threads(5) !$omp single !$omp task depend (out: ppp) write (*,*) "task 1 (start)" call usleep(40) if (x1 /= 43) stop 11 if (x2 /= 44) stop 12 x1 = 11 write (*,*) "task 1 (end)" !$omp end task !$omp task depend(inout: ppp) write (*,*) "task 2 (start)" call usleep(30) if (x1 /= 11) stop 21 if (x2 /= 44) stop 22 x1 = 111 x2 = 222 write (*,*) "task 2 (end)" !$omp end task !$omp task depend(out: bbb) write (*,*) "task 3 (start)" call usleep(40) if (x3 /= 45) stop 3 x3 = 33 write (*,*) "task 3 (end)" !$omp end task !$omp task depend(depobj: obj(1), obj(2)) write (*,*) "task 4 (start)" if (x1 /= 111) stop 41 if (x2 /= 222) stop 42 if (x3 /= 33) stop 43 call usleep(10) x1 = 411 x2 = 422 x3 = 433 write (*,*) "task 4 (end)" !$omp end task !$omp task depend(in: ppp) if (x1 /= 411) stop 51 if (x2 /= 422) stop 52 if (x3 /= 433) stop 53 write (*,*) "task 5" !$omp end task !$omp end single !$omp end parallel ! expectation (task dependencies): ! 1 - 2 \ ! 4 - 5 ! 3 ----/ end program main ! Ensure that the pointer target address for ppp is taken ! but the address of bbb itself: ! { dg-final { scan-tree-dump-times "#pragma omp task depend\\(out:ppp\\)" 1 "gimple" } } ! { dg-final { scan-tree-dump-times "#pragma omp task depend\\(inout:ppp\\)" 1 "gimple" } } ! { dg-final { scan-tree-dump-times "#pragma omp task depend\\(out:&bbb\\)" 1 "gimple" } } ! { dg-final { scan-tree-dump-times "#pragma omp task depend\\(depobj:&obj\\\[0\\\]\\) depend\\(depobj:&obj\\\[1\\\]\\)" 1 "gimple" } } ! { dg-final { scan-tree-dump-times "#pragma omp task depend\\(in:ppp\\)" 1 "gimple" } } ! { dg-final { scan-tree-dump-times "MEM\\\[\[^\r\n]+\\\] = ppp;" 1 "gimple" } } ! { dg-final { scan-tree-dump-times "MEM\\\[\[^\r\n]+\\\] = &bbb;" 1 "gimple" } }