summaryrefslogtreecommitdiff
path: root/flang/runtime/inquiry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/runtime/inquiry.cpp')
-rw-r--r--flang/runtime/inquiry.cpp38
1 files changed, 18 insertions, 20 deletions
diff --git a/flang/runtime/inquiry.cpp b/flang/runtime/inquiry.cpp
index ea114174de7f..9fbcaa96fa3c 100644
--- a/flang/runtime/inquiry.cpp
+++ b/flang/runtime/inquiry.cpp
@@ -39,28 +39,14 @@ std::int64_t RTDEF(LboundDim)(
return static_cast<std::int64_t>(dimension.LowerBound());
}
-void RTDEF(Ubound)(Descriptor &result, const Descriptor &array, int kind,
+void RTDEF(Ubound)(void *result, const Descriptor &array, int kind,
const char *sourceFile, int line) {
- SubscriptValue extent[1]{array.rank()};
- result.Establish(TypeCategory::Integer, kind, nullptr, 1, extent,
- CFI_attribute_allocatable);
- // The array returned by UBOUND has a lower bound of 1 and an extent equal to
- // the rank of its input array.
- result.GetDimension(0).SetBounds(1, array.rank());
Terminator terminator{sourceFile, line};
- if (int stat{result.Allocate()}) {
- terminator.Crash(
- "UBOUND: could not allocate memory for result; STAT=%d", stat);
- }
- auto storeIntegerAt = [&](std::size_t atIndex, std::int64_t value) {
- Fortran::runtime::ApplyIntegerKind<StoreIntegerAt, void>(
- kind, terminator, result, atIndex, value);
- };
-
- INTERNAL_CHECK(result.rank() == 1);
+ INTERNAL_CHECK(array.rank() <= common::maxRank);
for (SubscriptValue i{0}; i < array.rank(); ++i) {
const Dimension &dimension{array.GetDimension(i)};
- storeIntegerAt(i, dimension.UpperBound());
+ Fortran::runtime::ApplyIntegerKind<RawStoreIntegerAt, void>(
+ kind, terminator, result, i, dimension.UpperBound());
}
}
@@ -85,8 +71,9 @@ std::int64_t RTDEF(SizeDim)(
return static_cast<std::int64_t>(dimension.Extent());
}
-void RTDEF(Shape)(void *result, const Descriptor &array, int kind) {
- Terminator terminator{__FILE__, __LINE__};
+void RTDEF(Shape)(void *result, const Descriptor &array, int kind,
+ const char *sourceFile, int line) {
+ Terminator terminator{sourceFile, line};
INTERNAL_CHECK(array.rank() <= common::maxRank);
for (SubscriptValue i{0}; i < array.rank(); ++i) {
const Dimension &dimension{array.GetDimension(i)};
@@ -95,5 +82,16 @@ void RTDEF(Shape)(void *result, const Descriptor &array, int kind) {
}
}
+void RTDEF(Lbound)(void *result, const Descriptor &array, int kind,
+ const char *sourceFile, int line) {
+ Terminator terminator{sourceFile, line};
+ INTERNAL_CHECK(array.rank() <= common::maxRank);
+ for (SubscriptValue i{0}; i < array.rank(); ++i) {
+ const Dimension &dimension{array.GetDimension(i)};
+ Fortran::runtime::ApplyIntegerKind<RawStoreIntegerAt, void>(
+ kind, terminator, result, i, dimension.LowerBound());
+ }
+}
+
} // extern "C"
} // namespace Fortran::runtime