Skip to content

Commit 4fa4741

Browse files
committed
Make the simplifier preserve syntactically equal types
base_type_eq guarantees semantic equality, but the resulting expression should always have exactly the same type.
1 parent 37a8720 commit 4fa4741

File tree

3 files changed

+22
-4
lines changed

3 files changed

+22
-4
lines changed

src/util/simplify_expr.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,6 +1657,9 @@ bool simplify_exprt::simplify_byte_extract(byte_extract_exprt &expr)
16571657
if(base_type_eq(expr.type(), expr.op().op2().type(), ns))
16581658
{
16591659
exprt tmp=expr.op().op2();
1660+
// types are known to be semantically equivalent (via base_type_eq), make
1661+
// sure they are syntactically the same
1662+
tmp.type() = expr.type();
16601663
expr.swap(tmp);
16611664

16621665
return false;
@@ -1687,6 +1690,9 @@ bool simplify_exprt::simplify_byte_extract(byte_extract_exprt &expr)
16871690
if(base_type_eq(expr.type(), expr.op().type(), ns))
16881691
{
16891692
exprt tmp = expr.op();
1693+
// types are known to be semantically equivalent (via base_type_eq), make
1694+
// sure they are syntactically the same
1695+
tmp.type() = expr.type();
16901696
expr.swap(tmp);
16911697

16921698
return false;

src/util/simplify_expr_int.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -955,8 +955,13 @@ bool simplify_exprt::simplify_concatenation(exprt &expr)
955955
// { x } = x
956956
if(expr.operands().size()==1)
957957
{
958-
exprt tmp;
959-
tmp.swap(expr.op0());
958+
exprt tmp = expr.op0();
959+
if(expr.type() != tmp.type())
960+
{
961+
tmp.make_typecast(expr.type());
962+
simplify_node(tmp);
963+
}
964+
960965
expr.swap(tmp);
961966
result=false;
962967
}

src/util/simplify_expr_struct.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Author: Daniel Kroening, [email protected]
1111
#include "arith_tools.h"
1212
#include "base_type.h"
1313
#include "byte_operators.h"
14+
#include "invariant.h"
1415
#include "namespace.h"
1516
#include "pointer_offset_size.h"
1617
#include "std_expr.h"
@@ -134,8 +135,14 @@ bool simplify_exprt::simplify_member(exprt &expr)
134135
if(struct_type.has_component(component_name))
135136
{
136137
std::size_t number=struct_type.component_number(component_name);
137-
exprt tmp;
138-
tmp.swap(op.operands()[number]);
138+
exprt tmp = op.operands()[number];
139+
if(tmp.type() != expr.type())
140+
{
141+
DATA_INVARIANT(
142+
base_type_eq(tmp.type(), expr.type(), ns),
143+
"member expression type must match component type");
144+
tmp.type() = expr.type();
145+
}
139146
expr.swap(tmp);
140147
return false;
141148
}

0 commit comments

Comments
 (0)