diff options
Diffstat (limited to 'libsolidity/ast')
-rw-r--r-- | libsolidity/ast/AST_accept.h | 12 | ||||
-rw-r--r-- | libsolidity/ast/Types.cpp | 5 | ||||
-rw-r--r-- | libsolidity/ast/Types.h | 4 |
3 files changed, 13 insertions, 8 deletions
diff --git a/libsolidity/ast/AST_accept.h b/libsolidity/ast/AST_accept.h index 3f7b8d36..61370c55 100644 --- a/libsolidity/ast/AST_accept.h +++ b/libsolidity/ast/AST_accept.h @@ -127,9 +127,9 @@ void UsingForDirective::accept(ASTVisitor& _visitor) { if (_visitor.visit(*this)) { - if (m_libraryName) - m_libraryName->accept(_visitor); - m_typeName->accept(_visitor); + m_libraryName->accept(_visitor); + if (m_typeName) + m_typeName->accept(_visitor); } _visitor.endVisit(*this); } @@ -138,9 +138,9 @@ void UsingForDirective::accept(ASTConstVisitor& _visitor) const { if (_visitor.visit(*this)) { - if (m_libraryName) - m_libraryName->accept(_visitor); - m_typeName->accept(_visitor); + m_libraryName->accept(_visitor); + if (m_typeName) + m_typeName->accept(_visitor); } _visitor.endVisit(*this); } diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 44586a6d..0409ac63 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -1640,8 +1640,11 @@ MemberList::MemberMap FunctionType::nativeMembers(ContractDefinition const*) con } } -bool FunctionType::canTakeArguments(TypePointers const& _argumentTypes) const +bool FunctionType::canTakeArguments(TypePointers const& _argumentTypes, TypePointer const& _selfType) const { + solAssert(!bound() || _selfType, ""); + if (bound() && !_selfType->isImplicitlyConvertibleTo(*selfType())) + return false; TypePointers paramTypes = parameterTypes(); if (takesArbitraryParameters()) return true; diff --git a/libsolidity/ast/Types.h b/libsolidity/ast/Types.h index 0f74f599..9224f292 100644 --- a/libsolidity/ast/Types.h +++ b/libsolidity/ast/Types.h @@ -829,7 +829,9 @@ public: /// @returns true if this function can take the given argument types (possibly /// after implicit conversion). - bool canTakeArguments(TypePointers const& _arguments) const; + /// @param _selfType if the function is bound, this has to be supplied and is the type of the + /// expression the function is called on. + bool canTakeArguments(TypePointers const& _arguments, TypePointer const& _selfType = TypePointer()) const; /// @returns true if the types of parameters are equal (does't check return parameter types) bool hasEqualArgumentTypes(FunctionType const& _other) const; |