1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
! RUN: %S/test_modfile.sh %s %t %f18
! Test writing procedure bindings in a derived type.
module m
interface
subroutine a(i, j)
integer :: i, j
end subroutine
end interface
type, abstract :: t
integer :: i
contains
procedure(a), deferred, nopass :: q
procedure(b), deferred, nopass :: p, r
end type
type t2
integer :: x
contains
private
final :: c
procedure, non_overridable :: d
end type
type, abstract :: t2a
contains
procedure(a), deferred, public, nopass :: e
end type
type t3
sequence
integer i
real x
double precision y
double complex z
end type
contains
subroutine b()
end subroutine
subroutine c(x)
type(t2) :: x
end subroutine
subroutine d(x)
class(t2) :: x
end subroutine
subroutine test
type(t2) :: x
call x%d()
end subroutine
end module
!Expect: m.mod
!module m
! interface
! subroutine a(i,j)
! integer(4)::i
! integer(4)::j
! end
! end interface
! type,abstract::t
! integer(4)::i
! contains
! procedure(a),deferred,nopass::q
! procedure(b),deferred,nopass::p
! procedure(b),deferred,nopass::r
! end type
! type::t2
! integer(4)::x
! contains
! procedure,non_overridable,private::d
! final::c
! end type
! type,abstract::t2a
! contains
! procedure(a),deferred,nopass::e
! end type
! type::t3
! sequence
! integer(4)::i
! real(4)::x
! real(8)::y
! complex(8)::z
! end type
!contains
! subroutine b()
! end
! subroutine c(x)
! type(t2)::x
! end
! subroutine d(x)
! class(t2)::x
! end
! subroutine test()
! end
!end
! Ensure the type is emitted before its use
module m2
private s
type :: t
contains
procedure :: foo
end type
abstract interface
subroutine s(x)
import
type(t) :: x
end subroutine
end interface
contains
subroutine foo(x)
class(t) :: x
end subroutine
end module
!Expect: m2.mod
!module m2
! type::t
! contains
! procedure::foo
! end type
! private::s
! abstract interface
! subroutine s(x)
! import::t
! type(t)::x
! end
! end interface
!contains
! subroutine foo(x)
! class(t)::x
! end
!end
|