Handle not unique operators for user-defined type.

This commit is contained in:
wechman
2022-09-28 12:10:27 +02:00
parent 8272da0aea
commit 8307b670cb
4 changed files with 35 additions and 16 deletions
+12 -11
View File
@@ -1790,18 +1790,18 @@ void TypeChecker::endVisit(BinaryOperation const& _operation)
_operation.annotation().isConstant = false;
// Check if the operator is built-in or user-defined.
FunctionDefinition const* userDefinedOperator = leftType->userDefinedOperator(
FunctionDefinitionResult userDefinedOperatorResult = leftType->userDefinedOperator(
_operation.getOperator(),
*currentDefinitionScope(),
false // _unaryOperation
);
_operation.annotation().userDefinedFunction = userDefinedOperator;
_operation.annotation().userDefinedFunction = userDefinedOperatorResult;
FunctionType const* userDefinedFunctionType = nullptr;
if (userDefinedOperator)
if (userDefinedOperatorResult)
userDefinedFunctionType = &dynamic_cast<FunctionType const&>(
userDefinedOperator->libraryFunction() ?
*userDefinedOperator->typeViaContractName() :
*userDefinedOperator->type()
userDefinedOperatorResult.get()->libraryFunction() ?
*userDefinedOperatorResult.get()->typeViaContractName() :
*userDefinedOperatorResult.get()->type()
);
_operation.annotation().isPure =
*_operation.leftExpression().annotation().isPure &&
@@ -1812,9 +1812,9 @@ void TypeChecker::endVisit(BinaryOperation const& _operation)
Type const* commonType = leftType;
// Either the operator is user-defined or built-in.
solAssert(!userDefinedOperator || !builtinResult);
solAssert(!userDefinedOperatorResult || !builtinResult);
if (!builtinResult && !userDefinedOperator)
if (!builtinResult && !userDefinedOperatorResult)
m_errorReporter.typeError(
2271_error,
_operation.location(),
@@ -1824,12 +1824,13 @@ void TypeChecker::endVisit(BinaryOperation const& _operation)
leftType->humanReadableName() +
" and " +
rightType->humanReadableName() + "." +
(!builtinResult.message().empty() ? " " + builtinResult.message() : "")
(!builtinResult.message().empty() ? " " + builtinResult.message() : "") +
(!userDefinedOperatorResult.message().empty() ? " " + userDefinedOperatorResult.message() : "")
);
if (builtinResult)
commonType = builtinResult.get();
else if (userDefinedOperator)
else if (userDefinedOperatorResult)
{
solAssert(
userDefinedFunctionType->parameterTypes().size() == 2 &&
@@ -1845,7 +1846,7 @@ void TypeChecker::endVisit(BinaryOperation const& _operation)
TypeProvider::boolean() :
commonType;
if (userDefinedOperator)
if (userDefinedOperatorResult)
solAssert(
userDefinedFunctionType->returnParameterTypes().size() == 1 &&
*userDefinedFunctionType->returnParameterTypes().front() == *_operation.annotation().type