Merge branch 'develop' of github.com:ethereum/cpp-ethereum into develop

This commit is contained in:
Gav Wood 2015-01-26 15:00:48 -08:00
commit 6e33b8cce1

View File

@ -111,7 +111,7 @@ void NameAndTypeResolver::linearizeBaseContracts(ContractDefinition& _contract)
{ {
// order in the lists is from derived to base // order in the lists is from derived to base
// list of lists to linearize, the last element is the list of direct bases // list of lists to linearize, the last element is the list of direct bases
list<list<ContractDefinition const*>> input(1, {&_contract}); list<list<ContractDefinition const*>> input(1, {});
for (ASTPointer<InheritanceSpecifier> const& baseSpecifier: _contract.getBaseContracts()) for (ASTPointer<InheritanceSpecifier> const& baseSpecifier: _contract.getBaseContracts())
{ {
ASTPointer<Identifier> baseName = baseSpecifier->getName(); ASTPointer<Identifier> baseName = baseSpecifier->getName();
@ -119,14 +119,15 @@ void NameAndTypeResolver::linearizeBaseContracts(ContractDefinition& _contract)
baseName->getReferencedDeclaration()); baseName->getReferencedDeclaration());
if (!base) if (!base)
BOOST_THROW_EXCEPTION(baseName->createTypeError("Contract expected.")); BOOST_THROW_EXCEPTION(baseName->createTypeError("Contract expected."));
// "push_back" has the effect that bases mentioned earlier can overwrite members of bases // "push_front" has the effect that bases mentioned later can overwrite members of bases
// mentioned later // mentioned earlier
input.back().push_back(base); input.back().push_front(base);
vector<ContractDefinition const*> const& basesBases = base->getLinearizedBaseContracts(); vector<ContractDefinition const*> const& basesBases = base->getLinearizedBaseContracts();
if (basesBases.empty()) if (basesBases.empty())
BOOST_THROW_EXCEPTION(baseName->createTypeError("Definition of base has to precede definition of derived contract")); BOOST_THROW_EXCEPTION(baseName->createTypeError("Definition of base has to precede definition of derived contract"));
input.push_front(list<ContractDefinition const*>(basesBases.begin(), basesBases.end())); input.push_front(list<ContractDefinition const*>(basesBases.begin(), basesBases.end()));
} }
input.back().push_front(&_contract);
vector<ContractDefinition const*> result = cThreeMerge(input); vector<ContractDefinition const*> result = cThreeMerge(input);
if (result.empty()) if (result.empty())
BOOST_THROW_EXCEPTION(_contract.createTypeError("Linearization of inheritance graph impossible")); BOOST_THROW_EXCEPTION(_contract.createTypeError("Linearization of inheritance graph impossible"));