1*1bffc753SEric Schweitz! Test lowering of arrays of POINTER.
2*1bffc753SEric Schweitz!
3*1bffc753SEric Schweitz! An array of pointer to T can be constructed by having an array of
4*1bffc753SEric Schweitz! derived type, where the derived type has a pointer to T
5*1bffc753SEric Schweitz! component. An entity with both the DIMENSION and POINTER attributes
6*1bffc753SEric Schweitz! is a pointer to an array of T and never an array of pointer to T in
7*1bffc753SEric Schweitz! Fortran.
8*1bffc753SEric Schweitz
9*1bffc753SEric Schweitz! RUN: bbc -emit-fir %s -o - | FileCheck %s
10*1bffc753SEric Schweitz
11*1bffc753SEric Schweitzmodule array_of_pointer_test
12*1bffc753SEric Schweitz  type t
13*1bffc753SEric Schweitz     integer, POINTER :: ip
14*1bffc753SEric Schweitz  end type t
15*1bffc753SEric Schweitz
16*1bffc753SEric Schweitz  type u
17*1bffc753SEric Schweitz     integer :: v
18*1bffc753SEric Schweitz  end type u
19*1bffc753SEric Schweitz
20*1bffc753SEric Schweitz  type tu
21*1bffc753SEric Schweitz     type(u), POINTER :: ip
22*1bffc753SEric Schweitz  end type tu
23*1bffc753SEric Schweitz
24*1bffc753SEric Schweitz  type ta
25*1bffc753SEric Schweitz     integer, POINTER :: ip(:)
26*1bffc753SEric Schweitz  end type ta
27*1bffc753SEric Schweitz
28*1bffc753SEric Schweitz  type tb
29*1bffc753SEric Schweitz     integer, POINTER :: ip(:,:)
30*1bffc753SEric Schweitz  end type tb
31*1bffc753SEric Schweitz
32*1bffc753SEric Schweitz  type tv
33*1bffc753SEric Schweitz     type(tu), POINTER :: jp(:)
34*1bffc753SEric Schweitz  end type tv
35*1bffc753SEric Schweitz
36*1bffc753SEric Schweitz  ! Derived types with type parameters hit a TODO.
37*1bffc753SEric Schweitz!  type ct(l)
38*1bffc753SEric Schweitz!     integer, len :: l
39*1bffc753SEric Schweitz!     character(LEN=l), POINTER :: cp
40*1bffc753SEric Schweitz!  end type ct
41*1bffc753SEric Schweitz
42*1bffc753SEric Schweitz!  type cu(l)
43*1bffc753SEric Schweitz!     integer, len :: l
44*1bffc753SEric Schweitz!     character(LEN=l) :: cv
45*1bffc753SEric Schweitz!  end type cu
46*1bffc753SEric Schweitzend module array_of_pointer_test
47*1bffc753SEric Schweitz
48*1bffc753SEric Schweitzsubroutine s1(x,y)
49*1bffc753SEric Schweitz  use array_of_pointer_test
50*1bffc753SEric Schweitz  type(t) :: x(:)
51*1bffc753SEric Schweitz  integer :: y(:)
52*1bffc753SEric Schweitz
53*1bffc753SEric Schweitz  forall (i=1:10)
54*1bffc753SEric Schweitz     ! assign value to pointee variable
55*1bffc753SEric Schweitz     x(i)%ip = y(i)
56*1bffc753SEric Schweitz  end forall
57*1bffc753SEric Schweitzend subroutine s1
58*1bffc753SEric Schweitz
59*1bffc753SEric Schweitz! CHECK-LABEL: func @_QPs1(
60*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"},
61*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y"}) {
62*1bffc753SEric Schweitz! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
63*1bffc753SEric Schweitz! CHECK:         %[[VAL_3:.*]] = arith.constant 1 : i32
64*1bffc753SEric Schweitz! CHECK:         %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> index
65*1bffc753SEric Schweitz! CHECK:         %[[VAL_5:.*]] = arith.constant 10 : i32
66*1bffc753SEric Schweitz! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
67*1bffc753SEric Schweitz! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : index
68*1bffc753SEric Schweitz! CHECK:         %[[VAL_8:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
69*1bffc753SEric Schweitz! CHECK:         %[[VAL_9:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
70*1bffc753SEric Schweitz! CHECK:         %[[VAL_10:.*]] = fir.do_loop %[[VAL_11:.*]] = %[[VAL_4]] to %[[VAL_6]] step %[[VAL_7]] unordered iter_args(%[[VAL_12:.*]] = %[[VAL_8]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
71*1bffc753SEric Schweitz! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_11]] : (index) -> i32
72*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_13]] to %[[VAL_2]] : !fir.ref<i32>
73*1bffc753SEric Schweitz! CHECK:           %[[VAL_14:.*]] = arith.constant 1 : index
74*1bffc753SEric Schweitz! CHECK:           %[[VAL_15:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
75*1bffc753SEric Schweitz! CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> i64
76*1bffc753SEric Schweitz! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i64) -> index
77*1bffc753SEric Schweitz! CHECK:           %[[VAL_18:.*]] = arith.subi %[[VAL_17]], %[[VAL_14]] : index
78*1bffc753SEric Schweitz! CHECK:           %[[VAL_19:.*]] = fir.array_fetch %[[VAL_9]], %[[VAL_18]] : (!fir.array<?xi32>, index) -> i32
79*1bffc753SEric Schweitz! CHECK:           %[[VAL_20:.*]] = arith.constant 1 : index
80*1bffc753SEric Schweitz! CHECK:           %[[VAL_21:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
81*1bffc753SEric Schweitz! CHECK:           %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (i32) -> i64
82*1bffc753SEric Schweitz! CHECK:           %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i64) -> index
83*1bffc753SEric Schweitz! CHECK:           %[[VAL_24:.*]] = arith.subi %[[VAL_23]], %[[VAL_20]] : index
84*1bffc753SEric Schweitz! CHECK:           %[[VAL_25:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
85*1bffc753SEric Schweitz! CHECK:           %[[VAL_26:.*]] = fir.array_access %[[VAL_12]], %[[VAL_24]], %[[VAL_25]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, index, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<i32>>>
86*1bffc753SEric Schweitz! CHECK:           %[[VAL_27:.*]] = fir.load %[[VAL_26]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
87*1bffc753SEric Schweitz! CHECK:           %[[VAL_28:.*]] = fir.box_addr %[[VAL_27]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
88*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_19]] to %[[VAL_28]] : !fir.ptr<i32>
89*1bffc753SEric Schweitz! CHECK:           %[[VAL_29:.*]] = fir.array_amend %[[VAL_12]], %[[VAL_26]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
90*1bffc753SEric Schweitz! CHECK:           fir.result %[[VAL_29]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
91*1bffc753SEric Schweitz! CHECK:         }
92*1bffc753SEric Schweitz! CHECK:         fir.array_merge_store %[[VAL_8]], %[[VAL_30:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
93*1bffc753SEric Schweitz! CHECK:         return
94*1bffc753SEric Schweitz! CHECK:       }
95*1bffc753SEric Schweitz
96*1bffc753SEric Schweitzsubroutine s1_1(x,y)
97*1bffc753SEric Schweitz  use array_of_pointer_test
98*1bffc753SEric Schweitz  type(t) :: x(10)
99*1bffc753SEric Schweitz  integer :: y(10)
100*1bffc753SEric Schweitz
101*1bffc753SEric Schweitz  forall (i=1:10)
102*1bffc753SEric Schweitz     ! assign value to pointee variable
103*1bffc753SEric Schweitz     x(i)%ip = y(i)
104*1bffc753SEric Schweitz  end forall
105*1bffc753SEric Schweitzend subroutine s1_1
106*1bffc753SEric Schweitz
107*1bffc753SEric Schweitz! CHECK-LABEL: func @_QPs1_1(
108*1bffc753SEric Schweitz! CHECK-SAME:                %[[VAL_0:.*]]: !fir.ref<!fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"},
109*1bffc753SEric Schweitz! CHECK-SAME:                %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi32>> {fir.bindc_name = "y"}) {
110*1bffc753SEric Schweitz! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
111*1bffc753SEric Schweitz! CHECK:         %[[VAL_3:.*]] = arith.constant 10 : index
112*1bffc753SEric Schweitz! CHECK:         %[[VAL_4:.*]] = arith.constant 10 : index
113*1bffc753SEric Schweitz! CHECK:         %[[VAL_5:.*]] = arith.constant 1 : i32
114*1bffc753SEric Schweitz! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
115*1bffc753SEric Schweitz! CHECK:         %[[VAL_7:.*]] = arith.constant 10 : i32
116*1bffc753SEric Schweitz! CHECK:         %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i32) -> index
117*1bffc753SEric Schweitz! CHECK:         %[[VAL_9:.*]] = arith.constant 1 : index
118*1bffc753SEric Schweitz! CHECK:         %[[VAL_10:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1>
119*1bffc753SEric Schweitz! CHECK:         %[[VAL_11:.*]] = fir.array_load %[[VAL_0]](%[[VAL_10]]) : (!fir.ref<!fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>, !fir.shape<1>) -> !fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
120*1bffc753SEric Schweitz! CHECK:         %[[VAL_12:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
121*1bffc753SEric Schweitz! CHECK:         %[[VAL_13:.*]] = fir.array_load %[[VAL_1]](%[[VAL_12]]) : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> !fir.array<10xi32>
122*1bffc753SEric Schweitz! CHECK:         %[[VAL_14:.*]] = fir.do_loop %[[VAL_15:.*]] = %[[VAL_6]] to %[[VAL_8]] step %[[VAL_9]] unordered iter_args(%[[VAL_16:.*]] = %[[VAL_11]]) -> (!fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
123*1bffc753SEric Schweitz! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_15]] : (index) -> i32
124*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_17]] to %[[VAL_2]] : !fir.ref<i32>
125*1bffc753SEric Schweitz! CHECK:           %[[VAL_18:.*]] = arith.constant 1 : index
126*1bffc753SEric Schweitz! CHECK:           %[[VAL_19:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
127*1bffc753SEric Schweitz! CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i32) -> i64
128*1bffc753SEric Schweitz! CHECK:           %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i64) -> index
129*1bffc753SEric Schweitz! CHECK:           %[[VAL_22:.*]] = arith.subi %[[VAL_21]], %[[VAL_18]] : index
130*1bffc753SEric Schweitz! CHECK:           %[[VAL_23:.*]] = fir.array_fetch %[[VAL_13]], %[[VAL_22]] : (!fir.array<10xi32>, index) -> i32
131*1bffc753SEric Schweitz! CHECK:           %[[VAL_24:.*]] = arith.constant 1 : index
132*1bffc753SEric Schweitz! CHECK:           %[[VAL_25:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
133*1bffc753SEric Schweitz! CHECK:           %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i32) -> i64
134*1bffc753SEric Schweitz! CHECK:           %[[VAL_27:.*]] = fir.convert %[[VAL_26]] : (i64) -> index
135*1bffc753SEric Schweitz! CHECK:           %[[VAL_28:.*]] = arith.subi %[[VAL_27]], %[[VAL_24]] : index
136*1bffc753SEric Schweitz! CHECK:           %[[VAL_29:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
137*1bffc753SEric Schweitz! CHECK:           %[[VAL_30:.*]] = fir.array_access %[[VAL_16]], %[[VAL_28]], %[[VAL_29]] : (!fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, index, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<i32>>>
138*1bffc753SEric Schweitz! CHECK:           %[[VAL_31:.*]] = fir.load %[[VAL_30]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
139*1bffc753SEric Schweitz! CHECK:           %[[VAL_32:.*]] = fir.box_addr %[[VAL_31]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
140*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_23]] to %[[VAL_32]] : !fir.ptr<i32>
141*1bffc753SEric Schweitz! CHECK:           %[[VAL_33:.*]] = fir.array_amend %[[VAL_16]], %[[VAL_30]] : (!fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.ref<!fir.box<!fir.ptr<i32>>>) -> !fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
142*1bffc753SEric Schweitz! CHECK:           fir.result %[[VAL_33]] : !fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
143*1bffc753SEric Schweitz! CHECK:         }
144*1bffc753SEric Schweitz! CHECK:         fir.array_merge_store %[[VAL_11]], %[[VAL_34:.*]] to %[[VAL_0]] : !fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.ref<!fir.array<10x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
145*1bffc753SEric Schweitz! CHECK:         return
146*1bffc753SEric Schweitz! CHECK:       }
147*1bffc753SEric Schweitz
148*1bffc753SEric Schweitz! Dependent type assignment, TODO
149*1bffc753SEric Schweitz!subroutine s1_2(x,y,l)
150*1bffc753SEric Schweitz!  use array_of_pointer_test
151*1bffc753SEric Schweitz!  type(ct(l)) :: x(10)
152*1bffc753SEric Schweitz!  character(l) :: y(10)
153*1bffc753SEric Schweitz
154*1bffc753SEric Schweitz!  forall (i=1:10)
155*1bffc753SEric Schweitz     ! assign value to pointee variable
156*1bffc753SEric Schweitz!     x(i)%cp = y(i)
157*1bffc753SEric Schweitz!  end forall
158*1bffc753SEric Schweitz!end subroutine s1_2
159*1bffc753SEric Schweitz
160*1bffc753SEric Schweitzsubroutine s2(x,y)
161*1bffc753SEric Schweitz  use array_of_pointer_test
162*1bffc753SEric Schweitz  type(t) :: x(:)
163*1bffc753SEric Schweitz  integer, TARGET :: y(:)
164*1bffc753SEric Schweitz
165*1bffc753SEric Schweitz  forall (i=1:10)
166*1bffc753SEric Schweitz     ! assign address to POINTER
167*1bffc753SEric Schweitz     x(i)%ip => y(i)
168*1bffc753SEric Schweitz  end forall
169*1bffc753SEric Schweitzend subroutine s2
170*1bffc753SEric Schweitz
171*1bffc753SEric Schweitz! CHECK-LABEL: func @_QPs2(
172*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"},
173*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y", fir.target}) {
174*1bffc753SEric Schweitz! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
175*1bffc753SEric Schweitz! CHECK:         %[[VAL_3:.*]] = arith.constant 1 : i32
176*1bffc753SEric Schweitz! CHECK:         %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> index
177*1bffc753SEric Schweitz! CHECK:         %[[VAL_5:.*]] = arith.constant 10 : i32
178*1bffc753SEric Schweitz! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
179*1bffc753SEric Schweitz! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : index
180*1bffc753SEric Schweitz! CHECK:         %[[VAL_8:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
181*1bffc753SEric Schweitz! CHECK:         %[[VAL_9:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
182*1bffc753SEric Schweitz! CHECK:         %[[VAL_10:.*]] = fir.do_loop %[[VAL_11:.*]] = %[[VAL_4]] to %[[VAL_6]] step %[[VAL_7]] unordered iter_args(%[[VAL_12:.*]] = %[[VAL_8]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
183*1bffc753SEric Schweitz! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_11]] : (index) -> i32
184*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_13]] to %[[VAL_2]] : !fir.ref<i32>
185*1bffc753SEric Schweitz! CHECK:           %[[VAL_14:.*]] = arith.constant 1 : index
186*1bffc753SEric Schweitz! CHECK:           %[[VAL_15:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
187*1bffc753SEric Schweitz! CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> i64
188*1bffc753SEric Schweitz! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i64) -> index
189*1bffc753SEric Schweitz! CHECK:           %[[VAL_18:.*]] = arith.subi %[[VAL_17]], %[[VAL_14]] : index
190*1bffc753SEric Schweitz! CHECK:           %[[VAL_19:.*]] = fir.array_access %[[VAL_9]], %[[VAL_18]] : (!fir.array<?xi32>, index) -> !fir.ref<i32>
191*1bffc753SEric Schweitz! CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (!fir.ref<i32>) -> !fir.ptr<i32>
192*1bffc753SEric Schweitz! CHECK:           %[[VAL_21:.*]] = fir.embox %[[VAL_20]] : (!fir.ptr<i32>) -> !fir.box<!fir.ptr<i32>>
193*1bffc753SEric Schweitz! CHECK:           %[[VAL_22:.*]] = arith.constant 1 : index
194*1bffc753SEric Schweitz! CHECK:           %[[VAL_23:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
195*1bffc753SEric Schweitz! CHECK:           %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (i32) -> i64
196*1bffc753SEric Schweitz! CHECK:           %[[VAL_25:.*]] = fir.convert %[[VAL_24]] : (i64) -> index
197*1bffc753SEric Schweitz! CHECK:           %[[VAL_26:.*]] = arith.subi %[[VAL_25]], %[[VAL_22]] : index
198*1bffc753SEric Schweitz! CHECK:           %[[VAL_27:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
199*1bffc753SEric Schweitz! CHECK:           %[[VAL_28:.*]] = fir.array_update %[[VAL_12]], %[[VAL_21]], %[[VAL_26]], %[[VAL_27]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.ptr<i32>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
200*1bffc753SEric Schweitz! CHECK:           fir.result %[[VAL_28]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
201*1bffc753SEric Schweitz! CHECK:         }
202*1bffc753SEric Schweitz! CHECK:         fir.array_merge_store %[[VAL_8]], %[[VAL_29:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
203*1bffc753SEric Schweitz! CHECK:         return
204*1bffc753SEric Schweitz! CHECK:       }
205*1bffc753SEric Schweitz
206*1bffc753SEric Schweitzsubroutine s2_1(x,y)
207*1bffc753SEric Schweitz  use array_of_pointer_test
208*1bffc753SEric Schweitz  type(t) :: x(:)
209*1bffc753SEric Schweitz  integer, POINTER :: y(:)
210*1bffc753SEric Schweitz
211*1bffc753SEric Schweitz  forall (i=1:10)
212*1bffc753SEric Schweitz     ! assign address to POINTER
213*1bffc753SEric Schweitz     x(i)%ip => y(i)
214*1bffc753SEric Schweitz  end forall
215*1bffc753SEric Schweitzend subroutine s2_1
216*1bffc753SEric Schweitz
217*1bffc753SEric Schweitz! CHECK-LABEL: func @_QPs2_1(
218*1bffc753SEric Schweitz! CHECK-SAME:                %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"},
219*1bffc753SEric Schweitz! CHECK-SAME:                %[[VAL_1:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {fir.bindc_name = "y"}) {
220*1bffc753SEric Schweitz! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
221*1bffc753SEric Schweitz! CHECK:         %[[VAL_3:.*]] = arith.constant 1 : i32
222*1bffc753SEric Schweitz! CHECK:         %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> index
223*1bffc753SEric Schweitz! CHECK:         %[[VAL_5:.*]] = arith.constant 10 : i32
224*1bffc753SEric Schweitz! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
225*1bffc753SEric Schweitz! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : index
226*1bffc753SEric Schweitz! CHECK:         %[[VAL_8:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
227*1bffc753SEric Schweitz! CHECK:         %[[VAL_9:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
228*1bffc753SEric Schweitz! CHECK:         %[[VAL_10:.*]] = arith.constant 0 : index
229*1bffc753SEric Schweitz! CHECK:         %[[VAL_11:.*]]:3 = fir.box_dims %[[VAL_9]], %[[VAL_10]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)
230*1bffc753SEric Schweitz! CHECK:         %[[VAL_12:.*]] = fir.shift %[[VAL_11]]#0 : (index) -> !fir.shift<1>
231*1bffc753SEric Schweitz! CHECK:         %[[VAL_13:.*]] = fir.array_load %[[VAL_9]](%[[VAL_12]]) : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, !fir.shift<1>) -> !fir.array<?xi32>
232*1bffc753SEric Schweitz! CHECK:         %[[VAL_14:.*]] = fir.do_loop %[[VAL_15:.*]] = %[[VAL_4]] to %[[VAL_6]] step %[[VAL_7]] unordered iter_args(%[[VAL_16:.*]] = %[[VAL_8]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
233*1bffc753SEric Schweitz! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_15]] : (index) -> i32
234*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_17]] to %[[VAL_2]] : !fir.ref<i32>
235*1bffc753SEric Schweitz! CHECK:           %[[VAL_18:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
236*1bffc753SEric Schweitz! CHECK:           %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i32) -> i64
237*1bffc753SEric Schweitz! CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i64) -> index
238*1bffc753SEric Schweitz! CHECK:           %[[VAL_21:.*]] = arith.subi %[[VAL_20]], %[[VAL_11]]#0 : index
239*1bffc753SEric Schweitz! CHECK:           %[[VAL_22:.*]] = fir.array_access %[[VAL_13]], %[[VAL_21]] : (!fir.array<?xi32>, index) -> !fir.ref<i32>
240*1bffc753SEric Schweitz! CHECK:           %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (!fir.ref<i32>) -> !fir.ptr<i32>
241*1bffc753SEric Schweitz! CHECK:           %[[VAL_24:.*]] = fir.embox %[[VAL_23]] : (!fir.ptr<i32>) -> !fir.box<!fir.ptr<i32>>
242*1bffc753SEric Schweitz! CHECK:           %[[VAL_25:.*]] = arith.constant 1 : index
243*1bffc753SEric Schweitz! CHECK:           %[[VAL_26:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
244*1bffc753SEric Schweitz! CHECK:           %[[VAL_27:.*]] = fir.convert %[[VAL_26]] : (i32) -> i64
245*1bffc753SEric Schweitz! CHECK:           %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i64) -> index
246*1bffc753SEric Schweitz! CHECK:           %[[VAL_29:.*]] = arith.subi %[[VAL_28]], %[[VAL_25]] : index
247*1bffc753SEric Schweitz! CHECK:           %[[VAL_30:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
248*1bffc753SEric Schweitz! CHECK:           %[[VAL_31:.*]] = fir.array_update %[[VAL_16]], %[[VAL_24]], %[[VAL_29]], %[[VAL_30]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.ptr<i32>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
249*1bffc753SEric Schweitz! CHECK:           fir.result %[[VAL_31]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
250*1bffc753SEric Schweitz! CHECK:         }
251*1bffc753SEric Schweitz! CHECK:         fir.array_merge_store %[[VAL_8]], %[[VAL_32:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
252*1bffc753SEric Schweitz! CHECK:         return
253*1bffc753SEric Schweitz! CHECK:       }
254*1bffc753SEric Schweitz
255*1bffc753SEric Schweitzsubroutine s2_2(x,y)
256*1bffc753SEric Schweitz  use array_of_pointer_test
257*1bffc753SEric Schweitz  type(t) :: x(:)
258*1bffc753SEric Schweitz  integer, ALLOCATABLE, TARGET :: y(:)
259*1bffc753SEric Schweitz
260*1bffc753SEric Schweitz  forall (i=1:10)
261*1bffc753SEric Schweitz     ! assign address to POINTER
262*1bffc753SEric Schweitz     x(i)%ip => y(i)
263*1bffc753SEric Schweitz  end forall
264*1bffc753SEric Schweitzend subroutine s2_2
265*1bffc753SEric Schweitz
266*1bffc753SEric Schweitz! CHECK-LABEL: func @_QPs2_2(
267*1bffc753SEric Schweitz! CHECK-SAME:                %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"},
268*1bffc753SEric Schweitz! CHECK-SAME:                %[[VAL_1:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>> {fir.bindc_name = "y", fir.target}) {
269*1bffc753SEric Schweitz! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
270*1bffc753SEric Schweitz! CHECK:         %[[VAL_3:.*]] = arith.constant 1 : i32
271*1bffc753SEric Schweitz! CHECK:         %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> index
272*1bffc753SEric Schweitz! CHECK:         %[[VAL_5:.*]] = arith.constant 10 : i32
273*1bffc753SEric Schweitz! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
274*1bffc753SEric Schweitz! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : index
275*1bffc753SEric Schweitz! CHECK:         %[[VAL_8:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
276*1bffc753SEric Schweitz! CHECK:         %[[VAL_9:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
277*1bffc753SEric Schweitz! CHECK:         %[[VAL_10:.*]] = arith.constant 0 : index
278*1bffc753SEric Schweitz! CHECK:         %[[VAL_11:.*]]:3 = fir.box_dims %[[VAL_9]], %[[VAL_10]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)
279*1bffc753SEric Schweitz! CHECK:         %[[VAL_12:.*]] = fir.box_addr %[[VAL_9]] : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>
280*1bffc753SEric Schweitz! CHECK:         %[[VAL_13:.*]] = fir.shape_shift %[[VAL_11]]#0, %[[VAL_11]]#1 : (index, index) -> !fir.shapeshift<1>
281*1bffc753SEric Schweitz! CHECK:         %[[VAL_14:.*]] = fir.array_load %[[VAL_12]](%[[VAL_13]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shapeshift<1>) -> !fir.array<?xi32>
282*1bffc753SEric Schweitz! CHECK:         %[[VAL_15:.*]] = fir.do_loop %[[VAL_16:.*]] = %[[VAL_4]] to %[[VAL_6]] step %[[VAL_7]] unordered iter_args(%[[VAL_17:.*]] = %[[VAL_8]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
283*1bffc753SEric Schweitz! CHECK:           %[[VAL_18:.*]] = fir.convert %[[VAL_16]] : (index) -> i32
284*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_18]] to %[[VAL_2]] : !fir.ref<i32>
285*1bffc753SEric Schweitz! CHECK:           %[[VAL_19:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
286*1bffc753SEric Schweitz! CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i32) -> i64
287*1bffc753SEric Schweitz! CHECK:           %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i64) -> index
288*1bffc753SEric Schweitz! CHECK:           %[[VAL_22:.*]] = arith.subi %[[VAL_21]], %[[VAL_11]]#0 : index
289*1bffc753SEric Schweitz! CHECK:           %[[VAL_23:.*]] = fir.array_access %[[VAL_14]], %[[VAL_22]] : (!fir.array<?xi32>, index) -> !fir.ref<i32>
290*1bffc753SEric Schweitz! CHECK:           %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (!fir.ref<i32>) -> !fir.ptr<i32>
291*1bffc753SEric Schweitz! CHECK:           %[[VAL_25:.*]] = fir.embox %[[VAL_24]] : (!fir.ptr<i32>) -> !fir.box<!fir.ptr<i32>>
292*1bffc753SEric Schweitz! CHECK:           %[[VAL_26:.*]] = arith.constant 1 : index
293*1bffc753SEric Schweitz! CHECK:           %[[VAL_27:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
294*1bffc753SEric Schweitz! CHECK:           %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i32) -> i64
295*1bffc753SEric Schweitz! CHECK:           %[[VAL_29:.*]] = fir.convert %[[VAL_28]] : (i64) -> index
296*1bffc753SEric Schweitz! CHECK:           %[[VAL_30:.*]] = arith.subi %[[VAL_29]], %[[VAL_26]] : index
297*1bffc753SEric Schweitz! CHECK:           %[[VAL_31:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
298*1bffc753SEric Schweitz! CHECK:           %[[VAL_32:.*]] = fir.array_update %[[VAL_17]], %[[VAL_25]], %[[VAL_30]], %[[VAL_31]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.ptr<i32>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
299*1bffc753SEric Schweitz! CHECK:           fir.result %[[VAL_32]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
300*1bffc753SEric Schweitz! CHECK:         }
301*1bffc753SEric Schweitz! CHECK:         fir.array_merge_store %[[VAL_8]], %[[VAL_33:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
302*1bffc753SEric Schweitz! CHECK:         return
303*1bffc753SEric Schweitz! CHECK:       }
304*1bffc753SEric Schweitz
305*1bffc753SEric Schweitzsubroutine s2_3(x)
306*1bffc753SEric Schweitz  use array_of_pointer_test
307*1bffc753SEric Schweitz  type(t) :: x(:)
308*1bffc753SEric Schweitz  ! This is legal, but a bad idea.
309*1bffc753SEric Schweitz  integer, ALLOCATABLE, TARGET :: y(:)
310*1bffc753SEric Schweitz
311*1bffc753SEric Schweitz  forall (i=1:10)
312*1bffc753SEric Schweitz     ! assign address to POINTER
313*1bffc753SEric Schweitz     x(i)%ip => y(i)
314*1bffc753SEric Schweitz  end forall
315*1bffc753SEric Schweitz  ! x's pointers will remain associated, and may point to deallocated y.
316*1bffc753SEric Schweitzend subroutine s2_3
317*1bffc753SEric Schweitz
318*1bffc753SEric Schweitz! CHECK-LABEL: func @_QPs2_3(
319*1bffc753SEric Schweitz! CHECK-SAME:                %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"}) {
320*1bffc753SEric Schweitz! CHECK:         %[[VAL_1:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
321*1bffc753SEric Schweitz! CHECK:         %[[VAL_2:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?xi32>>> {bindc_name = "y", fir.target, uniq_name = "_QFs2_3Ey"}
322*1bffc753SEric Schweitz! CHECK:         %[[VAL_3:.*]] = fir.alloca !fir.heap<!fir.array<?xi32>> {uniq_name = "_QFs2_3Ey.addr"}
323*1bffc753SEric Schweitz! CHECK:         %[[VAL_4:.*]] = fir.alloca index {uniq_name = "_QFs2_3Ey.lb0"}
324*1bffc753SEric Schweitz! CHECK:         %[[VAL_5:.*]] = fir.alloca index {uniq_name = "_QFs2_3Ey.ext0"}
325*1bffc753SEric Schweitz! CHECK:         %[[VAL_6:.*]] = fir.zero_bits !fir.heap<!fir.array<?xi32>>
326*1bffc753SEric Schweitz! CHECK:         fir.store %[[VAL_6]] to %[[VAL_3]] : !fir.ref<!fir.heap<!fir.array<?xi32>>>
327*1bffc753SEric Schweitz! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : i32
328*1bffc753SEric Schweitz! CHECK:         %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i32) -> index
329*1bffc753SEric Schweitz! CHECK:         %[[VAL_9:.*]] = arith.constant 10 : i32
330*1bffc753SEric Schweitz! CHECK:         %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i32) -> index
331*1bffc753SEric Schweitz! CHECK:         %[[VAL_11:.*]] = arith.constant 1 : index
332*1bffc753SEric Schweitz! CHECK:         %[[VAL_12:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
333*1bffc753SEric Schweitz! CHECK:         %[[VAL_13:.*]] = fir.load %[[VAL_4]] : !fir.ref<index>
334*1bffc753SEric Schweitz! CHECK:         %[[VAL_14:.*]] = fir.load %[[VAL_5]] : !fir.ref<index>
335*1bffc753SEric Schweitz! CHECK:         %[[VAL_15:.*]] = fir.load %[[VAL_3]] : !fir.ref<!fir.heap<!fir.array<?xi32>>>
336*1bffc753SEric Schweitz! CHECK:         %[[VAL_16:.*]] = fir.shape_shift %[[VAL_13]], %[[VAL_14]] : (index, index) -> !fir.shapeshift<1>
337*1bffc753SEric Schweitz! CHECK:         %[[VAL_17:.*]] = fir.array_load %[[VAL_15]](%[[VAL_16]]) : (!fir.heap<!fir.array<?xi32>>, !fir.shapeshift<1>) -> !fir.array<?xi32>
338*1bffc753SEric Schweitz! CHECK:         %[[VAL_18:.*]] = fir.do_loop %[[VAL_19:.*]] = %[[VAL_8]] to %[[VAL_10]] step %[[VAL_11]] unordered iter_args(%[[VAL_20:.*]] = %[[VAL_12]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
339*1bffc753SEric Schweitz! CHECK:           %[[VAL_21:.*]] = fir.convert %[[VAL_19]] : (index) -> i32
340*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_21]] to %[[VAL_1]] : !fir.ref<i32>
341*1bffc753SEric Schweitz! CHECK:           %[[VAL_22:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32>
342*1bffc753SEric Schweitz! CHECK:           %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i32) -> i64
343*1bffc753SEric Schweitz! CHECK:           %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (i64) -> index
344*1bffc753SEric Schweitz! CHECK:           %[[VAL_25:.*]] = arith.subi %[[VAL_24]], %[[VAL_13]] : index
345*1bffc753SEric Schweitz! CHECK:           %[[VAL_26:.*]] = fir.array_access %[[VAL_17]], %[[VAL_25]] : (!fir.array<?xi32>, index) -> !fir.ref<i32>
346*1bffc753SEric Schweitz! CHECK:           %[[VAL_27:.*]] = fir.convert %[[VAL_26]] : (!fir.ref<i32>) -> !fir.ptr<i32>
347*1bffc753SEric Schweitz! CHECK:           %[[VAL_28:.*]] = fir.embox %[[VAL_27]] : (!fir.ptr<i32>) -> !fir.box<!fir.ptr<i32>>
348*1bffc753SEric Schweitz! CHECK:           %[[VAL_29:.*]] = arith.constant 1 : index
349*1bffc753SEric Schweitz! CHECK:           %[[VAL_30:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32>
350*1bffc753SEric Schweitz! CHECK:           %[[VAL_31:.*]] = fir.convert %[[VAL_30]] : (i32) -> i64
351*1bffc753SEric Schweitz! CHECK:           %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (i64) -> index
352*1bffc753SEric Schweitz! CHECK:           %[[VAL_33:.*]] = arith.subi %[[VAL_32]], %[[VAL_29]] : index
353*1bffc753SEric Schweitz! CHECK:           %[[VAL_34:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
354*1bffc753SEric Schweitz! CHECK:           %[[VAL_35:.*]] = fir.array_update %[[VAL_20]], %[[VAL_28]], %[[VAL_33]], %[[VAL_34]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.ptr<i32>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
355*1bffc753SEric Schweitz! CHECK:           fir.result %[[VAL_35]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
356*1bffc753SEric Schweitz! CHECK:         }
357*1bffc753SEric Schweitz! CHECK:         fir.array_merge_store %[[VAL_12]], %[[VAL_36:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
358*1bffc753SEric Schweitz! CHECK:         return
359*1bffc753SEric Schweitz! CHECK:       }
360*1bffc753SEric Schweitz
361*1bffc753SEric Schweitz! Dependent type - TODO
362*1bffc753SEric Schweitz!subroutine s2_4(x,y,l)
363*1bffc753SEric Schweitz!  use array_of_pointer_test
364*1bffc753SEric Schweitz!  type(ct(l)) :: x(:)
365*1bffc753SEric Schweitz!  character(l), TARGET :: y(:)
366*1bffc753SEric Schweitz
367*1bffc753SEric Schweitz!  forall (i=1:10)
368*1bffc753SEric Schweitz     ! assign address to POINTER
369*1bffc753SEric Schweitz!     x(i)%cp => y(i)
370*1bffc753SEric Schweitz!  end forall
371*1bffc753SEric Schweitz!end subroutine s2_4
372*1bffc753SEric Schweitz
373*1bffc753SEric Schweitzsubroutine s3(x,y)
374*1bffc753SEric Schweitz  use array_of_pointer_test
375*1bffc753SEric Schweitz  type(tu) :: x(:)
376*1bffc753SEric Schweitz  integer :: y(:)
377*1bffc753SEric Schweitz
378*1bffc753SEric Schweitz  forall (i=1:10)
379*1bffc753SEric Schweitz     ! assign value to variable, indirecting through box
380*1bffc753SEric Schweitz     x(i)%ip%v = y(i)
381*1bffc753SEric Schweitz  end forall
382*1bffc753SEric Schweitzend subroutine s3
383*1bffc753SEric Schweitz
384*1bffc753SEric Schweitz! CHECK-LABEL: func @_QPs3(
385*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>> {fir.bindc_name = "x"},
386*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y"}) {
387*1bffc753SEric Schweitz! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
388*1bffc753SEric Schweitz! CHECK:         %[[VAL_3:.*]] = arith.constant 1 : i32
389*1bffc753SEric Schweitz! CHECK:         %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> index
390*1bffc753SEric Schweitz! CHECK:         %[[VAL_5:.*]] = arith.constant 10 : i32
391*1bffc753SEric Schweitz! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
392*1bffc753SEric Schweitz! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : index
393*1bffc753SEric Schweitz! CHECK:         %[[VAL_8:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
394*1bffc753SEric Schweitz! CHECK:         %[[VAL_9:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
395*1bffc753SEric Schweitz! CHECK:         %[[VAL_10:.*]] = fir.do_loop %[[VAL_11:.*]] = %[[VAL_4]] to %[[VAL_6]] step %[[VAL_7]] unordered iter_args(%[[VAL_12:.*]] = %[[VAL_8]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>) {
396*1bffc753SEric Schweitz! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_11]] : (index) -> i32
397*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_13]] to %[[VAL_2]] : !fir.ref<i32>
398*1bffc753SEric Schweitz! CHECK:           %[[VAL_14:.*]] = arith.constant 1 : index
399*1bffc753SEric Schweitz! CHECK:           %[[VAL_15:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
400*1bffc753SEric Schweitz! CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> i64
401*1bffc753SEric Schweitz! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i64) -> index
402*1bffc753SEric Schweitz! CHECK:           %[[VAL_18:.*]] = arith.subi %[[VAL_17]], %[[VAL_14]] : index
403*1bffc753SEric Schweitz! CHECK:           %[[VAL_19:.*]] = fir.array_fetch %[[VAL_9]], %[[VAL_18]] : (!fir.array<?xi32>, index) -> i32
404*1bffc753SEric Schweitz! CHECK:           %[[VAL_20:.*]] = arith.constant 1 : index
405*1bffc753SEric Schweitz! CHECK:           %[[VAL_21:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
406*1bffc753SEric Schweitz! CHECK:           %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (i32) -> i64
407*1bffc753SEric Schweitz! CHECK:           %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i64) -> index
408*1bffc753SEric Schweitz! CHECK:           %[[VAL_24:.*]] = arith.subi %[[VAL_23]], %[[VAL_20]] : index
409*1bffc753SEric Schweitz! CHECK:           %[[VAL_25:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>
410*1bffc753SEric Schweitz! CHECK:           %[[VAL_26:.*]] = fir.field_index v, !fir.type<_QMarray_of_pointer_testTu{v:i32}>
411*1bffc753SEric Schweitz! CHECK:           %[[VAL_27:.*]] = fir.array_access %[[VAL_12]], %[[VAL_24]], %[[VAL_25]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, index, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>
412*1bffc753SEric Schweitz! CHECK:           %[[VAL_28:.*]] = fir.load %[[VAL_27]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>
413*1bffc753SEric Schweitz! CHECK:           %[[VAL_29:.*]] = fir.coordinate_of %[[VAL_28]], %[[VAL_26]] : (!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>, !fir.field) -> !fir.ref<i32>
414*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_19]] to %[[VAL_29]] : !fir.ref<i32>
415*1bffc753SEric Schweitz! CHECK:           %[[VAL_30:.*]] = fir.array_amend %[[VAL_12]], %[[VAL_27]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
416*1bffc753SEric Schweitz! CHECK:           fir.result %[[VAL_30]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
417*1bffc753SEric Schweitz! CHECK:         }
418*1bffc753SEric Schweitz! CHECK:         fir.array_merge_store %[[VAL_8]], %[[VAL_31:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>
419*1bffc753SEric Schweitz! CHECK:         return
420*1bffc753SEric Schweitz! CHECK:       }
421*1bffc753SEric Schweitz
422*1bffc753SEric Schweitzsubroutine s3_1(x,y)
423*1bffc753SEric Schweitz  use array_of_pointer_test
424*1bffc753SEric Schweitz  type(tu) :: x(:)
425*1bffc753SEric Schweitz  integer :: y(:)
426*1bffc753SEric Schweitz
427*1bffc753SEric Schweitz  forall (i=1:10)
428*1bffc753SEric Schweitz     ! assign value to variable, indirecting through box
429*1bffc753SEric Schweitz     x(i)%ip%v = y(i)
430*1bffc753SEric Schweitz  end forall
431*1bffc753SEric Schweitzend subroutine s3_1
432*1bffc753SEric Schweitz
433*1bffc753SEric Schweitz! CHECK-LABEL: func @_QPs3_1(
434*1bffc753SEric Schweitz! CHECK-SAME:                %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>> {fir.bindc_name = "x"},
435*1bffc753SEric Schweitz! CHECK-SAME:                %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y"}) {
436*1bffc753SEric Schweitz! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
437*1bffc753SEric Schweitz! CHECK:         %[[VAL_3:.*]] = arith.constant 1 : i32
438*1bffc753SEric Schweitz! CHECK:         %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (i32) -> index
439*1bffc753SEric Schweitz! CHECK:         %[[VAL_5:.*]] = arith.constant 10 : i32
440*1bffc753SEric Schweitz! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
441*1bffc753SEric Schweitz! CHECK:         %[[VAL_7:.*]] = arith.constant 1 : index
442*1bffc753SEric Schweitz! CHECK:         %[[VAL_8:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
443*1bffc753SEric Schweitz! CHECK:         %[[VAL_9:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
444*1bffc753SEric Schweitz! CHECK:         %[[VAL_10:.*]] = fir.do_loop %[[VAL_11:.*]] = %[[VAL_4]] to %[[VAL_6]] step %[[VAL_7]] unordered iter_args(%[[VAL_12:.*]] = %[[VAL_8]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>) {
445*1bffc753SEric Schweitz! CHECK:           %[[VAL_13:.*]] = fir.convert %[[VAL_11]] : (index) -> i32
446*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_13]] to %[[VAL_2]] : !fir.ref<i32>
447*1bffc753SEric Schweitz! CHECK:           %[[VAL_14:.*]] = arith.constant 1 : index
448*1bffc753SEric Schweitz! CHECK:           %[[VAL_15:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
449*1bffc753SEric Schweitz! CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> i64
450*1bffc753SEric Schweitz! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_16]] : (i64) -> index
451*1bffc753SEric Schweitz! CHECK:           %[[VAL_18:.*]] = arith.subi %[[VAL_17]], %[[VAL_14]] : index
452*1bffc753SEric Schweitz! CHECK:           %[[VAL_19:.*]] = fir.array_fetch %[[VAL_9]], %[[VAL_18]] : (!fir.array<?xi32>, index) -> i32
453*1bffc753SEric Schweitz! CHECK:           %[[VAL_20:.*]] = arith.constant 1 : index
454*1bffc753SEric Schweitz! CHECK:           %[[VAL_21:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
455*1bffc753SEric Schweitz! CHECK:           %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (i32) -> i64
456*1bffc753SEric Schweitz! CHECK:           %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i64) -> index
457*1bffc753SEric Schweitz! CHECK:           %[[VAL_24:.*]] = arith.subi %[[VAL_23]], %[[VAL_20]] : index
458*1bffc753SEric Schweitz! CHECK:           %[[VAL_25:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>
459*1bffc753SEric Schweitz! CHECK:           %[[VAL_26:.*]] = fir.field_index v, !fir.type<_QMarray_of_pointer_testTu{v:i32}>
460*1bffc753SEric Schweitz! CHECK:           %[[VAL_27:.*]] = fir.array_access %[[VAL_12]], %[[VAL_24]], %[[VAL_25]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, index, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>
461*1bffc753SEric Schweitz! CHECK:           %[[VAL_28:.*]] = fir.load %[[VAL_27]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>
462*1bffc753SEric Schweitz! CHECK:           %[[VAL_29:.*]] = fir.coordinate_of %[[VAL_28]], %[[VAL_26]] : (!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>, !fir.field) -> !fir.ref<i32>
463*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_19]] to %[[VAL_29]] : !fir.ref<i32>
464*1bffc753SEric Schweitz! CHECK:           %[[VAL_30:.*]] = fir.array_amend %[[VAL_12]], %[[VAL_27]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
465*1bffc753SEric Schweitz! CHECK:           fir.result %[[VAL_30]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
466*1bffc753SEric Schweitz! CHECK:         }
467*1bffc753SEric Schweitz! CHECK:         fir.array_merge_store %[[VAL_8]], %[[VAL_31:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>
468*1bffc753SEric Schweitz! CHECK:         return
469*1bffc753SEric Schweitz! CHECK:       }
470*1bffc753SEric Schweitz
471*1bffc753SEric Schweitz! Slice a target array and assign the box to a pointer of rank-1 field.
472*1bffc753SEric Schweitz! RHS is an array section. Hits a TODO.
473*1bffc753SEric Schweitzsubroutine s4(x,y)
474*1bffc753SEric Schweitz  use array_of_pointer_test
475*1bffc753SEric Schweitz  type(ta) :: x(:)
476*1bffc753SEric Schweitz  integer, TARGET :: y(:)
477*1bffc753SEric Schweitz
478*1bffc753SEric Schweitz  forall (i=1:10)
479*1bffc753SEric Schweitz     ! TODO: auto boxing of ranked RHS
480*1bffc753SEric Schweitz!    x(i)%ip => y(i:i+1)
481*1bffc753SEric Schweitz  end forall
482*1bffc753SEric Schweitzend subroutine s4
483*1bffc753SEric Schweitz
484*1bffc753SEric Schweitz! Most other Fortran implementations cannot compile the following 2 cases, s5
485*1bffc753SEric Schweitz! and s5_1.
486*1bffc753SEric Schweitzsubroutine s5(x,y,z,n1,n2)
487*1bffc753SEric Schweitz  use array_of_pointer_test
488*1bffc753SEric Schweitz  type(ta) :: x(:)
489*1bffc753SEric Schweitz  type(tb) :: y(:)
490*1bffc753SEric Schweitz  type(ta), TARGET :: z(:)
491*1bffc753SEric Schweitz
492*1bffc753SEric Schweitz  forall (i=1:10)
493*1bffc753SEric Schweitz     ! Convert the rank-1 array to a rank-2 array on assignment
494*1bffc753SEric Schweitz     y(i)%ip(1:n1,1:n2) => z(i)%ip
495*1bffc753SEric Schweitz  end forall
496*1bffc753SEric Schweitzend subroutine s5
497*1bffc753SEric Schweitz
498*1bffc753SEric Schweitz! CHECK-LABEL: func @_QPs5(
499*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>> {fir.bindc_name = "x"},
500*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_1:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>> {fir.bindc_name = "y"},
501*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_2:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>> {fir.bindc_name = "z", fir.target},
502*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_3:.*]]: !fir.ref<i32> {fir.bindc_name = "n1"},
503*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_4:.*]]: !fir.ref<i32> {fir.bindc_name = "n2"}) {
504*1bffc753SEric Schweitz! CHECK:         %[[VAL_5:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
505*1bffc753SEric Schweitz! CHECK:         %[[VAL_6:.*]] = arith.constant 1 : i32
506*1bffc753SEric Schweitz! CHECK:         %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i32) -> index
507*1bffc753SEric Schweitz! CHECK:         %[[VAL_8:.*]] = arith.constant 10 : i32
508*1bffc753SEric Schweitz! CHECK:         %[[VAL_9:.*]] = fir.convert %[[VAL_8]] : (i32) -> index
509*1bffc753SEric Schweitz! CHECK:         %[[VAL_10:.*]] = arith.constant 1 : index
510*1bffc753SEric Schweitz! CHECK:         %[[VAL_11:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>
511*1bffc753SEric Schweitz! CHECK:         %[[VAL_12:.*]] = fir.array_load %[[VAL_2]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
512*1bffc753SEric Schweitz! CHECK:         %[[VAL_13:.*]] = fir.do_loop %[[VAL_14:.*]] = %[[VAL_7]] to %[[VAL_9]] step %[[VAL_10]] unordered iter_args(%[[VAL_15:.*]] = %[[VAL_11]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>) {
513*1bffc753SEric Schweitz! CHECK:           %[[VAL_16:.*]] = fir.convert %[[VAL_14]] : (index) -> i32
514*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_16]] to %[[VAL_5]] : !fir.ref<i32>
515*1bffc753SEric Schweitz! CHECK:           %[[VAL_17:.*]] = arith.constant 1 : i64
516*1bffc753SEric Schweitz! CHECK:           %[[VAL_18:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
517*1bffc753SEric Schweitz! CHECK:           %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i32) -> i64
518*1bffc753SEric Schweitz! CHECK:           %[[VAL_20:.*]] = arith.constant 1 : i64
519*1bffc753SEric Schweitz! CHECK:           %[[VAL_21:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
520*1bffc753SEric Schweitz! CHECK:           %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (i32) -> i64
521*1bffc753SEric Schweitz! CHECK:           %[[VAL_23:.*]] = arith.constant 1 : index
522*1bffc753SEric Schweitz! CHECK:           %[[VAL_24:.*]] = fir.load %[[VAL_5]] : !fir.ref<i32>
523*1bffc753SEric Schweitz! CHECK:           %[[VAL_25:.*]] = fir.convert %[[VAL_24]] : (i32) -> i64
524*1bffc753SEric Schweitz! CHECK:           %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i64) -> index
525*1bffc753SEric Schweitz! CHECK:           %[[VAL_27:.*]] = arith.subi %[[VAL_26]], %[[VAL_23]] : index
526*1bffc753SEric Schweitz! CHECK:           %[[VAL_28:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>
527*1bffc753SEric Schweitz! CHECK:           %[[VAL_29:.*]] = fir.array_fetch %[[VAL_12]], %[[VAL_27]], %[[VAL_28]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, index, !fir.field) -> !fir.box<!fir.ptr<!fir.array<?xi32>>>
528*1bffc753SEric Schweitz! CHECK:           %[[VAL_30:.*]] = arith.constant 1 : index
529*1bffc753SEric Schweitz! CHECK:           %[[VAL_31:.*]] = fir.load %[[VAL_5]] : !fir.ref<i32>
530*1bffc753SEric Schweitz! CHECK:           %[[VAL_32:.*]] = fir.convert %[[VAL_31]] : (i32) -> i64
531*1bffc753SEric Schweitz! CHECK:           %[[VAL_33:.*]] = fir.convert %[[VAL_32]] : (i64) -> index
532*1bffc753SEric Schweitz! CHECK:           %[[VAL_34:.*]] = arith.subi %[[VAL_33]], %[[VAL_30]] : index
533*1bffc753SEric Schweitz! CHECK:           %[[VAL_35:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>
534*1bffc753SEric Schweitz! CHECK:           %[[VAL_36:.*]] = fir.convert %[[VAL_29]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>) -> !fir.box<!fir.ptr<!fir.array<?x?xi32>>>
535*1bffc753SEric Schweitz! CHECK:           %[[VAL_37:.*]] = fir.shape_shift %[[VAL_17]], %[[VAL_19]], %[[VAL_20]], %[[VAL_22]] : (i64, i64, i64, i64) -> !fir.shapeshift<2>
536*1bffc753SEric Schweitz! CHECK:           %[[VAL_38:.*]] = fir.rebox %[[VAL_36]](%[[VAL_37]]) : (!fir.box<!fir.ptr<!fir.array<?x?xi32>>>, !fir.shapeshift<2>) -> !fir.box<!fir.ptr<!fir.array<?x?xi32>>>
537*1bffc753SEric Schweitz! CHECK:           %[[VAL_39:.*]] = fir.array_update %[[VAL_15]], %[[VAL_38]], %[[VAL_34]], %[[VAL_35]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>, !fir.box<!fir.ptr<!fir.array<?x?xi32>>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>
538*1bffc753SEric Schweitz! CHECK:           fir.result %[[VAL_39]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>
539*1bffc753SEric Schweitz! CHECK:         }
540*1bffc753SEric Schweitz! CHECK:         fir.array_merge_store %[[VAL_11]], %[[VAL_40:.*]] to %[[VAL_1]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtb{ip:!fir.box<!fir.ptr<!fir.array<?x?xi32>>>}>>>
541*1bffc753SEric Schweitz! CHECK:         return
542*1bffc753SEric Schweitz! CHECK:       }
543*1bffc753SEric Schweitz
544*1bffc753SEric Schweitz! RHS is an array section. Hits a TODO.
545*1bffc753SEric Schweitzsubroutine s5_1(x,y,z,n1,n2)
546*1bffc753SEric Schweitz  use array_of_pointer_test
547*1bffc753SEric Schweitz  type(ta) :: x(:)
548*1bffc753SEric Schweitz  type(tb) :: y(:)
549*1bffc753SEric Schweitz  type(ta), TARGET :: z(:)
550*1bffc753SEric Schweitz
551*1bffc753SEric Schweitz  forall (i=1:10)
552*1bffc753SEric Schweitz     ! Slice a rank 1 array and save the slice to the box.
553*1bffc753SEric Schweitz!     x(i)%ip => z(i)%ip(1::n1+1)
554*1bffc753SEric Schweitz  end forall
555*1bffc753SEric Schweitzend subroutine s5_1
556*1bffc753SEric Schweitz
557*1bffc753SEric Schweitzsubroutine s6(x,y)
558*1bffc753SEric Schweitz  use array_of_pointer_test
559*1bffc753SEric Schweitz  type(tv) :: x(:)
560*1bffc753SEric Schweitz  integer, target :: y(:)
561*1bffc753SEric Schweitz
562*1bffc753SEric Schweitz  forall (i=1:10, j=2:20:2)
563*1bffc753SEric Schweitz     ! Two box indirections.
564*1bffc753SEric Schweitz     x(i)%jp(j)%ip%v = y(i)
565*1bffc753SEric Schweitz  end forall
566*1bffc753SEric Schweitzend subroutine s6
567*1bffc753SEric Schweitz
568*1bffc753SEric Schweitz! CHECK-LABEL: func @_QPs6(
569*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>> {fir.bindc_name = "x"},
570*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y", fir.target}) {
571*1bffc753SEric Schweitz! CHECK:         %[[VAL_2:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "j"}
572*1bffc753SEric Schweitz! CHECK:         %[[VAL_3:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
573*1bffc753SEric Schweitz! CHECK:         %[[VAL_4:.*]] = arith.constant 1 : i32
574*1bffc753SEric Schweitz! CHECK:         %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i32) -> index
575*1bffc753SEric Schweitz! CHECK:         %[[VAL_6:.*]] = arith.constant 10 : i32
576*1bffc753SEric Schweitz! CHECK:         %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i32) -> index
577*1bffc753SEric Schweitz! CHECK:         %[[VAL_8:.*]] = arith.constant 1 : index
578*1bffc753SEric Schweitz! CHECK:         %[[VAL_9:.*]] = arith.constant 2 : i32
579*1bffc753SEric Schweitz! CHECK:         %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i32) -> index
580*1bffc753SEric Schweitz! CHECK:         %[[VAL_11:.*]] = arith.constant 20 : i32
581*1bffc753SEric Schweitz! CHECK:         %[[VAL_12:.*]] = fir.convert %[[VAL_11]] : (i32) -> index
582*1bffc753SEric Schweitz! CHECK:         %[[VAL_13:.*]] = arith.constant 2 : i32
583*1bffc753SEric Schweitz! CHECK:         %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (i32) -> index
584*1bffc753SEric Schweitz! CHECK:         %[[VAL_15:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>
585*1bffc753SEric Schweitz! CHECK:         %[[VAL_16:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
586*1bffc753SEric Schweitz! CHECK:         %[[VAL_17:.*]] = fir.do_loop %[[VAL_18:.*]] = %[[VAL_5]] to %[[VAL_7]] step %[[VAL_8]] unordered iter_args(%[[VAL_19:.*]] = %[[VAL_15]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>) {
587*1bffc753SEric Schweitz! CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_18]] : (index) -> i32
588*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_20]] to %[[VAL_3]] : !fir.ref<i32>
589*1bffc753SEric Schweitz! CHECK:           %[[VAL_21:.*]] = fir.do_loop %[[VAL_22:.*]] = %[[VAL_10]] to %[[VAL_12]] step %[[VAL_14]] unordered iter_args(%[[VAL_23:.*]] = %[[VAL_19]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>) {
590*1bffc753SEric Schweitz! CHECK:             %[[VAL_24:.*]] = fir.convert %[[VAL_22]] : (index) -> i32
591*1bffc753SEric Schweitz! CHECK:             fir.store %[[VAL_24]] to %[[VAL_2]] : !fir.ref<i32>
592*1bffc753SEric Schweitz! CHECK:             %[[VAL_25:.*]] = arith.constant 1 : index
593*1bffc753SEric Schweitz! CHECK:             %[[VAL_26:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
594*1bffc753SEric Schweitz! CHECK:             %[[VAL_27:.*]] = fir.convert %[[VAL_26]] : (i32) -> i64
595*1bffc753SEric Schweitz! CHECK:             %[[VAL_28:.*]] = fir.convert %[[VAL_27]] : (i64) -> index
596*1bffc753SEric Schweitz! CHECK:             %[[VAL_29:.*]] = arith.subi %[[VAL_28]], %[[VAL_25]] : index
597*1bffc753SEric Schweitz! CHECK:             %[[VAL_30:.*]] = fir.array_fetch %[[VAL_16]], %[[VAL_29]] : (!fir.array<?xi32>, index) -> i32
598*1bffc753SEric Schweitz! CHECK:             %[[VAL_31:.*]] = arith.constant 1 : index
599*1bffc753SEric Schweitz! CHECK:             %[[VAL_32:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
600*1bffc753SEric Schweitz! CHECK:             %[[VAL_33:.*]] = fir.convert %[[VAL_32]] : (i32) -> i64
601*1bffc753SEric Schweitz! CHECK:             %[[VAL_34:.*]] = fir.convert %[[VAL_33]] : (i64) -> index
602*1bffc753SEric Schweitz! CHECK:             %[[VAL_35:.*]] = arith.subi %[[VAL_34]], %[[VAL_31]] : index
603*1bffc753SEric Schweitz! CHECK:             %[[VAL_36:.*]] = fir.field_index jp, !fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>
604*1bffc753SEric Schweitz! CHECK:             %[[VAL_37:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
605*1bffc753SEric Schweitz! CHECK:             %[[VAL_38:.*]] = fir.convert %[[VAL_37]] : (i32) -> i64
606*1bffc753SEric Schweitz! CHECK:             %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (i64) -> index
607*1bffc753SEric Schweitz! CHECK:             %[[VAL_40:.*]] = arith.subi %[[VAL_39]], %[[VAL_31]] : index
608*1bffc753SEric Schweitz! CHECK:             %[[VAL_41:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>
609*1bffc753SEric Schweitz! CHECK:             %[[VAL_42:.*]] = fir.field_index v, !fir.type<_QMarray_of_pointer_testTu{v:i32}>
610*1bffc753SEric Schweitz! CHECK:             %[[VAL_43:.*]] = fir.array_access %[[VAL_23]], %[[VAL_35]], %[[VAL_36]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>, index, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>>
611*1bffc753SEric Schweitz! CHECK:             %[[VAL_44:.*]] = fir.load %[[VAL_43]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>>
612*1bffc753SEric Schweitz! CHECK:             %[[VAL_45:.*]] = fir.coordinate_of %[[VAL_44]], %[[VAL_40]] : (!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>, index) -> !fir.ref<!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>
613*1bffc753SEric Schweitz! CHECK:             %[[VAL_46:.*]] = fir.coordinate_of %[[VAL_45]], %[[VAL_41]] : (!fir.ref<!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>
614*1bffc753SEric Schweitz! CHECK:             %[[VAL_47:.*]] = fir.load %[[VAL_46]] : !fir.ref<!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>>
615*1bffc753SEric Schweitz! CHECK:             %[[VAL_48:.*]] = fir.coordinate_of %[[VAL_47]], %[[VAL_42]] : (!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>, !fir.field) -> !fir.ref<i32>
616*1bffc753SEric Schweitz! CHECK:             fir.store %[[VAL_30]] to %[[VAL_48]] : !fir.ref<i32>
617*1bffc753SEric Schweitz! CHECK:             %[[VAL_49:.*]] = fir.array_amend %[[VAL_23]], %[[VAL_43]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>
618*1bffc753SEric Schweitz! CHECK:             fir.result %[[VAL_49]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>
619*1bffc753SEric Schweitz! CHECK:           }
620*1bffc753SEric Schweitz! CHECK:           fir.result %[[VAL_50:.*]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>
621*1bffc753SEric Schweitz! CHECK:         }
622*1bffc753SEric Schweitz! CHECK:         fir.array_merge_store %[[VAL_15]], %[[VAL_51:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtv{jp:!fir.box<!fir.ptr<!fir.array<?x!fir.type<_QMarray_of_pointer_testTtu{ip:!fir.box<!fir.ptr<!fir.type<_QMarray_of_pointer_testTu{v:i32}>>>}>>>>}>>>
623*1bffc753SEric Schweitz! CHECK:         return
624*1bffc753SEric Schweitz! CHECK:       }
625*1bffc753SEric Schweitz
626*1bffc753SEric Schweitzsubroutine s7(x,y,n)
627*1bffc753SEric Schweitz  use array_of_pointer_test
628*1bffc753SEric Schweitz  type(t) x(:)
629*1bffc753SEric Schweitz  integer, TARGET :: y(:)
630*1bffc753SEric Schweitz  ! Introduce a crossing dependence
631*1bffc753SEric Schweitz  forall (i=1:n)
632*1bffc753SEric Schweitz    x(i)%ip => y(x(n+1-i)%ip)
633*1bffc753SEric Schweitz  end forall
634*1bffc753SEric Schweitzend subroutine s7
635*1bffc753SEric Schweitz
636*1bffc753SEric Schweitz! CHECK-LABEL: func @_QPs7(
637*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>> {fir.bindc_name = "x"},
638*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y", fir.target},
639*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_2:.*]]: !fir.ref<i32> {fir.bindc_name = "n"}) {
640*1bffc753SEric Schweitz! CHECK:         %[[VAL_3:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
641*1bffc753SEric Schweitz! CHECK:         %[[VAL_4:.*]] = arith.constant 1 : i32
642*1bffc753SEric Schweitz! CHECK:         %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i32) -> index
643*1bffc753SEric Schweitz! CHECK:         %[[VAL_6:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
644*1bffc753SEric Schweitz! CHECK:         %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i32) -> index
645*1bffc753SEric Schweitz! CHECK:         %[[VAL_8:.*]] = arith.constant 1 : index
646*1bffc753SEric Schweitz! CHECK:         %[[VAL_9:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
647*1bffc753SEric Schweitz! CHECK:         %[[VAL_10:.*]] = fir.array_load %[[VAL_1]] : (!fir.box<!fir.array<?xi32>>) -> !fir.array<?xi32>
648*1bffc753SEric Schweitz! CHECK:         %[[VAL_11:.*]] = fir.do_loop %[[VAL_12:.*]] = %[[VAL_5]] to %[[VAL_7]] step %[[VAL_8]] unordered iter_args(%[[VAL_13:.*]] = %[[VAL_9]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>) {
649*1bffc753SEric Schweitz! CHECK:           %[[VAL_14:.*]] = fir.convert %[[VAL_12]] : (index) -> i32
650*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_14]] to %[[VAL_3]] : !fir.ref<i32>
651*1bffc753SEric Schweitz! CHECK:           %[[VAL_15:.*]] = arith.constant 1 : index
652*1bffc753SEric Schweitz! CHECK:           %[[VAL_16:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
653*1bffc753SEric Schweitz! CHECK:           %[[VAL_17:.*]] = arith.constant 1 : i32
654*1bffc753SEric Schweitz! CHECK:           %[[VAL_18:.*]] = arith.addi %[[VAL_16]], %[[VAL_17]] : i32
655*1bffc753SEric Schweitz! CHECK:           %[[VAL_19:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
656*1bffc753SEric Schweitz! CHECK:           %[[VAL_20:.*]] = arith.subi %[[VAL_18]], %[[VAL_19]] : i32
657*1bffc753SEric Schweitz! CHECK:           %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i32) -> i64
658*1bffc753SEric Schweitz! CHECK:           %[[VAL_22:.*]] = arith.constant 1 : i64
659*1bffc753SEric Schweitz! CHECK:           %[[VAL_23:.*]] = arith.subi %[[VAL_21]], %[[VAL_22]] : i64
660*1bffc753SEric Schweitz! CHECK:           %[[VAL_24:.*]] = fir.coordinate_of %[[VAL_0]], %[[VAL_23]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>, i64) -> !fir.ref<!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
661*1bffc753SEric Schweitz! CHECK:           %[[VAL_25:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
662*1bffc753SEric Schweitz! CHECK:           %[[VAL_26:.*]] = fir.coordinate_of %[[VAL_24]], %[[VAL_25]] : (!fir.ref<!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.field) -> !fir.ref<!fir.box<!fir.ptr<i32>>>
663*1bffc753SEric Schweitz! CHECK:           %[[VAL_27:.*]] = fir.load %[[VAL_26]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
664*1bffc753SEric Schweitz! CHECK:           %[[VAL_28:.*]] = fir.box_addr %[[VAL_27]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
665*1bffc753SEric Schweitz! CHECK:           %[[VAL_29:.*]] = fir.load %[[VAL_28]] : !fir.ptr<i32>
666*1bffc753SEric Schweitz! CHECK:           %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i32) -> i64
667*1bffc753SEric Schweitz! CHECK:           %[[VAL_31:.*]] = fir.convert %[[VAL_30]] : (i64) -> index
668*1bffc753SEric Schweitz! CHECK:           %[[VAL_32:.*]] = arith.subi %[[VAL_31]], %[[VAL_15]] : index
669*1bffc753SEric Schweitz! CHECK:           %[[VAL_33:.*]] = fir.array_access %[[VAL_10]], %[[VAL_32]] : (!fir.array<?xi32>, index) -> !fir.ref<i32>
670*1bffc753SEric Schweitz! CHECK:           %[[VAL_34:.*]] = fir.convert %[[VAL_33]] : (!fir.ref<i32>) -> !fir.ptr<i32>
671*1bffc753SEric Schweitz! CHECK:           %[[VAL_35:.*]] = fir.embox %[[VAL_34]] : (!fir.ptr<i32>) -> !fir.box<!fir.ptr<i32>>
672*1bffc753SEric Schweitz! CHECK:           %[[VAL_36:.*]] = arith.constant 1 : index
673*1bffc753SEric Schweitz! CHECK:           %[[VAL_37:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
674*1bffc753SEric Schweitz! CHECK:           %[[VAL_38:.*]] = fir.convert %[[VAL_37]] : (i32) -> i64
675*1bffc753SEric Schweitz! CHECK:           %[[VAL_39:.*]] = fir.convert %[[VAL_38]] : (i64) -> index
676*1bffc753SEric Schweitz! CHECK:           %[[VAL_40:.*]] = arith.subi %[[VAL_39]], %[[VAL_36]] : index
677*1bffc753SEric Schweitz! CHECK:           %[[VAL_41:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>
678*1bffc753SEric Schweitz! CHECK:           %[[VAL_42:.*]] = fir.array_update %[[VAL_13]], %[[VAL_35]], %[[VAL_40]], %[[VAL_41]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.ptr<i32>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
679*1bffc753SEric Schweitz! CHECK:           fir.result %[[VAL_42]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>
680*1bffc753SEric Schweitz! CHECK:         }
681*1bffc753SEric Schweitz! CHECK:         fir.array_merge_store %[[VAL_9]], %[[VAL_43:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTt{ip:!fir.box<!fir.ptr<i32>>}>>>
682*1bffc753SEric Schweitz! CHECK:         return
683*1bffc753SEric Schweitz! CHECK:       }
684*1bffc753SEric Schweitz
685*1bffc753SEric Schweitzsubroutine s8(x,y,n)
686*1bffc753SEric Schweitz  use array_of_pointer_test
687*1bffc753SEric Schweitz  type(ta) x(:)
688*1bffc753SEric Schweitz  integer, POINTER :: y(:)
689*1bffc753SEric Schweitz  forall (i=1:n)
690*1bffc753SEric Schweitz     x(i)%ip(i:) => y
691*1bffc753SEric Schweitz  end forall
692*1bffc753SEric Schweitzend subroutine s8
693*1bffc753SEric Schweitz
694*1bffc753SEric Schweitz! CHECK-LABEL: func @_QPs8(
695*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>> {fir.bindc_name = "x"},
696*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_1:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {fir.bindc_name = "y"},
697*1bffc753SEric Schweitz! CHECK-SAME:              %[[VAL_2:.*]]: !fir.ref<i32> {fir.bindc_name = "n"}) {
698*1bffc753SEric Schweitz! CHECK:         %[[VAL_3:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
699*1bffc753SEric Schweitz! CHECK:         %[[VAL_4:.*]] = arith.constant 1 : i32
700*1bffc753SEric Schweitz! CHECK:         %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i32) -> index
701*1bffc753SEric Schweitz! CHECK:         %[[VAL_6:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
702*1bffc753SEric Schweitz! CHECK:         %[[VAL_7:.*]] = fir.convert %[[VAL_6]] : (i32) -> index
703*1bffc753SEric Schweitz! CHECK:         %[[VAL_8:.*]] = arith.constant 1 : index
704*1bffc753SEric Schweitz! CHECK:         %[[VAL_9:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
705*1bffc753SEric Schweitz! CHECK:         %[[VAL_10:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
706*1bffc753SEric Schweitz! CHECK:         %[[VAL_11:.*]] = arith.constant 0 : index
707*1bffc753SEric Schweitz! CHECK:         %[[VAL_12:.*]]:3 = fir.box_dims %[[VAL_10]], %[[VAL_11]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)
708*1bffc753SEric Schweitz! CHECK:         %[[VAL_13:.*]] = fir.shift %[[VAL_12]]#0 : (index) -> !fir.shift<1>
709*1bffc753SEric Schweitz! CHECK:         %[[VAL_14:.*]] = fir.do_loop %[[VAL_15:.*]] = %[[VAL_5]] to %[[VAL_7]] step %[[VAL_8]] unordered iter_args(%[[VAL_16:.*]] = %[[VAL_9]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>) {
710*1bffc753SEric Schweitz! CHECK:           %[[VAL_17:.*]] = fir.convert %[[VAL_15]] : (index) -> i32
711*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_17]] to %[[VAL_3]] : !fir.ref<i32>
712*1bffc753SEric Schweitz! CHECK:           %[[VAL_18:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
713*1bffc753SEric Schweitz! CHECK:           %[[VAL_19:.*]] = fir.convert %[[VAL_18]] : (i32) -> i64
714*1bffc753SEric Schweitz! CHECK:           %[[VAL_20:.*]] = fir.rebox %[[VAL_10]](%[[VAL_13]]) : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, !fir.shift<1>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>>
715*1bffc753SEric Schweitz! CHECK:           %[[VAL_21:.*]] = arith.constant 1 : index
716*1bffc753SEric Schweitz! CHECK:           %[[VAL_22:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
717*1bffc753SEric Schweitz! CHECK:           %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (i32) -> i64
718*1bffc753SEric Schweitz! CHECK:           %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (i64) -> index
719*1bffc753SEric Schweitz! CHECK:           %[[VAL_25:.*]] = arith.subi %[[VAL_24]], %[[VAL_21]] : index
720*1bffc753SEric Schweitz! CHECK:           %[[VAL_26:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>
721*1bffc753SEric Schweitz! CHECK:           %[[VAL_27:.*]] = fir.shift %[[VAL_19]] : (i64) -> !fir.shift<1>
722*1bffc753SEric Schweitz! CHECK:           %[[VAL_28:.*]] = fir.rebox %[[VAL_20]](%[[VAL_27]]) : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, !fir.shift<1>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>>
723*1bffc753SEric Schweitz! CHECK:           %[[VAL_29:.*]] = fir.array_update %[[VAL_16]], %[[VAL_28]], %[[VAL_25]], %[[VAL_26]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, !fir.box<!fir.ptr<!fir.array<?xi32>>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
724*1bffc753SEric Schweitz! CHECK:           fir.result %[[VAL_29]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
725*1bffc753SEric Schweitz! CHECK:         }
726*1bffc753SEric Schweitz! CHECK:         fir.array_merge_store %[[VAL_9]], %[[VAL_30:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>>
727*1bffc753SEric Schweitz! CHECK:         return
728*1bffc753SEric Schweitz! CHECK:       }
729*1bffc753SEric Schweitz
730*1bffc753SEric Schweitzsubroutine s8_1(x,y,n1,n2)
731*1bffc753SEric Schweitz  use array_of_pointer_test
732*1bffc753SEric Schweitz  type(ta) x(:)
733*1bffc753SEric Schweitz  integer, POINTER :: y(:)
734*1bffc753SEric Schweitz  forall (i=1:n1)
735*1bffc753SEric Schweitz     x(i)%ip(i:n2+1+i) => y
736*1bffc753SEric Schweitz  end forall
737*1bffc753SEric Schweitzend subroutine s8_1
738*1bffc753SEric Schweitz
739*1bffc753SEric Schweitz! CHECK-LABEL: func @_QPs8_1(
740*1bffc753SEric Schweitz! CHECK-SAME:                %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>> {fir.bindc_name = "x"},
741*1bffc753SEric Schweitz! CHECK-SAME:                %[[VAL_1:.*]]: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {fir.bindc_name = "y"},
742*1bffc753SEric Schweitz! CHECK-SAME:                %[[VAL_2:.*]]: !fir.ref<i32> {fir.bindc_name = "n1"},
743*1bffc753SEric Schweitz! CHECK-SAME:                %[[VAL_3:.*]]: !fir.ref<i32> {fir.bindc_name = "n2"}) {
744*1bffc753SEric Schweitz! CHECK:         %[[VAL_4:.*]] = fir.alloca i32 {adapt.valuebyref, bindc_name = "i"}
745*1bffc753SEric Schweitz! CHECK:         %[[VAL_5:.*]] = arith.constant 1 : i32
746*1bffc753SEric Schweitz! CHECK:         %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i32) -> index
747*1bffc753SEric Schweitz! CHECK:         %[[VAL_7:.*]] = fir.load %[[VAL_2]] : !fir.ref<i32>
748*1bffc753SEric Schweitz! CHECK:         %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i32) -> index
749*1bffc753SEric Schweitz! CHECK:         %[[VAL_9:.*]] = arith.constant 1 : index
750*1bffc753SEric Schweitz! CHECK:         %[[VAL_10:.*]] = fir.array_load %[[VAL_0]] : (!fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>>) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
751*1bffc753SEric Schweitz! CHECK:         %[[VAL_11:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>
752*1bffc753SEric Schweitz! CHECK:         %[[VAL_12:.*]] = arith.constant 0 : index
753*1bffc753SEric Schweitz! CHECK:         %[[VAL_13:.*]]:3 = fir.box_dims %[[VAL_11]], %[[VAL_12]] : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)
754*1bffc753SEric Schweitz! CHECK:         %[[VAL_14:.*]] = fir.shift %[[VAL_13]]#0 : (index) -> !fir.shift<1>
755*1bffc753SEric Schweitz! CHECK:         %[[VAL_15:.*]] = fir.do_loop %[[VAL_16:.*]] = %[[VAL_6]] to %[[VAL_8]] step %[[VAL_9]] unordered iter_args(%[[VAL_17:.*]] = %[[VAL_10]]) -> (!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>) {
756*1bffc753SEric Schweitz! CHECK:           %[[VAL_18:.*]] = fir.convert %[[VAL_16]] : (index) -> i32
757*1bffc753SEric Schweitz! CHECK:           fir.store %[[VAL_18]] to %[[VAL_4]] : !fir.ref<i32>
758*1bffc753SEric Schweitz! CHECK:           %[[VAL_19:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
759*1bffc753SEric Schweitz! CHECK:           %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i32) -> i64
760*1bffc753SEric Schweitz! CHECK:           %[[VAL_21:.*]] = fir.load %[[VAL_3]] : !fir.ref<i32>
761*1bffc753SEric Schweitz! CHECK:           %[[VAL_22:.*]] = arith.constant 1 : i32
762*1bffc753SEric Schweitz! CHECK:           %[[VAL_23:.*]] = arith.addi %[[VAL_21]], %[[VAL_22]] : i32
763*1bffc753SEric Schweitz! CHECK:           %[[VAL_24:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
764*1bffc753SEric Schweitz! CHECK:           %[[VAL_25:.*]] = arith.addi %[[VAL_23]], %[[VAL_24]] : i32
765*1bffc753SEric Schweitz! CHECK:           %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (i32) -> i64
766*1bffc753SEric Schweitz! CHECK:           %[[VAL_27:.*]] = fir.rebox %[[VAL_11]](%[[VAL_14]]) : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, !fir.shift<1>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>>
767*1bffc753SEric Schweitz! CHECK:           %[[VAL_28:.*]] = arith.constant 1 : index
768*1bffc753SEric Schweitz! CHECK:           %[[VAL_29:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32>
769*1bffc753SEric Schweitz! CHECK:           %[[VAL_30:.*]] = fir.convert %[[VAL_29]] : (i32) -> i64
770*1bffc753SEric Schweitz! CHECK:           %[[VAL_31:.*]] = fir.convert %[[VAL_30]] : (i64) -> index
771*1bffc753SEric Schweitz! CHECK:           %[[VAL_32:.*]] = arith.subi %[[VAL_31]], %[[VAL_28]] : index
772*1bffc753SEric Schweitz! CHECK:           %[[VAL_33:.*]] = fir.field_index ip, !fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>
773*1bffc753SEric Schweitz! CHECK:           %[[VAL_34:.*]] = fir.shape_shift %[[VAL_20]], %[[VAL_26]] : (i64, i64) -> !fir.shapeshift<1>
774*1bffc753SEric Schweitz! CHECK:           %[[VAL_35:.*]] = fir.rebox %[[VAL_27]](%[[VAL_34]]) : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, !fir.shapeshift<1>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>>
775*1bffc753SEric Schweitz! CHECK:           %[[VAL_36:.*]] = fir.array_update %[[VAL_17]], %[[VAL_35]], %[[VAL_32]], %[[VAL_33]] : (!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, !fir.box<!fir.ptr<!fir.array<?xi32>>>, index, !fir.field) -> !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
776*1bffc753SEric Schweitz! CHECK:           fir.result %[[VAL_36]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>
777*1bffc753SEric Schweitz! CHECK:         }
778*1bffc753SEric Schweitz! CHECK:         fir.array_merge_store %[[VAL_10]], %[[VAL_37:.*]] to %[[VAL_0]] : !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, !fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>, !fir.box<!fir.array<?x!fir.type<_QMarray_of_pointer_testTta{ip:!fir.box<!fir.ptr<!fir.array<?xi32>>>}>>>
779*1bffc753SEric Schweitz! CHECK:         return
780*1bffc753SEric Schweitz! CHECK:       }
781*1bffc753SEric Schweitz
782*1bffc753SEric Schweitzsubroutine s8_2(x,y,n)
783*1bffc753SEric Schweitz  use array_of_pointer_test
784*1bffc753SEric Schweitz  type(ta) x(:)
785*1bffc753SEric Schweitz  integer, TARGET :: y(:)
786*1bffc753SEric Schweitz  forall (i=1:n)
787*1bffc753SEric Schweitz!     x(i)%ip(i:) => y
788*1bffc753SEric Schweitz  end forall
789*1bffc753SEric Schweitzend subroutine s8_2
790*1bffc753SEric Schweitz
791*1bffc753SEric Schweitzsubroutine s8_3(x,y,n1,n2)
792*1bffc753SEric Schweitz  use array_of_pointer_test
793*1bffc753SEric Schweitz  type(ta) x(:)
794*1bffc753SEric Schweitz  integer, TARGET :: y(:)
795*1bffc753SEric Schweitz  forall (i=1:n1)
796*1bffc753SEric Schweitz!     x(i)%ip(i:n2+1+i) => y
797*1bffc753SEric Schweitz  end forall
798*1bffc753SEric Schweitzend subroutine s8_3
799*1bffc753SEric Schweitz
800*1bffc753SEric Schweitzsubroutine s8_4(x,y,n)
801*1bffc753SEric Schweitz  use array_of_pointer_test
802*1bffc753SEric Schweitz  type(ta) x(:)
803*1bffc753SEric Schweitz  integer, ALLOCATABLE, TARGET :: y(:)
804*1bffc753SEric Schweitz  forall (i=1:n)
805*1bffc753SEric Schweitz!     x(i)%ip(i:) => y
806*1bffc753SEric Schweitz  end forall
807*1bffc753SEric Schweitzend subroutine s8_4
808*1bffc753SEric Schweitz
809*1bffc753SEric Schweitzsubroutine s8_5(x,y,n1,n2)
810*1bffc753SEric Schweitz  use array_of_pointer_test
811*1bffc753SEric Schweitz  type(ta) x(:)
812*1bffc753SEric Schweitz  integer, ALLOCATABLE, TARGET :: y(:)
813*1bffc753SEric Schweitz  forall (i=1:n1)
814*1bffc753SEric Schweitz!     x(i)%ip(i:n2+1+i) => y
815*1bffc753SEric Schweitz  end forall
816*1bffc753SEric Schweitzend subroutine s8_5
817