Consider all grandparents in override analysis.

This commit is contained in:
Daniel Kirchner
2022-02-14 15:31:31 +01:00
parent d29709e741
commit c47da51eab
9 changed files with 131 additions and 3 deletions
@@ -0,0 +1,17 @@
interface IBase {
function foo() external view;
}
contract Base is IBase {
function foo() public virtual view {}
}
interface IExt is IBase {}
contract Ext is IExt, Base {}
contract T { function foo() public virtual view {} }
contract Impl is Ext, T {
function foo() public view override(IBase, Base, T) {}
}
@@ -0,0 +1,17 @@
abstract contract IBase {
function foo() external view virtual;
}
contract Base is IBase {
function foo() public virtual override view {}
}
abstract contract IExt is IBase {}
contract Ext is IExt, Base {}
contract T { function foo() public virtual view {} }
contract Impl is Ext, T {
function foo() public view override(IBase, Base, T) {}
}
@@ -0,0 +1,18 @@
interface IBase {
function foo() external view;
}
contract Base is IBase {
function foo() public virtual view {}
}
interface IExt is IBase {}
contract Ext is IExt, Base {}
contract Impl is Ext {
function foo() public view {}
}
// ----
// TypeError 9456: (211-240): Overriding function is missing "override" specifier.
// TypeError 4327: (211-240): Function needs to specify overridden contracts "Base" and "IBase".
@@ -0,0 +1,16 @@
interface IBase {
function foo() external view;
}
contract Base is IBase {
function foo() public virtual view {}
}
interface IExt is IBase {}
contract Ext is IExt, Base {}
contract Impl is Ext {
function foo() public view override (IBase, Base) {}
}
// ----
@@ -0,0 +1,22 @@
interface IBase {
function foo() external view;
}
contract Base1 is IBase { function foo() public virtual view {} }
contract Base2 is IBase { function foo() public virtual view {} }
interface IExt1a is IBase {}
interface IExt1b is IBase {}
interface IExt2a is IBase {}
interface IExt2b is IBase {}
contract Ext1 is IExt1a, IExt1b, Base1 {}
contract Ext2 is IExt2a, IExt2b, Base2 {}
contract Impl is Ext1, Ext2 {
function foo() public view {}
}
// ----
// TypeError 9456: (424-453): Overriding function is missing "override" specifier.
// TypeError 9456: (424-453): Overriding function is missing "override" specifier.
// TypeError 4327: (424-453): Function needs to specify overridden contracts "Base1", "Base2" and "IBase".
@@ -0,0 +1,18 @@
interface IBase {
function foo() external view;
}
contract Base1 is IBase { function foo() public virtual view {} }
contract Base2 is IBase { function foo() public virtual view {} }
interface IExt1a is IBase {}
interface IExt1b is IBase {}
interface IExt2a is IBase {}
interface IExt2b is IBase {}
contract Ext1 is IExt1a, IExt1b, Base1 {}
contract Ext2 is IExt2a, IExt2b, Base2 {}
contract Impl is Ext1, Ext2 {
function foo() public view override (IBase, Base1, Base2) {}
}
@@ -0,0 +1,18 @@
interface IBase {
function foo() external view;
}
contract Base1 is IBase { function foo() public virtual view {} }
contract Base2 is IBase { function foo() public virtual view {} }
interface IExt1a is IBase {}
abstract contract IExt1b is IBase {}
abstract contract IExt2a is IBase {}
interface IExt2b is IBase {}
contract Ext1 is IExt1a, IExt1b, Base1 {}
contract Ext2 is IExt2a, IExt2b, Base2 {}
contract Impl is Ext1, Ext2 {
function foo() public view override (IBase, Base1, Base2) {}
}