OperationAnnotation::userDefinedFunction can be set only once

This commit is contained in:
wechman
2022-09-28 13:09:13 +02:00
parent 59c8ec0e65
commit c507d24a78
8 changed files with 40 additions and 24 deletions
+5 -5
View File
@@ -65,7 +65,7 @@ bool ControlFlowBuilder::visit(BinaryOperation const& _operation)
case Token::And:
{
visitNode(_operation);
solAssert(!_operation.annotation().userDefinedFunction);
solAssert(!_operation.annotation().userDefinedFunction.set());
appendControlFlow(_operation.leftExpression());
auto nodes = splitFlow<2>();
@@ -75,13 +75,13 @@ bool ControlFlowBuilder::visit(BinaryOperation const& _operation)
}
default:
{
if (_operation.annotation().userDefinedFunction)
if (_operation.annotation().userDefinedFunction.set())
{
visitNode(_operation);
_operation.leftExpression().accept(*this);
_operation.rightExpression().accept(*this);
m_currentNode->functionDefinition = _operation.annotation().userDefinedFunction;
m_currentNode->functionDefinition = *_operation.annotation().userDefinedFunction;
auto nextNode = newLabel();
@@ -99,10 +99,10 @@ bool ControlFlowBuilder::visit(UnaryOperation const& _operation)
{
solAssert(!!m_currentNode);
if (_operation.annotation().userDefinedFunction)
if (_operation.annotation().userDefinedFunction.set())
{
visitNode(_operation);
m_currentNode->functionDefinition = _operation.annotation().userDefinedFunction;
m_currentNode->functionDefinition = *_operation.annotation().userDefinedFunction;
auto nextNode = newLabel();
+4 -4
View File
@@ -206,15 +206,15 @@ bool FunctionCallGraphBuilder::visit(MemberAccess const& _memberAccess)
bool FunctionCallGraphBuilder::visit(BinaryOperation const& _binaryOperation)
{
if (FunctionDefinition const* function = _binaryOperation.annotation().userDefinedFunction)
functionReferenced(*function, true /* called directly */);
if (_binaryOperation.annotation().userDefinedFunction.set())
functionReferenced(**_binaryOperation.annotation().userDefinedFunction, true /* called directly */);
return true;
}
bool FunctionCallGraphBuilder::visit(UnaryOperation const& _unaryOperation)
{
if (FunctionDefinition const* function = _unaryOperation.annotation().userDefinedFunction)
functionReferenced(*function, true /* called directly */);
if (_unaryOperation.annotation().userDefinedFunction.set())
functionReferenced(**_unaryOperation.annotation().userDefinedFunction, true /* called directly */);
return true;
}
+4 -2
View File
@@ -1736,7 +1736,8 @@ bool TypeChecker::visit(UnaryOperation const& _operation)
*currentDefinitionScope(),
true // _unaryOperation
);
_operation.annotation().userDefinedFunction = userDefinedOperatorResult;
if (userDefinedOperatorResult)
_operation.annotation().userDefinedFunction = userDefinedOperatorResult;
FunctionType const* userDefinedFunctionType = nullptr;
if (userDefinedOperatorResult)
userDefinedFunctionType = &dynamic_cast<FunctionType const&>(
@@ -1792,7 +1793,8 @@ void TypeChecker::endVisit(BinaryOperation const& _operation)
*currentDefinitionScope(),
false // _unaryOperation
);
_operation.annotation().userDefinedFunction = userDefinedOperatorResult;
if (userDefinedOperatorResult)
_operation.annotation().userDefinedFunction = userDefinedOperatorResult;
FunctionType const* userDefinedFunctionType = nullptr;
if (userDefinedOperatorResult)
userDefinedFunctionType = &dynamic_cast<FunctionType const&>(
+10 -4
View File
@@ -333,14 +333,20 @@ void ViewPureChecker::reportFunctionCallMutability(StateMutability _mutability,
void ViewPureChecker::endVisit(BinaryOperation const& _binaryOperation)
{
if (_binaryOperation.annotation().userDefinedFunction)
reportFunctionCallMutability(_binaryOperation.annotation().userDefinedFunction->stateMutability(), _binaryOperation.location());
if (_binaryOperation.annotation().userDefinedFunction.set())
{
solAssert(*_binaryOperation.annotation().userDefinedFunction);
reportFunctionCallMutability((*_binaryOperation.annotation().userDefinedFunction)->stateMutability(), _binaryOperation.location());
}
}
void ViewPureChecker::endVisit(UnaryOperation const& _unaryOperation)
{
if (_unaryOperation.annotation().userDefinedFunction)
reportFunctionCallMutability(_unaryOperation.annotation().userDefinedFunction->stateMutability(), _unaryOperation.location());
if (_unaryOperation.annotation().userDefinedFunction.set())
{
solAssert((*_unaryOperation.annotation().userDefinedFunction));
reportFunctionCallMutability((*_unaryOperation.annotation().userDefinedFunction)->stateMutability(), _unaryOperation.location());
}
}
void ViewPureChecker::endVisit(FunctionCall const& _functionCall)