Skip to content

Commit e50449d

Browse files
authored
Merge pull request diffblue#4279 from romainbrenguier/bugfix/bdd_as_expr
Bugfix in bdd::as_expr
2 parents 98f33a7 + e1fb6b7 commit e50449d

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

src/solvers/prop/bdd_expr.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,14 @@ exprt bdd_exprt::as_expr(const bdd_nodet &r, bool complement) const
119119
if(r.else_branch().is_complement() != complement)
120120
{
121121
return and_exprt(
122-
n_expr, as_expr(r.then_branch(), complement != r.is_complement()));
122+
n_expr,
123+
as_expr(
124+
r.then_branch(), complement != r.then_branch().is_complement()));
123125
}
124126
return or_exprt(
125127
not_exprt(n_expr),
126-
as_expr(r.then_branch(), complement != r.is_complement()));
128+
as_expr(
129+
r.then_branch(), complement != r.then_branch().is_complement()));
127130
}
128131
}
129132
else if(r.then_branch().is_constant())

unit/solvers/prop/bdd_expr.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,25 @@ SCENARIO("bdd_expr", "[core][solver][prop][bdd_expr]")
4444
REQUIRE(bdd.as_expr() == bdd2.as_expr());
4545
}
4646
}
47+
48+
GIVEN("A bdd for (a&!b)")
49+
{
50+
const symbol_exprt a("a", bool_typet());
51+
const symbol_exprt b("b", bool_typet());
52+
53+
bdd_exprt bdd{ns};
54+
bdd.from_expr(and_exprt(a, not_exprt(b)));
55+
56+
WHEN("It is converted to an exprt")
57+
{
58+
const exprt result = bdd.as_expr();
59+
THEN("It is equal to the expression (a & !b) or (!b & a)")
60+
{
61+
REQUIRE(result.id() == ID_and);
62+
REQUIRE(result.operands().size() == 2);
63+
REQUIRE((result.op0() == a || result.op1() == a));
64+
REQUIRE((result.op0() == not_exprt(b) || result.op1() == not_exprt(b)));
65+
}
66+
}
67+
}
4768
}

0 commit comments

Comments
 (0)