aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2009-07-24 09:57:13 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2009-07-24 09:57:13 +0200
commit80927a562e1ec4a38a12f4b09b86f2f3ca9f253e (patch)
tree3a1ba521bd64c06116c292171eb8e9008c0f6c2b /gcc/testsuite
parent3a802a9e6ddcf43f9c211b417f8435e3b63ce3cc (diff)
downloadgcc-80927a562e1ec4a38a12f4b09b86f2f3ca9f253e.zip
gcc-80927a562e1ec4a38a12f4b09b86f2f3ca9f253e.tar.gz
gcc-80927a562e1ec4a38a12f4b09b86f2f3ca9f253e.tar.bz2
re PR fortran/40643 (maxloc/minloc: Wrong result for NaN at position 1)
PR fortran/40643 PR fortran/31067 * trans-intrinsic.c (gfc_conv_intrinsic_minmaxloc, gfc_conv_intrinsic_minmaxval): Handle Infinities and NaNs properly, optimize. * trans-array.c (gfc_trans_scalarized_loop_end): No longer static. * trans-array.h (gfc_trans_scalarized_loop_end): New prototype. * libgfortran.h (GFC_REAL_4_INFINITY, GFC_REAL_8_INFINITY, GFC_REAL_10_INFINITY, GFC_REAL_16_INFINITY, GFC_REAL_4_QUIET_NAN, GFC_REAL_8_QUIET_NAN, GFC_REAL_10_QUIET_NAN, GFC_REAL_16_QUIET_NAN): Define. * m4/iparm.m4 (atype_inf, atype_nan): Define. * m4/ifunction.m4: Formatting. * m4/iforeach.m4: Likewise. (START_FOREACH_FUNCTION): Initialize dest to all 1s, not all 0s. (START_FOREACH_BLOCK, FINISH_FOREACH_FUNCTION, FINISH_MASKED_FOREACH_FUNCTION): Run foreach block inside a loop until count[0] == extent[0]. * m4/minval.m4: Formatting. Handle NaNs and infinities. Optimize. * m4/maxval.m4: Likewise. * m4/minloc0.m4: Likewise. * m4/maxloc0.m4: Likewise. * m4/minloc1.m4: Likewise. * m4/maxloc1.m4: Likewise. * generated/maxloc0_16_i16.c: Regenerated. * generated/maxloc0_16_i1.c: Likewise. * generated/maxloc0_16_i2.c: Likewise. * generated/maxloc0_16_i4.c: Likewise. * generated/maxloc0_16_i8.c: Likewise. * generated/maxloc0_16_r10.c: Likewise. * generated/maxloc0_16_r16.c: Likewise. * generated/maxloc0_16_r4.c: Likewise. * generated/maxloc0_16_r8.c: Likewise. * generated/maxloc0_4_i16.c: Likewise. * generated/maxloc0_4_i1.c: Likewise. * generated/maxloc0_4_i2.c: Likewise. * generated/maxloc0_4_i4.c: Likewise. * generated/maxloc0_4_i8.c: Likewise. * generated/maxloc0_4_r10.c: Likewise. * generated/maxloc0_4_r16.c: Likewise. * generated/maxloc0_4_r4.c: Likewise. * generated/maxloc0_4_r8.c: Likewise. * generated/maxloc0_8_i16.c: Likewise. * generated/maxloc0_8_i1.c: Likewise. * generated/maxloc0_8_i2.c: Likewise. * generated/maxloc0_8_i4.c: Likewise. * generated/maxloc0_8_i8.c: Likewise. * generated/maxloc0_8_r10.c: Likewise. * generated/maxloc0_8_r16.c: Likewise. * generated/maxloc0_8_r4.c: Likewise. * generated/maxloc0_8_r8.c: Likewise. * generated/maxloc1_16_i16.c: Likewise. * generated/maxloc1_16_i1.c: Likewise. * generated/maxloc1_16_i2.c: Likewise. * generated/maxloc1_16_i4.c: Likewise. * generated/maxloc1_16_i8.c: Likewise. * generated/maxloc1_16_r10.c: Likewise. * generated/maxloc1_16_r16.c: Likewise. * generated/maxloc1_16_r4.c: Likewise. * generated/maxloc1_16_r8.c: Likewise. * generated/maxloc1_4_i16.c: Likewise. * generated/maxloc1_4_i1.c: Likewise. * generated/maxloc1_4_i2.c: Likewise. * generated/maxloc1_4_i4.c: Likewise. * generated/maxloc1_4_i8.c: Likewise. * generated/maxloc1_4_r10.c: Likewise. * generated/maxloc1_4_r16.c: Likewise. * generated/maxloc1_4_r4.c: Likewise. * generated/maxloc1_4_r8.c: Likewise. * generated/maxloc1_8_i16.c: Likewise. * generated/maxloc1_8_i1.c: Likewise. * generated/maxloc1_8_i2.c: Likewise. * generated/maxloc1_8_i4.c: Likewise. * generated/maxloc1_8_i8.c: Likewise. * generated/maxloc1_8_r10.c: Likewise. * generated/maxloc1_8_r16.c: Likewise. * generated/maxloc1_8_r4.c: Likewise. * generated/maxloc1_8_r8.c: Likewise. * generated/maxval_i16.c: Likewise. * generated/maxval_i1.c: Likewise. * generated/maxval_i2.c: Likewise. * generated/maxval_i4.c: Likewise. * generated/maxval_i8.c: Likewise. * generated/maxval_r10.c: Likewise. * generated/maxval_r16.c: Likewise. * generated/maxval_r4.c: Likewise. * generated/maxval_r8.c: Likewise. * generated/minloc0_16_i16.c: Likewise. * generated/minloc0_16_i1.c: Likewise. * generated/minloc0_16_i2.c: Likewise. * generated/minloc0_16_i4.c: Likewise. * generated/minloc0_16_i8.c: Likewise. * generated/minloc0_16_r10.c: Likewise. * generated/minloc0_16_r16.c: Likewise. * generated/minloc0_16_r4.c: Likewise. * generated/minloc0_16_r8.c: Likewise. * generated/minloc0_4_i16.c: Likewise. * generated/minloc0_4_i1.c: Likewise. * generated/minloc0_4_i2.c: Likewise. * generated/minloc0_4_i4.c: Likewise. * generated/minloc0_4_i8.c: Likewise. * generated/minloc0_4_r10.c: Likewise. * generated/minloc0_4_r16.c: Likewise. * generated/minloc0_4_r4.c: Likewise. * generated/minloc0_4_r8.c: Likewise. * generated/minloc0_8_i16.c: Likewise. * generated/minloc0_8_i1.c: Likewise. * generated/minloc0_8_i2.c: Likewise. * generated/minloc0_8_i4.c: Likewise. * generated/minloc0_8_i8.c: Likewise. * generated/minloc0_8_r10.c: Likewise. * generated/minloc0_8_r16.c: Likewise. * generated/minloc0_8_r4.c: Likewise. * generated/minloc0_8_r8.c: Likewise. * generated/minloc1_16_i16.c: Likewise. * generated/minloc1_16_i1.c: Likewise. * generated/minloc1_16_i2.c: Likewise. * generated/minloc1_16_i4.c: Likewise. * generated/minloc1_16_i8.c: Likewise. * generated/minloc1_16_r10.c: Likewise. * generated/minloc1_16_r16.c: Likewise. * generated/minloc1_16_r4.c: Likewise. * generated/minloc1_16_r8.c: Likewise. * generated/minloc1_4_i16.c: Likewise. * generated/minloc1_4_i1.c: Likewise. * generated/minloc1_4_i2.c: Likewise. * generated/minloc1_4_i4.c: Likewise. * generated/minloc1_4_i8.c: Likewise. * generated/minloc1_4_r10.c: Likewise. * generated/minloc1_4_r16.c: Likewise. * generated/minloc1_4_r4.c: Likewise. * generated/minloc1_4_r8.c: Likewise. * generated/minloc1_8_i16.c: Likewise. * generated/minloc1_8_i1.c: Likewise. * generated/minloc1_8_i2.c: Likewise. * generated/minloc1_8_i4.c: Likewise. * generated/minloc1_8_i8.c: Likewise. * generated/minloc1_8_r10.c: Likewise. * generated/minloc1_8_r16.c: Likewise. * generated/minloc1_8_r4.c: Likewise. * generated/minloc1_8_r8.c: Likewise. * generated/minval_i16.c: Likewise. * generated/minval_i1.c: Likewise. * generated/minval_i2.c: Likewise. * generated/minval_i4.c: Likewise. * generated/minval_i8.c: Likewise. * generated/minval_r10.c: Likewise. * generated/minval_r16.c: Likewise. * generated/minval_r4.c: Likewise. * generated/minval_r8.c: Likewise. * generated/product_c10.c: Likewise. * generated/product_c16.c: Likewise. * generated/product_c4.c: Likewise. * generated/product_c8.c: Likewise. * generated/product_i16.c: Likewise. * generated/product_i1.c: Likewise. * generated/product_i2.c: Likewise. * generated/product_i4.c: Likewise. * generated/product_i8.c: Likewise. * generated/product_r10.c: Likewise. * generated/product_r16.c: Likewise. * generated/product_r4.c: Likewise. * generated/product_r8.c: Likewise. * generated/sum_c10.c: Likewise. * generated/sum_c16.c: Likewise. * generated/sum_c4.c: Likewise. * generated/sum_c8.c: Likewise. * generated/sum_i16.c: Likewise. * generated/sum_i1.c: Likewise. * generated/sum_i2.c: Likewise. * generated/sum_i4.c: Likewise. * generated/sum_i8.c: Likewise. * generated/sum_r10.c: Likewise. * generated/sum_r16.c: Likewise. * generated/sum_r4.c: Likewise. * generated/sum_r8.c: Likewise. * gfortran.dg/maxlocval_2.f90: New test. * gfortran.dg/maxlocval_3.f90: New test. * gfortran.dg/maxlocval_4.f90: New test. * gfortran.dg/minlocval_1.f90: New test. * gfortran.dg/minlocval_2.f90: New test. * gfortran.dg/minlocval_3.f90: New test. * gfortran.dg/minlocval_4.f90: New test. From-SVN: r150041
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog12
-rw-r--r--gcc/testsuite/gfortran.dg/maxlocval_2.f90153
-rw-r--r--gcc/testsuite/gfortran.dg/maxlocval_3.f90122
-rw-r--r--gcc/testsuite/gfortran.dg/maxlocval_4.f90118
-rw-r--r--gcc/testsuite/gfortran.dg/minlocval_1.f90153
-rw-r--r--gcc/testsuite/gfortran.dg/minlocval_2.f90122
-rw-r--r--gcc/testsuite/gfortran.dg/minlocval_3.f90284
-rw-r--r--gcc/testsuite/gfortran.dg/minlocval_4.f90118
8 files changed, 1082 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a2ca909..671f681 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,15 @@
+2009-07-24 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/40643
+ PR fortran/31067
+ * gfortran.dg/maxlocval_2.f90: New test.
+ * gfortran.dg/maxlocval_3.f90: New test.
+ * gfortran.dg/maxlocval_4.f90: New test.
+ * gfortran.dg/minlocval_1.f90: New test.
+ * gfortran.dg/minlocval_2.f90: New test.
+ * gfortran.dg/minlocval_3.f90: New test.
+ * gfortran.dg/minlocval_4.f90: New test.
+
2009-07-23 Joseph Myers <joseph@codesourcery.com>
* gcc.dg/dll-4.c: Allow foo1 and foo2 in either order in
diff --git a/gcc/testsuite/gfortran.dg/maxlocval_2.f90 b/gcc/testsuite/gfortran.dg/maxlocval_2.f90
new file mode 100644
index 0000000..82f917a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/maxlocval_2.f90
@@ -0,0 +1,153 @@
+! { dg-do run }
+ real :: a(3), nan, minf, pinf
+ real, allocatable :: c(:)
+ logical :: l
+ logical :: l2(3)
+
+ nan = 0.0
+ minf = 0.0
+ pinf = 0.0
+ nan = 0.0/nan
+ minf = -1.0/minf
+ pinf = 1.0/pinf
+
+ allocate (c(3))
+ a(:) = nan
+ if (maxloc (a, dim = 1).ne.1) call abort
+ if (.not.isnan(maxval (a, dim = 1))) call abort
+ a(:) = minf
+ if (maxloc (a, dim = 1).ne.1) call abort
+ if (maxval (a, dim = 1).ne.minf) call abort
+ a(1:2) = nan
+ if (maxloc (a, dim = 1).ne.3) call abort
+ if (maxval (a, dim = 1).ne.minf) call abort
+ a(2) = 1.0
+ if (maxloc (a, dim = 1).ne.2) call abort
+ if (maxval (a, dim = 1).ne.1) call abort
+ a(2) = pinf
+ if (maxloc (a, dim = 1).ne.2) call abort
+ if (maxval (a, dim = 1).ne.pinf) call abort
+ c(:) = nan
+ if (maxloc (c, dim = 1).ne.1) call abort
+ if (.not.isnan(maxval (c, dim = 1))) call abort
+ c(:) = minf
+ if (maxloc (c, dim = 1).ne.1) call abort
+ if (maxval (c, dim = 1).ne.minf) call abort
+ c(1:2) = nan
+ if (maxloc (c, dim = 1).ne.3) call abort
+ if (maxval (c, dim = 1).ne.minf) call abort
+ c(2) = 1.0
+ if (maxloc (c, dim = 1).ne.2) call abort
+ if (maxval (c, dim = 1).ne.1) call abort
+ c(2) = pinf
+ if (maxloc (c, dim = 1).ne.2) call abort
+ if (maxval (c, dim = 1).ne.pinf) call abort
+ l = .false.
+ l2(:) = .false.
+ a(:) = nan
+ if (maxloc (a, dim = 1, mask = l).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l).ne.-huge(minf)) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.-huge(minf)) call abort
+ a(:) = minf
+ if (maxloc (a, dim = 1, mask = l).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l).ne.-huge(minf)) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.-huge(minf)) call abort
+ a(1:2) = nan
+ if (maxloc (a, dim = 1, mask = l).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l).ne.-huge(minf)) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.-huge(minf)) call abort
+ a(2) = 1.0
+ if (maxloc (a, dim = 1, mask = l).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l).ne.-huge(minf)) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.-huge(minf)) call abort
+ a(2) = pinf
+ if (maxloc (a, dim = 1, mask = l).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l).ne.-huge(minf)) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.-huge(minf)) call abort
+ c(:) = nan
+ if (maxloc (c, dim = 1, mask = l).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l).ne.-huge(minf)) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.-huge(minf)) call abort
+ c(:) = minf
+ if (maxloc (c, dim = 1, mask = l).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l).ne.-huge(minf)) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.-huge(minf)) call abort
+ c(1:2) = nan
+ if (maxloc (c, dim = 1, mask = l).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l).ne.-huge(minf)) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.-huge(minf)) call abort
+ c(2) = 1.0
+ if (maxloc (c, dim = 1, mask = l).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l).ne.-huge(minf)) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.-huge(minf)) call abort
+ c(2) = pinf
+ if (maxloc (c, dim = 1, mask = l).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l).ne.-huge(minf)) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.-huge(minf)) call abort
+ l = .true.
+ l2(:) = .true.
+ a(:) = nan
+ if (maxloc (a, dim = 1, mask = l).ne.1) call abort
+ if (.not.isnan(maxval (a, dim = 1, mask = l))) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.1) call abort
+ if (.not.isnan(maxval (a, dim = 1, mask = l2))) call abort
+ a(:) = minf
+ if (maxloc (a, dim = 1, mask = l).ne.1) call abort
+ if (maxval (a, dim = 1, mask = l).ne.minf) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.1) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.minf) call abort
+ a(1:2) = nan
+ if (maxloc (a, dim = 1, mask = l).ne.3) call abort
+ if (maxval (a, dim = 1, mask = l).ne.minf) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.3) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.minf) call abort
+ a(2) = 1.0
+ if (maxloc (a, dim = 1, mask = l).ne.2) call abort
+ if (maxval (a, dim = 1, mask = l).ne.1) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.2) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.1) call abort
+ a(2) = pinf
+ if (maxloc (a, dim = 1, mask = l).ne.2) call abort
+ if (maxval (a, dim = 1, mask = l).ne.pinf) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.2) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.pinf) call abort
+ c(:) = nan
+ if (maxloc (c, dim = 1, mask = l).ne.1) call abort
+ if (.not.isnan(maxval (c, dim = 1, mask = l))) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.1) call abort
+ if (.not.isnan(maxval (c, dim = 1, mask = l2))) call abort
+ c(:) = minf
+ if (maxloc (c, dim = 1, mask = l).ne.1) call abort
+ if (maxval (c, dim = 1, mask = l).ne.minf) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.1) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.minf) call abort
+ c(1:2) = nan
+ if (maxloc (c, dim = 1, mask = l).ne.3) call abort
+ if (maxval (c, dim = 1, mask = l).ne.minf) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.3) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.minf) call abort
+ c(2) = 1.0
+ if (maxloc (c, dim = 1, mask = l).ne.2) call abort
+ if (maxval (c, dim = 1, mask = l).ne.1) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.2) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.1) call abort
+ c(2) = pinf
+ if (maxloc (c, dim = 1, mask = l).ne.2) call abort
+ if (maxval (c, dim = 1, mask = l).ne.pinf) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.2) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.pinf) call abort
+ deallocate (c)
+ allocate (c(-2:-3))
+ if (maxloc (c, dim = 1).ne.0) call abort
+ if (maxval (c, dim = 1).ne.-huge(minf)) call abort
+end
diff --git a/gcc/testsuite/gfortran.dg/maxlocval_3.f90 b/gcc/testsuite/gfortran.dg/maxlocval_3.f90
new file mode 100644
index 0000000..cbd3595
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/maxlocval_3.f90
@@ -0,0 +1,122 @@
+! { dg-do run }
+ integer :: a(3), h
+ integer, allocatable :: c(:)
+ logical :: l
+ logical :: l2(3)
+
+ h = -huge(h)
+ h = h - 1
+ allocate (c(3))
+ a(:) = 5
+ if (maxloc (a, dim = 1).ne.1) call abort
+ if (maxval (a, dim = 1).ne.5) call abort
+ a(2) = huge(h)
+ if (maxloc (a, dim = 1).ne.2) call abort
+ if (maxval (a, dim = 1).ne.huge(h)) call abort
+ a(:) = h
+ if (maxloc (a, dim = 1).ne.1) call abort
+ if (maxval (a, dim = 1).ne.h) call abort
+ a(3) = -huge(h)
+ if (maxloc (a, dim = 1).ne.3) call abort
+ if (maxval (a, dim = 1).ne.-huge(h)) call abort
+ c(:) = 5
+ if (maxloc (c, dim = 1).ne.1) call abort
+ if (maxval (c, dim = 1).ne.5) call abort
+ c(2) = huge(h)
+ if (maxloc (c, dim = 1).ne.2) call abort
+ if (maxval (c, dim = 1).ne.huge(h)) call abort
+ c(:) = h
+ if (maxloc (c, dim = 1).ne.1) call abort
+ if (maxval (c, dim = 1).ne.h) call abort
+ c(3) = -huge(h)
+ if (maxloc (c, dim = 1).ne.3) call abort
+ if (maxval (c, dim = 1).ne.-huge(h)) call abort
+ l = .false.
+ l2(:) = .false.
+ a(:) = 5
+ if (maxloc (a, dim = 1, mask = l).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l).ne.h) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.h) call abort
+ a(2) = huge(h)
+ if (maxloc (a, dim = 1, mask = l).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l).ne.h) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.h) call abort
+ a(:) = h
+ if (maxloc (a, dim = 1, mask = l).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l).ne.h) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.h) call abort
+ a(3) = -huge(h)
+ if (maxloc (a, dim = 1, mask = l).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l).ne.h) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.h) call abort
+ c(:) = 5
+ if (maxloc (c, dim = 1, mask = l).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l).ne.h) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.h) call abort
+ c(2) = huge(h)
+ if (maxloc (c, dim = 1, mask = l).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l).ne.h) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.h) call abort
+ c(:) = h
+ if (maxloc (c, dim = 1, mask = l).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l).ne.h) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.h) call abort
+ c(3) = -huge(h)
+ if (maxloc (c, dim = 1, mask = l).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l).ne.h) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.h) call abort
+ l = .true.
+ l2(:) = .true.
+ a(:) = 5
+ if (maxloc (a, dim = 1, mask = l).ne.1) call abort
+ if (maxval (a, dim = 1, mask = l).ne.5) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.1) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.5) call abort
+ a(2) = huge(h)
+ if (maxloc (a, dim = 1, mask = l).ne.2) call abort
+ if (maxval (a, dim = 1, mask = l).ne.huge(h)) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.2) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.huge(h)) call abort
+ a(:) = h
+ if (maxloc (a, dim = 1, mask = l).ne.1) call abort
+ if (maxval (a, dim = 1, mask = l).ne.h) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.1) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.h) call abort
+ a(3) = -huge(h)
+ if (maxloc (a, dim = 1, mask = l).ne.3) call abort
+ if (maxval (a, dim = 1, mask = l).ne.-huge(h)) call abort
+ if (maxloc (a, dim = 1, mask = l2).ne.3) call abort
+ if (maxval (a, dim = 1, mask = l2).ne.-huge(h)) call abort
+ c(:) = 5
+ if (maxloc (c, dim = 1, mask = l).ne.1) call abort
+ if (maxval (c, dim = 1, mask = l).ne.5) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.1) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.5) call abort
+ c(2) = huge(h)
+ if (maxloc (c, dim = 1, mask = l).ne.2) call abort
+ if (maxval (c, dim = 1, mask = l).ne.huge(h)) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.2) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.huge(h)) call abort
+ c(:) = h
+ if (maxloc (c, dim = 1, mask = l).ne.1) call abort
+ if (maxval (c, dim = 1, mask = l).ne.h) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.1) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.h) call abort
+ c(3) = -huge(h)
+ if (maxloc (c, dim = 1, mask = l).ne.3) call abort
+ if (maxval (c, dim = 1, mask = l).ne.-huge(h)) call abort
+ if (maxloc (c, dim = 1, mask = l2).ne.3) call abort
+ if (maxval (c, dim = 1, mask = l2).ne.-huge(h)) call abort
+ deallocate (c)
+ allocate (c(-2:-3))
+ if (maxloc (c, dim = 1).ne.0) call abort
+ if (maxval (c, dim = 1).ne.h) call abort
+end
diff --git a/gcc/testsuite/gfortran.dg/maxlocval_4.f90 b/gcc/testsuite/gfortran.dg/maxlocval_4.f90
new file mode 100644
index 0000000..408b08d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/maxlocval_4.f90
@@ -0,0 +1,118 @@
+! { dg-do run }
+ real :: a(3,3), b(3), nan, minf, pinf, h
+ logical :: l, l2
+ logical :: l3(3,3), l4(3,3), l5(3,3)
+
+ nan = 0.0
+ minf = 0.0
+ pinf = 0.0
+ nan = 0.0/nan
+ minf = -1.0/minf
+ pinf = 1.0/pinf
+ h = -huge(h)
+ l = .false.
+ l2 = .true.
+ l3 = .false.
+ l4 = .true.
+ l5 = .true.
+ l5(1,1) = .false.
+ l5(1,2) = .false.
+ l5(2,3) = .false.
+ a = reshape ((/ nan, nan, nan, minf, minf, minf, minf, pinf, minf /), (/ 3, 3 /))
+ if (maxval (a).ne.pinf) call abort
+ if (any (maxloc (a).ne.(/ 2, 3 /))) call abort
+ b = maxval (a, dim = 1)
+ if (.not.isnan(b(1))) call abort
+ b(1) = 0.0
+ if (any (b.ne.(/ 0.0, minf, pinf /))) call abort
+ if (any (maxloc (a, dim = 1).ne.(/ 1, 1, 2 /))) call abort
+ b = maxval (a, dim = 2)
+ if (any (b.ne.(/ minf, pinf, minf /))) call abort
+ if (any (maxloc (a, dim = 2).ne.(/ 2, 3, 2 /))) call abort
+ if (maxval (a, mask = l).ne.h) call abort
+ if (any (maxloc (a, mask = l).ne.(/ 0, 0 /))) call abort
+ b = maxval (a, dim = 1, mask = l)
+ if (any (b.ne.(/ h, h, h /))) call abort
+ if (any (maxloc (a, dim = 1, mask = l).ne.(/ 0, 0, 0 /))) call abort
+ b = maxval (a, dim = 2, mask = l)
+ if (any (b.ne.(/ h, h, h /))) call abort
+ if (any (maxloc (a, dim = 2, mask = l).ne.(/ 0, 0, 0 /))) call abort
+ if (maxval (a, mask = l3).ne.h) call abort
+ if (any (maxloc (a, mask = l3).ne.(/ 0, 0 /))) call abort
+ b = maxval (a, dim = 1, mask = l3)
+ if (any (b.ne.(/ h, h, h /))) call abort
+ if (any (maxloc (a, dim = 1, mask = l3).ne.(/ 0, 0, 0 /))) call abort
+ b = maxval (a, dim = 2, mask = l3)
+ if (any (b.ne.(/ h, h, h /))) call abort
+ if (any (maxloc (a, dim = 2, mask = l3).ne.(/ 0, 0, 0 /))) call abort
+ if (maxval (a, mask = l2).ne.pinf) call abort
+ if (maxval (a, mask = l4).ne.pinf) call abort
+ if (any (maxloc (a, mask = l2).ne.(/ 2, 3 /))) call abort
+ if (any (maxloc (a, mask = l4).ne.(/ 2, 3 /))) call abort
+ b = maxval (a, dim = 1, mask = l2)
+ if (.not.isnan(b(1))) call abort
+ b(1) = 0.0
+ if (any (b.ne.(/ 0.0, minf, pinf /))) call abort
+ if (any (maxloc (a, dim = 1, mask = l2).ne.(/ 1, 1, 2 /))) call abort
+ b = maxval (a, dim = 2, mask = l2)
+ if (any (b.ne.(/ minf, pinf, minf /))) call abort
+ if (any (maxloc (a, dim = 2, mask = l2).ne.(/ 2, 3, 2 /))) call abort
+ b = maxval (a, dim = 1, mask = l4)
+ if (.not.isnan(b(1))) call abort
+ b(1) = 0.0
+ if (any (b.ne.(/ 0.0, minf, pinf /))) call abort
+ if (any (maxloc (a, dim = 1, mask = l2).ne.(/ 1, 1, 2 /))) call abort
+ b = maxval (a, dim = 2, mask = l4)
+ if (any (b.ne.(/ minf, pinf, minf /))) call abort
+ if (any (maxloc (a, dim = 2, mask = l2).ne.(/ 2, 3, 2 /))) call abort
+ if (maxval (a, mask = l5).ne.minf) call abort
+ if (any (maxloc (a, mask = l5).ne.(/ 2, 2 /))) call abort
+ b = maxval (a, dim = 1, mask = l5)
+ if (.not.isnan(b(1))) call abort
+ b(1) = 0.0
+ if (any (b.ne.(/ 0.0, minf, minf /))) call abort
+ if (any (maxloc (a, dim = 1, mask = l5).ne.(/ 2, 2, 1 /))) call abort
+ b = maxval (a, dim = 2, mask = l5)
+ if (any (b.ne.(/ minf, minf, minf /))) call abort
+ if (any (maxloc (a, dim = 2, mask = l5).ne.(/ 3, 2, 2 /))) call abort
+ a = nan
+ if (.not.isnan(maxval (a))) call abort
+ if (maxval (a, mask = l).ne.h) call abort
+ if (.not.isnan(maxval (a, mask = l2))) call abort
+ if (maxval (a, mask = l3).ne.h) call abort
+ if (.not.isnan(maxval (a, mask = l4))) call abort
+ if (.not.isnan(maxval (a, mask = l5))) call abort
+ if (any (maxloc (a).ne.(/ 1, 1 /))) call abort
+ if (any (maxloc (a, mask = l).ne.(/ 0, 0 /))) call abort
+ if (any (maxloc (a, mask = l2).ne.(/ 1, 1 /))) call abort
+ if (any (maxloc (a, mask = l3).ne.(/ 0, 0 /))) call abort
+ if (any (maxloc (a, mask = l4).ne.(/ 1, 1 /))) call abort
+ if (any (maxloc (a, mask = l5).ne.(/ 2, 1 /))) call abort
+ a = minf
+ if (maxval (a).ne.minf) call abort
+ if (maxval (a, mask = l).ne.h) call abort
+ if (maxval (a, mask = l2).ne.minf) call abort
+ if (maxval (a, mask = l3).ne.h) call abort
+ if (maxval (a, mask = l4).ne.minf) call abort
+ if (maxval (a, mask = l5).ne.minf) call abort
+ if (any (maxloc (a).ne.(/ 1, 1 /))) call abort
+ if (any (maxloc (a, mask = l).ne.(/ 0, 0 /))) call abort
+ if (any (maxloc (a, mask = l2).ne.(/ 1, 1 /))) call abort
+ if (any (maxloc (a, mask = l3).ne.(/ 0, 0 /))) call abort
+ if (any (maxloc (a, mask = l4).ne.(/ 1, 1 /))) call abort
+ if (any (maxloc (a, mask = l5).ne.(/ 2, 1 /))) call abort
+ a = nan
+ a(1,3) = minf
+ if (maxval (a).ne.minf) call abort
+ if (maxval (a, mask = l).ne.h) call abort
+ if (maxval (a, mask = l2).ne.minf) call abort
+ if (maxval (a, mask = l3).ne.h) call abort
+ if (maxval (a, mask = l4).ne.minf) call abort
+ if (maxval (a, mask = l5).ne.minf) call abort
+ if (any (maxloc (a).ne.(/ 1, 3 /))) call abort
+ if (any (maxloc (a, mask = l).ne.(/ 0, 0 /))) call abort
+ if (any (maxloc (a, mask = l2).ne.(/ 1, 3 /))) call abort
+ if (any (maxloc (a, mask = l3).ne.(/ 0, 0 /))) call abort
+ if (any (maxloc (a, mask = l4).ne.(/ 1, 3 /))) call abort
+ if (any (maxloc (a, mask = l5).ne.(/ 1, 3 /))) call abort
+end
diff --git a/gcc/testsuite/gfortran.dg/minlocval_1.f90 b/gcc/testsuite/gfortran.dg/minlocval_1.f90
new file mode 100644
index 0000000..f821e54
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/minlocval_1.f90
@@ -0,0 +1,153 @@
+! { dg-do run }
+ real :: a(3), nan, minf, pinf
+ real, allocatable :: c(:)
+ logical :: l
+ logical :: l2(3)
+
+ nan = 0.0
+ minf = 0.0
+ pinf = 0.0
+ nan = 0.0/nan
+ minf = -1.0/minf
+ pinf = 1.0/pinf
+
+ allocate (c(3))
+ a(:) = nan
+ if (minloc (a, dim = 1).ne.1) call abort
+ if (.not.isnan(minval (a, dim = 1))) call abort
+ a(:) = pinf
+ if (minloc (a, dim = 1).ne.1) call abort
+ if (minval (a, dim = 1).ne.pinf) call abort
+ a(1:2) = nan
+ if (minloc (a, dim = 1).ne.3) call abort
+ if (minval (a, dim = 1).ne.pinf) call abort
+ a(2) = 1.0
+ if (minloc (a, dim = 1).ne.2) call abort
+ if (minval (a, dim = 1).ne.1) call abort
+ a(2) = minf
+ if (minloc (a, dim = 1).ne.2) call abort
+ if (minval (a, dim = 1).ne.minf) call abort
+ c(:) = nan
+ if (minloc (c, dim = 1).ne.1) call abort
+ if (.not.isnan(minval (c, dim = 1))) call abort
+ c(:) = pinf
+ if (minloc (c, dim = 1).ne.1) call abort
+ if (minval (c, dim = 1).ne.pinf) call abort
+ c(1:2) = nan
+ if (minloc (c, dim = 1).ne.3) call abort
+ if (minval (c, dim = 1).ne.pinf) call abort
+ c(2) = 1.0
+ if (minloc (c, dim = 1).ne.2) call abort
+ if (minval (c, dim = 1).ne.1) call abort
+ c(2) = minf
+ if (minloc (c, dim = 1).ne.2) call abort
+ if (minval (c, dim = 1).ne.minf) call abort
+ l = .false.
+ l2(:) = .false.
+ a(:) = nan
+ if (minloc (a, dim = 1, mask = l).ne.0) call abort
+ if (minval (a, dim = 1, mask = l).ne.huge(pinf)) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (minval (a, dim = 1, mask = l2).ne.huge(pinf)) call abort
+ a(:) = pinf
+ if (minloc (a, dim = 1, mask = l).ne.0) call abort
+ if (minval (a, dim = 1, mask = l).ne.huge(pinf)) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (minval (a, dim = 1, mask = l2).ne.huge(pinf)) call abort
+ a(1:2) = nan
+ if (minloc (a, dim = 1, mask = l).ne.0) call abort
+ if (minval (a, dim = 1, mask = l).ne.huge(pinf)) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (minval (a, dim = 1, mask = l2).ne.huge(pinf)) call abort
+ a(2) = 1.0
+ if (minloc (a, dim = 1, mask = l).ne.0) call abort
+ if (minval (a, dim = 1, mask = l).ne.huge(pinf)) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (minval (a, dim = 1, mask = l2).ne.huge(pinf)) call abort
+ a(2) = minf
+ if (minloc (a, dim = 1, mask = l).ne.0) call abort
+ if (minval (a, dim = 1, mask = l).ne.huge(pinf)) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (minval (a, dim = 1, mask = l2).ne.huge(pinf)) call abort
+ c(:) = nan
+ if (minloc (c, dim = 1, mask = l).ne.0) call abort
+ if (minval (c, dim = 1, mask = l).ne.huge(pinf)) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (minval (c, dim = 1, mask = l2).ne.huge(pinf)) call abort
+ c(:) = pinf
+ if (minloc (c, dim = 1, mask = l).ne.0) call abort
+ if (minval (c, dim = 1, mask = l).ne.huge(pinf)) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (minval (c, dim = 1, mask = l2).ne.huge(pinf)) call abort
+ c(1:2) = nan
+ if (minloc (c, dim = 1, mask = l).ne.0) call abort
+ if (minval (c, dim = 1, mask = l).ne.huge(pinf)) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (minval (c, dim = 1, mask = l2).ne.huge(pinf)) call abort
+ c(2) = 1.0
+ if (minloc (c, dim = 1, mask = l).ne.0) call abort
+ if (minval (c, dim = 1, mask = l).ne.huge(pinf)) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (minval (c, dim = 1, mask = l2).ne.huge(pinf)) call abort
+ c(2) = minf
+ if (minloc (c, dim = 1, mask = l).ne.0) call abort
+ if (minval (c, dim = 1, mask = l).ne.huge(pinf)) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (minval (c, dim = 1, mask = l2).ne.huge(pinf)) call abort
+ l = .true.
+ l2(:) = .true.
+ a(:) = nan
+ if (minloc (a, dim = 1, mask = l).ne.1) call abort
+ if (.not.isnan(minval (a, dim = 1, mask = l))) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.1) call abort
+ if (.not.isnan(minval (a, dim = 1, mask = l2))) call abort
+ a(:) = pinf
+ if (minloc (a, dim = 1, mask = l).ne.1) call abort
+ if (minval (a, dim = 1, mask = l).ne.pinf) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.1) call abort
+ if (minval (a, dim = 1, mask = l2).ne.pinf) call abort
+ a(1:2) = nan
+ if (minloc (a, dim = 1, mask = l).ne.3) call abort
+ if (minval (a, dim = 1, mask = l).ne.pinf) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.3) call abort
+ if (minval (a, dim = 1, mask = l2).ne.pinf) call abort
+ a(2) = 1.0
+ if (minloc (a, dim = 1, mask = l).ne.2) call abort
+ if (minval (a, dim = 1, mask = l).ne.1) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.2) call abort
+ if (minval (a, dim = 1, mask = l2).ne.1) call abort
+ a(2) = minf
+ if (minloc (a, dim = 1, mask = l).ne.2) call abort
+ if (minval (a, dim = 1, mask = l).ne.minf) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.2) call abort
+ if (minval (a, dim = 1, mask = l2).ne.minf) call abort
+ c(:) = nan
+ if (minloc (c, dim = 1, mask = l).ne.1) call abort
+ if (.not.isnan(minval (c, dim = 1, mask = l))) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.1) call abort
+ if (.not.isnan(minval (c, dim = 1, mask = l2))) call abort
+ c(:) = pinf
+ if (minloc (c, dim = 1, mask = l).ne.1) call abort
+ if (minval (c, dim = 1, mask = l).ne.pinf) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.1) call abort
+ if (minval (c, dim = 1, mask = l2).ne.pinf) call abort
+ c(1:2) = nan
+ if (minloc (c, dim = 1, mask = l).ne.3) call abort
+ if (minval (c, dim = 1, mask = l).ne.pinf) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.3) call abort
+ if (minval (c, dim = 1, mask = l2).ne.pinf) call abort
+ c(2) = 1.0
+ if (minloc (c, dim = 1, mask = l).ne.2) call abort
+ if (minval (c, dim = 1, mask = l).ne.1) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.2) call abort
+ if (minval (c, dim = 1, mask = l2).ne.1) call abort
+ c(2) = minf
+ if (minloc (c, dim = 1, mask = l).ne.2) call abort
+ if (minval (c, dim = 1, mask = l).ne.minf) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.2) call abort
+ if (minval (c, dim = 1, mask = l2).ne.minf) call abort
+ deallocate (c)
+ allocate (c(-2:-3))
+ if (minloc (c, dim = 1).ne.0) call abort
+ if (minval (c, dim = 1).ne.huge(pinf)) call abort
+end
diff --git a/gcc/testsuite/gfortran.dg/minlocval_2.f90 b/gcc/testsuite/gfortran.dg/minlocval_2.f90
new file mode 100644
index 0000000..8e04dc6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/minlocval_2.f90
@@ -0,0 +1,122 @@
+! { dg-do run }
+ integer :: a(3), h
+ integer, allocatable :: c(:)
+ logical :: l
+ logical :: l2(3)
+
+ h = -huge(h)
+ h = h - 1
+ allocate (c(3))
+ a(:) = 5
+ if (minloc (a, dim = 1).ne.1) call abort
+ if (minval (a, dim = 1).ne.5) call abort
+ a(2) = h
+ if (minloc (a, dim = 1).ne.2) call abort
+ if (minval (a, dim = 1).ne.h) call abort
+ a(:) = huge(h)
+ if (minloc (a, dim = 1).ne.1) call abort
+ if (minval (a, dim = 1).ne.huge(h)) call abort
+ a(3) = huge(h) - 1
+ if (minloc (a, dim = 1).ne.3) call abort
+ if (minval (a, dim = 1).ne.huge(h)-1) call abort
+ c(:) = 5
+ if (minloc (c, dim = 1).ne.1) call abort
+ if (minval (c, dim = 1).ne.5) call abort
+ c(2) = h
+ if (minloc (c, dim = 1).ne.2) call abort
+ if (minval (c, dim = 1).ne.h) call abort
+ c(:) = huge(h)
+ if (minloc (c, dim = 1).ne.1) call abort
+ if (minval (c, dim = 1).ne.huge(h)) call abort
+ c(3) = huge(h) - 1
+ if (minloc (c, dim = 1).ne.3) call abort
+ if (minval (c, dim = 1).ne.huge(h)-1) call abort
+ l = .false.
+ l2(:) = .false.
+ a(:) = 5
+ if (minloc (a, dim = 1, mask = l).ne.0) call abort
+ if (minval (a, dim = 1, mask = l).ne.huge(h)) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (minval (a, dim = 1, mask = l2).ne.huge(h)) call abort
+ a(2) = h
+ if (minloc (a, dim = 1, mask = l).ne.0) call abort
+ if (minval (a, dim = 1, mask = l).ne.huge(h)) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (minval (a, dim = 1, mask = l2).ne.huge(h)) call abort
+ a(:) = huge(h)
+ if (minloc (a, dim = 1, mask = l).ne.0) call abort
+ if (minval (a, dim = 1, mask = l).ne.huge(h)) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (minval (a, dim = 1, mask = l2).ne.huge(h)) call abort
+ a(3) = huge(h) - 1
+ if (minloc (a, dim = 1, mask = l).ne.0) call abort
+ if (minval (a, dim = 1, mask = l).ne.huge(h)) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.0) call abort
+ if (minval (a, dim = 1, mask = l2).ne.huge(h)) call abort
+ c(:) = 5
+ if (minloc (c, dim = 1, mask = l).ne.0) call abort
+ if (minval (c, dim = 1, mask = l).ne.huge(h)) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (minval (c, dim = 1, mask = l2).ne.huge(h)) call abort
+ c(2) = h
+ if (minloc (c, dim = 1, mask = l).ne.0) call abort
+ if (minval (c, dim = 1, mask = l).ne.huge(h)) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (minval (c, dim = 1, mask = l2).ne.huge(h)) call abort
+ c(:) = huge(h)
+ if (minloc (c, dim = 1, mask = l).ne.0) call abort
+ if (minval (c, dim = 1, mask = l).ne.huge(h)) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (minval (c, dim = 1, mask = l2).ne.huge(h)) call abort
+ c(3) = huge(h) - 1
+ if (minloc (c, dim = 1, mask = l).ne.0) call abort
+ if (minval (c, dim = 1, mask = l).ne.huge(h)) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.0) call abort
+ if (minval (c, dim = 1, mask = l2).ne.huge(h)) call abort
+ l = .true.
+ l2(:) = .true.
+ a(:) = 5
+ if (minloc (a, dim = 1, mask = l).ne.1) call abort
+ if (minval (a, dim = 1, mask = l).ne.5) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.1) call abort
+ if (minval (a, dim = 1, mask = l2).ne.5) call abort
+ a(2) = h
+ if (minloc (a, dim = 1, mask = l).ne.2) call abort
+ if (minval (a, dim = 1, mask = l).ne.h) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.2) call abort
+ if (minval (a, dim = 1, mask = l2).ne.h) call abort
+ a(:) = huge(h)
+ if (minloc (a, dim = 1, mask = l).ne.1) call abort
+ if (minval (a, dim = 1, mask = l).ne.huge(h)) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.1) call abort
+ if (minval (a, dim = 1, mask = l2).ne.huge(h)) call abort
+ a(3) = huge(h) - 1
+ if (minloc (a, dim = 1, mask = l).ne.3) call abort
+ if (minval (a, dim = 1, mask = l).ne.huge(h)-1) call abort
+ if (minloc (a, dim = 1, mask = l2).ne.3) call abort
+ if (minval (a, dim = 1, mask = l2).ne.huge(h)-1) call abort
+ c(:) = 5
+ if (minloc (c, dim = 1, mask = l).ne.1) call abort
+ if (minval (c, dim = 1, mask = l).ne.5) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.1) call abort
+ if (minval (c, dim = 1, mask = l2).ne.5) call abort
+ c(2) = h
+ if (minloc (c, dim = 1, mask = l).ne.2) call abort
+ if (minval (c, dim = 1, mask = l).ne.h) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.2) call abort
+ if (minval (c, dim = 1, mask = l2).ne.h) call abort
+ c(:) = huge(h)
+ if (minloc (c, dim = 1, mask = l).ne.1) call abort
+ if (minval (c, dim = 1, mask = l).ne.huge(h)) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.1) call abort
+ if (minval (c, dim = 1, mask = l2).ne.huge(h)) call abort
+ c(3) = huge(h) - 1
+ if (minloc (c, dim = 1, mask = l).ne.3) call abort
+ if (minval (c, dim = 1, mask = l).ne.huge(h)-1) call abort
+ if (minloc (c, dim = 1, mask = l2).ne.3) call abort
+ if (minval (c, dim = 1, mask = l2).ne.huge(h)-1) call abort
+ deallocate (c)
+ allocate (c(-2:-3))
+ if (minloc (c, dim = 1).ne.0) call abort
+ if (minval (c, dim = 1).ne.huge(h)) call abort
+end
diff --git a/gcc/testsuite/gfortran.dg/minlocval_3.f90 b/gcc/testsuite/gfortran.dg/minlocval_3.f90
new file mode 100644
index 0000000..6a4fc55
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/minlocval_3.f90
@@ -0,0 +1,284 @@
+ real :: a(30), b(10, 10), m
+ real, allocatable :: c(:), d(:, :)
+ integer :: e(30), f(10, 10), n
+ integer, allocatable :: g(:), h(:,:)
+ logical :: l(30), l2(10, 10)
+ allocate (c (30))
+ allocate (d (10, 10))
+ allocate (g (30))
+ allocate (h (10, 10))
+ a = 7.0
+ b = 7.0
+ c = 7.0
+ d = 7.0
+ e = 7
+ f = 7
+ g = 7
+ h = 7
+ m = huge(m)
+ n = huge(n)
+ a(7) = 6.0
+ b(5, 5) = 6.0
+ b(5, 6) = 5.0
+ b(6, 7) = 4.0
+ c(7) = 6.0
+ d(5, 5) = 6.0
+ d(5, 6) = 5.0
+ d(6, 7) = 4.0
+ e(7) = 6
+ f(5, 5) = 6
+ f(5, 6) = 5
+ f(6, 7) = 4
+ g(7) = 6
+ h(5, 5) = 6
+ h(5, 6) = 5
+ h(6, 7) = 4
+ if (minloc (a, dim = 1).ne.7) call abort
+ if (minval (a, dim = 1).ne.6.0) call abort
+ if (minloc (a(::2), dim = 1).ne.4) call abort
+ if (minval (a(::2), dim = 1).ne.6.0) call abort
+ if (any (minloc (a).ne.(/ 7 /))) call abort
+ if (minval (a).ne.6.0) call abort
+ if (any (minloc (a(::2)).ne.(/ 4 /))) call abort
+ if (minval (a(::2)).ne.6.0) call abort
+ if (any (minloc (b, dim = 1).ne.(/ 1, 1, 1, 1, 5, 5, 6, 1, 1, 1 /))) call abort
+ if (any (minval (b, dim = 1).ne.(/ 7.0, 7.0, 7.0, 7.0, 6.0, 5.0, 4.0, 7.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (b(::2,::2), dim = 1).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (b(::2,::2), dim = 1).ne.(/ 7.0, 7.0, 6.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (b, dim = 2).ne.(/ 1, 1, 1, 1, 6, 7, 1, 1, 1, 1 /))) call abort
+ if (any (minval (b, dim = 2).ne.(/ 7.0, 7.0, 7.0, 7.0, 5.0, 4.0, 7.0, 7.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (b(::2,::2), dim = 2).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (b(::2,::2), dim = 2).ne.(/ 7.0, 7.0, 6.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (b).ne.(/ 6, 7 /))) call abort
+ if (minval (b).ne.4.0) call abort
+ if (any (minloc (b(::2,::2)).ne.(/ 3, 3 /))) call abort
+ if (minval (b(::2,::2)).ne.6.0) call abort
+ if (minloc (c, dim = 1).ne.7) call abort
+ if (minval (c, dim = 1).ne.6.0) call abort
+ if (minloc (c(::2), dim = 1).ne.4) call abort
+ if (minval (c(::2), dim = 1).ne.6.0) call abort
+ if (any (minloc (c).ne.(/ 7 /))) call abort
+ if (minval (c).ne.6.0) call abort
+ if (any (minloc (c(::2)).ne.(/ 4 /))) call abort
+ if (minval (c(::2)).ne.6.0) call abort
+ if (any (minloc (d, dim = 1).ne.(/ 1, 1, 1, 1, 5, 5, 6, 1, 1, 1 /))) call abort
+ if (any (minval (d, dim = 1).ne.(/ 7.0, 7.0, 7.0, 7.0, 6.0, 5.0, 4.0, 7.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (d(::2,::2), dim = 1).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (d(::2,::2), dim = 1).ne.(/ 7.0, 7.0, 6.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (d, dim = 2).ne.(/ 1, 1, 1, 1, 6, 7, 1, 1, 1, 1 /))) call abort
+ if (any (minval (d, dim = 2).ne.(/ 7.0, 7.0, 7.0, 7.0, 5.0, 4.0, 7.0, 7.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (d(::2,::2), dim = 2).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (d(::2,::2), dim = 2).ne.(/ 7.0, 7.0, 6.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (d).ne.(/ 6, 7 /))) call abort
+ if (minval (d).ne.4.0) call abort
+ if (any (minloc (d(::2,::2)).ne.(/ 3, 3 /))) call abort
+ if (minval (d(::2,::2)).ne.6.0) call abort
+ if (minloc (e, dim = 1).ne.7) call abort
+ if (minval (e, dim = 1).ne.6) call abort
+ if (minloc (e(::2), dim = 1).ne.4) call abort
+ if (minval (e(::2), dim = 1).ne.6) call abort
+ if (any (minloc (e).ne.(/ 7 /))) call abort
+ if (minval (e).ne.6) call abort
+ if (any (minloc (e(::2)).ne.(/ 4 /))) call abort
+ if (minval (e(::2)).ne.6) call abort
+ if (any (minloc (f, dim = 1).ne.(/ 1, 1, 1, 1, 5, 5, 6, 1, 1, 1 /))) call abort
+ if (any (minval (f, dim = 1).ne.(/ 7, 7, 7, 7, 6, 5, 4, 7, 7, 7 /))) call abort
+ if (any (minloc (f(::2,::2), dim = 1).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (f(::2,::2), dim = 1).ne.(/ 7, 7, 6, 7, 7 /))) call abort
+ if (any (minloc (f, dim = 2).ne.(/ 1, 1, 1, 1, 6, 7, 1, 1, 1, 1 /))) call abort
+ if (any (minval (f, dim = 2).ne.(/ 7, 7, 7, 7, 5, 4, 7, 7, 7, 7 /))) call abort
+ if (any (minloc (f(::2,::2), dim = 2).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (f(::2,::2), dim = 2).ne.(/ 7, 7, 6, 7, 7 /))) call abort
+ if (any (minloc (f).ne.(/ 6, 7 /))) call abort
+ if (minval (f).ne.4) call abort
+ if (any (minloc (f(::2,::2)).ne.(/ 3, 3 /))) call abort
+ if (minval (f(::2,::2)).ne.6) call abort
+ if (minloc (g, dim = 1).ne.7) call abort
+ if (minval (g, dim = 1).ne.6) call abort
+ if (minloc (g(::2), dim = 1).ne.4) call abort
+ if (minval (g(::2), dim = 1).ne.6) call abort
+ if (any (minloc (g).ne.(/ 7 /))) call abort
+ if (minval (g).ne.6) call abort
+ if (any (minloc (g(::2)).ne.(/ 4 /))) call abort
+ if (minval (g(::2)).ne.6) call abort
+ if (any (minloc (h, dim = 1).ne.(/ 1, 1, 1, 1, 5, 5, 6, 1, 1, 1 /))) call abort
+ if (any (minval (h, dim = 1).ne.(/ 7, 7, 7, 7, 6, 5, 4, 7, 7, 7 /))) call abort
+ if (any (minloc (h(::2,::2), dim = 1).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (h(::2,::2), dim = 1).ne.(/ 7, 7, 6, 7, 7 /))) call abort
+ if (any (minloc (h, dim = 2).ne.(/ 1, 1, 1, 1, 6, 7, 1, 1, 1, 1 /))) call abort
+ if (any (minval (h, dim = 2).ne.(/ 7, 7, 7, 7, 5, 4, 7, 7, 7, 7 /))) call abort
+ if (any (minloc (h(::2,::2), dim = 2).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (h(::2,::2), dim = 2).ne.(/ 7, 7, 6, 7, 7 /))) call abort
+ if (any (minloc (h).ne.(/ 6, 7 /))) call abort
+ if (minval (h).ne.4) call abort
+ if (any (minloc (h(::2,::2)).ne.(/ 3, 3 /))) call abort
+ if (minval (h(::2,::2)).ne.6) call abort
+ l = .true.
+ l2 = .true.
+ if (minloc (a, dim = 1, mask = l).ne.7) call abort
+ if (minval (a, dim = 1, mask = l).ne.6.0) call abort
+ if (minloc (a(::2), dim = 1, mask = l(::2)).ne.4) call abort
+ if (minval (a(::2), dim = 1, mask = l(::2)).ne.6.0) call abort
+ if (any (minloc (a, mask = l).ne.(/ 7 /))) call abort
+ if (minval (a, mask = l).ne.6.0) call abort
+ if (any (minloc (a(::2), mask = l(::2)).ne.(/ 4 /))) call abort
+ if (minval (a(::2), mask = l(::2)).ne.6.0) call abort
+ if (any (minloc (b, dim = 1, mask = l2).ne.(/ 1, 1, 1, 1, 5, 5, 6, 1, 1, 1 /))) call abort
+ if (any (minval (b, dim = 1, mask = l2).ne.(/ 7.0, 7.0, 7.0, 7.0, 6.0, 5.0, 4.0, 7.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (b(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (b(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ 7.0, 7.0, 6.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (b, dim = 2, mask = l2).ne.(/ 1, 1, 1, 1, 6, 7, 1, 1, 1, 1 /))) call abort
+ if (any (minval (b, dim = 2, mask = l2).ne.(/ 7.0, 7.0, 7.0, 7.0, 5.0, 4.0, 7.0, 7.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (b(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (b(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ 7.0, 7.0, 6.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (b, mask = l2).ne.(/ 6, 7 /))) call abort
+ if (minval (b, mask = l2).ne.4.0) call abort
+ if (any (minloc (b(::2,::2), mask = l2(::2,::2)).ne.(/ 3, 3 /))) call abort
+ if (minval (b(::2,::2), mask = l2(::2,::2)).ne.6.0) call abort
+ if (minloc (c, dim = 1, mask = l).ne.7) call abort
+ if (minval (c, dim = 1, mask = l).ne.6.0) call abort
+ if (minloc (c(::2), dim = 1, mask = l(::2)).ne.4) call abort
+ if (minval (c(::2), dim = 1, mask = l(::2)).ne.6.0) call abort
+ if (any (minloc (c, mask = l).ne.(/ 7 /))) call abort
+ if (minval (c, mask = l).ne.6.0) call abort
+ if (any (minloc (c(::2), mask = l(::2)).ne.(/ 4 /))) call abort
+ if (minval (c(::2), mask = l(::2)).ne.6.0) call abort
+ if (any (minloc (d, dim = 1, mask = l2).ne.(/ 1, 1, 1, 1, 5, 5, 6, 1, 1, 1 /))) call abort
+ if (any (minval (d, dim = 1, mask = l2).ne.(/ 7.0, 7.0, 7.0, 7.0, 6.0, 5.0, 4.0, 7.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (d(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (d(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ 7.0, 7.0, 6.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (d, dim = 2, mask = l2).ne.(/ 1, 1, 1, 1, 6, 7, 1, 1, 1, 1 /))) call abort
+ if (any (minval (d, dim = 2, mask = l2).ne.(/ 7.0, 7.0, 7.0, 7.0, 5.0, 4.0, 7.0, 7.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (d(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (d(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ 7.0, 7.0, 6.0, 7.0, 7.0 /))) call abort
+ if (any (minloc (d, mask = l2).ne.(/ 6, 7 /))) call abort
+ if (minval (d, mask = l2).ne.4.0) call abort
+ if (any (minloc (d(::2,::2), mask = l2(::2,::2)).ne.(/ 3, 3 /))) call abort
+ if (minval (d(::2,::2), mask = l2(::2,::2)).ne.6.0) call abort
+ if (minloc (e, dim = 1, mask = l).ne.7) call abort
+ if (minval (e, dim = 1, mask = l).ne.6) call abort
+ if (minloc (e(::2), dim = 1, mask = l(::2)).ne.4) call abort
+ if (minval (e(::2), dim = 1, mask = l(::2)).ne.6) call abort
+ if (any (minloc (e, mask = l).ne.(/ 7 /))) call abort
+ if (minval (e, mask = l).ne.6) call abort
+ if (any (minloc (e(::2), mask = l(::2)).ne.(/ 4 /))) call abort
+ if (minval (e(::2), mask = l(::2)).ne.6) call abort
+ if (any (minloc (f, dim = 1, mask = l2).ne.(/ 1, 1, 1, 1, 5, 5, 6, 1, 1, 1 /))) call abort
+ if (any (minval (f, dim = 1, mask = l2).ne.(/ 7, 7, 7, 7, 6, 5, 4, 7, 7, 7 /))) call abort
+ if (any (minloc (f(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (f(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ 7, 7, 6, 7, 7 /))) call abort
+ if (any (minloc (f, dim = 2, mask = l2).ne.(/ 1, 1, 1, 1, 6, 7, 1, 1, 1, 1 /))) call abort
+ if (any (minval (f, dim = 2, mask = l2).ne.(/ 7, 7, 7, 7, 5, 4, 7, 7, 7, 7 /))) call abort
+ if (any (minloc (f(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (f(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ 7, 7, 6, 7, 7 /))) call abort
+ if (any (minloc (f, mask = l2).ne.(/ 6, 7 /))) call abort
+ if (minval (f, mask = l2).ne.4) call abort
+ if (any (minloc (f(::2,::2), mask = l2(::2,::2)).ne.(/ 3, 3 /))) call abort
+ if (minval (f(::2,::2), mask = l2(::2,::2)).ne.6) call abort
+ if (minloc (g, dim = 1, mask = l).ne.7) call abort
+ if (minval (g, dim = 1, mask = l).ne.6) call abort
+ if (minloc (g(::2), dim = 1, mask = l(::2)).ne.4) call abort
+ if (minval (g(::2), dim = 1, mask = l(::2)).ne.6) call abort
+ if (any (minloc (g, mask = l).ne.(/ 7 /))) call abort
+ if (minval (g, mask = l).ne.6) call abort
+ if (any (minloc (g(::2), mask = l(::2)).ne.(/ 4 /))) call abort
+ if (minval (g(::2), mask = l(::2)).ne.6) call abort
+ if (any (minloc (h, dim = 1, mask = l2).ne.(/ 1, 1, 1, 1, 5, 5, 6, 1, 1, 1 /))) call abort
+ if (any (minval (h, dim = 1, mask = l2).ne.(/ 7, 7, 7, 7, 6, 5, 4, 7, 7, 7 /))) call abort
+ if (any (minloc (h(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (h(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ 7, 7, 6, 7, 7 /))) call abort
+ if (any (minloc (h, dim = 2, mask = l2).ne.(/ 1, 1, 1, 1, 6, 7, 1, 1, 1, 1 /))) call abort
+ if (any (minval (h, dim = 2, mask = l2).ne.(/ 7, 7, 7, 7, 5, 4, 7, 7, 7, 7 /))) call abort
+ if (any (minloc (h(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ 1, 1, 3, 1, 1 /))) call abort
+ if (any (minval (h(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ 7, 7, 6, 7, 7 /))) call abort
+ if (any (minloc (h, mask = l2).ne.(/ 6, 7 /))) call abort
+ if (minval (h, mask = l2).ne.4) call abort
+ if (any (minloc (h(::2,::2), mask = l2(::2,::2)).ne.(/ 3, 3 /))) call abort
+ if (minval (h(::2,::2), mask = l2(::2,::2)).ne.6) call abort
+ l = .false.
+ l2 = .false.
+ if (minloc (a, dim = 1, mask = l).ne.0) call abort
+ if (minval (a, dim = 1, mask = l).ne.m) call abort
+ if (minloc (a(::2), dim = 1, mask = l(::2)).ne.0) call abort
+ if (minval (a(::2), dim = 1, mask = l(::2)).ne.m) call abort
+ if (any (minloc (a, mask = l).ne.(/ 0 /))) call abort
+ if (minval (a, mask = l).ne.m) call abort
+ if (any (minloc (a(::2), mask = l(::2)).ne.(/ 0 /))) call abort
+ if (minval (a(::2), mask = l(::2)).ne.m) call abort
+ if (any (minloc (b, dim = 1, mask = l2).ne.(/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (b, dim = 1, mask = l2).ne.(/ m, m, m, m, m, m, m, m, m, m /))) call abort
+ if (any (minloc (b(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (b(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ m, m, m, m, m /))) call abort
+ if (any (minloc (b, dim = 2, mask = l2).ne.(/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (b, dim = 2, mask = l2).ne.(/ m, m, m, m, m, m, m, m, m, m /))) call abort
+ if (any (minloc (b(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (b(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ m, m, m, m, m /))) call abort
+ if (any (minloc (b, mask = l2).ne.(/ 0, 0 /))) call abort
+ if (minval (b, mask = l2).ne.m) call abort
+ if (any (minloc (b(::2,::2), mask = l2(::2,::2)).ne.(/ 0, 0 /))) call abort
+ if (minval (b(::2,::2), mask = l2(::2,::2)).ne.m) call abort
+ if (minloc (c, dim = 1, mask = l).ne.0) call abort
+ if (minval (c, dim = 1, mask = l).ne.m) call abort
+ if (minloc (c(::2), dim = 1, mask = l(::2)).ne.0) call abort
+ if (minval (c(::2), dim = 1, mask = l(::2)).ne.m) call abort
+ if (any (minloc (c, mask = l).ne.(/ 0 /))) call abort
+ if (minval (c, mask = l).ne.m) call abort
+ if (any (minloc (c(::2), mask = l(::2)).ne.(/ 0 /))) call abort
+ if (minval (c(::2), mask = l(::2)).ne.m) call abort
+ if (any (minloc (d, dim = 1, mask = l2).ne.(/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (d, dim = 1, mask = l2).ne.(/ m, m, m, m, m, m, m, m, m, m /))) call abort
+ if (any (minloc (d(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (d(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ m, m, m, m, m /))) call abort
+ if (any (minloc (d, dim = 2, mask = l2).ne.(/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (d, dim = 2, mask = l2).ne.(/ m, m, m, m, m, m, m, m, m, m /))) call abort
+ if (any (minloc (d(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (d(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ m, m, m, m, m /))) call abort
+ if (any (minloc (d, mask = l2).ne.(/ 0, 0 /))) call abort
+ if (minval (d, mask = l2).ne.m) call abort
+ if (any (minloc (d(::2,::2), mask = l2(::2,::2)).ne.(/ 0, 0 /))) call abort
+ if (minval (d(::2,::2), mask = l2(::2,::2)).ne.m) call abort
+ if (minloc (e, dim = 1, mask = l).ne.0) call abort
+ if (minval (e, dim = 1, mask = l).ne.n) call abort
+ if (minloc (e(::2), dim = 1, mask = l(::2)).ne.0) call abort
+ if (minval (e(::2), dim = 1, mask = l(::2)).ne.n) call abort
+ if (any (minloc (e, mask = l).ne.(/ 0 /))) call abort
+ if (minval (e, mask = l).ne.n) call abort
+ if (any (minloc (e(::2), mask = l(::2)).ne.(/ 0 /))) call abort
+ if (minval (e(::2), mask = l(::2)).ne.n) call abort
+ if (any (minloc (f, dim = 1, mask = l2).ne.(/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (f, dim = 1, mask = l2).ne.(/ n, n, n, n, n, n, n, n, n, n /))) call abort
+ if (any (minloc (f(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (f(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ n, n, n, n, n /))) call abort
+ if (any (minloc (f, dim = 2, mask = l2).ne.(/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (f, dim = 2, mask = l2).ne.(/ n, n, n, n, n, n, n, n, n, n /))) call abort
+ if (any (minloc (f(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (f(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ n, n, n, n, n /))) call abort
+ if (any (minloc (f, mask = l2).ne.(/ 0, 0 /))) call abort
+ if (minval (f, mask = l2).ne.n) call abort
+ if (any (minloc (f(::2,::2), mask = l2(::2,::2)).ne.(/ 0, 0 /))) call abort
+ if (minval (f(::2,::2), mask = l2(::2,::2)).ne.n) call abort
+ if (minloc (g, dim = 1, mask = l).ne.0) call abort
+ if (minval (g, dim = 1, mask = l).ne.n) call abort
+ if (minloc (g(::2), dim = 1, mask = l(::2)).ne.0) call abort
+ if (minval (g(::2), dim = 1, mask = l(::2)).ne.n) call abort
+ if (any (minloc (g, mask = l).ne.(/ 0 /))) call abort
+ if (minval (g, mask = l).ne.n) call abort
+ if (any (minloc (g(::2), mask = l(::2)).ne.(/ 0 /))) call abort
+ if (minval (g(::2), mask = l(::2)).ne.n) call abort
+ if (any (minloc (h, dim = 1, mask = l2).ne.(/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (h, dim = 1, mask = l2).ne.(/ n, n, n, n, n, n, n, n, n, n /))) call abort
+ if (any (minloc (h(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (h(::2,::2), dim = 1, mask = l2(::2,::2)).ne.(/ n, n, n, n, n /))) call abort
+ if (any (minloc (h, dim = 2, mask = l2).ne.(/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (h, dim = 2, mask = l2).ne.(/ n, n, n, n, n, n, n, n, n, n /))) call abort
+ if (any (minloc (h(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ 0, 0, 0, 0, 0 /))) call abort
+ if (any (minval (h(::2,::2), dim = 2, mask = l2(::2,::2)).ne.(/ n, n, n, n, n /))) call abort
+ if (any (minloc (h, mask = l2).ne.(/ 0, 0 /))) call abort
+ if (minval (h, mask = l2).ne.n) call abort
+ if (any (minloc (h(::2,::2), mask = l2(::2,::2)).ne.(/ 0, 0 /))) call abort
+ if (minval (h(::2,::2), mask = l2(::2,::2)).ne.n) call abort
+ a = 7.0
+ b = 7.0
+ c = 7.0
+ d = 7.0
+end
diff --git a/gcc/testsuite/gfortran.dg/minlocval_4.f90 b/gcc/testsuite/gfortran.dg/minlocval_4.f90
new file mode 100644
index 0000000..1e72ba8
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/minlocval_4.f90
@@ -0,0 +1,118 @@
+! { dg-do run }
+ real :: a(3,3), b(3), nan, minf, pinf, h
+ logical :: l, l2
+ logical :: l3(3,3), l4(3,3), l5(3,3)
+
+ nan = 0.0
+ minf = 0.0
+ pinf = 0.0
+ nan = 0.0/nan
+ minf = -1.0/minf
+ pinf = 1.0/pinf
+ h = huge(h)
+ l = .false.
+ l2 = .true.
+ l3 = .false.
+ l4 = .true.
+ l5 = .true.
+ l5(1,1) = .false.
+ l5(1,2) = .false.
+ l5(2,3) = .false.
+ a = reshape ((/ nan, nan, nan, pinf, pinf, pinf, pinf, minf, pinf /), (/ 3, 3 /))
+ if (minval (a).ne.minf) call abort
+ if (any (minloc (a).ne.(/ 2, 3 /))) call abort
+ b = minval (a, dim = 1)
+ if (.not.isnan(b(1))) call abort
+ b(1) = 0.0
+ if (any (b.ne.(/ 0.0, pinf, minf /))) call abort
+ if (any (minloc (a, dim = 1).ne.(/ 1, 1, 2 /))) call abort
+ b = minval (a, dim = 2)
+ if (any (b.ne.(/ pinf, minf, pinf /))) call abort
+ if (any (minloc (a, dim = 2).ne.(/ 2, 3, 2 /))) call abort
+ if (minval (a, mask = l).ne.h) call abort
+ if (any (minloc (a, mask = l).ne.(/ 0, 0 /))) call abort
+ b = minval (a, dim = 1, mask = l)
+ if (any (b.ne.(/ h, h, h /))) call abort
+ if (any (minloc (a, dim = 1, mask = l).ne.(/ 0, 0, 0 /))) call abort
+ b = minval (a, dim = 2, mask = l)
+ if (any (b.ne.(/ h, h, h /))) call abort
+ if (any (minloc (a, dim = 2, mask = l).ne.(/ 0, 0, 0 /))) call abort
+ if (minval (a, mask = l3).ne.h) call abort
+ if (any (minloc (a, mask = l3).ne.(/ 0, 0 /))) call abort
+ b = minval (a, dim = 1, mask = l3)
+ if (any (b.ne.(/ h, h, h /))) call abort
+ if (any (minloc (a, dim = 1, mask = l3).ne.(/ 0, 0, 0 /))) call abort
+ b = minval (a, dim = 2, mask = l3)
+ if (any (b.ne.(/ h, h, h /))) call abort
+ if (any (minloc (a, dim = 2, mask = l3).ne.(/ 0, 0, 0 /))) call abort
+ if (minval (a, mask = l2).ne.minf) call abort
+ if (minval (a, mask = l4).ne.minf) call abort
+ if (any (minloc (a, mask = l2).ne.(/ 2, 3 /))) call abort
+ if (any (minloc (a, mask = l4).ne.(/ 2, 3 /))) call abort
+ b = minval (a, dim = 1, mask = l2)
+ if (.not.isnan(b(1))) call abort
+ b(1) = 0.0
+ if (any (b.ne.(/ 0.0, pinf, minf /))) call abort
+ if (any (minloc (a, dim = 1, mask = l2).ne.(/ 1, 1, 2 /))) call abort
+ b = minval (a, dim = 2, mask = l2)
+ if (any (b.ne.(/ pinf, minf, pinf /))) call abort
+ if (any (minloc (a, dim = 2, mask = l2).ne.(/ 2, 3, 2 /))) call abort
+ b = minval (a, dim = 1, mask = l4)
+ if (.not.isnan(b(1))) call abort
+ b(1) = 0.0
+ if (any (b.ne.(/ 0.0, pinf, minf /))) call abort
+ if (any (minloc (a, dim = 1, mask = l2).ne.(/ 1, 1, 2 /))) call abort
+ b = minval (a, dim = 2, mask = l4)
+ if (any (b.ne.(/ pinf, minf, pinf /))) call abort
+ if (any (minloc (a, dim = 2, mask = l2).ne.(/ 2, 3, 2 /))) call abort
+ if (minval (a, mask = l5).ne.pinf) call abort
+ if (any (minloc (a, mask = l5).ne.(/ 2, 2 /))) call abort
+ b = minval (a, dim = 1, mask = l5)
+ if (.not.isnan(b(1))) call abort
+ b(1) = 0.0
+ if (any (b.ne.(/ 0.0, pinf, pinf /))) call abort
+ if (any (minloc (a, dim = 1, mask = l5).ne.(/ 2, 2, 1 /))) call abort
+ b = minval (a, dim = 2, mask = l5)
+ if (any (b.ne.(/ pinf, pinf, pinf /))) call abort
+ if (any (minloc (a, dim = 2, mask = l5).ne.(/ 3, 2, 2 /))) call abort
+ a = nan
+ if (.not.isnan(minval (a))) call abort
+ if (minval (a, mask = l).ne.h) call abort
+ if (.not.isnan(minval (a, mask = l2))) call abort
+ if (minval (a, mask = l3).ne.h) call abort
+ if (.not.isnan(minval (a, mask = l4))) call abort
+ if (.not.isnan(minval (a, mask = l5))) call abort
+ if (any (minloc (a).ne.(/ 1, 1 /))) call abort
+ if (any (minloc (a, mask = l).ne.(/ 0, 0 /))) call abort
+ if (any (minloc (a, mask = l2).ne.(/ 1, 1 /))) call abort
+ if (any (minloc (a, mask = l3).ne.(/ 0, 0 /))) call abort
+ if (any (minloc (a, mask = l4).ne.(/ 1, 1 /))) call abort
+ if (any (minloc (a, mask = l5).ne.(/ 2, 1 /))) call abort
+ a = pinf
+ if (minval (a).ne.pinf) call abort
+ if (minval (a, mask = l).ne.h) call abort
+ if (minval (a, mask = l2).ne.pinf) call abort
+ if (minval (a, mask = l3).ne.h) call abort
+ if (minval (a, mask = l4).ne.pinf) call abort
+ if (minval (a, mask = l5).ne.pinf) call abort
+ if (any (minloc (a).ne.(/ 1, 1 /))) call abort
+ if (any (minloc (a, mask = l).ne.(/ 0, 0 /))) call abort
+ if (any (minloc (a, mask = l2).ne.(/ 1, 1 /))) call abort
+ if (any (minloc (a, mask = l3).ne.(/ 0, 0 /))) call abort
+ if (any (minloc (a, mask = l4).ne.(/ 1, 1 /))) call abort
+ if (any (minloc (a, mask = l5).ne.(/ 2, 1 /))) call abort
+ a = nan
+ a(1,3) = pinf
+ if (minval (a).ne.pinf) call abort
+ if (minval (a, mask = l).ne.h) call abort
+ if (minval (a, mask = l2).ne.pinf) call abort
+ if (minval (a, mask = l3).ne.h) call abort
+ if (minval (a, mask = l4).ne.pinf) call abort
+ if (minval (a, mask = l5).ne.pinf) call abort
+ if (any (minloc (a).ne.(/ 1, 3 /))) call abort
+ if (any (minloc (a, mask = l).ne.(/ 0, 0 /))) call abort
+ if (any (minloc (a, mask = l2).ne.(/ 1, 3 /))) call abort
+ if (any (minloc (a, mask = l3).ne.(/ 0, 0 /))) call abort
+ if (any (minloc (a, mask = l4).ne.(/ 1, 3 /))) call abort
+ if (any (minloc (a, mask = l5).ne.(/ 1, 3 /))) call abort
+end