aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity
diff options
context:
space:
mode:
Diffstat (limited to 'libsolidity')
-rw-r--r--libsolidity/ast/Types.cpp3
-rw-r--r--libsolidity/ast/Types.h10
2 files changed, 11 insertions, 2 deletions
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp
index edb0fbe4..5d3d4f1a 100644
--- a/libsolidity/ast/Types.cpp
+++ b/libsolidity/ast/Types.cpp
@@ -2069,6 +2069,9 @@ TypePointer FunctionType::copyAndSetGasOrValue(bool _setGas, bool _setValue) con
FunctionTypePointer FunctionType::asMemberFunction(bool _inLibrary, bool _bound) const
{
+ if (_bound && m_parameterTypes.empty())
+ return FunctionTypePointer();
+
TypePointers parameterTypes;
for (auto const& t: m_parameterTypes)
{
diff --git a/libsolidity/ast/Types.h b/libsolidity/ast/Types.h
index f65d25fb..3f94d11a 100644
--- a/libsolidity/ast/Types.h
+++ b/libsolidity/ast/Types.h
@@ -872,7 +872,12 @@ public:
m_isConstant(_isConstant),
m_isPayable(_isPayable),
m_declaration(_declaration)
- {}
+ {
+ solAssert(
+ !m_bound || !m_parameterTypes.empty(),
+ "Attempted construction of bound function without self type"
+ );
+ }
TypePointers parameterTypes() const;
std::vector<std::string> parameterNames() const;
@@ -940,8 +945,9 @@ public:
/// removed and the location of reference types is changed from CallData to Memory.
/// This is needed if external functions are called on other contracts, as they cannot return
/// dynamic values.
+ /// Returns empty shared pointer on a failure. Namely, if a bound function has no parameters.
/// @param _inLibrary if true, uses DelegateCall as location.
- /// @param _bound if true, the argumenst are placed as `arg1.functionName(arg2, ..., argn)`.
+ /// @param _bound if true, the arguments are placed as `arg1.functionName(arg2, ..., argn)`.
FunctionTypePointer asMemberFunction(bool _inLibrary, bool _bound = false) const;
private: