https://gcc.gnu.org/g:689fa662e0ff4b879796e12d1c8dd2e9d335acd7
commit r14-12946-g689fa662e0ff4b879796e12d1c8dd2e9d335acd7 Author: Harald Anlauf <[email protected]> Date: Tue Oct 13 22:52:52 2026 +0200 fortran: Fix FINDLOC with DIM and MASK [PR127845] The runtime library templates for FINDLOC did not advance properly through the MASK array argument when MASK and DIM are present. PR fortran/127845 libgfortran/ChangeLog: * generated/findloc1_c10.c (mfindloc1_c10): Regenerate. * generated/findloc1_c16.c (mfindloc1_c16): Likewise. * generated/findloc1_c17.c (mfindloc1_c17): Likewise. * generated/findloc1_c4.c (mfindloc1_c4): Likewise. * generated/findloc1_c8.c (mfindloc1_c8): Likewise. * generated/findloc1_i1.c (mfindloc1_i1): Likewise. * generated/findloc1_i16.c (mfindloc1_i16): Likewise. * generated/findloc1_i2.c (mfindloc1_i2): Likewise. * generated/findloc1_i4.c (mfindloc1_i4): Likewise. * generated/findloc1_i8.c (mfindloc1_i8): Likewise. * generated/findloc1_r10.c (mfindloc1_r10): Likewise. * generated/findloc1_r16.c (mfindloc1_r16): Likewise. * generated/findloc1_r17.c (mfindloc1_r17): Likewise. * generated/findloc1_r4.c (mfindloc1_r4): Likewise. * generated/findloc1_r8.c (mfindloc1_r8): Likewise. * generated/findloc1_s1.c (mfindloc1_s1): Likewise. * generated/findloc1_s4.c (mfindloc1_s4): Likewise. * m4/ifindloc1.m4: Properly advance through MASK array argument when MASK and DIM are present. gcc/testsuite/ChangeLog: * gfortran.dg/findloc_11.f90: New test. (cherry picked from commit 0a3124969d7cf120d26d7044deec17a7f23d169e) Diff: --- gcc/testsuite/gfortran.dg/findloc_11.f90 | 37 ++++++++++++++++++++++++++++++++ libgfortran/generated/findloc1_c10.c | 1 + libgfortran/generated/findloc1_c16.c | 1 + libgfortran/generated/findloc1_c17.c | 1 + libgfortran/generated/findloc1_c4.c | 1 + libgfortran/generated/findloc1_c8.c | 1 + libgfortran/generated/findloc1_i1.c | 1 + libgfortran/generated/findloc1_i16.c | 1 + libgfortran/generated/findloc1_i2.c | 1 + libgfortran/generated/findloc1_i4.c | 1 + libgfortran/generated/findloc1_i8.c | 1 + libgfortran/generated/findloc1_r10.c | 1 + libgfortran/generated/findloc1_r16.c | 1 + libgfortran/generated/findloc1_r17.c | 1 + libgfortran/generated/findloc1_r4.c | 1 + libgfortran/generated/findloc1_r8.c | 1 + libgfortran/generated/findloc1_s1.c | 1 + libgfortran/generated/findloc1_s4.c | 1 + libgfortran/m4/ifindloc1.m4 | 1 + 19 files changed, 55 insertions(+) diff --git a/gcc/testsuite/gfortran.dg/findloc_11.f90 b/gcc/testsuite/gfortran.dg/findloc_11.f90 new file mode 100644 index 000000000000..eaecbb070b7f --- /dev/null +++ b/gcc/testsuite/gfortran.dg/findloc_11.f90 @@ -0,0 +1,37 @@ +! { dg-do run } +! +! PR fortran/127845 - FINDLOC with DIM and MASK +! +! Contributed by Federico Perini. + +program findloc_dim_mask + implicit none + real(8) :: x(2,3,2) + logical :: m(2,3,2) + integer :: i, j, k, l + integer :: r(2,3) + + l = 0 + do k = 1, 2; do j = 1, 3; do i = 1, 2 + x(i,j,k) = real(mod(l*7,5)+1, 8); m(i,j,k) = mod(l,3) /= 1; l = l + 1 + end do; end do; end do + r = findloc(x, 3.0d0, dim=3, mask=m) + + if (any (r /= transpose (reshape ([2, 0, 0, 0, 0, 2], [3,2])))) then + do k = 1, 2 + print '(a,i0,a,i0,a)', 'x(:,:,', k, ') m(:,:,', k, ')' + do i = 1, 2 + print '(3f4.1,6x,3l2)', x(i,:,k), m(i,:,k) + end do + end do + print '(a)', 'findloc(x, 3.0d0, dim=3, mask=m), a 2x3 array, got:' + do i = 1, 2 + print '(4x,3i2)', r(i,:) + end do + print '(a)', ' expected:' + print '(4x,3i2)', 2, 0, 0 + print '(4x,3i2)', 0, 0, 2 + print '(a)', ' (x(2,3,2) = 3.0 and m(2,3,2) = T, so element (2,3) is 2)' + stop 1 + end if +end program findloc_dim_mask diff --git a/libgfortran/generated/findloc1_c10.c b/libgfortran/generated/findloc1_c10.c index 374aeb1aaf6f..e71a76331271 100644 --- a/libgfortran/generated/findloc1_c10.c +++ b/libgfortran/generated/findloc1_c10.c @@ -372,6 +372,7 @@ mfindloc1_c10 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_c16.c b/libgfortran/generated/findloc1_c16.c index e52f3d63f067..62a923778477 100644 --- a/libgfortran/generated/findloc1_c16.c +++ b/libgfortran/generated/findloc1_c16.c @@ -372,6 +372,7 @@ mfindloc1_c16 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_c17.c b/libgfortran/generated/findloc1_c17.c index 6d0977717e75..c8a4eee3ccf8 100644 --- a/libgfortran/generated/findloc1_c17.c +++ b/libgfortran/generated/findloc1_c17.c @@ -372,6 +372,7 @@ mfindloc1_c17 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_c4.c b/libgfortran/generated/findloc1_c4.c index 0ab6edf84a77..7e4e751677e0 100644 --- a/libgfortran/generated/findloc1_c4.c +++ b/libgfortran/generated/findloc1_c4.c @@ -372,6 +372,7 @@ mfindloc1_c4 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_c8.c b/libgfortran/generated/findloc1_c8.c index a345cca4a925..f4545b1331e3 100644 --- a/libgfortran/generated/findloc1_c8.c +++ b/libgfortran/generated/findloc1_c8.c @@ -372,6 +372,7 @@ mfindloc1_c8 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_i1.c b/libgfortran/generated/findloc1_i1.c index cf8da34045d3..d5e8d3f2d58e 100644 --- a/libgfortran/generated/findloc1_i1.c +++ b/libgfortran/generated/findloc1_i1.c @@ -372,6 +372,7 @@ mfindloc1_i1 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_i16.c b/libgfortran/generated/findloc1_i16.c index e30726d04f36..006c8fc93e4b 100644 --- a/libgfortran/generated/findloc1_i16.c +++ b/libgfortran/generated/findloc1_i16.c @@ -372,6 +372,7 @@ mfindloc1_i16 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_i2.c b/libgfortran/generated/findloc1_i2.c index 8c7fa85592c8..3246799d9260 100644 --- a/libgfortran/generated/findloc1_i2.c +++ b/libgfortran/generated/findloc1_i2.c @@ -372,6 +372,7 @@ mfindloc1_i2 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_i4.c b/libgfortran/generated/findloc1_i4.c index 6d103a2ddf46..deb66fddea69 100644 --- a/libgfortran/generated/findloc1_i4.c +++ b/libgfortran/generated/findloc1_i4.c @@ -372,6 +372,7 @@ mfindloc1_i4 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_i8.c b/libgfortran/generated/findloc1_i8.c index 836751fce111..8c87b75cc79d 100644 --- a/libgfortran/generated/findloc1_i8.c +++ b/libgfortran/generated/findloc1_i8.c @@ -372,6 +372,7 @@ mfindloc1_i8 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_r10.c b/libgfortran/generated/findloc1_r10.c index f6d80b32043d..b6de5bc062a3 100644 --- a/libgfortran/generated/findloc1_r10.c +++ b/libgfortran/generated/findloc1_r10.c @@ -372,6 +372,7 @@ mfindloc1_r10 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_r16.c b/libgfortran/generated/findloc1_r16.c index 9a37871ec33f..c309bc24edf6 100644 --- a/libgfortran/generated/findloc1_r16.c +++ b/libgfortran/generated/findloc1_r16.c @@ -372,6 +372,7 @@ mfindloc1_r16 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_r17.c b/libgfortran/generated/findloc1_r17.c index 3bf8b285c95a..f812c5ad3775 100644 --- a/libgfortran/generated/findloc1_r17.c +++ b/libgfortran/generated/findloc1_r17.c @@ -372,6 +372,7 @@ mfindloc1_r17 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_r4.c b/libgfortran/generated/findloc1_r4.c index 1274d15eb991..9b60c927b088 100644 --- a/libgfortran/generated/findloc1_r4.c +++ b/libgfortran/generated/findloc1_r4.c @@ -372,6 +372,7 @@ mfindloc1_r4 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_r8.c b/libgfortran/generated/findloc1_r8.c index 9afed9c01c9a..177d952934f7 100644 --- a/libgfortran/generated/findloc1_r8.c +++ b/libgfortran/generated/findloc1_r8.c @@ -372,6 +372,7 @@ mfindloc1_r8 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * 1; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_s1.c b/libgfortran/generated/findloc1_s1.c index ea5aeda7c0ed..a9b1b71f923d 100644 --- a/libgfortran/generated/findloc1_s1.c +++ b/libgfortran/generated/findloc1_s1.c @@ -374,6 +374,7 @@ mfindloc1_s1 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * len_array; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/generated/findloc1_s4.c b/libgfortran/generated/findloc1_s4.c index 499148dc230b..3c5726432492 100644 --- a/libgfortran/generated/findloc1_s4.c +++ b/libgfortran/generated/findloc1_s4.c @@ -374,6 +374,7 @@ mfindloc1_s4 (gfc_array_index_type * const restrict retarray, { count[n]++; base += sstride[n] * len_array; + mbase += mstride[n]; dest += dstride[n]; } } diff --git a/libgfortran/m4/ifindloc1.m4 b/libgfortran/m4/ifindloc1.m4 index 2f659bf19b2f..2b628c38a95d 100644 --- a/libgfortran/m4/ifindloc1.m4 +++ b/libgfortran/m4/ifindloc1.m4 @@ -354,6 +354,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see { count[n]++; base += sstride[n] * 'base_mult`; + mbase += mstride[n]; dest += dstride[n]; } }
