brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 7ec620b Raw
55 lines · plain
1! Test lowering of allocatable and pointer sub-part reference to HLFIR2! As opposed to whole reference, a pointer/allocatable dereference must3! be inserted and addressed in a following hlfir.designate to address4! the sub-part.5 6! RUN: bbc -emit-hlfir -o - %s -I nw | FileCheck %s7 8module m9  type t110    real :: x11  end type12  type t213    type(t1), pointer :: p14  end type15  type t316    character(:), allocatable :: a(:)17  end type18end module19 20subroutine test_pointer_component_followed_by_component_ref(x)21  use m22  type(t2) :: x23  call takes_real(x%p%x)24end subroutine25! CHECK-LABEL: func.func @_QPtest_pointer_component_followed_by_component_ref(26! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %{{.*}} {{.*}}Ex27! CHECK:  %[[VAL_2:.*]] = hlfir.designate %[[VAL_1]]#0{"p"}   {fortran_attrs = #fir.var_attrs<pointer>} : (!fir.ref<!fir.type<_QMmTt2{p:!fir.box<!fir.ptr<!fir.type<_QMmTt1{x:f32}>>>}>>) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMmTt1{x:f32}>>>>28! CHECK:  %[[VAL_3:.*]] = fir.load %[[VAL_2]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMmTt1{x:f32}>>>>29! CHECK:  %[[VAL_4:.*]] = fir.box_addr %[[VAL_3:.*]] : (!fir.box<!fir.ptr<!fir.type<_QMmTt1{x:f32}>>>) -> !fir.ptr<!fir.type<_QMmTt1{x:f32}>>30! CHECK:  hlfir.designate %[[VAL_4]]{"x"}   : (!fir.ptr<!fir.type<_QMmTt1{x:f32}>>) -> !fir.ref<f32>31 32subroutine test_symbol_followed_by_ref(x)33  character(:), allocatable :: x(:)34  call test_char(x(10))35end subroutine36! CHECK-LABEL: func.func @_QPtest_symbol_followed_by_ref(37! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = {{.*}}Ex"38! CHECK:  %[[VAL_2:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>>39! CHECK:  %[[VAL_3:.*]] = fir.box_elesize %[[VAL_2]] : (!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>) -> index40! CHECK:  %[[VAL_4:.*]] = arith.constant 10 : index41! CHECK:  %[[VAL_5:.*]] = hlfir.designate %[[VAL_2]] (%[[VAL_4]])  typeparams %[[VAL_3]] : (!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>, index, index) -> !fir.boxchar<1>42 43subroutine test_component_followed_by_ref(x)44  use m45  type(t3) :: x46  call test_char(x%a(10))47end subroutine48! CHECK-LABEL: func.func @_QPtest_component_followed_by_ref(49! CHECK:  %[[VAL_1:.*]]:2 = hlfir.declare %{{.*}} {{.*}}Ex50! CHECK:  %[[VAL_2:.*]] = hlfir.designate %[[VAL_1]]#0{"a"}   {fortran_attrs = #fir.var_attrs<allocatable>} : (!fir.ref<!fir.type<_QMmTt3{a:!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>}>>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>>51! CHECK:  %[[VAL_3:.*]] = fir.load %[[VAL_2]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>>52! CHECK:  %[[VAL_4:.*]] = fir.box_elesize %[[VAL_3]] : (!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>) -> index53! CHECK:  %[[VAL_5:.*]] = arith.constant 10 : index54! CHECK:  %[[VAL_6:.*]] = hlfir.designate %[[VAL_3]] (%[[VAL_5]])  typeparams %[[VAL_4]] : (!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>, index, index) -> !fir.boxchar<1>55