Type::userDefinedOperator takes return parameters into account

This commit is contained in:
wechman
2022-09-28 13:06:25 +02:00
parent e8243d49bc
commit fee6b5f96c
5 changed files with 96 additions and 43 deletions
+2 -1
View File
@@ -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)
{
+12 -3
View File
@@ -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);
}