From 6d1644e55c03850341e6bfcc4ae46f8de264a039 Mon Sep 17 00:00:00 2001 From: chriseth Date: Thu, 29 Nov 2018 18:32:06 +0100 Subject: Move external type clash check. --- libsolidity/analysis/ContractLevelChecker.cpp | 37 +++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'libsolidity/analysis/ContractLevelChecker.cpp') diff --git a/libsolidity/analysis/ContractLevelChecker.cpp b/libsolidity/analysis/ContractLevelChecker.cpp index dd08e181..e2208f3f 100644 --- a/libsolidity/analysis/ContractLevelChecker.cpp +++ b/libsolidity/analysis/ContractLevelChecker.cpp @@ -42,6 +42,7 @@ bool ContractLevelChecker::check(ContractDefinition const& _contract) checkBaseConstructorArguments(_contract); checkConstructor(_contract); checkFallbackFunction(_contract); + checkExternalTypeClashes(_contract); return Error::containsOnlyWarnings(m_errorReporter.errors()); } @@ -383,3 +384,39 @@ void ContractLevelChecker::checkFallbackFunction(ContractDefinition const& _cont if (fallback->visibility() != FunctionDefinition::Visibility::External) m_errorReporter.typeError(fallback->location(), "Fallback function must be defined as \"external\"."); } + +void ContractLevelChecker::checkExternalTypeClashes(ContractDefinition const& _contract) +{ + map>> externalDeclarations; + for (ContractDefinition const* contract: _contract.annotation().linearizedBaseContracts) + { + for (FunctionDefinition const* f: contract->definedFunctions()) + if (f->isPartOfExternalInterface()) + { + auto functionType = make_shared(*f); + // under non error circumstances this should be true + if (functionType->interfaceFunctionType()) + externalDeclarations[functionType->externalSignature()].push_back( + make_pair(f, functionType->asCallableFunction(false)) + ); + } + for (VariableDeclaration const* v: contract->stateVariables()) + if (v->isPartOfExternalInterface()) + { + auto functionType = make_shared(*v); + // under non error circumstances this should be true + if (functionType->interfaceFunctionType()) + externalDeclarations[functionType->externalSignature()].push_back( + make_pair(v, functionType->asCallableFunction(false)) + ); + } + } + for (auto const& it: externalDeclarations) + for (size_t i = 0; i < it.second.size(); ++i) + for (size_t j = i + 1; j < it.second.size(); ++j) + if (!it.second[i].second->hasEqualParameterTypes(*it.second[j].second)) + m_errorReporter.typeError( + it.second[j].first->location(), + "Function overload clash during conversion to external types for arguments." + ); +} -- cgit v1.2.3