Dear all,

this obvious patch fixes an issue with FINDLOC reported by Federico.
Interestingly it is very similar to the issue with MINLOC/MAXLOC
(pr127846), also reported by Federico.
Very likely a similar copy&paste(?) issue when creating the m4 template.

Regtested on x86_64-pc-linux-gnu.  OK for mainline?

This affects all versions.  Is a backport desired?

Thanks,
Harald

From 9b48c3d524ca0b582869b0f18a004052f82c4933 Mon Sep 17 00:00:00 2001
From: Harald Anlauf <[email protected]>
Date: Tue, 13 Oct 2026 22:52:52 +0200
Subject: [PATCH] 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.
---
 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(+)
 create mode 100644 gcc/testsuite/gfortran.dg/findloc_11.f90

diff --git a/gcc/testsuite/gfortran.dg/findloc_11.f90 b/gcc/testsuite/gfortran.dg/findloc_11.f90
new file mode 100644
index 00000000000..eaecbb070b7
--- /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 d7cc8944b2c..5afcf09827c 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 66b8adaff06..4a8e962d779 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 7c2fe6773a7..94a2a28b260 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 482b3fdb1e2..adf2167e322 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 fbc8d92e7d6..8bc59718b13 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 9f4dae25e32..07c3a2a6587 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 aec991ad036..053b50f5ad7 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 94c85008dce..7a945ff37c9 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 638101f5ece..1a60be9fec1 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 687aee1c0c6..1190721f681 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 f16163458af..f4e24433008 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 973859180ef..4509c0420dd 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 107f04faaad..92a9b7cb903 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 987a9f873c0..56edde2c30c 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 a22039c6208..b9f19458b31 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 6dc8b821184..8f2709d94e8 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 364e9148dd7..ce8b720ac01 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 30ab5e7ad58..29962f081b8 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];
 	    }
 	}
-- 
2.51.0

Reply via email to