Hi Mikael, The fix is blindingly obvious :-) Not only that, the failing testcase runs correctly.
OK for mainline and please backport to 14-branch before the 14.2 release. Thanks for the patch Paul On Sat, 13 Jul 2024 at 10:48, Mikael Morin <morin-mik...@orange.fr> wrote: > From: Mikael Morin <mik...@gcc.gnu.org> > > Hello, > > I'm currently testing this on x86_64-linux. > I plan to push to master if all goes well. > > Mikael > > -- 8< -- > > Add the preliminary code that the generated expression for MASK may depend > on when generating the inline code to evaluate MINLOC or MAXLOC with a > scalar MASK. > > The generated code was only keeping the generated expression but not the > preliminary code, which was sufficient for simple cases such as data > references or simple (scalar) function calls, but was bogus with more > complicated ones. > > gcc/fortran/ChangeLog: > > * trans-intrinsic.cc (gfc_conv_intrinsic_minmaxloc): Add the > preliminary code generated for MASK to the preliminary code of > MINLOC/MAXLOC. > > gcc/testsuite/ChangeLog: > > * gfortran.dg/minmaxloc_17.f90: New test. > --- > gcc/fortran/trans-intrinsic.cc | 1 + > gcc/testsuite/gfortran.dg/minmaxloc_17.f90 | 33 ++++++++++++++++++++++ > 2 files changed, 34 insertions(+) > create mode 100644 gcc/testsuite/gfortran.dg/minmaxloc_17.f90 > > diff --git a/gcc/fortran/trans-intrinsic.cc > b/gcc/fortran/trans-intrinsic.cc > index cadbd177452..180d0d7a88c 100644 > --- a/gcc/fortran/trans-intrinsic.cc > +++ b/gcc/fortran/trans-intrinsic.cc > @@ -5749,6 +5749,7 @@ gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr > * expr, enum tree_code op) > > gfc_init_se (&maskse, NULL); > gfc_conv_expr_val (&maskse, maskexpr); > + gfc_add_block_to_block (&se->pre, &maskse.pre); > gfc_init_block (&block); > gfc_add_block_to_block (&block, &loop.pre); > gfc_add_block_to_block (&block, &loop.post); > diff --git a/gcc/testsuite/gfortran.dg/minmaxloc_17.f90 > b/gcc/testsuite/gfortran.dg/minmaxloc_17.f90 > new file mode 100644 > index 00000000000..7e6e586ab03 > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/minmaxloc_17.f90 > @@ -0,0 +1,33 @@ > +! { dg-do run } > +! > +! Check that the code necessary to evaluate MINLOC's or MAXLOC's MASK > +! argument is correctly generated. > + > +program p > + implicit none > + integer, parameter :: data10(*) = (/ 2, 5, 2, 0, 6, 5, 3, 6, 0, 1 /) > + logical, parameter :: mask10(*) = (/ .false., .true., .false., & > + .false., .true., .true., & > + .true. , .true., .false., & > + .false. /) > + type bool_wrapper > + logical :: l > + end type > + call check_minloc > + call check_maxloc > +contains > + subroutine check_minloc > + integer :: a(10) > + integer :: r > + a = data10 > + r = minloc(a, dim = 1, mask = sum(a) > 0) > + if (r /= 4) stop 11 > + end subroutine > + subroutine check_maxloc > + integer :: a(10) > + integer :: r > + a = data10 > + r = maxloc(a, dim = 1, mask = sum(a) > 0) > + if (r /= 5) stop 18 > + end subroutine > +end program > -- > 2.43.0 > >