1179ea355SValentin Clement! RUN: bbc -emit-fir -use-alloc-runtime %s -o - | FileCheck %s 2179ea355SValentin Clement 3179ea355SValentin Clement! Test lowering of allocatables using runtime for allocate/deallcoate statements. 4179ea355SValentin Clement! CHECK-LABEL: _QPfoo 5179ea355SValentin Clementsubroutine foo() 6179ea355SValentin Clement real, allocatable :: x(:), y(:, :), z 7179ea355SValentin Clement ! CHECK: %[[xBoxAddr:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?xf32>>> {{{.*}}uniq_name = "_QFfooEx"} 8179ea355SValentin Clement ! CHECK-DAG: %[[xNullAddr:.*]] = fir.zero_bits !fir.heap<!fir.array<?xf32>> 9179ea355SValentin Clement ! CHECK-DAG: %[[xNullShape:.*]] = fir.shape %c0{{.*}} : (index) -> !fir.shape<1> 10179ea355SValentin Clement ! CHECK: %[[xInitEmbox:.*]] = fir.embox %[[xNullAddr]](%[[xNullShape]]) : (!fir.heap<!fir.array<?xf32>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?xf32>>> 11179ea355SValentin Clement ! CHECK: fir.store %[[xInitEmbox]] to %[[xBoxAddr]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>> 12179ea355SValentin Clement 13179ea355SValentin Clement ! CHECK: %[[yBoxAddr:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x?xf32>>> {{{.*}}uniq_name = "_QFfooEy"} 14179ea355SValentin Clement ! CHECK-DAG: %[[yNullAddr:.*]] = fir.zero_bits !fir.heap<!fir.array<?x?xf32>> 15179ea355SValentin Clement ! CHECK-DAG: %[[yNullShape:.*]] = fir.shape %c0{{.*}}, %c0{{.*}} : (index, index) -> !fir.shape<2> 16179ea355SValentin Clement ! CHECK: %[[yInitEmbox:.*]] = fir.embox %[[yNullAddr]](%[[yNullShape]]) : (!fir.heap<!fir.array<?x?xf32>>, !fir.shape<2>) -> !fir.box<!fir.heap<!fir.array<?x?xf32>>> 17179ea355SValentin Clement ! CHECK: fir.store %[[yInitEmbox]] to %[[yBoxAddr]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>> 18179ea355SValentin Clement 19179ea355SValentin Clement ! CHECK: %[[zBoxAddr:.*]] = fir.alloca !fir.box<!fir.heap<f32>> {{{.*}}uniq_name = "_QFfooEz"} 20179ea355SValentin Clement ! CHECK: %[[zNullAddr:.*]] = fir.zero_bits !fir.heap<f32> 21179ea355SValentin Clement ! CHECK: %[[zInitEmbox:.*]] = fir.embox %[[zNullAddr]] : (!fir.heap<f32>) -> !fir.box<!fir.heap<f32>> 22179ea355SValentin Clement ! CHECK: fir.store %[[zInitEmbox]] to %[[zBoxAddr]] : !fir.ref<!fir.box<!fir.heap<f32>>> 23179ea355SValentin Clement 24179ea355SValentin Clement allocate(x(42:100), y(43:50, 51), z) 25179ea355SValentin Clement ! CHECK-DAG: %[[errMsg:.*]] = fir.absent !fir.box<none> 26179ea355SValentin Clement ! CHECK-DAG: %[[xlb:.*]] = arith.constant 42 : i32 27179ea355SValentin Clement ! CHECK-DAG: %[[xub:.*]] = arith.constant 100 : i32 28179ea355SValentin Clement ! CHECK-DAG: %[[xBoxCast2:.*]] = fir.convert %[[xBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>) -> !fir.ref<!fir.box<none>> 29179ea355SValentin Clement ! CHECK-DAG: %[[xlbCast:.*]] = fir.convert %[[xlb]] : (i32) -> i64 30179ea355SValentin Clement ! CHECK-DAG: %[[xubCast:.*]] = fir.convert %[[xub]] : (i32) -> i64 31179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableSetBounds(%[[xBoxCast2]], %c0{{.*}}, %[[xlbCast]], %[[xubCast]]) : (!fir.ref<!fir.box<none>>, i32, i64, i64) -> none 32179ea355SValentin Clement ! CHECK-DAG: %[[xBoxCast3:.*]] = fir.convert %[[xBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>) -> !fir.ref<!fir.box<none>> 33179ea355SValentin Clement ! CHECK-DAG: %[[sourceFile:.*]] = fir.convert %{{.*}} -> !fir.ref<i8> 34179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableAllocate(%[[xBoxCast3]], %false{{.*}}, %[[errMsg]], %[[sourceFile]], %{{.*}}) : (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32 35179ea355SValentin Clement 36179ea355SValentin Clement ! Simply check that we are emitting the right numebr of set bound for y and z. Otherwise, this is just like x. 37179ea355SValentin Clement ! CHECK: fir.convert %[[yBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>>) -> !fir.ref<!fir.box<none>> 38179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableSetBounds 39179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableSetBounds 40179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableAllocate 41179ea355SValentin Clement ! CHECK: %[[zBoxCast:.*]] = fir.convert %[[zBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> !fir.ref<!fir.box<none>> 42179ea355SValentin Clement ! CHECK-NOT: fir.call @{{.*}}AllocatableSetBounds 43179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableAllocate 44179ea355SValentin Clement 45179ea355SValentin Clement ! Check that y descriptor is read when referencing it. 46179ea355SValentin Clement ! CHECK: %[[yBoxLoad:.*]] = fir.load %[[yBoxAddr]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>> 47179ea355SValentin Clement ! CHECK: %[[yBounds1:.*]]:3 = fir.box_dims %[[yBoxLoad]], %c0{{.*}} : (!fir.box<!fir.heap<!fir.array<?x?xf32>>>, index) -> (index, index, index) 48179ea355SValentin Clement ! CHECK: %[[yBounds2:.*]]:3 = fir.box_dims %[[yBoxLoad]], %c1{{.*}} : (!fir.box<!fir.heap<!fir.array<?x?xf32>>>, index) -> (index, index, index) 49179ea355SValentin Clement ! CHECK: %[[yAddr:.*]] = fir.box_addr %[[yBoxLoad]] : (!fir.box<!fir.heap<!fir.array<?x?xf32>>>) -> !fir.heap<!fir.array<?x?xf32>> 50179ea355SValentin Clement print *, x, y(45, 46), z 51179ea355SValentin Clement 52179ea355SValentin Clement deallocate(x, y, z) 53179ea355SValentin Clement ! CHECK: %[[xBoxCast4:.*]] = fir.convert %[[xBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>) -> !fir.ref<!fir.box<none>> 54179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableDeallocate(%[[xBoxCast4]], {{.*}}) 55179ea355SValentin Clement ! CHECK: %[[yBoxCast4:.*]] = fir.convert %[[yBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x?xf32>>>>) -> !fir.ref<!fir.box<none>> 56179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableDeallocate(%[[yBoxCast4]], {{.*}}) 57179ea355SValentin Clement ! CHECK: %[[zBoxCast4:.*]] = fir.convert %[[zBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> !fir.ref<!fir.box<none>> 58179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableDeallocate(%[[zBoxCast4]], {{.*}}) 59179ea355SValentin Clementend subroutine 60179ea355SValentin Clement 61179ea355SValentin Clement! test lowering of character allocatables 62179ea355SValentin Clement! CHECK-LABEL: _QPchar_deferred( 63179ea355SValentin Clementsubroutine char_deferred(n) 64179ea355SValentin Clement integer :: n 65179ea355SValentin Clement character(:), allocatable :: scalar, array(:) 66179ea355SValentin Clement ! CHECK-DAG: %[[sBoxAddr:.*]] = fir.alloca !fir.box<!fir.heap<!fir.char<1,?>>> {{{.*}}uniq_name = "_QFchar_deferredEscalar"} 67179ea355SValentin Clement ! CHECK-DAG: %[[sNullAddr:.*]] = fir.zero_bits !fir.heap<!fir.char<1,?>> 68179ea355SValentin Clement ! CHECK-DAG: %[[sInitBox:.*]] = fir.embox %[[sNullAddr]] typeparams %c0{{.*}} : (!fir.heap<!fir.char<1,?>>, index) -> !fir.box<!fir.heap<!fir.char<1,?>>> 69179ea355SValentin Clement ! CHECK-DAG: fir.store %[[sInitBox]] to %[[sBoxAddr]] : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>> 70179ea355SValentin Clement 71179ea355SValentin Clement ! CHECK-DAG: %[[aBoxAddr:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>> {{{.*}}uniq_name = "_QFchar_deferredEarray"} 72179ea355SValentin Clement ! CHECK-DAG: %[[aNullAddr:.*]] = fir.zero_bits !fir.heap<!fir.array<?x!fir.char<1,?>>> 73179ea355SValentin Clement ! CHECK-DAG: %[[aNullShape:.*]] = fir.shape %c0{{.*}} : (index) -> !fir.shape<1> 74179ea355SValentin Clement ! CHECK-DAG: %[[aInitBox:.*]] = fir.embox %[[aNullAddr]](%[[aNullShape]]) typeparams %c0{{.*}} : (!fir.heap<!fir.array<?x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>> 75179ea355SValentin Clement ! CHECK-DAG: fir.store %[[aInitBox]] to %[[aBoxAddr]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>> 76179ea355SValentin Clement 77179ea355SValentin Clement allocate(character(10):: scalar, array(30)) 78179ea355SValentin Clement ! CHECK-DAG: %[[sBoxCast1:.*]] = fir.convert %[[sBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>) -> !fir.ref<!fir.box<none>> 79179ea355SValentin Clement ! CHECK-DAG: %[[ten1:.*]] = fir.convert %c10{{.*}} : (i32) -> i64 80179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableInitCharacter(%[[sBoxCast1]], %[[ten1]], %c1{{.*}}, %c0{{.*}}, %c0{{.*}}) 81179ea355SValentin Clement ! CHECK-NOT: AllocatableSetBounds 82179ea355SValentin Clement ! CHECK: %[[sBoxCast2:.*]] = fir.convert %[[sBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>) -> !fir.ref<!fir.box<none>> 83179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableAllocate(%[[sBoxCast2]] 84179ea355SValentin Clement 85179ea355SValentin Clement ! CHECK-DAG: %[[aBoxCast1:.*]] = fir.convert %[[aBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>>) -> !fir.ref<!fir.box<none>> 86179ea355SValentin Clement ! CHECK-DAG: %[[ten2:.*]] = fir.convert %c10{{.*}} : (i32) -> i64 87179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableInitCharacter(%[[aBoxCast1]], %[[ten2]], %c1{{.*}}, %c1{{.*}}, %c0{{.*}}) 88179ea355SValentin Clement ! CHECK: %[[aBoxCast2:.*]] = fir.convert %[[aBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>>) -> !fir.ref<!fir.box<none>> 89179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableSetBounds(%[[aBoxCast2]] 90179ea355SValentin Clement ! CHECK: %[[aBoxCast3:.*]] = fir.convert %[[aBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>>) -> !fir.ref<!fir.box<none>> 91179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableAllocate(%[[aBoxCast3]] 92179ea355SValentin Clement 93179ea355SValentin Clement deallocate(scalar, array) 94179ea355SValentin Clement ! CHECK: %[[sBoxCast3:.*]] = fir.convert %[[sBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>) -> !fir.ref<!fir.box<none>> 95179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableDeallocate(%[[sBoxCast3]] 96179ea355SValentin Clement ! CHECK: %[[aBoxCast4:.*]] = fir.convert %[[aBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>>) -> !fir.ref<!fir.box<none>> 97179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableDeallocate(%[[aBoxCast4]] 98179ea355SValentin Clement 99179ea355SValentin Clement ! only testing that the correct length is set in the descriptor. 100179ea355SValentin Clement allocate(character(n):: scalar, array(40)) 101179ea355SValentin Clement ! CHECK: %[[n:.*]] = fir.load %arg0 : !fir.ref<i32> 102179ea355SValentin Clement ! CHECK-DAG: %[[ncast1:.*]] = fir.convert %[[n]] : (i32) -> i64 103179ea355SValentin Clement ! CHECK-DAG: %[[sBoxCast4:.*]] = fir.convert %[[sBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>>) -> !fir.ref<!fir.box<none>> 104179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableInitCharacter(%[[sBoxCast4]], %[[ncast1]], %c1{{.*}}, %c0{{.*}}, %c0{{.*}}) 105179ea355SValentin Clement ! CHECK-DAG: %[[ncast2:.*]] = fir.convert %[[n]] : (i32) -> i64 106179ea355SValentin Clement ! CHECK-DAG: %[[aBoxCast5:.*]] = fir.convert %[[aBoxAddr]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>>) -> !fir.ref<!fir.box<none>> 107179ea355SValentin Clement ! CHECK: fir.call @{{.*}}AllocatableInitCharacter(%[[aBoxCast5]], %[[ncast2]], %c1{{.*}}, %c1{{.*}}, %c0{{.*}}) 108179ea355SValentin Clementend subroutine 109179ea355SValentin Clement 110179ea355SValentin Clement! CHECK-LABEL: _QPchar_explicit_cst( 111179ea355SValentin Clementsubroutine char_explicit_cst(n) 112179ea355SValentin Clement integer :: n 113179ea355SValentin Clement character(10), allocatable :: scalar, array(:) 114179ea355SValentin Clement ! CHECK-DAG: %[[sBoxAddr:.*]] = fir.alloca !fir.box<!fir.heap<!fir.char<1,10>>> {{{.*}}uniq_name = "_QFchar_explicit_cstEscalar"} 115179ea355SValentin Clement ! CHECK-DAG: %[[sNullAddr:.*]] = fir.zero_bits !fir.heap<!fir.char<1,10>> 116179ea355SValentin Clement ! CHECK-DAG: %[[sInitBox:.*]] = fir.embox %[[sNullAddr]] : (!fir.heap<!fir.char<1,10>>) -> !fir.box<!fir.heap<!fir.char<1,10>>> 117179ea355SValentin Clement ! CHECK-DAG: fir.store %[[sInitBox]] to %[[sBoxAddr]] : !fir.ref<!fir.box<!fir.heap<!fir.char<1,10>>>> 118179ea355SValentin Clement 119179ea355SValentin Clement ! CHECK-DAG: %[[aBoxAddr:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x!fir.char<1,10>>>> {{{.*}}uniq_name = "_QFchar_explicit_cstEarray"} 120179ea355SValentin Clement ! CHECK-DAG: %[[aNullAddr:.*]] = fir.zero_bits !fir.heap<!fir.array<?x!fir.char<1,10>>> 121179ea355SValentin Clement ! CHECK-DAG: %[[aNullShape:.*]] = fir.shape %c0{{.*}} : (index) -> !fir.shape<1> 122179ea355SValentin Clement ! CHECK-DAG: %[[aInitBox:.*]] = fir.embox %[[aNullAddr]](%[[aNullShape]]) : (!fir.heap<!fir.array<?x!fir.char<1,10>>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<?x!fir.char<1,10>>>> 123179ea355SValentin Clement ! CHECK-DAG: fir.store %[[aInitBox]] to %[[aBoxAddr]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,10>>>>> 124179ea355SValentin Clement allocate(scalar, array(20)) 125179ea355SValentin Clement ! CHECK-NOT: AllocatableInitCharacter 126179ea355SValentin Clement ! CHECK: AllocatableAllocate 127179ea355SValentin Clement ! CHECK-NOT: AllocatableInitCharacter 128179ea355SValentin Clement ! CHECK: AllocatableAllocate 129179ea355SValentin Clement deallocate(scalar, array) 130179ea355SValentin Clement ! CHECK: AllocatableDeallocate 131179ea355SValentin Clement ! CHECK: AllocatableDeallocate 132179ea355SValentin Clementend subroutine 133179ea355SValentin Clement 134179ea355SValentin Clement! CHECK-LABEL: _QPchar_explicit_dyn( 135179ea355SValentin Clementsubroutine char_explicit_dyn(n, l1, l2) 136179ea355SValentin Clement integer :: n, l1, l2 137179ea355SValentin Clement character(l1), allocatable :: scalar 138*fe252f8eSValentin Clement ! CHECK: %[[sBoxAddr:.*]] = fir.alloca !fir.box<!fir.heap<!fir.char<1,?>>> {{{.*}}uniq_name = "_QFchar_explicit_dynEscalar"} 139*fe252f8eSValentin Clement ! CHECK: %[[raw_l1:.*]] = fir.load %arg1 : !fir.ref<i32> 140*fe252f8eSValentin Clement ! CHECK: %[[c0_i32:.*]] = arith.constant 0 : i32 141*fe252f8eSValentin Clement ! CHECK: %[[cmp1:.*]] = arith.cmpi sgt, %[[raw_l1]], %[[c0_i32]] : i32 142*fe252f8eSValentin Clement ! CHECK: %[[l1:.*]] = arith.select %[[cmp1]], %[[raw_l1]], %[[c0_i32]] : i32 143*fe252f8eSValentin Clement ! CHECK: %[[sNullAddr:.*]] = fir.zero_bits !fir.heap<!fir.char<1,?>> 144*fe252f8eSValentin Clement ! CHECK: %[[sInitBox:.*]] = fir.embox %[[sNullAddr]] typeparams %[[l1]] : (!fir.heap<!fir.char<1,?>>, i32) -> !fir.box<!fir.heap<!fir.char<1,?>>> 145*fe252f8eSValentin Clement ! CHECK: fir.store %[[sInitBox]] to %[[sBoxAddr]] : !fir.ref<!fir.box<!fir.heap<!fir.char<1,?>>>> 146179ea355SValentin Clement 147*fe252f8eSValentin Clement character(l2), allocatable :: zarray(:) 148*fe252f8eSValentin Clement ! CHECK: %[[aBoxAddr:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>> {{{.*}}uniq_name = "_QFchar_explicit_dynEzarray"} 149*fe252f8eSValentin Clement ! CHECK: %[[raw_l2:.*]] = fir.load %arg2 : !fir.ref<i32> 150*fe252f8eSValentin Clement ! CHECK: %[[c0_i32_2:.*]] = arith.constant 0 : i32 151*fe252f8eSValentin Clement ! CHECK: %[[cmp2:.*]] = arith.cmpi sgt, %[[raw_l2]], %[[c0_i32_2]] : i32 152*fe252f8eSValentin Clement ! CHECK: %[[l2:.*]] = arith.select %[[cmp2]], %[[raw_l2]], %[[c0_i32_2]] : i32 153*fe252f8eSValentin Clement ! CHECK: %[[aNullAddr:.*]] = fir.zero_bits !fir.heap<!fir.array<?x!fir.char<1,?>>> 154*fe252f8eSValentin Clement ! CHECK: %[[aNullShape:.*]] = fir.shape %c0{{.*}} : (index) -> !fir.shape<1> 155*fe252f8eSValentin Clement ! CHECK: %[[aInitBox:.*]] = fir.embox %[[aNullAddr]](%[[aNullShape]]) typeparams %[[l2]] : (!fir.heap<!fir.array<?x!fir.char<1,?>>>, !fir.shape<1>, i32) -> !fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>> 156*fe252f8eSValentin Clement ! CHECK: fir.store %[[aInitBox]] to %[[aBoxAddr]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?x!fir.char<1,?>>>>> 157*fe252f8eSValentin Clement allocate(scalar, zarray(20)) 158179ea355SValentin Clement ! CHECK-NOT: AllocatableInitCharacter 159179ea355SValentin Clement ! CHECK: AllocatableAllocate 160179ea355SValentin Clement ! CHECK-NOT: AllocatableInitCharacter 161179ea355SValentin Clement ! CHECK: AllocatableAllocate 162*fe252f8eSValentin Clement deallocate(scalar, zarray) 163179ea355SValentin Clement ! CHECK: AllocatableDeallocate 164179ea355SValentin Clement ! CHECK: AllocatableDeallocate 165179ea355SValentin Clementend subroutine 166