Merge pull request #11569 from ethereum/fixcalltounimplementedmodifier

Prevent calls to unimplemented modifiers.
This commit is contained in:
chriseth 2021-06-23 09:25:02 +02:00 committed by GitHub
commit 26598a2603
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 0 deletions

View File

@ -8,6 +8,7 @@ Compiler Features:
Bugfixes:
* Code Generator: Fix internal compiler error when calling functions bound to calldata structs and arrays.
* Type Checker: Fix internal error and prevent static calls to unimplemented modifiers.
### 0.8.6 (2021-06-22)

View File

@ -639,6 +639,15 @@ void TypeChecker::visitManually(
"Can only use modifiers defined in the current contract or in base contracts."
);
}
if (
*_modifier.name().annotation().requiredLookup == VirtualLookup::Static &&
!modifierDecl->isImplemented()
)
m_errorReporter.typeError(
1835_error,
_modifier.location(),
"Cannot call unimplemented modifier. The modifier has no implementation in the referenced contract. Refer to it by its unqualified name if you want to call the implementation from the most derived contract."
);
}
else
// check parameters for Base constructors

View File

@ -0,0 +1,12 @@
contract A {
modifier m() virtual { _; }
}
abstract contract B {
modifier m() virtual;
}
contract C is A, B {
modifier m() override(A, B) { _; }
function f() B.m public {}
}
// ----
// TypeError 1835: (174-177): Cannot call unimplemented modifier. The modifier has no implementation in the referenced contract. Refer to it by its unqualified name if you want to call the implementation from the most derived contract.