mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Check for matching number of components in TupleType::isImplicitlyConvertibleTo instead of the TypeChecker.
This commit is contained in:
parent
f6edb7fb8f
commit
ece9afef8f
@ -1337,7 +1337,6 @@ bool TypeChecker::visit(Conditional const& _conditional)
|
|||||||
|
|
||||||
bool TypeChecker::visit(Assignment const& _assignment)
|
bool TypeChecker::visit(Assignment const& _assignment)
|
||||||
{
|
{
|
||||||
bool const v050 = m_scope->sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::V050);
|
|
||||||
requireLValue(_assignment.leftHandSide());
|
requireLValue(_assignment.leftHandSide());
|
||||||
TypePointer t = type(_assignment.leftHandSide());
|
TypePointer t = type(_assignment.leftHandSide());
|
||||||
_assignment.annotation().type = t;
|
_assignment.annotation().type = t;
|
||||||
@ -1354,25 +1353,8 @@ bool TypeChecker::visit(Assignment const& _assignment)
|
|||||||
expectType(_assignment.rightHandSide(), *tupleType);
|
expectType(_assignment.rightHandSide(), *tupleType);
|
||||||
|
|
||||||
// expectType does not cause fatal errors, so we have to check again here.
|
// expectType does not cause fatal errors, so we have to check again here.
|
||||||
if (TupleType const* rhsType = dynamic_cast<TupleType const*>(type(_assignment.rightHandSide()).get()))
|
if (dynamic_cast<TupleType const*>(type(_assignment.rightHandSide()).get()))
|
||||||
{
|
|
||||||
checkDoubleStorageAssignment(_assignment);
|
checkDoubleStorageAssignment(_assignment);
|
||||||
// @todo For 0.5.0, this code shoud move to TupleType::isImplicitlyConvertibleTo,
|
|
||||||
// but we cannot do it right now.
|
|
||||||
if (rhsType->components().size() != tupleType->components().size())
|
|
||||||
{
|
|
||||||
string message =
|
|
||||||
"Different number of components on the left hand side (" +
|
|
||||||
toString(tupleType->components().size()) +
|
|
||||||
") than on the right hand side (" +
|
|
||||||
toString(rhsType->components().size()) +
|
|
||||||
").";
|
|
||||||
if (v050)
|
|
||||||
m_errorReporter.typeError(_assignment.location(), message);
|
|
||||||
else
|
|
||||||
m_errorReporter.warning(_assignment.location(), message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (t->category() == Type::Category::Mapping)
|
else if (t->category() == Type::Category::Mapping)
|
||||||
{
|
{
|
||||||
|
@ -2238,25 +2238,13 @@ bool TupleType::isImplicitlyConvertibleTo(Type const& _other) const
|
|||||||
TypePointers const& targets = tupleType->components();
|
TypePointers const& targets = tupleType->components();
|
||||||
if (targets.empty())
|
if (targets.empty())
|
||||||
return components().empty();
|
return components().empty();
|
||||||
if (components().size() != targets.size() && !targets.front() && !targets.back())
|
if (components().size() != targets.size())
|
||||||
return false; // (,a,) = (1,2,3,4) - unable to position `a` in the tuple.
|
|
||||||
size_t minNumValues = targets.size();
|
|
||||||
if (!targets.back() || !targets.front())
|
|
||||||
--minNumValues; // wildcards can also match 0 components
|
|
||||||
if (components().size() < minNumValues)
|
|
||||||
return false;
|
return false;
|
||||||
if (components().size() > targets.size() && targets.front() && targets.back())
|
for (size_t i = 0; i < targets.size(); ++i)
|
||||||
return false; // larger source and no wildcard
|
if (!components()[i] && targets[i])
|
||||||
bool fillRight = !targets.back() || targets.front();
|
|
||||||
for (size_t i = 0; i < min(targets.size(), components().size()); ++i)
|
|
||||||
{
|
|
||||||
auto const& s = components()[fillRight ? i : components().size() - i - 1];
|
|
||||||
auto const& t = targets[fillRight ? i : targets.size() - i - 1];
|
|
||||||
if (!s && t)
|
|
||||||
return false;
|
return false;
|
||||||
else if (s && t && !s->isImplicitlyConvertibleTo(*t))
|
else if (components()[i] && targets[i] && !components()[i]->isImplicitlyConvertibleTo(*targets[i]))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user