xref: /llvm-project/flang/test/Semantics/modproc01.f90 (revision b0bdc7fcc995fe6cf6ca9a184fc6ed211fc7b608)
1!RUN: %flang_fc1 -fdebug-dump-symbols %s | FileCheck %s
2module m
3  type pdt1(k1,l1)
4    integer, kind :: k1
5    integer, len :: l1
6    type(pdt2(k1,l1)), allocatable :: a1
7  end type pdt1
8  type pdt2(k2,l2)
9    integer, kind :: k2
10    integer, len :: l2
11    integer(k2) :: j2
12    type(pdt1(k2,l2)) :: a2(k2)
13  end type pdt2
14  interface
15    module function mf(n,str,x1) result(res)
16      integer, intent(in) :: n
17      character(n), intent(in) :: str
18      type(pdt1(1,n)), intent(in) :: x1
19      type(pdt2(2,n)) :: res
20    end function
21    module subroutine ms(f)
22      procedure(mf) :: f
23    end subroutine
24  end interface
25  integer sm
26end module
27!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)
28!CHECK:    pdt1, PUBLIC: DerivedType components: a1
29!CHECK:    pdt2, PUBLIC: DerivedType components: j2,a2
30!CHECK:    sm, PUBLIC size=4 offset=0: ObjectEntity type: INTEGER(4)
31!CHECK:    DerivedType scope: pdt1
32!CHECK:      a1, ALLOCATABLE: ObjectEntity type: TYPE(pdt2(int(k1,kind=4),int(l1,kind=4)))
33!CHECK:      k1: TypeParam type:INTEGER(4) Kind
34!CHECK:      l1: TypeParam type:INTEGER(4) Len
35!CHECK:    DerivedType scope: pdt2
36!CHECK:      a2: ObjectEntity type: TYPE(pdt1(k1=int(k2,kind=4),l1=int(l2,kind=4))) shape: 1_8:k2
37!CHECK:      j2: ObjectEntity type: INTEGER(int(int(k2,kind=4),kind=8))
38!CHECK:      k2: TypeParam type:INTEGER(4) Kind
39!CHECK:      l2: TypeParam type:INTEGER(4) Len
40!CHECK:    Subprogram scope: mf size=112 alignment=8
41!CHECK:      mf (Function): HostAssoc
42!CHECK:      n, INTENT(IN) size=4 offset=0: ObjectEntity dummy type: INTEGER(4)
43!CHECK:      res size=40 offset=72: ObjectEntity funcResult type: TYPE(pdt2(k2=2_4,l2=n))
44!CHECK:      str, INTENT(IN) size=24 offset=8: ObjectEntity dummy type: CHARACTER(n,1)
45!CHECK:      x1, INTENT(IN) size=40 offset=32: ObjectEntity dummy type: TYPE(pdt1(k1=1_4,l1=n))
46!CHECK:      DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=1_4,l1=n)
47!CHECK:        a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=1_4,l2=int(l1,kind=4)))
48!CHECK:        k1: TypeParam type:INTEGER(4) Kind init:1_4
49!CHECK:        l1: TypeParam type:INTEGER(4) Len init:n
50!CHECK:        DerivedType scope: size=72 alignment=8 instantiation of pdt2(k2=1_4,l2=int(l1,kind=4))
51!CHECK:          a2 size=64 offset=8: ObjectEntity type: TYPE(pdt1(k1=1_4,l1=int(l2,kind=4))) shape: 1_8:1_8
52!CHECK:          j2 size=1 offset=0: ObjectEntity type: INTEGER(1)
53!CHECK:          k2: TypeParam type:INTEGER(4) Kind init:1_4
54!CHECK:          l2: TypeParam type:INTEGER(4) Len init:int(l1,kind=4)
55!CHECK:          DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=1_4,l1=int(l2,kind=4))
56!CHECK:            a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=1_4,l2=int(l1,kind=4)))
57!CHECK:            k1: TypeParam type:INTEGER(4) Kind init:1_4
58!CHECK:            l1: TypeParam type:INTEGER(4) Len init:int(l2,kind=4)
59!CHECK:      DerivedType scope: size=72 alignment=8 instantiation of pdt2(k2=2_4,l2=n)
60!CHECK:        a2 size=64 offset=8: ObjectEntity type: TYPE(pdt1(k1=2_4,l1=int(l2,kind=4))) shape: 1_8:2_8
61!CHECK:        j2 size=2 offset=0: ObjectEntity type: INTEGER(2)
62!CHECK:        k2: TypeParam type:INTEGER(4) Kind init:2_4
63!CHECK:        l2: TypeParam type:INTEGER(4) Len init:n
64!CHECK:        DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=2_4,l1=int(l2,kind=4))
65!CHECK:          a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=2_4,l2=int(l1,kind=4)))
66!CHECK:          k1: TypeParam type:INTEGER(4) Kind init:2_4
67!CHECK:          l1: TypeParam type:INTEGER(4) Len init:int(l2,kind=4)
68!CHECK:          DerivedType scope: size=72 alignment=8 instantiation of pdt2(k2=2_4,l2=int(l1,kind=4))
69!CHECK:            a2 size=64 offset=8: ObjectEntity type: TYPE(pdt1(k1=2_4,l1=int(l2,kind=4))) shape: 1_8:2_8
70!CHECK:            j2 size=2 offset=0: ObjectEntity type: INTEGER(2)
71!CHECK:            k2: TypeParam type:INTEGER(4) Kind init:2_4
72!CHECK:            l2: TypeParam type:INTEGER(4) Len init:int(l1,kind=4)
73
74submodule(m) sm
75 contains
76  module procedure mf
77    print *, len(str), x1%k1, x1%l1, res%k2, res%l2
78    allocate(res%a2(1)%a1)
79    res%a2(1)%a1%j2 = 2
80  end procedure
81  module procedure ms
82!    type(pdt2(2.3)) x
83!    x = f(3, "abc", pdt1(1,3)())
84  end procedure
85end submodule
86!CHECK:    Module scope: sm size=0 alignment=1
87!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)
88!CHECK:      Subprogram scope: mf size=112 alignment=8
89!CHECK:        len, INTRINSIC, PURE (Function): ProcEntity
90!CHECK:        n, INTENT(IN) size=4 offset=0: ObjectEntity dummy type: INTEGER(4)
91!CHECK:        res size=40 offset=72: ObjectEntity funcResult type: TYPE(pdt2(k2=2_4,l2=n))
92!CHECK:        str, INTENT(IN) size=24 offset=8: ObjectEntity dummy type: CHARACTER(n,1)
93!CHECK:        x1, INTENT(IN) size=40 offset=32: ObjectEntity dummy type: TYPE(pdt1(k1=1_4,l1=n))
94!CHECK:        DerivedType scope: size=72 alignment=8 instantiation of pdt2(k2=2_4,l2=n)
95!CHECK:          a2 size=64 offset=8: ObjectEntity type: TYPE(pdt1(k1=2_4,l1=int(l2,kind=4))) shape: 1_8:2_8
96!CHECK:          j2 size=2 offset=0: ObjectEntity type: INTEGER(2)
97!CHECK:          k2: TypeParam type:INTEGER(4) Kind init:2_4
98!CHECK:          l2: TypeParam type:INTEGER(4) Len init:n
99!CHECK:          DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=2_4,l1=int(l2,kind=4))
100!CHECK:            a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=2_4,l2=int(l1,kind=4)))
101!CHECK:            k1: TypeParam type:INTEGER(4) Kind init:2_4
102!CHECK:            l1: TypeParam type:INTEGER(4) Len init:int(l2,kind=4)
103!CHECK:            DerivedType scope: size=72 alignment=8 instantiation of pdt2(k2=2_4,l2=int(l1,kind=4))
104!CHECK:              a2 size=64 offset=8: ObjectEntity type: TYPE(pdt1(k1=2_4,l1=int(l2,kind=4))) shape: 1_8:2_8
105!CHECK:              j2 size=2 offset=0: ObjectEntity type: INTEGER(2)
106!CHECK:              k2: TypeParam type:INTEGER(4) Kind init:2_4
107!CHECK:              l2: TypeParam type:INTEGER(4) Len init:int(l1,kind=4)
108!CHECK:        DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=1_4,l1=n)
109!CHECK:          a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=1_4,l2=int(l1,kind=4)))
110!CHECK:          k1: TypeParam type:INTEGER(4) Kind init:1_4
111!CHECK:          l1: TypeParam type:INTEGER(4) Len init:n
112!CHECK:          DerivedType scope: size=72 alignment=8 instantiation of pdt2(k2=1_4,l2=int(l1,kind=4))
113!CHECK:            a2 size=64 offset=8: ObjectEntity type: TYPE(pdt1(k1=1_4,l1=int(l2,kind=4))) shape: 1_8:1_8
114!CHECK:            j2 size=1 offset=0: ObjectEntity type: INTEGER(1)
115!CHECK:            k2: TypeParam type:INTEGER(4) Kind init:1_4
116!CHECK:            l2: TypeParam type:INTEGER(4) Len init:int(l1,kind=4)
117!CHECK:            DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=1_4,l1=int(l2,kind=4))
118!CHECK:              a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=1_4,l2=int(l1,kind=4)))
119!CHECK:              k1: TypeParam type:INTEGER(4) Kind init:1_4
120!CHECK:              l1: TypeParam type:INTEGER(4) Len init:int(l2,kind=4)
121
122program test
123  use m
124  type(pdt2(2,3)) x
125  x = mf(3, "abc", pdt1(1,3)())
126!  call ms(mf)
127end program
128!CHECK:  MainProgram scope: test size=88 alignment=8
129!CHECK:    mf, MODULE (Function): Use from mf in m
130!CHECK:    pdt1: Use from pdt1 in m
131!CHECK:    pdt2: Use from pdt2 in m
132!CHECK:    sm: Use from sm in m
133!CHECK:    x size=88 offset=0: ObjectEntity type: TYPE(pdt2(k2=2_4,l2=3_4))
134!CHECK:    DerivedType scope: size=88 alignment=8 instantiation of pdt2(k2=2_4,l2=3_4)
135!CHECK:      a2 size=80 offset=8: ObjectEntity type: TYPE(pdt1(k1=2_4,l1=3_4)) shape: 1_8:2_8
136!CHECK:      j2 size=2 offset=0: ObjectEntity type: INTEGER(2)
137!CHECK:      k2: TypeParam type:INTEGER(4) Kind init:2_4
138!CHECK:      l2: TypeParam type:INTEGER(4) Len init:3_4
139!CHECK:      DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=2_4,l1=3_4)
140!CHECK:        a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=2_4,l2=3_4))
141!CHECK:        k1: TypeParam type:INTEGER(4) Kind init:2_4
142!CHECK:        l1: TypeParam type:INTEGER(4) Len init:3_4
143!CHECK:    DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=1_4,l1=3_4)
144!CHECK:      a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=1_4,l2=3_4))
145!CHECK:      k1: TypeParam type:INTEGER(4) Kind init:1_4
146!CHECK:      l1: TypeParam type:INTEGER(4) Len init:3_4
147!CHECK:      DerivedType scope: size=48 alignment=8 instantiation of pdt2(k2=1_4,l2=3_4) sourceRange=0 bytes
148!CHECK:        a2 size=40 offset=8: ObjectEntity type: TYPE(pdt1(k1=1_4,l1=3_4)) shape: 1_8:1_8
149!CHECK:        j2 size=1 offset=0: ObjectEntity type: INTEGER(1)
150!CHECK:        k2: TypeParam type:INTEGER(4) Kind init:1_4
151!CHECK:        l2: TypeParam type:INTEGER(4) Len init:3_4
152!CHECK:        DerivedType scope: size=40 alignment=8 instantiation of pdt1(k1=1_4,l1=3_4) sourceRange=0 bytes
153!CHECK:          a1, ALLOCATABLE size=40 offset=0: ObjectEntity type: TYPE(pdt2(k2=1_4,l2=3_4))
154!CHECK:          k1: TypeParam type:INTEGER(4) Kind init:1_4
155!CHECK:          l1: TypeParam type:INTEGER(4) Len init:3_4
156