llvm-project/flang/test/Lower/dummy-argument-derived.f90
Jean Perier 3d63d2111c [flang] Do not pass derived type by descriptor when not needed
A missing "!" in the call interface lowering caused all derived type
arguments without length parameters that require and explicit interface
to be passed via fir.box (runtime descriptor).

This was not the intent: there is no point passing a simple derived type
scalars or explicit shapes by descriptor just because they have an attribute
like TARGET. This would actually be problematic with existing code that is
not always 100% compliant: some code implicitly calls procedures with
TARGET dummy attributes (this is not something a compiler can enforce
if the call and procedure definition are not in the same file).

Add a Scope::IsDerivedTypeWithLengthParameter to avoid passing derived
types with only kind parameters by descriptor. There is no point, the
callee knows about the kind parameter values.

Differential Revision: https://reviews.llvm.org/D123990
2022-04-20 10:00:34 +02:00

117 lines
4.3 KiB
Fortran

! 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