Fix parsing of an "async of" edge case in for loop #1286
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The following edge case of for loops should result in syntax error but is accepted currently:
This PR makes an attempt at fixing this issue.
Also, suggests a minor improvement to parsing of for statements:
As far as I can tell based on the spec, we can "take a shortcut" in the case of for-await-of loops. Once we read "for await", the initializer of the for statement is no longer ambiguous (since we know that it can't be a for(;;) loop), that is, the initializer part will be a LeftHandSideExpression (unless it's a variable declaration). So, we don't need to parse a full expression using
parseExpression
,parseExprSubscripts
is enough - if my understanding of acorn's inner workings is correct.Also V8 seems to take this shortcut: just check the error reported for e.g.
async() => { for await (x = 1 of []); }