annotate gcc/testsuite/gfortran.dg/allocate_with_source_13.f03 @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ! { dg-do compile }
kono
parents:
diff changeset
2 !
kono
parents:
diff changeset
3 ! Tests the fix for PR61819.
kono
parents:
diff changeset
4 !
kono
parents:
diff changeset
5 ! Contributed by Salvatore Filippone <sfilippone@uniroma2.it>
kono
parents:
diff changeset
6 !
kono
parents:
diff changeset
7 module foo_base_mod
kono
parents:
diff changeset
8 integer, parameter :: foo_ipk_ = kind(1)
kono
parents:
diff changeset
9 integer, parameter :: foo_dpk_ = kind(1.d0)
kono
parents:
diff changeset
10 type foo_d_base_vect_type
kono
parents:
diff changeset
11 real(foo_dpk_), allocatable :: v(:)
kono
parents:
diff changeset
12 contains
kono
parents:
diff changeset
13 procedure :: free => d_base_free
kono
parents:
diff changeset
14 procedure :: get_vect => d_base_get_vect
kono
parents:
diff changeset
15 procedure :: allocate => d_base_allocate
kono
parents:
diff changeset
16 end type foo_d_base_vect_type
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 type foo_d_vect_type
kono
parents:
diff changeset
20 class(foo_d_base_vect_type), allocatable :: v
kono
parents:
diff changeset
21 contains
kono
parents:
diff changeset
22 procedure :: free => d_vect_free
kono
parents:
diff changeset
23 procedure :: get_vect => d_vect_get_vect
kono
parents:
diff changeset
24 end type foo_d_vect_type
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 type foo_desc_type
kono
parents:
diff changeset
27 integer(foo_ipk_) :: nl=-1
kono
parents:
diff changeset
28 end type foo_desc_type
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 contains
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 subroutine foo_init(ictxt)
kono
parents:
diff changeset
34 integer :: ictxt
kono
parents:
diff changeset
35 end subroutine foo_init
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 subroutine foo_exit(ictxt)
kono
parents:
diff changeset
39 integer :: ictxt
kono
parents:
diff changeset
40 end subroutine foo_exit
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 subroutine foo_info(ictxt,iam,np)
kono
parents:
diff changeset
43 integer(foo_ipk_) :: ictxt,iam,np
kono
parents:
diff changeset
44 iam = 0
kono
parents:
diff changeset
45 np = 1
kono
parents:
diff changeset
46 end subroutine foo_info
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 subroutine foo_cdall(ictxt,map,info,nl)
kono
parents:
diff changeset
49 integer(foo_ipk_) :: ictxt, info
kono
parents:
diff changeset
50 type(foo_desc_type) :: map
kono
parents:
diff changeset
51 integer(foo_ipk_), optional :: nl
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 if (present(nl)) then
kono
parents:
diff changeset
54 map%nl = nl
kono
parents:
diff changeset
55 else
kono
parents:
diff changeset
56 map%nl = 1
kono
parents:
diff changeset
57 end if
kono
parents:
diff changeset
58 end subroutine foo_cdall
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 subroutine foo_cdasb(map,info)
kono
parents:
diff changeset
61 integer(foo_ipk_) :: info
kono
parents:
diff changeset
62 type(foo_desc_type) :: map
kono
parents:
diff changeset
63 if (map%nl < 0) map%nl=1
kono
parents:
diff changeset
64 end subroutine foo_cdasb
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 subroutine d_base_allocate(this,n)
kono
parents:
diff changeset
68 class(foo_d_base_vect_type), intent(out) :: this
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 allocate(this%v(max(1,n)))
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 end subroutine d_base_allocate
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 subroutine d_base_free(this)
kono
parents:
diff changeset
75 class(foo_d_base_vect_type), intent(inout) :: this
kono
parents:
diff changeset
76 if (allocated(this%v)) &
kono
parents:
diff changeset
77 & deallocate(this%v)
kono
parents:
diff changeset
78 end subroutine d_base_free
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 function d_base_get_vect(this) result(res)
kono
parents:
diff changeset
81 class(foo_d_base_vect_type), intent(inout) :: this
kono
parents:
diff changeset
82 real(foo_dpk_), allocatable :: res(:)
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 if (allocated(this%v)) then
kono
parents:
diff changeset
85 res = this%v
kono
parents:
diff changeset
86 else
kono
parents:
diff changeset
87 allocate(res(1))
kono
parents:
diff changeset
88 end if
kono
parents:
diff changeset
89 end function d_base_get_vect
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 subroutine d_vect_free(this)
kono
parents:
diff changeset
92 class(foo_d_vect_type) :: this
kono
parents:
diff changeset
93 if (allocated(this%v)) then
kono
parents:
diff changeset
94 call this%v%free()
kono
parents:
diff changeset
95 deallocate(this%v)
kono
parents:
diff changeset
96 end if
kono
parents:
diff changeset
97 end subroutine d_vect_free
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 function d_vect_get_vect(this) result(res)
kono
parents:
diff changeset
100 class(foo_d_vect_type) :: this
kono
parents:
diff changeset
101 real(foo_dpk_), allocatable :: res(:)
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 if (allocated(this%v)) then
kono
parents:
diff changeset
104 res = this%v%get_vect()
kono
parents:
diff changeset
105 else
kono
parents:
diff changeset
106 allocate(res(1))
kono
parents:
diff changeset
107 end if
kono
parents:
diff changeset
108 end function d_vect_get_vect
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 subroutine foo_geall(v,map,info)
kono
parents:
diff changeset
111 type(foo_d_vect_type), intent(out) :: v
kono
parents:
diff changeset
112 type(foo_Desc_type) :: map
kono
parents:
diff changeset
113 integer(foo_ipk_) :: info
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 allocate(foo_d_base_vect_type :: v%v,stat=info)
kono
parents:
diff changeset
116 if (info == 0) call v%v%allocate(map%nl)
kono
parents:
diff changeset
117 end subroutine foo_geall
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 end module foo_base_mod
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 module foo_scalar_field_mod
kono
parents:
diff changeset
123 use foo_base_mod
kono
parents:
diff changeset
124 implicit none
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 type scalar_field
kono
parents:
diff changeset
127 type(foo_d_vect_type) :: f
kono
parents:
diff changeset
128 type(foo_desc_type), pointer :: map => null()
kono
parents:
diff changeset
129 contains
kono
parents:
diff changeset
130 procedure :: free
kono
parents:
diff changeset
131 end type
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 integer(foo_ipk_), parameter :: nx=4,ny=nx, nz=nx
kono
parents:
diff changeset
134 type(foo_desc_type), allocatable, save, target :: map
kono
parents:
diff changeset
135 integer(foo_ipk_) ,save :: NumMy_xy_planes
kono
parents:
diff changeset
136 integer(foo_ipk_) ,parameter :: NumGlobalElements = nx*ny*nz
kono
parents:
diff changeset
137 integer(foo_ipk_) ,parameter :: NumGlobal_xy_planes = nz, Num_xy_points_per_plane = nx*ny
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 contains
kono
parents:
diff changeset
140 subroutine initialize_map(ictxt,NumMyElements,info)
kono
parents:
diff changeset
141 integer(foo_ipk_) :: ictxt, NumMyElements, info
kono
parents:
diff changeset
142 info = 0
kono
parents:
diff changeset
143 if (allocated(map)) deallocate(map,stat=info)
kono
parents:
diff changeset
144 if (info == 0) allocate(map,stat=info)
kono
parents:
diff changeset
145 if (info == 0) call foo_cdall(ictxt,map,info,nl=NumMyElements)
kono
parents:
diff changeset
146 if (info == 0) call foo_cdasb(map,info)
kono
parents:
diff changeset
147 end subroutine initialize_map
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 function new_scalar_field(comm) result(this)
kono
parents:
diff changeset
150 type(scalar_field) :: this
kono
parents:
diff changeset
151 integer(foo_ipk_) ,intent(in) :: comm
kono
parents:
diff changeset
152 real(foo_dpk_) ,allocatable :: f_v(:)
kono
parents:
diff changeset
153 integer(foo_ipk_) :: i,j,k,NumMyElements, iam, np, info,ip
kono
parents:
diff changeset
154 integer(foo_ipk_), allocatable :: idxs(:)
kono
parents:
diff changeset
155 call foo_info(comm,iam,np)
kono
parents:
diff changeset
156 NumMy_xy_planes = NumGlobal_xy_planes/np
kono
parents:
diff changeset
157 NumMyElements = NumMy_xy_planes*Num_xy_points_per_plane
kono
parents:
diff changeset
158 if (.not. allocated(map)) call initialize_map(comm,NumMyElements,info)
kono
parents:
diff changeset
159 this%map => map
kono
parents:
diff changeset
160 call foo_geall(this%f,this%map,info)
kono
parents:
diff changeset
161 end function
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 subroutine free(this)
kono
parents:
diff changeset
164 class(scalar_field), intent(inout) :: this
kono
parents:
diff changeset
165 integer(foo_ipk_) ::info
kono
parents:
diff changeset
166 write(0,*) 'Freeing scalar_this%f'
kono
parents:
diff changeset
167 call this%f%free()
kono
parents:
diff changeset
168 end subroutine free
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 end module foo_scalar_field_mod
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 module foo_vector_field_mod
kono
parents:
diff changeset
173 use foo_base_mod
kono
parents:
diff changeset
174 use foo_scalar_field_mod, only : scalar_field,new_scalar_field
kono
parents:
diff changeset
175 implicit none
kono
parents:
diff changeset
176 type vector_field
kono
parents:
diff changeset
177 type(scalar_field) :: u(1)
kono
parents:
diff changeset
178 contains
kono
parents:
diff changeset
179 procedure :: free
kono
parents:
diff changeset
180 end type
kono
parents:
diff changeset
181 contains
kono
parents:
diff changeset
182 function new_vector_field(comm_in) result(this)
kono
parents:
diff changeset
183 type(vector_field) :: this
kono
parents:
diff changeset
184 integer(foo_ipk_), intent(in) :: comm_in
kono
parents:
diff changeset
185 this%u = [new_scalar_field(comm_in)] ! Removing this line eliminates the memory leak
kono
parents:
diff changeset
186 end function
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 subroutine free(this)
kono
parents:
diff changeset
189 class(vector_field), intent(inout) :: this
kono
parents:
diff changeset
190 integer :: i
kono
parents:
diff changeset
191 associate(vf=>this%u)
kono
parents:
diff changeset
192 do i=1, size(vf)
kono
parents:
diff changeset
193 write(0,*) 'Freeing vector_this%u(',i,')'
kono
parents:
diff changeset
194 call vf(i)%free()
kono
parents:
diff changeset
195 end do
kono
parents:
diff changeset
196 end associate
kono
parents:
diff changeset
197 end subroutine free
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 end module foo_vector_field_mod
kono
parents:
diff changeset
200
kono
parents:
diff changeset
201 program main
kono
parents:
diff changeset
202 use foo_base_mod
kono
parents:
diff changeset
203 use foo_vector_field_mod,only: vector_field,new_vector_field
kono
parents:
diff changeset
204 use foo_scalar_field_mod,only: map
kono
parents:
diff changeset
205 implicit none
kono
parents:
diff changeset
206 type(vector_field) :: u
kono
parents:
diff changeset
207 type(foo_d_vect_type) :: v
kono
parents:
diff changeset
208 real(foo_dpk_), allocatable :: av(:)
kono
parents:
diff changeset
209 integer(foo_ipk_) :: ictxt, iam, np, i,info
kono
parents:
diff changeset
210 call foo_init(ictxt)
kono
parents:
diff changeset
211 call foo_info(ictxt,iam,np)
kono
parents:
diff changeset
212 u = new_vector_field(ictxt)
kono
parents:
diff changeset
213 call u%free()
kono
parents:
diff changeset
214 do i=1,10
kono
parents:
diff changeset
215 u = new_vector_field(ictxt)
kono
parents:
diff changeset
216 call u%free()
kono
parents:
diff changeset
217 end do
kono
parents:
diff changeset
218 call u%free()
kono
parents:
diff changeset
219 call foo_exit(ictxt)
kono
parents:
diff changeset
220 end program