https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107874
Bug ID: 107874
Summary: merge not using all its arguments
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: john.harper at vuw dot ac.nz
Target Milestone: ---
The F2018 standard 15.5.3 requires all actual arguments in a function reference
to be evaluated.
In the program below, merge has three scalar arguments; ifort evaluates
all three, gfortran evaluates only the useful two, which violates 15.5.3.
program testmerge9
implicit none
integer i
logical:: x(2)=(/.true., .false./), y ! avoiding [ ] allows f95 option
do i = 1,2
y = merge(tstuff(),fstuff(),x(i))
print *,y
end do
contains
logical function tstuff()
print *,'tstuff'
tstuff = .true.
end function tstuff
logical function fstuff()
print *,'fstuff'
fstuff = .false.
end function fstuff
end program testmerge9
Steve Kargl said "Looks like a bug. Feel free to send a bug report with this
patch."
diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index bb938026828..c5b63d356e1 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -7538,9 +7538,9 @@ gfc_conv_intrinsic_merge (gfc_se * se, gfc_expr * expr)
gfc_conv_intrinsic_function_args (se, expr, args, num_args);
if (expr->ts.type != BT_CHARACTER)
{
- tsource = args[0];
- fsource = args[1];
- mask = args[2];
+ tsource = gfc_evaluate_now (args[0], &se->pre);
+ fsource = gfc_evaluate_now (args[1], &se->pre);
+ mask = gfc_evaluate_now (args[2], &se->pre);
}
else
{