Fix visitation order bug for structural simplifier.

This commit is contained in:
chriseth 2019-03-06 19:26:26 +01:00
parent 281c04cb10
commit 21115f8050
4 changed files with 24 additions and 7 deletions

View File

@ -12,6 +12,7 @@ Compiler Features:
Bugfixes:
* Type system: Detect if a contract's base uses types that require the experimental abi encoder while the contract still uses the old encoder
* Yul Optimizer: Fix visitation order bug for the structural simplifier.
Build System:

View File

@ -104,10 +104,12 @@ OptionalStatements reduceSingleCaseSwitch(Switch& _switchStmt)
s->emplace_back(If{
std::move(_switchStmt.location),
make_unique<Expression>(FunctionalInstruction{
std::move(loc),
solidity::Instruction::EQ,
{std::move(*switchCase.value), std::move(*_switchStmt.expression)}
}), std::move(switchCase.body)});
std::move(loc),
solidity::Instruction::EQ,
{std::move(*switchCase.value), std::move(*_switchStmt.expression)}
}),
std::move(switchCase.body)
});
return s;
}
else
@ -202,10 +204,11 @@ void StructuralSimplifier::simplify(std::vector<yul::Statement>& _statements)
_statements,
[&](Statement& _stmt) -> OptionalStatements
{
visit(_stmt);
OptionalStatements result = boost::apply_visitor(visitor, _stmt);
if (result)
simplify(*result);
else
visit(_stmt);
return result;
}
);

View File

@ -0,0 +1,13 @@
{
// This tests that a bug is fixed where x := 1 was wrongfully
// taken into account before actually visiting the if statement.
let x := 0
if x {
x := 1
}
}
// ----
// structuralSimplifier
// {
// let x := 0
// }

View File

@ -1,6 +1,6 @@
{
let y := 200
switch y
switch calldataload(0)
case 0 { }
case 1 { y := 9 }
default { y := 100 }
@ -9,7 +9,7 @@
// structuralSimplifier
// {
// let y := 200
// switch y
// switch calldataload(0)
// case 0 {
// }
// case 1 {