1bc991d94SJean Perier! Test lowering of derived type array constructors to HLFIR. 2d0829fbdSjeanPerier! RUN: bbc -emit-hlfir -o - %s | FileCheck %s 3bc991d94SJean Perier 4bc991d94SJean Periermodule types 5bc991d94SJean Perier type simple 6bc991d94SJean Perier integer :: i 7bc991d94SJean Perier integer :: j 8bc991d94SJean Perier end type 9bc991d94SJean Perierend module 10bc991d94SJean Periermodule derivedarrayctor 11bc991d94SJean Perier use types 12bc991d94SJean Periercontains 13bc991d94SJean Perier subroutine test_simple(s1, s2) 14bc991d94SJean Perier type(simple) :: s1, s2 15bc991d94SJean Perier call takes_simple([s1, s2]) 16bc991d94SJean Perier end subroutine 17bc991d94SJean Perier! CHECK-LABEL: func.func @_QMderivedarrayctorPtest_simple( 18bc991d94SJean Perier! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.array<10xi64> {bindc_name = ".rt.arrayctor.vector"} 19bc991d94SJean Perier! CHECK: %[[VAL_3:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>> {bindc_name = ".tmp.arrayctor"} 20bc991d94SJean Perier! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %{{.*}}Es1" 21bc991d94SJean Perier! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %{{.*}}Es2" 22bc991d94SJean Perier! CHECK: %[[VAL_6:.*]] = arith.constant 2 : index 23bc991d94SJean Perier! CHECK: %[[VAL_7:.*]] = fir.allocmem !fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>> {bindc_name = ".tmp.arrayctor", uniq_name = ""} 24bc991d94SJean Perier! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1> 25bc991d94SJean Perier! CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_7]](%[[VAL_8]]) {uniq_name = ".tmp.arrayctor"} : (!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>, !fir.shape<1>) -> (!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>, !fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>) 26bc991d94SJean Perier! CHECK: %[[VAL_10:.*]] = fir.embox %[[VAL_9]]#1(%[[VAL_8]]) : (!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>> 27bc991d94SJean Perier! CHECK: fir.store %[[VAL_10]] to %[[VAL_3]] : !fir.ref<!fir.box<!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>>> 28bc991d94SJean Perier! CHECK: %[[VAL_11:.*]] = arith.constant false 29bc991d94SJean Perier! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<10xi64>>) -> !fir.llvm_ptr<i8> 30bc991d94SJean Perier! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_3]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>>>) -> !fir.ref<!fir.box<none>> 31*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK: fir.call @_FortranAInitArrayConstructorVector(%[[VAL_12]], %[[VAL_16]], %[[VAL_11]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, !fir.ref<i8>, i32) -> () 32bc991d94SJean Perier! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_4]]#1 : (!fir.ref<!fir.type<_QMtypesTsimple{i:i32,j:i32}>>) -> !fir.llvm_ptr<i8> 33*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK: fir.call @_FortranAPushArrayConstructorSimpleScalar(%[[VAL_12]], %[[VAL_19]]) {{.*}}: (!fir.llvm_ptr<i8>, !fir.llvm_ptr<i8>) -> () 34bc991d94SJean Perier! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_5]]#1 : (!fir.ref<!fir.type<_QMtypesTsimple{i:i32,j:i32}>>) -> !fir.llvm_ptr<i8> 35*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK: fir.call @_FortranAPushArrayConstructorSimpleScalar(%[[VAL_12]], %[[VAL_21]]) {{.*}}: (!fir.llvm_ptr<i8>, !fir.llvm_ptr<i8>) -> () 36bc991d94SJean Perier! CHECK: %[[VAL_23:.*]] = arith.constant true 37bc991d94SJean Perier! CHECK: %[[VAL_24:.*]] = hlfir.as_expr %[[VAL_9]]#0 move %[[VAL_23]] : (!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>, i1) -> !hlfir.expr<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>> 38bc991d94SJean Perier! CHECK: fir.call @_QMderivedarrayctorPtakes_simple 39bc991d94SJean Perier! CHECK: hlfir.destroy %[[VAL_24]] : !hlfir.expr<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>> 40bc991d94SJean Perier 41bc991d94SJean Perier subroutine test_with_polymorphic(s1, s2) 42bc991d94SJean Perier class(simple) :: s1, s2 43bc991d94SJean Perier call takes_simple([s1, s2]) 44bc991d94SJean Perier end subroutine 45bc991d94SJean Perier! CHECK-LABEL: func.func @_QMderivedarrayctorPtest_with_polymorphic( 46bc991d94SJean Perier! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.array<10xi64> {bindc_name = ".rt.arrayctor.vector"} 47bc991d94SJean Perier! CHECK: %[[VAL_3:.*]] = fir.alloca !fir.box<!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>> {bindc_name = ".tmp.arrayctor"} 48bc991d94SJean Perier! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %{{.*}}Es1" 49bc991d94SJean Perier! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %{{.*}}Es2" 50bc991d94SJean Perier! CHECK: %[[VAL_6:.*]] = arith.constant 2 : index 51bc991d94SJean Perier! CHECK: %[[VAL_7:.*]] = fir.allocmem !fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>> {bindc_name = ".tmp.arrayctor", uniq_name = ""} 52bc991d94SJean Perier! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1> 53bc991d94SJean Perier! CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_7]](%[[VAL_8]]) {uniq_name = ".tmp.arrayctor"} : (!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>, !fir.shape<1>) -> (!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>, !fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>) 54bc991d94SJean Perier! CHECK: %[[VAL_10:.*]] = fir.embox %[[VAL_9]]#1(%[[VAL_8]]) : (!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>, !fir.shape<1>) -> !fir.box<!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>> 55bc991d94SJean Perier! CHECK: fir.store %[[VAL_10]] to %[[VAL_3]] : !fir.ref<!fir.box<!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>>> 56bc991d94SJean Perier! CHECK: %[[VAL_11:.*]] = arith.constant false 57bc991d94SJean Perier! CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_2]] : (!fir.ref<!fir.array<10xi64>>) -> !fir.llvm_ptr<i8> 58bc991d94SJean Perier! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_3]] : (!fir.ref<!fir.box<!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>>>) -> !fir.ref<!fir.box<none>> 59*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK: fir.call @_FortranAInitArrayConstructorVector(%[[VAL_12]], %[[VAL_16]], %[[VAL_11]], %{{.*}}, %{{.*}}) {{.*}}: (!fir.llvm_ptr<i8>, !fir.ref<!fir.box<none>>, i1, !fir.ref<i8>, i32) -> () 60bc991d94SJean Perier! CHECK: %[[VAL_19A:.*]] = fir.box_addr %[[VAL_4]]#1 : (!fir.class<!fir.type<_QMtypesTsimple{i:i32,j:i32}>>) -> !fir.ref<!fir.type<_QMtypesTsimple{i:i32,j:i32}>> 61bc991d94SJean Perier! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_19A]] : (!fir.ref<!fir.type<_QMtypesTsimple{i:i32,j:i32}>>) -> !fir.llvm_ptr<i8> 62*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK: fir.call @_FortranAPushArrayConstructorSimpleScalar(%[[VAL_12]], %[[VAL_19]]) {{.*}}: (!fir.llvm_ptr<i8>, !fir.llvm_ptr<i8>) -> () 63bc991d94SJean Perier! CHECK: %[[VAL_21A:.*]] = fir.box_addr %[[VAL_5]]#1 : (!fir.class<!fir.type<_QMtypesTsimple{i:i32,j:i32}>>) -> !fir.ref<!fir.type<_QMtypesTsimple{i:i32,j:i32}>> 64bc991d94SJean Perier! CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_21A]] : (!fir.ref<!fir.type<_QMtypesTsimple{i:i32,j:i32}>>) -> !fir.llvm_ptr<i8> 65*12ba74e1SValentin Clement (バレンタイン クレメン)! CHECK: fir.call @_FortranAPushArrayConstructorSimpleScalar(%[[VAL_12]], %[[VAL_21]]) {{.*}}: (!fir.llvm_ptr<i8>, !fir.llvm_ptr<i8>) -> () 66bc991d94SJean Perier! CHECK: %[[VAL_23:.*]] = arith.constant true 67bc991d94SJean Perier! CHECK: %[[VAL_24:.*]] = hlfir.as_expr %[[VAL_9]]#0 move %[[VAL_23]] : (!fir.heap<!fir.array<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>>>, i1) -> !hlfir.expr<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>> 68bc991d94SJean Perier! CHECK: fir.call @_QMderivedarrayctorPtakes_simple 69bc991d94SJean Perier! CHECK: hlfir.destroy %[[VAL_24]] : !hlfir.expr<2x!fir.type<_QMtypesTsimple{i:i32,j:i32}>> 70bc991d94SJean Perier 71bc991d94SJean Perier subroutine takes_simple(s) 72bc991d94SJean Perier type(simple) :: s(:) 73bc991d94SJean Perier print *, "got :", s 74bc991d94SJean Perier end subroutine 75bc991d94SJean Perierend module 76bc991d94SJean Perier 77bc991d94SJean Perier use derivedarrayctor 78bc991d94SJean Perier type(simple) :: s1, s2 79bc991d94SJean Perier s1%i = 1 80bc991d94SJean Perier s1%j = 2 81bc991d94SJean Perier s2%i = 3 82bc991d94SJean Perier s2%j = 4 83bc991d94SJean Perier 84bc991d94SJean Perier print *, "expect: 1 2 3 4" 85bc991d94SJean Perier call test_simple(s1, s2) 86bc991d94SJean Perier print *, "expect: 1 2 3 4" 87bc991d94SJean Perier call test_with_polymorphic(s1, s2) 88bc991d94SJean Perierend 89