xref: /llvm-project/flang/test/Lower/pointer-association-polymorphic.f90 (revision 12ba74e181bd6641b532e271f3bfabf53066b1c0)
1d0829fbdSjeanPerier! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
2880b37f1SValentin Clement
3880b37f1SValentin Clementmodule poly
4880b37f1SValentin Clement  type p1
5880b37f1SValentin Clement    integer :: a
6880b37f1SValentin Clement    integer :: b
7880b37f1SValentin Clement  contains
8880b37f1SValentin Clement    procedure :: proc => proc_p1
9880b37f1SValentin Clement  end type
10880b37f1SValentin Clement
11880b37f1SValentin Clement  type, extends(p1) :: p2
12880b37f1SValentin Clement    integer :: c
13880b37f1SValentin Clement  contains
14880b37f1SValentin Clement    procedure :: proc => proc_p2
15880b37f1SValentin Clement  end type
16880b37f1SValentin Clement
17880b37f1SValentin Clementcontains
18880b37f1SValentin Clement
19880b37f1SValentin Clement  subroutine proc_p1(this)
20880b37f1SValentin Clement    class(p1) :: this
21880b37f1SValentin Clement    print*, 'call proc2_p1'
22880b37f1SValentin Clement  end subroutine
23880b37f1SValentin Clement
24880b37f1SValentin Clement  subroutine proc_p2(this)
25880b37f1SValentin Clement    class(p2) :: this
26880b37f1SValentin Clement    print*, 'call proc2_p2'
27880b37f1SValentin Clement  end subroutine
28880b37f1SValentin Clement
29880b37f1SValentin Clement
30880b37f1SValentin Clement! ------------------------------------------------------------------------------
31880b37f1SValentin Clement! Test lowering of ALLOCATE statement for polymoprhic pointer
32880b37f1SValentin Clement! ------------------------------------------------------------------------------
33880b37f1SValentin Clement
34880b37f1SValentin Clement  subroutine test_pointer()
35880b37f1SValentin Clement    class(p1), pointer :: p
36880b37f1SValentin Clement    class(p1), allocatable, target :: c1, c2
37880b37f1SValentin Clement    class(p1), pointer :: pa(:)
38880b37f1SValentin Clement    class(p1), allocatable, target, dimension(:) :: c3, c4
39880b37f1SValentin Clement    integer :: i
40880b37f1SValentin Clement
41880b37f1SValentin Clement    allocate(p1::c1)
42880b37f1SValentin Clement    allocate(p2::c2)
43880b37f1SValentin Clement    allocate(p1::c3(2))
44880b37f1SValentin Clement    allocate(p2::c4(4))
45880b37f1SValentin Clement
46880b37f1SValentin Clement    p => c1
47880b37f1SValentin Clement    call p%proc()
48880b37f1SValentin Clement
49880b37f1SValentin Clement    p => c2
50880b37f1SValentin Clement    call p%proc()
51880b37f1SValentin Clement
52880b37f1SValentin Clement    p => c3(1)
53880b37f1SValentin Clement    call p%proc()
54880b37f1SValentin Clement
55880b37f1SValentin Clement    p => c4(2)
56880b37f1SValentin Clement    call p%proc()
57880b37f1SValentin Clement
58880b37f1SValentin Clement    pa => c3
59880b37f1SValentin Clement    do i = 1, 2
60880b37f1SValentin Clement      call pa(i)%proc()
61880b37f1SValentin Clement    end do
62880b37f1SValentin Clement
63880b37f1SValentin Clement    pa => c4
64880b37f1SValentin Clement    do i = 1, 4
65880b37f1SValentin Clement      call pa(i)%proc()
66880b37f1SValentin Clement    end do
67880b37f1SValentin Clement
68880b37f1SValentin Clement    pa => c4(2:4)
69880b37f1SValentin Clement    do i = 1, 2
70880b37f1SValentin Clement      call pa(i)%proc()
71880b37f1SValentin Clement    end do
72880b37f1SValentin Clement
73880b37f1SValentin Clement    deallocate(c1)
74880b37f1SValentin Clement    deallocate(c2)
75880b37f1SValentin Clement    deallocate(c3)
76880b37f1SValentin Clement    deallocate(c4)
77880b37f1SValentin Clement  end subroutine
78880b37f1SValentin Clement
79880b37f1SValentin Clement! CHECK-LABEL: func.func @_QMpolyPtest_pointer()
80880b37f1SValentin Clement! CHECK-DAG: %[[C1_DESC:.*]] = fir.alloca !fir.class<!fir.heap<!fir.type<_QMpolyTp1{a:i32,b:i32}>>> {bindc_name = "c1", fir.target, uniq_name = "_QMpolyFtest_pointerEc1"}
81880b37f1SValentin Clement! CHECK-DAG: %[[C2_DESC:.*]] = fir.alloca !fir.class<!fir.heap<!fir.type<_QMpolyTp1{a:i32,b:i32}>>> {bindc_name = "c2", fir.target, uniq_name = "_QMpolyFtest_pointerEc2"}
82880b37f1SValentin Clement! CHECK-DAG: %[[C3_DESC:.*]] = fir.alloca !fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>> {bindc_name = "c3", fir.target, uniq_name = "_QMpolyFtest_pointerEc3"}
83880b37f1SValentin Clement! CHECK-DAG: %[[C4_DESC:.*]] = fir.alloca !fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>> {bindc_name = "c4", fir.target, uniq_name = "_QMpolyFtest_pointerEc4"}
84880b37f1SValentin Clement! CHECK-DAG: %[[P_DESC:.*]] = fir.alloca !fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>> {bindc_name = "p", uniq_name = "_QMpolyFtest_pointerEp"}
85880b37f1SValentin Clement! CHECK-DAG: %[[PA_DESC:.*]] = fir.alloca !fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>> {bindc_name = "pa", uniq_name = "_QMpolyFtest_pointerEpa"}
86880b37f1SValentin Clement
87880b37f1SValentin Clement! CHECK: %[[C1_DESC_LOAD:.*]] = fir.load %[[C1_DESC]] : !fir.ref<!fir.class<!fir.heap<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>
8840cb4fd0SValentin Clement! CHECK: %[[P_CONV:.*]] = fir.convert %[[P_DESC]] : (!fir.ref<!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>) -> !fir.ref<!fir.box<none>>
8940cb4fd0SValentin Clement! CHECK: %[[C1_DESC_CONV:.*]] = fir.convert %[[C1_DESC_LOAD]] : (!fir.class<!fir.heap<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>) -> !fir.box<none>
90*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK: fir.call @_FortranAPointerAssociate(%[[P_CONV]], %[[C1_DESC_CONV]]) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.box<none>) -> ()
91880b37f1SValentin Clement! CHECK: %[[P_DESC_LOAD:.*]] = fir.load %[[P_DESC]] : !fir.ref<!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>
92880b37f1SValentin Clement! CHECK: %[[P_REBOX:.*]] = fir.rebox %[[P_DESC_LOAD]] : (!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>) -> !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
93e8cc230eSjeanPerier! CHECK: fir.dispatch "proc"(%[[P_DESC_LOAD]] : !fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>) (%[[P_REBOX]] : !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) {pass_arg_pos = 0 : i32}
94880b37f1SValentin Clement
95880b37f1SValentin Clement! CHECK: %[[C2_DESC_LOAD:.*]] = fir.load %[[C2_DESC]] : !fir.ref<!fir.class<!fir.heap<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>
9640cb4fd0SValentin Clement! CHECK: %[[P_CONV:.*]] = fir.convert %[[P_DESC]] : (!fir.ref<!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>) -> !fir.ref<!fir.box<none>>
9740cb4fd0SValentin Clement! CHECK: %[[C2_DESC_CONV:.*]] = fir.convert %[[C2_DESC_LOAD]] : (!fir.class<!fir.heap<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>) -> !fir.box<none>
98*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK: fir.call @_FortranAPointerAssociate(%[[P_CONV]], %[[C2_DESC_CONV]]) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.box<none>) -> ()
99880b37f1SValentin Clement! CHECK: %[[P_DESC_LOAD:.*]] = fir.load %[[P_DESC]] : !fir.ref<!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>
100880b37f1SValentin Clement! CHECK: %[[P_REBOX:.*]] = fir.rebox %[[P_DESC_LOAD]] : (!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>) -> !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
101e8cc230eSjeanPerier! CHECK: fir.dispatch "proc"(%[[P_DESC_LOAD]] : !fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>) (%[[P_REBOX]] : !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) {pass_arg_pos = 0 : i32}
102880b37f1SValentin Clement
103880b37f1SValentin Clement! CHECK: %[[C3_LOAD:.*]] = fir.load %[[C3_DESC]] : !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>>
104880b37f1SValentin Clement! CHECK: %[[C0:.*]] = arith.constant 0 : index
105880b37f1SValentin Clement! CHECK: %[[C3_DIMS:.*]]:3 = fir.box_dims %[[C3_LOAD]], %[[C0]] : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>, index) -> (index, index, index)
106880b37f1SValentin Clement! CHECK: %[[C1:.*]] = arith.constant 1 : i64
107880b37f1SValentin Clement! CHECK: %[[LB:.*]] = fir.convert %[[C3_DIMS]]#0 : (index) -> i64
108880b37f1SValentin Clement! CHECK: %[[IDX:.*]] = arith.subi %[[C1]], %[[LB]] : i64
109880b37f1SValentin Clement! CHECK: %[[C3_COORD:.*]] = fir.coordinate_of %[[C3_LOAD]], %[[IDX]] : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>, i64) -> !fir.ref<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
1109f1bb307SValentin Clement! CHECK: %[[C3_EMBOX:.*]] = fir.embox %[[C3_COORD]] source_box %[[C3_LOAD]] : (!fir.ref<!fir.type<_QMpolyTp1{a:i32,b:i32}>>, !fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>) -> !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
11140cb4fd0SValentin Clement! CHECK: %[[P_CONV:.*]] = fir.convert %[[P_DESC]] : (!fir.ref<!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>) -> !fir.ref<!fir.box<none>>
11240cb4fd0SValentin Clement! CHECK: %[[C3_EMBOX_CONV:.*]] = fir.convert %[[C3_EMBOX]] : (!fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) -> !fir.box<none>
113*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK: fir.call @_FortranAPointerAssociate(%[[P_CONV]], %[[C3_EMBOX_CONV]]) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.box<none>) -> ()
114880b37f1SValentin Clement! CHECK: %[[P_DESC_LOAD:.*]] = fir.load %[[P_DESC]] : !fir.ref<!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>
115880b37f1SValentin Clement! CHECK: %[[P_REBOX:.*]] = fir.rebox %[[P_DESC_LOAD]] : (!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>) -> !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
116e8cc230eSjeanPerier! CHECK: fir.dispatch "proc"(%[[P_DESC_LOAD]] : !fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>) (%[[P_REBOX]] : !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) {pass_arg_pos = 0 : i32}
117880b37f1SValentin Clement
118880b37f1SValentin Clement! CHECK: %[[C4_LOAD:.*]] = fir.load %[[C4_DESC]] : !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>>
119880b37f1SValentin Clement! CHECK: %[[C0:.*]] = arith.constant 0 : index
120880b37f1SValentin Clement! CHECK: %[[C4_DIMS:.*]]:3 = fir.box_dims %[[C4_LOAD]], %[[C0]] : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>, index) -> (index, index, index)
121880b37f1SValentin Clement! CHECK: %[[C2:.*]] = arith.constant 2 : i64
122880b37f1SValentin Clement! CHECK: %[[LB:.*]] = fir.convert %[[C4_DIMS]]#0 : (index) -> i64
123880b37f1SValentin Clement! CHECK: %[[IDX:.*]] = arith.subi %[[C2]], %[[LB]] : i64
124880b37f1SValentin Clement! CHECK: %[[C4_COORD:.*]] = fir.coordinate_of %[[C4_LOAD]], %[[IDX]] : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>, i64) -> !fir.ref<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
1259f1bb307SValentin Clement! CHECK: %[[C4_EMBOX:.*]] = fir.embox %[[C4_COORD]] source_box %[[C4_LOAD]] : (!fir.ref<!fir.type<_QMpolyTp1{a:i32,b:i32}>>, !fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>) -> !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
12640cb4fd0SValentin Clement! CHECK: %[[P_CONV:.*]] = fir.convert %[[P_DESC]] : (!fir.ref<!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>) -> !fir.ref<!fir.box<none>>
12740cb4fd0SValentin Clement! CHECK: %[[C4_EMBOX_CONV:.*]] = fir.convert %[[C4_EMBOX]] : (!fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) -> !fir.box<none>
128*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK: fir.call @_FortranAPointerAssociate(%[[P_CONV]], %[[C4_EMBOX_CONV]]) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.box<none>) -> ()
129880b37f1SValentin Clement! CHECK: %[[P_DESC_LOAD:.*]] = fir.load %[[P_DESC]] : !fir.ref<!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>
130880b37f1SValentin Clement! CHECK: %[[P_REBOX:.*]] = fir.rebox %[[P_DESC_LOAD]] : (!fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>) -> !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
131e8cc230eSjeanPerier! CHECK: fir.dispatch "proc"(%[[P_DESC_LOAD]] : !fir.class<!fir.ptr<!fir.type<_QMpolyTp1{a:i32,b:i32}>>>) (%[[P_REBOX]] : !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) {pass_arg_pos = 0 : i32}
132880b37f1SValentin Clement
133880b37f1SValentin Clement! CHECK: %[[C3_LOAD:.*]] = fir.load %[[C3_DESC]] : !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>>
13440cb4fd0SValentin Clement! CHECK: %[[C3_REBOX:.*]] = fir.rebox %[[C3_LOAD]](%{{.*}}) : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>, !fir.shift<1>) -> !fir.class<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>
13540cb4fd0SValentin Clement! CHECK: %[[PA_CONV:.*]] = fir.convert %[[PA_DESC]] : (!fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>>) -> !fir.ref<!fir.box<none>>
13640cb4fd0SValentin Clement! CHECK: %[[C3_REBOX_CONV:.*]] = fir.convert %[[C3_REBOX]] : (!fir.class<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>) -> !fir.box<none>
137*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK: fir.call @_FortranAPointerAssociate(%[[PA_CONV]], %[[C3_REBOX_CONV]]) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.box<none>) -> ()
138880b37f1SValentin Clement! CHECK-LABEL: fir.do_loop
139880b37f1SValentin Clement! CHECK: %[[PA_LOAD:.*]] = fir.load %[[PA_DESC]] : !fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>>
140880b37f1SValentin Clement! CHECK: %[[PA_COORD:.*]] = fir.coordinate_of %[[PA_LOAD]], %{{.*}} : (!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>, i64) -> !fir.ref<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
1419f1bb307SValentin Clement! CHECK: %[[PA_EMBOX:.*]] = fir.embox %[[PA_COORD]] source_box %[[PA_LOAD]] : (!fir.ref<!fir.type<_QMpolyTp1{a:i32,b:i32}>>, !fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>) -> !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
142880b37f1SValentin Clement! CHECK: fir.dispatch "proc"(%[[PA_EMBOX]] : !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) (%[[PA_EMBOX]] : !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) {pass_arg_pos = 0 : i32}
143880b37f1SValentin Clement
144880b37f1SValentin Clement! CHECK: %[[C4_LOAD:.*]] = fir.load %[[C4_DESC]] : !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>>
14540cb4fd0SValentin Clement! CHECK: %[[C4_REBOX:.*]] = fir.rebox %[[C4_LOAD]](%{{.*}}) : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>, !fir.shift<1>) -> !fir.class<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>
14640cb4fd0SValentin Clement! CHECK: %[[PA_CONV:.*]] = fir.convert %[[PA_DESC]] : (!fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>>) -> !fir.ref<!fir.box<none>>
14740cb4fd0SValentin Clement! CHECK: %[[C4_REBOX_CONV:.*]] = fir.convert %[[C4_REBOX]] : (!fir.class<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>) -> !fir.box<none>
148*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK: fir.call @_FortranAPointerAssociate(%[[PA_CONV]], %[[C4_REBOX_CONV]]) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.box<none>) -> ()
149880b37f1SValentin Clement! CHECK-LABEL: fir.do_loop
150880b37f1SValentin Clement! CHECK: %[[PA_LOAD:.*]] = fir.load %[[PA_DESC]] : !fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>>
151880b37f1SValentin Clement! CHECK: %[[PA_COORD:.*]] = fir.coordinate_of %[[PA_LOAD]], %{{.*}} : (!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>, i64) -> !fir.ref<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
1529f1bb307SValentin Clement! CHECK: %[[PA_EMBOX:.*]] = fir.embox %[[PA_COORD]] source_box %[[PA_LOAD]] : (!fir.ref<!fir.type<_QMpolyTp1{a:i32,b:i32}>>, !fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>) -> !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
153880b37f1SValentin Clement! CHECK: fir.dispatch "proc"(%[[PA_EMBOX]] : !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) (%[[PA_EMBOX]] : !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) {pass_arg_pos = 0 : i32}
154880b37f1SValentin Clement
155880b37f1SValentin Clement! CHECK: %[[C4_LOAD:.*]] = fir.load %[[C4_DESC]] : !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>>
156880b37f1SValentin Clement! CHECK: %[[C0:.*]] = arith.constant 0 : index
157880b37f1SValentin Clement! CHECK: %[[C4_DIMS:.*]]:3 = fir.box_dims %[[C4_LOAD]], %[[C0]] : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>, index) -> (index, index, index)
158880b37f1SValentin Clement! CHECK: %[[C2:.*]] = arith.constant 2 : i64
159880b37f1SValentin Clement! CHECK: %[[C2_INDEX:.*]] = fir.convert %[[C2]] : (i64) -> index
160880b37f1SValentin Clement! CHECK: %[[C1:.*]] = arith.constant 1 : i64
161880b37f1SValentin Clement! CHECK: %[[C1_INDEX:.*]] = fir.convert %[[C1]] : (i64) -> index
162880b37f1SValentin Clement! CHECK: %[[C4:.*]] = arith.constant 4 : i64
163880b37f1SValentin Clement! CHECK: %[[C4_INDEX:.*]] = fir.convert %[[C4]] : (i64) -> index
164880b37f1SValentin Clement! CHECK: %[[SHIFT:.*]] = fir.shift %[[C4_DIMS]]#0 : (index) -> !fir.shift<1>
165880b37f1SValentin Clement! CHECK: %[[SLICE:.*]] = fir.slice %[[C2_INDEX]], %[[C4_INDEX]], %[[C1_INDEX]] : (index, index, index) -> !fir.slice<1>
166880b37f1SValentin Clement! CHECK: %[[SLICE_REBOX:.*]] = fir.rebox %[[C4_LOAD]](%[[SHIFT]]) [%[[SLICE]]] : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>, !fir.shift<1>, !fir.slice<1>) -> !fir.class<!fir.array<3x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>
16740cb4fd0SValentin Clement! CHECK: %[[PA_CONV:.*]] = fir.convert %[[PA_DESC]] : (!fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>>) -> !fir.ref<!fir.box<none>>
16840cb4fd0SValentin Clement! CHECK: %[[SLICE_REBOX_CONV:.*]] = fir.convert %[[SLICE_REBOX]] : (!fir.class<!fir.array<3x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>) -> !fir.box<none>
169*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK: fir.call @_FortranAPointerAssociate(%[[PA_CONV]], %[[SLICE_REBOX_CONV]]) {{.*}} : (!fir.ref<!fir.box<none>>, !fir.box<none>) -> ()
170880b37f1SValentin Clement! CHECK-LABEL: fir.do_loop
171880b37f1SValentin Clement! CHECK: %[[PA_LOAD:.*]] = fir.load %[[PA_DESC]] : !fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>>
172880b37f1SValentin Clement! CHECK: %[[PA_COORD:.*]] = fir.coordinate_of %[[PA_LOAD]], %{{.*}} : (!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>, i64) -> !fir.ref<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
1739f1bb307SValentin Clement! CHECK: %[[PA_EMBOX:.*]] = fir.embox %[[PA_COORD]] source_box %[[PA_LOAD]] : (!fir.ref<!fir.type<_QMpolyTp1{a:i32,b:i32}>>, !fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMpolyTp1{a:i32,b:i32}>>>>) -> !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>
174880b37f1SValentin Clement! CHECK: fir.dispatch "proc"(%[[PA_EMBOX]] : !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) (%[[PA_EMBOX]] : !fir.class<!fir.type<_QMpolyTp1{a:i32,b:i32}>>) {pass_arg_pos = 0 : i32}
175880b37f1SValentin Clement
176880b37f1SValentin Clementend module
177880b37f1SValentin Clement
178880b37f1SValentin Clementprogram test_pointer_association
179880b37f1SValentin Clement  use poly
180880b37f1SValentin Clement  call test_pointer()
181880b37f1SValentin Clementend
182