module m implicit none character(len=:), allocatable :: strA(:), strA2 character(len=:), pointer :: strP(:), strP2 !$omp declare target enter(strA,strA2,strP,strP2) contains subroutine opt_map(str1, str2, str3) character(len=:), allocatable :: str1, str2, str3, str4 optional :: str2, str3 if (.not.present(str2)) error stop if (present(str3)) error stop !$omp target map(str1,str2,str3,str4) if (allocated(str1)) error stop if (allocated(str2)) error stop if (present(str3)) error stop if (allocated(str4)) error stop !$omp end target end subroutine call_opt() character(len=:), allocatable :: str1, str2 call opt_map(str1, str2) end subroutine test !$omp declare target if (.not. allocated(strA)) error stop !if (.not. allocated(strA2)) error stop if (.not. associated(strP)) error stop !if (.not. associated(strP2)) error stop ! ensure length was updated as well if (len(strA) /= 3) error stop if (len(strA2) /= 5) error stop if (len(strP) /= 4) error stop if (len(strP2) /= 8) error stop ! if (any (strA /= ['Hav', 'e f', 'un!'])) error stop ! if (strA2 /= 'Hello') error stop ! if (any (strP /= ['abcd', 'efgh', 'ijkl'])) error stop ! if (strP2 /= 'TestCase') error stop ! ! strA = ['123', '456', '789'] ! strA2 = 'World' ! strP = ['ABCD', 'EFGH', 'IJKL'] ! strP2 = 'Passed!!' end end program main use m implicit none call call_opt strA = ['Hav', 'e f', 'un!'] strA2 = 'Hello' allocate(character(len=4) :: strP(3)) strP = ['abcd', 'efgh', 'ijkl'] allocate(character(len=8) :: strP2) strP2 = 'TestCase' !$omp target enter data map(always, to: strA, strA2) !$omp target enter data map(to: strP, strP2) !$omp target call test() !$omp end target !$omp target exit data map(always, from: strA, strA2, strP, strP2) if (len(strA) /= 3) error stop if (len(strA2) /= 5) error stop if (len(strP) /= 4) error stop if (len(strP2) /= 8) error stop ! if (any (strA /= ['123', '456', '789'])) error stop ! if (strA2 /= 'World') error stop ! if (any(strP /= ['ABCD', 'EFGH', 'IJKL'])) error stop ! if (strP2 /= 'Passed!!') error stop ! deallocate(strP, strP2, strA, strA2) end