xref: /llvm-project/flang/unittests/Runtime/Derived.cpp (revision ffc67bb3602a6a9a4f886af362e1f2d7c9821570)
1*ffc67bb3SDavid Spickett //===-- flang/unittests/Runtime/Pointer.cpp--------- -------------*- C++-*-===//
2*ffc67bb3SDavid Spickett //
3*ffc67bb3SDavid Spickett // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*ffc67bb3SDavid Spickett // See https://llvm.org/LICENSE.txt for license information.
5*ffc67bb3SDavid Spickett // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*ffc67bb3SDavid Spickett //
7*ffc67bb3SDavid Spickett //===----------------------------------------------------------------------===//
8*ffc67bb3SDavid Spickett 
9*ffc67bb3SDavid Spickett #include "gtest/gtest.h"
10*ffc67bb3SDavid Spickett #include "tools.h"
11*ffc67bb3SDavid Spickett #include "flang/Runtime/derived-api.h"
12*ffc67bb3SDavid Spickett #include "flang/Runtime/descriptor.h"
13*ffc67bb3SDavid Spickett 
14*ffc67bb3SDavid Spickett using namespace Fortran::runtime;
15*ffc67bb3SDavid Spickett 
TEST(Derived,SameTypeAs)16*ffc67bb3SDavid Spickett TEST(Derived, SameTypeAs) {
17*ffc67bb3SDavid Spickett   // INTEGER, POINTER :: i1
18*ffc67bb3SDavid Spickett   auto i1{
19*ffc67bb3SDavid Spickett       Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Integer, 4}, 4,
20*ffc67bb3SDavid Spickett           nullptr, 0, nullptr, CFI_attribute_pointer)};
21*ffc67bb3SDavid Spickett   EXPECT_TRUE(RTNAME(SameTypeAs)(*i1, *i1));
22*ffc67bb3SDavid Spickett 
23*ffc67bb3SDavid Spickett   auto r1{Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Real, 4},
24*ffc67bb3SDavid Spickett       4, nullptr, 0, nullptr, CFI_attribute_pointer)};
25*ffc67bb3SDavid Spickett   EXPECT_FALSE(RTNAME(SameTypeAs)(*i1, *r1));
26*ffc67bb3SDavid Spickett 
27*ffc67bb3SDavid Spickett   // CLASS(*), ALLOCATABLE :: a1
28*ffc67bb3SDavid Spickett   auto a1{Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Real, 4},
29*ffc67bb3SDavid Spickett       4, nullptr, 0, nullptr, CFI_attribute_allocatable)};
30*ffc67bb3SDavid Spickett   a1->raw().elem_len = 0;
31*ffc67bb3SDavid Spickett   a1->raw().type = CFI_type_other;
32*ffc67bb3SDavid Spickett 
33*ffc67bb3SDavid Spickett   EXPECT_FALSE(RTNAME(SameTypeAs)(*i1, *a1));
34*ffc67bb3SDavid Spickett   EXPECT_FALSE(RTNAME(SameTypeAs)(*a1, *i1));
35*ffc67bb3SDavid Spickett   EXPECT_FALSE(RTNAME(SameTypeAs)(*r1, *a1));
36*ffc67bb3SDavid Spickett 
37*ffc67bb3SDavid Spickett   // CLASS(*), ALLOCATABLE :: a2
38*ffc67bb3SDavid Spickett   auto a2{Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Real, 4},
39*ffc67bb3SDavid Spickett       4, nullptr, 0, nullptr, CFI_attribute_allocatable)};
40*ffc67bb3SDavid Spickett   a2->raw().elem_len = 0;
41*ffc67bb3SDavid Spickett   a2->raw().type = CFI_type_other;
42*ffc67bb3SDavid Spickett 
43*ffc67bb3SDavid Spickett   EXPECT_FALSE(RTNAME(SameTypeAs)(*a1, *a2));
44*ffc67bb3SDavid Spickett 
45*ffc67bb3SDavid Spickett   // CLASS(*), POINTER :: p1
46*ffc67bb3SDavid Spickett   auto p1{Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Real, 4},
47*ffc67bb3SDavid Spickett       4, nullptr, 0, nullptr, CFI_attribute_pointer)};
48*ffc67bb3SDavid Spickett   p1->raw().elem_len = 0;
49*ffc67bb3SDavid Spickett   p1->raw().type = CFI_type_other;
50*ffc67bb3SDavid Spickett 
51*ffc67bb3SDavid Spickett   EXPECT_FALSE(RTNAME(SameTypeAs)(*i1, *p1));
52*ffc67bb3SDavid Spickett   EXPECT_FALSE(RTNAME(SameTypeAs)(*p1, *i1));
53*ffc67bb3SDavid Spickett }
54*ffc67bb3SDavid Spickett 
TEST(Derived,ExtendsTypeOf)55*ffc67bb3SDavid Spickett TEST(Derived, ExtendsTypeOf) {
56*ffc67bb3SDavid Spickett   // CLASS(*), POINTER :: i1 - INTEGER dynamic type
57*ffc67bb3SDavid Spickett   auto i1{
58*ffc67bb3SDavid Spickett       Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Integer, 4}, 4,
59*ffc67bb3SDavid Spickett           nullptr, 0, nullptr, CFI_attribute_pointer)};
60*ffc67bb3SDavid Spickett   EXPECT_TRUE(RTNAME(ExtendsTypeOf)(*i1, *i1));
61*ffc67bb3SDavid Spickett 
62*ffc67bb3SDavid Spickett   // CLASS(*), POINTER :: r1 - REAL dynamic type
63*ffc67bb3SDavid Spickett   auto r1{Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Real, 4},
64*ffc67bb3SDavid Spickett       4, nullptr, 0, nullptr, CFI_attribute_pointer)};
65*ffc67bb3SDavid Spickett   EXPECT_FALSE(RTNAME(SameTypeAs)(*i1, *r1));
66*ffc67bb3SDavid Spickett }
67