89 lines · cpp
1//===-- unittests/Runtime/MiscIntrinsic.cpp ---------------------*- C++ -*-===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "tools.h"10#include "gtest/gtest.h"11#include "flang-rt/runtime/descriptor.h"12#include "flang/Runtime/allocatable.h"13#include "flang/Runtime/cpp-type.h"14#include "flang/Runtime/misc-intrinsic.h"15 16using namespace Fortran::runtime;17 18// TRANSFER examples from Fortran 201819 20TEST(MiscIntrinsic, TransferScalar) {21 StaticDescriptor<2, true, 2> staticDesc[2];22 auto &result{staticDesc[0].descriptor()};23 auto source{MakeArray<TypeCategory::Integer, 4>(24 std::vector<int>{}, std::vector<std::int32_t>{1082130432})};25 auto &mold{staticDesc[1].descriptor()};26 mold.Establish(TypeCategory::Real, 4, nullptr, 0);27 RTNAME(Transfer)(result, *source, mold, __FILE__, __LINE__);28 EXPECT_EQ(result.rank(), 0);29 EXPECT_EQ(result.type().raw(), (TypeCode{TypeCategory::Real, 4}.raw()));30 EXPECT_EQ(*result.OffsetElement<float>(), 4.0);31 result.Destroy();32}33 34TEST(MiscIntrinsic, TransferMold) {35 StaticDescriptor<2, true, 2> staticDesc[2];36 auto &result{staticDesc[0].descriptor()};37 auto source{MakeArray<TypeCategory::Real, 4>(38 std::vector<int>{3}, std::vector<float>{1.1F, 2.2F, 3.3F})};39 auto &mold{staticDesc[1].descriptor()};40 SubscriptValue extent[1]{1};41 mold.Establish(TypeCategory::Complex, 4, nullptr, 1, extent);42 RTNAME(Transfer)(result, *source, mold, __FILE__, __LINE__);43 EXPECT_EQ(result.rank(), 1);44 EXPECT_EQ(result.GetDimension(0).LowerBound(), 1);45 EXPECT_EQ(result.GetDimension(0).Extent(), 2);46 EXPECT_EQ(result.type().raw(), (TypeCode{TypeCategory::Complex, 4}.raw()));47 EXPECT_EQ(result.OffsetElement<float>()[0], 1.1F);48 EXPECT_EQ(result.OffsetElement<float>()[1], 2.2F);49 EXPECT_EQ(result.OffsetElement<float>()[2], 3.3F);50 EXPECT_EQ(result.OffsetElement<float>()[3], 0.0F);51 result.Destroy();52}53 54TEST(MiscIntrinsic, TransferSize) {55 StaticDescriptor<2, true, 2> staticDesc[2];56 auto &result{staticDesc[0].descriptor()};57 auto source{MakeArray<TypeCategory::Real, 4>(58 std::vector<int>{3}, std::vector<float>{1.1F, 2.2F, 3.3F})};59 auto &mold{staticDesc[1].descriptor()};60 SubscriptValue extent[1]{1};61 mold.Establish(TypeCategory::Complex, 4, nullptr, 1, extent);62 RTNAME(TransferSize)(result, *source, mold, __FILE__, __LINE__, 1);63 EXPECT_EQ(result.rank(), 1);64 EXPECT_EQ(result.GetDimension(0).LowerBound(), 1);65 EXPECT_EQ(result.GetDimension(0).Extent(), 1);66 EXPECT_EQ(result.type().raw(), (TypeCode{TypeCategory::Complex, 4}.raw()));67 EXPECT_EQ(result.OffsetElement<float>()[0], 1.1F);68 EXPECT_EQ(result.OffsetElement<float>()[1], 2.2F);69 result.Destroy();70}71TEST(MiscIntrinsic, TransferSizeScalarMold) {72 StaticDescriptor<2, true, 2> staticDesc[2];73 auto &result{staticDesc[0].descriptor()};74 std::complex<float> sourecStorage{1.1F, -2.2F};75 auto source{Descriptor::Create(TypeCategory::Complex, 4,76 reinterpret_cast<void *>(&sourecStorage), 0, nullptr,77 CFI_attribute_pointer)};78 auto &mold{staticDesc[1].descriptor()};79 mold.Establish(TypeCategory::Real, 4, nullptr, 0, nullptr);80 RTNAME(TransferSize)(result, *source, mold, __FILE__, __LINE__, 2);81 EXPECT_EQ(result.rank(), 1);82 EXPECT_EQ(result.GetDimension(0).LowerBound(), 1);83 EXPECT_EQ(result.GetDimension(0).Extent(), 2);84 EXPECT_EQ(result.type().raw(), (TypeCode{TypeCategory::Real, 4}.raw()));85 EXPECT_EQ(result.OffsetElement<float>()[0], 1.1F);86 EXPECT_EQ(result.OffsetElement<float>()[1], -2.2F);87 result.Destroy();88}89