!RUN: %flang_fc1 -fdebug-dump-symbols %s | FileCheck %s module m type pdt1(k1,l1) integer, kind :: k1 integer, len :: l1 type(pdt2(k1,l1)), allocatable :: a1 end type pdt1 type pdt2(k2,l2) integer, kind :: k2 integer, len :: l2 integer(k2) :: j2 type(pdt1(k2,l2)) :: a2(k2) end type pdt2 interface module function mf(n,str,x1) result(res) integer, intent(in) :: n character(n), intent(in) :: str type(pdt1(1,n)), intent(in) :: x1 type(pdt2(2,n)) :: res end function module subroutine ms(f) procedure(mf) :: f end subroutine end interface integer sm end module !CHECK: mf, MODULE, PUBLIC (Function): Subprogram isInterface result:TYPE(pdt2(k2=2_4,l2=n)) res (INTEGER(4) n,CHARACTER(n,1) str,TYPE(pdt1(k1=1_4,l1=n)) x1) !CHECK: pdt1, PUBLIC: DerivedType components: a1 !CHECK: pdt2, PUBLIC: DerivedType components: j2,a2 !CHECK: sm, PUBLIC size=4 offset=0: ObjectEntity type: INTEGER(4) !CHECK: DerivedType scope: pdt1 !CHECK: a1, ALLOCATABLE: ObjectEntity type: TYPE(pdt2(int(k1,kind=4),int(l1,kind=4))) !CHECK: k1: TypeParam type:INTEGER(4) Kind !CHECK: l1: TypeParam type:INTEGER(4) Len !CHECK: DerivedType scope: pdt2 !CHECK: a2: ObjectEntity type: TYPE(pdt1(k1=int(k2,kind=4),l1=int(l2,kind=4))) shape: 1_8:k2 !CHECK: j2: ObjectEntity type: INTEGER(int(int(k2,kind=4),kind=8)) !CHECK: k2: TypeParam type:INTEGER(4) Kind !CHECK: l2: TypeParam type:INTEGER(4) Len !CHECK: Subprogram scope: mf size=112 alignment=8 !CHECK: mf (Function): HostAssoc !CHECK: n, INTENT(IN) size=4 offset=0: ObjectEntity dummy type: INTEGER(4) !CHECK: res size=40 offset=72: ObjectEntity funcResult type: TYPE(pdt2(k2=2_4,l2=n)) !CHECK: str, INTENT(IN) size=24 offset=8: ObjectEntity dummy type: CHARACTER(n,1) !CHECK: x1, INTENT(IN) size=40 offset=32: ObjectEntity dummy type: TYPE(pdt1(k1=1_4,l1=n)) !CHECK: DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=1_4,l1=n) !CHECK: a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=1_4,l2=int(l1,kind=4))) !CHECK: k1: TypeParam type:INTEGER(4) Kind init:1_4 !CHECK: l1: TypeParam type:INTEGER(4) Len init:n !CHECK: DerivedType scope: size=72 alignment=8 instantiation of pdt2(k2=1_4,l2=int(l1,kind=4)) !CHECK: a2 size=64 offset=8: ObjectEntity type: TYPE(pdt1(k1=1_4,l1=int(l2,kind=4))) shape: 1_8:1_8 !CHECK: j2 size=1 offset=0: ObjectEntity type: INTEGER(1) !CHECK: k2: TypeParam type:INTEGER(4) Kind init:1_4 !CHECK: l2: TypeParam type:INTEGER(4) Len init:int(l1,kind=4) !CHECK: DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=1_4,l1=int(l2,kind=4)) !CHECK: a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=1_4,l2=int(l1,kind=4))) !CHECK: k1: TypeParam type:INTEGER(4) Kind init:1_4 !CHECK: l1: TypeParam type:INTEGER(4) Len init:int(l2,kind=4) !CHECK: DerivedType scope: size=72 alignment=8 instantiation of pdt2(k2=2_4,l2=n) !CHECK: a2 size=64 offset=8: ObjectEntity type: TYPE(pdt1(k1=2_4,l1=int(l2,kind=4))) shape: 1_8:2_8 !CHECK: j2 size=2 offset=0: ObjectEntity type: INTEGER(2) !CHECK: k2: TypeParam type:INTEGER(4) Kind init:2_4 !CHECK: l2: TypeParam type:INTEGER(4) Len init:n !CHECK: DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=2_4,l1=int(l2,kind=4)) !CHECK: a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=2_4,l2=int(l1,kind=4))) !CHECK: k1: TypeParam type:INTEGER(4) Kind init:2_4 !CHECK: l1: TypeParam type:INTEGER(4) Len init:int(l2,kind=4) !CHECK: DerivedType scope: size=72 alignment=8 instantiation of pdt2(k2=2_4,l2=int(l1,kind=4)) !CHECK: a2 size=64 offset=8: ObjectEntity type: TYPE(pdt1(k1=2_4,l1=int(l2,kind=4))) shape: 1_8:2_8 !CHECK: j2 size=2 offset=0: ObjectEntity type: INTEGER(2) !CHECK: k2: TypeParam type:INTEGER(4) Kind init:2_4 !CHECK: l2: TypeParam type:INTEGER(4) Len init:int(l1,kind=4) submodule(m) sm contains module procedure mf print *, len(str), x1%k1, x1%l1, res%k2, res%l2 allocate(res%a2(1)%a1) res%a2(1)%a1%j2 = 2 end procedure module procedure ms ! type(pdt2(2.3)) x ! x = f(3, "abc", pdt1(1,3)()) end procedure end submodule !CHECK: Module scope: sm size=0 alignment=1 !CHECK: mf, MODULE, PUBLIC (Function): Subprogram result:TYPE(pdt2(k2=2_4,l2=n)) res (INTEGER(4) n,CHARACTER(n,1) str,TYPE(pdt1(k1=1_4,l1=n)) x1) moduleInterface: mf, MODULE, PUBLIC (Function): Subprogram isInterface result:TYPE(pdt2(k2=2_4,l2=n)) res (INTEGER(4) n,CHARACTER(n,1) str,TYPE(pdt1(k1=1_4,l1=n)) x1) !CHECK: Subprogram scope: mf size=112 alignment=8 !CHECK: len, INTRINSIC, PURE (Function): ProcEntity !CHECK: n, INTENT(IN) size=4 offset=0: ObjectEntity dummy type: INTEGER(4) !CHECK: res size=40 offset=72: ObjectEntity funcResult type: TYPE(pdt2(k2=2_4,l2=n)) !CHECK: str, INTENT(IN) size=24 offset=8: ObjectEntity dummy type: CHARACTER(n,1) !CHECK: x1, INTENT(IN) size=40 offset=32: ObjectEntity dummy type: TYPE(pdt1(k1=1_4,l1=n)) !CHECK: DerivedType scope: size=72 alignment=8 instantiation of pdt2(k2=2_4,l2=n) !CHECK: a2 size=64 offset=8: ObjectEntity type: TYPE(pdt1(k1=2_4,l1=int(l2,kind=4))) shape: 1_8:2_8 !CHECK: j2 size=2 offset=0: ObjectEntity type: INTEGER(2) !CHECK: k2: TypeParam type:INTEGER(4) Kind init:2_4 !CHECK: l2: TypeParam type:INTEGER(4) Len init:n !CHECK: DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=2_4,l1=int(l2,kind=4)) !CHECK: a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=2_4,l2=int(l1,kind=4))) !CHECK: k1: TypeParam type:INTEGER(4) Kind init:2_4 !CHECK: l1: TypeParam type:INTEGER(4) Len init:int(l2,kind=4) !CHECK: DerivedType scope: size=72 alignment=8 instantiation of pdt2(k2=2_4,l2=int(l1,kind=4)) !CHECK: a2 size=64 offset=8: ObjectEntity type: TYPE(pdt1(k1=2_4,l1=int(l2,kind=4))) shape: 1_8:2_8 !CHECK: j2 size=2 offset=0: ObjectEntity type: INTEGER(2) !CHECK: k2: TypeParam type:INTEGER(4) Kind init:2_4 !CHECK: l2: TypeParam type:INTEGER(4) Len init:int(l1,kind=4) !CHECK: DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=1_4,l1=n) !CHECK: a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=1_4,l2=int(l1,kind=4))) !CHECK: k1: TypeParam type:INTEGER(4) Kind init:1_4 !CHECK: l1: TypeParam type:INTEGER(4) Len init:n !CHECK: DerivedType scope: size=72 alignment=8 instantiation of pdt2(k2=1_4,l2=int(l1,kind=4)) !CHECK: a2 size=64 offset=8: ObjectEntity type: TYPE(pdt1(k1=1_4,l1=int(l2,kind=4))) shape: 1_8:1_8 !CHECK: j2 size=1 offset=0: ObjectEntity type: INTEGER(1) !CHECK: k2: TypeParam type:INTEGER(4) Kind init:1_4 !CHECK: l2: TypeParam type:INTEGER(4) Len init:int(l1,kind=4) !CHECK: DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=1_4,l1=int(l2,kind=4)) !CHECK: a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=1_4,l2=int(l1,kind=4))) !CHECK: k1: TypeParam type:INTEGER(4) Kind init:1_4 !CHECK: l1: TypeParam type:INTEGER(4) Len init:int(l2,kind=4) program test use m type(pdt2(2,3)) x x = mf(3, "abc", pdt1(1,3)()) ! call ms(mf) end program !CHECK: MainProgram scope: test size=88 alignment=8 !CHECK: mf, MODULE (Function): Use from mf in m !CHECK: pdt1: Use from pdt1 in m !CHECK: pdt2: Use from pdt2 in m !CHECK: sm: Use from sm in m !CHECK: x size=88 offset=0: ObjectEntity type: TYPE(pdt2(k2=2_4,l2=3_4)) !CHECK: DerivedType scope: size=88 alignment=8 instantiation of pdt2(k2=2_4,l2=3_4) !CHECK: a2 size=80 offset=8: ObjectEntity type: TYPE(pdt1(k1=2_4,l1=3_4)) shape: 1_8:2_8 !CHECK: j2 size=2 offset=0: ObjectEntity type: INTEGER(2) !CHECK: k2: TypeParam type:INTEGER(4) Kind init:2_4 !CHECK: l2: TypeParam type:INTEGER(4) Len init:3_4 !CHECK: DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=2_4,l1=3_4) !CHECK: a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=2_4,l2=3_4)) !CHECK: k1: TypeParam type:INTEGER(4) Kind init:2_4 !CHECK: l1: TypeParam type:INTEGER(4) Len init:3_4 !CHECK: DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=1_4,l1=3_4) !CHECK: a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=1_4,l2=3_4)) !CHECK: k1: TypeParam type:INTEGER(4) Kind init:1_4 !CHECK: l1: TypeParam type:INTEGER(4) Len init:3_4 !CHECK: DerivedType scope: size=1 alignment=1 instantiation of pdt2(k2=1_4,l2=3_4) !CHECK: a2: ObjectEntity type: TYPE(pdt1(k1=1_4,l1=3_4)) shape: 1_8:1_8 !CHECK: j2 size=1 offset=0: ObjectEntity type: INTEGER(1) !CHECK: k2: TypeParam type:INTEGER(4) Kind init:1_4 !CHECK: l2: TypeParam type:INTEGER(4) Len init:3_4