mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Type::userDefinedOperator takes return parameters into account
This commit is contained in:
@@ -1849,7 +1849,8 @@ void TypeChecker::endVisit(BinaryOperation const& _operation)
|
||||
if (userDefinedOperatorResult)
|
||||
solAssert(
|
||||
userDefinedFunctionType->returnParameterTypes().size() == 1 &&
|
||||
*userDefinedFunctionType->returnParameterTypes().front() == *_operation.annotation().type
|
||||
*userDefinedFunctionType->returnParameterTypes().front() == *_operation.annotation().type,
|
||||
"User defined operator has an invalid return parameter."
|
||||
);
|
||||
else if (_operation.getOperator() == Token::Exp || _operation.getOperator() == Token::SHL)
|
||||
{
|
||||
|
||||
@@ -404,10 +404,19 @@ Result<FunctionDefinition const*> Type::userDefinedOperator(Token _token, ASTNod
|
||||
function.libraryFunction() ? function.typeViaContractName() : function.type()
|
||||
);
|
||||
solAssert(functionType && !functionType->parameterTypes().empty());
|
||||
solAssert(isImplicitlyConvertibleTo(*functionType->parameterTypes().front()));
|
||||
|
||||
Type const* expectedReturnType =
|
||||
TokenTraits::isCompareOp(_token) ?
|
||||
TypeProvider::boolean() : functionType->parameterTypes().front();
|
||||
|
||||
if (
|
||||
(_unaryOperation && function.parameterList().parameters().size() == 1) ||
|
||||
(!_unaryOperation && function.parameterList().parameters().size() == 2)
|
||||
isImplicitlyConvertibleTo(*functionType->parameterTypes().front()) &&
|
||||
function.returnParameterList()->parameters().size() == 1 &&
|
||||
function.returnParameterList()->parameters().front()->type()->isImplicitlyConvertibleTo(*expectedReturnType) &&
|
||||
(
|
||||
(_unaryOperation && function.parameterList().parameters().size() == 1) ||
|
||||
(!_unaryOperation && function.parameterList().parameters().size() == 2)
|
||||
)
|
||||
)
|
||||
seenFunctions.insert(&function);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user