mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Simplify Type::userDefinedOperator function
This commit is contained in:
@@ -1750,13 +1750,37 @@ bool TypeChecker::visit(UnaryOperation const& _operation)
|
||||
solAssert(!builtinResult || !userDefinedOperatorResult);
|
||||
if (userDefinedOperatorResult)
|
||||
{
|
||||
solAssert(userDefinedFunctionType->parameterTypes().size() == 1);
|
||||
solAssert(userDefinedFunctionType->returnParameterTypes().size() == 1);
|
||||
solAssert(
|
||||
*userDefinedFunctionType->parameterTypes().at(0) ==
|
||||
*userDefinedFunctionType->returnParameterTypes().at(0)
|
||||
);
|
||||
_operation.annotation().type = userDefinedFunctionType->returnParameterTypes().at(0);
|
||||
if (userDefinedFunctionType->returnParameterTypes().size() != 1)
|
||||
{
|
||||
m_errorReporter.typeError(
|
||||
3138_error,
|
||||
_operation.location(),
|
||||
"User defined operator " + string(TokenTraits::toString(_operation.getOperator())) +
|
||||
" needs to return exactly one value."
|
||||
);
|
||||
_operation.annotation().type = subExprType;
|
||||
}
|
||||
else if (*userDefinedFunctionType->returnParameterTypes().front() != *userDefinedFunctionType->parameterTypes().front())
|
||||
{
|
||||
m_errorReporter.typeError(
|
||||
7983_error,
|
||||
_operation.location(),
|
||||
"User defined operator " + string(TokenTraits::toString(_operation.getOperator())) +
|
||||
" needs to return value of type " +
|
||||
userDefinedFunctionType->parameterTypes().front()->humanReadableName() + "."
|
||||
);
|
||||
_operation.annotation().type = subExprType;
|
||||
}
|
||||
else
|
||||
{
|
||||
solAssert(userDefinedFunctionType->parameterTypes().size() == 1);
|
||||
solAssert(
|
||||
*userDefinedFunctionType->parameterTypes().at(0) ==
|
||||
*userDefinedFunctionType->returnParameterTypes().at(0)
|
||||
);
|
||||
_operation.annotation().type = userDefinedFunctionType->returnParameterTypes().at(0);
|
||||
}
|
||||
|
||||
}
|
||||
else if (builtinResult)
|
||||
_operation.annotation().type = builtinResult;
|
||||
@@ -1840,7 +1864,8 @@ void TypeChecker::endVisit(BinaryOperation const& _operation)
|
||||
*userDefinedFunctionType->parameterTypes().at(0) ==
|
||||
*userDefinedFunctionType->parameterTypes().at(1)
|
||||
);
|
||||
commonType = userDefinedFunctionType->returnParameterTypes().at(0);
|
||||
if (userDefinedFunctionType->returnParameterTypes().size() == 1)
|
||||
commonType = userDefinedFunctionType->parameterTypes().at(0);
|
||||
}
|
||||
|
||||
_operation.annotation().commonType = commonType;
|
||||
@@ -1850,11 +1875,24 @@ void TypeChecker::endVisit(BinaryOperation const& _operation)
|
||||
commonType;
|
||||
|
||||
if (userDefinedOperatorResult)
|
||||
solAssert(
|
||||
userDefinedFunctionType->returnParameterTypes().size() == 1 &&
|
||||
*userDefinedFunctionType->returnParameterTypes().front() == *_operation.annotation().type,
|
||||
"User defined operator has an invalid return parameter."
|
||||
);
|
||||
{
|
||||
if (userDefinedFunctionType->returnParameterTypes().size() != 1)
|
||||
m_errorReporter.typeError(
|
||||
1208_error,
|
||||
_operation.location(),
|
||||
"User defined operator " + string(TokenTraits::toString(_operation.getOperator())) +
|
||||
" needs to return exactly one value."
|
||||
);
|
||||
|
||||
else if (*userDefinedFunctionType->returnParameterTypes().front() != *_operation.annotation().type)
|
||||
m_errorReporter.typeError(
|
||||
3841_error,
|
||||
_operation.location(),
|
||||
"User defined operator " + string(TokenTraits::toString(_operation.getOperator())) +
|
||||
" needs to return value of type " +
|
||||
_operation.annotation().type->humanReadableName() + "."
|
||||
);
|
||||
}
|
||||
else if (_operation.getOperator() == Token::Exp || _operation.getOperator() == Token::SHL)
|
||||
{
|
||||
string operation = _operation.getOperator() == Token::Exp ? "exponentiation" : "shift";
|
||||
|
||||
@@ -404,14 +404,8 @@ Result<FunctionDefinition const*> Type::userDefinedOperator(Token _token, ASTNod
|
||||
);
|
||||
solAssert(functionType && !functionType->parameterTypes().empty());
|
||||
|
||||
Type const* expectedReturnType =
|
||||
TokenTraits::isCompareOp(_token) ?
|
||||
TypeProvider::boolean() : functionType->parameterTypes().front();
|
||||
|
||||
if (
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user