@@ -299,6 +299,7 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
299
299
}
300
300
301
301
if (!found)
302
+ if (struct_symbol->symbol_expr ().type ().id () == ID_array)
302
303
{
303
304
const typet target_type = expr.type ().subtype ();
304
305
@@ -323,15 +324,21 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
323
324
324
325
const auto maybe_member_expr = get_subexpression_at_offset (
325
326
struct_symbol->second , member_offset, expr.type ().subtype (), ns);
326
- CHECK_RETURN (maybe_member_expr.has_value ());
327
- return *maybe_member_expr;
327
+ if (maybe_member_expr.has_value ())
328
+ return *maybe_member_expr;
329
+ UNREACHABLE;
330
+ return index_exprt{
331
+ struct_symbol->symbol_expr (),
332
+ from_integer (
333
+ member_offset / get_type_size (expr.type ().subtype ()), index_type ())};
328
334
}
329
335
330
336
const auto it = values.find (memory_location);
331
337
// if the structure we are pointing to does not exists we need to build a
332
338
// temporary object for it: get the type from symbol table, query gdb for
333
339
// value, allocate new object for it and then store into assignments
334
340
if (it == values.end ())
341
+ if (struct_symbol->symbol_expr ().type ().id () == ID_pointer)
335
342
{
336
343
const auto symbol_expr = struct_symbol->symbol_expr ();
337
344
const auto zero = zero_initializer (symbol_expr.type (), location, ns);
@@ -347,6 +354,10 @@ exprt gdb_value_extractort::get_pointer_to_member_value(
347
354
348
355
add_assignment (new_symbol, val);
349
356
values[memory_location] = val;
357
+ return dereference_exprt{
358
+ plus_exprt{struct_symbol->symbol_expr (),
359
+ from_integer (member_offset, size_type ()),
360
+ expr.type ()}};
350
361
}
351
362
352
363
const auto maybe_member_expr = get_subexpression_at_offset (
0 commit comments