diff --git a/libsolidity/Parser.cpp b/libsolidity/Parser.cpp index 7ce0f0748..d2e888a8d 100644 --- a/libsolidity/Parser.cpp +++ b/libsolidity/Parser.cpp @@ -222,12 +222,7 @@ ASTPointer Parser::parseFunctionDefinition(bool _isPublic, A returnParameters = parseParameterList(permitEmptyParameterList); } else - { - // create an empty parameter list at a zero-length location - ASTNodeFactory nodeFactory(*this); - nodeFactory.setLocationEmpty(); - returnParameters = nodeFactory.createNode(vector>()); - } + returnParameters = createEmptyParameterList(); ASTPointer block = parseBlock(); nodeFactory.setEndPositionFromNode(block); bool const c_isConstructor = (_contractName && *name == *_contractName); @@ -285,12 +280,7 @@ ASTPointer Parser::parseModifierDefinition() if (m_scanner->getCurrentToken() == Token::LPAREN) parameters = parseParameterList(); else - { - // create an empty parameter list at a zero-length location - ASTNodeFactory nodeFactory(*this); - nodeFactory.setLocationEmpty(); - parameters = nodeFactory.createNode(vector>()); - } + parameters = createEmptyParameterList(); ASTPointer block = parseBlock(); nodeFactory.setEndPositionFromNode(block); return nodeFactory.createNode(name, docstring, parameters, block); @@ -308,6 +298,8 @@ ASTPointer Parser::parseEventDefinition() ASTPointer parameters; if (m_scanner->getCurrentToken() == Token::LPAREN) parameters = parseParameterList(true, true); + else + parameters = createEmptyParameterList(); nodeFactory.markEndPosition(); expectToken(Token::SEMICOLON); return nodeFactory.createNode(name, docstring, parameters); @@ -771,6 +763,13 @@ ASTPointer Parser::getLiteralAndAdvance() return identifier; } +ASTPointer Parser::createEmptyParameterList() +{ + ASTNodeFactory nodeFactory(*this); + nodeFactory.setLocationEmpty(); + return nodeFactory.createNode(vector>()); +} + ParserError Parser::createParserError(string const& _description) const { return ParserError() << errinfo_sourceLocation(Location(getPosition(), getPosition(), getSourceName())) diff --git a/libsolidity/Parser.h b/libsolidity/Parser.h index 69478c81e..413a2711e 100644 --- a/libsolidity/Parser.h +++ b/libsolidity/Parser.h @@ -97,6 +97,9 @@ private: ASTPointer getLiteralAndAdvance(); ///@} + /// Creates an empty ParameterList at the current location (used if parameters can be omitted). + ASTPointer createEmptyParameterList(); + /// Creates a @ref ParserError exception and annotates it with the current position and the /// given @a _description. ParserError createParserError(std::string const& _description) const; diff --git a/test/SolidityEndToEndTest.cpp b/test/SolidityEndToEndTest.cpp index da7f70d1d..7edc250c8 100644 --- a/test/SolidityEndToEndTest.cpp +++ b/test/SolidityEndToEndTest.cpp @@ -2016,6 +2016,25 @@ BOOST_AUTO_TEST_CASE(event) } } +BOOST_AUTO_TEST_CASE(event_no_arguments) +{ + char const* sourceCode = R"( + contract ClientReceipt { + event Deposit; + function deposit() { + Deposit(); + } + } + )"; + compileAndRun(sourceCode); + callContractFunction("deposit()"); + BOOST_REQUIRE_EQUAL(m_logs.size(), 1); + BOOST_CHECK_EQUAL(m_logs[0].address, m_contractAddress); + BOOST_CHECK(m_logs[0].data.empty()); + BOOST_REQUIRE_EQUAL(m_logs[0].topics.size(), 1); + BOOST_CHECK_EQUAL(m_logs[0].topics[0], dev::sha3(string("Deposit()"))); +} + BOOST_AUTO_TEST_CASE(event_lots_of_data) { char const* sourceCode = R"(