Skip to content

Commit fc83526

Browse files
author
svorenova
committed
Ignore generic arguments for mocked and unsupported generic classes
Given - a class extending/implementing a generic class/interface, - a generic pointer type, if the struct symbol for the superclass/interface/pointer subtype is either incomplete (mocked) or is not generic (e.g. because its signature has an unsupported form) ignore the generic arguments.
1 parent 7b56203 commit fc83526

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

src/java_bytecode/generic_parameter_specialization_map_keys.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,17 @@ const void generic_parameter_specialization_map_keyst::insert_pairs_for_pointer(
9999
pointer_type.subtype().get(ID_identifier) ==
100100
pointer_subtype_struct.get(ID_name));
101101

102-
const java_generic_typet &generic_pointer =
103-
to_java_generic_type(pointer_type);
104-
105102
// If the pointer points to an incomplete class, don't treat the generics
106-
if(!pointer_subtype_struct.get_bool(ID_incomplete_class))
103+
// TODO TG-1996 should treat generic incomplete (mocked) classes
104+
// Also do not treat generics is the class is not marked generic or
105+
// implicitly generic (this may be due to unsupported class signature)
106+
if(
107+
!pointer_subtype_struct.get_bool(ID_incomplete_class) &&
108+
(is_java_generic_class_type(pointer_subtype_struct) ||
109+
is_java_implicitly_generic_class_type(pointer_subtype_struct)))
107110
{
108-
PRECONDITION(
109-
is_java_generic_class_type(pointer_subtype_struct) ||
110-
is_java_implicitly_generic_class_type(pointer_subtype_struct));
111+
const java_generic_typet &generic_pointer =
112+
to_java_generic_type(pointer_type);
111113
const std::vector<java_generic_parametert> &generic_parameters =
112114
get_all_generic_parameters(pointer_subtype_struct);
113115

@@ -135,14 +137,19 @@ const void generic_parameter_specialization_map_keyst::insert_pairs_for_symbol(
135137
const symbol_typet &symbol_type,
136138
const typet &symbol_struct)
137139
{
138-
if(is_java_generic_symbol_type(symbol_type))
140+
// If the class is an incomplete class, don't treat the generics
141+
// TODO TG-1996 should treat generic incomplete (mocked) classes
142+
// Also do not treat generics is the class is not marked generic or
143+
// implicitly generic (this may be due to unsupported class signature)
144+
if(
145+
is_java_generic_symbol_type(symbol_type) &&
146+
!symbol_struct.get_bool(ID_incomplete_class) &&
147+
(is_java_generic_class_type(symbol_struct) ||
148+
is_java_implicitly_generic_class_type(symbol_struct)))
139149
{
140-
java_generic_symbol_typet generic_symbol =
150+
const java_generic_symbol_typet &generic_symbol =
141151
to_java_generic_symbol_type(symbol_type);
142152

143-
PRECONDITION(
144-
is_java_generic_class_type(symbol_struct) ||
145-
is_java_implicitly_generic_class_type(symbol_struct));
146153
const std::vector<java_generic_parametert> &generic_parameters =
147154
get_all_generic_parameters(symbol_struct);
148155

0 commit comments

Comments
 (0)