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