diff options
Diffstat (limited to 'flang/unittests/RuntimeGTest/MiscIntrinsic.cpp')
-rw-r--r-- | flang/unittests/RuntimeGTest/MiscIntrinsic.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/flang/unittests/RuntimeGTest/MiscIntrinsic.cpp b/flang/unittests/RuntimeGTest/MiscIntrinsic.cpp new file mode 100644 index 000000000000..62213d01021e --- /dev/null +++ b/flang/unittests/RuntimeGTest/MiscIntrinsic.cpp @@ -0,0 +1,70 @@ +//===-- flang/unittests/RuntimeGTest/MiscIntrinsic.cpp ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "gtest/gtest.h" +#include "tools.h" +#include "../../runtime/allocatable.h" +#include "../../runtime/cpp-type.h" +#include "../../runtime/descriptor.h" +#include "../../runtime/misc-intrinsic.h" + +using namespace Fortran::runtime; + +// TRANSFER examples from Fortran 2018 + +TEST(MiscIntrinsic, TransferScalar) { + StaticDescriptor<2, true, 2> staticDesc[2]; + auto &result{staticDesc[0].descriptor()}; + auto source{MakeArray<TypeCategory::Integer, 4>( + std::vector<int>{}, std::vector<std::int32_t>{1082130432})}; + auto &mold{staticDesc[1].descriptor()}; + mold.Establish(TypeCategory::Real, 4, nullptr, 0); + RTNAME(Transfer)(result, *source, mold, __FILE__, __LINE__); + EXPECT_EQ(result.rank(), 0); + EXPECT_EQ(result.type().raw(), (TypeCode{TypeCategory::Real, 4}.raw())); + EXPECT_EQ(*result.OffsetElement<float>(), 4.0); + result.Destroy(); +} + +TEST(MiscIntrinsic, TransferMold) { + StaticDescriptor<2, true, 2> staticDesc[2]; + auto &result{staticDesc[0].descriptor()}; + auto source{MakeArray<TypeCategory::Real, 4>( + std::vector<int>{3}, std::vector<float>{1.1F, 2.2F, 3.3F})}; + auto &mold{staticDesc[1].descriptor()}; + SubscriptValue extent[1]{1}; + mold.Establish(TypeCategory::Complex, 4, nullptr, 1, extent); + RTNAME(Transfer)(result, *source, mold, __FILE__, __LINE__); + EXPECT_EQ(result.rank(), 1); + EXPECT_EQ(result.GetDimension(0).LowerBound(), 1); + EXPECT_EQ(result.GetDimension(0).Extent(), 2); + EXPECT_EQ(result.type().raw(), (TypeCode{TypeCategory::Complex, 4}.raw())); + EXPECT_EQ(result.OffsetElement<float>()[0], 1.1F); + EXPECT_EQ(result.OffsetElement<float>()[1], 2.2F); + EXPECT_EQ(result.OffsetElement<float>()[2], 3.3F); + EXPECT_EQ(result.OffsetElement<float>()[3], 0.0F); + result.Destroy(); +} + +TEST(MiscIntrinsic, TransferSize) { + StaticDescriptor<2, true, 2> staticDesc[2]; + auto &result{staticDesc[0].descriptor()}; + auto source{MakeArray<TypeCategory::Real, 4>( + std::vector<int>{3}, std::vector<float>{1.1F, 2.2F, 3.3F})}; + auto &mold{staticDesc[1].descriptor()}; + SubscriptValue extent[1]{1}; + mold.Establish(TypeCategory::Complex, 4, nullptr, 1, extent); + RTNAME(TransferSize)(result, *source, mold, __FILE__, __LINE__, 1); + EXPECT_EQ(result.rank(), 1); + EXPECT_EQ(result.GetDimension(0).LowerBound(), 1); + EXPECT_EQ(result.GetDimension(0).Extent(), 1); + EXPECT_EQ(result.type().raw(), (TypeCode{TypeCategory::Complex, 4}.raw())); + EXPECT_EQ(result.OffsetElement<float>()[0], 1.1F); + EXPECT_EQ(result.OffsetElement<float>()[1], 2.2F); + result.Destroy(); +} |