mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Implement virtual keyword
This commit is contained in:
@@ -212,14 +212,14 @@ BOOST_AUTO_TEST_CASE(metadata_relevant_sources_imports)
|
||||
char const* sourceCodeA = R"(
|
||||
pragma solidity >=0.0;
|
||||
contract A {
|
||||
function g(function(uint) external returns (uint) x) public {}
|
||||
function g(function(uint) external returns (uint) x) public virtual {}
|
||||
}
|
||||
)";
|
||||
char const* sourceCodeB = R"(
|
||||
pragma solidity >=0.0;
|
||||
import "./A";
|
||||
contract B is A {
|
||||
function g(function(uint) external returns (uint) x) public override {}
|
||||
function g(function(uint) external returns (uint) x) public virtual override {}
|
||||
}
|
||||
)";
|
||||
char const* sourceCodeC = R"(
|
||||
|
||||
@@ -2110,7 +2110,7 @@ BOOST_AUTO_TEST_CASE(virtual_function_calls)
|
||||
char const* sourceCode = R"(
|
||||
contract Base {
|
||||
function f() public returns (uint i) { return g(); }
|
||||
function g() public returns (uint i) { return 1; }
|
||||
function g() public virtual returns (uint i) { return 1; }
|
||||
}
|
||||
contract Derived is Base {
|
||||
function g() public override returns (uint i) { return 2; }
|
||||
@@ -2174,8 +2174,8 @@ BOOST_AUTO_TEST_CASE(single_copy_with_multiple_inheritance)
|
||||
BOOST_AUTO_TEST_CASE(explicit_base_class)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract BaseBase { function g() public returns (uint r) { return 1; } }
|
||||
contract Base is BaseBase { function g() public override returns (uint r) { return 2; } }
|
||||
contract BaseBase { function g() public virtual returns (uint r) { return 1; } }
|
||||
contract Base is BaseBase { function g() public virtual override returns (uint r) { return 2; } }
|
||||
contract Derived is Base {
|
||||
function f() public returns (uint r) { return BaseBase.g(); }
|
||||
function g() public override returns (uint r) { return 3; }
|
||||
@@ -2236,7 +2236,7 @@ BOOST_AUTO_TEST_CASE(virtual_function_usage_in_constructor_arguments)
|
||||
constructor(uint a) public {
|
||||
m_a = a;
|
||||
}
|
||||
function overridden() public returns (uint r) { return 1; }
|
||||
function overridden() public virtual returns (uint r) { return 1; }
|
||||
function g() public returns (uint r) { return overridden(); }
|
||||
}
|
||||
contract Base is BaseBase(BaseBase.g()) {
|
||||
@@ -2350,8 +2350,8 @@ BOOST_AUTO_TEST_CASE(function_modifier_calling_functions_in_creation_context)
|
||||
constructor() mod1 public { f1(); }
|
||||
function f1() mod2 public { data |= 0x1; }
|
||||
function f2() public { data |= 0x20; }
|
||||
function f3() public { }
|
||||
modifier mod1 { f2(); _; }
|
||||
function f3() public virtual { }
|
||||
modifier mod1 virtual { f2(); _; }
|
||||
modifier mod2 { f3(); if (false) _; }
|
||||
function getData() public returns (uint r) { return data; }
|
||||
}
|
||||
@@ -2482,9 +2482,9 @@ BOOST_AUTO_TEST_CASE(crazy_elementary_typenames_on_stack)
|
||||
BOOST_AUTO_TEST_CASE(super)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract A { function f() public returns (uint r) { return 1; } }
|
||||
contract B is A { function f() public override returns (uint r) { return super.f() | 2; } }
|
||||
contract C is A { function f() public override returns (uint r) { return super.f() | 4; } }
|
||||
contract A { function f() public virtual returns (uint r) { return 1; } }
|
||||
contract B is A { function f() public virtual override returns (uint r) { return super.f() | 2; } }
|
||||
contract C is A { function f() public virtual override returns (uint r) { return super.f() | 4; } }
|
||||
contract D is B, C { function f() public override(B, C) returns (uint r) { return super.f() | 8; } }
|
||||
)";
|
||||
compileAndRun(sourceCode, 0, "D");
|
||||
@@ -2494,9 +2494,9 @@ BOOST_AUTO_TEST_CASE(super)
|
||||
BOOST_AUTO_TEST_CASE(super_in_constructor)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract A { function f() public returns (uint r) { return 1; } }
|
||||
contract B is A { function f() public override returns (uint r) { return super.f() | 2; } }
|
||||
contract C is A { function f() public override returns (uint r) { return super.f() | 4; } }
|
||||
contract A { function f() public virtual returns (uint r) { return 1; } }
|
||||
contract B is A { function f() public virtual override returns (uint r) { return super.f() | 2; } }
|
||||
contract C is A { function f() public virtual override returns (uint r) { return super.f() | 4; } }
|
||||
contract D is B, C { uint data; constructor() public { data = super.f() | 8; } function f() public override (B, C) returns (uint r) { return data; } }
|
||||
)";
|
||||
compileAndRun(sourceCode, 0, "D");
|
||||
@@ -5969,11 +5969,11 @@ BOOST_AUTO_TEST_CASE(proper_order_of_overwriting_of_attributes)
|
||||
// bug #1798
|
||||
char const* sourceCode = R"(
|
||||
contract init {
|
||||
function isOk() public returns (bool) { return false; }
|
||||
function isOk() public virtual returns (bool) { return false; }
|
||||
bool public ok = false;
|
||||
}
|
||||
contract fix {
|
||||
function isOk() public returns (bool) { return true; }
|
||||
function isOk() public virtual returns (bool) { return true; }
|
||||
bool public ok = true;
|
||||
}
|
||||
|
||||
@@ -7944,7 +7944,7 @@ BOOST_AUTO_TEST_CASE(state_variable_local_variable_mixture)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(inherited_function) {
|
||||
char const* sourceCode = R"(
|
||||
contract A { function f() internal returns (uint) { return 1; } }
|
||||
contract A { function f() virtual internal returns (uint) { return 1; } }
|
||||
contract B is A {
|
||||
function f() internal override returns (uint) { return 2; }
|
||||
function g() public returns (uint) {
|
||||
@@ -7959,7 +7959,7 @@ BOOST_AUTO_TEST_CASE(inherited_function) {
|
||||
|
||||
BOOST_AUTO_TEST_CASE(inherited_function_calldata_memory) {
|
||||
char const* sourceCode = R"(
|
||||
contract A { function f(uint[] calldata a) external returns (uint) { return a[0]; } }
|
||||
contract A { function f(uint[] calldata a) virtual external returns (uint) { return a[0]; } }
|
||||
contract B is A {
|
||||
function f(uint[] memory a) public override returns (uint) { return a[1]; }
|
||||
function g() public returns (uint) {
|
||||
@@ -14439,7 +14439,7 @@ BOOST_AUTO_TEST_CASE(external_public_override)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract A {
|
||||
function f() external returns (uint) { return 1; }
|
||||
function f() external virtual returns (uint) { return 1; }
|
||||
}
|
||||
contract B is A {
|
||||
function f() public override returns (uint) { return 2; }
|
||||
@@ -14605,7 +14605,7 @@ BOOST_AUTO_TEST_CASE(contract_name)
|
||||
string public nameAccessor = type(C).name;
|
||||
string public constant constantNameAccessor = type(C).name;
|
||||
|
||||
function name() public pure returns (string memory) {
|
||||
function name() public virtual pure returns (string memory) {
|
||||
return type(C).name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ BOOST_AUTO_TEST_CASE(abstract_contract)
|
||||
{
|
||||
SourceUnit const* sourceUnit = nullptr;
|
||||
char const* text = R"(
|
||||
abstract contract base { function foo() public; }
|
||||
abstract contract base { function foo() public virtual; }
|
||||
contract derived is base { function foo() public override {} }
|
||||
)";
|
||||
sourceUnit = parseAndAnalyse(text);
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
contract BaseBase {
|
||||
uint public x;
|
||||
uint public y;
|
||||
function init(uint a, uint b) public {
|
||||
function init(uint a, uint b) public virtual {
|
||||
x = b;
|
||||
y = a;
|
||||
}
|
||||
function init(uint a) public {
|
||||
function init(uint a) public virtual {
|
||||
x = a + 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ contract X {
|
||||
function f() public returns (uint x) {
|
||||
x = g();
|
||||
}
|
||||
function g() public returns (uint x) {
|
||||
function g() public virtual returns (uint x) {
|
||||
x = 2;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ pragma experimental SMTChecker;
|
||||
contract A {
|
||||
uint x;
|
||||
|
||||
fallback () external {
|
||||
fallback () external virtual {
|
||||
assert(x == 1);
|
||||
}
|
||||
function g() public view {
|
||||
@@ -21,7 +21,7 @@ contract B is A {
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// Warning: (114-128): Assertion violation happens here
|
||||
// Warning: (163-177): Assertion violation happens here
|
||||
// Warning: (280-294): Assertion violation happens here
|
||||
// Warning: (163-177): Assertion violation happens here
|
||||
// Warning: (122-136): Assertion violation happens here
|
||||
// Warning: (171-185): Assertion violation happens here
|
||||
// Warning: (288-302): Assertion violation happens here
|
||||
// Warning: (171-185): Assertion violation happens here
|
||||
|
||||
@@ -4,7 +4,7 @@ pragma experimental SMTChecker;
|
||||
contract A {
|
||||
uint x;
|
||||
|
||||
function f() public view {
|
||||
function f() public virtual view {
|
||||
assert(x == 1);
|
||||
}
|
||||
function g() public view {
|
||||
@@ -19,7 +19,7 @@ contract B is A {
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// Warning: (113-127): Assertion violation happens here
|
||||
// Warning: (162-176): Assertion violation happens here
|
||||
// Warning: (268-282): Assertion violation happens here
|
||||
// Warning: (162-176): Assertion violation happens here
|
||||
// Warning: (121-135): Assertion violation happens here
|
||||
// Warning: (170-184): Assertion violation happens here
|
||||
// Warning: (276-290): Assertion violation happens here
|
||||
// Warning: (170-184): Assertion violation happens here
|
||||
|
||||
@@ -4,7 +4,7 @@ pragma experimental SMTChecker;
|
||||
contract A {
|
||||
uint x;
|
||||
|
||||
function f() public view {
|
||||
function f() public virtual view {
|
||||
assert(x == 1);
|
||||
}
|
||||
function g() public view {
|
||||
@@ -21,7 +21,7 @@ contract B is A {
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// Warning: (113-127): Assertion violation happens here
|
||||
// Warning: (162-176): Assertion violation happens here
|
||||
// Warning: (278-292): Assertion violation happens here
|
||||
// Warning: (162-176): Assertion violation happens here
|
||||
// Warning: (121-135): Assertion violation happens here
|
||||
// Warning: (170-184): Assertion violation happens here
|
||||
// Warning: (286-300): Assertion violation happens here
|
||||
// Warning: (170-184): Assertion violation happens here
|
||||
|
||||
@@ -4,7 +4,7 @@ pragma experimental SMTChecker;
|
||||
contract A {
|
||||
uint x;
|
||||
|
||||
function f() public view {
|
||||
function f() public virtual view {
|
||||
assert(x == 1);
|
||||
}
|
||||
function g() public view {
|
||||
@@ -16,7 +16,7 @@ contract A {
|
||||
contract B is A {
|
||||
uint y;
|
||||
|
||||
function f() public view override {
|
||||
function f() public view virtual override {
|
||||
assert(x == 0);
|
||||
}
|
||||
function h() public view {
|
||||
@@ -36,12 +36,12 @@ contract C is B {
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// Warning: (113-127): Assertion violation happens here
|
||||
// Warning: (162-176): Assertion violation happens here
|
||||
// Warning: (280-294): Assertion violation happens here
|
||||
// Warning: (329-343): Assertion violation happens here
|
||||
// Warning: (162-176): Assertion violation happens here
|
||||
// Warning: (452-466): Assertion violation happens here
|
||||
// Warning: (501-515): Assertion violation happens here
|
||||
// Warning: (329-343): Assertion violation happens here
|
||||
// Warning: (162-176): Assertion violation happens here
|
||||
// Warning: (121-135): Assertion violation happens here
|
||||
// Warning: (170-184): Assertion violation happens here
|
||||
// Warning: (296-310): Assertion violation happens here
|
||||
// Warning: (345-359): Assertion violation happens here
|
||||
// Warning: (170-184): Assertion violation happens here
|
||||
// Warning: (468-482): Assertion violation happens here
|
||||
// Warning: (517-531): Assertion violation happens here
|
||||
// Warning: (345-359): Assertion violation happens here
|
||||
// Warning: (170-184): Assertion violation happens here
|
||||
|
||||
@@ -4,7 +4,7 @@ pragma experimental SMTChecker;
|
||||
contract A {
|
||||
uint x;
|
||||
|
||||
receive () external payable {
|
||||
receive () external virtual payable {
|
||||
assert(x == 1);
|
||||
}
|
||||
function g() public view {
|
||||
@@ -21,7 +21,7 @@ contract B is A {
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// Warning: (120-134): Assertion violation happens here
|
||||
// Warning: (169-183): Assertion violation happens here
|
||||
// Warning: (292-306): Assertion violation happens here
|
||||
// Warning: (169-183): Assertion violation happens here
|
||||
// Warning: (128-142): Assertion violation happens here
|
||||
// Warning: (177-191): Assertion violation happens here
|
||||
// Warning: (300-314): Assertion violation happens here
|
||||
// Warning: (177-191): Assertion violation happens here
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
contract C {
|
||||
fallback() external {}
|
||||
fallback() virtual external {}
|
||||
}
|
||||
contract D is C {
|
||||
fallback() override external {}
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
contract C {
|
||||
fallback() external {}
|
||||
fallback() virtual external {}
|
||||
}
|
||||
contract D is C {
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
contract C {
|
||||
fallback() external {}
|
||||
fallback() virtual external {}
|
||||
}
|
||||
contract D is C {
|
||||
fallback() external {}
|
||||
}
|
||||
// ----
|
||||
// TypeError: (58-80): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (66-88): Overriding function is missing 'override' specifier.
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
contract C {
|
||||
fallback() external {}
|
||||
fallback() virtual external {}
|
||||
}
|
||||
contract D is C {
|
||||
}
|
||||
@@ -7,4 +7,4 @@ contract E is D {
|
||||
fallback() external {}
|
||||
}
|
||||
// ----
|
||||
// TypeError: (78-100): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (86-108): Overriding function is missing 'override' specifier.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
contract C {
|
||||
receive() external payable {}
|
||||
receive() virtual external payable {}
|
||||
}
|
||||
contract D is C {
|
||||
receive() override external payable {}
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
contract C {
|
||||
receive() external payable {}
|
||||
receive() virtual external payable {}
|
||||
}
|
||||
contract D is C {
|
||||
}
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
contract C {
|
||||
receive() external payable {}
|
||||
receive() virtual external payable {}
|
||||
}
|
||||
contract D is C {
|
||||
receive() external payable {}
|
||||
}
|
||||
// ----
|
||||
// TypeError: (65-94): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (73-102): Overriding function is missing 'override' specifier.
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
contract C {
|
||||
receive() external payable {}
|
||||
receive() virtual external payable {}
|
||||
}
|
||||
contract D is C {
|
||||
}
|
||||
@@ -7,4 +7,4 @@ contract E is D {
|
||||
receive() external payable {}
|
||||
}
|
||||
// ----
|
||||
// TypeError: (85-114): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (93-122): Overriding function is missing 'override' specifier.
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
interface I {
|
||||
function foo() virtual external;
|
||||
}
|
||||
// ----
|
||||
// Warning: (15-47): Interface functions are implicitly "virtual"
|
||||
@@ -1,5 +1,5 @@
|
||||
contract B { function f() public {} }
|
||||
contract B { function f() virtual public {} }
|
||||
contract C is B { function f() public view {} }
|
||||
// ----
|
||||
// TypeError: (56-83): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (56-83): Overriding function changes state mutability from "nonpayable" to "view".
|
||||
// TypeError: (64-91): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (64-91): Overriding function changes state mutability from "nonpayable" to "view".
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
contract A {
|
||||
uint dummy;
|
||||
function f(uint[] calldata) external pure {}
|
||||
function g(uint[] calldata) external view { dummy; }
|
||||
function h(uint[] calldata) external { dummy = 42; }
|
||||
function i(uint[] calldata) external payable {}
|
||||
function f(uint[] calldata) external virtual pure {}
|
||||
function g(uint[] calldata) external virtual view { dummy; }
|
||||
function h(uint[] calldata) external virtual { dummy = 42; }
|
||||
function i(uint[] calldata) external virtual payable {}
|
||||
}
|
||||
contract B is A {
|
||||
function f(uint[] memory) public override pure {}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
contract A {
|
||||
uint dummy;
|
||||
function f(uint[] calldata) external pure {}
|
||||
function g(uint[] calldata) external view { dummy; }
|
||||
function h(uint[] calldata) external { dummy = 42; }
|
||||
function i(uint[] calldata) external payable {}
|
||||
function f(uint[] calldata) external virtual pure {}
|
||||
function g(uint[] calldata) external virtual view { dummy; }
|
||||
function h(uint[] calldata) external virtual { dummy = 42; }
|
||||
function i(uint[] calldata) external virtual payable {}
|
||||
}
|
||||
contract B is A {
|
||||
function f(uint[] calldata) external override pure {}
|
||||
@@ -16,7 +16,7 @@ contract B is A {
|
||||
function i(uint[] memory) public override payable {}
|
||||
}
|
||||
// ----
|
||||
// DeclarationError: (268-321): Function with same name and arguments defined twice.
|
||||
// DeclarationError: (326-387): Function with same name and arguments defined twice.
|
||||
// DeclarationError: (392-453): Function with same name and arguments defined twice.
|
||||
// DeclarationError: (458-514): Function with same name and arguments defined twice.
|
||||
// DeclarationError: (300-353): Function with same name and arguments defined twice.
|
||||
// DeclarationError: (358-419): Function with same name and arguments defined twice.
|
||||
// DeclarationError: (424-485): Function with same name and arguments defined twice.
|
||||
// DeclarationError: (490-546): Function with same name and arguments defined twice.
|
||||
|
||||
@@ -2,10 +2,10 @@ pragma experimental ABIEncoderV2;
|
||||
contract A {
|
||||
uint dummy;
|
||||
struct S { int a; }
|
||||
function f(S calldata) external pure {}
|
||||
function g(S calldata) external view { dummy; }
|
||||
function h(S calldata) external { dummy = 42; }
|
||||
function i(S calldata) external payable {}
|
||||
function f(S calldata) external virtual pure {}
|
||||
function g(S calldata) external virtual view { dummy; }
|
||||
function h(S calldata) external virtual { dummy = 42; }
|
||||
function i(S calldata) external virtual payable {}
|
||||
}
|
||||
contract B is A {
|
||||
function f(S memory) public override pure {}
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
contract A {
|
||||
function f() external pure {}
|
||||
function f() external virtual pure {}
|
||||
}
|
||||
contract B is A {
|
||||
function f() public override pure {
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
contract C {
|
||||
function() external virtual fp;
|
||||
function() external override fp2;
|
||||
function() external override virtual fp3;
|
||||
}
|
||||
// ----
|
||||
// ParserError: (34-41): Expected identifier but got 'virtual'
|
||||
@@ -1,7 +1,7 @@
|
||||
abstract contract A {
|
||||
int public testvar;
|
||||
function test() internal returns (uint256);
|
||||
function test2() internal returns (uint256);
|
||||
function test() internal virtual returns (uint256);
|
||||
function test2() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract X is A {
|
||||
int public override testvar;
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
abstract contract A {
|
||||
int public testvar;
|
||||
function foo() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract B {
|
||||
function foo() internal returns (uint256);
|
||||
function test() internal returns (uint256);
|
||||
function test() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract X is A, B {
|
||||
int public override testvar;
|
||||
function test() internal override returns (uint256);
|
||||
}
|
||||
// ----
|
||||
// TypeError: (202-317): Derived contract must override function "foo". Function with the same name and parameter types defined in two or more base classes.
|
||||
// TypeError: (218-333): Derived contract must override function "foo". Function with the same name and parameter types defined in two or more base classes.
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
abstract contract A {
|
||||
function foo() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
}
|
||||
|
||||
abstract contract B is A {
|
||||
function foo() internal override returns (uint256);
|
||||
function foo() internal override virtual returns (uint256);
|
||||
}
|
||||
|
||||
abstract contract C is B {
|
||||
function foo() internal override returns (uint256);
|
||||
function foo() internal override virtual returns (uint256);
|
||||
}
|
||||
|
||||
abstract contract D is C {
|
||||
function foo() internal override returns (uint256);
|
||||
function foo() internal override virtual returns (uint256);
|
||||
}
|
||||
|
||||
abstract contract X is D {
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
interface A {
|
||||
function test() external returns (uint256);
|
||||
function test2() external returns (uint256);
|
||||
}
|
||||
abstract contract X is A {
|
||||
function test() external override returns (uint256);
|
||||
function test2() external override(A) returns (uint256);
|
||||
}
|
||||
// ----
|
||||
@@ -0,0 +1,14 @@
|
||||
interface A {
|
||||
function test() external returns (uint256);
|
||||
function test2() external returns (uint256);
|
||||
}
|
||||
|
||||
interface B {
|
||||
function test() external returns (uint256);
|
||||
function test2() external returns (uint256);
|
||||
}
|
||||
abstract contract X is A, B {
|
||||
function test() external override(A, B) returns (uint256);
|
||||
function test2() external override(B, A) returns (uint256);
|
||||
}
|
||||
// ----
|
||||
@@ -0,0 +1,11 @@
|
||||
abstract contract A {
|
||||
function test() external virtual returns (uint256);
|
||||
function test2() external returns (uint256);
|
||||
}
|
||||
abstract contract X is A {
|
||||
function test() external returns (uint256);
|
||||
function test2() external override(A) returns (uint256);
|
||||
}
|
||||
// ----
|
||||
// TypeError: (151-194): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (76-120): Trying to override non-virtual function. Did you forget to add "virtual"?
|
||||
@@ -1,17 +1,17 @@
|
||||
abstract contract A {
|
||||
int public testvar;
|
||||
function foo() internal returns (uint256);
|
||||
function test(uint8 _a) internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
function test(uint8 _a) internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract B {
|
||||
function foo() internal returns (uint256);
|
||||
function test() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
function test() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract C {
|
||||
function foo() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract D {
|
||||
function foo() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract X is A, B, C, D {
|
||||
int public override testvar;
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
abstract contract A {
|
||||
int public testvar;
|
||||
function foo() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
function test(uint8 _a) internal returns (uint256);
|
||||
}
|
||||
abstract contract B {
|
||||
function foo() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
}
|
||||
|
||||
abstract contract C is A {
|
||||
|
||||
+11
-11
@@ -1,18 +1,18 @@
|
||||
abstract contract A {
|
||||
int public testvar;
|
||||
function foo() internal returns (uint256);
|
||||
function test(uint8 _a) internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
function test(uint8 _a) internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract B {
|
||||
function foo() internal returns (uint256);
|
||||
function test() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
function test() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract C {
|
||||
function foo() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract D {
|
||||
function foo() internal returns (uint256);
|
||||
function test() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
function test() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract X is A, B, C, D {
|
||||
int public override testvar;
|
||||
@@ -20,7 +20,7 @@ abstract contract X is A, B, C, D {
|
||||
function foo() internal override(A, C, B, B, B, D ,D) returns (uint256);
|
||||
}
|
||||
// ----
|
||||
// TypeError: (543-544): Duplicate contract "D" found in override list of "test".
|
||||
// TypeError: (608-609): Duplicate contract "B" found in override list of "foo".
|
||||
// TypeError: (611-612): Duplicate contract "B" found in override list of "foo".
|
||||
// TypeError: (617-618): Duplicate contract "D" found in override list of "foo".
|
||||
// TypeError: (599-600): Duplicate contract "D" found in override list of "test".
|
||||
// TypeError: (664-665): Duplicate contract "B" found in override list of "foo".
|
||||
// TypeError: (667-668): Duplicate contract "B" found in override list of "foo".
|
||||
// TypeError: (673-674): Duplicate contract "D" found in override list of "foo".
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
abstract contract A {
|
||||
int public testvar;
|
||||
function foo() internal returns (uint256);
|
||||
function test(uint8 _a) internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
function test(uint8 _a) virtual internal returns (uint256);
|
||||
}
|
||||
abstract contract B {
|
||||
function foo() internal returns (uint256);
|
||||
function test() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
function test() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract C {
|
||||
function foo() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract D {
|
||||
function foo() internal returns (uint256);
|
||||
function test() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
function test() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract X is A, B, C, D {
|
||||
int public override testvar;
|
||||
@@ -20,5 +20,5 @@ abstract contract X is A, B, C, D {
|
||||
function foo() internal override(A, C) returns (uint256);
|
||||
}
|
||||
// ----
|
||||
// TypeError: (528-545): Invalid contract specified in override list: C.
|
||||
// TypeError: (590-604): Function needs to specify overridden contracts B and D.
|
||||
// TypeError: (584-601): Invalid contract specified in override list: C.
|
||||
// TypeError: (646-660): Function needs to specify overridden contracts B and D.
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
contract A
|
||||
{
|
||||
function foo() virtual internal {}
|
||||
}
|
||||
contract B
|
||||
{
|
||||
function foo() internal {}
|
||||
}
|
||||
contract C is A, B
|
||||
{
|
||||
function foo() internal override(A, B) {}
|
||||
}
|
||||
// ----
|
||||
// TypeError: (65-91): Trying to override non-virtual function. Did you forget to add "virtual"?
|
||||
@@ -0,0 +1,13 @@
|
||||
contract A
|
||||
{
|
||||
function foo() virtual internal {}
|
||||
}
|
||||
contract B
|
||||
{
|
||||
function foo() internal {}
|
||||
}
|
||||
contract C is A, B
|
||||
{
|
||||
}
|
||||
// ----
|
||||
// TypeError: (94-116): Derived contract must override function "foo". Function with the same name and parameter types defined in two or more base classes.
|
||||
@@ -0,0 +1,7 @@
|
||||
abstract contract A {
|
||||
int public testvar;
|
||||
}
|
||||
abstract contract X is A {
|
||||
int public override testvar;
|
||||
}
|
||||
// ----
|
||||
@@ -1,14 +1,14 @@
|
||||
abstract contract A {
|
||||
int public testvar;
|
||||
function foo() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract B {
|
||||
function foo() internal returns (uint8);
|
||||
function test() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint8);
|
||||
function test() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract X is A, B {
|
||||
int public override testvar;
|
||||
function test() internal override returns (uint256);
|
||||
}
|
||||
// ----
|
||||
// TypeError: (200-315): Derived contract must override function "foo". Function with the same name and parameter types defined in two or more base classes.
|
||||
// TypeError: (224-339): Derived contract must override function "foo". Function with the same name and parameter types defined in two or more base classes.
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
contract I {
|
||||
function set() public {}
|
||||
function set() public virtual {}
|
||||
}
|
||||
contract A is I {
|
||||
uint a;
|
||||
function set() public override { a = 1; super.set(); a = 2; }
|
||||
function set() public virtual override { a = 1; super.set(); a = 2; }
|
||||
}
|
||||
contract B is I {
|
||||
uint b;
|
||||
function set() public override { b = 1; super.set(); b = 2; }
|
||||
function set() public virtual override { b = 1; super.set(); b = 2; }
|
||||
|
||||
}
|
||||
contract X is A, B {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
contract I {
|
||||
function f() external {}
|
||||
function f() external virtual {}
|
||||
}
|
||||
contract A is I {
|
||||
function f() external override {}
|
||||
function f() external virtual override {}
|
||||
}
|
||||
contract B is I {}
|
||||
contract C is A, B {
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
abstract contract A {
|
||||
int public testvar;
|
||||
function foo() internal returns (uint256);
|
||||
function test(uint8 _a) internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
function test(uint8 _a) internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract B {
|
||||
function foo() internal returns (uint256);
|
||||
function test() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
function test() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract C {
|
||||
function foo() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract D {
|
||||
function foo() internal returns (uint256);
|
||||
function foo() internal virtual returns (uint256);
|
||||
}
|
||||
abstract contract X is A, B, C, D {
|
||||
struct MyStruct { int abc; }
|
||||
@@ -22,5 +22,5 @@ abstract contract X is A, B, C, D {
|
||||
function foo() internal override(MyStruct, ENUM, A, B, C, D) returns (uint256);
|
||||
}
|
||||
// ----
|
||||
// TypeError: (597-605): Expected contract but got struct X.MyStruct.
|
||||
// TypeError: (607-611): Expected contract but got enum X.ENUM.
|
||||
// TypeError: (645-653): Expected contract but got struct X.MyStruct.
|
||||
// TypeError: (655-659): Expected contract but got enum X.ENUM.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
contract B { function f() public view {} }
|
||||
contract B { function f() virtual public view {} }
|
||||
contract C is B { function f() public {} }
|
||||
// ----
|
||||
// TypeError: (61-83): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (61-83): Overriding function changes state mutability from "view" to "nonpayable".
|
||||
// TypeError: (69-91): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (69-91): Overriding function changes state mutability from "view" to "nonpayable".
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
contract A {
|
||||
function f() external pure {}
|
||||
function f() external virtual pure {}
|
||||
}
|
||||
contract B is A {
|
||||
function f() public override pure {
|
||||
@@ -7,4 +7,4 @@ contract B is A {
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// TypeError: (115-122): Member "f" not found or not visible after argument-dependent lookup in contract super B.
|
||||
// TypeError: (123-130): Member "f" not found or not visible after argument-dependent lookup in contract super B.
|
||||
|
||||
@@ -2,9 +2,7 @@ contract C
|
||||
{
|
||||
function foo() virtual public virtual {}
|
||||
modifier modi() virtual virtual {_;}
|
||||
int virtual public virtual variable;
|
||||
}
|
||||
// ----
|
||||
// ParserError: (44-51): Virtual already specified.
|
||||
// ParserError: (80-87): Virtual already specified.
|
||||
// ParserError: (113-120): Virtual already specified.
|
||||
|
||||
@@ -3,6 +3,4 @@ contract C
|
||||
function foo() public virtual {}
|
||||
function foo2() virtual public {}
|
||||
modifier modi() virtual {_;}
|
||||
int public virtual variable;
|
||||
int virtual public variable2;
|
||||
}
|
||||
|
||||
+4
-4
@@ -1,6 +1,6 @@
|
||||
abstract contract base { function foo() public; }
|
||||
contract derived is base { function foo() public override {} }
|
||||
abstract contract base { function foo() public virtual; }
|
||||
contract derived is base { function foo() public virtual override {} }
|
||||
contract wrong is derived { function foo() public; }
|
||||
// ----
|
||||
// TypeError: (141-163): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (141-163): Redeclaring an already implemented function as abstract
|
||||
// TypeError: (157-179): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (157-179): Redeclaring an already implemented function as abstract
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
contract root { function rootFunction() public {} }
|
||||
contract inter1 is root { function f() public {} }
|
||||
contract inter2 is root { function f() public {} }
|
||||
contract inter1 is root { function f() public virtual {} }
|
||||
contract inter2 is root { function f() public virtual {} }
|
||||
contract derived is root, inter2, inter1 {
|
||||
function g() public { f(); rootFunction(); }
|
||||
function f() override(inter1, inter2) public {}
|
||||
|
||||
+3
-3
@@ -1,5 +1,5 @@
|
||||
contract B { function f() internal {} }
|
||||
contract B { function f() virtual internal {} }
|
||||
contract C is B { function f() public {} }
|
||||
// ----
|
||||
// TypeError: (58-80): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (58-80): Overriding function visibility differs.
|
||||
// TypeError: (66-88): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (66-88): Overriding function visibility differs.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
contract A { function f() public { uint8 x = C(0).g(); } }
|
||||
contract B { function f() public {} function g() public returns (uint8) {} }
|
||||
contract A { function f() public virtual { uint8 x = C(0).g(); } }
|
||||
contract B { function f() public virtual {} function g() public returns (uint8) {} }
|
||||
contract C is A, B { function f() public override (A, B) { A.f(); } }
|
||||
// ----
|
||||
// Warning: (35-42): Unused local variable.
|
||||
// Warning: (43-50): Unused local variable.
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
contract A {
|
||||
uint x;
|
||||
fallback() external { x = 1; }
|
||||
fallback() virtual external { x = 1; }
|
||||
}
|
||||
contract C is A {
|
||||
fallback() override external { x = 2; }
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
contract Vehicle {
|
||||
function f(bytes calldata) external returns (uint256 r) {r = 1;}
|
||||
function f(bytes calldata) external virtual returns (uint256 r) {r = 1;}
|
||||
}
|
||||
contract Bike is Vehicle {
|
||||
function f(bytes calldata) override external returns (uint256 r) {r = 42;}
|
||||
}
|
||||
// ----
|
||||
// Warning: (23-87): Function state mutability can be restricted to pure
|
||||
// Warning: (23-95): Function state mutability can be restricted to pure
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
contract base {
|
||||
function f(uint a) public returns (uint) { }
|
||||
function f(uint a) public virtual returns (uint) { }
|
||||
}
|
||||
contract test is base {
|
||||
function f(uint a) public override returns (uint8) { }
|
||||
}
|
||||
// ----
|
||||
// TypeError: (95-149): Overriding function return types differ.
|
||||
// TypeError: (103-157): Overriding function return types differ.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
contract B { function f() payable public {} }
|
||||
contract B { function f() payable virtual public {} }
|
||||
contract C is B { function f() public {} }
|
||||
// ----
|
||||
// TypeError: (64-86): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (64-86): Overriding function changes state mutability from "payable" to "nonpayable".
|
||||
// TypeError: (72-94): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (72-94): Overriding function changes state mutability from "payable" to "nonpayable".
|
||||
|
||||
+3
-3
@@ -1,5 +1,5 @@
|
||||
contract B { function f() public {} }
|
||||
contract B { function f() virtual public {} }
|
||||
contract C is B { function f() payable public {} }
|
||||
// ----
|
||||
// TypeError: (56-86): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (56-86): Overriding function changes state mutability from "nonpayable" to "payable".
|
||||
// TypeError: (64-94): Overriding function is missing 'override' specifier.
|
||||
// TypeError: (64-94): Overriding function changes state mutability from "nonpayable" to "payable".
|
||||
|
||||
+1
@@ -5,3 +5,4 @@ contract C is I {
|
||||
function f() public override {
|
||||
}
|
||||
}
|
||||
// ----
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
abstract contract a {
|
||||
function f() public;
|
||||
function f() virtual public;
|
||||
}
|
||||
contract b is a {
|
||||
function f() public override { super.f(); }
|
||||
}
|
||||
// ----
|
||||
// TypeError: (102-109): Member "f" not found or not visible after argument-dependent lookup in contract super b.
|
||||
// TypeError: (110-117): Member "f" not found or not visible after argument-dependent lookup in contract super b.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
abstract contract a {
|
||||
function f() public;
|
||||
function f() virtual public;
|
||||
}
|
||||
contract b is a {
|
||||
function f() public override { super.f(); }
|
||||
function f() public virtual override { super.f(); }
|
||||
}
|
||||
contract c is a,b {
|
||||
// No error here.
|
||||
function f() public override(a, b) { super.f(); }
|
||||
}
|
||||
// ----
|
||||
// TypeError: (102-109): Member "f" not found or not visible after argument-dependent lookup in contract super b.
|
||||
// TypeError: (118-125): Member "f" not found or not visible after argument-dependent lookup in contract super b.
|
||||
|
||||
@@ -4,3 +4,4 @@ interface D {
|
||||
contract C is D {
|
||||
function f() override view external {}
|
||||
}
|
||||
// ----
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
contract D {
|
||||
uint x;
|
||||
function f() public view { x; }
|
||||
function g() public pure {}
|
||||
function f() public virtual view { x; }
|
||||
function g() public virtual pure {}
|
||||
}
|
||||
contract C1 is D {
|
||||
function f() public override {}
|
||||
function g() public override view {}
|
||||
function g() public virtual override view {}
|
||||
}
|
||||
contract C2 is D {
|
||||
function g() public override {}
|
||||
}
|
||||
// ----
|
||||
// TypeError: (118-149): Overriding function changes state mutability from "view" to "nonpayable".
|
||||
// TypeError: (154-190): Overriding function changes state mutability from "pure" to "view".
|
||||
// TypeError: (216-247): Overriding function changes state mutability from "pure" to "nonpayable".
|
||||
// TypeError: (134-165): Overriding function changes state mutability from "view" to "nonpayable".
|
||||
// TypeError: (170-214): Overriding function changes state mutability from "pure" to "view".
|
||||
// TypeError: (240-271): Overriding function changes state mutability from "pure" to "nonpayable".
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
contract D {
|
||||
uint x;
|
||||
function f() public { x = 2; }
|
||||
function f() virtual public { x = 2; }
|
||||
}
|
||||
contract C is D {
|
||||
function f() public override {}
|
||||
|
||||
Reference in New Issue
Block a user