@@ -125,7 +125,8 @@ pointer_typet select_pointer_typet::specialize_generics(
125125 {
126126 const pointer_typet &new_array_type = specialize_generics (
127127 to_pointer_type (array_element_type),
128- generic_parameter_specialization_map, visited_nodes);
128+ generic_parameter_specialization_map,
129+ visited_nodes);
129130
130131 pointer_typet replacement_array_type = java_array_type (' a' );
131132 replacement_array_type.subtype ().set (ID_C_element_type, new_array_type);
@@ -149,10 +150,34 @@ optionalt<pointer_typet> select_pointer_typet::get_instantiated_type(
149150 &generic_parameter_specialization_map) const
150151{
151152 generic_parameter_recursion_trackingt visited;
152- const auto retval = get_instantiated_type (
153- parameter_name, generic_parameter_specialization_map, visited, 0 );
154- INVARIANT (visited.empty (), " recursion set must be empty here" );
155- return retval;
153+ size_t depth = 0 ;
154+ const size_t max =
155+ generic_parameter_specialization_map.find (parameter_name)->second .size ();
156+
157+ irep_idt current_parameter = parameter_name;
158+ while (depth < max)
159+ {
160+ const auto retval = get_instantiated_type (
161+ current_parameter, generic_parameter_specialization_map, visited, depth);
162+ if (retval.has_value ())
163+ {
164+ if (is_java_generic_parameter (*retval))
165+ {
166+ UNREACHABLE;
167+ }
168+ return retval;
169+ }
170+ INVARIANT (visited.empty (), " recursion set must be empty here" );
171+
172+ const auto &entry =
173+ generic_parameter_specialization_map.find (current_parameter)
174+ ->second .back ();
175+ const java_generic_parametert &gen_param = to_java_generic_parameter (entry);
176+ const auto &type_var = gen_param.type_variable ();
177+ current_parameter = type_var.get_identifier ();
178+ depth++;
179+ }
180+ return {};
156181}
157182
158183// / See above, the additional parameter just tracks the recursion to prevent
@@ -179,16 +204,14 @@ optionalt<pointer_typet> select_pointer_typet::get_instantiated_type(
179204 const auto &replacements =
180205 generic_parameter_specialization_map.find (parameter_name)->second ;
181206
182- // max depth reached and nothing found
207+ // max depth reached and nothing found, TODO return bound
183208 if (replacements.size () <= depth)
184209 return {};
185210
186- // Check if there is a recursion loop, if yes increase search depth
211+ // Check if there is a recursion loop, if yes return with nothing found
187212 if (visited.find (parameter_name) != visited.end ())
188213 {
189- visited.clear ();
190- return get_instantiated_type (
191- parameter_name, generic_parameter_specialization_map, visited, depth+1 );
214+ return {};
192215 }
193216 else
194217 {
@@ -202,7 +225,8 @@ optionalt<pointer_typet> select_pointer_typet::get_instantiated_type(
202225 else
203226 {
204227 visited.insert (parameter_name);
205- const auto &gen_type = to_java_generic_parameter (type).type_variable ();
228+ const auto &gen_type =
229+ to_java_generic_parameter (type).type_variable ();
206230 const auto val = get_instantiated_type (
207231 gen_type.get_identifier (),
208232 generic_parameter_specialization_map,
0 commit comments