Implement virtual keyword

This commit is contained in:
Mathias Baumann
2019-11-14 11:49:39 +01:00
parent 7d4e4b6088
commit 5b8ff78176
88 changed files with 395 additions and 314 deletions
+2 -2
View File
@@ -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"(
+18 -18
View File
@@ -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,5 +1,5 @@
contract C {
fallback() external {}
fallback() virtual external {}
}
contract D is C {
fallback() override external {}
@@ -1,5 +1,5 @@
contract C {
fallback() external {}
fallback() virtual external {}
}
contract D is C {
}
@@ -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.
@@ -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,5 +1,5 @@
contract C {
receive() external payable {}
receive() virtual external payable {}
}
contract D is C {
}
@@ -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.
@@ -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,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 {
@@ -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;
}
@@ -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
@@ -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 {}
@@ -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,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; }
@@ -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
@@ -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".
@@ -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".
@@ -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 {}