https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119540
anlauf at gcc dot gnu.org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |anlauf at gcc dot gnu.org,
| |pault at gcc dot gnu.org
--- Comment #2 from anlauf at gcc dot gnu.org ---
The following testcase shows that the descriptor of the result array
is wrong:
program p
implicit none
integer, parameter :: mm(1,2,3) = 1
print *, shape (reduce (mm, add, 1))
print *, shape (reduce (mm, add, 2))
print *, shape (reduce (mm, add, 3))
print *, reduce (mm, add, 1)
print *, reduce (mm, add, 2)
print *, reduce (mm, add, 3)
contains
pure function add(i,j) result(sum_ij)
integer, intent(in) :: i, j
integer :: sum_ij
sum_ij = i + j
end function add
end
I get:
1 2
1 2
1 2
1 1
2 2
3 3
Expected (e.g. Intel):
2 3
1 3
1 2
1 1 1 1 1 1
2 2 2
3 3
The reason for the wrong extents in the descriptor is likely in the
runtime code. My attempt to fix this was as follows:
diff --git a/libgfortran/intrinsics/reduce.c b/libgfortran/intrinsics/reduce.c
index c8950e41fd0..fec05d5df88 100644
--- a/libgfortran/intrinsics/reduce.c
+++ b/libgfortran/intrinsics/reduce.c
@@ -117,15 +117,20 @@ reduce (parray *ret,
else if (i < dimen_m1)
ext0 *= ext;
else if (i == dimen_m1)
- ext1 = ext;
+ {
+ ext1 = ext;
+ continue;
+ }
else
ext2 *= ext;
/* The dimensions of the return array. */
if (i < (int)(dimen - 1))
GFC_DIMENSION_SET (ret->dim[i], 0, ext - 1, str);
- else if (i < array_rank - 1)
- GFC_DIMENSION_SET (ret->dim[i], 0, ext - 1, str);
+ /* else if (i < array_rank - 1) */
+ /* GFC_DIMENSION_SET (ret->dim[i], 0, ext - 1, str); */
+ else
+ GFC_DIMENSION_SET (ret->dim[i-1], 0, ext - 1, str);
}
if (!scalar_result)
This now leads to:
2 3
1 3
1 2
1 1 1 1 1 1
2 2 0
3 3
This is only almost correct (see dim=2 case).
CC'ing Paul for help.