172276bdaSValentin Clement! Test lowering of pointer components 272276bdaSValentin Clement! RUN: bbc -emit-fir %s -o - | FileCheck %s 372276bdaSValentin Clement 472276bdaSValentin Clementmodule pcomp 572276bdaSValentin Clement implicit none 672276bdaSValentin Clement type t 772276bdaSValentin Clement real :: x 872276bdaSValentin Clement integer :: i 972276bdaSValentin Clement end type 1072276bdaSValentin Clement interface 1172276bdaSValentin Clement subroutine takes_real_scalar(x) 1272276bdaSValentin Clement real :: x 1372276bdaSValentin Clement end subroutine 1472276bdaSValentin Clement subroutine takes_char_scalar(x) 1572276bdaSValentin Clement character(*) :: x 1672276bdaSValentin Clement end subroutine 1772276bdaSValentin Clement subroutine takes_derived_scalar(x) 1872276bdaSValentin Clement import t 1972276bdaSValentin Clement type(t) :: x 2072276bdaSValentin Clement end subroutine 2172276bdaSValentin Clement subroutine takes_real_array(x) 2272276bdaSValentin Clement real :: x(:) 2372276bdaSValentin Clement end subroutine 2472276bdaSValentin Clement subroutine takes_char_array(x) 2572276bdaSValentin Clement character(*) :: x(:) 2672276bdaSValentin Clement end subroutine 2772276bdaSValentin Clement subroutine takes_derived_array(x) 2872276bdaSValentin Clement import t 2972276bdaSValentin Clement type(t) :: x(:) 3072276bdaSValentin Clement end subroutine 3172276bdaSValentin Clement subroutine takes_real_scalar_pointer(x) 3272276bdaSValentin Clement real, pointer :: x 3372276bdaSValentin Clement end subroutine 3472276bdaSValentin Clement subroutine takes_real_array_pointer(x) 3572276bdaSValentin Clement real, pointer :: x(:) 3672276bdaSValentin Clement end subroutine 3772276bdaSValentin Clement subroutine takes_logical(x) 3872276bdaSValentin Clement logical :: x 3972276bdaSValentin Clement end subroutine 4072276bdaSValentin Clement end interface 4172276bdaSValentin Clement 4272276bdaSValentin Clement type real_p0 4372276bdaSValentin Clement real, pointer :: p 4472276bdaSValentin Clement end type 4572276bdaSValentin Clement type real_p1 4672276bdaSValentin Clement real, pointer :: p(:) 4772276bdaSValentin Clement end type 4872276bdaSValentin Clement type cst_char_p0 4972276bdaSValentin Clement character(10), pointer :: p 5072276bdaSValentin Clement end type 5172276bdaSValentin Clement type cst_char_p1 5272276bdaSValentin Clement character(10), pointer :: p(:) 5372276bdaSValentin Clement end type 5472276bdaSValentin Clement type def_char_p0 5572276bdaSValentin Clement character(:), pointer :: p 5672276bdaSValentin Clement end type 5772276bdaSValentin Clement type def_char_p1 5872276bdaSValentin Clement character(:), pointer :: p(:) 5972276bdaSValentin Clement end type 6072276bdaSValentin Clement type derived_p0 6172276bdaSValentin Clement type(t), pointer :: p 6272276bdaSValentin Clement end type 6372276bdaSValentin Clement type derived_p1 6472276bdaSValentin Clement type(t), pointer :: p(:) 6572276bdaSValentin Clement end type 6672276bdaSValentin Clement 6772276bdaSValentin Clement real, target :: real_target, real_array_target(100) 6872276bdaSValentin Clement character(10), target :: char_target, char_array_target(100) 6972276bdaSValentin Clement 7072276bdaSValentin Clementcontains 7172276bdaSValentin Clement 7272276bdaSValentin Clement! ----------------------------------------------------------------------------- 7372276bdaSValentin Clement! Test pointer component references 7472276bdaSValentin Clement! ----------------------------------------------------------------------------- 7572276bdaSValentin Clement 7672276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPref_scalar_real_p( 7772276bdaSValentin Clement! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>{{.*}}, %[[arg1:.*]]: !fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>{{.*}}, %[[arg2:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>>{{.*}}, %[[arg3:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>>{{.*}}) { 7872276bdaSValentin Clementsubroutine ref_scalar_real_p(p0_0, p1_0, p0_1, p1_1) 7972276bdaSValentin Clement type(real_p0) :: p0_0, p0_1(100) 8072276bdaSValentin Clement type(real_p1) :: p1_0, p1_1(100) 8172276bdaSValentin Clement 8272276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p, !fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}> 8372276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[arg0]], %[[fld]] : (!fir.ref<!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<f32>>> 8472276bdaSValentin Clement ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.ptr<f32>>> 8572276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.box_addr %[[load]] : (!fir.box<!fir.ptr<f32>>) -> !fir.ptr<f32> 8672276bdaSValentin Clement ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] : (!fir.ptr<f32>) -> !fir.ref<f32> 8772276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar(%[[cast]]) : (!fir.ref<f32>) -> () 8872276bdaSValentin Clement call takes_real_scalar(p0_0%p) 8972276bdaSValentin Clement 9072276bdaSValentin Clement ! CHECK: %[[p0_1_coor:.*]] = fir.coordinate_of %[[arg2]], %{{.*}} : (!fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>>, i64) -> !fir.ref<!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>> 9172276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p, !fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}> 9272276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_1_coor]], %[[fld]] : (!fir.ref<!fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<f32>>> 9372276bdaSValentin Clement ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.ptr<f32>>> 9472276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.box_addr %[[load]] : (!fir.box<!fir.ptr<f32>>) -> !fir.ptr<f32> 9572276bdaSValentin Clement ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] : (!fir.ptr<f32>) -> !fir.ref<f32> 9672276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar(%[[cast]]) : (!fir.ref<f32>) -> () 9772276bdaSValentin Clement call takes_real_scalar(p0_1(5)%p) 9872276bdaSValentin Clement 9972276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p, !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}> 10072276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[arg1]], %[[fld]] : (!fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> 10172276bdaSValentin Clement ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> 10272276bdaSValentin Clement ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[load]], %c0{{.*}} : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, index) -> (index, index, index) 10372276bdaSValentin Clement ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 10472276bdaSValentin Clement ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64 10572276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[load]], %[[index]] : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, i64) -> !fir.ref<f32> 10672276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar(%[[coor]]) : (!fir.ref<f32>) -> () 10772276bdaSValentin Clement call takes_real_scalar(p1_0%p(7)) 10872276bdaSValentin Clement 10972276bdaSValentin Clement ! CHECK: %[[p1_1_coor:.*]] = fir.coordinate_of %[[arg3]], %{{.*}} : (!fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>>, i64) -> !fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>> 11072276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p, !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}> 11172276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_1_coor]], %[[fld]] : (!fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> 11272276bdaSValentin Clement ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> 11372276bdaSValentin Clement ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[load]], %c0{{.*}} : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, index) -> (index, index, index) 11472276bdaSValentin Clement ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 11572276bdaSValentin Clement ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64 11672276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[load]], %[[index]] : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, i64) -> !fir.ref<f32> 11772276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar(%[[coor]]) : (!fir.ref<f32>) -> () 11872276bdaSValentin Clement call takes_real_scalar(p1_1(5)%p(7)) 11972276bdaSValentin Clementend subroutine 12072276bdaSValentin Clement 1213348c083SValentin Clement! CHECK-LABEL: func @_QMpcompPref_array_real_p( 1223348c083SValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>>{{.*}}) { 1233348c083SValentin Clement! CHECK: %[[VAL_2:.*]] = fir.field_index p, !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}> 1243348c083SValentin Clement! CHECK: %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_0]], %[[VAL_2]] : (!fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> 1253348c083SValentin Clement! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_3]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> 1263348c083SValentin Clement! CHECK: %[[VAL_5:.*]] = arith.constant 0 : index 1273348c083SValentin Clement! CHECK: %[[VAL_6:.*]]:3 = fir.box_dims %[[VAL_4]], %[[VAL_5]] : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, index) -> (index, index, index) 1283348c083SValentin Clement! CHECK: %[[VAL_7:.*]] = arith.constant 20 : i64 1293348c083SValentin Clement! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i64) -> index 1303348c083SValentin Clement! CHECK: %[[VAL_9:.*]] = arith.constant 2 : i64 1313348c083SValentin Clement! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i64) -> index 1323348c083SValentin Clement! CHECK: %[[VAL_11:.*]] = arith.constant 50 : i64 1333348c083SValentin Clement! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_11]] : (i64) -> index 1343348c083SValentin Clement! CHECK: %[[VAL_13:.*]] = fir.shift %[[VAL_6]]#0 : (index) -> !fir.shift<1> 1353348c083SValentin Clement! CHECK: %[[VAL_14:.*]] = fir.slice %[[VAL_8]], %[[VAL_12]], %[[VAL_10]] : (index, index, index) -> !fir.slice<1> 136*13f9089aSPeixin Qiao! CHECK: %[[VAL_15:.*]] = fir.rebox %[[VAL_4]](%[[VAL_13]]) {{\[}}%[[VAL_14]]] : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, !fir.shift<1>, !fir.slice<1>) -> !fir.box<!fir.array<16xf32>> 137*13f9089aSPeixin Qiao! CHECK: %[[VAL_15_NEW:.*]] = fir.convert %[[VAL_15]] : (!fir.box<!fir.array<16xf32>>) -> !fir.box<!fir.array<?xf32>> 138*13f9089aSPeixin Qiao! CHECK: fir.call @_QPtakes_real_array(%[[VAL_15_NEW]]) : (!fir.box<!fir.array<?xf32>>) -> () 1393348c083SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.constant 5 : i64 1403348c083SValentin Clement! CHECK: %[[VAL_17:.*]] = arith.constant 1 : i64 1413348c083SValentin Clement! CHECK: %[[VAL_18:.*]] = arith.subi %[[VAL_16]], %[[VAL_17]] : i64 1423348c083SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_18]] : (!fir.ref<!fir.array<100x!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>>, i64) -> !fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>> 1433348c083SValentin Clement! CHECK: %[[VAL_20:.*]] = fir.field_index p, !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}> 1443348c083SValentin Clement! CHECK: %[[VAL_21:.*]] = fir.coordinate_of %[[VAL_19]], %[[VAL_20]] : (!fir.ref<!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> 1453348c083SValentin Clement! CHECK: %[[VAL_22:.*]] = fir.load %[[VAL_21]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>> 1463348c083SValentin Clement! CHECK: %[[VAL_23:.*]] = arith.constant 0 : index 1473348c083SValentin Clement! CHECK: %[[VAL_24:.*]]:3 = fir.box_dims %[[VAL_22]], %[[VAL_23]] : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, index) -> (index, index, index) 1483348c083SValentin Clement! CHECK: %[[VAL_25:.*]] = arith.constant 20 : i64 1493348c083SValentin Clement! CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i64) -> index 1503348c083SValentin Clement! CHECK: %[[VAL_27:.*]] = arith.constant 2 : i64 1513348c083SValentin Clement! CHECK: %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i64) -> index 1523348c083SValentin Clement! CHECK: %[[VAL_29:.*]] = arith.constant 50 : i64 1533348c083SValentin Clement! CHECK: %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i64) -> index 1543348c083SValentin Clement! CHECK: %[[VAL_31:.*]] = fir.shift %[[VAL_24]]#0 : (index) -> !fir.shift<1> 1553348c083SValentin Clement! CHECK: %[[VAL_32:.*]] = fir.slice %[[VAL_26]], %[[VAL_30]], %[[VAL_28]] : (index, index, index) -> !fir.slice<1> 156*13f9089aSPeixin Qiao! CHECK: %[[VAL_33:.*]] = fir.rebox %[[VAL_22]](%[[VAL_31]]) {{\[}}%[[VAL_32]]] : (!fir.box<!fir.ptr<!fir.array<?xf32>>>, !fir.shift<1>, !fir.slice<1>) -> !fir.box<!fir.array<16xf32>> 157*13f9089aSPeixin Qiao! CHECK: %[[VAL_33_NEW:.*]] = fir.convert %[[VAL_33]] : (!fir.box<!fir.array<16xf32>>) -> !fir.box<!fir.array<?xf32>> 158*13f9089aSPeixin Qiao! CHECK: fir.call @_QPtakes_real_array(%[[VAL_33_NEW]]) : (!fir.box<!fir.array<?xf32>>) -> () 1593348c083SValentin Clement! CHECK: return 1603348c083SValentin Clement! CHECK: } 1613348c083SValentin Clement 1623348c083SValentin Clement 1633348c083SValentin Clementsubroutine ref_array_real_p(p1_0, p1_1) 1643348c083SValentin Clement type(real_p1) :: p1_0, p1_1(100) 1653348c083SValentin Clement call takes_real_array(p1_0%p(20:50:2)) 1663348c083SValentin Clement call takes_real_array(p1_1(5)%p(20:50:2)) 1673348c083SValentin Clementend subroutine 1683348c083SValentin Clement 16972276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPassign_scalar_real 17072276bdaSValentin Clement! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}}) 17172276bdaSValentin Clementsubroutine assign_scalar_real_p(p0_0, p1_0, p0_1, p1_1) 17272276bdaSValentin Clement type(real_p0) :: p0_0, p0_1(100) 17372276bdaSValentin Clement type(real_p1) :: p1_0, p1_1(100) 17472276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 17572276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], %[[fld]] 17672276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 17772276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] 17872276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[addr]] 17972276bdaSValentin Clement p0_0%p = 1. 18072276bdaSValentin Clement 18172276bdaSValentin Clement ! CHECK: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}} 18272276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 18372276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 18472276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 18572276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] 18672276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[addr]] 18772276bdaSValentin Clement p0_1(5)%p = 2. 18872276bdaSValentin Clement 18972276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 19072276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], %[[fld]] 19172276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 19272276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], {{.*}} 19372276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[addr]] 19472276bdaSValentin Clement p1_0%p(7) = 3. 19572276bdaSValentin Clement 19672276bdaSValentin Clement ! CHECK: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}} 19772276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 19872276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 19972276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 20072276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], {{.*}} 20172276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[addr]] 20272276bdaSValentin Clement p1_1(5)%p(7) = 4. 20372276bdaSValentin Clementend subroutine 20472276bdaSValentin Clement 20572276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPref_scalar_cst_char_p 20672276bdaSValentin Clement! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}}) 20772276bdaSValentin Clementsubroutine ref_scalar_cst_char_p(p0_0, p1_0, p0_1, p1_1) 20872276bdaSValentin Clement type(cst_char_p0) :: p0_0, p0_1(100) 20972276bdaSValentin Clement type(cst_char_p1) :: p1_0, p1_1(100) 21072276bdaSValentin Clement 21172276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 21272276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], %[[fld]] 21372276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 21472276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] 21572276bdaSValentin Clement ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] 21672276bdaSValentin Clement ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[cast]], %c10{{.*}} 21772276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 21872276bdaSValentin Clement call takes_char_scalar(p0_0%p) 21972276bdaSValentin Clement 22072276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}} 22172276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 22272276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 22372276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 22472276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] 22572276bdaSValentin Clement ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] 22672276bdaSValentin Clement ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[cast]], %c10{{.*}} 22772276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 22872276bdaSValentin Clement call takes_char_scalar(p0_1(5)%p) 22972276bdaSValentin Clement 23072276bdaSValentin Clement 23172276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 23272276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], %[[fld]] 23372276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 23472276bdaSValentin Clement ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} 23572276bdaSValentin Clement ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 23672276bdaSValentin Clement ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] 23772276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[index]] 23872276bdaSValentin Clement ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] 23972276bdaSValentin Clement ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[cast]], %c10{{.*}} 24072276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 24172276bdaSValentin Clement call takes_char_scalar(p1_0%p(7)) 24272276bdaSValentin Clement 24372276bdaSValentin Clement 24472276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}} 24572276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 24672276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 24772276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 24872276bdaSValentin Clement ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} 24972276bdaSValentin Clement ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 25072276bdaSValentin Clement ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] 25172276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[index]] 25272276bdaSValentin Clement ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] 25372276bdaSValentin Clement ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[cast]], %c10{{.*}} 25472276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 25572276bdaSValentin Clement call takes_char_scalar(p1_1(5)%p(7)) 25672276bdaSValentin Clement 25772276bdaSValentin Clementend subroutine 25872276bdaSValentin Clement 25972276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPref_scalar_def_char_p 26072276bdaSValentin Clement! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}}) 26172276bdaSValentin Clementsubroutine ref_scalar_def_char_p(p0_0, p1_0, p0_1, p1_1) 26272276bdaSValentin Clement type(def_char_p0) :: p0_0, p0_1(100) 26372276bdaSValentin Clement type(def_char_p1) :: p1_0, p1_1(100) 26472276bdaSValentin Clement 26572276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 26672276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], %[[fld]] 26772276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 26872276bdaSValentin Clement ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]] 26972276bdaSValentin Clement ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]] 27072276bdaSValentin Clement ! CHECK-DAG: %[[cast:.*]] = fir.convert %[[addr]] 27172276bdaSValentin Clement ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[cast]], %[[len]] 27272276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 27372276bdaSValentin Clement call takes_char_scalar(p0_0%p) 27472276bdaSValentin Clement 27572276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}} 27672276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 27772276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 27872276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 27972276bdaSValentin Clement ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]] 28072276bdaSValentin Clement ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]] 28172276bdaSValentin Clement ! CHECK-DAG: %[[cast:.*]] = fir.convert %[[addr]] 28272276bdaSValentin Clement ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[cast]], %[[len]] 28372276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 28472276bdaSValentin Clement call takes_char_scalar(p0_1(5)%p) 28572276bdaSValentin Clement 28672276bdaSValentin Clement 28772276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 28872276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], %[[fld]] 28972276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 29072276bdaSValentin Clement ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]] 29172276bdaSValentin Clement ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} 29272276bdaSValentin Clement ! CHECK-DAG: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 29372276bdaSValentin Clement ! CHECK-DAG: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] 29472276bdaSValentin Clement ! CHECK-DAG: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[index]] 29572276bdaSValentin Clement ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %[[len]] 29672276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 29772276bdaSValentin Clement call takes_char_scalar(p1_0%p(7)) 29872276bdaSValentin Clement 29972276bdaSValentin Clement 30072276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}} 30172276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 30272276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 30372276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 30472276bdaSValentin Clement ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]] 30572276bdaSValentin Clement ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} 30672276bdaSValentin Clement ! CHECK-DAG: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 30772276bdaSValentin Clement ! CHECK-DAG: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] 30872276bdaSValentin Clement ! CHECK-DAG: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[index]] 30972276bdaSValentin Clement ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %[[len]] 31072276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]]) 31172276bdaSValentin Clement call takes_char_scalar(p1_1(5)%p(7)) 31272276bdaSValentin Clement 31372276bdaSValentin Clementend subroutine 31472276bdaSValentin Clement 31572276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPref_scalar_derived 31672276bdaSValentin Clement! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}}) 31772276bdaSValentin Clementsubroutine ref_scalar_derived(p0_0, p1_0, p0_1, p1_1) 31872276bdaSValentin Clement type(derived_p0) :: p0_0, p0_1(100) 31972276bdaSValentin Clement type(derived_p1) :: p1_0, p1_1(100) 32072276bdaSValentin Clement 32172276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 32272276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], %[[fld]] 32372276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 32472276bdaSValentin Clement ! CHECK: %[[fldx:.*]] = fir.field_index x 32572276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[fldx]] 32672276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]]) 32772276bdaSValentin Clement call takes_real_scalar(p0_0%p%x) 32872276bdaSValentin Clement 32972276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}} 33072276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 33172276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 33272276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 33372276bdaSValentin Clement ! CHECK: %[[fldx:.*]] = fir.field_index x 33472276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[fldx]] 33572276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]]) 33672276bdaSValentin Clement call takes_real_scalar(p0_1(5)%p%x) 33772276bdaSValentin Clement 33872276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 33972276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], %[[fld]] 34072276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 34172276bdaSValentin Clement ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} 34272276bdaSValentin Clement ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 34372276bdaSValentin Clement ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] 34472276bdaSValentin Clement ! CHECK: %[[elem:.*]] = fir.coordinate_of %[[box]], %[[index]] 34572276bdaSValentin Clement ! CHECK: %[[fldx:.*]] = fir.field_index x 34672276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[elem]], %[[fldx]] 34772276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]]) 34872276bdaSValentin Clement call takes_real_scalar(p1_0%p(7)%x) 34972276bdaSValentin Clement 35072276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}} 35172276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 35272276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 35372276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 35472276bdaSValentin Clement ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} 35572276bdaSValentin Clement ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64 35672276bdaSValentin Clement ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] 35772276bdaSValentin Clement ! CHECK: %[[elem:.*]] = fir.coordinate_of %[[box]], %[[index]] 35872276bdaSValentin Clement ! CHECK: %[[fldx:.*]] = fir.field_index x 35972276bdaSValentin Clement ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[elem]], %[[fldx]] 36072276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]]) 36172276bdaSValentin Clement call takes_real_scalar(p1_1(5)%p(7)%x) 36272276bdaSValentin Clement 36372276bdaSValentin Clementend subroutine 36472276bdaSValentin Clement 36572276bdaSValentin Clement! ----------------------------------------------------------------------------- 36672276bdaSValentin Clement! Test passing pointer component references as pointers 36772276bdaSValentin Clement! ----------------------------------------------------------------------------- 36872276bdaSValentin Clement 36972276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPpass_real_p 37072276bdaSValentin Clement! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}}) 37172276bdaSValentin Clementsubroutine pass_real_p(p0_0, p1_0, p0_1, p1_1) 37272276bdaSValentin Clement type(real_p0) :: p0_0, p0_1(100) 37372276bdaSValentin Clement type(real_p1) :: p1_0, p1_1(100) 37472276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 37572276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], %[[fld]] 37672276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar_pointer(%[[coor]]) 37772276bdaSValentin Clement call takes_real_scalar_pointer(p0_0%p) 37872276bdaSValentin Clement 37972276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}} 38072276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 38172276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 38272276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_real_scalar_pointer(%[[coor]]) 38372276bdaSValentin Clement call takes_real_scalar_pointer(p0_1(5)%p) 38472276bdaSValentin Clement 38572276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 38672276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], %[[fld]] 38772276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_real_array_pointer(%[[coor]]) 38872276bdaSValentin Clement call takes_real_array_pointer(p1_0%p) 38972276bdaSValentin Clement 39072276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}} 39172276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 39272276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 39372276bdaSValentin Clement ! CHECK: fir.call @_QPtakes_real_array_pointer(%[[coor]]) 39472276bdaSValentin Clement call takes_real_array_pointer(p1_1(5)%p) 39572276bdaSValentin Clementend subroutine 39672276bdaSValentin Clement 39772276bdaSValentin Clement! ----------------------------------------------------------------------------- 39872276bdaSValentin Clement! Test usage in intrinsics where pointer aspect matters 39972276bdaSValentin Clement! ----------------------------------------------------------------------------- 40072276bdaSValentin Clement 40172276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPassociated_p 40272276bdaSValentin Clement! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}}) 40372276bdaSValentin Clementsubroutine associated_p(p0_0, p1_0, p0_1, p1_1) 40472276bdaSValentin Clement type(real_p0) :: p0_0, p0_1(100) 40572276bdaSValentin Clement type(def_char_p1) :: p1_0, p1_1(100) 40672276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 40772276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], %[[fld]] 40872276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 40972276bdaSValentin Clement ! CHECK: fir.box_addr %[[box]] 41072276bdaSValentin Clement call takes_logical(associated(p0_0%p)) 41172276bdaSValentin Clement 41272276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}} 41372276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 41472276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 41572276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 41672276bdaSValentin Clement ! CHECK: fir.box_addr %[[box]] 41772276bdaSValentin Clement call takes_logical(associated(p0_1(5)%p)) 41872276bdaSValentin Clement 41972276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 42072276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], %[[fld]] 42172276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 42272276bdaSValentin Clement ! CHECK: fir.box_addr %[[box]] 42372276bdaSValentin Clement call takes_logical(associated(p1_0%p)) 42472276bdaSValentin Clement 42572276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}} 42672276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 42772276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 42872276bdaSValentin Clement ! CHECK: %[[box:.*]] = fir.load %[[coor]] 42972276bdaSValentin Clement ! CHECK: fir.box_addr %[[box]] 43072276bdaSValentin Clement call takes_logical(associated(p1_1(5)%p)) 43172276bdaSValentin Clementend subroutine 43272276bdaSValentin Clement 43372276bdaSValentin Clement! ----------------------------------------------------------------------------- 43472276bdaSValentin Clement! Test pointer assignment of components 43572276bdaSValentin Clement! ----------------------------------------------------------------------------- 43672276bdaSValentin Clement 43772276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPpassoc_real 43872276bdaSValentin Clement! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}}) 43972276bdaSValentin Clementsubroutine passoc_real(p0_0, p1_0, p0_1, p1_1) 44072276bdaSValentin Clement type(real_p0) :: p0_0, p0_1(100) 44172276bdaSValentin Clement type(real_p1) :: p1_0, p1_1(100) 44272276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 44372276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], %[[fld]] 44472276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 44572276bdaSValentin Clement p0_0%p => real_target 44672276bdaSValentin Clement 44772276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}} 44872276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 44972276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 45072276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 45172276bdaSValentin Clement p0_1(5)%p => real_target 45272276bdaSValentin Clement 45372276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 45472276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], %[[fld]] 45572276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 45672276bdaSValentin Clement p1_0%p => real_array_target 45772276bdaSValentin Clement 45872276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}} 45972276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 46072276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 46172276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 46272276bdaSValentin Clement p1_1(5)%p => real_array_target 46372276bdaSValentin Clementend subroutine 46472276bdaSValentin Clement 46572276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPpassoc_char 46672276bdaSValentin Clement! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}}) 46772276bdaSValentin Clementsubroutine passoc_char(p0_0, p1_0, p0_1, p1_1) 46872276bdaSValentin Clement type(cst_char_p0) :: p0_0, p0_1(100) 46972276bdaSValentin Clement type(def_char_p1) :: p1_0, p1_1(100) 47072276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 47172276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], %[[fld]] 47272276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 47372276bdaSValentin Clement p0_0%p => char_target 47472276bdaSValentin Clement 47572276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}} 47672276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 47772276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 47872276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 47972276bdaSValentin Clement p0_1(5)%p => char_target 48072276bdaSValentin Clement 48172276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 48272276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], %[[fld]] 48372276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 48472276bdaSValentin Clement p1_0%p => char_array_target 48572276bdaSValentin Clement 48672276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}} 48772276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 48872276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 48972276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 49072276bdaSValentin Clement p1_1(5)%p => char_array_target 49172276bdaSValentin Clementend subroutine 49272276bdaSValentin Clement 49372276bdaSValentin Clement! ----------------------------------------------------------------------------- 49472276bdaSValentin Clement! Test nullify of components 49572276bdaSValentin Clement! ----------------------------------------------------------------------------- 49672276bdaSValentin Clement 49772276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPnullify_test 49872276bdaSValentin Clement! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}}) 49972276bdaSValentin Clementsubroutine nullify_test(p0_0, p1_0, p0_1, p1_1) 50072276bdaSValentin Clement type(real_p0) :: p0_0, p0_1(100) 50172276bdaSValentin Clement type(def_char_p1) :: p1_0, p1_1(100) 50272276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 50372276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], %[[fld]] 50472276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 50572276bdaSValentin Clement nullify(p0_0%p) 50672276bdaSValentin Clement 50772276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}} 50872276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 50972276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 51072276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 51172276bdaSValentin Clement nullify(p0_1(5)%p) 51272276bdaSValentin Clement 51372276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 51472276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], %[[fld]] 51572276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 51672276bdaSValentin Clement nullify(p1_0%p) 51772276bdaSValentin Clement 51872276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}} 51972276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 52072276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 52172276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 52272276bdaSValentin Clement nullify(p1_1(5)%p) 52372276bdaSValentin Clementend subroutine 52472276bdaSValentin Clement 52572276bdaSValentin Clement! ----------------------------------------------------------------------------- 52672276bdaSValentin Clement! Test allocation 52772276bdaSValentin Clement! ----------------------------------------------------------------------------- 52872276bdaSValentin Clement 52972276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPallocate_real 53072276bdaSValentin Clement! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}}) 53172276bdaSValentin Clementsubroutine allocate_real(p0_0, p1_0, p0_1, p1_1) 53272276bdaSValentin Clement type(real_p0) :: p0_0, p0_1(100) 53372276bdaSValentin Clement type(real_p1) :: p1_0, p1_1(100) 53472276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 53572276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], %[[fld]] 53672276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 53772276bdaSValentin Clement allocate(p0_0%p) 53872276bdaSValentin Clement 53972276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}} 54072276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 54172276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 54272276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 54372276bdaSValentin Clement allocate(p0_1(5)%p) 54472276bdaSValentin Clement 54572276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 54672276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], %[[fld]] 54772276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 54872276bdaSValentin Clement allocate(p1_0%p(100)) 54972276bdaSValentin Clement 55072276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}} 55172276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 55272276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 55372276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 55472276bdaSValentin Clement allocate(p1_1(5)%p(100)) 55572276bdaSValentin Clementend subroutine 55672276bdaSValentin Clement 55772276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPallocate_cst_char 55872276bdaSValentin Clement! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}}) 55972276bdaSValentin Clementsubroutine allocate_cst_char(p0_0, p1_0, p0_1, p1_1) 56072276bdaSValentin Clement type(cst_char_p0) :: p0_0, p0_1(100) 56172276bdaSValentin Clement type(cst_char_p1) :: p1_0, p1_1(100) 56272276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 56372276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], %[[fld]] 56472276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 56572276bdaSValentin Clement allocate(p0_0%p) 56672276bdaSValentin Clement 56772276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}} 56872276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 56972276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 57072276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 57172276bdaSValentin Clement allocate(p0_1(5)%p) 57272276bdaSValentin Clement 57372276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 57472276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], %[[fld]] 57572276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 57672276bdaSValentin Clement allocate(p1_0%p(100)) 57772276bdaSValentin Clement 57872276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}} 57972276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 58072276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 58172276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 58272276bdaSValentin Clement allocate(p1_1(5)%p(100)) 58372276bdaSValentin Clementend subroutine 58472276bdaSValentin Clement 58572276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPallocate_def_char 58672276bdaSValentin Clement! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}}) 58772276bdaSValentin Clementsubroutine allocate_def_char(p0_0, p1_0, p0_1, p1_1) 58872276bdaSValentin Clement type(def_char_p0) :: p0_0, p0_1(100) 58972276bdaSValentin Clement type(def_char_p1) :: p1_0, p1_1(100) 59072276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 59172276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], %[[fld]] 59272276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 59372276bdaSValentin Clement allocate(character(18)::p0_0%p) 59472276bdaSValentin Clement 59572276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}} 59672276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 59772276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 59872276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 59972276bdaSValentin Clement allocate(character(18)::p0_1(5)%p) 60072276bdaSValentin Clement 60172276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 60272276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], %[[fld]] 60372276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 60472276bdaSValentin Clement allocate(character(18)::p1_0%p(100)) 60572276bdaSValentin Clement 60672276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}} 60772276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 60872276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 60972276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 61072276bdaSValentin Clement allocate(character(18)::p1_1(5)%p(100)) 61172276bdaSValentin Clementend subroutine 61272276bdaSValentin Clement 61372276bdaSValentin Clement! ----------------------------------------------------------------------------- 61472276bdaSValentin Clement! Test deallocation 61572276bdaSValentin Clement! ----------------------------------------------------------------------------- 61672276bdaSValentin Clement 61772276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPdeallocate_real 61872276bdaSValentin Clement! CHECK-SAME: (%[[p0_0:.*]]: {{.*}}, %[[p1_0:.*]]: {{.*}}, %[[p0_1:.*]]: {{.*}}, %[[p1_1:.*]]: {{.*}}) 61972276bdaSValentin Clementsubroutine deallocate_real(p0_0, p1_0, p0_1, p1_1) 62072276bdaSValentin Clement type(real_p0) :: p0_0, p0_1(100) 62172276bdaSValentin Clement type(real_p1) :: p1_0, p1_1(100) 62272276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 62372276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p0_0]], %[[fld]] 62472276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 62572276bdaSValentin Clement deallocate(p0_0%p) 62672276bdaSValentin Clement 62772276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p0_1]], %{{.*}} 62872276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 62972276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 63072276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 63172276bdaSValentin Clement deallocate(p0_1(5)%p) 63272276bdaSValentin Clement 63372276bdaSValentin Clement ! CHECK: %[[fld:.*]] = fir.field_index p 63472276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[p1_0]], %[[fld]] 63572276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 63672276bdaSValentin Clement deallocate(p1_0%p) 63772276bdaSValentin Clement 63872276bdaSValentin Clement ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[p1_1]], %{{.*}} 63972276bdaSValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 64072276bdaSValentin Clement ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]] 64172276bdaSValentin Clement ! CHECK: fir.store {{.*}} to %[[coor]] 64272276bdaSValentin Clement deallocate(p1_1(5)%p) 64372276bdaSValentin Clementend subroutine 64472276bdaSValentin Clement 64572276bdaSValentin Clement! ----------------------------------------------------------------------------- 64672276bdaSValentin Clement! Test a very long component 64772276bdaSValentin Clement! ----------------------------------------------------------------------------- 64872276bdaSValentin Clement 64972276bdaSValentin Clement! CHECK-LABEL: func @_QMpcompPvery_long 65072276bdaSValentin Clement! CHECK-SAME: (%[[x:.*]]: {{.*}}) 65172276bdaSValentin Clementsubroutine very_long(x) 65272276bdaSValentin Clement type t0 65372276bdaSValentin Clement real :: f 65472276bdaSValentin Clement end type 65572276bdaSValentin Clement type t1 65672276bdaSValentin Clement type(t0), allocatable :: e(:) 65772276bdaSValentin Clement end type 65872276bdaSValentin Clement type t2 65972276bdaSValentin Clement type(t1) :: d(10) 66072276bdaSValentin Clement end type 66172276bdaSValentin Clement type t3 66272276bdaSValentin Clement type(t2) :: c 66372276bdaSValentin Clement end type 66472276bdaSValentin Clement type t4 66572276bdaSValentin Clement type(t3), pointer :: b 66672276bdaSValentin Clement end type 66772276bdaSValentin Clement type t5 66872276bdaSValentin Clement type(t4) :: a 66972276bdaSValentin Clement end type 67072276bdaSValentin Clement type(t5) :: x(:, :, :, :, :) 67172276bdaSValentin Clement 67272276bdaSValentin Clement ! CHECK: %[[coor0:.*]] = fir.coordinate_of %[[x]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}, %{{.}} 67372276bdaSValentin Clement ! CHECK-DAG: %[[flda:.*]] = fir.field_index a 67472276bdaSValentin Clement ! CHECK-DAG: %[[fldb:.*]] = fir.field_index b 67572276bdaSValentin Clement ! CHECK: %[[coor1:.*]] = fir.coordinate_of %[[coor0]], %[[flda]], %[[fldb]] 67672276bdaSValentin Clement ! CHECK: %[[b_box:.*]] = fir.load %[[coor1]] 67772276bdaSValentin Clement ! CHECK-DAG: %[[fldc:.*]] = fir.field_index c 67872276bdaSValentin Clement ! CHECK-DAG: %[[fldd:.*]] = fir.field_index d 67972276bdaSValentin Clement ! CHECK: %[[coor2:.*]] = fir.coordinate_of %[[b_box]], %[[fldc]], %[[fldd]] 68072276bdaSValentin Clement ! CHECK: %[[index:.*]] = arith.subi %c6{{.*}}, %c1{{.*}} : i64 68172276bdaSValentin Clement ! CHECK: %[[coor3:.*]] = fir.coordinate_of %[[coor2]], %[[index]] 68272276bdaSValentin Clement ! CHECK: %[[flde:.*]] = fir.field_index e 68372276bdaSValentin Clement ! CHECK: %[[coor4:.*]] = fir.coordinate_of %[[coor3]], %[[flde]] 68472276bdaSValentin Clement ! CHECK: %[[e_box:.*]] = fir.load %[[coor4]] 68572276bdaSValentin Clement ! CHECK: %[[edims:.*]]:3 = fir.box_dims %[[e_box]], %c0{{.*}} 68672276bdaSValentin Clement ! CHECK: %[[lb:.*]] = fir.convert %[[edims]]#0 : (index) -> i64 68772276bdaSValentin Clement ! CHECK: %[[index2:.*]] = arith.subi %c7{{.*}}, %[[lb]] 68872276bdaSValentin Clement ! CHECK: %[[coor5:.*]] = fir.coordinate_of %[[e_box]], %[[index2]] 68972276bdaSValentin Clement ! CHECK: %[[fldf:.*]] = fir.field_index f 69072276bdaSValentin Clement ! CHECK: %[[coor6:.*]] = fir.coordinate_of %[[coor5]], %[[fldf:.*]] 69172276bdaSValentin Clement ! CHECK: fir.load %[[coor6]] : !fir.ref<f32> 69272276bdaSValentin Clement print *, x(1,2,3,4,5)%a%b%c%d(6)%e(7)%f 69372276bdaSValentin Clementend subroutine 69472276bdaSValentin Clement 69572276bdaSValentin Clement! ----------------------------------------------------------------------------- 69672276bdaSValentin Clement! Test a recursive derived type reference 69772276bdaSValentin Clement! ----------------------------------------------------------------------------- 69872276bdaSValentin Clement 69972276bdaSValentin Clement! CHECK: func @_QMpcompPtest_recursive 70072276bdaSValentin Clement! CHECK-SAME: (%[[x:.*]]: {{.*}}) 70172276bdaSValentin Clementsubroutine test_recursive(x) 70272276bdaSValentin Clement type t 70372276bdaSValentin Clement integer :: i 70472276bdaSValentin Clement type(t), pointer :: next 70572276bdaSValentin Clement end type 70672276bdaSValentin Clement type(t) :: x 70772276bdaSValentin Clement 70872276bdaSValentin Clement ! CHECK: %[[fldNext1:.*]] = fir.field_index next 70972276bdaSValentin Clement ! CHECK: %[[next1:.*]] = fir.coordinate_of %[[x]], %[[fldNext1]] 71072276bdaSValentin Clement ! CHECK: %[[nextBox1:.*]] = fir.load %[[next1]] 71172276bdaSValentin Clement ! CHECK: %[[fldNext2:.*]] = fir.field_index next 71272276bdaSValentin Clement ! CHECK: %[[next2:.*]] = fir.coordinate_of %[[nextBox1]], %[[fldNext2]] 71372276bdaSValentin Clement ! CHECK: %[[nextBox2:.*]] = fir.load %[[next2]] 71472276bdaSValentin Clement ! CHECK: %[[fldNext3:.*]] = fir.field_index next 71572276bdaSValentin Clement ! CHECK: %[[next3:.*]] = fir.coordinate_of %[[nextBox2]], %[[fldNext3]] 71672276bdaSValentin Clement ! CHECK: %[[nextBox3:.*]] = fir.load %[[next3]] 71772276bdaSValentin Clement ! CHECK: %[[fldi:.*]] = fir.field_index i 71872276bdaSValentin Clement ! CHECK: %[[i:.*]] = fir.coordinate_of %[[nextBox3]], %[[fldi]] 71972276bdaSValentin Clement ! CHECK: %[[nextBox3:.*]] = fir.load %[[i]] : !fir.ref<i32> 72072276bdaSValentin Clement print *, x%next%next%next%i 72172276bdaSValentin Clementend subroutine 72272276bdaSValentin Clement 72372276bdaSValentin Clementend module 7243348c083SValentin Clement 7253348c083SValentin Clement! ----------------------------------------------------------------------------- 7263348c083SValentin Clement! Test initial data target 7273348c083SValentin Clement! ----------------------------------------------------------------------------- 7283348c083SValentin Clement 7293348c083SValentin Clementmodule pinit 7303348c083SValentin Clement use pcomp 7313348c083SValentin Clement ! CHECK-LABEL: fir.global {{.*}}@_QMpinitEarp0 7323348c083SValentin Clement ! CHECK-DAG: %[[undef:.*]] = fir.undefined 7333348c083SValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 7343348c083SValentin Clement ! CHECK-DAG: %[[target:.*]] = fir.address_of(@_QMpcompEreal_target) 7353348c083SValentin Clement ! CHECK: %[[box:.*]] = fir.embox %[[target]] : (!fir.ref<f32>) -> !fir.box<!fir.ptr<f32>> 7363348c083SValentin Clement ! CHECK: %[[insert:.*]] = fir.insert_value %[[undef]], %[[box]], ["p", !fir.type<_QMpcompTreal_p0{p:!fir.box<!fir.ptr<f32>>}>] : 7373348c083SValentin Clement ! CHECK: fir.has_value %[[insert]] 7383348c083SValentin Clement type(real_p0) :: arp0 = real_p0(real_target) 7393348c083SValentin Clement 7403348c083SValentin Clement! CHECK-LABEL: fir.global @_QMpinitEbrp1 : !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}> { 7413348c083SValentin Clement! CHECK: %[[VAL_0:.*]] = fir.undefined !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}> 7423348c083SValentin Clement! CHECK: %[[VAL_1:.*]] = fir.field_index p, !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}> 7433348c083SValentin Clement! CHECK: %[[VAL_2:.*]] = fir.address_of(@_QMpcompEreal_array_target) : !fir.ref<!fir.array<100xf32>> 7443348c083SValentin Clement! CHECK: %[[VAL_3:.*]] = arith.constant 100 : index 7453348c083SValentin Clement! CHECK: %[[VAL_4:.*]] = arith.constant 1 : index 7463348c083SValentin Clement! CHECK: %[[VAL_5:.*]] = arith.constant 1 : index 7473348c083SValentin Clement! CHECK: %[[VAL_6:.*]] = arith.constant 10 : i64 7483348c083SValentin Clement! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i64) -> index 7493348c083SValentin Clement! CHECK: %[[VAL_8:.*]] = arith.constant 5 : i64 7503348c083SValentin Clement! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> index 7513348c083SValentin Clement! CHECK: %[[VAL_10:.*]] = arith.constant 50 : i64 7523348c083SValentin Clement! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index 7533348c083SValentin Clement! CHECK: %[[VAL_12:.*]] = arith.constant 0 : index 7543348c083SValentin Clement! CHECK: %[[VAL_13:.*]] = arith.subi %[[VAL_11]], %[[VAL_7]] : index 7553348c083SValentin Clement! CHECK: %[[VAL_14:.*]] = arith.addi %[[VAL_13]], %[[VAL_9]] : index 7563348c083SValentin Clement! CHECK: %[[VAL_15:.*]] = arith.divsi %[[VAL_14]], %[[VAL_9]] : index 7573348c083SValentin Clement! CHECK: %[[VAL_16:.*]] = arith.cmpi sgt, %[[VAL_15]], %[[VAL_12]] : index 7583348c083SValentin Clement! CHECK: %[[VAL_17:.*]] = arith.select %[[VAL_16]], %[[VAL_15]], %[[VAL_12]] : index 7593348c083SValentin Clement! CHECK: %[[VAL_18:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1> 7603348c083SValentin Clement! CHECK: %[[VAL_19:.*]] = fir.slice %[[VAL_7]], %[[VAL_11]], %[[VAL_9]] : (index, index, index) -> !fir.slice<1> 761*13f9089aSPeixin Qiao! CHECK: %[[VAL_20:.*]] = fir.embox %[[VAL_2]](%[[VAL_18]]) {{\[}}%[[VAL_19]]] : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.box<!fir.array<9xf32>> 7623348c083SValentin Clement! CHECK: %[[VAL_21:.*]] = fir.embox %[[VAL_2]](%[[VAL_18]]) {{\[}}%[[VAL_19]]] : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.box<!fir.ptr<!fir.array<?xf32>>> 7633348c083SValentin Clement! CHECK: %[[VAL_22:.*]] = fir.insert_value %[[VAL_0]], %[[VAL_21]], ["p", !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>] : (!fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}>, !fir.box<!fir.ptr<!fir.array<?xf32>>>) -> !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}> 7643348c083SValentin Clement! CHECK: fir.has_value %[[VAL_22]] : !fir.type<_QMpcompTreal_p1{p:!fir.box<!fir.ptr<!fir.array<?xf32>>>}> 7653348c083SValentin Clement! CHECK: } 7663348c083SValentin Clement type(real_p1) :: brp1 = real_p1(real_array_target(10:50:5)) 7673348c083SValentin Clement 7683348c083SValentin Clement ! CHECK-LABEL: fir.global {{.*}}@_QMpinitEccp0 7693348c083SValentin Clement ! CHECK-DAG: %[[undef:.*]] = fir.undefined 7703348c083SValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 7713348c083SValentin Clement ! CHECK-DAG: %[[target:.*]] = fir.address_of(@_QMpcompEchar_target) 7723348c083SValentin Clement ! CHECK: %[[box:.*]] = fir.embox %[[target]] : (!fir.ref<!fir.char<1,10>>) -> !fir.box<!fir.ptr<!fir.char<1,10>>> 7733348c083SValentin Clement ! CHECK: %[[insert:.*]] = fir.insert_value %[[undef]], %[[box]], ["p", !fir.type<_QMpcompTcst_char_p0{p:!fir.box<!fir.ptr<!fir.char<1,10>>>}>] : 7743348c083SValentin Clement ! CHECK: fir.has_value %[[insert]] 7753348c083SValentin Clement type(cst_char_p0) :: ccp0 = cst_char_p0(char_target) 7763348c083SValentin Clement 7773348c083SValentin Clement ! CHECK-LABEL: fir.global {{.*}}@_QMpinitEdcp1 7783348c083SValentin Clement ! CHECK-DAG: %[[undef:.*]] = fir.undefined 7793348c083SValentin Clement ! CHECK-DAG: %[[fld:.*]] = fir.field_index p 7803348c083SValentin Clement ! CHECK-DAG: %[[target:.*]] = fir.address_of(@_QMpcompEchar_array_target) 7813348c083SValentin Clement ! CHECK-DAG: %[[cast:.*]] = fir.convert %[[target]] : (!fir.ref<!fir.array<100x!fir.char<1,10>>>) -> !fir.ptr<!fir.array<?x!fir.char<1,?>>> 7823348c083SValentin Clement ! CHECK-DAG: %[[shape:.*]] = fir.shape %c100{{.*}} 7833348c083SValentin Clement ! CHECK-DAG: %[[box:.*]] = fir.embox %[[cast]](%[[shape]]) typeparams %c10{{.*}} : (!fir.ptr<!fir.array<?x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.box<!fir.ptr<!fir.array<?x!fir.char<1,?>>>> 7843348c083SValentin Clement ! CHECK: %[[insert:.*]] = fir.insert_value %[[undef]], %[[box]], ["p", !fir.type<_QMpcompTdef_char_p1{p:!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,?>>>>}>] : 7853348c083SValentin Clement ! CHECK: fir.has_value %[[insert]] 7863348c083SValentin Clement type(def_char_p1) :: dcp1 = def_char_p1(char_array_target) 7873348c083SValentin Clementend module 788