|
1 | 1 | ! Test correct deallocation of intent(out) allocatables.
|
2 |
| -! RUN: bbc -emit-fir %s -o - | FileCheck %s |
| 2 | +! RUN: bbc -emit-fir -polymorphic-type %s -o - | FileCheck %s |
3 | 3 |
|
4 | 4 | module mod1
|
5 | 5 | type, bind(c) :: t1
|
6 | 6 | integer :: i
|
7 | 7 | end type
|
8 | 8 |
|
| 9 | + type :: t |
| 10 | + integer :: a |
| 11 | + end type |
| 12 | + |
| 13 | + type, extends(t) :: t2 |
| 14 | + integer :: b |
| 15 | + end type |
| 16 | + |
9 | 17 | interface
|
10 | 18 | subroutine sub3(a) bind(c)
|
11 | 19 | integer, intent(out), allocatable :: a(:)
|
@@ -91,8 +99,14 @@ subroutine sub5(t)
|
91 | 99 |
|
92 | 100 | ! CHECK-LABEL: func.func @_QMmod1Psub5(
|
93 | 101 | ! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.type<_QMmod1Tt1{i:i32}>>>> {fir.bindc_name = "t"})
|
94 |
| -! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[ARG0]] : (!fir.ref<!fir.box<!fir.heap<!fir.type<_QMmod1Tt1{i:i32}>>>>) -> !fir.ref<!fir.box<none>> |
95 |
| -! CHECK: %{{.*}} = fir.call @_FortranAAllocatableDeallocate(%[[BOX_NONE]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32 |
| 102 | +! CHECK: %[[BOX:.*]] = fir.load %[[ARG0]] : !fir.ref<!fir.box<!fir.heap<!fir.type<_QMmod1Tt1{i:i32}>>>> |
| 103 | +! CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %[[BOX]] : (!fir.box<!fir.heap<!fir.type<_QMmod1Tt1{i:i32}>>>) -> !fir.heap<!fir.type<_QMmod1Tt1{i:i32}>> |
| 104 | +! CHECK: %[[BOX_ADDR_PTR:.*]] = fir.convert %[[BOX_ADDR]] : (!fir.heap<!fir.type<_QMmod1Tt1{i:i32}>>) -> i64 |
| 105 | +! CHECK: %[[C0:.*]] = arith.constant 0 : i64 |
| 106 | +! CHECK: %[[IS_ALLOCATED:.*]] = arith.cmpi ne, %[[BOX_ADDR_PTR]], %[[C0]] : i64 |
| 107 | +! CHECK: fir.if %[[IS_ALLOCATED]] { |
| 108 | +! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[ARG0]] : (!fir.ref<!fir.box<!fir.heap<!fir.type<_QMmod1Tt1{i:i32}>>>>) -> !fir.ref<!fir.box<none>> |
| 109 | +! CHECK: %{{.*}} = fir.call @_FortranAAllocatableDeallocate(%[[BOX_NONE]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}}: (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32 |
96 | 110 |
|
97 | 111 | subroutine sub6()
|
98 | 112 | type(t1), allocatable :: t
|
@@ -189,5 +203,37 @@ subroutine sub12(a)
|
189 | 203 | ! CHECK: fir.store %[[EMBOX]] to %[[ARG0]] : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>
|
190 | 204 |
|
191 | 205 |
|
| 206 | + subroutine sub14(p) |
| 207 | + class(t), intent(out), allocatable :: p |
| 208 | + end subroutine |
| 209 | + |
| 210 | +! CHECK-LABEL: func.func @_QMmod1Psub14( |
| 211 | +! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.class<!fir.heap<!fir.type<_QMmod1Tt{a:i32}>>>> {fir.bindc_name = "p"}) { |
| 212 | +! CHECK: %[[BOX:.*]] = fir.load %[[ARG0]] : !fir.ref<!fir.class<!fir.heap<!fir.type<_QMmod1Tt{a:i32}>>>> |
| 213 | +! CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %[[BOX]] : (!fir.class<!fir.heap<!fir.type<_QMmod1Tt{a:i32}>>>) -> !fir.heap<!fir.type<_QMmod1Tt{a:i32}>> |
| 214 | +! CHECK: %[[BOX_ADDR_PTR:.*]] = fir.convert %[[BOX_ADDR]] : (!fir.heap<!fir.type<_QMmod1Tt{a:i32}>>) -> i64 |
| 215 | +! CHECK: %[[C0:.*]] = arith.constant 0 : i64 |
| 216 | +! CHECK: %[[IS_ALLOCATED:.*]] = arith.cmpi ne, %[[BOX_ADDR_PTR]], %[[C0]] : i64 |
| 217 | +! CHECK: fir.if %[[IS_ALLOCATED]] { |
| 218 | +! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[ARG0]] : (!fir.ref<!fir.class<!fir.heap<!fir.type<_QMmod1Tt{a:i32}>>>>) -> !fir.ref<!fir.box<none>> |
| 219 | +! CHECK: %{{.*}} = fir.call @_FortranAAllocatableDeallocate(%[[BOX_NONE]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}} : (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32 |
| 220 | +! CHECK: } |
| 221 | + |
| 222 | + subroutine sub15(p) |
| 223 | + class(*), intent(out), allocatable :: p |
| 224 | + end subroutine |
| 225 | + |
| 226 | +! CHECK-LABEL: func.func @_QMmod1Psub15( |
| 227 | +! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.class<!fir.heap<none>>> {fir.bindc_name = "p"}) { |
| 228 | +! CHECK: %[[BOX:.*]] = fir.load %[[ARG0]] : !fir.ref<!fir.class<!fir.heap<none>>> |
| 229 | +! CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %[[BOX]] : (!fir.class<!fir.heap<none>>) -> !fir.heap<none> |
| 230 | +! CHECK: %[[BOX_ADDR_PTR:.*]] = fir.convert %[[BOX_ADDR]] : (!fir.heap<none>) -> i64 |
| 231 | +! CHECK: %[[C0:.*]] = arith.constant 0 : i64 |
| 232 | +! CHECK: %[[IS_ALLOCATED:.*]] = arith.cmpi ne, %[[BOX_ADDR_PTR]], %[[C0]] : i64 |
| 233 | +! CHECK: fir.if %[[IS_ALLOCATED]] { |
| 234 | +! CHECK: %[[BOX_NONE:.*]] = fir.convert %[[ARG0]] : (!fir.ref<!fir.class<!fir.heap<none>>>) -> !fir.ref<!fir.box<none>> |
| 235 | +! CHECK: %{{.*}} = fir.call @_FortranAAllocatableDeallocate(%[[BOX_NONE]], %{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {{.*}} : (!fir.ref<!fir.box<none>>, i1, !fir.box<none>, !fir.ref<i8>, i32) -> i32 |
| 236 | +! CHECK: } |
| 237 | + |
192 | 238 | end module
|
193 | 239 |
|
0 commit comments