Forbid trailing commas in named arguments

This commit is contained in:
Federico Bond 2017-06-14 00:09:11 -03:00
parent c99c1c76f7
commit fd8365df08
2 changed files with 20 additions and 4 deletions

View File

@ -1328,16 +1328,21 @@ pair<vector<ASTPointer<Expression>>, vector<ASTPointer<ASTString>>> Parser::pars
{
// call({arg1 : 1, arg2 : 2 })
expectToken(Token::LBrace);
bool first = true;
while (m_scanner->currentToken() != Token::RBrace)
{
if (!first)
expectToken(Token::Comma);
if (m_scanner->currentToken() == Token::RBrace)
fatalParserError("Unexpected trailing comma.");
ret.second.push_back(expectIdentifierToken());
expectToken(Token::Colon);
ret.first.push_back(parseExpression());
if (m_scanner->currentToken() == Token::Comma)
expectToken(Token::Comma);
else
break;
first = false;
}
expectToken(Token::RBrace);
}

View File

@ -199,6 +199,17 @@ BOOST_AUTO_TEST_CASE(missing_argument_in_named_args)
CHECK_PARSE_ERROR(text, "Expected primary expression");
}
BOOST_AUTO_TEST_CASE(trailing_comma_in_named_args)
{
char const* text = R"(
contract test {
function a(uint a, uint b, uint c) returns (uint r) { r = a * 100 + b * 10 + c * 1; }
function b() returns (uint r) { r = a({a: 1, b: 2, c: 3, }); }
}
)";
CHECK_PARSE_ERROR(text, "Unexpected trailing comma");
}
BOOST_AUTO_TEST_CASE(two_exact_functions)
{
char const* text = R"(