! PR fortran/104949 module m use omp_lib implicit none (type, external) contains subroutine one integer, allocatable :: x(:) integer :: i do i = 1, omp_get_num_devices() + 1 !$omp target firstprivate(x) if (allocated(x)) error stop !$omp end target if (allocated(x)) error stop end do do i = 1, omp_get_num_devices() + 1 !$omp target firstprivate(x, i) if (allocated(x)) error stop x = [10,20,30,40] + i if (any (x /= [10,20,30,40] + i)) error stop ! This leaks memory! ! deallocate(x) !$omp end target if (allocated(x)) error stop end do x = [1,2,3,4] do i = 1, omp_get_num_devices() + 1 !$omp target firstprivate(x, i) if (i <= 0) error stop if (.not.allocated(x)) error stop if (size(x) /= 4) error stop if (lbound(x,1) /= 1) error stop if (any (x /= [1,2,3,4])) error stop ! no reallocation, just malloced + assignment x = [10,20,30,40] + i if (any (x /= [10,20,30,40] + i)) error stop ! This leaks memory! ! deallocate(x) !$omp end target if (.not.allocated(x)) error stop if (size(x) /= 4) error stop if (lbound(x,1) /= 1) error stop if (any (x /= [1,2,3,4])) error stop end do deallocate(x) end subroutine two character(len=:), allocatable :: x(:) character(len=5) :: str integer :: i str = "abcde" ! work around for PR fortran/91544 do i = 1, omp_get_num_devices() + 1 !$omp target firstprivate(x) if (allocated(x)) error stop !$omp end target if (allocated(x)) error stop end do do i = 1, omp_get_num_devices() + 1 !$omp target firstprivate(x, i) if (allocated(x)) error stop ! no reallocation, just malloced + assignment x = [character(len=2+i) :: str,"fhji","klmno"] if (len(x) /= 2+i) error stop if (any (x /= [character(len=2+i) :: str,"fhji","klmno"])) error stop ! This leaks memory! ! deallocate(x) !$omp end target if (allocated(x)) error stop end do x = [character(len=4) :: "ABCDE","FHJI","KLMNO"] do i = 1, omp_get_num_devices() + 1 !$omp target firstprivate(x, i) if (i <= 0) error stop if (.not.allocated(x)) error stop if (size(x) /= 3) error stop if (lbound(x,1) /= 1) error stop if (len(x) /= 4) error stop if (any (x /= [character(len=4) :: "ABCDE","FHJI","KLMNO"])) error stop !! Reallocation runs into the issue PR fortran/105538 !! !!x = [character(len=2+i) :: str,"fhji","klmno"] !!if (len(x) /= 2+i) error stop !!if (any (x /= [character(len=2+i) :: str,"fhji","klmno"])) error stop !! This leaks memory! !! deallocate(x) ! Just assign: x = [character(len=4) :: "abcde","fhji","klmno"] if (any (x /= [character(len=4) :: "abcde","fhji","klmno"])) error stop !$omp end target if (.not.allocated(x)) error stop if (lbound(x,1) /= 1) error stop if (size(x) /= 3) error stop if (len(x) /= 4) error stop if (any (x /= [character(len=4) :: "ABCDE","FHJI","KLMNO"])) error stop end do deallocate(x) end end module m use m call one call two end