| ! PR fortran/67311 |
| |
| implicit none |
| TYPE myType |
| integer :: A |
| TYPE(myType), DIMENSION(:), POINTER :: x |
| TYPE(myType), DIMENSION(:), contiguous, POINTER :: y |
| integer :: B |
| END TYPE myType |
| call openmp_sub |
| contains |
| subroutine openmp_sub |
| type(myType) :: argument |
| |
| !$OMP PARALLEL DEFAULT(NONE) PRIVATE(argument) |
| argument%a = 5 |
| argument%b = 7 |
| call foo(argument) |
| if (.not.associated(argument%x) .or. size(argument%x) /= 2) stop 2 |
| if (argument%a /= 8 .or. argument%b /= 9 & |
| .or. any(argument%x(:)%a /= [2, 3]) & |
| .or. any(argument%x(:)%b /= [9, 1])) stop 3 |
| if (.not.associated(argument%y) .or. size(argument%y) /= 3) stop 4 |
| if (any(argument%y(:)%a /= [11, 22, 33]) & |
| .or. any(argument%y(:)%b /= [44, 55, 66])) stop 5 |
| deallocate (argument%x, argument%y) |
| !$OMP END PARALLEL |
| end subroutine openmp_sub |
| subroutine foo(x) |
| type(myType), intent(inout) :: x |
| !$omp declare target |
| if (x%a /= 5 .or. x%b /= 7) stop 1 |
| x%a = 8; x%b = 9 |
| allocate (x%x(2)) |
| x%x(:)%a = [2, 3] |
| x%x(:)%b = [9, 1] |
| allocate (x%y(3)) |
| x%y(:)%a = [11, 22, 33] |
| x%y(:)%b = [44, 55, 66] |
| end subroutine |
| end |