Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions flang/include/flang/Runtime/inquiry.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ extern "C" {
std::int64_t RTDECL(LboundDim)(const Descriptor &array, int dim,
const char *sourceFile = nullptr, int line = 0);

void RTDECL(Lbound)(void *result, const Descriptor &array, int kind,
const char *sourceFile = nullptr, int line = 0);

void RTDECL(Shape)(void *result, const Descriptor &array, int kind);

std::int64_t RTDECL(Size)(
Expand Down
11 changes: 11 additions & 0 deletions flang/runtime/inquiry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,5 +95,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
38 changes: 37 additions & 1 deletion flang/unittests/Runtime/Inquiry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
using namespace Fortran::runtime;
using Fortran::common::TypeCategory;

TEST(Inquiry, Lbound) {
TEST(Inquiry, LboundDim) {
// ARRAY 1 3 5
// 2 4 6
auto array{MakeArray<TypeCategory::Integer, 4>(
Expand All @@ -26,6 +26,42 @@ TEST(Inquiry, Lbound) {
EXPECT_EQ(RTNAME(LboundDim)(*array, 2, __FILE__, __LINE__), std::int64_t{-1});
}

TEST(Inquiry, Lbound) {
// ARRAY 1 3 5
// 2 4 6
auto array{MakeArray<TypeCategory::Integer, 4>(
std::vector<int>{2, 3}, std::vector<std::int32_t>{1, 2, 3, 4, 5, 6})};
array->GetDimension(0).SetLowerBound(0);
array->GetDimension(1).SetLowerBound(-1);

// LBOUND(ARRAY, KIND=1)
auto int8Result{
MakeArray<TypeCategory::Integer, 1>(std::vector<int>{array->rank()},
std::vector<std::int8_t>(array->rank(), 0))};
RTNAME(Lbound)
(int8Result->raw().base_addr, *array, /*KIND=*/1, __FILE__, __LINE__);
EXPECT_EQ(*int8Result->ZeroBasedIndexedElement<std::int8_t>(0), 0);
EXPECT_EQ(*int8Result->ZeroBasedIndexedElement<std::int8_t>(1), -1);

// LBOUND(ARRAY, KIND=4)
auto int32Result{
MakeArray<TypeCategory::Integer, 4>(std::vector<int>{array->rank()},
std::vector<std::int32_t>(array->rank(), 0))};
RTNAME(Lbound)
(int32Result->raw().base_addr, *array, /*KIND=*/4, __FILE__, __LINE__);
EXPECT_EQ(*int32Result->ZeroBasedIndexedElement<std::int32_t>(0), 0);
EXPECT_EQ(*int32Result->ZeroBasedIndexedElement<std::int32_t>(1), -1);

// LBOUND(ARRAY, KIND=8)
auto int64Result{
MakeArray<TypeCategory::Integer, 8>(std::vector<int>{array->rank()},
std::vector<std::int64_t>(array->rank(), 0))};
RTNAME(Lbound)
(int64Result->raw().base_addr, *array, /*KIND=*/8, __FILE__, __LINE__);
EXPECT_EQ(*int64Result->ZeroBasedIndexedElement<std::int64_t>(0), 0);
EXPECT_EQ(*int64Result->ZeroBasedIndexedElement<std::int64_t>(1), -1);
}

TEST(Inquiry, Ubound) {
// ARRAY 1 3 5
// 2 4 6
Expand Down