507 lines · plain
1! Test lowering of allocatable components2! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s3 4module acomp5 implicit none6 type t7 real :: x8 integer :: i9 end type10 interface11 subroutine takes_real_scalar(x)12 real :: x13 end subroutine14 subroutine takes_char_scalar(x)15 character(*) :: x16 end subroutine17 subroutine takes_derived_scalar(x)18 import t19 type(t) :: x20 end subroutine21 subroutine takes_real_array(x)22 real :: x(:)23 end subroutine24 subroutine takes_char_array(x)25 character(*) :: x(:)26 end subroutine27 subroutine takes_derived_array(x)28 import t29 type(t) :: x(:)30 end subroutine31 subroutine takes_real_scalar_pointer(x)32 real, allocatable :: x33 end subroutine34 subroutine takes_real_array_pointer(x)35 real, allocatable :: x(:)36 end subroutine37 subroutine takes_logical(x)38 logical :: x39 end subroutine40 end interface41 42 type real_a043 real, allocatable :: p44 end type45 type real_a146 real, allocatable :: p(:)47 end type48 type cst_char_a049 character(10), allocatable :: p50 end type51 type cst_char_a152 character(10), allocatable :: p(:)53 end type54 type def_char_a055 character(:), allocatable :: p56 end type57 type def_char_a158 character(:), allocatable :: p(:)59 end type60 type derived_a061 type(t), allocatable :: p62 end type63 type derived_a164 type(t), allocatable :: p(:)65 end type66 67 real, target :: real_target, real_array_target(100)68 character(10), target :: char_target, char_array_target(100)69 70contains71 72! -----------------------------------------------------------------------------73! Test allocatable component references74! -----------------------------------------------------------------------------75 76! CHECK-LABEL: func @_QMacompPref_scalar_real_a(77! 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>>>}>>>{{.*}}) {78subroutine ref_scalar_real_a(a0_0, a1_0, a0_1, a1_1)79 type(real_a0) :: a0_0, a0_1(100)80 type(real_a1) :: a1_0, a1_1(100)81 82 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[arg0]], p : (!fir.ref<!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>>) -> !fir.ref<!fir.box<!fir.heap<f32>>>83 ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.heap<f32>>>84 ! CHECK: %[[addr:.*]] = fir.box_addr %[[load]] : (!fir.box<!fir.heap<f32>>) -> !fir.heap<f32>85 ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] : (!fir.heap<f32>) -> !fir.ref<f32>86 ! CHECK: fir.call @_QPtakes_real_scalar(%[[cast]]) {{.*}}: (!fir.ref<f32>) -> ()87 call takes_real_scalar(a0_0%p)88 89 ! 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>>}>>90 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_1_coor]], p : (!fir.ref<!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>>) -> !fir.ref<!fir.box<!fir.heap<f32>>>91 ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.heap<f32>>>92 ! CHECK: %[[addr:.*]] = fir.box_addr %[[load]] : (!fir.box<!fir.heap<f32>>) -> !fir.heap<f32>93 ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] : (!fir.heap<f32>) -> !fir.ref<f32>94 ! CHECK: fir.call @_QPtakes_real_scalar(%[[cast]]) {{.*}}: (!fir.ref<f32>) -> ()95 call takes_real_scalar(a0_1(5)%p)96 97 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[arg1]], p : (!fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>98 ! CHECK: %[[box:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>99 ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>100 ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)101 ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64102 ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64103 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[addr]], %[[index]] : (!fir.heap<!fir.array<?xf32>>, i64) -> !fir.ref<f32>104 ! CHECK: fir.call @_QPtakes_real_scalar(%[[coor]]) {{.*}}: (!fir.ref<f32>) -> ()105 call takes_real_scalar(a1_0%p(7))106 107 ! 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>>>}>>108 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_1_coor]], p : (!fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>109 ! CHECK: %[[box:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>110 ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>111 ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)112 ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64113 ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64114 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[addr]], %[[index]] : (!fir.heap<!fir.array<?xf32>>, i64) -> !fir.ref<f32>115 ! CHECK: fir.call @_QPtakes_real_scalar(%[[coor]]) {{.*}}: (!fir.ref<f32>) -> ()116 call takes_real_scalar(a1_1(5)%p(7))117end subroutine118 119! CHECK-LABEL: func @_QMacompPref_array_real_a(120! 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>>>}>>>{{.*}}) {121! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_0]], p : (!fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>122! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>123! CHECK: %[[VAL_5:.*]] = arith.constant 0 : index124! CHECK: %[[VAL_6:.*]]:3 = fir.box_dims %[[VAL_4]], %[[VAL_5]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)125! CHECK: %[[VAL_7:.*]] = fir.box_addr %[[VAL_4]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>126! CHECK: %[[VAL_8:.*]] = arith.constant 20 : i64127! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> index128! CHECK: %[[VAL_10:.*]] = arith.constant 2 : i64129! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index130! CHECK: %[[VAL_12:.*]] = arith.constant 50 : i64131! CHECK: %[[VAL_13:.*]] = fir.convert %[[VAL_12]] : (i64) -> index132! CHECK: %[[VAL_14:.*]] = fir.shape_shift %[[VAL_6]]#0, %[[VAL_6]]#1 : (index, index) -> !fir.shapeshift<1>133! CHECK: %[[VAL_15:.*]] = fir.slice %[[VAL_9]], %[[VAL_13]], %[[VAL_11]] : (index, index, index) -> !fir.slice<1>134! 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>>135! CHECK: %[[VAL_16_NEW:.*]] = fir.convert %[[VAL_16]] : (!fir.box<!fir.array<16xf32>>) -> !fir.box<!fir.array<?xf32>>136! CHECK: fir.call @_QPtakes_real_array(%[[VAL_16_NEW]]) {{.*}}: (!fir.box<!fir.array<?xf32>>) -> ()137! CHECK: %[[VAL_17:.*]] = arith.constant 5 : i64138! CHECK: %[[VAL_18:.*]] = arith.constant 1 : i64139! CHECK: %[[VAL_19:.*]] = arith.subi %[[VAL_17]], %[[VAL_18]] : i64140! 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>>>}>>141! CHECK: %[[VAL_22:.*]] = fir.coordinate_of %[[VAL_20]], p : (!fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>142! CHECK: %[[VAL_23:.*]] = fir.load %[[VAL_22]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>143! CHECK: %[[VAL_24:.*]] = arith.constant 0 : index144! CHECK: %[[VAL_25:.*]]:3 = fir.box_dims %[[VAL_23]], %[[VAL_24]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)145! CHECK: %[[VAL_26:.*]] = fir.box_addr %[[VAL_23]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>146! CHECK: %[[VAL_27:.*]] = arith.constant 20 : i64147! CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i64) -> index148! CHECK: %[[VAL_29:.*]] = arith.constant 2 : i64149! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i64) -> index150! CHECK: %[[VAL_31:.*]] = arith.constant 50 : i64151! CHECK: %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (i64) -> index152! CHECK: %[[VAL_33:.*]] = fir.shape_shift %[[VAL_25]]#0, %[[VAL_25]]#1 : (index, index) -> !fir.shapeshift<1>153! CHECK: %[[VAL_34:.*]] = fir.slice %[[VAL_28]], %[[VAL_32]], %[[VAL_30]] : (index, index, index) -> !fir.slice<1>154! 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>>155! CHECK: %[[VAL_35_NEW:.*]] = fir.convert %[[VAL_35]] : (!fir.box<!fir.array<16xf32>>) -> !fir.box<!fir.array<?xf32>>156! CHECK: fir.call @_QPtakes_real_array(%[[VAL_35_NEW]]) {{.*}}: (!fir.box<!fir.array<?xf32>>) -> ()157! CHECK: return158! CHECK: }159 160subroutine ref_array_real_a(a1_0, a1_1)161 type(real_a1) :: a1_0, a1_1(100)162 call takes_real_array(a1_0%p(20:50:2))163 call takes_real_array(a1_1(5)%p(20:50:2))164end subroutine165 166! CHECK-LABEL: func @_QMacompPref_scalar_cst_char_a167! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})168subroutine ref_scalar_cst_char_a(a0_0, a1_0, a0_1, a1_1)169 type(cst_char_a0) :: a0_0, a0_1(100)170 type(cst_char_a1) :: a1_0, a1_1(100)171 172 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], p173 ! CHECK: %[[box:.*]] = fir.load %[[coor]]174 ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]]175 ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}}176 ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])177 call takes_char_scalar(a0_0%p)178 179 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}180 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p181 ! CHECK: %[[box:.*]] = fir.load %[[coor]]182 ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]]183 ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}}184 ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])185 call takes_char_scalar(a0_1(5)%p)186 187 188 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], p189 ! CHECK: %[[box:.*]] = fir.load %[[coor]]190 ! CHECK-DAG: %[[base:.*]] = fir.box_addr %[[box]]191 ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}192 ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64193 ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64194 ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[base]], %[[index]]195 ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}}196 ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])197 call takes_char_scalar(a1_0%p(7))198 199 200 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}201 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p202 ! CHECK: %[[box:.*]] = fir.load %[[coor]]203 ! CHECK-DAG: %[[base:.*]] = fir.box_addr %[[box]]204 ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}205 ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64206 ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64207 ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[base]], %[[index]]208 ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}}209 ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])210 call takes_char_scalar(a1_1(5)%p(7))211 212end subroutine213 214! CHECK-LABEL: func @_QMacompPref_scalar_def_char_a215! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})216subroutine ref_scalar_def_char_a(a0_0, a1_0, a0_1, a1_1)217 type(def_char_a0) :: a0_0, a0_1(100)218 type(def_char_a1) :: a1_0, a1_1(100)219 220 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], p221 ! CHECK: %[[box:.*]] = fir.load %[[coor]]222 ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]]223 ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]]224 ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %[[len]]225 ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])226 call takes_char_scalar(a0_0%p)227 228 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}229 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p230 ! CHECK: %[[box:.*]] = fir.load %[[coor]]231 ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]]232 ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]]233 ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %[[len]]234 ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])235 call takes_char_scalar(a0_1(5)%p)236 237 238 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], p239 ! CHECK: %[[box:.*]] = fir.load %[[coor]]240 ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}241 ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]]242 ! CHECK-DAG: %[[base:.*]] = fir.box_addr %[[box]]243 ! CHECK: %[[cast:.*]] = fir.convert %[[base]] : (!fir.heap<!fir.array<?x!fir.char<1,?>>>) -> !fir.ref<!fir.array<?x!fir.char<1,?>>>244 ! CHECK: %[[c7:.*]] = fir.convert %c7{{.*}} : (i64) -> index245 ! CHECK: %[[sub:.*]] = arith.subi %[[c7]], %[[dims]]#0 : index246 ! CHECK: %[[mul:.*]] = arith.muli %[[len]], %[[sub]] : index247 ! CHECK: %[[offset:.*]] = arith.addi %[[mul]], %c0{{.*}} : index248 ! CHECK: %[[cnvt:.*]] = fir.convert %[[cast]]249 ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[cnvt]], %[[offset]]250 ! CHECK: %[[cnvt:.*]] = fir.convert %[[addr]]251 ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[cnvt]], %[[len]]252 ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])253 call takes_char_scalar(a1_0%p(7))254 255 256 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}257 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p258 ! CHECK: %[[box:.*]] = fir.load %[[coor]]259 ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}260 ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]]261 ! CHECK-DAG: %[[base:.*]] = fir.box_addr %[[box]]262 ! CHECK: %[[cast:.*]] = fir.convert %[[base]] : (!fir.heap<!fir.array<?x!fir.char<1,?>>>) -> !fir.ref<!fir.array<?x!fir.char<1,?>>>263 ! CHECK: %[[c7:.*]] = fir.convert %c7{{.*}} : (i64) -> index264 ! CHECK: %[[sub:.*]] = arith.subi %[[c7]], %[[dims]]#0 : index265 ! CHECK: %[[mul:.*]] = arith.muli %[[len]], %[[sub]] : index266 ! CHECK: %[[offset:.*]] = arith.addi %[[mul]], %c0{{.*}} : index267 ! CHECK: %[[cnvt:.*]] = fir.convert %[[cast]]268 ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[cnvt]], %[[offset]]269 ! CHECK: %[[cnvt:.*]] = fir.convert %[[addr]]270 ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[cnvt]], %[[len]]271 ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])272 call takes_char_scalar(a1_1(5)%p(7))273 274end subroutine275 276! CHECK-LABEL: func @_QMacompPref_scalar_derived277! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})278subroutine ref_scalar_derived(a0_0, a1_0, a0_1, a1_1)279 type(derived_a0) :: a0_0, a0_1(100)280 type(derived_a1) :: a1_0, a1_1(100)281 282 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], p283 ! CHECK: %[[box:.*]] = fir.load %[[coor]]284 ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], x285 ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]])286 call takes_real_scalar(a0_0%p%x)287 288 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}289 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p290 ! CHECK: %[[box:.*]] = fir.load %[[coor]]291 ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], x292 ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]])293 call takes_real_scalar(a0_1(5)%p%x)294 295 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], p296 ! CHECK: %[[box:.*]] = fir.load %[[coor]]297 ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}298 ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64299 ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64300 ! CHECK: %[[elem:.*]] = fir.coordinate_of %[[box]], %[[index]]301 ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[elem]], x302 ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]])303 call takes_real_scalar(a1_0%p(7)%x)304 305 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}306 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p307 ! CHECK: %[[box:.*]] = fir.load %[[coor]]308 ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}309 ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64310 ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64311 ! CHECK: %[[elem:.*]] = fir.coordinate_of %[[box]], %[[index]]312 ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[elem]], x313 ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]])314 call takes_real_scalar(a1_1(5)%p(7)%x)315 316end subroutine317 318! -----------------------------------------------------------------------------319! Test passing allocatable component references as allocatables320! -----------------------------------------------------------------------------321 322! CHECK-LABEL: func @_QMacompPpass_real_a323! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})324subroutine pass_real_a(a0_0, a1_0, a0_1, a1_1)325 type(real_a0) :: a0_0, a0_1(100)326 type(real_a1) :: a1_0, a1_1(100)327 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], p328 ! CHECK: fir.call @_QPtakes_real_scalar_pointer(%[[coor]])329 call takes_real_scalar_pointer(a0_0%p)330 331 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}332 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p333 ! CHECK: fir.call @_QPtakes_real_scalar_pointer(%[[coor]])334 call takes_real_scalar_pointer(a0_1(5)%p)335 336 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], p337 ! CHECK: fir.call @_QPtakes_real_array_pointer(%[[coor]])338 call takes_real_array_pointer(a1_0%p)339 340 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}341 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p342 ! CHECK: fir.call @_QPtakes_real_array_pointer(%[[coor]])343 call takes_real_array_pointer(a1_1(5)%p)344end subroutine345 346! -----------------------------------------------------------------------------347! Test usage in intrinsics where pointer aspect matters348! -----------------------------------------------------------------------------349 350! CHECK-LABEL: func @_QMacompPallocated_p351! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})352subroutine allocated_p(a0_0, a1_0, a0_1, a1_1)353 type(real_a0) :: a0_0, a0_1(100)354 type(def_char_a1) :: a1_0, a1_1(100)355 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], p356 ! CHECK: %[[box:.*]] = fir.load %[[coor]]357 ! CHECK: fir.box_addr %[[box]]358 call takes_logical(allocated(a0_0%p))359 360 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}361 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p362 ! CHECK: %[[box:.*]] = fir.load %[[coor]]363 ! CHECK: fir.box_addr %[[box]]364 call takes_logical(allocated(a0_1(5)%p))365 366 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], p367 ! CHECK: %[[box:.*]] = fir.load %[[coor]]368 ! CHECK: fir.box_addr %[[box]]369 call takes_logical(allocated(a1_0%p))370 371 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}372 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p373 ! CHECK: %[[box:.*]] = fir.load %[[coor]]374 ! CHECK: fir.box_addr %[[box]]375 call takes_logical(allocated(a1_1(5)%p))376end subroutine377 378! -----------------------------------------------------------------------------379! Test allocation380! -----------------------------------------------------------------------------381 382! CHECK-LABEL: func @_QMacompPallocate_real383! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})384subroutine allocate_real(a0_0, a1_0, a0_1, a1_1)385 type(real_a0) :: a0_0, a0_1(100)386 type(real_a1) :: a1_0, a1_1(100)387 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], p388 ! CHECK: fir.store {{.*}} to %[[coor]]389 allocate(a0_0%p)390 391 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}392 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p393 ! CHECK: fir.store {{.*}} to %[[coor]]394 allocate(a0_1(5)%p)395 396 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], p397 ! CHECK: fir.store {{.*}} to %[[coor]]398 allocate(a1_0%p(100))399 400 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}401 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p402 ! CHECK: fir.store {{.*}} to %[[coor]]403 allocate(a1_1(5)%p(100))404end subroutine405 406! CHECK-LABEL: func @_QMacompPallocate_cst_char407! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})408subroutine allocate_cst_char(a0_0, a1_0, a0_1, a1_1)409 type(cst_char_a0) :: a0_0, a0_1(100)410 type(cst_char_a1) :: a1_0, a1_1(100)411 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], p412 ! CHECK: fir.store {{.*}} to %[[coor]]413 allocate(a0_0%p)414 415 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}416 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p417 ! CHECK: fir.store {{.*}} to %[[coor]]418 allocate(a0_1(5)%p)419 420 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], p421 ! CHECK: fir.store {{.*}} to %[[coor]]422 allocate(a1_0%p(100))423 424 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}425 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p426 ! CHECK: fir.store {{.*}} to %[[coor]]427 allocate(a1_1(5)%p(100))428end subroutine429 430! CHECK-LABEL: func @_QMacompPallocate_def_char431! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})432subroutine allocate_def_char(a0_0, a1_0, a0_1, a1_1)433 type(def_char_a0) :: a0_0, a0_1(100)434 type(def_char_a1) :: a1_0, a1_1(100)435 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], p436 ! CHECK: fir.store {{.*}} to %[[coor]]437 allocate(character(18)::a0_0%p)438 439 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}440 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p441 ! CHECK: fir.store {{.*}} to %[[coor]]442 allocate(character(18)::a0_1(5)%p)443 444 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], p445 ! CHECK: fir.store {{.*}} to %[[coor]]446 allocate(character(18)::a1_0%p(100))447 448 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}449 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p450 ! CHECK: fir.store {{.*}} to %[[coor]]451 allocate(character(18)::a1_1(5)%p(100))452end subroutine453 454! -----------------------------------------------------------------------------455! Test deallocation456! -----------------------------------------------------------------------------457 458! CHECK-LABEL: func @_QMacompPdeallocate_real459! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})460subroutine deallocate_real(a0_0, a1_0, a0_1, a1_1)461 type(real_a0) :: a0_0, a0_1(100)462 type(real_a1) :: a1_0, a1_1(100)463 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], p464 ! CHECK: fir.store {{.*}} to %[[coor]]465 deallocate(a0_0%p)466 467 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}468 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p469 ! CHECK: fir.store {{.*}} to %[[coor]]470 deallocate(a0_1(5)%p)471 472 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], p473 ! CHECK: fir.store {{.*}} to %[[coor]]474 deallocate(a1_0%p)475 476 ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}477 ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], p478 ! CHECK: fir.store {{.*}} to %[[coor]]479 deallocate(a1_1(5)%p)480end subroutine481 482! -----------------------------------------------------------------------------483! Test a recursive derived type reference484! -----------------------------------------------------------------------------485 486! CHECK: func @_QMacompPtest_recursive487! CHECK-SAME: (%[[x:.*]]: {{.*}})488subroutine test_recursive(x)489 type t490 integer :: i491 type(t), allocatable :: next492 end type493 type(t) :: x494 495 ! CHECK: %[[next1:.*]] = fir.coordinate_of %[[x]], next496 ! CHECK: %[[nextBox1:.*]] = fir.load %[[next1]]497 ! CHECK: %[[next2:.*]] = fir.coordinate_of %[[nextBox1]], next498 ! CHECK: %[[nextBox2:.*]] = fir.load %[[next2]]499 ! CHECK: %[[next3:.*]] = fir.coordinate_of %[[nextBox2]], next500 ! CHECK: %[[nextBox3:.*]] = fir.load %[[next3]]501 ! CHECK: %[[i:.*]] = fir.coordinate_of %[[nextBox3]], i502 ! CHECK: %[[nextBox3:.*]] = fir.load %[[i]] : !fir.ref<i32>503 print *, x%next%next%next%i504end subroutine505 506end module507