From ef3595b0001614c19174c61d29d221844ed83a0e Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Tue, 27 Feb 2018 12:02:56 +0100 Subject: Allow overriding external functions in interfaces with public in an implementing contract --- libsolidity/analysis/TypeChecker.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'libsolidity') diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 999a2a97..487959c5 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -366,6 +366,16 @@ void TypeChecker::checkContractIllegalOverrides(ContractDefinition const& _contr } } +namespace { + +bool functionIsInInterface(FunctionDefinition const& _function) +{ + return dynamic_cast(_function.scope()) && + dynamic_cast(_function.scope())->contractKind() == ContractDefinition::ContractKind::Interface; +} + +} + void TypeChecker::checkFunctionOverride(FunctionDefinition const& function, FunctionDefinition const& super) { FunctionType functionType(function); @@ -378,7 +388,12 @@ void TypeChecker::checkFunctionOverride(FunctionDefinition const& function, Func function.annotation().superFunction = &super; if (function.visibility() != super.visibility()) + { + // visibility is enforced to be external in interfaces, but a contract can override that with public + if (functionIsInInterface(super) && !functionIsInInterface(function) && function.visibility() == FunctionDefinition::Visibility::Public) + return; overrideError(function, super, "Overriding function visibility differs."); + } else if (function.stateMutability() != super.stateMutability()) overrideError( -- cgit v1.2.3