summaryrefslogtreecommitdiffstats
path: root/flang/runtime/transformational.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/runtime/transformational.cpp')
-rw-r--r--flang/runtime/transformational.cpp17
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;
}