From 10f25edae251d1e834b1283ca23f02a375c7f60b Mon Sep 17 00:00:00 2001 From: Jean Perier Date: Fri, 7 Jun 2024 14:46:27 -0700 Subject: [PATCH 1/2] [flang][runtime] add LBOUND API for assumed-rank arrays --- flang/include/flang/Runtime/inquiry.h | 3 +++ flang/runtime/inquiry.cpp | 11 ++++++++ flang/unittests/Runtime/Inquiry.cpp | 38 ++++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/flang/include/flang/Runtime/inquiry.h b/flang/include/flang/Runtime/inquiry.h index 7161d1e41c4bb..3c53347132688 100644 --- a/flang/include/flang/Runtime/inquiry.h +++ b/flang/include/flang/Runtime/inquiry.h @@ -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)( diff --git a/flang/runtime/inquiry.cpp b/flang/runtime/inquiry.cpp index ea114174de7fd..faf0f0baa005c 100644 --- a/flang/runtime/inquiry.cpp +++ b/flang/runtime/inquiry.cpp @@ -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( + kind, terminator, result, i, dimension.LowerBound()); + } +} + } // extern "C" } // namespace Fortran::runtime diff --git a/flang/unittests/Runtime/Inquiry.cpp b/flang/unittests/Runtime/Inquiry.cpp index 665a930ee4ff9..53672295f96ba 100644 --- a/flang/unittests/Runtime/Inquiry.cpp +++ b/flang/unittests/Runtime/Inquiry.cpp @@ -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( @@ -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( + std::vector{2, 3}, std::vector{1, 2, 3, 4, 5, 6})}; + array->GetDimension(0).SetLowerBound(0); + array->GetDimension(1).SetLowerBound(-1); + + // LBOUND(ARRAY, KIND=1) + auto int8Result{ + MakeArray(std::vector{array->rank()}, + std::vector(array->rank(), 0))}; + RTNAME(Lbound) + (int8Result->raw().base_addr, *array, /*KIND=*/1, __FILE__, __LINE__); + EXPECT_EQ(*int8Result->ZeroBasedIndexedElement(0), 0); + EXPECT_EQ(*int8Result->ZeroBasedIndexedElement(1), -1); + + // LBOUND(ARRAY, KIND=4) + auto int32Result{ + MakeArray(std::vector{array->rank()}, + std::vector(array->rank(), 0))}; + RTNAME(Lbound) + (int32Result->raw().base_addr, *array, /*KIND=*/4, __FILE__, __LINE__); + EXPECT_EQ(*int32Result->ZeroBasedIndexedElement(0), 0); + EXPECT_EQ(*int32Result->ZeroBasedIndexedElement(1), -1); + + // LBOUND(ARRAY, KIND=8) + auto int64Result{ + MakeArray(std::vector{array->rank()}, + std::vector(array->rank(), 0))}; + RTNAME(Lbound) + (int64Result->raw().base_addr, *array, /*KIND=*/8, __FILE__, __LINE__); + EXPECT_EQ(*int64Result->ZeroBasedIndexedElement(0), 0); + EXPECT_EQ(*int64Result->ZeroBasedIndexedElement(1), -1); +} + TEST(Inquiry, Ubound) { // ARRAY 1 3 5 // 2 4 6 From 0d677f070f54600b1e7aef7b00904f8caa69c219 Mon Sep 17 00:00:00 2001 From: jeanPerier Date: Mon, 10 Jun 2024 10:14:31 +0200 Subject: [PATCH 2/2] Update flang/include/flang/Runtime/inquiry.h remove extra line from merge commit --- flang/include/flang/Runtime/inquiry.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/flang/include/flang/Runtime/inquiry.h b/flang/include/flang/Runtime/inquiry.h index 5de26ae4d1130..dde6e722ad6e9 100644 --- a/flang/include/flang/Runtime/inquiry.h +++ b/flang/include/flang/Runtime/inquiry.h @@ -29,8 +29,6 @@ void RTDECL(Lbound)(void *result, const Descriptor &array, int kind, void RTDECL(Shape)(void *result, const Descriptor &array, int kind, const char *sourceFile = nullptr, int line = 0); - - std::int64_t RTDECL(Size)( const Descriptor &array, const char *sourceFile = nullptr, int line = 0);