brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.6 KiB · bc508fb Raw
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