Implement overridding of functions by public variables

This commit is contained in:
Mathias Baumann
2019-12-05 12:48:52 +00:00
committed by Mathias Baumann
parent 52467108ac
commit b7d5de59c5
31 changed files with 285 additions and 68 deletions
@@ -0,0 +1,19 @@
contract A
{
function test() external virtual returns (uint256)
{
return 5;
}
}
contract X is A
{
uint256 public override test;
function set() public { test = 2; }
}
// ----
// test() -> 0
// set() ->
// test() -> 2
@@ -1,2 +1,2 @@
interface ERC20 { function x() external returns (uint); }
contract C is ERC20 { uint public x; }
contract C is ERC20 { uint public override x; }
@@ -1,6 +1,6 @@
interface X { function test() external returns (uint256); }
contract Y is X {
uint256 public test = 42;
uint256 public override test = 42;
}
contract T {
constructor() public { new Y(); }
@@ -1,9 +1,9 @@
abstract contract X { function test() internal virtual returns (uint256); }
contract Y is X {
uint256 public test = 42;
uint256 public override test = 42;
}
contract T {
constructor() public { new Y(); }
}
// ----
// DeclarationError: (98-122): Identifier already declared.
// TypeError: (98-131): Public state variables can only override functions with external visibility.
@@ -1,8 +1,10 @@
abstract contract X { function test() private returns (uint256) {} }
abstract contract X { function test() private virtual returns (uint256); }
contract Y is X {
uint256 public test = 42;
uint256 public override test = 42;
}
contract T {
constructor() public { new Y(); }
}
// ----
// TypeError: (97-130): Public state variables can only override functions with external visibility.
// TypeError: (22-72): "virtual" and "private" cannot be used together.
@@ -1,9 +1,8 @@
abstract contract X { function test() public virtual returns (uint256); }
abstract contract X { function test() external virtual returns (uint256); }
contract Y is X {
uint256 public test = 42;
uint256 public override test = 42;
}
contract T {
constructor() public { new Y(); }
}
// ----
// DeclarationError: (96-120): Identifier already declared.
@@ -1,12 +1,9 @@
abstract contract A {
int public testvar;
function test() internal virtual returns (uint256);
function test2() internal virtual returns (uint256);
}
contract X is A {
int public override testvar;
function test() internal override returns (uint256) {}
function test2() internal override(A) returns (uint256) {}
}
// ----
// DeclarationError: (171-198): Identifier already declared.
@@ -1,5 +1,4 @@
abstract contract A {
int public testvar;
function foo() internal virtual returns (uint256);
}
abstract contract B {
@@ -7,9 +6,7 @@ abstract contract B {
function test() internal virtual returns (uint256);
}
abstract contract X is A, B {
int public override testvar;
function test() internal override returns (uint256) {}
}
// ----
// DeclarationError: (257-284): Identifier already declared.
// TypeError: (226-343): Derived contract must override function "foo". Function with the same name and parameter types defined in two or more base classes.
// TypeError: (205-292): Derived contract must override function "foo". Function with the same name and parameter types defined in two or more base classes.
@@ -13,7 +13,6 @@ abstract contract D {
function foo() internal virtual returns (uint256);
}
contract X is A, B, C, D {
int public override testvar;
function test() internal override returns (uint256) {}
function foo() internal override(A, B, C, D) returns (uint256) {}
}
@@ -1,5 +1,4 @@
abstract contract A {
int public testvar;
function foo() internal virtual returns (uint256);
function test(uint8 _a) internal virtual returns (uint256);
}
@@ -15,13 +14,11 @@ abstract contract D {
function test() internal virtual returns (uint256);
}
abstract contract X is A, B, C, D {
int public override testvar;
function test() internal override(B, D, D) virtual returns (uint256);
function foo() internal override(A, C, B, B, B, D ,D) virtual returns (uint256);
}
// ----
// DeclarationError: (529-556): Identifier already declared.
// TypeError: (599-600): Duplicate contract "D" found in override list of "test".
// TypeError: (672-673): Duplicate contract "B" found in override list of "foo".
// TypeError: (675-676): Duplicate contract "B" found in override list of "foo".
// TypeError: (681-682): Duplicate contract "D" found in override list of "foo".
// TypeError: (548-549): Duplicate contract "D" found in override list of "test".
// TypeError: (621-622): Duplicate contract "B" found in override list of "foo".
// TypeError: (624-625): Duplicate contract "B" found in override list of "foo".
// TypeError: (630-631): Duplicate contract "D" found in override list of "foo".
@@ -14,10 +14,9 @@ abstract contract D {
function test() internal virtual returns (uint256);
}
abstract contract X is A, B, C, D {
int public override testvar;
function test() internal override(B, D, C) virtual returns (uint256);
function foo() internal override(A, C) virtual returns (uint256);
}
// ----
// TypeError: (563-580): Invalid contract specified in override list: C.
// TypeError: (633-647): Function needs to specify overridden contracts B and D.
// TypeError: (533-550): Invalid contract specified in override list: C.
// TypeError: (603-617): Function needs to specify overridden contracts B and D.
@@ -0,0 +1,9 @@
abstract contract A {
int public testvar;
}
abstract contract X is A {
int public override testvar;
}
// ----
// DeclarationError: (73-100): Identifier already declared.
// TypeError: (84-92): Public state variable has override specified but does not override anything.
@@ -6,8 +6,7 @@ abstract contract B {
function test() internal virtual returns (uint256);
}
abstract contract X is A, B {
int public override testvar;
function test() internal override virtual returns (uint256);
}
// ----
// TypeError: (203-326): Derived contract must override function "foo". Function with the same name and parameter types defined in two or more base classes.
// TypeError: (203-296): Derived contract must override function "foo". Function with the same name and parameter types defined in two or more base classes.
@@ -16,10 +16,9 @@ abstract contract X is A, B, C, D {
struct MyStruct { int abc; }
enum ENUM { F,G,H }
int public override testvar;
function test() internal override virtual returns (uint256);
function foo() internal override(MyStruct, ENUM, A, B, C, D) virtual returns (uint256);
}
// ----
// TypeError: (632-640): Expected contract but got struct X.MyStruct.
// TypeError: (642-646): Expected contract but got enum X.ENUM.
// TypeError: (602-610): Expected contract but got struct X.MyStruct.
// TypeError: (612-616): Expected contract but got enum X.ENUM.
@@ -0,0 +1,8 @@
contract A {
function foo() internal virtual pure returns(uint) { return 5; }
}
contract X is A {
uint public foo;
}
// ----
// TypeError: (100-115): Public state variables can only override functions with external visibility.
@@ -0,0 +1,7 @@
contract A {
function foo(uint) internal virtual pure returns(uint) { return 5; }
}
contract X is A {
uint public foo;
}
// ----
@@ -0,0 +1,11 @@
contract A {
function foo() external virtual pure returns(uint) { return 5; }
}
contract B {
function foo() external virtual pure returns(uint) { return 5; }
}
contract X is A, B {
uint public override foo;
}
// ----
// TypeError: (162-211): Derived contract must override function "foo". Function with the same name and parameter types defined in two or more base classes.
@@ -0,0 +1,11 @@
contract A {
uint public foo;
}
contract B {
function foo() external virtual pure returns(uint) { return 5; }
}
contract X is A, B {
uint public override foo;
}
// ----
// DeclarationError: (136-160): Identifier already declared.
@@ -0,0 +1,9 @@
contract A {
function foo() external virtual pure returns(uint) { return 4; }
function foo(uint ) external virtual pure returns(uint) { return 4; }
function foo(uint , uint ) external pure virtual returns(A) { }
}
contract X is A {
uint public override foo;
}
// ----
@@ -0,0 +1,10 @@
contract A {
function foo() external virtual pure returns(A) { }
function foo(uint ) external virtual pure returns(uint) { return 4; }
function foo(uint , uint ) external pure virtual returns(A) { }
}
contract X is A {
uint public override foo;
}
// ----
// TypeError: (225-249): Overriding public state variable return types differ.
@@ -0,0 +1,8 @@
contract ERC20 {
function balanceOf(address) external virtual view returns (uint) {}
function balanceOf(uint) external virtual view returns (uint) {}
function balanceOf() external virtual view returns (uint) {}
}
contract C is ERC20 {
mapping(address => uint) public override balanceOf;
}
@@ -0,0 +1,10 @@
contract ERC20 {
function balanceOf(address, uint) external virtual view returns (uint) {}
function balanceOf(uint) external virtual view returns (uint) {}
function balanceOf() external virtual view returns (uint) {}
}
contract C is ERC20 {
mapping(address => uint) public override balanceOf;
}
// ----
// TypeError: (281-289): Public state variable has override specified but does not override anything.
@@ -0,0 +1,14 @@
contract A {
function foo() external virtual pure returns(uint) { return 5; }
}
contract B is A {
function foo() external virtual override pure returns(uint) { return 5; }
}
contract C is A {
function foo() external virtual override pure returns(uint) { return 5; }
}
contract X is B, C {
uint public override foo;
}
// ----
// TypeError: (271-320): Derived contract must override function "foo". Function with the same name and parameter types defined in two or more base classes.
@@ -0,0 +1,15 @@
contract A {
function foo() external virtual pure returns(uint) { return 5; }
}
contract B is A {
uint public override foo;
}
contract C is A {
function foo() external virtual override pure returns(uint) { return 5; }
}
contract X is B, C {
uint public override foo;
}
// ----
// DeclarationError: (245-269): Identifier already declared.
// TypeError: (223-272): Derived contract must override function "foo". Function with the same name and parameter types defined in two or more base classes.
@@ -0,0 +1,11 @@
contract A {
function foo() external virtual pure returns(uint) { return 5; }
}
contract B {
function foo() external virtual pure returns(uint) { return 5; }
}
contract X is A, B {
uint public override(A, B) foo;
}
// ----
// TypeError: (162-217): Derived contract must override function "foo". Function with the same name and parameter types defined in two or more base classes.
@@ -0,0 +1,5 @@
contract X {
uint public override foo;
}
// ----
// TypeError: (26-34): Public state variable has override specified but does not override anything.