Skip to content

Commit 7073c41

Browse files
committed
reproducer: combine smart-pointer modules
1 parent 0268a03 commit 7073c41

File tree

1 file changed

+54
-33
lines changed

1 file changed

+54
-33
lines changed

reproducer/reproducer.f90

+54-33
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1-
module resource_m
1+
module smart_pointer_m
22
implicit none
3+
34
type, abstract :: resource_t
45
contains
56
procedure(free_interface), deferred :: free
67
end type
8+
79
abstract interface
810
subroutine free_interface(self)
911
import resource_t
1012
class(resource_t), intent(inout) :: self
1113
end subroutine
1214
end interface
15+
1316
type reference_counter_t
1417
integer, pointer :: count_ => null()
1518
class(resource_t), pointer :: object_ => null()
@@ -20,13 +23,23 @@ subroutine free_interface(self)
2023
generic :: assignment(=) => assign_reference_counter
2124
final :: finalize
2225
end type
26+
27+
type, abstract, extends(resource_t) :: smart_pointer_t
28+
type(reference_counter_t) :: counter
29+
contains
30+
procedure, non_overridable :: release_handle
31+
procedure, non_overridable :: start_counter
32+
end type
33+
2334
contains
35+
2436
subroutine finalize(self)
2537
type(reference_counter_t), intent(inout) :: self
2638
print *," reference_counter_t%finalize: start"
2739
if (associated(self%count_)) call self%release
2840
print *," reference_counter_t%finalize: end" // new_line('')
2941
end subroutine
42+
3043
function construct_reference_counter_t(object) result(reference_counter)
3144
class(resource_t), intent(in) :: object
3245
type(reference_counter_t) reference_counter
@@ -36,13 +49,15 @@ function construct_reference_counter_t(object) result(reference_counter)
3649
call reference_counter%grab
3750
print *," construct_reference_counter_t: end" // new_line('')
3851
end function
52+
3953
subroutine grab(self)
4054
class(reference_counter_t), intent(inout) :: self
4155
print *," reference_counter_t%grab: start"
4256
if (.not. associated(self%count_)) error stop "reference_counter_t%grab: associated(self%count_)"
4357
self%count_ = self%count_ + 1
4458
print *," reference_counter_t%grab: end (self%count_ = ", self%count_,")"
4559
end subroutine
60+
4661
subroutine release(self)
4762
class (reference_counter_t), intent(inout) :: self
4863
print *," reference_counter_t%release: start"
@@ -59,6 +74,7 @@ subroutine release(self)
5974
end if
6075
print *," reference_counter_t%release: end"
6176
end subroutine
77+
6278
subroutine assign_reference_counter(lhs, rhs)
6379
class(reference_counter_t), intent(inout) :: lhs
6480
class(reference_counter_t), intent(in) :: rhs
@@ -69,68 +85,73 @@ subroutine assign_reference_counter(lhs, rhs)
6985
call lhs%grab
7086
print *," reference_counter_t%assign_reference_counter: end" // new_line('')
7187
end subroutine
72-
end module
73-
module smart_pointer_m
74-
use resource_m, only: resource_t, reference_counter_t, construct_reference_counter_t
75-
implicit none
76-
type, abstract, extends(resource_t) :: smart_pointer_t
77-
type(reference_counter_t) :: counter
78-
contains
79-
procedure, non_overridable :: release_handle
80-
procedure, non_overridable :: start_counter
81-
end type
82-
contains
88+
8389
subroutine release_handle(self)
8490
class(smart_pointer_t), intent(inout) :: self
8591
print *," smart_pointer_t%release_handle: start"
8692
call self%counter%release
8793
print *," smart_pointer_t%release_handle: end" // new_line('')
8894
end subroutine
95+
8996
subroutine start_counter(self)
9097
class(smart_pointer_t), intent(inout) :: self
9198
print *," smart_pointer_t%start_counter: start" // new_line('')
9299
self%counter = construct_reference_counter_t(self)
93100
print *," smart_pointer_t%start_counter: end" // new_line('')
94101
end subroutine
102+
95103
end module
96-
module smart_pointer_test_m
104+
105+
module integer_pointer_m
97106
use smart_pointer_m, only: smart_pointer_t
98107
implicit none
99-
type, extends(smart_pointer_t) :: object_t
108+
109+
type, extends(smart_pointer_t) :: integer_pointer_t
100110
integer, pointer :: ref => null()
101111
contains
102112
procedure :: free
103113
end type
104-
integer, allocatable, target :: referenced_memory
114+
115+
integer, allocatable, target :: allocatable_integer
105116
integer, parameter :: the_answer = 42
117+
106118
contains
107-
function construct_object_t() result(object)
108-
type(object_t) object
109-
print *," construct_object_t: start" // new_line('')
110-
if (.not. allocated(referenced_memory)) allocate(referenced_memory, source=the_answer)
111-
object%ref => referenced_memory
112-
object%ref = the_answer
113-
call object%start_counter
114-
print *," construct_object_t: end" //new_line('')
119+
120+
function allocate_integer() result(integer_pointer)
121+
type(integer_pointer_t) integer_pointer
122+
print *," allocate_integer: start" // new_line('')
123+
if (.not. allocated(allocatable_integer)) allocate(allocatable_integer, source=the_answer)
124+
integer_pointer%ref => allocatable_integer
125+
integer_pointer%ref = the_answer
126+
call integer_pointer%start_counter
127+
print *," allocate_integer: end" //new_line('')
115128
end function
129+
116130
subroutine free(self)
117-
class(object_t), intent(inout) :: self
118-
print *," object_t%free: start"
119-
if (allocated(referenced_memory)) deallocate(referenced_memory)
131+
class(integer_pointer_t), intent(inout) :: self
132+
print *," integer_pointer_t%free: start"
133+
if (allocated(allocatable_integer)) deallocate(allocatable_integer)
120134
nullify(self%ref)
121-
print *," object_t%free: end" // new_line('')
135+
print *," integer_pointer_t%free: end" // new_line('')
122136
end subroutine
137+
123138
end module
124-
use smart_pointer_test_m
139+
140+
program main
141+
use integer_pointer_m, only : integer_pointer_t, allocate_integer
125142
implicit none
143+
126144
print *,"main: start" // new_line('')
127-
call check_creation
145+
call test_reference_counting
128146
print *,"main: end" ! ---> this line is not reached <---
147+
129148
contains
130-
subroutine check_creation
131-
type(object_t) object
149+
150+
subroutine test_reference_counting
151+
type(integer_pointer_t) integer_pointer
132152
print *," main(check_creation): start" // new_line('')
133-
object = construct_object_t()
153+
integer_pointer = allocate_integer()
134154
print *," main(check_creation): end" // new_line('')
135155
end subroutine
136-
end
156+
157+
end program

0 commit comments

Comments
 (0)