diff options
Diffstat (limited to 'flang/runtime/inquiry.cpp')
| -rw-r--r-- | flang/runtime/inquiry.cpp | 38 |
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 |
