Ensure that bound functions cannot be defined without self type

This commit is contained in:
Alex Beregszaszi 2016-10-14 19:30:04 +01:00
parent 8317eb0383
commit 003359a0b6
3 changed files with 12 additions and 2 deletions

View File

@ -8,6 +8,7 @@ Features:
Bugfixes:
* Disallow unknown options in `solc`
* Proper type checking for bound functions.
* Code Generator: expect zero stack increase after `super` as an expression
* Inline assembly: support the `address` opcode
* Inline assembly: fix parsing of assignment after a label.

View File

@ -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)
{

View File

@ -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: