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