Allow overrides to have a more strict mutability than super

This commit is contained in:
Mathias Baumann
2020-07-16 17:55:12 +02:00
parent 052c4a86a0
commit dfffecfe2c
13 changed files with 113 additions and 8 deletions
@@ -1,5 +1,3 @@
contract B { function f() virtual public {} }
contract C is B { function f() public view {} }
contract C is B { function f() override public view {} }
// ----
// TypeError 9456: (64-91): Overriding function is missing "override" specifier.
// TypeError 6959: (64-91): Overriding function changes state mutability from "nonpayable" to "view".
@@ -0,0 +1,24 @@
contract A {
function foo() external pure virtual returns (uint256) {}
}
contract B is A {
function foo() external pure override virtual returns (uint256) {}
}
contract C is A {
function foo() external view override virtual returns (uint256) {}
}
contract D is B, C {
function foo() external override(B, C) virtual returns (uint256) {}
}
contract E is C, B {
function foo() external pure override(B, C) virtual returns (uint256) {}
}
contract F is C, B {
function foo() external payable override(B, C) virtual returns (uint256) {}
}
// ----
// TypeError 6959: (181-247): Overriding function changes state mutability from "pure" to "view".
// TypeError 6959: (272-339): Overriding function changes state mutability from "pure" to "nonpayable".
// TypeError 6959: (272-339): Overriding function changes state mutability from "view" to "nonpayable".
// TypeError 6959: (461-536): Overriding function changes state mutability from "view" to "payable".
// TypeError 6959: (461-536): Overriding function changes state mutability from "pure" to "payable".
@@ -0,0 +1,16 @@
contract A {
function foo() internal view virtual returns (uint256) {}
}
contract B is A {
function foo() internal pure override virtual returns (uint256) {}
}
contract C is A {
function foo() internal view override virtual returns (uint256) {}
}
contract D is B, C {
function foo() internal pure override(B, C) virtual returns (uint256) {}
}
contract E is C, B {
function foo() internal pure override(B, C) virtual returns (uint256) {}
}
// ----
@@ -0,0 +1,8 @@
contract A {
function foo() public payable virtual returns (uint256) {}
}
contract B is A {
function foo() public override virtual returns (uint256) {}
}
// ----
// TypeError 6959: (94-153): Overriding function changes state mutability from "payable" to "nonpayable".
@@ -0,0 +1,7 @@
contract A {
function foo() internal virtual returns (uint256) {}
}
contract B is A {
function foo() internal view override virtual returns (uint256) {}
}
// ----
@@ -0,0 +1,7 @@
contract A {
function foo() internal view virtual returns (uint256) {}
}
contract B is A {
function foo() internal pure override virtual returns (uint256) {}
}
// ----
@@ -0,0 +1,8 @@
contract A {
function foo() public payable virtual returns (uint256) {}
}
contract B is A {
function foo() public view override virtual returns (uint256) {}
}
// ----
// TypeError 6959: (94-158): Overriding function changes state mutability from "payable" to "view".
@@ -0,0 +1,8 @@
contract A {
function foo() public payable virtual returns (uint256) {}
}
contract B is A {
function foo() public pure override virtual returns (uint256) {}
}
// ----
// TypeError 6959: (94-158): Overriding function changes state mutability from "payable" to "pure".
@@ -0,0 +1,8 @@
contract A {
function foo() public virtual returns (uint256) {}
}
contract B is A {
function foo() public payable override virtual returns (uint256) {}
}
// ----
// TypeError 6959: (86-153): Overriding function changes state mutability from "nonpayable" to "payable".
@@ -0,0 +1,8 @@
contract A {
function foo() public view virtual returns (uint256) {}
}
contract B is A {
function foo() public payable override virtual returns (uint256) {}
}
// ----
// TypeError 6959: (91-158): Overriding function changes state mutability from "view" to "payable".