diff --git a/flang/include/flang/Evaluate/constant.h b/flang/include/flang/Evaluate/constant.h index 89b98f389b62..34453d5a2370 100644 --- a/flang/include/flang/Evaluate/constant.h +++ b/flang/include/flang/Evaluate/constant.h @@ -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> ValidateDimensionOrder( int rank, const std::vector &order); diff --git a/flang/lib/Evaluate/constant.cpp b/flang/lib/Evaluate/constant.cpp index 01f5657360eb..efc02316d92d 100644 --- a/flang/lib/Evaluate/constant.cpp +++ b/flang/lib/Evaluate/constant.cpp @@ -85,7 +85,7 @@ std::optional> 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; diff --git a/flang/runtime/transformational.cpp b/flang/runtime/transformational.cpp index 4f5291b585f2..42381ee097dc 100644 --- a/flang/runtime/transformational.cpp +++ b/flang/runtime/transformational.cpp @@ -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) { diff --git a/flang/test/Evaluate/folding06.f90 b/flang/test/Evaluate/folding06.f90 index 4393b3b02f5c..4dccedd931e5 100644 --- a/flang/test/Evaluate/folding06.f90 +++ b/flang/test/Evaluate/folding06.f90 @@ -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