1e847374eSValentin Clement! Test lowering of allocatable components 2*f35f863aSjeanPerier! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s 3e847374eSValentin Clement 4e847374eSValentin Clementmodule acomp 5e847374eSValentin Clement implicit none 6e847374eSValentin Clement type t 7e847374eSValentin Clement real :: x 8e847374eSValentin Clement integer :: i 9e847374eSValentin Clement end type 10e847374eSValentin Clement interface 11e847374eSValentin Clement subroutine takes_real_scalar(x) 12e847374eSValentin Clement real :: x 13e847374eSValentin Clement end subroutine 14e847374eSValentin Clement subroutine takes_char_scalar(x) 15e847374eSValentin Clement character(*) :: x 16e847374eSValentin Clement end subroutine 17e847374eSValentin Clement subroutine takes_derived_scalar(x) 18e847374eSValentin Clement import t 19e847374eSValentin Clement type(t) :: x 20e847374eSValentin Clement end subroutine 21e847374eSValentin Clement subroutine takes_real_array(x) 22e847374eSValentin Clement real :: x(:) 23e847374eSValentin Clement end subroutine 24e847374eSValentin Clement subroutine takes_char_array(x) 25e847374eSValentin Clement character(*) :: x(:) 26e847374eSValentin Clement end subroutine 27e847374eSValentin Clement subroutine takes_derived_array(x) 28e847374eSValentin Clement import t 29e847374eSValentin Clement type(t) :: x(:) 30e847374eSValentin Clement end subroutine 31e847374eSValentin Clement subroutine takes_real_scalar_pointer(x) 32e847374eSValentin Clement real, allocatable :: x 33e847374eSValentin Clement end subroutine 34e847374eSValentin Clement subroutine takes_real_array_pointer(x) 35e847374eSValentin Clement real, allocatable :: x(:) 36e847374eSValentin Clement end subroutine 37e847374eSValentin Clement subroutine takes_logical(x) 38e847374eSValentin Clement logical :: x 39e847374eSValentin Clement end subroutine 40e847374eSValentin Clement end interface 41e847374eSValentin Clement 42e847374eSValentin Clement type real_a0 43e847374eSValentin Clement real, allocatable :: p 44e847374eSValentin Clement end type 45e847374eSValentin Clement type real_a1 46e847374eSValentin Clement real, allocatable :: p(:) 47e847374eSValentin Clement end type 48e847374eSValentin Clement type cst_char_a0 49e847374eSValentin Clement character(10), allocatable :: p 50e847374eSValentin Clement end type 51e847374eSValentin Clement type cst_char_a1 52e847374eSValentin Clement character(10), allocatable :: p(:) 53e847374eSValentin Clement end type 54e847374eSValentin Clement type def_char_a0 55e847374eSValentin Clement character(:), allocatable :: p 56e847374eSValentin Clement end type 57e847374eSValentin Clement type def_char_a1 58e847374eSValentin Clement character(:), allocatable :: p(:) 59e847374eSValentin Clement end type 60e847374eSValentin Clement type derived_a0 61e847374eSValentin Clement type(t), allocatable :: p 62e847374eSValentin Clement end type 63e847374eSValentin Clement type derived_a1 64e847374eSValentin Clement type(t), allocatable :: p(:) 65e847374eSValentin Clement end type 66e847374eSValentin Clement 67e847374eSValentin Clement real, target :: real_target, real_array_target(100) 68e847374eSValentin Clement character(10), target :: char_target, char_array_target(100) 69e847374eSValentin Clement 70e847374eSValentin Clementcontains 71e847374eSValentin Clement 72e847374eSValentin Clement! ----------------------------------------------------------------------------- 73e847374eSValentin Clement! Test allocatable component references 74e847374eSValentin Clement! ----------------------------------------------------------------------------- 75e847374eSValentin Clement 76e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPref_scalar_real_a( 77e847374eSValentin Clement! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>>{{.*}}, %[[arg1:.*]]: !fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>{{.*}}, %[[arg2:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>>>{{.*}}, %[[arg3:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>{{.*}}) { 78e847374eSValentin Clementsubroutine ref_scalar_real_a(a0_0, a1_0, a0_1, a1_1) 79e847374eSValentin Clement type(real_a0) :: a0_0, a0_1(100) 80e847374eSValentin Clement type(real_a1) :: a1_0, a1_1(100) 81e847374eSValentin Clement 82e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p, !fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}> 83e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[arg0]], %[[fld]] : (!fir.ref<!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.heap<f32>>> 84e847374eSValentin Clement ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.heap<f32>>> 85e847374eSValentin Clement ! CHECK: %[[addr:.*]] = fir.box_addr %[[load]] : (!fir.box<!fir.heap<f32>>) -> !fir.heap<f32> 86e847374eSValentin Clement ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] : (!fir.heap<f32>) -> !fir.ref<f32> 874cc9437aSTom Eccles ! CHECK: fir.call @_QPtakes_real_scalar(%[[cast]]) {{.*}}: (!fir.ref<f32>) -> () 88e847374eSValentin Clement call takes_real_scalar(a0_0%p) 89e847374eSValentin Clement 90e847374eSValentin Clement ! CHECK: %[[a0_1_coor:.*]] = fir.coordinate_of %[[arg2]], %{{.*}} : (!fir.ref<!fir.array<100x!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>>>, i64) -> !fir.ref<!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>> 91e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p, !fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}> 92e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_1_coor]], %[[fld]] : (!fir.ref<!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.heap<f32>>> 93e847374eSValentin Clement ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.heap<f32>>> 94e847374eSValentin Clement ! CHECK: %[[addr:.*]] = fir.box_addr %[[load]] : (!fir.box<!fir.heap<f32>>) -> !fir.heap<f32> 95e847374eSValentin Clement ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] : (!fir.heap<f32>) -> !fir.ref<f32> 964cc9437aSTom Eccles ! CHECK: fir.call @_QPtakes_real_scalar(%[[cast]]) {{.*}}: (!fir.ref<f32>) -> () 97e847374eSValentin Clement call takes_real_scalar(a0_1(5)%p) 98e847374eSValentin Clement 99e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p, !fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}> 100e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[arg1]], %[[fld]] : (!fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 101e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 102e847374eSValentin Clement ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>> 103e847374eSValentin Clement ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index) 104e847374eSValentin Clement ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 105e847374eSValentin Clement ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64 106e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[addr]], %[[index]] : (!fir.heap<!fir.array<?xf32>>, i64) -> !fir.ref<f32> 1074cc9437aSTom Eccles ! CHECK: fir.call @_QPtakes_real_scalar(%[[coor]]) {{.*}}: (!fir.ref<f32>) -> () 108e847374eSValentin Clement call takes_real_scalar(a1_0%p(7)) 109e847374eSValentin Clement 110e847374eSValentin Clement ! CHECK: %[[a1_1_coor:.*]] = fir.coordinate_of %[[arg3]], %{{.*}} : (!fir.ref<!fir.array<100x!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>, i64) -> !fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>> 111e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p, !fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}> 112e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_1_coor]], %[[fld]] : (!fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 113e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 114e847374eSValentin Clement ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>> 115e847374eSValentin Clement ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index) 116e847374eSValentin Clement ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 117e847374eSValentin Clement ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64 118e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[addr]], %[[index]] : (!fir.heap<!fir.array<?xf32>>, i64) -> !fir.ref<f32> 1194cc9437aSTom Eccles ! CHECK: fir.call @_QPtakes_real_scalar(%[[coor]]) {{.*}}: (!fir.ref<f32>) -> () 120e847374eSValentin Clement call takes_real_scalar(a1_1(5)%p(7)) 121e847374eSValentin Clementend subroutine 122e847374eSValentin Clement 123e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPref_array_real_a( 124e847374eSValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>{{.*}}) { 125e847374eSValentin Clement! CHECK: %[[VAL_2:.*]] = fir.field_index p, !fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}> 126e847374eSValentin Clement! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_0]], %[[VAL_2]] : (!fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 127e847374eSValentin Clement! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 128e847374eSValentin Clement! CHECK: %[[VAL_5:.*]] = arith.constant 0 : index 129e847374eSValentin Clement! CHECK: %[[VAL_6:.*]]:3 = fir.box_dims %[[VAL_4]], %[[VAL_5]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index) 130e847374eSValentin Clement! CHECK: %[[VAL_7:.*]] = fir.box_addr %[[VAL_4]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>> 131e847374eSValentin Clement! CHECK: %[[VAL_8:.*]] = arith.constant 20 : i64 132e847374eSValentin Clement! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> index 133e847374eSValentin Clement! CHECK: %[[VAL_10:.*]] = arith.constant 2 : i64 134e847374eSValentin Clement! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index 135e847374eSValentin Clement! CHECK: %[[VAL_12:.*]] = arith.constant 50 : i64 136e847374eSValentin Clement! CHECK: %[[VAL_13:.*]] = fir.convert %[[VAL_12]] : (i64) -> index 137e847374eSValentin Clement! CHECK: %[[VAL_14:.*]] = fir.shape_shift %[[VAL_6]]#0, %[[VAL_6]]#1 : (index, index) -> !fir.shapeshift<1> 138e847374eSValentin Clement! CHECK: %[[VAL_15:.*]] = fir.slice %[[VAL_9]], %[[VAL_13]], %[[VAL_11]] : (index, index, index) -> !fir.slice<1> 13913f9089aSPeixin Qiao! CHECK: %[[VAL_16:.*]] = fir.embox %[[VAL_7]](%[[VAL_14]]) {{\[}}%[[VAL_15]]] : (!fir.heap<!fir.array<?xf32>>, !fir.shapeshift<1>, !fir.slice<1>) -> !fir.box<!fir.array<16xf32>> 14013f9089aSPeixin Qiao! CHECK: %[[VAL_16_NEW:.*]] = fir.convert %[[VAL_16]] : (!fir.box<!fir.array<16xf32>>) -> !fir.box<!fir.array<?xf32>> 1414cc9437aSTom Eccles! CHECK: fir.call @_QPtakes_real_array(%[[VAL_16_NEW]]) {{.*}}: (!fir.box<!fir.array<?xf32>>) -> () 142e847374eSValentin Clement! CHECK: %[[VAL_17:.*]] = arith.constant 5 : i64 143e847374eSValentin Clement! CHECK: %[[VAL_18:.*]] = arith.constant 1 : i64 144e847374eSValentin Clement! CHECK: %[[VAL_19:.*]] = arith.subi %[[VAL_17]], %[[VAL_18]] : i64 145e847374eSValentin Clement! CHECK: %[[VAL_20:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_19]] : (!fir.ref<!fir.array<100x!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>, i64) -> !fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>> 146e847374eSValentin Clement! CHECK: %[[VAL_21:.*]] = fir.field_index p, !fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}> 147e847374eSValentin Clement! CHECK: %[[VAL_22:.*]] = fir.coordinate_of %[[VAL_20]], %[[VAL_21]] : (!fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 148e847374eSValentin Clement! CHECK: %[[VAL_23:.*]] = fir.load %[[VAL_22]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 149e847374eSValentin Clement! CHECK: %[[VAL_24:.*]] = arith.constant 0 : index 150e847374eSValentin Clement! CHECK: %[[VAL_25:.*]]:3 = fir.box_dims %[[VAL_23]], %[[VAL_24]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index) 151e847374eSValentin Clement! CHECK: %[[VAL_26:.*]] = fir.box_addr %[[VAL_23]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>> 152e847374eSValentin Clement! CHECK: %[[VAL_27:.*]] = arith.constant 20 : i64 153e847374eSValentin Clement! CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i64) -> index 154e847374eSValentin Clement! CHECK: %[[VAL_29:.*]] = arith.constant 2 : i64 155e847374eSValentin Clement! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i64) -> index 156e847374eSValentin Clement! CHECK: %[[VAL_31:.*]] = arith.constant 50 : i64 157e847374eSValentin Clement! CHECK: %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (i64) -> index 158e847374eSValentin Clement! CHECK: %[[VAL_33:.*]] = fir.shape_shift %[[VAL_25]]#0, %[[VAL_25]]#1 : (index, index) -> !fir.shapeshift<1> 159e847374eSValentin Clement! CHECK: %[[VAL_34:.*]] = fir.slice %[[VAL_28]], %[[VAL_32]], %[[VAL_30]] : (index, index, index) -> !fir.slice<1> 16013f9089aSPeixin Qiao! CHECK: %[[VAL_35:.*]] = fir.embox %[[VAL_26]](%[[VAL_33]]) {{\[}}%[[VAL_34]]] : (!fir.heap<!fir.array<?xf32>>, !fir.shapeshift<1>, !fir.slice<1>) -> !fir.box<!fir.array<16xf32>> 16113f9089aSPeixin Qiao! CHECK: %[[VAL_35_NEW:.*]] = fir.convert %[[VAL_35]] : (!fir.box<!fir.array<16xf32>>) -> !fir.box<!fir.array<?xf32>> 1624cc9437aSTom Eccles! CHECK: fir.call @_QPtakes_real_array(%[[VAL_35_NEW]]) {{.*}}: (!fir.box<!fir.array<?xf32>>) -> () 163e847374eSValentin Clement! CHECK: return 164e847374eSValentin Clement! CHECK: } 165e847374eSValentin Clement 166e847374eSValentin Clementsubroutine ref_array_real_a(a1_0, a1_1) 167e847374eSValentin Clement type(real_a1) :: a1_0, a1_1(100) 168e847374eSValentin Clement call takes_real_array(a1_0%p(20:50:2)) 169e847374eSValentin Clement call takes_real_array(a1_1(5)%p(20:50:2)) 170e847374eSValentin Clementend subroutine 171e847374eSValentin Clement 172e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPref_scalar_cst_char_a 173e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}}) 174e847374eSValentin Clementsubroutine ref_scalar_cst_char_a(a0_0, a1_0, a0_1, a1_1) 175e847374eSValentin Clement type(cst_char_a0) :: a0_0, a0_1(100) 176e847374eSValentin Clement type(cst_char_a1) :: a1_0, a1_1(100) 177e847374eSValentin Clement 178e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 179e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]] 180e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 181e847374eSValentin Clement ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] 182c0cb8f73SjeanPerier ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}} 183e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 184e847374eSValentin Clement call takes_char_scalar(a0_0%p) 185e847374eSValentin Clement 186e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}} 187e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 188e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 189e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 190e847374eSValentin Clement ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] 191c0cb8f73SjeanPerier ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}} 192e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 193e847374eSValentin Clement call takes_char_scalar(a0_1(5)%p) 194e847374eSValentin Clement 195e847374eSValentin Clement 196e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 197e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]] 198e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 199e847374eSValentin Clement ! CHECK-DAG: %[[base:.*]] = fir.box_addr %[[box]] 200e847374eSValentin Clement ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} 201e847374eSValentin Clement ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 202e847374eSValentin Clement ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64 203e847374eSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[base]], %[[index]] 204c0cb8f73SjeanPerier ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}} 205e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 206e847374eSValentin Clement call takes_char_scalar(a1_0%p(7)) 207e847374eSValentin Clement 208e847374eSValentin Clement 209e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}} 210e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 211e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 212e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 213e847374eSValentin Clement ! CHECK-DAG: %[[base:.*]] = fir.box_addr %[[box]] 214e847374eSValentin Clement ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} 215e847374eSValentin Clement ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 216e847374eSValentin Clement ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64 217e847374eSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[base]], %[[index]] 218c0cb8f73SjeanPerier ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}} 219e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 220e847374eSValentin Clement call takes_char_scalar(a1_1(5)%p(7)) 221e847374eSValentin Clement 222e847374eSValentin Clementend subroutine 223e847374eSValentin Clement 224e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPref_scalar_def_char_a 225e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}}) 226e847374eSValentin Clementsubroutine ref_scalar_def_char_a(a0_0, a1_0, a0_1, a1_1) 227e847374eSValentin Clement type(def_char_a0) :: a0_0, a0_1(100) 228e847374eSValentin Clement type(def_char_a1) :: a1_0, a1_1(100) 229e847374eSValentin Clement 230e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 231e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]] 232e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 233e847374eSValentin Clement ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]] 234e847374eSValentin Clement ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]] 235c0cb8f73SjeanPerier ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %[[len]] 236e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 237e847374eSValentin Clement call takes_char_scalar(a0_0%p) 238e847374eSValentin Clement 239e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}} 240e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 241e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 242e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 243e847374eSValentin Clement ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]] 244e847374eSValentin Clement ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]] 245c0cb8f73SjeanPerier ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %[[len]] 246e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 247e847374eSValentin Clement call takes_char_scalar(a0_1(5)%p) 248e847374eSValentin Clement 249e847374eSValentin Clement 250e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 251e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]] 252e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 253e847374eSValentin Clement ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} 254e847374eSValentin Clement ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]] 255e847374eSValentin Clement ! CHECK-DAG: %[[base:.*]] = fir.box_addr %[[box]] 256e847374eSValentin Clement ! CHECK: %[[cast:.*]] = fir.convert %[[base]] : (!fir.heap<!fir.array<?x!fir.char<1,?>>>) -> !fir.ref<!fir.array<?x!fir.char<1,?>>> 257e847374eSValentin Clement ! CHECK: %[[c7:.*]] = fir.convert %c7{{.*}} : (i64) -> index 258e847374eSValentin Clement ! CHECK: %[[sub:.*]] = arith.subi %[[c7]], %[[dims]]#0 : index 259e847374eSValentin Clement ! CHECK: %[[mul:.*]] = arith.muli %[[len]], %[[sub]] : index 260e847374eSValentin Clement ! CHECK: %[[offset:.*]] = arith.addi %[[mul]], %c0{{.*}} : index 261e847374eSValentin Clement ! CHECK: %[[cnvt:.*]] = fir.convert %[[cast]] 262e847374eSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[cnvt]], %[[offset]] 263e847374eSValentin Clement ! CHECK: %[[cnvt:.*]] = fir.convert %[[addr]] 264e847374eSValentin Clement ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[cnvt]], %[[len]] 265e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 266e847374eSValentin Clement call takes_char_scalar(a1_0%p(7)) 267e847374eSValentin Clement 268e847374eSValentin Clement 269e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}} 270e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 271e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 272e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 273e847374eSValentin Clement ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} 274e847374eSValentin Clement ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]] 275e847374eSValentin Clement ! CHECK-DAG: %[[base:.*]] = fir.box_addr %[[box]] 276e847374eSValentin Clement ! CHECK: %[[cast:.*]] = fir.convert %[[base]] : (!fir.heap<!fir.array<?x!fir.char<1,?>>>) -> !fir.ref<!fir.array<?x!fir.char<1,?>>> 277e847374eSValentin Clement ! CHECK: %[[c7:.*]] = fir.convert %c7{{.*}} : (i64) -> index 278e847374eSValentin Clement ! CHECK: %[[sub:.*]] = arith.subi %[[c7]], %[[dims]]#0 : index 279e847374eSValentin Clement ! CHECK: %[[mul:.*]] = arith.muli %[[len]], %[[sub]] : index 280e847374eSValentin Clement ! CHECK: %[[offset:.*]] = arith.addi %[[mul]], %c0{{.*}} : index 281e847374eSValentin Clement ! CHECK: %[[cnvt:.*]] = fir.convert %[[cast]] 282e847374eSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[cnvt]], %[[offset]] 283e847374eSValentin Clement ! CHECK: %[[cnvt:.*]] = fir.convert %[[addr]] 284e847374eSValentin Clement ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[cnvt]], %[[len]] 285e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 286e847374eSValentin Clement call takes_char_scalar(a1_1(5)%p(7)) 287e847374eSValentin Clement 288e847374eSValentin Clementend subroutine 289e847374eSValentin Clement 290e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPref_scalar_derived 291e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}}) 292e847374eSValentin Clementsubroutine ref_scalar_derived(a0_0, a1_0, a0_1, a1_1) 293e847374eSValentin Clement type(derived_a0) :: a0_0, a0_1(100) 294e847374eSValentin Clement type(derived_a1) :: a1_0, a1_1(100) 295e847374eSValentin Clement 296e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 297e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]] 298e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 299e847374eSValentin Clement ! CHECK: %[[fldx:.*]] = fir.field_index x 300e847374eSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[fldx]] 301e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]]) 302e847374eSValentin Clement call takes_real_scalar(a0_0%p%x) 303e847374eSValentin Clement 304e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}} 305e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 306e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 307e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 308e847374eSValentin Clement ! CHECK: %[[fldx:.*]] = fir.field_index x 309e847374eSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[fldx]] 310e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]]) 311e847374eSValentin Clement call takes_real_scalar(a0_1(5)%p%x) 312e847374eSValentin Clement 313e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 314e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]] 315e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 316e847374eSValentin Clement ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} 317e847374eSValentin Clement ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 318e847374eSValentin Clement ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64 319e847374eSValentin Clement ! CHECK: %[[elem:.*]] = fir.coordinate_of %[[box]], %[[index]] 320e847374eSValentin Clement ! CHECK: %[[fldx:.*]] = fir.field_index x 321e847374eSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[elem]], %[[fldx]] 322e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]]) 323e847374eSValentin Clement call takes_real_scalar(a1_0%p(7)%x) 324e847374eSValentin Clement 325e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}} 326e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 327e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 328e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 329e847374eSValentin Clement ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} 330e847374eSValentin Clement ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 331e847374eSValentin Clement ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64 332e847374eSValentin Clement ! CHECK: %[[elem:.*]] = fir.coordinate_of %[[box]], %[[index]] 333e847374eSValentin Clement ! CHECK: %[[fldx:.*]] = fir.field_index x 334e847374eSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[elem]], %[[fldx]] 335e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]]) 336e847374eSValentin Clement call takes_real_scalar(a1_1(5)%p(7)%x) 337e847374eSValentin Clement 338e847374eSValentin Clementend subroutine 339e847374eSValentin Clement 340e847374eSValentin Clement! ----------------------------------------------------------------------------- 341e847374eSValentin Clement! Test passing allocatable component references as allocatables 342e847374eSValentin Clement! ----------------------------------------------------------------------------- 343e847374eSValentin Clement 344e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPpass_real_a 345e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}}) 346e847374eSValentin Clementsubroutine pass_real_a(a0_0, a1_0, a0_1, a1_1) 347e847374eSValentin Clement type(real_a0) :: a0_0, a0_1(100) 348e847374eSValentin Clement type(real_a1) :: a1_0, a1_1(100) 349e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 350e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]] 351e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar_pointer(%[[coor]]) 352e847374eSValentin Clement call takes_real_scalar_pointer(a0_0%p) 353e847374eSValentin Clement 354e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}} 355e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 356e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 357e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar_pointer(%[[coor]]) 358e847374eSValentin Clement call takes_real_scalar_pointer(a0_1(5)%p) 359e847374eSValentin Clement 360e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 361e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]] 362e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_real_array_pointer(%[[coor]]) 363e847374eSValentin Clement call takes_real_array_pointer(a1_0%p) 364e847374eSValentin Clement 365e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}} 366e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 367e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 368e847374eSValentin Clement ! CHECK: fir.call @_QPtakes_real_array_pointer(%[[coor]]) 369e847374eSValentin Clement call takes_real_array_pointer(a1_1(5)%p) 370e847374eSValentin Clementend subroutine 371e847374eSValentin Clement 372e847374eSValentin Clement! ----------------------------------------------------------------------------- 373e847374eSValentin Clement! Test usage in intrinsics where pointer aspect matters 374e847374eSValentin Clement! ----------------------------------------------------------------------------- 375e847374eSValentin Clement 376e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPallocated_p 377e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}}) 378e847374eSValentin Clementsubroutine allocated_p(a0_0, a1_0, a0_1, a1_1) 379e847374eSValentin Clement type(real_a0) :: a0_0, a0_1(100) 380e847374eSValentin Clement type(def_char_a1) :: a1_0, a1_1(100) 381e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 382e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]] 383e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 384e847374eSValentin Clement ! CHECK: fir.box_addr %[[box]] 385e847374eSValentin Clement call takes_logical(allocated(a0_0%p)) 386e847374eSValentin Clement 387e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}} 388e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 389e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 390e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 391e847374eSValentin Clement ! CHECK: fir.box_addr %[[box]] 392e847374eSValentin Clement call takes_logical(allocated(a0_1(5)%p)) 393e847374eSValentin Clement 394e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 395e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]] 396e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 397e847374eSValentin Clement ! CHECK: fir.box_addr %[[box]] 398e847374eSValentin Clement call takes_logical(allocated(a1_0%p)) 399e847374eSValentin Clement 400e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}} 401e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 402e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 403e847374eSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 404e847374eSValentin Clement ! CHECK: fir.box_addr %[[box]] 405e847374eSValentin Clement call takes_logical(allocated(a1_1(5)%p)) 406e847374eSValentin Clementend subroutine 407e847374eSValentin Clement 408e847374eSValentin Clement! ----------------------------------------------------------------------------- 409e847374eSValentin Clement! Test allocation 410e847374eSValentin Clement! ----------------------------------------------------------------------------- 411e847374eSValentin Clement 412e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPallocate_real 413e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}}) 414e847374eSValentin Clementsubroutine allocate_real(a0_0, a1_0, a0_1, a1_1) 415e847374eSValentin Clement type(real_a0) :: a0_0, a0_1(100) 416e847374eSValentin Clement type(real_a1) :: a1_0, a1_1(100) 417e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 418e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]] 419e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 420e847374eSValentin Clement allocate(a0_0%p) 421e847374eSValentin Clement 422e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}} 423e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 424e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 425e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 426e847374eSValentin Clement allocate(a0_1(5)%p) 427e847374eSValentin Clement 428e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 429e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]] 430e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 431e847374eSValentin Clement allocate(a1_0%p(100)) 432e847374eSValentin Clement 433e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}} 434e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 435e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 436e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 437e847374eSValentin Clement allocate(a1_1(5)%p(100)) 438e847374eSValentin Clementend subroutine 439e847374eSValentin Clement 440e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPallocate_cst_char 441e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}}) 442e847374eSValentin Clementsubroutine allocate_cst_char(a0_0, a1_0, a0_1, a1_1) 443e847374eSValentin Clement type(cst_char_a0) :: a0_0, a0_1(100) 444e847374eSValentin Clement type(cst_char_a1) :: a1_0, a1_1(100) 445e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 446e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]] 447e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 448e847374eSValentin Clement allocate(a0_0%p) 449e847374eSValentin Clement 450e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}} 451e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 452e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 453e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 454e847374eSValentin Clement allocate(a0_1(5)%p) 455e847374eSValentin Clement 456e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 457e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]] 458e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 459e847374eSValentin Clement allocate(a1_0%p(100)) 460e847374eSValentin Clement 461e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}} 462e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 463e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 464e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 465e847374eSValentin Clement allocate(a1_1(5)%p(100)) 466e847374eSValentin Clementend subroutine 467e847374eSValentin Clement 468e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPallocate_def_char 469e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}}) 470e847374eSValentin Clementsubroutine allocate_def_char(a0_0, a1_0, a0_1, a1_1) 471e847374eSValentin Clement type(def_char_a0) :: a0_0, a0_1(100) 472e847374eSValentin Clement type(def_char_a1) :: a1_0, a1_1(100) 473e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 474e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]] 475e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 476e847374eSValentin Clement allocate(character(18)::a0_0%p) 477e847374eSValentin Clement 478e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}} 479e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 480e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 481e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 482e847374eSValentin Clement allocate(character(18)::a0_1(5)%p) 483e847374eSValentin Clement 484e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 485e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]] 486e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 487e847374eSValentin Clement allocate(character(18)::a1_0%p(100)) 488e847374eSValentin Clement 489e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}} 490e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 491e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 492e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 493e847374eSValentin Clement allocate(character(18)::a1_1(5)%p(100)) 494e847374eSValentin Clementend subroutine 495e847374eSValentin Clement 496e847374eSValentin Clement! ----------------------------------------------------------------------------- 497e847374eSValentin Clement! Test deallocation 498e847374eSValentin Clement! ----------------------------------------------------------------------------- 499e847374eSValentin Clement 500e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPdeallocate_real 501e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}}) 502e847374eSValentin Clementsubroutine deallocate_real(a0_0, a1_0, a0_1, a1_1) 503e847374eSValentin Clement type(real_a0) :: a0_0, a0_1(100) 504e847374eSValentin Clement type(real_a1) :: a1_0, a1_1(100) 505e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 506e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]] 507e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 508e847374eSValentin Clement deallocate(a0_0%p) 509e847374eSValentin Clement 510e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}} 511e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 512e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 513e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 514e847374eSValentin Clement deallocate(a0_1(5)%p) 515e847374eSValentin Clement 516e847374eSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 517e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]] 518e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 519e847374eSValentin Clement deallocate(a1_0%p) 520e847374eSValentin Clement 521e847374eSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}} 522e847374eSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 523e847374eSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 524e847374eSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 525e847374eSValentin Clement deallocate(a1_1(5)%p) 526e847374eSValentin Clementend subroutine 527e847374eSValentin Clement 528e847374eSValentin Clement! ----------------------------------------------------------------------------- 529e847374eSValentin Clement! Test a recursive derived type reference 530e847374eSValentin Clement! ----------------------------------------------------------------------------- 531e847374eSValentin Clement 532e847374eSValentin Clement! CHECK: func @_QMacompPtest_recursive 533e847374eSValentin Clement! CHECK-SAME: (%[[x:.*]]: {{.*}}) 534e847374eSValentin Clementsubroutine test_recursive(x) 535e847374eSValentin Clement type t 536e847374eSValentin Clement integer :: i 537e847374eSValentin Clement type(t), allocatable :: next 538e847374eSValentin Clement end type 539e847374eSValentin Clement type(t) :: x 540e847374eSValentin Clement 541e847374eSValentin Clement ! CHECK: %[[fldNext1:.*]] = fir.field_index next 542e847374eSValentin Clement ! CHECK: %[[next1:.*]] = fir.coordinate_of %[[x]], %[[fldNext1]] 543e847374eSValentin Clement ! CHECK: %[[nextBox1:.*]] = fir.load %[[next1]] 544e847374eSValentin Clement ! CHECK: %[[fldNext2:.*]] = fir.field_index next 545e847374eSValentin Clement ! CHECK: %[[next2:.*]] = fir.coordinate_of %[[nextBox1]], %[[fldNext2]] 546e847374eSValentin Clement ! CHECK: %[[nextBox2:.*]] = fir.load %[[next2]] 547e847374eSValentin Clement ! CHECK: %[[fldNext3:.*]] = fir.field_index next 548e847374eSValentin Clement ! CHECK: %[[next3:.*]] = fir.coordinate_of %[[nextBox2]], %[[fldNext3]] 549e847374eSValentin Clement ! CHECK: %[[nextBox3:.*]] = fir.load %[[next3]] 550e847374eSValentin Clement ! CHECK: %[[fldi:.*]] = fir.field_index i 551e847374eSValentin Clement ! CHECK: %[[i:.*]] = fir.coordinate_of %[[nextBox3]], %[[fldi]] 552e847374eSValentin Clement ! CHECK: %[[nextBox3:.*]] = fir.load %[[i]] : !fir.ref<i32> 553e847374eSValentin Clement print *, x%next%next%next%i 554e847374eSValentin Clementend subroutine 555e847374eSValentin Clement 556e847374eSValentin Clementend module 557