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
+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);
}