xref: /llvm-project/flang/test/Lower/derived-allocatable-components.f90 (revision f35f863a88f83332bef9605ef4cfe4f05c066efb)
1e847374eSValentin Clement! Test lowering of allocatable components
2*f35f863aSjeanPerier! RUN: bbc -emit-fir -hlfir=false %s -o - | FileCheck %s
3e847374eSValentin Clement
4e847374eSValentin Clementmodule acomp
5e847374eSValentin Clement  implicit none
6e847374eSValentin Clement  type t
7e847374eSValentin Clement    real :: x
8e847374eSValentin Clement    integer :: i
9e847374eSValentin Clement  end type
10e847374eSValentin Clement  interface
11e847374eSValentin Clement    subroutine takes_real_scalar(x)
12e847374eSValentin Clement      real :: x
13e847374eSValentin Clement    end subroutine
14e847374eSValentin Clement    subroutine takes_char_scalar(x)
15e847374eSValentin Clement      character(*) :: x
16e847374eSValentin Clement    end subroutine
17e847374eSValentin Clement    subroutine takes_derived_scalar(x)
18e847374eSValentin Clement      import t
19e847374eSValentin Clement      type(t) :: x
20e847374eSValentin Clement    end subroutine
21e847374eSValentin Clement    subroutine takes_real_array(x)
22e847374eSValentin Clement      real :: x(:)
23e847374eSValentin Clement    end subroutine
24e847374eSValentin Clement    subroutine takes_char_array(x)
25e847374eSValentin Clement      character(*) :: x(:)
26e847374eSValentin Clement    end subroutine
27e847374eSValentin Clement    subroutine takes_derived_array(x)
28e847374eSValentin Clement      import t
29e847374eSValentin Clement      type(t) :: x(:)
30e847374eSValentin Clement    end subroutine
31e847374eSValentin Clement    subroutine takes_real_scalar_pointer(x)
32e847374eSValentin Clement      real, allocatable :: x
33e847374eSValentin Clement    end subroutine
34e847374eSValentin Clement    subroutine takes_real_array_pointer(x)
35e847374eSValentin Clement      real, allocatable :: x(:)
36e847374eSValentin Clement    end subroutine
37e847374eSValentin Clement    subroutine takes_logical(x)
38e847374eSValentin Clement      logical :: x
39e847374eSValentin Clement    end subroutine
40e847374eSValentin Clement  end interface
41e847374eSValentin Clement
42e847374eSValentin Clement  type real_a0
43e847374eSValentin Clement    real, allocatable :: p
44e847374eSValentin Clement  end type
45e847374eSValentin Clement  type real_a1
46e847374eSValentin Clement    real, allocatable :: p(:)
47e847374eSValentin Clement  end type
48e847374eSValentin Clement  type cst_char_a0
49e847374eSValentin Clement    character(10), allocatable :: p
50e847374eSValentin Clement  end type
51e847374eSValentin Clement  type cst_char_a1
52e847374eSValentin Clement    character(10), allocatable :: p(:)
53e847374eSValentin Clement  end type
54e847374eSValentin Clement  type def_char_a0
55e847374eSValentin Clement    character(:), allocatable :: p
56e847374eSValentin Clement  end type
57e847374eSValentin Clement  type def_char_a1
58e847374eSValentin Clement    character(:), allocatable :: p(:)
59e847374eSValentin Clement  end type
60e847374eSValentin Clement  type derived_a0
61e847374eSValentin Clement    type(t), allocatable :: p
62e847374eSValentin Clement  end type
63e847374eSValentin Clement  type derived_a1
64e847374eSValentin Clement    type(t), allocatable :: p(:)
65e847374eSValentin Clement  end type
66e847374eSValentin Clement
67e847374eSValentin Clement  real, target :: real_target, real_array_target(100)
68e847374eSValentin Clement  character(10), target :: char_target, char_array_target(100)
69e847374eSValentin Clement
70e847374eSValentin Clementcontains
71e847374eSValentin Clement
72e847374eSValentin Clement! -----------------------------------------------------------------------------
73e847374eSValentin Clement!            Test allocatable component references
74e847374eSValentin Clement! -----------------------------------------------------------------------------
75e847374eSValentin Clement
76e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPref_scalar_real_a(
77e847374eSValentin Clement! CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>>{{.*}}, %[[arg1:.*]]: !fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>{{.*}}, %[[arg2:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>>>{{.*}}, %[[arg3:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>{{.*}}) {
78e847374eSValentin Clementsubroutine ref_scalar_real_a(a0_0, a1_0, a0_1, a1_1)
79e847374eSValentin Clement  type(real_a0) :: a0_0, a0_1(100)
80e847374eSValentin Clement  type(real_a1) :: a1_0, a1_1(100)
81e847374eSValentin Clement
82e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p, !fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>
83e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[arg0]], %[[fld]] : (!fir.ref<!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.heap<f32>>>
84e847374eSValentin Clement  ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.heap<f32>>>
85e847374eSValentin Clement  ! CHECK: %[[addr:.*]] = fir.box_addr %[[load]] : (!fir.box<!fir.heap<f32>>) -> !fir.heap<f32>
86e847374eSValentin Clement  ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] : (!fir.heap<f32>) -> !fir.ref<f32>
874cc9437aSTom Eccles  ! CHECK: fir.call @_QPtakes_real_scalar(%[[cast]]) {{.*}}: (!fir.ref<f32>) -> ()
88e847374eSValentin Clement  call takes_real_scalar(a0_0%p)
89e847374eSValentin Clement
90e847374eSValentin Clement  ! CHECK: %[[a0_1_coor:.*]] = fir.coordinate_of %[[arg2]], %{{.*}} : (!fir.ref<!fir.array<100x!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>>>, i64) -> !fir.ref<!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>>
91e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p, !fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>
92e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_1_coor]], %[[fld]] : (!fir.ref<!fir.type<_QMacompTreal_a0{p:!fir.box<!fir.heap<f32>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.heap<f32>>>
93e847374eSValentin Clement  ! CHECK: %[[load:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.heap<f32>>>
94e847374eSValentin Clement  ! CHECK: %[[addr:.*]] = fir.box_addr %[[load]] : (!fir.box<!fir.heap<f32>>) -> !fir.heap<f32>
95e847374eSValentin Clement  ! CHECK: %[[cast:.*]] = fir.convert %[[addr]] : (!fir.heap<f32>) -> !fir.ref<f32>
964cc9437aSTom Eccles  ! CHECK: fir.call @_QPtakes_real_scalar(%[[cast]]) {{.*}}: (!fir.ref<f32>) -> ()
97e847374eSValentin Clement  call takes_real_scalar(a0_1(5)%p)
98e847374eSValentin Clement
99e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p, !fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>
100e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[arg1]], %[[fld]] : (!fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
101e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
102e847374eSValentin Clement  ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>
103e847374eSValentin Clement  ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)
104e847374eSValentin Clement  ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
105e847374eSValentin Clement  ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64
106e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[addr]], %[[index]] : (!fir.heap<!fir.array<?xf32>>, i64) -> !fir.ref<f32>
1074cc9437aSTom Eccles  ! CHECK: fir.call @_QPtakes_real_scalar(%[[coor]]) {{.*}}: (!fir.ref<f32>) -> ()
108e847374eSValentin Clement  call takes_real_scalar(a1_0%p(7))
109e847374eSValentin Clement
110e847374eSValentin Clement  ! CHECK: %[[a1_1_coor:.*]] = fir.coordinate_of %[[arg3]], %{{.*}} : (!fir.ref<!fir.array<100x!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>, i64) -> !fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
111e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p, !fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>
112e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_1_coor]], %[[fld]] : (!fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
113e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
114e847374eSValentin Clement  ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>
115e847374eSValentin Clement  ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}} : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)
116e847374eSValentin Clement  ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
117e847374eSValentin Clement  ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64
118e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[addr]], %[[index]] : (!fir.heap<!fir.array<?xf32>>, i64) -> !fir.ref<f32>
1194cc9437aSTom Eccles  ! CHECK: fir.call @_QPtakes_real_scalar(%[[coor]]) {{.*}}: (!fir.ref<f32>) -> ()
120e847374eSValentin Clement  call takes_real_scalar(a1_1(5)%p(7))
121e847374eSValentin Clementend subroutine
122e847374eSValentin Clement
123e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPref_array_real_a(
124e847374eSValentin Clement! CHECK-SAME:        %[[VAL_0:.*]]: !fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>{{.*}}) {
125e847374eSValentin Clement! CHECK:         %[[VAL_2:.*]] = fir.field_index p, !fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>
126e847374eSValentin Clement! CHECK:         %[[VAL_3:.*]] = fir.coordinate_of %[[VAL_0]], %[[VAL_2]] : (!fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
127e847374eSValentin Clement! CHECK:         %[[VAL_4:.*]] = fir.load %[[VAL_3]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
128e847374eSValentin Clement! CHECK:         %[[VAL_5:.*]] = arith.constant 0 : index
129e847374eSValentin Clement! CHECK:         %[[VAL_6:.*]]:3 = fir.box_dims %[[VAL_4]], %[[VAL_5]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)
130e847374eSValentin Clement! CHECK:         %[[VAL_7:.*]] = fir.box_addr %[[VAL_4]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>
131e847374eSValentin Clement! CHECK:         %[[VAL_8:.*]] = arith.constant 20 : i64
132e847374eSValentin Clement! CHECK:         %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i64) -> index
133e847374eSValentin Clement! CHECK:         %[[VAL_10:.*]] = arith.constant 2 : i64
134e847374eSValentin Clement! CHECK:         %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (i64) -> index
135e847374eSValentin Clement! CHECK:         %[[VAL_12:.*]] = arith.constant 50 : i64
136e847374eSValentin Clement! CHECK:         %[[VAL_13:.*]] = fir.convert %[[VAL_12]] : (i64) -> index
137e847374eSValentin Clement! CHECK:         %[[VAL_14:.*]] = fir.shape_shift %[[VAL_6]]#0, %[[VAL_6]]#1 : (index, index) -> !fir.shapeshift<1>
138e847374eSValentin Clement! CHECK:         %[[VAL_15:.*]] = fir.slice %[[VAL_9]], %[[VAL_13]], %[[VAL_11]] : (index, index, index) -> !fir.slice<1>
13913f9089aSPeixin Qiao! CHECK:         %[[VAL_16:.*]] = fir.embox %[[VAL_7]](%[[VAL_14]]) {{\[}}%[[VAL_15]]] : (!fir.heap<!fir.array<?xf32>>, !fir.shapeshift<1>, !fir.slice<1>) -> !fir.box<!fir.array<16xf32>>
14013f9089aSPeixin Qiao! CHECK:         %[[VAL_16_NEW:.*]] = fir.convert %[[VAL_16]] : (!fir.box<!fir.array<16xf32>>) -> !fir.box<!fir.array<?xf32>>
1414cc9437aSTom Eccles! CHECK:         fir.call @_QPtakes_real_array(%[[VAL_16_NEW]]) {{.*}}: (!fir.box<!fir.array<?xf32>>) -> ()
142e847374eSValentin Clement! CHECK:         %[[VAL_17:.*]] = arith.constant 5 : i64
143e847374eSValentin Clement! CHECK:         %[[VAL_18:.*]] = arith.constant 1 : i64
144e847374eSValentin Clement! CHECK:         %[[VAL_19:.*]] = arith.subi %[[VAL_17]], %[[VAL_18]] : i64
145e847374eSValentin Clement! CHECK:         %[[VAL_20:.*]] = fir.coordinate_of %[[VAL_1]], %[[VAL_19]] : (!fir.ref<!fir.array<100x!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>>, i64) -> !fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
146e847374eSValentin Clement! CHECK:         %[[VAL_21:.*]] = fir.field_index p, !fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>
147e847374eSValentin Clement! CHECK:         %[[VAL_22:.*]] = fir.coordinate_of %[[VAL_20]], %[[VAL_21]] : (!fir.ref<!fir.type<_QMacompTreal_a1{p:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
148e847374eSValentin Clement! CHECK:         %[[VAL_23:.*]] = fir.load %[[VAL_22]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
149e847374eSValentin Clement! CHECK:         %[[VAL_24:.*]] = arith.constant 0 : index
150e847374eSValentin Clement! CHECK:         %[[VAL_25:.*]]:3 = fir.box_dims %[[VAL_23]], %[[VAL_24]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>, index) -> (index, index, index)
151e847374eSValentin Clement! CHECK:         %[[VAL_26:.*]] = fir.box_addr %[[VAL_23]] : (!fir.box<!fir.heap<!fir.array<?xf32>>>) -> !fir.heap<!fir.array<?xf32>>
152e847374eSValentin Clement! CHECK:         %[[VAL_27:.*]] = arith.constant 20 : i64
153e847374eSValentin Clement! CHECK:         %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i64) -> index
154e847374eSValentin Clement! CHECK:         %[[VAL_29:.*]] = arith.constant 2 : i64
155e847374eSValentin Clement! CHECK:         %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i64) -> index
156e847374eSValentin Clement! CHECK:         %[[VAL_31:.*]] = arith.constant 50 : i64
157e847374eSValentin Clement! CHECK:         %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (i64) -> index
158e847374eSValentin Clement! CHECK:         %[[VAL_33:.*]] = fir.shape_shift %[[VAL_25]]#0, %[[VAL_25]]#1 : (index, index) -> !fir.shapeshift<1>
159e847374eSValentin Clement! CHECK:         %[[VAL_34:.*]] = fir.slice %[[VAL_28]], %[[VAL_32]], %[[VAL_30]] : (index, index, index) -> !fir.slice<1>
16013f9089aSPeixin Qiao! CHECK:         %[[VAL_35:.*]] = fir.embox %[[VAL_26]](%[[VAL_33]]) {{\[}}%[[VAL_34]]] : (!fir.heap<!fir.array<?xf32>>, !fir.shapeshift<1>, !fir.slice<1>) -> !fir.box<!fir.array<16xf32>>
16113f9089aSPeixin Qiao! CHECK:         %[[VAL_35_NEW:.*]] = fir.convert %[[VAL_35]] : (!fir.box<!fir.array<16xf32>>) -> !fir.box<!fir.array<?xf32>>
1624cc9437aSTom Eccles! CHECK:         fir.call @_QPtakes_real_array(%[[VAL_35_NEW]]) {{.*}}: (!fir.box<!fir.array<?xf32>>) -> ()
163e847374eSValentin Clement! CHECK:         return
164e847374eSValentin Clement! CHECK:       }
165e847374eSValentin Clement
166e847374eSValentin Clementsubroutine ref_array_real_a(a1_0, a1_1)
167e847374eSValentin Clement  type(real_a1) :: a1_0, a1_1(100)
168e847374eSValentin Clement  call takes_real_array(a1_0%p(20:50:2))
169e847374eSValentin Clement  call takes_real_array(a1_1(5)%p(20:50:2))
170e847374eSValentin Clementend subroutine
171e847374eSValentin Clement
172e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPref_scalar_cst_char_a
173e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})
174e847374eSValentin Clementsubroutine ref_scalar_cst_char_a(a0_0, a1_0, a0_1, a1_1)
175e847374eSValentin Clement  type(cst_char_a0) :: a0_0, a0_1(100)
176e847374eSValentin Clement  type(cst_char_a1) :: a1_0, a1_1(100)
177e847374eSValentin Clement
178e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
179e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]]
180e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
181e847374eSValentin Clement  ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]]
182c0cb8f73SjeanPerier  ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}}
183e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
184e847374eSValentin Clement  call takes_char_scalar(a0_0%p)
185e847374eSValentin Clement
186e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}
187e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
188e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
189e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
190e847374eSValentin Clement  ! CHECK: %[[addr:.*]] = fir.box_addr %[[box]]
191c0cb8f73SjeanPerier  ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}}
192e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
193e847374eSValentin Clement  call takes_char_scalar(a0_1(5)%p)
194e847374eSValentin Clement
195e847374eSValentin Clement
196e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
197e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]]
198e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
199e847374eSValentin Clement  ! CHECK-DAG: %[[base:.*]] = fir.box_addr %[[box]]
200e847374eSValentin Clement  ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}
201e847374eSValentin Clement  ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
202e847374eSValentin Clement  ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64
203e847374eSValentin Clement  ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[base]], %[[index]]
204c0cb8f73SjeanPerier  ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}}
205e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
206e847374eSValentin Clement  call takes_char_scalar(a1_0%p(7))
207e847374eSValentin Clement
208e847374eSValentin Clement
209e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}
210e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
211e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
212e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
213e847374eSValentin Clement  ! CHECK-DAG: %[[base:.*]] = fir.box_addr %[[box]]
214e847374eSValentin Clement  ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}
215e847374eSValentin Clement  ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
216e847374eSValentin Clement  ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64
217e847374eSValentin Clement  ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[base]], %[[index]]
218c0cb8f73SjeanPerier  ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %c10{{.*}}
219e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
220e847374eSValentin Clement  call takes_char_scalar(a1_1(5)%p(7))
221e847374eSValentin Clement
222e847374eSValentin Clementend subroutine
223e847374eSValentin Clement
224e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPref_scalar_def_char_a
225e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})
226e847374eSValentin Clementsubroutine ref_scalar_def_char_a(a0_0, a1_0, a0_1, a1_1)
227e847374eSValentin Clement  type(def_char_a0) :: a0_0, a0_1(100)
228e847374eSValentin Clement  type(def_char_a1) :: a1_0, a1_1(100)
229e847374eSValentin Clement
230e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
231e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]]
232e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
233e847374eSValentin Clement  ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]]
234e847374eSValentin Clement  ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]]
235c0cb8f73SjeanPerier  ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %[[len]]
236e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
237e847374eSValentin Clement  call takes_char_scalar(a0_0%p)
238e847374eSValentin Clement
239e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}
240e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
241e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
242e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
243e847374eSValentin Clement  ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]]
244e847374eSValentin Clement  ! CHECK-DAG: %[[addr:.*]] = fir.box_addr %[[box]]
245c0cb8f73SjeanPerier  ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[addr]], %[[len]]
246e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
247e847374eSValentin Clement  call takes_char_scalar(a0_1(5)%p)
248e847374eSValentin Clement
249e847374eSValentin Clement
250e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
251e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]]
252e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
253e847374eSValentin Clement  ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}
254e847374eSValentin Clement  ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]]
255e847374eSValentin Clement  ! CHECK-DAG: %[[base:.*]] = fir.box_addr %[[box]]
256e847374eSValentin Clement  ! CHECK: %[[cast:.*]] = fir.convert %[[base]] : (!fir.heap<!fir.array<?x!fir.char<1,?>>>) -> !fir.ref<!fir.array<?x!fir.char<1,?>>>
257e847374eSValentin Clement  ! CHECK: %[[c7:.*]] = fir.convert %c7{{.*}} : (i64) -> index
258e847374eSValentin Clement  ! CHECK: %[[sub:.*]] = arith.subi %[[c7]], %[[dims]]#0 : index
259e847374eSValentin Clement  ! CHECK: %[[mul:.*]] = arith.muli %[[len]], %[[sub]] : index
260e847374eSValentin Clement  ! CHECK: %[[offset:.*]] = arith.addi %[[mul]], %c0{{.*}} : index
261e847374eSValentin Clement  ! CHECK: %[[cnvt:.*]] = fir.convert %[[cast]]
262e847374eSValentin Clement  ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[cnvt]], %[[offset]]
263e847374eSValentin Clement  ! CHECK: %[[cnvt:.*]] = fir.convert %[[addr]]
264e847374eSValentin Clement  ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[cnvt]], %[[len]]
265e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
266e847374eSValentin Clement  call takes_char_scalar(a1_0%p(7))
267e847374eSValentin Clement
268e847374eSValentin Clement
269e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}
270e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
271e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
272e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
273e847374eSValentin Clement  ! CHECK-DAG: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}
274e847374eSValentin Clement  ! CHECK-DAG: %[[len:.*]] = fir.box_elesize %[[box]]
275e847374eSValentin Clement  ! CHECK-DAG: %[[base:.*]] = fir.box_addr %[[box]]
276e847374eSValentin Clement  ! CHECK: %[[cast:.*]] = fir.convert %[[base]] : (!fir.heap<!fir.array<?x!fir.char<1,?>>>) -> !fir.ref<!fir.array<?x!fir.char<1,?>>>
277e847374eSValentin Clement  ! CHECK: %[[c7:.*]] = fir.convert %c7{{.*}} : (i64) -> index
278e847374eSValentin Clement  ! CHECK: %[[sub:.*]] = arith.subi %[[c7]], %[[dims]]#0 : index
279e847374eSValentin Clement  ! CHECK: %[[mul:.*]] = arith.muli %[[len]], %[[sub]] : index
280e847374eSValentin Clement  ! CHECK: %[[offset:.*]] = arith.addi %[[mul]], %c0{{.*}} : index
281e847374eSValentin Clement  ! CHECK: %[[cnvt:.*]] = fir.convert %[[cast]]
282e847374eSValentin Clement  ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[cnvt]], %[[offset]]
283e847374eSValentin Clement  ! CHECK: %[[cnvt:.*]] = fir.convert %[[addr]]
284e847374eSValentin Clement  ! CHECK: %[[boxchar:.*]] = fir.emboxchar %[[cnvt]], %[[len]]
285e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_char_scalar(%[[boxchar]])
286e847374eSValentin Clement  call takes_char_scalar(a1_1(5)%p(7))
287e847374eSValentin Clement
288e847374eSValentin Clementend subroutine
289e847374eSValentin Clement
290e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPref_scalar_derived
291e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})
292e847374eSValentin Clementsubroutine ref_scalar_derived(a0_0, a1_0, a0_1, a1_1)
293e847374eSValentin Clement  type(derived_a0) :: a0_0, a0_1(100)
294e847374eSValentin Clement  type(derived_a1) :: a1_0, a1_1(100)
295e847374eSValentin Clement
296e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
297e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]]
298e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
299e847374eSValentin Clement  ! CHECK: %[[fldx:.*]] = fir.field_index x
300e847374eSValentin Clement  ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[fldx]]
301e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]])
302e847374eSValentin Clement  call takes_real_scalar(a0_0%p%x)
303e847374eSValentin Clement
304e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}
305e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
306e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
307e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
308e847374eSValentin Clement  ! CHECK: %[[fldx:.*]] = fir.field_index x
309e847374eSValentin Clement  ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[box]], %[[fldx]]
310e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]])
311e847374eSValentin Clement  call takes_real_scalar(a0_1(5)%p%x)
312e847374eSValentin Clement
313e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
314e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]]
315e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
316e847374eSValentin Clement  ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}
317e847374eSValentin Clement  ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
318e847374eSValentin Clement  ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64
319e847374eSValentin Clement  ! CHECK: %[[elem:.*]] = fir.coordinate_of %[[box]], %[[index]]
320e847374eSValentin Clement  ! CHECK: %[[fldx:.*]] = fir.field_index x
321e847374eSValentin Clement  ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[elem]], %[[fldx]]
322e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]])
323e847374eSValentin Clement  call takes_real_scalar(a1_0%p(7)%x)
324e847374eSValentin Clement
325e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}
326e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
327e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
328e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
329e847374eSValentin Clement  ! CHECK: %[[dims:.*]]:3 = fir.box_dims %[[box]], %c0{{.*}}
330e847374eSValentin Clement  ! CHECK: %[[lb:.*]] = fir.convert %[[dims]]#0 : (index) -> i64
331e847374eSValentin Clement  ! CHECK: %[[index:.*]] = arith.subi %c7{{.*}}, %[[lb]] : i64
332e847374eSValentin Clement  ! CHECK: %[[elem:.*]] = fir.coordinate_of %[[box]], %[[index]]
333e847374eSValentin Clement  ! CHECK: %[[fldx:.*]] = fir.field_index x
334e847374eSValentin Clement  ! CHECK: %[[addr:.*]] = fir.coordinate_of %[[elem]], %[[fldx]]
335e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_real_scalar(%[[addr]])
336e847374eSValentin Clement  call takes_real_scalar(a1_1(5)%p(7)%x)
337e847374eSValentin Clement
338e847374eSValentin Clementend subroutine
339e847374eSValentin Clement
340e847374eSValentin Clement! -----------------------------------------------------------------------------
341e847374eSValentin Clement!            Test passing allocatable component references as allocatables
342e847374eSValentin Clement! -----------------------------------------------------------------------------
343e847374eSValentin Clement
344e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPpass_real_a
345e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})
346e847374eSValentin Clementsubroutine pass_real_a(a0_0, a1_0, a0_1, a1_1)
347e847374eSValentin Clement  type(real_a0) :: a0_0, a0_1(100)
348e847374eSValentin Clement  type(real_a1) :: a1_0, a1_1(100)
349e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
350e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]]
351e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_real_scalar_pointer(%[[coor]])
352e847374eSValentin Clement  call takes_real_scalar_pointer(a0_0%p)
353e847374eSValentin Clement
354e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}
355e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
356e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
357e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_real_scalar_pointer(%[[coor]])
358e847374eSValentin Clement  call takes_real_scalar_pointer(a0_1(5)%p)
359e847374eSValentin Clement
360e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
361e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]]
362e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_real_array_pointer(%[[coor]])
363e847374eSValentin Clement  call takes_real_array_pointer(a1_0%p)
364e847374eSValentin Clement
365e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}
366e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
367e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
368e847374eSValentin Clement  ! CHECK: fir.call @_QPtakes_real_array_pointer(%[[coor]])
369e847374eSValentin Clement  call takes_real_array_pointer(a1_1(5)%p)
370e847374eSValentin Clementend subroutine
371e847374eSValentin Clement
372e847374eSValentin Clement! -----------------------------------------------------------------------------
373e847374eSValentin Clement!            Test usage in intrinsics where pointer aspect matters
374e847374eSValentin Clement! -----------------------------------------------------------------------------
375e847374eSValentin Clement
376e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPallocated_p
377e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})
378e847374eSValentin Clementsubroutine allocated_p(a0_0, a1_0, a0_1, a1_1)
379e847374eSValentin Clement  type(real_a0) :: a0_0, a0_1(100)
380e847374eSValentin Clement  type(def_char_a1) :: a1_0, a1_1(100)
381e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
382e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]]
383e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
384e847374eSValentin Clement  ! CHECK: fir.box_addr %[[box]]
385e847374eSValentin Clement  call takes_logical(allocated(a0_0%p))
386e847374eSValentin Clement
387e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}
388e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
389e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
390e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
391e847374eSValentin Clement  ! CHECK: fir.box_addr %[[box]]
392e847374eSValentin Clement  call takes_logical(allocated(a0_1(5)%p))
393e847374eSValentin Clement
394e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
395e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]]
396e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
397e847374eSValentin Clement  ! CHECK: fir.box_addr %[[box]]
398e847374eSValentin Clement  call takes_logical(allocated(a1_0%p))
399e847374eSValentin Clement
400e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}
401e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
402e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
403e847374eSValentin Clement  ! CHECK: %[[box:.*]] = fir.load %[[coor]]
404e847374eSValentin Clement  ! CHECK: fir.box_addr %[[box]]
405e847374eSValentin Clement  call takes_logical(allocated(a1_1(5)%p))
406e847374eSValentin Clementend subroutine
407e847374eSValentin Clement
408e847374eSValentin Clement! -----------------------------------------------------------------------------
409e847374eSValentin Clement!            Test allocation
410e847374eSValentin Clement! -----------------------------------------------------------------------------
411e847374eSValentin Clement
412e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPallocate_real
413e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})
414e847374eSValentin Clementsubroutine allocate_real(a0_0, a1_0, a0_1, a1_1)
415e847374eSValentin Clement  type(real_a0) :: a0_0, a0_1(100)
416e847374eSValentin Clement  type(real_a1) :: a1_0, a1_1(100)
417e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
418e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]]
419e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
420e847374eSValentin Clement  allocate(a0_0%p)
421e847374eSValentin Clement
422e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}
423e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
424e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
425e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
426e847374eSValentin Clement  allocate(a0_1(5)%p)
427e847374eSValentin Clement
428e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
429e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]]
430e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
431e847374eSValentin Clement  allocate(a1_0%p(100))
432e847374eSValentin Clement
433e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}
434e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
435e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
436e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
437e847374eSValentin Clement  allocate(a1_1(5)%p(100))
438e847374eSValentin Clementend subroutine
439e847374eSValentin Clement
440e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPallocate_cst_char
441e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})
442e847374eSValentin Clementsubroutine allocate_cst_char(a0_0, a1_0, a0_1, a1_1)
443e847374eSValentin Clement  type(cst_char_a0) :: a0_0, a0_1(100)
444e847374eSValentin Clement  type(cst_char_a1) :: a1_0, a1_1(100)
445e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
446e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]]
447e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
448e847374eSValentin Clement  allocate(a0_0%p)
449e847374eSValentin Clement
450e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}
451e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
452e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
453e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
454e847374eSValentin Clement  allocate(a0_1(5)%p)
455e847374eSValentin Clement
456e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
457e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]]
458e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
459e847374eSValentin Clement  allocate(a1_0%p(100))
460e847374eSValentin Clement
461e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}
462e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
463e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
464e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
465e847374eSValentin Clement  allocate(a1_1(5)%p(100))
466e847374eSValentin Clementend subroutine
467e847374eSValentin Clement
468e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPallocate_def_char
469e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})
470e847374eSValentin Clementsubroutine allocate_def_char(a0_0, a1_0, a0_1, a1_1)
471e847374eSValentin Clement  type(def_char_a0) :: a0_0, a0_1(100)
472e847374eSValentin Clement  type(def_char_a1) :: a1_0, a1_1(100)
473e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
474e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]]
475e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
476e847374eSValentin Clement  allocate(character(18)::a0_0%p)
477e847374eSValentin Clement
478e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}
479e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
480e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
481e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
482e847374eSValentin Clement  allocate(character(18)::a0_1(5)%p)
483e847374eSValentin Clement
484e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
485e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]]
486e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
487e847374eSValentin Clement  allocate(character(18)::a1_0%p(100))
488e847374eSValentin Clement
489e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}
490e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
491e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
492e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
493e847374eSValentin Clement  allocate(character(18)::a1_1(5)%p(100))
494e847374eSValentin Clementend subroutine
495e847374eSValentin Clement
496e847374eSValentin Clement! -----------------------------------------------------------------------------
497e847374eSValentin Clement!            Test deallocation
498e847374eSValentin Clement! -----------------------------------------------------------------------------
499e847374eSValentin Clement
500e847374eSValentin Clement! CHECK-LABEL: func @_QMacompPdeallocate_real
501e847374eSValentin Clement! CHECK-SAME: (%[[a0_0:.*]]: {{.*}}, %[[a1_0:.*]]: {{.*}}, %[[a0_1:.*]]: {{.*}}, %[[a1_1:.*]]: {{.*}})
502e847374eSValentin Clementsubroutine deallocate_real(a0_0, a1_0, a0_1, a1_1)
503e847374eSValentin Clement  type(real_a0) :: a0_0, a0_1(100)
504e847374eSValentin Clement  type(real_a1) :: a1_0, a1_1(100)
505e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
506e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a0_0]], %[[fld]]
507e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
508e847374eSValentin Clement  deallocate(a0_0%p)
509e847374eSValentin Clement
510e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a0_1]], %{{.*}}
511e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
512e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
513e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
514e847374eSValentin Clement  deallocate(a0_1(5)%p)
515e847374eSValentin Clement
516e847374eSValentin Clement  ! CHECK: %[[fld:.*]] = fir.field_index p
517e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[a1_0]], %[[fld]]
518e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
519e847374eSValentin Clement  deallocate(a1_0%p)
520e847374eSValentin Clement
521e847374eSValentin Clement  ! CHECK-DAG: %[[coor0:.*]] = fir.coordinate_of %[[a1_1]], %{{.*}}
522e847374eSValentin Clement  ! CHECK-DAG: %[[fld:.*]] = fir.field_index p
523e847374eSValentin Clement  ! CHECK: %[[coor:.*]] = fir.coordinate_of %[[coor0]], %[[fld]]
524e847374eSValentin Clement  ! CHECK: fir.store {{.*}} to %[[coor]]
525e847374eSValentin Clement  deallocate(a1_1(5)%p)
526e847374eSValentin Clementend subroutine
527e847374eSValentin Clement
528e847374eSValentin Clement! -----------------------------------------------------------------------------
529e847374eSValentin Clement!            Test a recursive derived type reference
530e847374eSValentin Clement! -----------------------------------------------------------------------------
531e847374eSValentin Clement
532e847374eSValentin Clement! CHECK: func @_QMacompPtest_recursive
533e847374eSValentin Clement! CHECK-SAME: (%[[x:.*]]: {{.*}})
534e847374eSValentin Clementsubroutine test_recursive(x)
535e847374eSValentin Clement  type t
536e847374eSValentin Clement    integer :: i
537e847374eSValentin Clement    type(t), allocatable :: next
538e847374eSValentin Clement  end type
539e847374eSValentin Clement  type(t) :: x
540e847374eSValentin Clement
541e847374eSValentin Clement  ! CHECK: %[[fldNext1:.*]] = fir.field_index next
542e847374eSValentin Clement  ! CHECK: %[[next1:.*]] = fir.coordinate_of %[[x]], %[[fldNext1]]
543e847374eSValentin Clement  ! CHECK: %[[nextBox1:.*]] = fir.load %[[next1]]
544e847374eSValentin Clement  ! CHECK: %[[fldNext2:.*]] = fir.field_index next
545e847374eSValentin Clement  ! CHECK: %[[next2:.*]] = fir.coordinate_of %[[nextBox1]], %[[fldNext2]]
546e847374eSValentin Clement  ! CHECK: %[[nextBox2:.*]] = fir.load %[[next2]]
547e847374eSValentin Clement  ! CHECK: %[[fldNext3:.*]] = fir.field_index next
548e847374eSValentin Clement  ! CHECK: %[[next3:.*]] = fir.coordinate_of %[[nextBox2]], %[[fldNext3]]
549e847374eSValentin Clement  ! CHECK: %[[nextBox3:.*]] = fir.load %[[next3]]
550e847374eSValentin Clement  ! CHECK: %[[fldi:.*]] = fir.field_index i
551e847374eSValentin Clement  ! CHECK: %[[i:.*]] = fir.coordinate_of %[[nextBox3]], %[[fldi]]
552e847374eSValentin Clement  ! CHECK: %[[nextBox3:.*]] = fir.load %[[i]] : !fir.ref<i32>
553e847374eSValentin Clement  print *, x%next%next%next%i
554e847374eSValentin Clementend subroutine
555e847374eSValentin Clement
556e847374eSValentin Clementend module
557