brintos

brintos / llvm-project-archived public Read only

0
0
Text · 26.2 KiB · e6bb9c3 Raw
422 lines · plain
1! Test lowering of component reference to HLFIR2! RUN: bbc -emit-hlfir -o - %s | FileCheck %s3module comp_ref4type t15  integer :: scalar_i6  real :: scalar_x7end type8 9type t210  integer :: scalar_i211  type(t1) :: scalar_t112end type13 14type t_char15  integer :: scalar_i16  character(5) :: scalar_char17end type18 19type t_array20  integer :: scalar_i21  real :: array_comp(10,20)22end type23 24type t_array_lbs25  integer :: scalar_i26  real :: array_comp_lbs(2:11,3:22)27end type28 29type t_array_char30  integer :: scalar_i31  character(5) :: array_char_comp(10,20)32end type33 34type t_complex35   complex :: array_comp(2:11,3:22)36end type37end module38 39!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!40!                            Test scalar bases                                 !41!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!42 43subroutine test_scalar(a)44  use comp_ref45  type(t1) :: a46  call use_real_scalar(a%scalar_x)47! CHECK-LABEL: func.func @_QPtest_scalar(48! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]]  {{.*}}Ea49! CHECK:  %[[VAL_2:.*]] = hlfir.designate %[[VAL_1]]#0{"scalar_x"}   : (!fir.ref<!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>) -> !fir.ref<f32>50end subroutine51 52subroutine test_scalar_char(a)53  use comp_ref54  type(t_char) :: a55  call use_char_scalar(a%scalar_char)56! CHECK-LABEL: func.func @_QPtest_scalar_char(57! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]]  {{.*}}Ea58! CHECK:  %[[VAL_2:.*]] = arith.constant 5 : index59! CHECK:  %[[VAL_3:.*]] = hlfir.designate %[[VAL_1]]#0{"scalar_char"}   typeparams %[[VAL_2]] : (!fir.ref<!fir.type<_QMcomp_refTt_char{scalar_i:i32,scalar_char:!fir.char<1,5>}>>, index) -> !fir.ref<!fir.char<1,5>>60end subroutine61 62subroutine test_scalar_char_substring(a)63  use comp_ref64  type(t_char) :: a65  call use_char_scalar(a%scalar_char(3:))66! CHECK-LABEL: func.func @_QPtest_scalar_char_substring(67! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]]  {{.*}}Ea68! CHECK:  %[[VAL_2:.*]] = arith.constant 3 : index69! CHECK:  %[[VAL_3:.*]] = arith.constant 5 : index70! CHECK:  %[[VAL_4:.*]] = arith.constant 3 : index71! CHECK:  %[[VAL_5:.*]] = hlfir.designate %[[VAL_1]]#0{"scalar_char"}  substr %[[VAL_2]], %[[VAL_3]]  typeparams %[[VAL_4]] : (!fir.ref<!fir.type<_QMcomp_refTt_char{scalar_i:i32,scalar_char:!fir.char<1,5>}>>, index, index, index) -> !fir.ref<!fir.char<1,3>>72end subroutine73 74subroutine test_array_comp_1(a)75  use comp_ref76  type(t_array) :: a77  call use_real_array(a%array_comp)78! CHECK-LABEL: func.func @_QPtest_array_comp_1(79! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]]  {{.*}}Ea80! CHECK:  %[[VAL_2:.*]] = arith.constant 10 : index81! CHECK:  %[[VAL_3:.*]] = arith.constant 20 : index82! CHECK:  %[[VAL_4:.*]] = fir.shape %[[VAL_2]], %[[VAL_3]] : (index, index) -> !fir.shape<2>83! CHECK:  %[[VAL_5:.*]] = hlfir.designate %[[VAL_1]]#0{"array_comp"}   shape %[[VAL_4]] : (!fir.ref<!fir.type<_QMcomp_refTt_array{scalar_i:i32,array_comp:!fir.array<10x20xf32>}>>, !fir.shape<2>) -> !fir.ref<!fir.array<10x20xf32>>84end subroutine85 86subroutine test_array_comp_slice(a)87  use comp_ref88  type(t_array) :: a89  ! Contiguous90  call use_real_array(a%array_comp(:, 4:20:1))91! CHECK-LABEL: func.func @_QPtest_array_comp_slice(92! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]]  {{.*}}Ea93! CHECK:  %[[VAL_2:.*]] = arith.constant 10 : index94! CHECK:  %[[VAL_3:.*]] = arith.constant 20 : index95! CHECK:  %[[VAL_4:.*]] = fir.shape %[[VAL_2]], %[[VAL_3]] : (index, index) -> !fir.shape<2>96! CHECK:  %[[VAL_5:.*]] = arith.constant 1 : index97! CHECK:  %[[VAL_6:.*]] = arith.constant 1 : index98! CHECK:  %[[VAL_7:.*]] = arith.constant 10 : index99! CHECK:  %[[VAL_8:.*]] = arith.constant 4 : index100! CHECK:  %[[VAL_9:.*]] = arith.constant 20 : index101! CHECK:  %[[VAL_10:.*]] = arith.constant 1 : index102! CHECK:  %[[VAL_11:.*]] = arith.constant 17 : index103! CHECK:  %[[VAL_12:.*]] = fir.shape %[[VAL_7]], %[[VAL_11]] : (index, index) -> !fir.shape<2>104! CHECK:  %[[VAL_13:.*]] = hlfir.designate %[[VAL_1]]#0{"array_comp"} <%[[VAL_4]]> (%[[VAL_5]]:%[[VAL_2]]:%[[VAL_6]], %[[VAL_8]]:%[[VAL_9]]:%[[VAL_10]])  shape %[[VAL_12]] : (!fir.ref<!fir.type<_QMcomp_refTt_array{scalar_i:i32,array_comp:!fir.array<10x20xf32>}>>, !fir.shape<2>, index, index, index, index, index, index, !fir.shape<2>) -> !fir.ref<!fir.array<10x17xf32>>105end subroutine106 107subroutine test_array_comp_non_contiguous_slice(a)108  use comp_ref109  type(t_array) :: a110  ! Not contiguous111  print *, a%array_comp(1:6:1, 4:20:1)112! CHECK-LABEL: func.func @_QPtest_array_comp_non_contiguous_slice(113! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]]  {{.*}}Ea114! CHECK:  %[[VAL_7:.*]] = arith.constant 10 : index115! CHECK:  %[[VAL_8:.*]] = arith.constant 20 : index116! CHECK:  %[[VAL_9:.*]] = fir.shape %[[VAL_7]], %[[VAL_8]] : (index, index) -> !fir.shape<2>117! CHECK:  %[[VAL_10:.*]] = arith.constant 1 : index118! CHECK:  %[[VAL_11:.*]] = arith.constant 6 : index119! CHECK:  %[[VAL_12:.*]] = arith.constant 1 : index120! CHECK:  %[[VAL_13:.*]] = arith.constant 6 : index121! CHECK:  %[[VAL_14:.*]] = arith.constant 4 : index122! CHECK:  %[[VAL_15:.*]] = arith.constant 20 : index123! CHECK:  %[[VAL_16:.*]] = arith.constant 1 : index124! CHECK:  %[[VAL_17:.*]] = arith.constant 17 : index125! CHECK:  %[[VAL_18:.*]] = fir.shape %[[VAL_13]], %[[VAL_17]] : (index, index) -> !fir.shape<2>126! CHECK:  %[[VAL_19:.*]] = hlfir.designate %[[VAL_1]]#0{"array_comp"} <%[[VAL_9]]> (%[[VAL_10]]:%[[VAL_11]]:%[[VAL_12]], %[[VAL_14]]:%[[VAL_15]]:%[[VAL_16]])  shape %[[VAL_18]] : (!fir.ref<!fir.type<_QMcomp_refTt_array{scalar_i:i32,array_comp:!fir.array<10x20xf32>}>>, !fir.shape<2>, index, index, index, index, index, index, !fir.shape<2>) -> !fir.box<!fir.array<6x17xf32>>127end subroutine128 129subroutine test_array_lbs_array_ctor()130  use comp_ref131  type(t_array_lbs) :: a(-1:1)132  real :: array_comp(2:11,3:22)133  a = (/ (t_array_lbs(i, array_comp), i=-1,1) /)134! CHECK: hlfir.designate %{{.+}}#0{"array_comp_lbs"} <%{{.+}}> shape %{{.+}} {fortran_attrs = #fir.var_attrs<contiguous>}135! CHECK-SAME: (!fir.ref<!fir.type<_QMcomp_refTt_array_lbs{scalar_i:i32,array_comp_lbs:!fir.array<10x20xf32>}>>, !fir.shapeshift<2>, !fir.shapeshift<2>)136! CHECK-SAME: -> !fir.box<!fir.array<10x20xf32>>137end subroutine138 139subroutine test_array_lbs_comp_lbs_1(a)140  use comp_ref141  type(t_array_lbs) :: a142  call use_real_array(a%array_comp_lbs)143! CHECK-LABEL: func.func @_QPtest_array_lbs_comp_lbs_1(144! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]]  {{.*}}Ea145! CHECK:  %[[VAL_2:.*]] = arith.constant 10 : index146! CHECK:  %[[VAL_3:.*]] = arith.constant 20 : index147! CHECK:  %[[VAL_4:.*]] = arith.constant 2 : index148! CHECK:  %[[VAL_5:.*]] = arith.constant 3 : index149! CHECK:  %[[VAL_6:.*]] = fir.shape_shift %[[VAL_4]], %[[VAL_2]], %[[VAL_5]], %[[VAL_3]] : (index, index, index, index) -> !fir.shapeshift<2>150! CHECK:  %[[VAL_7:.*]] = hlfir.designate %[[VAL_1]]#0{"array_comp_lbs"}   shape %[[VAL_6]] : (!fir.ref<!fir.type<_QMcomp_refTt_array_lbs{scalar_i:i32,array_comp_lbs:!fir.array<10x20xf32>}>>, !fir.shapeshift<2>) -> !fir.box<!fir.array<10x20xf32>>151end subroutine152 153subroutine test_array_lbs_comp_lbs_slice(a)154  use comp_ref155  type(t_array_lbs) :: a156  ! Contiguous157  call use_real_array(a%array_comp_lbs(:, 4:20:1))158! CHECK-LABEL: func.func @_QPtest_array_lbs_comp_lbs_slice(159! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]]  {{.*}}Ea160! CHECK:  %[[VAL_2:.*]] = arith.constant 10 : index161! CHECK:  %[[VAL_3:.*]] = arith.constant 20 : index162! CHECK:  %[[VAL_4:.*]] = arith.constant 2 : index163! CHECK:  %[[VAL_5:.*]] = arith.constant 3 : index164! CHECK:  %[[VAL_6:.*]] = fir.shape_shift %[[VAL_4]], %[[VAL_2]], %[[VAL_5]], %[[VAL_3]] : (index, index, index, index) -> !fir.shapeshift<2>165! CHECK:  %[[VAL_7:.*]] = arith.constant 1 : index166! CHECK:  %[[VAL_8:.*]] = arith.addi %[[VAL_4]], %[[VAL_2]] : index167! CHECK:  %[[VAL_9:.*]] = arith.subi %[[VAL_8]], %[[VAL_7]] : index168! CHECK:  %[[VAL_10:.*]] = arith.constant 1 : index169! CHECK:  %[[VAL_11:.*]] = arith.constant 10 : index170! CHECK:  %[[VAL_12:.*]] = arith.constant 4 : index171! CHECK:  %[[VAL_13:.*]] = arith.constant 20 : index172! CHECK:  %[[VAL_14:.*]] = arith.constant 1 : index173! CHECK:  %[[VAL_15:.*]] = arith.constant 17 : index174! CHECK:  %[[VAL_16:.*]] = fir.shape %[[VAL_11]], %[[VAL_15]] : (index, index) -> !fir.shape<2>175! CHECK:  %[[VAL_17:.*]] = hlfir.designate %[[VAL_1]]#0{"array_comp_lbs"} <%[[VAL_6]]> (%[[VAL_4]]:%[[VAL_9]]:%[[VAL_10]], %[[VAL_12]]:%[[VAL_13]]:%[[VAL_14]])  shape %[[VAL_16]] : (!fir.ref<!fir.type<_QMcomp_refTt_array_lbs{scalar_i:i32,array_comp_lbs:!fir.array<10x20xf32>}>>, !fir.shapeshift<2>, index, index, index, index, index, index, !fir.shape<2>) -> !fir.ref<!fir.array<10x17xf32>>176end subroutine177 178subroutine test_array_char_comp_1(a)179  use comp_ref180  type(t_array_char) :: a181  call use_array_char(a%array_char_comp)182! CHECK-LABEL: func.func @_QPtest_array_char_comp_1(183! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]]  {{.*}}Ea184! CHECK:  %[[VAL_2:.*]] = arith.constant 10 : index185! CHECK:  %[[VAL_3:.*]] = arith.constant 20 : index186! CHECK:  %[[VAL_4:.*]] = fir.shape %[[VAL_2]], %[[VAL_3]] : (index, index) -> !fir.shape<2>187! CHECK:  %[[VAL_5:.*]] = arith.constant 5 : index188! CHECK:  %[[VAL_6:.*]] = hlfir.designate %[[VAL_1]]#0{"array_char_comp"}   shape %[[VAL_4]] typeparams %[[VAL_5]] : (!fir.ref<!fir.type<_QMcomp_refTt_array_char{scalar_i:i32,array_char_comp:!fir.array<10x20x!fir.char<1,5>>}>>, !fir.shape<2>, index) -> !fir.ref<!fir.array<10x20x!fir.char<1,5>>>189end subroutine190 191subroutine test_array_char_comp_slice(a)192  use comp_ref193  type(t_array_char) :: a194  ! Contiguous195  call use_array_char(a%array_char_comp(:, 4:20:1))196! CHECK-LABEL: func.func @_QPtest_array_char_comp_slice(197! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]]  {{.*}}Ea198! CHECK:  %[[VAL_2:.*]] = arith.constant 10 : index199! CHECK:  %[[VAL_3:.*]] = arith.constant 20 : index200! CHECK:  %[[VAL_4:.*]] = fir.shape %[[VAL_2]], %[[VAL_3]] : (index, index) -> !fir.shape<2>201! CHECK:  %[[VAL_5:.*]] = arith.constant 5 : index202! CHECK:  %[[VAL_6:.*]] = arith.constant 1 : index203! CHECK:  %[[VAL_7:.*]] = arith.constant 1 : index204! CHECK:  %[[VAL_8:.*]] = arith.constant 10 : index205! CHECK:  %[[VAL_9:.*]] = arith.constant 4 : index206! CHECK:  %[[VAL_10:.*]] = arith.constant 20 : index207! CHECK:  %[[VAL_11:.*]] = arith.constant 1 : index208! CHECK:  %[[VAL_12:.*]] = arith.constant 17 : index209! CHECK:  %[[VAL_13:.*]] = fir.shape %[[VAL_8]], %[[VAL_12]] : (index, index) -> !fir.shape<2>210! CHECK:  %[[VAL_14:.*]] = hlfir.designate %[[VAL_1]]#0{"array_char_comp"} <%[[VAL_4]]> (%[[VAL_6]]:%[[VAL_2]]:%[[VAL_7]], %[[VAL_9]]:%[[VAL_10]]:%[[VAL_11]])  shape %[[VAL_13]] typeparams %[[VAL_5]] : (!fir.ref<!fir.type<_QMcomp_refTt_array_char{scalar_i:i32,array_char_comp:!fir.array<10x20x!fir.char<1,5>>}>>, !fir.shape<2>, index, index, index, index, index, index, !fir.shape<2>, index) -> !fir.ref<!fir.array<10x17x!fir.char<1,5>>>211end subroutine212 213subroutine test_array_char_comp_non_contiguous_slice(a)214  use comp_ref215  type(t_array_char) :: a216  ! Not contiguous217  print *, a%array_char_comp(1:10:1,1:20:1)(2:4)218! CHECK-LABEL: func.func @_QPtest_array_char_comp_non_contiguous_slice(219! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]]  {{.*}}Ea220! CHECK:  %[[VAL_7:.*]] = arith.constant 10 : index221! CHECK:  %[[VAL_8:.*]] = arith.constant 20 : index222! CHECK:  %[[VAL_9:.*]] = fir.shape %[[VAL_7]], %[[VAL_8]] : (index, index) -> !fir.shape<2>223! CHECK:  %[[VAL_10:.*]] = arith.constant 1 : index224! CHECK:  %[[VAL_11:.*]] = arith.constant 10 : index225! CHECK:  %[[VAL_12:.*]] = arith.constant 1 : index226! CHECK:  %[[VAL_13:.*]] = arith.constant 10 : index227! CHECK:  %[[VAL_14:.*]] = arith.constant 1 : index228! CHECK:  %[[VAL_15:.*]] = arith.constant 20 : index229! CHECK:  %[[VAL_16:.*]] = arith.constant 1 : index230! CHECK:  %[[VAL_17:.*]] = arith.constant 20 : index231! CHECK:  %[[VAL_18:.*]] = fir.shape %[[VAL_13]], %[[VAL_17]] : (index, index) -> !fir.shape<2>232! CHECK:  %[[VAL_19:.*]] = arith.constant 2 : index233! CHECK:  %[[VAL_20:.*]] = arith.constant 4 : index234! CHECK:  %[[VAL_21:.*]] = arith.constant 3 : index235! CHECK:  %[[VAL_22:.*]] = hlfir.designate %[[VAL_1]]#0{"array_char_comp"} <%[[VAL_9]]> (%[[VAL_10]]:%[[VAL_11]]:%[[VAL_12]], %[[VAL_14]]:%[[VAL_15]]:%[[VAL_16]]) substr %[[VAL_19]], %[[VAL_20]]  shape %[[VAL_18]] typeparams %[[VAL_21]] : (!fir.ref<!fir.type<_QMcomp_refTt_array_char{scalar_i:i32,array_char_comp:!fir.array<10x20x!fir.char<1,5>>}>>, !fir.shape<2>, index, index, index, index, index, index, index, index, !fir.shape<2>, index) -> !fir.box<!fir.array<10x20x!fir.char<1,3>>>236end subroutine237 238!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!239!                            Test array bases                                  !240!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!241 242subroutine test_array(a)243  use comp_ref244  type(t1) :: a(:)245  print *, a%scalar_x246! CHECK-LABEL: func.func @_QPtest_array(247! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]]  {{.*}}Ea248! CHECK:  %[[VAL_7:.*]] = arith.constant 0 : index249! CHECK:  %[[VAL_8:.*]]:3 = fir.box_dims %[[VAL_1]]#0, %[[VAL_7]] : (!fir.box<!fir.array<?x!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>>, index) -> (index, index, index)250! CHECK:  %[[VAL_9:.*]] = fir.shape %[[VAL_8]]#1 : (index) -> !fir.shape<1>251! CHECK:  %[[VAL_10:.*]] = hlfir.designate %[[VAL_1]]#0{"scalar_x"}   shape %[[VAL_9]] : (!fir.box<!fir.array<?x!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>>, !fir.shape<1>) -> !fir.box<!fir.array<?xf32>>252end subroutine253 254subroutine test_array_char(a, n)255  use comp_ref256  integer(8) :: n257  type(t_char) :: a(n)258  print *, a%scalar_char259! CHECK-LABEL: func.func @_QPtest_array_char(260! CHECK:  %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]](%[[VAL_8:[a-z0-9]*]])  {{.*}}Ea261! CHECK:  %[[VAL_15:.*]] = arith.constant 5 : index262! CHECK:  %[[VAL_16:.*]] = hlfir.designate %[[VAL_9]]#0{"scalar_char"}   shape %[[VAL_8]] typeparams %[[VAL_15]] : (!fir.box<!fir.array<?x!fir.type<_QMcomp_refTt_char{scalar_i:i32,scalar_char:!fir.char<1,5>}>>>, !fir.shape<1>, index) -> !fir.box<!fir.array<?x!fir.char<1,5>>>263end subroutine264 265subroutine test_array_char_substring(a)266  use comp_ref267  type(t_char) :: a(100)268  print *, a%scalar_char(3:)269! CHECK-LABEL: func.func @_QPtest_array_char_substring(270! CHECK:  %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]](%[[VAL_2:[a-z0-9]*]])  {{.*}}Ea271! CHECK:  %[[VAL_9:.*]] = arith.constant 3 : index272! CHECK:  %[[VAL_10:.*]] = arith.constant 5 : index273! CHECK:  %[[VAL_11:.*]] = arith.constant 3 : index274! CHECK:  %[[VAL_12:.*]] = hlfir.designate %[[VAL_3]]#0{"scalar_char"}  substr %[[VAL_9]], %[[VAL_10]]  shape %[[VAL_2]] typeparams %[[VAL_11]] : (!fir.ref<!fir.array<100x!fir.type<_QMcomp_refTt_char{scalar_i:i32,scalar_char:!fir.char<1,5>}>>>, index, index, !fir.shape<1>, index) -> !fir.box<!fir.array<100x!fir.char<1,3>>>275end subroutine276 277subroutine test_array_array_comp_1(a)278  use comp_ref279  type(t_array) :: a(100)280  print *, a%array_comp(4,5)281! CHECK-LABEL: func.func @_QPtest_array_array_comp_1(282! CHECK:  %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]](%[[VAL_2:[a-z0-9]*]])  {{.*}}Ea283! CHECK:  %[[VAL_9:.*]] = arith.constant 10 : index284! CHECK:  %[[VAL_10:.*]] = arith.constant 20 : index285! CHECK:  %[[VAL_11:.*]] = fir.shape %[[VAL_9]], %[[VAL_10]] : (index, index) -> !fir.shape<2>286! CHECK:  %[[VAL_12:.*]] = arith.constant 4 : index287! CHECK:  %[[VAL_13:.*]] = arith.constant 5 : index288! CHECK:  %[[VAL_14:.*]] = hlfir.designate %[[VAL_3]]#0{"array_comp"} <%[[VAL_11]]> (%[[VAL_12]], %[[VAL_13]])  shape %[[VAL_2]] : (!fir.ref<!fir.array<100x!fir.type<_QMcomp_refTt_array{scalar_i:i32,array_comp:!fir.array<10x20xf32>}>>>, !fir.shape<2>, index, index, !fir.shape<1>) -> !fir.box<!fir.array<100xf32>>289end subroutine290 291!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!292! Test several part ref (produces chain of hlfir.designate)                    !293!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!294 295subroutine test_scalar_chain(a)296  use comp_ref297  type(t2) :: a298  call use_real_scalar(a%scalar_t1%scalar_x)299! CHECK-LABEL: func.func @_QPtest_scalar_chain(300! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]]  {{.*}}Ea301! CHECK:  %[[VAL_2:.*]] = hlfir.designate %[[VAL_1]]#0{"scalar_t1"}   : (!fir.ref<!fir.type<_QMcomp_refTt2{scalar_i2:i32,scalar_t1:!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>}>>) -> !fir.ref<!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>302! CHECK:  %[[VAL_3:.*]] = hlfir.designate %[[VAL_2]]{"scalar_x"}   : (!fir.ref<!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>) -> !fir.ref<f32>303end subroutine304 305subroutine test_array_scalar_chain(a)306  use comp_ref307  type(t2) :: a(100)308  print *, a%scalar_t1%scalar_x309! CHECK-LABEL: func.func @_QPtest_array_scalar_chain(310! CHECK:  %[[VAL_1:.*]] = arith.constant 100 : index311! CHECK:  %[[VAL_2:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1>312! CHECK:  %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]](%[[VAL_2:[a-z0-9]*]])  {{.*}}Ea313! CHECK:  %[[VAL_9:.*]] = hlfir.designate %[[VAL_3]]#0{"scalar_t1"}   shape %[[VAL_2]] : (!fir.ref<!fir.array<100x!fir.type<_QMcomp_refTt2{scalar_i2:i32,scalar_t1:!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>}>>>, !fir.shape<1>) -> !fir.box<!fir.array<100x!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>>314! CHECK:  %[[VAL_10:.*]] = hlfir.designate %[[VAL_9]]{"scalar_x"}   shape %[[VAL_2]] : (!fir.box<!fir.array<100x!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>>, !fir.shape<1>) -> !fir.box<!fir.array<100xf32>>315end subroutine316 317subroutine test_scalar_chain_2(a)318  use comp_ref319  type(t1) :: a(50)320  print *, a(10)%scalar_x321! CHECK-LABEL: func.func @_QPtest_scalar_chain_2(322! CHECK:  %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]](%[[VAL_2:[a-z0-9]*]])  {{.*}}Ea323! CHECK:  %[[VAL_9:.*]] = arith.constant 10 : index324! CHECK:  %[[VAL_10:.*]] = hlfir.designate %[[VAL_3]]#0 (%[[VAL_9]])  : (!fir.ref<!fir.array<50x!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>>, index) -> !fir.ref<!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>325! CHECK:  %[[VAL_11:.*]] = hlfir.designate %[[VAL_10]]{"scalar_x"}   : (!fir.ref<!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>) -> !fir.ref<f32>326end subroutine327 328subroutine test_array_ref_chain(a)329  use comp_ref330  type(t_array) :: a(100)331  print *, a(1:50:5)%array_comp(4,5)332! CHECK-LABEL: func.func @_QPtest_array_ref_chain(333! CHECK:  %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0:[a-z0-9]*]](%[[VAL_2:[a-z0-9]*]])  {{.*}}Ea334! CHECK:  %[[VAL_9:.*]] = arith.constant 1 : index335! CHECK:  %[[VAL_10:.*]] = arith.constant 50 : index336! CHECK:  %[[VAL_11:.*]] = arith.constant 5 : index337! CHECK:  %[[VAL_12:.*]] = arith.constant 10 : index338! CHECK:  %[[VAL_13:.*]] = fir.shape %[[VAL_12]] : (index) -> !fir.shape<1>339! CHECK:  %[[VAL_14:.*]] = hlfir.designate %[[VAL_3]]#0 (%[[VAL_9]]:%[[VAL_10]]:%[[VAL_11]])  shape %[[VAL_13]] : (!fir.ref<!fir.array<100x!fir.type<_QMcomp_refTt_array{scalar_i:i32,array_comp:!fir.array<10x20xf32>}>>>, index, index, index, !fir.shape<1>) -> !fir.box<!fir.array<10x!fir.type<_QMcomp_refTt_array{scalar_i:i32,array_comp:!fir.array<10x20xf32>}>>>340! CHECK:  %[[VAL_15:.*]] = arith.constant 10 : index341! CHECK:  %[[VAL_16:.*]] = arith.constant 20 : index342! CHECK:  %[[VAL_17:.*]] = fir.shape %[[VAL_15]], %[[VAL_16]] : (index, index) -> !fir.shape<2>343! CHECK:  %[[VAL_18:.*]] = arith.constant 4 : index344! CHECK:  %[[VAL_19:.*]] = arith.constant 5 : index345! CHECK:  %[[VAL_20:.*]] = hlfir.designate %[[VAL_14]]{"array_comp"} <%[[VAL_17]]> (%[[VAL_18]], %[[VAL_19]])  shape %[[VAL_13]] : (!fir.box<!fir.array<10x!fir.type<_QMcomp_refTt_array{scalar_i:i32,array_comp:!fir.array<10x20xf32>}>>>, !fir.shape<2>, index, index, !fir.shape<1>) -> !fir.box<!fir.array<10xf32>>346end subroutine347 348subroutine test_scalar_array_complex_chain(a)349  use comp_ref350  type(t_complex) :: a351  print *, a%array_comp%im352! CHECK-LABEL:   func.func @_QPtest_scalar_array_complex_chain(353! CHECK:           %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFtest_scalar_array_complex_chainEa"} : (!fir.ref<!fir.type<_QMcomp_refTt_complex{array_comp:!fir.array<10x20xcomplex<f32>>}>>, !fir.dscope) -> (!fir.ref<!fir.type<_QMcomp_refTt_complex{array_comp:!fir.array<10x20xcomplex<f32>>}>>, !fir.ref<!fir.type<_QMcomp_refTt_complex{array_comp:!fir.array<10x20xcomplex<f32>>}>>)354! CHECK:           %[[VAL_7:.*]] = arith.constant 10 : index355! CHECK:           %[[VAL_8:.*]] = arith.constant 20 : index356! CHECK:           %[[VAL_9:.*]] = arith.constant 2 : index357! CHECK:           %[[VAL_10:.*]] = arith.constant 3 : index358! CHECK:           %[[VAL_11:.*]] = fir.shape_shift %[[VAL_9]], %[[VAL_7]], %[[VAL_10]], %[[VAL_8]] : (index, index, index, index) -> !fir.shapeshift<2>359! CHECK:           %[[VAL_12:.*]] = arith.constant 1 : index360! CHECK:           %[[VAL_13:.*]] = arith.constant 1 : index361! CHECK:           %[[VAL_14:.*]] = arith.addi %[[VAL_9]], %[[VAL_7]] : index362! CHECK:           %[[VAL_15:.*]] = arith.subi %[[VAL_14]], %[[VAL_13]] : index363! CHECK:           %[[VAL_16:.*]] = arith.addi %[[VAL_10]], %[[VAL_8]] : index364! CHECK:           %[[VAL_17:.*]] = arith.subi %[[VAL_16]], %[[VAL_13]] : index365! CHECK:           %[[VAL_18:.*]] = arith.constant 0 : index366! CHECK:           %[[VAL_19:.*]] = arith.subi %[[VAL_15]], %[[VAL_9]] : index367! CHECK:           %[[VAL_20:.*]] = arith.addi %[[VAL_19]], %[[VAL_12]] : index368! CHECK:           %[[VAL_21:.*]] = arith.divsi %[[VAL_20]], %[[VAL_12]] : index369! CHECK:           %[[VAL_22:.*]] = arith.cmpi sgt, %[[VAL_21]], %[[VAL_18]] : index370! CHECK:           %[[VAL_23:.*]] = arith.select %[[VAL_22]], %[[VAL_21]], %[[VAL_18]] : index371! CHECK:           %[[VAL_24:.*]] = arith.constant 0 : index372! CHECK:           %[[VAL_25:.*]] = arith.subi %[[VAL_17]], %[[VAL_10]] : index373! CHECK:           %[[VAL_26:.*]] = arith.addi %[[VAL_25]], %[[VAL_12]] : index374! CHECK:           %[[VAL_27:.*]] = arith.divsi %[[VAL_26]], %[[VAL_12]] : index375! CHECK:           %[[VAL_28:.*]] = arith.cmpi sgt, %[[VAL_27]], %[[VAL_24]] : index376! CHECK:           %[[VAL_29:.*]] = arith.select %[[VAL_28]], %[[VAL_27]], %[[VAL_24]] : index377! CHECK:           %[[VAL_30:.*]] = fir.shape %[[VAL_23]], %[[VAL_29]] : (index, index) -> !fir.shape<2>378! CHECK:           %[[VAL_31:.*]] = hlfir.designate %[[VAL_1]]#0{"array_comp"} <%[[VAL_11]]> (%[[VAL_9]]:%[[VAL_15]]:%[[VAL_12]], %[[VAL_10]]:%[[VAL_17]]:%[[VAL_12]]) imag shape %[[VAL_30]] : (!fir.ref<!fir.type<_QMcomp_refTt_complex{array_comp:!fir.array<10x20xcomplex<f32>>}>>, !fir.shapeshift<2>, index, index, index, index, index, index, !fir.shape<2>) -> !fir.box<!fir.array<10x20xf32>>379end subroutine380 381subroutine test_poly_array_vector_subscript(p, v, r)382  use comp_ref383  class(t1),pointer :: p(:)384  integer v(3)385  integer r(3)386  r = p(v)%scalar_i387end subroutine test_poly_array_vector_subscript388! CHECK-LABEL:   func.func @_QPtest_poly_array_vector_subscript(389! CHECK-SAME:      %[[VAL_0:.*]]: !fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>>>> {fir.bindc_name = "p"},390! CHECK-SAME:      %[[VAL_1:.*]]: !fir.ref<!fir.array<3xi32>> {fir.bindc_name = "v"},391! CHECK-SAME:      %[[VAL_2:.*]]: !fir.ref<!fir.array<3xi32>> {fir.bindc_name = "r"}) {392! CHECK:           %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFtest_poly_array_vector_subscriptEp"} : (!fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>>>>, !fir.dscope) -> (!fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>>>>, !fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>>>>)393! CHECK:           %[[VAL_4:.*]] = arith.constant 3 : index394! CHECK:           %[[VAL_5:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>395! CHECK:           %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_2]](%[[VAL_5]]) dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFtest_poly_array_vector_subscriptEr"} : (!fir.ref<!fir.array<3xi32>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<3xi32>>, !fir.ref<!fir.array<3xi32>>)396! CHECK:           %[[VAL_7:.*]] = arith.constant 3 : index397! CHECK:           %[[VAL_8:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1>398! CHECK:           %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_8]]) dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFtest_poly_array_vector_subscriptEv"} : (!fir.ref<!fir.array<3xi32>>, !fir.shape<1>, !fir.dscope) -> (!fir.ref<!fir.array<3xi32>>, !fir.ref<!fir.array<3xi32>>)399! CHECK:           %[[VAL_10:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>>>>400! CHECK:           %[[VAL_11:.*]] = hlfir.elemental %[[VAL_8]] unordered : (!fir.shape<1>) -> !hlfir.expr<3xi64> {401! CHECK:           ^bb0(%[[VAL_12:.*]]: index):402! CHECK:             %[[VAL_13:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_12]])  : (!fir.ref<!fir.array<3xi32>>, index) -> !fir.ref<i32>403! CHECK:             %[[VAL_14:.*]] = fir.load %[[VAL_13]] : !fir.ref<i32>404! CHECK:             %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (i32) -> i64405! CHECK:             hlfir.yield_element %[[VAL_15]] : i64406! CHECK:           }407! CHECK:           %[[VAL_16:.*]] = arith.constant 3 : index408! CHECK:           %[[VAL_17:.*]] = fir.shape %[[VAL_16]] : (index) -> !fir.shape<1>409! CHECK:           %[[VAL_18:.*]] = hlfir.elemental %[[VAL_17]] unordered : (!fir.shape<1>) -> !hlfir.expr<3xi32> {410! CHECK:           ^bb0(%[[VAL_19:.*]]: index):411! CHECK:             %[[VAL_20:.*]] = hlfir.apply %[[VAL_11]], %[[VAL_19]] : (!hlfir.expr<3xi64>, index) -> i64412! CHECK:             %[[VAL_21:.*]] = hlfir.designate %[[VAL_10]] (%[[VAL_20]])  : (!fir.class<!fir.ptr<!fir.array<?x!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>>>, i64) -> !fir.class<!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>413! CHECK:             %[[VAL_22:.*]] = hlfir.designate %[[VAL_21]]{"scalar_i"}   : (!fir.class<!fir.type<_QMcomp_refTt1{scalar_i:i32,scalar_x:f32}>>) -> !fir.ref<i32>414! CHECK:             %[[VAL_23:.*]] = fir.load %[[VAL_22]] : !fir.ref<i32>415! CHECK:             hlfir.yield_element %[[VAL_23]] : i32416! CHECK:           }417! CHECK:           hlfir.assign %[[VAL_18]] to %[[VAL_6]]#0 : !hlfir.expr<3xi32>, !fir.ref<!fir.array<3xi32>>418! CHECK:           hlfir.destroy %[[VAL_18]] : !hlfir.expr<3xi32>419! CHECK:           hlfir.destroy %[[VAL_11]] : !hlfir.expr<3xi64>420! CHECK:           return421! CHECK:         }422