https://gcc.gnu.org/g:28d20a591ddf1618d75f2b8261ba85bf15a49876

commit r16-5008-g28d20a591ddf1618d75f2b8261ba85bf15a49876
Author: Tobias Burnus <[email protected]>
Date:   Mon Nov 3 18:30:07 2025 +0100

    libgomp.fortran/omp_target_memset.f90 - Avoid implicit mapping by an uninit 
size [PR122543]
    
    In OpenMP, pointers are implicitly mapped - which means for Fortran that
    their pointer target is also mapped. However, for uninitialized memory,
    this means that some random pointee with some random amount of memory is
    copied - in the good case, size == 0, but if not, odd things can happen.
    
    Solution: Use 'fptr => null()' before the target mapping or - as done here -
    declare the pointer inside the region.
    
    libgomp/ChangeLog:
    
            PR libgomp/122543
            * testsuite/libgomp.fortran/omp_target_memset.f90: Move fptr inside
            the target to avoid implicit mapping of its uninit pointee.
            * testsuite/libgomp.fortran/omp_target_memset-2.f90: Likewise.

Diff:
---
 libgomp/testsuite/libgomp.fortran/omp_target_memset-2.f90 | 11 ++++++++---
 libgomp/testsuite/libgomp.fortran/omp_target_memset.f90   |  6 ++++--
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/libgomp/testsuite/libgomp.fortran/omp_target_memset-2.f90 
b/libgomp/testsuite/libgomp.fortran/omp_target_memset-2.f90
index 2641086f60d8..78c66d3bbc9d 100644
--- a/libgomp/testsuite/libgomp.fortran/omp_target_memset-2.f90
+++ b/libgomp/testsuite/libgomp.fortran/omp_target_memset-2.f90
@@ -11,7 +11,6 @@ do dev = omp_initial_device, omp_get_num_devices ()
 block
   integer(c_int) :: i, val, start, tail
   type(c_ptr) :: ptr, ptr2, tmpptr
-  integer(c_int8_t), pointer, contiguous :: fptr(:)
   integer(c_intptr_t) :: intptr
   integer(c_size_t), parameter :: count = 1024
   integer(omp_depend_kind) :: dep(1)
@@ -35,22 +34,28 @@ block
       !$omp taskwait
 
       !$omp target device(dev) is_device_ptr(ptr) depend(depobj: dep(1)) nowait
+      block
+        integer(c_int8_t), pointer, contiguous :: fptr(:)
+        call c_f_pointer (ptr, fptr, [count])
         do i = 1 + start, int(count, c_int) - start - tail
-          call c_f_pointer (ptr, fptr, [count])
           if (fptr(i) /= int (val, c_int8_t)) stop 2
           fptr(i) = fptr(i) + 2_c_int8_t
         end do
+      end block
       !$omp end target
 
       ptr2 = omp_target_memset_async (tmpptr, val + 3, &
                                       count - start - tail, dev, 1, dep)
 
       !$omp target device(dev) is_device_ptr(ptr) depend(depobj: dep(1)) nowait
+      block
+        integer(c_int8_t), pointer, contiguous :: fptr(:)
+        call c_f_pointer (ptr, fptr, [count])
         do i = 1 + start, int(count, c_int) - start - tail
-          call c_f_pointer (ptr, fptr, [count])
           if (fptr(i) /= int (val + 3, c_int8_t)) stop 3
           fptr(i) = fptr(i) - 1_c_int8_t
         end do
+      end block
       !$omp end target
 
       ptr2 = omp_target_memset_async (tmpptr, val - 3, &
diff --git a/libgomp/testsuite/libgomp.fortran/omp_target_memset.f90 
b/libgomp/testsuite/libgomp.fortran/omp_target_memset.f90
index 1ee184ac47c1..91a6baa7e5cd 100644
--- a/libgomp/testsuite/libgomp.fortran/omp_target_memset.f90
+++ b/libgomp/testsuite/libgomp.fortran/omp_target_memset.f90
@@ -6,7 +6,6 @@ implicit none (type, external)
 
 integer(c_int) :: dev, i, val, start, tail
 type(c_ptr) :: ptr, ptr2, tmpptr
-integer(c_int8_t), pointer, contiguous :: fptr(:)
 integer(c_intptr_t) :: intptr
 integer(c_size_t), parameter :: count = 1024
 
@@ -26,10 +25,13 @@ do dev = omp_initial_device, omp_get_num_devices ()
       if (.not. c_associated (tmpptr, ptr2)) stop 1
 
       !$omp target device(dev) is_device_ptr(ptr)
+      block
+        integer(c_int8_t), pointer, contiguous :: fptr(:)
+        call c_f_pointer (ptr, fptr, [count])
         do i = 1 + start, int(count, c_int) - start - tail
-          call c_f_pointer (ptr, fptr, [count])
           if (fptr(i) /= int (val, c_int8_t)) stop 2
         end do
+      end block
       !$omp end target
     end do
   end do

Reply via email to