Index: src/preparser.cc |
diff --git a/src/preparser.cc b/src/preparser.cc |
index 74e11b1d454b3b33a3f6bcadb18f91476a246f37..ff98f0817f2f2b6985e4f4e2ce18dc30c188a7f8 100644 |
--- a/src/preparser.cc |
+++ b/src/preparser.cc |
@@ -532,7 +532,6 @@ PreParser::Statement PreParser::ParseVariableDeclarations( |
// ConstBinding :: |
// BindingPattern '=' AssignmentExpression |
bool require_initializer = false; |
- bool is_strict_const = false; |
bool lexical = false; |
if (peek() == Token::VAR) { |
if (is_strong(language_mode())) { |
@@ -557,8 +556,7 @@ PreParser::Statement PreParser::ParseVariableDeclarations( |
if (is_strict(language_mode()) || |
(allow_harmony_sloppy() && !allow_legacy_const())) { |
DCHECK(var_context != kStatement); |
- is_strict_const = true; |
- require_initializer = var_context != kForStatement; |
+ require_initializer = true; |
lexical = true; |
} |
} else if (peek() == Token::LET && allow_let()) { |
@@ -579,11 +577,13 @@ PreParser::Statement PreParser::ParseVariableDeclarations( |
do { |
// Parse binding pattern. |
if (nvars > 0) Consume(Token::COMMA); |
+ int decl_pos = peek_position(); |
+ PreParserExpression pattern = PreParserExpression::Default(); |
{ |
ExpressionClassifier pattern_classifier; |
Token::Value next = peek(); |
- PreParserExpression pattern = |
- ParsePrimaryExpression(&pattern_classifier, CHECK_OK); |
+ pattern = ParsePrimaryExpression(&pattern_classifier, CHECK_OK); |
+ |
ValidateBindingPattern(&pattern_classifier, CHECK_OK); |
if (lexical) { |
ValidateLetPattern(&pattern_classifier, CHECK_OK); |
@@ -596,12 +596,15 @@ PreParser::Statement PreParser::ParseVariableDeclarations( |
} |
} |
+ bool is_pattern = pattern.IsObjectLiteral() || pattern.IsArrayLiteral(); |
+ |
+ bool is_for_iteration_variable = |
+ var_context == kForStatement && |
+ (peek() == Token::IN || PeekContextualKeyword(CStrVector("of"))); |
+ |
Scanner::Location variable_loc = scanner()->location(); |
nvars++; |
- if (peek() == Token::ASSIGN || require_initializer || |
- // require initializers for multiple consts. |
- (is_strict_const && peek() == Token::COMMA)) { |
- Expect(Token::ASSIGN, CHECK_OK); |
+ if (Check(Token::ASSIGN)) { |
ExpressionClassifier classifier; |
ParseAssignmentExpression(var_context != kForStatement, &classifier, |
CHECK_OK); |
@@ -611,6 +614,14 @@ PreParser::Statement PreParser::ParseVariableDeclarations( |
if (first_initializer_loc && !first_initializer_loc->IsValid()) { |
*first_initializer_loc = variable_loc; |
} |
+ } else if ((require_initializer || is_pattern) && |
+ !is_for_iteration_variable) { |
+ PreParserTraits::ReportMessageAt( |
+ Scanner::Location(decl_pos, scanner()->location().end_pos), |
+ MessageTemplate::kDeclarationMissingInitializer, |
+ is_pattern ? "destructuring" : "const"); |
+ *ok = false; |
+ return Statement::Default(); |
} |
} while (peek() == Token::COMMA); |