mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
[SMTChecker] Fix ICEs with tuples
This commit is contained in:
@@ -407,19 +407,26 @@ void SMTEncoder::endVisit(TupleExpression const& _tuple)
|
||||
auto const& symbTuple = dynamic_pointer_cast<smt::SymbolicTupleVariable>(m_context.expression(_tuple));
|
||||
solAssert(symbTuple, "");
|
||||
auto const& symbComponents = symbTuple->components();
|
||||
auto const& tupleComponents = _tuple.components();
|
||||
solAssert(symbComponents.size() == _tuple.components().size(), "");
|
||||
auto const* tupleComponents = &_tuple.components();
|
||||
while (tupleComponents->size() == 1)
|
||||
{
|
||||
auto innerTuple = dynamic_pointer_cast<TupleExpression>(tupleComponents->front());
|
||||
solAssert(innerTuple, "");
|
||||
tupleComponents = &innerTuple->components();
|
||||
}
|
||||
solAssert(symbComponents.size() == tupleComponents->size(), "");
|
||||
for (unsigned i = 0; i < symbComponents.size(); ++i)
|
||||
{
|
||||
auto sComponent = symbComponents.at(i);
|
||||
auto tComponent = tupleComponents.at(i);
|
||||
auto tComponent = tupleComponents->at(i);
|
||||
if (sComponent && tComponent)
|
||||
{
|
||||
if (auto varDecl = identifierToVariable(*tComponent))
|
||||
m_context.addAssertion(sComponent->currentValue() == currentValue(*varDecl));
|
||||
else
|
||||
{
|
||||
solAssert(m_context.knownExpression(*tComponent), "");
|
||||
if (!m_context.knownExpression(*tComponent))
|
||||
createExpr(*tComponent);
|
||||
m_context.addAssertion(sComponent->currentValue() == expr(*tComponent));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user