// Test buffer destruction for hlfir.destroy operations with // operands of derived types. // RUN: fir-opt --bufferize-hlfir %s | FileCheck %s func.func @_QPtest1(%arg0: !fir.box>}>>> {fir.bindc_name = "x"}) { %c0 = arith.constant 0 : index %0 = fir.alloca !fir.type<_QMtypesTt1{x:!fir.box>}> {bindc_name = ".result"} %1:2 = hlfir.declare %arg0 {uniq_name = "_QFtest1Ex"} : (!fir.box>}>>>) -> (!fir.box>}>>>, !fir.box>}>>>) %2:3 = fir.box_dims %1#0, %c0 : (!fir.box>}>>>, index) -> (index, index, index) %3 = fir.shape %2#1 : (index) -> !fir.shape<1> %4 = hlfir.elemental %3 unordered : (!fir.shape<1>) -> !hlfir.expr>}>> { ^bb0(%arg1: index): %5 = hlfir.designate %1#0 (%arg1) : (!fir.box>}>>>, index) -> !fir.ref>}>> %6 = fir.call @_QPelem1(%5) fastmath : (!fir.ref>}>>) -> !fir.type<_QMtypesTt1{x:!fir.box>}> fir.save_result %6 to %0 : !fir.type<_QMtypesTt1{x:!fir.box>}>, !fir.ref>}>> %7:2 = hlfir.declare %0 {uniq_name = ".tmp.func_result"} : (!fir.ref>}>>) -> (!fir.ref>}>>, !fir.ref>}>>) hlfir.yield_element %7#0 : !fir.ref>}>> } hlfir.assign %4 to %1#0 : !hlfir.expr>}>>, !fir.box>}>>> hlfir.destroy %4 : !hlfir.expr>}>> return } // CHECK-LABEL: func.func @_QPtest1( // CHECK: hlfir.assign %{{.*}} to %{{.*}} temporary_lhs : !fir.ref>}>>, !fir.ref>}>> // CHECK: hlfir.assign %[[VAL_7:.*]]#0 to %{{.*}}#0 : !fir.box>}>>>, !fir.box>}>>> // CHECK-NEXT: %[[VAL_18:.*]] = fir.box_addr %[[VAL_7]]#0 : (!fir.box>}>>>) -> !fir.heap>}>>> // CHECK-NEXT: %[[VAL_19:.*]] = fir.convert %[[VAL_7]]#0 : (!fir.box>}>>>) -> !fir.box // CHECK-NEXT: %[[VAL_20:.*]] = fir.call @_FortranADestroyWithoutFinalization(%[[VAL_19]]) : (!fir.box) -> none // CHECK-NEXT: fir.freemem %[[VAL_18]] : !fir.heap>}>>> // CHECK-NEXT: return // CHECK-NEXT: } func.func @_QPtest2(%arg0: !fir.box>}>>> {fir.bindc_name = "x"}) { %c0 = arith.constant 0 : index %0 = fir.alloca !fir.type<_QMtypesTt2{x:!fir.box>}> {bindc_name = ".result"} %1:2 = hlfir.declare %arg0 {uniq_name = "_QFtest2Ex"} : (!fir.box>}>>>) -> (!fir.box>}>>>, !fir.box>}>>>) %2:3 = fir.box_dims %1#0, %c0 : (!fir.box>}>>>, index) -> (index, index, index) %3 = fir.shape %2#1 : (index) -> !fir.shape<1> %4 = hlfir.elemental %3 unordered : (!fir.shape<1>) -> !hlfir.expr>}>> { ^bb0(%arg1: index): %5 = hlfir.designate %1#0 (%arg1) : (!fir.box>}>>>, index) -> !fir.ref>}>> %6 = fir.call @_QPelem2(%5) fastmath : (!fir.ref>}>>) -> !fir.type<_QMtypesTt2{x:!fir.box>}> fir.save_result %6 to %0 : !fir.type<_QMtypesTt2{x:!fir.box>}>, !fir.ref>}>> %7:2 = hlfir.declare %0 {uniq_name = ".tmp.func_result"} : (!fir.ref>}>>) -> (!fir.ref>}>>, !fir.ref>}>>) hlfir.yield_element %7#0 : !fir.ref>}>> } hlfir.assign %4 to %1#0 : !hlfir.expr>}>>, !fir.box>}>>> hlfir.destroy %4 finalize : !hlfir.expr>}>> return } // CHECK-LABEL: func.func @_QPtest2( // CHECK: hlfir.assign %{{.*}}#0 to %{{.*}} temporary_lhs : !fir.ref>}>>, !fir.ref>}>> // CHECK: hlfir.assign %[[VAL_7:.*]]#0 to %{{.*}}#0 : !fir.box>}>>>, !fir.box>}>>> // CHECK-NEXT: %[[VAL_18:.*]] = fir.box_addr %[[VAL_7]]#0 : (!fir.box>}>>>) -> !fir.heap>}>>> // CHECK-NEXT: %[[VAL_19:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref> // CHECK-NEXT: %[[VAL_20:.*]] = arith.constant {{[0-9]*}} : index // CHECK-NEXT: %[[VAL_21:.*]] = arith.constant {{[0-9]*}} : i32 // CHECK-NEXT: %[[VAL_22:.*]] = fir.convert %[[VAL_7]]#0 : (!fir.box>}>>>) -> !fir.box // CHECK-NEXT: %[[VAL_23:.*]] = fir.convert %[[VAL_19]] : (!fir.ref>) -> !fir.ref // CHECK-NEXT: %[[VAL_24:.*]] = fir.call @_FortranAFinalize(%[[VAL_22]], %[[VAL_23]], %[[VAL_21]]) : (!fir.box, !fir.ref, i32) -> none // CHECK-NEXT: %[[VAL_25:.*]] = fir.convert %[[VAL_7]]#0 : (!fir.box>}>>>) -> !fir.box // CHECK-NEXT: %[[VAL_26:.*]] = fir.call @_FortranADestroyWithoutFinalization(%[[VAL_25]]) : (!fir.box) -> none // CHECK-NEXT: fir.freemem %[[VAL_18]] : !fir.heap>}>>> // CHECK-NEXT: return // CHECK-NEXT: } func.func @_QPtest3(%arg0: !fir.box>> {fir.bindc_name = "x"}) { %c0 = arith.constant 0 : index %0 = fir.alloca !fir.type<_QMtypesTt3{x:f32}> {bindc_name = ".result"} %1:2 = hlfir.declare %arg0 {uniq_name = "_QFtest3Ex"} : (!fir.box>>) -> (!fir.box>>, !fir.box>>) %2:3 = fir.box_dims %1#0, %c0 : (!fir.box>>, index) -> (index, index, index) %3 = fir.shape %2#1 : (index) -> !fir.shape<1> %4 = hlfir.elemental %3 unordered : (!fir.shape<1>) -> !hlfir.expr> { ^bb0(%arg1: index): %5 = hlfir.designate %1#0 (%arg1) : (!fir.box>>, index) -> !fir.ref> %6 = fir.call @_QPelem3(%5) fastmath : (!fir.ref>) -> !fir.type<_QMtypesTt3{x:f32}> fir.save_result %6 to %0 : !fir.type<_QMtypesTt3{x:f32}>, !fir.ref> %7:2 = hlfir.declare %0 {uniq_name = ".tmp.func_result"} : (!fir.ref>) -> (!fir.ref>, !fir.ref>) hlfir.yield_element %7#0 : !fir.ref> } hlfir.assign %4 to %1#0 : !hlfir.expr>, !fir.box>> hlfir.destroy %4 finalize : !hlfir.expr> return } // CHECK-LABEL: func.func @_QPtest3( // CHECK: hlfir.assign %{{.*}}#0 to %{{.*}} temporary_lhs : !fir.ref>, !fir.ref> // CHECK: hlfir.assign %[[VAL_7:.*]]#0 to %{{.*}}#0 : !fir.box>>, !fir.box>> // CHECK-NEXT: %[[VAL_18:.*]] = fir.box_addr %[[VAL_7]]#0 : (!fir.box>>) -> !fir.heap>> // CHECK-NEXT: %[[VAL_19:.*]] = fir.address_of(@_QQclX{{.*}}) : !fir.ref> // CHECK-NEXT: %[[VAL_20:.*]] = arith.constant {{[0-9]*}} : index // CHECK-NEXT: %[[VAL_21:.*]] = arith.constant {{[0-9]*}} : i32 // CHECK-NEXT: %[[VAL_22:.*]] = fir.convert %[[VAL_7]]#0 : (!fir.box>>) -> !fir.box // CHECK-NEXT: %[[VAL_23:.*]] = fir.convert %[[VAL_19]] : (!fir.ref>) -> !fir.ref // CHECK-NEXT: %[[VAL_24:.*]] = fir.call @_FortranAFinalize(%[[VAL_22]], %[[VAL_23]], %[[VAL_21]]) : (!fir.box, !fir.ref, i32) -> none // CHECK-NEXT: fir.freemem %[[VAL_18]] : !fir.heap>> // CHECK-NEXT: return // CHECK-NEXT: }