1//===-- flang/unittests/Runtime/Inquiry.cpp -------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "flang/Runtime/inquiry.h"
10#include "gtest/gtest.h"
11#include "tools.h"
12#include "flang/Runtime/type-code.h"
13
14using namespace Fortran::runtime;
15using Fortran::common::TypeCategory;
16
17TEST(Inquiry, Lbound) {
18 // ARRAY 1 3 5
19 // 2 4 6
20 auto array{MakeArray<TypeCategory::Integer, 4>(
21 std::vector<int>{2, 3}, std::vector<std::int32_t>{1, 2, 3, 4, 5, 6})};
22 array->GetDimension(0).SetLowerBound(0);
23 array->GetDimension(1).SetLowerBound(-1);
24
25 EXPECT_EQ(RTNAME(LboundDim)(*array, 1, __FILE__, __LINE__), std::int64_t{0});
26 EXPECT_EQ(RTNAME(LboundDim)(*array, 2, __FILE__, __LINE__), std::int64_t{-1});
27}
28
29TEST(Inquiry, Ubound) {
30 // ARRAY 1 3 5
31 // 2 4 6
32 auto array{MakeArray<TypeCategory::Integer, 4>(
33 std::vector<int>{2, 3}, std::vector<std::int32_t>{1, 2, 3, 4, 5, 6})};
34 array->GetDimension(0).SetLowerBound(1000);
35 array->GetDimension(1).SetLowerBound(1);
36 StaticDescriptor<2, true> statDesc;
37
38 int intValue{1};
39 SubscriptValue extent[]{2};
40 Descriptor &result{statDesc.descriptor()};
41 result.Establish(TypeCategory::Integer, /*KIND=*/4,
42 static_cast<void *>(&intValue), 1, extent, CFI_attribute_pointer);
43 RTNAME(Ubound)(result, *array, /*KIND=*/4, __FILE__, __LINE__);
44 EXPECT_EQ(result.rank(), 1);
45 EXPECT_EQ(result.type().raw(), (TypeCode{TypeCategory::Integer, 4}.raw()));
46 // The lower bound of UBOUND's result array is always 1
47 EXPECT_EQ(result.GetDimension(0).LowerBound(), 1);
48 EXPECT_EQ(result.GetDimension(0).Extent(), 2);
49 EXPECT_EQ(*result.ZeroBasedIndexedElement<std::int32_t>(0), 1001);
50 EXPECT_EQ(*result.ZeroBasedIndexedElement<std::int32_t>(1), 3);
51 result.Destroy();
52
53 result = statDesc.descriptor();
54 result.Establish(TypeCategory::Integer, /*KIND=*/1,
55 static_cast<void *>(&intValue), 1, extent, CFI_attribute_pointer);
56 RTNAME(Ubound)(result, *array, /*KIND=*/1, __FILE__, __LINE__);
57 EXPECT_EQ(result.rank(), 1);
58 EXPECT_EQ(result.type().raw(), (TypeCode{TypeCategory::Integer, 1}.raw()));
59 // The lower bound of UBOUND's result array is always 1
60 EXPECT_EQ(result.GetDimension(0).LowerBound(), 1);
61 EXPECT_EQ(result.GetDimension(0).Extent(), 2);
62 EXPECT_EQ(*result.ZeroBasedIndexedElement<std::int8_t>(0), -23);
63 EXPECT_EQ(*result.ZeroBasedIndexedElement<std::int8_t>(1), 3);
64 result.Destroy();
65}
66
67TEST(Inquiry, Size) {
68 // ARRAY 1 3 5
69 // 2 4 6
70 auto array{MakeArray<TypeCategory::Integer, 4>(
71 std::vector<int>{2, 3}, std::vector<std::int32_t>{1, 2, 3, 4, 5, 6})};
72 array->GetDimension(0).SetLowerBound(0); // shouldn't matter
73 array->GetDimension(1).SetLowerBound(-1);
74
75 EXPECT_EQ(RTNAME(SizeDim)(*array, 1, __FILE__, __LINE__), std::int64_t{2});
76 EXPECT_EQ(RTNAME(SizeDim)(*array, 2, __FILE__, __LINE__), std::int64_t{3});
77 EXPECT_EQ(RTNAME(Size)(*array, __FILE__, __LINE__), std::int64_t{6});
78}
79

source code of flang/unittests/Runtime/Inquiry.cpp