xref: /llvm-project/flang/test/Lower/HLFIR/type-info.f90 (revision e45f6e93d0b90e917eff61ac104a673c52ee2322)
1! Test generation of noinit, nofinal, and nodestroy fir.type_info attributes
2! RUN: bbc -emit-hlfir %s -o - | FileCheck %s
3
4module tyinfo
5  type boring_type
6  end type
7
8  type needs_final
9    contains
10      final :: needs_final_final
11  end type
12
13  type needs_init1
14    integer :: i =0
15  end type
16
17  type needs_init_and_destroy
18    integer, allocatable :: x
19  end type
20
21  type needs_all
22    type(needs_final) :: x
23    type(needs_init_and_destroy) :: y
24  end type
25
26  type, extends(needs_final) :: inherits_final
27  end type
28  type, extends(needs_init1) :: inherits_init
29  end type
30  type, extends(needs_init_and_destroy) :: inherits_init_and_destroy
31  end type
32  type, extends(needs_all) :: inherits_all
33  end type
34
35  interface
36    subroutine needs_final_final(x)
37      type(needs_final), intent(inout) :: x
38    end subroutine
39  end interface
40
41  type(boring_type) :: x1
42  type(needs_final) :: x2
43  type(needs_init1) :: x3
44  type(needs_init_and_destroy) :: x4
45  type(needs_all) :: x5
46  type(inherits_final) :: x6
47  type(inherits_init) :: x7
48  type(inherits_init_and_destroy) :: x8
49  type(inherits_all) :: x9
50end module
51
52! CHECK-DAG:  fir.type_info @_QMtyinfoTboring_type noinit nodestroy nofinal : !fir.type<_QMtyinfoTboring_type>
53! CHECK-DAG:  fir.type_info @_QMtyinfoTneeds_final noinit : !fir.type<_QMtyinfoTneeds_final>
54! CHECK-DAG:  fir.type_info @_QMtyinfoTneeds_init1 nodestroy nofinal : !fir.type<_QMtyinfoTneeds_init1{i:i32}>
55! CHECK-DAG:  fir.type_info @_QMtyinfoTneeds_init_and_destroy nofinal : !fir.type<_QMtyinfoTneeds_init_and_destroy{x:!fir.box<!fir.heap<i32>>}>
56! CHECK-DAG:  fir.type_info @_QMtyinfoTneeds_all : !fir.type<_QMtyinfoTneeds_all{x:!fir.type<_QMtyinfoTneeds_final>,y:!fir.type<_QMtyinfoTneeds_init_and_destroy{x:!fir.box<!fir.heap<i32>>}>}>
57! CHECK-DAG:  fir.type_info @_QMtyinfoTinherits_final noinit extends !fir.type<_QMtyinfoTneeds_final> : !fir.type<_QMtyinfoTinherits_final{needs_final:!fir.type<_QMtyinfoTneeds_final>}>
58! CHECK-DAG:  fir.type_info @_QMtyinfoTinherits_init nodestroy nofinal extends !fir.type<_QMtyinfoTneeds_init1{i:i32}> : !fir.type<_QMtyinfoTinherits_init{needs_init1:!fir.type<_QMtyinfoTneeds_init1{i:i32}>}>
59! CHECK-DAG:  fir.type_info @_QMtyinfoTinherits_init_and_destroy nofinal extends !fir.type<_QMtyinfoTneeds_init_and_destroy{x:!fir.box<!fir.heap<i32>>}> : !fir.type<_QMtyinfoTinherits_init_and_destroy{needs_init_and_destroy:!fir.type<_QMtyinfoTneeds_init_and_destroy{x:!fir.box<!fir.heap<i32>>}>}>
60! CHECK-DAG:  fir.type_info @_QMtyinfoTinherits_all extends !fir.type<_QMtyinfoTneeds_all{x:!fir.type<_QMtyinfoTneeds_final>,y:!fir.type<_QMtyinfoTneeds_init_and_destroy{x:!fir.box<!fir.heap<i32>>}>}> : !fir.type<_QMtyinfoTinherits_all{needs_all:!fir.type<_QMtyinfoTneeds_all{x:!fir.type<_QMtyinfoTneeds_final>,y:!fir.type<_QMtyinfoTneeds_init_and_destroy{x:!fir.box<!fir.heap<i32>>}>}>}>
61