annotate gcc/testsuite/gfortran.dg/asan/pointer_assign_16.f90 @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 2b5abeee2509
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1 ! { dg-do run }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
2 ! PR fortran/94788 - this leads to a double free.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
3 ! Test case by Juergen Reuter.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
4 module iso_varying_string
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
5 implicit none
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
6 integer, parameter, private :: GET_BUFFER_LEN = 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
7 type, public :: varying_string
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
8 private
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
9 character(LEN=1), dimension(:), allocatable :: chars
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
10 end type varying_string
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
11
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
12 interface assignment(=)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
13 module procedure op_assign_CH_VS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
14 module procedure op_assign_VS_CH
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
15 end interface assignment(=)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
16
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
17 interface char
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
18 module procedure char_auto
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
19 module procedure char_fixed
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
20 end interface char
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
21
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
22 interface len
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
23 module procedure len_
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
24 end interface len
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
25
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
26 interface var_str
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
27 module procedure var_str_
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
28 end interface var_str
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
29
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
30 public :: assignment(=)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
31 public :: char
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
32 public :: len
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
33 public :: var_str
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
34
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
35 private :: op_assign_CH_VS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
36 private :: op_assign_VS_CH
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
37 private :: op_eq_VS_VS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
38 private :: op_eq_CH_VS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
39 private :: op_eq_VS_CH
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
40 private :: char_auto
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
41 private :: char_fixed
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
42 private :: len_
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
43 private :: var_str_
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
44
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
45 contains
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
46
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
47 elemental function len_ (string) result (length)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
48 type(varying_string), intent(in) :: string
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
49 integer :: length
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
50 if(ALLOCATED(string%chars)) then
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
51 length = SIZE(string%chars)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
52 else
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
53 length = 0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
54 endif
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
55 end function len_
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
56
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
57 elemental subroutine op_assign_CH_VS (var, exp)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
58 character(LEN=*), intent(out) :: var
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
59 type(varying_string), intent(in) :: exp
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
60 var = char(exp)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
61 end subroutine op_assign_CH_VS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
62
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
63 elemental subroutine op_assign_VS_CH (var, exp)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
64 type(varying_string), intent(out) :: var
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
65 character(LEN=*), intent(in) :: exp
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
66 var = var_str(exp)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
67 end subroutine op_assign_VS_CH
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
68
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
69 elemental function op_eq_VS_VS (string_a, string_b) result (op_eq)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
70 type(varying_string), intent(in) :: string_a
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
71 type(varying_string), intent(in) :: string_b
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
72 logical :: op_eq
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
73 op_eq = char(string_a) == char(string_b)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
74 end function op_eq_VS_VS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
75
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
76 elemental function op_eq_CH_VS (string_a, string_b) result (op_eq)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
77 character(LEN=*), intent(in) :: string_a
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
78 type(varying_string), intent(in) :: string_b
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
79 logical :: op_eq
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
80 op_eq = string_a == char(string_b)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
81 end function op_eq_CH_VS
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
82
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
83 elemental function op_eq_VS_CH (string_a, string_b) result (op_eq)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
84 type(varying_string), intent(in) :: string_a
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
85 character(LEN=*), intent(in) :: string_b
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
86 logical :: op_eq
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
87 op_eq = char(string_a) == string_b
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
88 end function op_eq_VS_CH
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
89
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
90
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
91 pure function char_auto (string) result (char_string)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
92 type(varying_string), intent(in) :: string
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
93 character(LEN=len(string)) :: char_string
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
94 integer :: i_char
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
95 forall(i_char = 1:len(string))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
96 char_string(i_char:i_char) = string%chars(i_char)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
97 end forall
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
98
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
99 end function char_auto
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
100
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
101 pure function char_fixed (string, length) result (char_string)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
102 type(varying_string), intent(in) :: string
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
103 integer, intent(in) :: length
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
104 character(LEN=length) :: char_string
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
105 char_string = char(string)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
106 end function char_fixed
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
107
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
108 elemental function var_str_ (char) result (string)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
109 character(LEN=*), intent(in) :: char
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
110 type(varying_string) :: string
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
111 integer :: length
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
112 integer :: i_char
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
113 length = LEN(char)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
114 ALLOCATE(string%chars(length))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
115 forall(i_char = 1:length)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
116 string%chars(i_char) = char(i_char:i_char)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
117 end forall
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
118 end function var_str_
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
119
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
120 end module iso_varying_string
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
121
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
122
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
123 module parser
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
124 implicit none
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
125 private
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
126 public :: parse_node_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
127 public :: parse_tree_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
128 type :: parse_node_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
129 private
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
130 end type parse_node_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
131
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
132 type :: parse_tree_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
133 private
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
134 type(parse_node_t), pointer :: root_node => null ()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
135 contains
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
136 procedure :: get_root_ptr => parse_tree_get_root_ptr
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
137 end type parse_tree_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
138
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
139 contains
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
140 function parse_tree_get_root_ptr (parse_tree) result (node)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
141 class(parse_tree_t), intent(in) :: parse_tree
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
142 type(parse_node_t), pointer :: node
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
143 node => parse_tree%root_node
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
144 end function parse_tree_get_root_ptr
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
145
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
146 end module parser
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
147
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
148
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
149
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
150 module rt_data
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
151 use iso_varying_string, string_t => varying_string
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
152 use parser, only: parse_node_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
153 implicit none
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
154 private
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
155
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
156 public :: rt_data_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
157
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
158 type :: rt_parse_nodes_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
159 type(parse_node_t), pointer :: weight_expr => null ()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
160 end type rt_parse_nodes_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
161
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
162 type :: rt_data_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
163 type(rt_parse_nodes_t) :: pn
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
164 type(string_t) :: logfile
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
165 contains
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
166 procedure :: global_init => rt_data_global_init
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
167 procedure :: local_init => rt_data_local_init
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
168 procedure :: activate => rt_data_activate
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
169 end type rt_data_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
170
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
171
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
172 contains
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
173
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
174 subroutine rt_data_global_init (global, logfile)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
175 class(rt_data_t), intent(out), target :: global
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
176 type(string_t), intent(in), optional :: logfile
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
177 integer :: seed
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
178 if (present (logfile)) then
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
179 global%logfile = logfile
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
180 else
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
181 global%logfile = ""
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
182 end if
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
183 call system_clock (seed)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
184 end subroutine rt_data_global_init
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
185
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
186 subroutine rt_data_local_init (local, global, env)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
187 class(rt_data_t), intent(inout), target :: local
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
188 type(rt_data_t), intent(in), target :: global
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
189 integer, intent(in), optional :: env
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
190 local%logfile = global%logfile
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
191 end subroutine rt_data_local_init
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
192
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
193 subroutine rt_data_activate (local)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
194 class(rt_data_t), intent(inout), target :: local
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
195 class(rt_data_t), pointer :: global
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
196
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
197 ! global => local%context
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
198 ! if (associated (global)) then
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
199 ! local%logfile = global%logfile
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
200 ! local%pn = global%pn
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
201 ! end if
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
202 end subroutine rt_data_activate
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
203
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
204 end module rt_data
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
205
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
206 module events
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
207 implicit none
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
208 private
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
209 public :: event_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
210
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
211 type :: event_config_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
212 end type event_config_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
213
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
214 type :: event_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
215 type(event_config_t) :: config
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
216 end type event_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
217
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
218 end module events
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
219
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
220
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
221 module simulations
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
222 use iso_varying_string, string_t => varying_string
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
223 use events
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
224 use rt_data
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
225
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
226 implicit none
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
227 private
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
228
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
229 public :: simulation_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
230
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
231 type, extends (event_t) :: entry_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
232 private
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
233 type(entry_t), pointer :: next => null ()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
234 end type entry_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
235
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
236 type, extends (entry_t) :: alt_entry_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
237 contains
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
238 procedure :: init_alt => alt_entry_init
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
239 end type alt_entry_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
240
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
241 type :: simulation_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
242 private
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
243 type(rt_data_t), pointer :: local => null ()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
244 integer :: n_alt = 0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
245 type(entry_t), dimension(:), allocatable :: entry
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
246 type(alt_entry_t), dimension(:,:), allocatable :: alt_entry
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
247 contains
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
248 procedure :: init => simulation_init
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
249 end type simulation_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
250
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
251
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
252 contains
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
253
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
254 subroutine alt_entry_init (entry, local)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
255 class(alt_entry_t), intent(inout), target :: entry
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
256 type(rt_data_t), intent(inout), target :: local
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
257 integer :: i
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
258 end subroutine alt_entry_init
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
259
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
260 subroutine simulation_init (simulation, &
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
261 integrate, generate, local, global, alt_env)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
262 class(simulation_t), intent(out), target :: simulation
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
263 logical, intent(in) :: integrate, generate
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
264 type(rt_data_t), intent(inout), target :: local
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
265 type(rt_data_t), intent(inout), optional, target :: global
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
266 type(rt_data_t), dimension(:), intent(inout), optional, target :: alt_env
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
267 simulation%local => local
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
268 allocate (simulation%entry (1))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
269 if (present (alt_env)) then
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
270 simulation%n_alt = size (alt_env)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
271 end if
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
272 end subroutine simulation_init
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
273
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
274 end module simulations
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
275
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
276
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
277 program main_ut
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
278 use iso_varying_string, string_t => varying_string
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
279 use parser, only: parse_tree_t
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
280 use rt_data
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
281 use simulations
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
282 implicit none
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
283 call simulations_10 (6)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
284
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
285 contains
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
286
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
287 subroutine simulations_10 (u)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
288 integer, intent(in) :: u
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
289 type(rt_data_t), target :: global
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
290 type(rt_data_t), dimension(1), target :: alt_env
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
291 type(parse_tree_t) :: pt_weight
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
292 type(simulation_t), target :: simulation
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
293
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
294 call global%global_init ()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
295 call alt_env(1)%local_init (global)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
296 call alt_env(1)%activate ()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
297
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
298 !!!! This causes the pointer hiccup
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
299 alt_env(1)%pn%weight_expr => pt_weight%get_root_ptr ()
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
300 call simulation%init (.true., .true., global, alt_env=alt_env)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
301
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
302 end subroutine simulations_10
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
303
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
304 end program main_ut