mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Library function can be used as user operator
This commit is contained in:
parent
7d12eb5745
commit
e8243d49bc
@ -413,7 +413,10 @@ bool ExpressionCompiler::visit(UnaryOperation const& _unaryOperation)
|
|||||||
|
|
||||||
if (FunctionDefinition const* function = _unaryOperation.annotation().userDefinedFunction)
|
if (FunctionDefinition const* function = _unaryOperation.annotation().userDefinedFunction)
|
||||||
{
|
{
|
||||||
solAssert(function->isFree(), "Only free functions can be bound to a user type operator.");
|
solAssert(
|
||||||
|
function->isFree() || function->libraryFunction(),
|
||||||
|
"Only file-level functions and library functions can be bound to a user type operator."
|
||||||
|
);
|
||||||
|
|
||||||
FunctionType const* functionType = dynamic_cast<FunctionType const*>(
|
FunctionType const* functionType = dynamic_cast<FunctionType const*>(
|
||||||
function->libraryFunction() ? function->typeViaContractName() : function->type()
|
function->libraryFunction() ? function->typeViaContractName() : function->type()
|
||||||
@ -537,7 +540,10 @@ bool ExpressionCompiler::visit(BinaryOperation const& _binaryOperation)
|
|||||||
Expression const& rightExpression = _binaryOperation.rightExpression();
|
Expression const& rightExpression = _binaryOperation.rightExpression();
|
||||||
if (FunctionDefinition const* function =_binaryOperation.annotation().userDefinedFunction)
|
if (FunctionDefinition const* function =_binaryOperation.annotation().userDefinedFunction)
|
||||||
{
|
{
|
||||||
solAssert(function->isFree(), "Only free function can be bound to a user type operator.");
|
solAssert(
|
||||||
|
function->isFree() || function->libraryFunction(),
|
||||||
|
"Only file-level functions and library functions can be bound to a user type operator."
|
||||||
|
);
|
||||||
FunctionType const* functionType = dynamic_cast<FunctionType const*>(
|
FunctionType const* functionType = dynamic_cast<FunctionType const*>(
|
||||||
function->libraryFunction() ? function->typeViaContractName() : function->type()
|
function->libraryFunction() ? function->typeViaContractName() : function->type()
|
||||||
);
|
);
|
||||||
|
@ -679,7 +679,7 @@ bool IRGeneratorForStatements::visit(UnaryOperation const& _unaryOperation)
|
|||||||
setLocation(_unaryOperation);
|
setLocation(_unaryOperation);
|
||||||
|
|
||||||
solAssert(
|
solAssert(
|
||||||
dynamic_cast<SourceUnit const*>(function->scope()),
|
function->isFree() || function->libraryFunction(),
|
||||||
"Only file-level functions and library functions can be bound to a user type operator."
|
"Only file-level functions and library functions can be bound to a user type operator."
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -824,7 +824,7 @@ bool IRGeneratorForStatements::visit(BinaryOperation const& _binOp)
|
|||||||
setLocation(_binOp);
|
setLocation(_binOp);
|
||||||
|
|
||||||
solAssert(
|
solAssert(
|
||||||
dynamic_cast<SourceUnit const*>(function->scope()),
|
function->isFree() || function->libraryFunction(),
|
||||||
"Only file-level functions and library functions can be bound to a user type operator."
|
"Only file-level functions and library functions can be bound to a user type operator."
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -0,0 +1,33 @@
|
|||||||
|
==== Source: a.sol ====
|
||||||
|
library L {
|
||||||
|
type Int is int128;
|
||||||
|
|
||||||
|
function add(Int, Int) pure public returns (Int) {
|
||||||
|
return Int.wrap(7);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sub(Int) pure public returns (Int) {
|
||||||
|
return Int.wrap(5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
==== Source: b.sol ====
|
||||||
|
import "a.sol" as a;
|
||||||
|
|
||||||
|
contract C {
|
||||||
|
using {a.L.add as +} for a.L.Int;
|
||||||
|
using {a.L.sub as -} for a.L.Int;
|
||||||
|
|
||||||
|
function f() pure public returns (a.L.Int) {
|
||||||
|
return a.L.Int.wrap(0) + a.L.Int.wrap(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function g() pure public returns (a.L.Int) {
|
||||||
|
return - a.L.Int.wrap(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ====
|
||||||
|
// compileViaYul: also
|
||||||
|
// ----
|
||||||
|
// f() -> 7
|
||||||
|
// g() -> 5
|
Loading…
Reference in New Issue
Block a user