diff --git a/AST.cpp b/AST.cpp index 00660c5da..aba355768 100644 --- a/AST.cpp +++ b/AST.cpp @@ -353,7 +353,7 @@ void ModifierDefinition::checkTypeRequirements() m_body->checkTypeRequirements(); } -void ModifierInvocation::checkTypeRequirements(std::vector> const& _bases) +void ModifierInvocation::checkTypeRequirements(vector> const& _bases) { m_modifierName->checkTypeRequirements(); for (ASTPointer const& argument: m_arguments) @@ -365,12 +365,12 @@ void ModifierInvocation::checkTypeRequirements(std::vector(declaration)) parameters = &modifier->getParameters(); else + // check parameters for Base constructors for (auto const& base: _bases) if (declaration == base->getName()->getReferencedDeclaration()) { - m_referencedConstructor = dynamic_cast(*declaration).getConstructor(); - if (m_referencedConstructor) - parameters = &m_referencedConstructor->getParameters(); + if (auto referencedConstructor = dynamic_cast(*declaration).getConstructor()) + parameters = &referencedConstructor->getParameters(); else parameters = &emptyParameterList; break; diff --git a/AST.h b/AST.h index 967c6792d..c91c433ed 100644 --- a/AST.h +++ b/AST.h @@ -525,12 +525,12 @@ public: ASTPointer const& getName() const { return m_modifierName; } std::vector> const& getArguments() const { return m_arguments; } + /// @param _bases is the list of base contracts for base constructor calls. For modifiers an empty vector should be passed. void checkTypeRequirements(std::vector> const& _bases); private: ASTPointer m_modifierName; std::vector> m_arguments; - FunctionDefinition const* m_referencedConstructor = nullptr; }; /** diff --git a/CompilerContext.cpp b/CompilerContext.cpp index 7184dc37d..61c25052c 100644 --- a/CompilerContext.cpp +++ b/CompilerContext.cpp @@ -126,7 +126,7 @@ eth::AssemblyItem CompilerContext::getSuperFunctionEntryLabel(string const& _nam FunctionDefinition const* CompilerContext::getNextConstructor(ContractDefinition const& _contract) const { vector::const_iterator it = getSuperContract(_contract); - for (; it != m_inheritanceHierarchy.end(); it = getSuperContract(**it)) + for (; it != m_inheritanceHierarchy.end(); ++it) if ((*it)->getConstructor()) return (*it)->getConstructor();