| //===-- flang/unittests/Runtime/Pointer.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 "flang/Runtime/derived-api.h" |
| #include "flang/Runtime/descriptor.h" |
| |
| using namespace Fortran::runtime; |
| |
| TEST(Derived, SameTypeAs) { |
| // INTEGER, POINTER :: i1 |
| auto i1{ |
| Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Integer, 4}, 4, |
| nullptr, 0, nullptr, CFI_attribute_pointer)}; |
| EXPECT_TRUE(RTNAME(SameTypeAs)(*i1, *i1)); |
| |
| auto r1{Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Real, 4}, |
| 4, nullptr, 0, nullptr, CFI_attribute_pointer)}; |
| EXPECT_FALSE(RTNAME(SameTypeAs)(*i1, *r1)); |
| |
| // CLASS(*), ALLOCATABLE :: a1 |
| auto a1{Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Real, 4}, |
| 4, nullptr, 0, nullptr, CFI_attribute_allocatable)}; |
| a1->raw().elem_len = 0; |
| a1->raw().type = CFI_type_other; |
| |
| EXPECT_FALSE(RTNAME(SameTypeAs)(*i1, *a1)); |
| EXPECT_FALSE(RTNAME(SameTypeAs)(*a1, *i1)); |
| EXPECT_FALSE(RTNAME(SameTypeAs)(*r1, *a1)); |
| |
| // CLASS(*), ALLOCATABLE :: a2 |
| auto a2{Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Real, 4}, |
| 4, nullptr, 0, nullptr, CFI_attribute_allocatable)}; |
| a2->raw().elem_len = 0; |
| a2->raw().type = CFI_type_other; |
| |
| EXPECT_FALSE(RTNAME(SameTypeAs)(*a1, *a2)); |
| |
| // CLASS(*), POINTER :: p1 |
| auto p1{Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Real, 4}, |
| 4, nullptr, 0, nullptr, CFI_attribute_pointer)}; |
| p1->raw().elem_len = 0; |
| p1->raw().type = CFI_type_other; |
| |
| EXPECT_FALSE(RTNAME(SameTypeAs)(*i1, *p1)); |
| EXPECT_FALSE(RTNAME(SameTypeAs)(*p1, *i1)); |
| } |
| |
| TEST(Derived, ExtendsTypeOf) { |
| // CLASS(*), POINTER :: i1 - INTEGER dynamic type |
| auto i1{ |
| Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Integer, 4}, 4, |
| nullptr, 0, nullptr, CFI_attribute_pointer)}; |
| EXPECT_TRUE(RTNAME(ExtendsTypeOf)(*i1, *i1)); |
| |
| // CLASS(*), POINTER :: r1 - REAL dynamic type |
| auto r1{Descriptor::Create(TypeCode{Fortran::common::TypeCategory::Real, 4}, |
| 4, nullptr, 0, nullptr, CFI_attribute_pointer)}; |
| EXPECT_FALSE(RTNAME(SameTypeAs)(*i1, *r1)); |
| } |