xref: /llvm-project/flang/unittests/Runtime/Support.cpp (revision c25bd6e35134f591ee7dfeb4494df02987106f7e)
12b78c641SjeanPerier //===-- flang/unittests/Runtime/Support.cpp ----------------------*- C++-*-===//
22b78c641SjeanPerier //
32b78c641SjeanPerier // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42b78c641SjeanPerier // See https://llvm.org/LICENSE.txt for license information.
52b78c641SjeanPerier // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62b78c641SjeanPerier //
72b78c641SjeanPerier //===----------------------------------------------------------------------===//
82b78c641SjeanPerier 
92b78c641SjeanPerier #include "flang/Runtime/support.h"
102b78c641SjeanPerier #include "gtest/gtest.h"
112b78c641SjeanPerier #include "tools.h"
122b78c641SjeanPerier #include "flang/Runtime/descriptor.h"
132b78c641SjeanPerier 
142b78c641SjeanPerier using namespace Fortran::runtime;
152b78c641SjeanPerier using Fortran::common::TypeCategory;
162b78c641SjeanPerier TEST(CopyAndUpdateDescriptor, Basic) {
172b78c641SjeanPerier   auto x{MakeArray<TypeCategory::Integer, 4>(
182b78c641SjeanPerier       std::vector<int>{2, 3}, std::vector<std::int32_t>{0, 1, 2, 3, 4, 5})};
192b78c641SjeanPerier   x->GetDimension(0).SetLowerBound(11);
202b78c641SjeanPerier   x->GetDimension(1).SetLowerBound(12);
212b78c641SjeanPerier 
222b78c641SjeanPerier   StaticDescriptor<2, false> statDesc;
232b78c641SjeanPerier   Descriptor &result{statDesc.descriptor()};
242b78c641SjeanPerier 
252b78c641SjeanPerier   RTNAME(CopyAndUpdateDescriptor)
262b78c641SjeanPerier   (result, *x, nullptr, CFI_attribute_pointer, LowerBoundModifier::Preserve);
272b78c641SjeanPerier   ASSERT_EQ(result.rank(), 2);
282b78c641SjeanPerier   EXPECT_EQ(result.raw().base_addr, x->raw().base_addr);
292b78c641SjeanPerier   EXPECT_TRUE(result.IsPointer());
302b78c641SjeanPerier   EXPECT_EQ(result.GetDimension(0).Extent(), x->GetDimension(0).Extent());
312b78c641SjeanPerier   EXPECT_EQ(
322b78c641SjeanPerier       result.GetDimension(0).LowerBound(), x->GetDimension(0).LowerBound());
332b78c641SjeanPerier   EXPECT_EQ(result.GetDimension(1).Extent(), x->GetDimension(1).Extent());
342b78c641SjeanPerier   EXPECT_EQ(
352b78c641SjeanPerier       result.GetDimension(1).LowerBound(), x->GetDimension(1).LowerBound());
362b78c641SjeanPerier 
372b78c641SjeanPerier   RTNAME(CopyAndUpdateDescriptor)
382b78c641SjeanPerier   (result, *x, nullptr, CFI_attribute_allocatable,
392b78c641SjeanPerier       LowerBoundModifier::SetToZeroes);
402b78c641SjeanPerier   ASSERT_EQ(result.rank(), 2);
412b78c641SjeanPerier   EXPECT_EQ(result.raw().base_addr, x->raw().base_addr);
422b78c641SjeanPerier   EXPECT_TRUE(result.IsAllocatable());
432b78c641SjeanPerier   EXPECT_EQ(result.GetDimension(0).Extent(), x->GetDimension(0).Extent());
442b78c641SjeanPerier   EXPECT_EQ(result.GetDimension(0).LowerBound(), 0);
452b78c641SjeanPerier   EXPECT_EQ(result.GetDimension(1).Extent(), x->GetDimension(1).Extent());
462b78c641SjeanPerier   EXPECT_EQ(result.GetDimension(1).LowerBound(), 0);
472b78c641SjeanPerier 
482b78c641SjeanPerier   RTNAME(CopyAndUpdateDescriptor)
492b78c641SjeanPerier   (result, *x, nullptr, CFI_attribute_other, LowerBoundModifier::SetToOnes);
502b78c641SjeanPerier   ASSERT_EQ(result.rank(), 2);
512b78c641SjeanPerier   EXPECT_EQ(result.raw().base_addr, x->raw().base_addr);
522b78c641SjeanPerier   EXPECT_FALSE(result.IsAllocatable());
532b78c641SjeanPerier   EXPECT_FALSE(result.IsPointer());
542b78c641SjeanPerier   EXPECT_EQ(result.GetDimension(0).Extent(), x->GetDimension(0).Extent());
552b78c641SjeanPerier   EXPECT_EQ(result.GetDimension(0).LowerBound(), 1);
562b78c641SjeanPerier   EXPECT_EQ(result.GetDimension(1).Extent(), x->GetDimension(1).Extent());
572b78c641SjeanPerier   EXPECT_EQ(result.GetDimension(1).LowerBound(), 1);
582b78c641SjeanPerier }
59f49d26bcSjeanPerier 
60f49d26bcSjeanPerier TEST(IsAssumedSize, Basic) {
61f49d26bcSjeanPerier   auto x{MakeArray<TypeCategory::Integer, 4>(
62f49d26bcSjeanPerier       std::vector<int>{2, 3}, std::vector<std::int32_t>{0, 1, 2, 3, 4, 5})};
63f49d26bcSjeanPerier   EXPECT_FALSE(RTNAME(IsAssumedSize)(*x));
64f49d26bcSjeanPerier   x->GetDimension(1).SetExtent(-1);
65f49d26bcSjeanPerier   EXPECT_TRUE(RTNAME(IsAssumedSize)(*x));
66f49d26bcSjeanPerier   auto scalar{MakeArray<TypeCategory::Integer, 4>(
67f49d26bcSjeanPerier       std::vector<int>{}, std::vector<std::int32_t>{0})};
68f49d26bcSjeanPerier   EXPECT_FALSE(RTNAME(IsAssumedSize)(*scalar));
69f49d26bcSjeanPerier }
70*c25bd6e3Smacurtis-amd 
71*c25bd6e3Smacurtis-amd TEST(DescriptorBytesFor, Basic) {
72*c25bd6e3Smacurtis-amd   for (size_t i = 0; i < Fortran::common::TypeCategory_enumSize; ++i) {
73*c25bd6e3Smacurtis-amd     auto tc{static_cast<TypeCategory>(i)};
74*c25bd6e3Smacurtis-amd     if (tc == TypeCategory::Derived)
75*c25bd6e3Smacurtis-amd       continue;
76*c25bd6e3Smacurtis-amd 
77*c25bd6e3Smacurtis-amd     auto b{Descriptor::BytesFor(tc, 4)};
78*c25bd6e3Smacurtis-amd     EXPECT_GT(b, 0U);
79*c25bd6e3Smacurtis-amd   }
80*c25bd6e3Smacurtis-amd }
81