@@ -29,7 +29,8 @@ void replace_symbolt::insert(
2929
3030bool replace_symbolt::replace (
3131 exprt &dest,
32- const bool replace_with_const) const
32+ const bool replace_with_const,
33+ const bool ignore_type_change) const
3334{
3435 bool result=true ; // unchanged
3536
@@ -49,14 +50,16 @@ bool replace_symbolt::replace(
4950 {
5051 member_exprt &me=to_member_expr (dest);
5152
52- if (!replace (me.struct_op (), replace_with_const)) // Could give non l-value.
53+ // Could yield non l-value.
54+ if (!replace (me.struct_op (), replace_with_const, ignore_type_change))
5355 result=false ;
5456 }
5557 else if (dest.id ()==ID_index)
5658 {
5759 index_exprt &ie=to_index_expr (dest);
5860
59- if (!replace (ie.array (), replace_with_const)) // Could give non l-value.
61+ // Could yield non l-value.
62+ if (!replace (ie.array (), replace_with_const, ignore_type_change))
6063 result=false ;
6164
6265 if (!replace (ie.index ()))
@@ -66,7 +69,7 @@ bool replace_symbolt::replace(
6669 {
6770 address_of_exprt &aoe=to_address_of_expr (dest);
6871
69- if (!replace (aoe.object (), false ))
72+ if (!replace (aoe.object (), false , ignore_type_change ))
7073 result=false ;
7174 }
7275 else if (dest.id ()==ID_symbol)
@@ -83,15 +86,22 @@ bool replace_symbolt::replace(
8386 if (!replace_with_const && e.is_constant ()) // Would give non l-value.
8487 return true ;
8588
86- dest=e;
89+ if (ignore_type_change || dest.type () == e.type ())
90+ dest = e;
91+ else
92+ {
93+ typet type = dest.type ();
94+ dest = e;
95+ dest.make_typecast (type);
96+ }
8797
8898 return false ;
8999 }
90100 }
91101 else
92102 {
93103 Forall_operands (it, dest)
94- if (!replace (*it))
104+ if (!replace (*it, true , ignore_type_change ))
95105 result=false ;
96106 }
97107
0 commit comments