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