diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 1d30881c6..6f0ab28b1 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -1322,14 +1322,16 @@ void TypeChecker::checkExpressionAssignment(Type const& _type, Expression const& { if (auto const* tupleExpression = dynamic_cast(&_expression)) { - if (auto const* tupleType = dynamic_cast(&_type)) - { - for (size_t i = 0; i < min(tupleExpression->components().size(), tupleType->components().size()); i++) - if (tupleType->components()[i] && tupleExpression->components()[i]) - checkExpressionAssignment(*tupleType->components()[i], *tupleExpression->components()[i]); - } - else if (!tupleExpression->components().empty()) - checkExpressionAssignment(_type, *tupleExpression->components().front()); + auto const* tupleType = dynamic_cast(&_type); + auto const& types = tupleType ? tupleType->components() : vector { _type.shared_from_this() }; + + solAssert(tupleExpression->components().size() == types.size(), ""); + for (size_t i = 0; i < types.size(); i++) + if (types[i]) + { + solAssert(!!tupleExpression->components()[i], ""); + checkExpressionAssignment(*types[i], *tupleExpression->components()[i]); + } } else if (_type.category() == Type::Category::Mapping) {