diff --git a/flang/lib/Evaluate/fold-integer.cpp b/flang/lib/Evaluate/fold-integer.cpp --- a/flang/lib/Evaluate/fold-integer.cpp +++ b/flang/lib/Evaluate/fold-integer.cpp @@ -313,6 +313,15 @@ array->SetLowerBoundsToOne(); ConstantSubscripts at{array->lbounds()}, maskAt, resultIndices, resultShape; if (mask) { + if (auto scalarMask{mask->GetScalarValue()}) { + // Convert into array in case of scalar MASK= (for + // MAXLOC/MINLOC/FINDLOC mask should be be conformable) + ConstantSubscript n{GetSize(array->shape())}; + std::vector> mask_elements( + n, Scalar{scalarMask.value()}); + *mask = Constant{ + std::move(mask_elements), ConstantSubscripts{n}}; + } mask->SetLowerBoundsToOne(); maskAt = mask->lbounds(); } diff --git a/flang/test/Evaluate/fold-findloc.f90 b/flang/test/Evaluate/fold-findloc.f90 --- a/flang/test/Evaluate/fold-findloc.f90 +++ b/flang/test/Evaluate/fold-findloc.f90 @@ -66,4 +66,19 @@ logical, parameter :: test_char2 = all(minloc(a).eq.[1]) logical, parameter :: test_char3 = all(maxloc(a, back=.true.).eq.[4]) logical, parameter :: test_char4 = all(minloc(a, back=.true.).eq.[3]) + + ! Check with scalar MASK= + logical, parameter:: test_mia1_mt = all(minloc(ia1, mask=.true.) == 1) + logical, parameter:: test_mia1_mtd = all(minloc(ia1, mask=.true., dim=1) == [1]) + logical, parameter:: test_xia1_mt = all(maxloc(ia1, mask=.true.) == 3) + logical, parameter:: test_xia1_mtd = all(maxloc(ia1, mask=.true., dim=1) == [3]) + logical, parameter:: test_fia1_mt = all(findloc(ia1, 1, mask=.true.) == 1) + logical, parameter:: test_fia1_mtd = all(findloc(ia1, 1, mask=.true., dim=1) == [1]) + + logical, parameter:: test_mia1_mf = all(minloc(ia1, mask=.false.) == 0) + logical, parameter:: test_mia1_mfd = all(minloc(ia1, mask=.false., dim=1) == [0]) + logical, parameter:: test_xia1_mf = all(maxloc(ia1, mask=.false.) == 0) + logical, parameter:: test_xia1_mfd = all(maxloc(ia1, mask=.false., dim=1) == [0]) + logical, parameter:: test_fia1_mf = all(findloc(ia1, 1, mask=.false.) == 0) + logical, parameter:: test_fia1_mfd = all(findloc(ia1, 1, mask=.false., dim=1) == [0]) end module