@@ -234,13 +234,13 @@ static void infer_opaque_type_fields(
234
234
instruction.statement == " putfield" )
235
235
{
236
236
const exprt &fieldref = instruction.args [0 ];
237
- const symbolt *class_symbol =
238
- symbol_table.lookup (fieldref. get (ID_class) );
237
+ irep_idt class_symbol_id = fieldref. get (ID_class);
238
+ const symbolt *class_symbol = symbol_table.lookup (class_symbol_id );
239
239
INVARIANT (
240
- class_symbol != nullptr , " all field types should have been loaded" );
240
+ class_symbol != nullptr ,
241
+ " all types containing fields should have been loaded" );
241
242
242
243
const class_typet *class_type = &to_class_type (class_symbol->type );
243
- irep_idt class_symbol_id = fieldref.get (ID_class);
244
244
const irep_idt &component_name = fieldref.get (ID_component_name);
245
245
while (!class_type->has_component (component_name))
246
246
{
@@ -249,22 +249,24 @@ static void infer_opaque_type_fields(
249
249
// Accessing a field of an incomplete (opaque) type.
250
250
symbolt &writable_class_symbol =
251
251
symbol_table.get_writeable_ref (class_symbol_id);
252
- auto &add_to_components =
252
+ auto &components =
253
253
to_struct_type (writable_class_symbol.type ).components ();
254
- add_to_components.push_back (
255
- struct_typet::componentt (component_name, fieldref.type ()));
256
- add_to_components.back ().set_base_name (component_name);
257
- add_to_components.back ().set_pretty_name (component_name);
254
+ components.emplace_back (component_name, fieldref.type ());
255
+ components.back ().set_base_name (component_name);
256
+ components.back ().set_pretty_name (component_name);
258
257
break ;
259
258
}
260
259
else
261
260
{
262
261
// Not present here: check the superclass.
263
262
INVARIANT (
264
- class_type->bases ().size () != 0 ,
265
- " class missing an expected field should have a superclass" );
263
+ !class_type->bases ().empty (),
264
+ " class '" + id2string (class_symbol->name )
265
+ + " ' (which was missing a field '" + id2string (component_name)
266
+ + " ' referenced from method '" + id2string (method.name )
267
+ + " ') should have an opaque superclass" );
266
268
const symbol_typet &superclass_type =
267
- to_symbol_type (class_type->bases ()[ 0 ] .type ());
269
+ to_symbol_type (class_type->bases (). front () .type ());
268
270
class_symbol_id = superclass_type.get_identifier ();
269
271
class_type = &to_class_type (ns.follow (superclass_type));
270
272
}
0 commit comments