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