diff --git a/libsolidity/codegen/CompilerContext.cpp b/libsolidity/codegen/CompilerContext.cpp index 398e362f5..6de51298d 100644 --- a/libsolidity/codegen/CompilerContext.cpp +++ b/libsolidity/codegen/CompilerContext.cpp @@ -286,7 +286,11 @@ FunctionDefinition const& CompilerContext::superFunction(FunctionDefinition cons solAssert(m_mostDerivedContract, "No most derived contract set."); ContractDefinition const* super = _base.superContract(mostDerivedContract()); solAssert(super, "Super contract not available."); - return _function.resolveVirtual(mostDerivedContract(), super); + + FunctionDefinition const& resolvedFunction = _function.resolveVirtual(mostDerivedContract(), super); + solAssert(resolvedFunction.isImplemented(), ""); + + return resolvedFunction; } ContractDefinition const& CompilerContext::mostDerivedContract() const diff --git a/libsolidity/codegen/ContractCompiler.cpp b/libsolidity/codegen/ContractCompiler.cpp index 5afa4d26f..fca076b65 100644 --- a/libsolidity/codegen/ContractCompiler.cpp +++ b/libsolidity/codegen/ContractCompiler.cpp @@ -604,6 +604,8 @@ bool ContractCompiler::visit(VariableDeclaration const& _variableDeclaration) bool ContractCompiler::visit(FunctionDefinition const& _function) { + solAssert(_function.isImplemented(), ""); + CompilerContext::LocationSetter locationSetter(m_context, _function); m_context.startFunction(_function); diff --git a/test/libsolidity/syntaxTests/inheritance/override/override_unimplemented_fail.sol b/test/libsolidity/syntaxTests/inheritance/override/override_unimplemented_and_implemented_with_unimplemented.sol similarity index 100% rename from test/libsolidity/syntaxTests/inheritance/override/override_unimplemented_fail.sol rename to test/libsolidity/syntaxTests/inheritance/override/override_unimplemented_and_implemented_with_unimplemented.sol diff --git a/test/libsolidity/syntaxTests/inheritance/override/override_unimplemented_fine.sol b/test/libsolidity/syntaxTests/inheritance/override/override_unimplemented_and_unimplemented_with_unimplemented.sol similarity index 100% rename from test/libsolidity/syntaxTests/inheritance/override/override_unimplemented_fine.sol rename to test/libsolidity/syntaxTests/inheritance/override/override_unimplemented_and_unimplemented_with_unimplemented.sol diff --git a/test/libsolidity/syntaxTests/modifiers/cross_contract_super.sol b/test/libsolidity/syntaxTests/modifiers/cross_contract_super.sol new file mode 100644 index 000000000..b70ba3092 --- /dev/null +++ b/test/libsolidity/syntaxTests/modifiers/cross_contract_super.sol @@ -0,0 +1,9 @@ +contract C { + modifier m() { _; } +} +contract D is C { + function f() super.m public { + } +} +// ---- +// DeclarationError 7920: (74-81): Identifier not found or not unique.