[flang] Fix ORDER= argument to RESHAPE

The ORDER= argument to the transformational intrinsic function RESHAPE
was being misinterpreted in an inverted way that could be detected only
with 3-d or higher rank array.  Fix in both folding and the runtime, and
extend tests.

Differential Revision: https://reviews.llvm.org/D113699
This commit is contained in:
Peter Klausler 2021-11-10 15:49:05 -08:00
parent 03cfea68c6
commit 85ec449352
4 changed files with 14 additions and 3 deletions

View File

@ -50,7 +50,7 @@ std::size_t TotalElementCount(const ConstantSubscripts &);
// Validate dimension re-ordering like ORDER in RESHAPE.
// On success, return a vector that can be used as dimOrder in
// ConstantBound::IncrementSubscripts().
// ConstantBounds::IncrementSubscripts().
std::optional<std::vector<int>> ValidateDimensionOrder(
int rank, const std::vector<int> &order);

View File

@ -85,7 +85,7 @@ std::optional<std::vector<int>> ValidateDimensionOrder(
if (dim < 1 || dim > rank || seenDimensions.test(dim - 1)) {
return std::nullopt;
}
dimOrder[dim - 1] = j;
dimOrder[j] = dim - 1;
seenDimensions.set(dim - 1);
}
return dimOrder;

View File

@ -406,7 +406,7 @@ void RTNAME(Reshape)(Descriptor &result, const Descriptor &source,
RUNTIME_CHECK(
terminator, k >= 1 && k <= resultRank && !((values >> k) & 1));
values |= std::uint64_t{1} << k;
dimOrder[k - 1] = j;
dimOrder[j] = k - 1;
}
} else {
for (int j{0}; j < resultRank; ++j) {

View File

@ -63,4 +63,15 @@ module m
.AND.(derived_result%i.EQ.derived_expected_result%i))
logical, parameter :: test_reshape_derived_2 = all(shape(derived_result).EQ.new_shape)
! More complicated ORDER= arguments
integer, parameter :: int3d(2,3,4) = reshape([(j,j=1,24)],shape(int3d))
logical, parameter :: test_int3d = all([int3d] == [(j,j=1,24)])
logical, parameter :: test_reshape_order_1 = all([reshape(int3d, [2,3,4], order=[1,2,3])] == [(j,j=1,24)])
logical, parameter :: test_reshape_order_2 = all([reshape(int3d, [2,4,3], order=[1,3,2])] == [1,2,7,8,13,14,19,20,3,4,9,10,15,16,21,22,5,6,11,12,17,18,23,24])
logical, parameter :: test_reshape_order_3 = all([reshape(int3d, [3,2,4], order=[2,1,3])] == [1,3,5,2,4,6,7,9,11,8,10,12,13,15,17,14,16,18,19,21,23,20,22,24])
logical, parameter :: test_reshape_order_4 = all([reshape(int3d, [3,4,2], order=[2,3,1])] == [1,9,17,2,10,18,3,11,19,4,12,20,5,13,21,6,14,22,7,15,23,8,16,24])
logical, parameter :: test_reshape_order_5 = all([reshape(int3d, [4,2,3], order=[3,1,2])] == [1,4,7,10,13,16,19,22,2,5,8,11,14,17,20,23,3,6,9,12,15,18,21,24])
logical, parameter :: test_reshape_order_6 = all([reshape(int3d, [4,3,2], order=[3,2,1])] == [1,7,13,19,3,9,15,21,5,11,17,23,2,8,14,20,4,10,16,22,6,12,18,24])
end module