diff options
Diffstat (limited to 'flang/runtime/transformational.cpp')
-rw-r--r-- | flang/runtime/transformational.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/flang/runtime/transformational.cpp b/flang/runtime/transformational.cpp index 79d1373f79a5..46cf2ec9b732 100644 --- a/flang/runtime/transformational.cpp +++ b/flang/runtime/transformational.cpp @@ -377,7 +377,9 @@ void RTNAME(Reshape)(Descriptor &result, const Descriptor &source, for (SubscriptValue j{0}; j < resultRank; ++j, ++shapeSubscript) { resultExtent[j] = GetInt64( shape.Element<char>(&shapeSubscript), shapeElementBytes, terminator); - RUNTIME_CHECK(terminator, resultExtent[j] >= 0); + if (resultExtent[j] < 0) + terminator.Crash( + "RESHAPE: bad value for SHAPE(%d)=%d", j + 1, resultExtent[j]); resultElements *= resultExtent[j]; } @@ -387,7 +389,9 @@ void RTNAME(Reshape)(Descriptor &result, const Descriptor &source, std::size_t sourceElements{source.Elements()}; std::size_t padElements{pad ? pad->Elements() : 0}; if (resultElements > sourceElements) { - RUNTIME_CHECK(terminator, padElements > 0); + if (padElements <= 0) + terminator.Crash("RESHAPE: not eough elements, need %d but only have %d", + resultElements, sourceElements); RUNTIME_CHECK(terminator, pad->ElementBytes() == elementBytes); } @@ -397,15 +401,18 @@ void RTNAME(Reshape)(Descriptor &result, const Descriptor &source, if (order) { RUNTIME_CHECK(terminator, order->rank() == 1); RUNTIME_CHECK(terminator, order->type().IsInteger()); - RUNTIME_CHECK(terminator, order->GetDimension(0).Extent() == resultRank); + if (order->GetDimension(0).Extent() != resultRank) + terminator.Crash("RESHAPE: the extent of ORDER (%d) must match the rank" + " of the SHAPE (%d)", + order->GetDimension(0).Extent(), resultRank); std::uint64_t values{0}; SubscriptValue orderSubscript{order->GetDimension(0).LowerBound()}; std::size_t orderElementBytes{order->ElementBytes()}; for (SubscriptValue j{0}; j < resultRank; ++j, ++orderSubscript) { auto k{GetInt64(order->Element<char>(&orderSubscript), orderElementBytes, terminator)}; - RUNTIME_CHECK( - terminator, k >= 1 && k <= resultRank && !((values >> k) & 1)); + if (k < 1 || k > resultRank || ((values >> k) & 1)) + terminator.Crash("RESHAPE: bad value for ORDER element (%d)", k); values |= std::uint64_t{1} << k; dimOrder[j] = k - 1; } |