summaryrefslogtreecommitdiff
path: root/flang/unittests
diff options
context:
space:
mode:
authorDavid Truby <david.truby@arm.com>2023-01-09 15:13:58 +0000
committerDavid Truby <david.truby@arm.com>2023-01-18 15:37:51 +0000
commite4d9a5e616f38fca05200a766711ba9b1605f57f (patch)
treecf634bb6f5577831568818685f5258b7dc96b579 /flang/unittests
parent1720ec6da040729f17dfc685f853b9c15658fbc6 (diff)
downloadllvm-e4d9a5e616f38fca05200a766711ba9b1605f57f.tar.gz
[flang] Add implementation of move_alloc to the runtime
This patch adds a move_alloc implementation to the flang runtime. Most of the checks required by the standard for move_alloc are done by semenatic analysis; these checks are not replicated here. Differential Revision: https://reviews.llvm.org/D141286
Diffstat (limited to 'flang/unittests')
-rw-r--r--flang/unittests/Runtime/Allocatable.cpp80
-rw-r--r--flang/unittests/Runtime/CMakeLists.txt1
2 files changed, 81 insertions, 0 deletions
diff --git a/flang/unittests/Runtime/Allocatable.cpp b/flang/unittests/Runtime/Allocatable.cpp
new file mode 100644
index 000000000000..bba501e40a71
--- /dev/null
+++ b/flang/unittests/Runtime/Allocatable.cpp
@@ -0,0 +1,80 @@
+//===-- flang/unittests/Runtime/Allocatable.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 "flang/Runtime/allocatable.h"
+#include "gtest/gtest.h"
+#include "tools.h"
+#include "flang/Common/Fortran.h"
+#include "flang/ISO_Fortran_binding.h"
+#include "flang/Optimizer/Builder/FIRBuilder.h"
+#include "flang/Optimizer/Support/InitFIR.h"
+#include "flang/Optimizer/Support/KindMapping.h"
+#include "flang/Runtime/descriptor.h"
+#include "flang/Runtime/memory.h"
+
+using namespace Fortran::runtime;
+
+static OwningPtr<Descriptor> createAllocatable(
+ Fortran::common::TypeCategory tc, int kind, int rank = 1) {
+ return Descriptor::Create(TypeCode{tc, kind}, kind, nullptr, rank, nullptr,
+ CFI_attribute_allocatable);
+}
+
+TEST(AllocatableTest, MoveAlloc) {
+ using Fortran::common::TypeCategory;
+ // INTEGER(4), ALLOCATABLE :: a(:)
+ auto a{createAllocatable(TypeCategory::Integer, 4)};
+ // INTEGER(4), ALLOCATABLE :: b(:)
+ auto b{createAllocatable(TypeCategory::Integer, 4)};
+ // ALLOCATE(a(20))
+ a->GetDimension(0).SetBounds(1, 20);
+ a->Allocate();
+
+ EXPECT_TRUE(a->IsAllocated());
+ EXPECT_FALSE(b->IsAllocated());
+
+ // Simple move_alloc
+ RTNAME(MoveAlloc)(*b, *a, false, nullptr, __FILE__, __LINE__);
+ EXPECT_FALSE(a->IsAllocated());
+ EXPECT_TRUE(b->IsAllocated());
+
+ // move_alloc with stat
+ std::int32_t stat{
+ RTNAME(MoveAlloc)(*a, *b, true, nullptr, __FILE__, __LINE__)};
+ EXPECT_TRUE(a->IsAllocated());
+ EXPECT_FALSE(b->IsAllocated());
+ EXPECT_EQ(stat, 0);
+
+ // move_alloc with errMsg
+ auto errMsg{Descriptor::Create(
+ sizeof(char), 64, nullptr, 0, nullptr, CFI_attribute_allocatable)};
+ errMsg->Allocate();
+ RTNAME(MoveAlloc)(*b, *a, false, errMsg.get(), __FILE__, __LINE__);
+ EXPECT_FALSE(a->IsAllocated());
+ EXPECT_TRUE(b->IsAllocated());
+
+ // move_alloc with stat and errMsg
+ stat = RTNAME(MoveAlloc)(*a, *b, true, errMsg.get(), __FILE__, __LINE__);
+ EXPECT_TRUE(a->IsAllocated());
+ EXPECT_FALSE(b->IsAllocated());
+ EXPECT_EQ(stat, 0);
+
+ // move_alloc with the same deallocated array
+ stat = RTNAME(MoveAlloc)(*b, *b, true, errMsg.get(), __FILE__, __LINE__);
+ EXPECT_FALSE(b->IsAllocated());
+ EXPECT_EQ(stat, 0);
+
+ // move_alloc with the same allocated array should fail
+ stat = RTNAME(MoveAlloc)(*a, *a, true, errMsg.get(), __FILE__, __LINE__);
+ EXPECT_EQ(stat, 18);
+ std::string_view errStr{errMsg->OffsetElement(), errMsg->ElementBytes()};
+ auto trim_pos = errStr.find_last_not_of(' ');
+ if (trim_pos != errStr.npos)
+ errStr.remove_suffix(errStr.size() - trim_pos - 1);
+ EXPECT_EQ(errStr, "Invalid descriptor");
+}
diff --git a/flang/unittests/Runtime/CMakeLists.txt b/flang/unittests/Runtime/CMakeLists.txt
index aa4eeccf789c..d7fc27d6b01f 100644
--- a/flang/unittests/Runtime/CMakeLists.txt
+++ b/flang/unittests/Runtime/CMakeLists.txt
@@ -1,4 +1,5 @@
add_flang_unittest(FlangRuntimeTests
+ Allocatable.cpp
BufferTest.cpp
CharacterTest.cpp
CommandTest.cpp