Merge pull request #9612 from ethereum/yul-rightarrow

Introduce RightArrow (->) token
This commit is contained in:
chriseth 2020-08-27 16:21:18 +02:00 committed by GitHub
commit 0798167f3d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 24 additions and 20 deletions

View File

@ -15,6 +15,7 @@ Compiler Features:
Bugfixes: Bugfixes:
* AST: Remove ``null`` member values also when the compiler is used in standard-json-mode. * AST: Remove ``null`` member values also when the compiler is used in standard-json-mode.
* Optimizer: Keep side-effects of ``x`` in ``byte(a, shr(b, x))`` even if the constants ``a`` and ``b`` would make the expression zero unconditionally. This optimizer rule is very hard if not impossible to trigger in a way that it can result in invalid code, though. * Optimizer: Keep side-effects of ``x`` in ``byte(a, shr(b, x))`` even if the constants ``a`` and ``b`` would make the expression zero unconditionally. This optimizer rule is very hard if not impossible to trigger in a way that it can result in invalid code, though.
* Scanner: Fix bug where whitespace would be allowed within the ``->`` token (e.g. ``function f() - > x {}`` becomes invalid in inline assembly and Yul).
* SMTChecker: Fix internal error in BMC function inlining. * SMTChecker: Fix internal error in BMC function inlining.
* SMTChecker: Fix internal error on array implicit conversion. * SMTChecker: Fix internal error on array implicit conversion.
* SMTChecker: Fix internal error on fixed bytes index access. * SMTChecker: Fix internal error on fixed bytes index access.

View File

@ -433,7 +433,7 @@ variableDeclarationTuple:
variableDeclarationStatement: ((variableDeclaration (Assign expression)?) | (variableDeclarationTuple Assign expression)) Semicolon; variableDeclarationStatement: ((variableDeclaration (Assign expression)?) | (variableDeclarationTuple Assign expression)) Semicolon;
expressionStatement: expression Semicolon; expressionStatement: expression Semicolon;
mappingType: Mapping LParen key=mappingKeyType Arrow value=typeName RParen; mappingType: Mapping LParen key=mappingKeyType DoubleArrow value=typeName RParen;
/** /**
* Only elementary types or user defined types are viable as mapping keys. * Only elementary types or user defined types are viable as mapping keys.
*/ */

View File

@ -111,7 +111,8 @@ Colon: ':';
Semicolon: ';'; Semicolon: ';';
Period: '.'; Period: '.';
Conditional: '?'; Conditional: '?';
Arrow: '=>'; DoubleArrow: '=>';
RightArrow: '->';
Assign: '='; Assign: '=';
AssignBitOr: '|='; AssignBitOr: '|=';
@ -283,9 +284,7 @@ YulRParen: ')';
YulAssign: ':='; YulAssign: ':=';
YulPeriod: '.'; YulPeriod: '.';
YulComma: ','; YulComma: ',';
// TODO: remove whitespace workaround once the parser disallows it. YulArrow: '->';
//@doc:name ->
YulArrow: '->' | '-' YulWS+ '>';
/** /**
* Yul identifiers consist of letters, dollar signs, underscores and numbers, but may not start with a number. * Yul identifiers consist of letters, dollar signs, underscores and numbers, but may not start with a number.

View File

@ -540,7 +540,7 @@ void Scanner::scanToken()
if (m_char == '=') if (m_char == '=')
token = selectToken(Token::Equal); token = selectToken(Token::Equal);
else if (m_char == '>') else if (m_char == '>')
token = selectToken(Token::Arrow); token = selectToken(Token::DoubleArrow);
else else
token = Token::Assign; token = Token::Assign;
break; break;
@ -563,12 +563,14 @@ void Scanner::scanToken()
token = Token::Add; token = Token::Add;
break; break;
case '-': case '-':
// - -- -= // - -- -= ->
advance(); advance();
if (m_char == '-') if (m_char == '-')
token = selectToken(Token::Dec); token = selectToken(Token::Dec);
else if (m_char == '=') else if (m_char == '=')
token = selectToken(Token::AssignSub); token = selectToken(Token::AssignSub);
else if (m_char == '>')
token = selectToken(Token::RightArrow);
else else
token = Token::Sub; token = Token::Sub;
break; break;

View File

@ -83,7 +83,8 @@ namespace solidity::langutil
T(Semicolon, ";", 0) \ T(Semicolon, ";", 0) \
T(Period, ".", 0) \ T(Period, ".", 0) \
T(Conditional, "?", 3) \ T(Conditional, "?", 3) \
T(Arrow, "=>", 0) \ T(DoubleArrow, "=>", 0) \
T(RightArrow, "->", 0) \
\ \
/* Assignment operators. */ \ /* Assignment operators. */ \
/* IsAssignmentOp() relies on this block of enum values being */ \ /* IsAssignmentOp() relies on this block of enum values being */ \

View File

@ -1050,7 +1050,7 @@ ASTPointer<Mapping> Parser::parseMapping()
} }
else else
fatalParserError(1005_error, "Expected elementary type name or identifier for mapping key type"); fatalParserError(1005_error, "Expected elementary type name or identifier for mapping key type");
expectToken(Token::Arrow); expectToken(Token::DoubleArrow);
ASTPointer<TypeName> valueType = parseTypeName(); ASTPointer<TypeName> valueType = parseTypeName();
nodeFactory.markEndPosition(); nodeFactory.markEndPosition();
expectToken(Token::RParen); expectToken(Token::RParen);

View File

@ -401,10 +401,9 @@ FunctionDefinition Parser::parseFunctionDefinition()
expectToken(Token::Comma); expectToken(Token::Comma);
} }
expectToken(Token::RParen); expectToken(Token::RParen);
if (currentToken() == Token::Sub) if (currentToken() == Token::RightArrow)
{ {
expectToken(Token::Sub); expectToken(Token::RightArrow);
expectToken(Token::GreaterThan);
while (true) while (true)
{ {
funDef.returnVariables.emplace_back(parseTypedName()); funDef.returnVariables.emplace_back(parseTypedName());

View File

@ -406,7 +406,7 @@ BOOST_AUTO_TEST_CASE(ambiguities)
BOOST_CHECK_EQUAL(scanner.next(), Token::AssignAdd); BOOST_CHECK_EQUAL(scanner.next(), Token::AssignAdd);
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier); BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
BOOST_CHECK_EQUAL(scanner.next(), Token::Inc); BOOST_CHECK_EQUAL(scanner.next(), Token::Inc);
BOOST_CHECK_EQUAL(scanner.next(), Token::Arrow); BOOST_CHECK_EQUAL(scanner.next(), Token::DoubleArrow);
BOOST_CHECK_EQUAL(scanner.next(), Token::SHL); BOOST_CHECK_EQUAL(scanner.next(), Token::SHL);
BOOST_CHECK_EQUAL(scanner.next(), Token::SAR); BOOST_CHECK_EQUAL(scanner.next(), Token::SAR);
BOOST_CHECK_EQUAL(scanner.next(), Token::AssignSar); BOOST_CHECK_EQUAL(scanner.next(), Token::AssignSar);
@ -782,8 +782,7 @@ BOOST_AUTO_TEST_CASE(yul_function)
BOOST_CHECK_EQUAL(scanner.next(), Token::Comma); BOOST_CHECK_EQUAL(scanner.next(), Token::Comma);
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier); BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
BOOST_CHECK_EQUAL(scanner.next(), Token::RParen); BOOST_CHECK_EQUAL(scanner.next(), Token::RParen);
BOOST_CHECK_EQUAL(scanner.next(), Token::Sub); BOOST_CHECK_EQUAL(scanner.next(), Token::RightArrow);
BOOST_CHECK_EQUAL(scanner.next(), Token::GreaterThan);
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier); BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
BOOST_CHECK_EQUAL(scanner.next(), Token::Comma); BOOST_CHECK_EQUAL(scanner.next(), Token::Comma);
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier); BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
@ -797,8 +796,7 @@ BOOST_AUTO_TEST_CASE(yul_function)
BOOST_CHECK_EQUAL(scanner.next(), Token::Comma); BOOST_CHECK_EQUAL(scanner.next(), Token::Comma);
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier); BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
BOOST_CHECK_EQUAL(scanner.next(), Token::RParen); BOOST_CHECK_EQUAL(scanner.next(), Token::RParen);
BOOST_CHECK_EQUAL(scanner.next(), Token::Sub); BOOST_CHECK_EQUAL(scanner.next(), Token::RightArrow);
BOOST_CHECK_EQUAL(scanner.next(), Token::GreaterThan);
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier); BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);
BOOST_CHECK_EQUAL(scanner.next(), Token::Comma); BOOST_CHECK_EQUAL(scanner.next(), Token::Comma);
BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier); BOOST_CHECK_EQUAL(scanner.next(), Token::Identifier);

View File

@ -5,7 +5,7 @@ contract C {
function asmfun(a, b, c) -> x, y, z { function asmfun(a, b, c) -> x, y, z {
x := g(a) x := g(a)
function g(r) - > s { function g(r) -> s {
s := mul(r, r) s := mul(r, r)
} }
y := g(b) y := g(b)

View File

@ -5,4 +5,6 @@ contract C {
} }
} }
} }
} }
// ----
// ParserError 2314: (87-88): Expected '{' but got '-'

View File

@ -1,4 +1,6 @@
{ {
function f (a, b , c ) - > y,x,z { function f (a, b , c ) - > y,x,z {
} }
} }
// ----
// ParserError 2314: (30-31): Expected '{' but got '-'