| Index: src/parser.cc
 | 
| diff --git a/src/parser.cc b/src/parser.cc
 | 
| index 98abbe431a7d7eee64726e22c8ee2fdb871c66d4..5e7530496bdbcac537a066c30598b21c9c9b9bb4 100644
 | 
| --- a/src/parser.cc
 | 
| +++ b/src/parser.cc
 | 
| @@ -2479,12 +2479,20 @@ Statement* Parser::ParseExpressionOrLabelledStatement(
 | 
|  
 | 
|    // Parsed expression statement, or the context-sensitive 'module' keyword.
 | 
|    // Only expect semicolon in the former case.
 | 
| +  // Also detect attempts at 'let' declarations in sloppy mode.
 | 
|    if (!FLAG_harmony_modules || peek() != Token::IDENTIFIER ||
 | 
|        scanner()->HasAnyLineTerminatorBeforeNext() ||
 | 
|        expr->AsVariableProxy() == NULL ||
 | 
|        expr->AsVariableProxy()->raw_name() !=
 | 
|            ast_value_factory()->module_string() ||
 | 
|        scanner()->literal_contains_escapes()) {
 | 
| +    if (peek() == Token::IDENTIFIER && expr->AsVariableProxy() != NULL &&
 | 
| +        expr->AsVariableProxy()->raw_name() ==
 | 
| +            ast_value_factory()->let_string()) {
 | 
| +      ReportMessage("lexical_strict_mode", NULL);
 | 
| +      *ok = false;
 | 
| +      return NULL;
 | 
| +    }
 | 
|      ExpectSemicolon(CHECK_OK);
 | 
|    }
 | 
|    return factory()->NewExpressionStatement(expr, pos);
 | 
| @@ -3214,6 +3222,7 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
 | 
|    Expect(Token::FOR, CHECK_OK);
 | 
|    Expect(Token::LPAREN, CHECK_OK);
 | 
|    for_scope->set_start_position(scanner()->location().beg_pos);
 | 
| +  bool is_let_identifier_expression = false;
 | 
|    if (peek() != Token::SEMICOLON) {
 | 
|      if (peek() == Token::VAR ||
 | 
|          (peek() == Token::CONST && strict_mode() == SLOPPY)) {
 | 
| @@ -3325,6 +3334,10 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
 | 
|        Expression* expression = ParseExpression(false, CHECK_OK);
 | 
|        ForEachStatement::VisitMode mode;
 | 
|        bool accept_OF = expression->IsVariableProxy();
 | 
| +      is_let_identifier_expression =
 | 
| +        expression->IsVariableProxy() &&
 | 
| +        expression->AsVariableProxy()->raw_name() ==
 | 
| +            ast_value_factory()->let_string();
 | 
|  
 | 
|        if (CheckInOrOf(accept_OF, &mode)) {
 | 
|          expression = this->CheckAndRewriteReferenceExpression(
 | 
| @@ -3357,6 +3370,13 @@ Statement* Parser::ParseForStatement(ZoneList<const AstRawString*>* labels,
 | 
|    Target target(&this->target_stack_, loop);
 | 
|  
 | 
|    // Parsed initializer at this point.
 | 
| +  // Detect attempts at 'let' declarations in sloppy mode.
 | 
| +  if (peek() == Token::IDENTIFIER && strict_mode() == SLOPPY &&
 | 
| +      is_let_identifier_expression) {
 | 
| +    ReportMessage("lexical_strict_mode", NULL);
 | 
| +    *ok = false;
 | 
| +    return NULL;
 | 
| +  }
 | 
|    Expect(Token::SEMICOLON, CHECK_OK);
 | 
|  
 | 
|    // If there are let bindings, then condition and the next statement of the
 | 
| 
 |