Skip to content

Commit 6e06fbd

Browse files
author
thk123
committed
Extending tests to deal with specialising with arrays when array fields
1 parent a01a0f2 commit 6e06fbd

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

unit/java_bytecode/generate_concrete_generic_type/generate_java_generic_type.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,5 +326,72 @@ SCENARIO(
326326
}
327327
}
328328
}
329+
WHEN(
330+
"We specialise the class with an array we should have appropriate types")
331+
{
332+
specialise_generic_from_component(
333+
harness_class, "genericArrayArrayField", new_symbol_table);
334+
THEN(
335+
"There should be a specialised version of the class in the symbol "
336+
"table")
337+
{
338+
const std::string specialised_string =
339+
"<java::array[reference]of_"
340+
"java::java.lang.Float>";
341+
const irep_idt specialised_class_name = id2string(harness_class) + "$" +
342+
id2string(inner_class) +
343+
specialised_string;
344+
345+
REQUIRE(new_symbol_table.has_symbol(specialised_class_name));
346+
347+
const symbolt test_class_symbol =
348+
new_symbol_table.lookup_ref(specialised_class_name);
349+
350+
REQUIRE(test_class_symbol.type.id() == ID_struct);
351+
THEN("The array field should be specialised to be an array of floats")
352+
{
353+
const struct_typet::componentt &field_component =
354+
require_type::require_component(
355+
to_struct_type(test_class_symbol.type), "arrayField");
356+
357+
const pointer_typet &component_pointer_type =
358+
require_type::require_pointer(field_component.type(), {});
359+
360+
const symbol_typet &pointer_subtype = require_type::require_symbol(
361+
component_pointer_type.subtype(), "java::array[reference]");
362+
363+
const typet &array_type = java_array_element_type(pointer_subtype);
364+
365+
require_type::require_pointer(
366+
array_type, symbol_typet("java::array[reference]"));
367+
368+
const typet &array_subtype =
369+
java_array_element_type(to_symbol_type(array_type.subtype()));
370+
371+
require_type::require_pointer(
372+
array_subtype, symbol_typet("java::java.lang.Float"));
373+
}
374+
375+
THEN(
376+
"The generic class field should be specialised to be a generic "
377+
"class with the appropriate type")
378+
{
379+
const struct_typet::componentt &field_component =
380+
require_type::require_component(
381+
to_struct_type(test_class_symbol.type), "genericClassField");
382+
383+
const java_generic_typet &param_type =
384+
require_type::require_java_generic_type(
385+
field_component.type(),
386+
{{require_type::type_parameter_kindt::Inst,
387+
"java::array[reference]"}});
388+
389+
const typet &array_type = java_array_element_type(
390+
to_symbol_type(param_type.generic_type_variables()[0].subtype()));
391+
require_type::require_pointer(
392+
array_type, symbol_typet("java::java.lang.Float"));
393+
}
394+
}
395+
}
329396
}
330397
}

unit/java_bytecode/generate_concrete_generic_type/generic_field_array_instantiation.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ class genericArray<T> {
1717
Float [] af;
1818

1919
genericArray<Float> genericArrayField;
20+
genericArray<Float []> genericArrayArrayField;
2021
}

0 commit comments

Comments
 (0)