|  | ! Test lowering of derived type dummy arguments | 
|  | ! RUN: bbc -emit-fir %s -o - | FileCheck %s | 
|  | module type_defs | 
|  | type simple_type | 
|  | integer :: i | 
|  | end type | 
|  | type with_kind(k) | 
|  | integer, kind :: k | 
|  | real(k) :: x | 
|  | end type | 
|  | end module | 
|  |  | 
|  | ! ----------------------------------------------------------------------------- | 
|  | !     Test passing of derived type arguments that do not require a | 
|  | !     fir.box (runtime descriptor). | 
|  | ! ----------------------------------------------------------------------------- | 
|  |  | 
|  | ! Test simple type scalar with no attribute. | 
|  | ! CHECK-LABEL: func @_QPtest1( | 
|  | ! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.type<_QMtype_defsTsimple_type{i:i32}>> {fir.bindc_name = "a"}) { | 
|  | subroutine test1(a) | 
|  | use type_defs | 
|  | type(simple_type) :: a | 
|  | end subroutine | 
|  |  | 
|  | ! Test simple type explicit array with no attribute. | 
|  | ! CHECK-LABEL: func @_QPtest2( | 
|  | ! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMtype_defsTsimple_type{i:i32}>>> {fir.bindc_name = "a"}) { | 
|  | subroutine test2(a) | 
|  | use type_defs | 
|  | type(simple_type) :: a(100) | 
|  | end subroutine | 
|  |  | 
|  | ! Test simple type scalar with TARGET attribute. | 
|  | ! CHECK-LABEL: func @_QPtest3( | 
|  | ! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.type<_QMtype_defsTsimple_type{i:i32}>> {fir.bindc_name = "a", fir.target}) { | 
|  | subroutine test3(a) | 
|  | use type_defs | 
|  | type(simple_type), target :: a | 
|  | end subroutine | 
|  |  | 
|  | ! Test simple type explicit array with TARGET attribute. | 
|  | ! CHECK-LABEL: func @_QPtest4( | 
|  | ! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMtype_defsTsimple_type{i:i32}>>> {fir.bindc_name = "a", fir.target}) { | 
|  | subroutine test4(a) | 
|  | use type_defs | 
|  | type(simple_type), target :: a(100) | 
|  | end subroutine | 
|  |  | 
|  | ! Test kind parametrized derived type scalar with no attribute. | 
|  | ! CHECK-LABEL: func @_QPtest1k( | 
|  | ! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.type<_QMtype_defsTwith_kindK4{x:f32}>> {fir.bindc_name = "a"}) { | 
|  | subroutine test1k(a) | 
|  | use type_defs | 
|  | type(with_kind(4)) :: a | 
|  | end subroutine | 
|  |  | 
|  | ! Test kind parametrized derived type explicit array with no attribute. | 
|  | ! CHECK-LABEL: func @_QPtest2k( | 
|  | ! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMtype_defsTwith_kindK4{x:f32}>>> {fir.bindc_name = "a"}) { | 
|  | subroutine test2k(a) | 
|  | use type_defs | 
|  | type(with_kind(4)) :: a(100) | 
|  | end subroutine | 
|  |  | 
|  | ! Test kind parametrized derived type scalar with TARGET attribute. | 
|  | ! CHECK-LABEL: func @_QPtest3k( | 
|  | ! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.type<_QMtype_defsTwith_kindK4{x:f32}>> {fir.bindc_name = "a", fir.target}) { | 
|  | subroutine test3k(a) | 
|  | use type_defs | 
|  | type(with_kind(4)), target :: a | 
|  | end subroutine | 
|  |  | 
|  | ! Test kind parametrized derived type explicit array with TARGET attribute. | 
|  | ! CHECK-LABEL: func @_QPtest4k( | 
|  | ! CHECK-SAME:  %[[VAL_0:.*]]: !fir.ref<!fir.array<100x!fir.type<_QMtype_defsTwith_kindK4{x:f32}>>> {fir.bindc_name = "a", fir.target}) { | 
|  | subroutine test4k(a) | 
|  | use type_defs | 
|  | type(with_kind(4)), target :: a(100) | 
|  | end subroutine | 
|  |  | 
|  | ! ----------------------------------------------------------------------------- | 
|  | !     Test passing of derived type arguments that require a fir.box (runtime descriptor). | 
|  | ! ----------------------------------------------------------------------------- | 
|  |  | 
|  | ! Test simple type assumed shape array with no attribute. | 
|  | ! CHECK-LABEL: func @_QPtest5( | 
|  | ! CHECK-SAME:  %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMtype_defsTsimple_type{i:i32}>>> {fir.bindc_name = "a"}) { | 
|  | subroutine test5(a) | 
|  | use type_defs | 
|  | type(simple_type) :: a(:) | 
|  | end subroutine | 
|  |  | 
|  | ! Test simple type assumed shape array with TARGET attribute. | 
|  | ! CHECK-LABEL: func @_QPtest6( | 
|  | ! CHECK-SAME:  %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMtype_defsTsimple_type{i:i32}>>> {fir.bindc_name = "a", fir.target}) { | 
|  | subroutine test6(a) | 
|  | use type_defs | 
|  | type(simple_type), target :: a(:) | 
|  | end subroutine | 
|  |  | 
|  | ! Test kind parametrized derived type assumed shape array with no attribute. | 
|  | ! CHECK-LABEL: func @_QPtest5k( | 
|  | ! CHECK-SAME:  %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMtype_defsTwith_kindK4{x:f32}>>> {fir.bindc_name = "a"}) { | 
|  | subroutine test5k(a) | 
|  | use type_defs | 
|  | type(with_kind(4)) :: a(:) | 
|  | end subroutine | 
|  |  | 
|  | ! Test kind parametrized derived type assumed shape array with TARGET attribute. | 
|  | ! CHECK-LABEL: func @_QPtest6k( | 
|  | ! CHECK-SAME:  %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMtype_defsTwith_kindK4{x:f32}>>> {fir.bindc_name = "a", fir.target}) { | 
|  | subroutine test6k(a) | 
|  | use type_defs | 
|  | type(with_kind(4)), target :: a(:) | 
|  | end subroutine |