Chromium Code Reviews| Index: src/parsing/preparser.cc |
| diff --git a/src/parsing/preparser.cc b/src/parsing/preparser.cc |
| index acb6b33750d4597de19b65bd0a39d7f7ddde7348..54bc2027e8a6de87f70b7fb2b8b86d7359d1ed92 100644 |
| --- a/src/parsing/preparser.cc |
| +++ b/src/parsing/preparser.cc |
| @@ -956,15 +956,24 @@ PreParser::Statement PreParser::ParseForStatement(bool* ok) { |
| } |
| } else { |
| int lhs_beg_pos = peek_position(); |
| - Expression lhs = ParseExpression(false, CHECK_OK); |
| + ExpressionClassifier classifier; |
| + Expression lhs = ParseExpression(false, &classifier, CHECK_OK); |
| int lhs_end_pos = scanner()->location().end_pos; |
| is_let_identifier_expression = |
| lhs.IsIdentifier() && lhs.AsIdentifier().IsLet(); |
| if (CheckInOrOf(&mode, ok)) { |
| if (!*ok) return Statement::Default(); |
| - lhs = CheckAndRewriteReferenceExpression( |
| - lhs, lhs_beg_pos, lhs_end_pos, MessageTemplate::kInvalidLhsInFor, |
| - kSyntaxError, CHECK_OK); |
| + bool is_destructuring = |
| + allow_harmony_destructuring_assignment() && |
| + (lhs->IsArrayLiteral() || lhs->IsObjectLiteral()); |
| + if (is_destructuring) { |
| + ValidateAssignmentPattern(&classifier, CHECK_OK); |
|
adamk
2015/12/10 19:23:33
Please add a few tests to test-parsing.cc to make
|
| + } else { |
| + ValidateExpression(&classifier, CHECK_OK); |
| + lhs = CheckAndRewriteReferenceExpression( |
| + lhs, lhs_beg_pos, lhs_end_pos, MessageTemplate::kInvalidLhsInFor, |
| + kSyntaxError, CHECK_OK); |
| + } |
| ParseExpression(true, CHECK_OK); |
| Expect(Token::RPAREN, CHECK_OK); |
| ParseSubStatement(CHECK_OK); |