Skip to content

Commit 4b4bbb8

Browse files
author
Daniel Kroening
committed
Merge pull request #33 from tautschnig/object-descriptor-build-fixes
Object descriptor should skip typecasts
2 parents 0a7971e + 03c1b41 commit 4b4bbb8

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

src/util/std_expr.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,20 +125,15 @@ static void build_object_descriptor_rec(
125125
{
126126
const member_exprt &member=to_member_expr(expr);
127127
const exprt &struct_op=member.struct_op();
128-
const typet &struct_type=ns.follow(struct_op.type());
129128

130129
build_object_descriptor_rec(ns, struct_op, dest);
131130

132-
if(struct_type.id()==ID_union)
133-
return;
134-
135-
mp_integer offset=
136-
member_offset(to_struct_type(struct_type),
137-
member.get_component_name(), ns);
138-
assert(offset>=0);
131+
exprt offset=member_offset_expr(member, ns);
132+
assert(offset.is_not_nil());
139133

140134
dest.offset()=
141-
plus_exprt(dest.offset(), from_integer(offset, index_type));
135+
plus_exprt(dest.offset(),
136+
typecast_exprt(offset, index_type));
142137
}
143138
else if(expr.id()==ID_byte_extract_little_endian ||
144139
expr.id()==ID_byte_extract_big_endian)
@@ -154,6 +149,14 @@ static void build_object_descriptor_rec(
154149
typecast_exprt(to_byte_extract_expr(expr).offset(),
155150
index_type));
156151
}
152+
else if(expr.id()==ID_typecast)
153+
{
154+
const typecast_exprt &tc=to_typecast_expr(expr);
155+
156+
dest.object()=tc.op();
157+
158+
build_object_descriptor_rec(ns, tc.op(), dest);
159+
}
157160
}
158161

159162
/*******************************************************************\

0 commit comments

Comments
 (0)