| Index: src/parser.cc
 | 
| diff --git a/src/parser.cc b/src/parser.cc
 | 
| index ff7d61dcfb5d00445dfe5dbeca28e79746ecb466..c038ca2fa7f8db18b32436554a70d920ce829e50 100644
 | 
| --- a/src/parser.cc
 | 
| +++ b/src/parser.cc
 | 
| @@ -870,7 +870,6 @@ Parser::Parser(ParseInfo* info)
 | 
|    DCHECK(!info->script().is_null() || info->source_stream() != NULL);
 | 
|    set_allow_lazy(info->allow_lazy_parsing());
 | 
|    set_allow_natives(FLAG_allow_natives_syntax || info->is_native());
 | 
| -  set_allow_harmony_scoping(!info->is_native() && FLAG_harmony_scoping);
 | 
|    set_allow_harmony_modules(!info->is_native() && FLAG_harmony_modules);
 | 
|    set_allow_harmony_arrow_functions(FLAG_harmony_arrow_functions);
 | 
|    set_allow_harmony_numeric_literals(FLAG_harmony_numeric_literals);
 | 
| @@ -1026,9 +1025,6 @@ FunctionLiteral* Parser::DoParseProgram(ParseInfo* info, Scope** scope,
 | 
|  
 | 
|      if (ok && is_strict(language_mode())) {
 | 
|        CheckStrictOctalLiteral(beg_pos, scanner()->location().end_pos, &ok);
 | 
| -    }
 | 
| -
 | 
| -    if (ok && allow_harmony_scoping() && is_strict(language_mode())) {
 | 
|        CheckConflictingVarDeclarations(scope_, &ok);
 | 
|      }
 | 
|  
 | 
| @@ -1290,7 +1286,6 @@ Statement* Parser::ParseStatementListItem(bool* ok) {
 | 
|      case Token::VAR:
 | 
|        return ParseVariableStatement(kStatementListItem, NULL, ok);
 | 
|      case Token::LET:
 | 
| -      DCHECK(allow_harmony_scoping());
 | 
|        if (is_strict(language_mode())) {
 | 
|          return ParseVariableStatement(kStatementListItem, NULL, ok);
 | 
|        }
 | 
| @@ -1911,7 +1906,7 @@ Variable* Parser::Declare(Declaration* declaration, bool resolve, bool* ok) {
 | 
|        // because the var declaration is hoisted to the function scope where 'x'
 | 
|        // is already bound.
 | 
|        DCHECK(IsDeclaredVariableMode(var->mode()));
 | 
| -      if (allow_harmony_scoping() && is_strict(language_mode())) {
 | 
| +      if (is_strict(language_mode())) {
 | 
|          // In harmony we treat re-declarations as early errors. See
 | 
|          // ES5 16 for a definition of early errors.
 | 
|          ParserTraits::ReportMessage("var_redeclaration", name);
 | 
| @@ -2062,12 +2057,13 @@ Statement* Parser::ParseFunctionDeclaration(
 | 
|    // In ES6, a function behaves as a lexical binding, except in
 | 
|    // a script scope, or the initial scope of eval or another function.
 | 
|    VariableMode mode =
 | 
| -      is_strong(language_mode()) ? CONST :
 | 
| -      allow_harmony_scoping() && is_strict(language_mode()) &&
 | 
| -              !(scope_->is_script_scope() || scope_->is_eval_scope() ||
 | 
| -                scope_->is_function_scope())
 | 
| -          ? LET
 | 
| -          : VAR;
 | 
| +      is_strong(language_mode())
 | 
| +          ? CONST
 | 
| +          : is_strict(language_mode()) &&
 | 
| +                    !(scope_->is_script_scope() || scope_->is_eval_scope() ||
 | 
| +                      scope_->is_function_scope())
 | 
| +                ? LET
 | 
| +                : VAR;
 | 
|    VariableProxy* proxy = NewUnresolved(name, mode);
 | 
|    Declaration* declaration =
 | 
|        factory()->NewFunctionDeclaration(proxy, mode, fun, scope_, pos);
 | 
| @@ -2124,7 +2120,7 @@ Statement* Parser::ParseClassDeclaration(ZoneList<const AstRawString*>* names,
 | 
|  
 | 
|  
 | 
|  Block* Parser::ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok) {
 | 
| -  if (allow_harmony_scoping() && is_strict(language_mode())) {
 | 
| +  if (is_strict(language_mode())) {
 | 
|      return ParseScopedBlock(labels, ok);
 | 
|    }
 | 
|  
 | 
| @@ -2246,19 +2242,12 @@ Block* Parser::ParseVariableDeclarations(
 | 
|        init_op = Token::INIT_CONST_LEGACY;
 | 
|      } else {
 | 
|        DCHECK(var_context != kStatement);
 | 
| -      // In ES5 const is not allowed in strict mode.
 | 
| -      if (!allow_harmony_scoping()) {
 | 
| -        ReportMessage("strict_const");
 | 
| -        *ok = false;
 | 
| -        return NULL;
 | 
| -      }
 | 
|        mode = CONST;
 | 
|        init_op = Token::INIT_CONST;
 | 
|      }
 | 
|      is_const = true;
 | 
|      needs_init = true;
 | 
|    } else if (peek() == Token::LET && is_strict(language_mode())) {
 | 
| -    DCHECK(allow_harmony_scoping());
 | 
|      Consume(Token::LET);
 | 
|      DCHECK(var_context != kStatement);
 | 
|      mode = LET;
 | 
| @@ -3733,13 +3722,12 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
 | 
|    //   nested function, and hoisting works normally relative to that.
 | 
|    Scope* declaration_scope = scope_->DeclarationScope();
 | 
|    Scope* original_declaration_scope = original_scope_->DeclarationScope();
 | 
| -  Scope* scope =
 | 
| -      function_type == FunctionLiteral::DECLARATION &&
 | 
| -              (!allow_harmony_scoping() || is_sloppy(language_mode())) &&
 | 
| -              (original_scope_ == original_declaration_scope ||
 | 
| -               declaration_scope != original_declaration_scope)
 | 
| -          ? NewScope(declaration_scope, FUNCTION_SCOPE, kind)
 | 
| -          : NewScope(scope_, FUNCTION_SCOPE, kind);
 | 
| +  Scope* scope = function_type == FunctionLiteral::DECLARATION &&
 | 
| +                         is_sloppy(language_mode()) &&
 | 
| +                         (original_scope_ == original_declaration_scope ||
 | 
| +                          declaration_scope != original_declaration_scope)
 | 
| +                     ? NewScope(declaration_scope, FUNCTION_SCOPE, kind)
 | 
| +                     : NewScope(scope_, FUNCTION_SCOPE, kind);
 | 
|    ZoneList<Statement*>* body = NULL;
 | 
|    int materialized_literal_count = -1;
 | 
|    int expected_property_count = -1;
 | 
| @@ -3847,12 +3835,11 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
 | 
|      Variable* fvar = NULL;
 | 
|      Token::Value fvar_init_op = Token::INIT_CONST_LEGACY;
 | 
|      if (function_type == FunctionLiteral::NAMED_EXPRESSION) {
 | 
| -      if (allow_harmony_scoping() && is_strict(language_mode())) {
 | 
| +      if (is_strict(language_mode())) {
 | 
|          fvar_init_op = Token::INIT_CONST;
 | 
|        }
 | 
|        VariableMode fvar_mode =
 | 
| -          allow_harmony_scoping() && is_strict(language_mode()) ? CONST
 | 
| -                                                                : CONST_LEGACY;
 | 
| +          is_strict(language_mode()) ? CONST : CONST_LEGACY;
 | 
|        DCHECK(function_name != NULL);
 | 
|        fvar = new (zone())
 | 
|            Variable(scope_, function_name, fvar_mode, true /* is valid LHS */,
 | 
| @@ -3926,7 +3913,7 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
 | 
|        CheckStrictOctalLiteral(scope->start_position(), scope->end_position(),
 | 
|                                CHECK_OK);
 | 
|      }
 | 
| -    if (allow_harmony_scoping() && is_strict(language_mode())) {
 | 
| +    if (is_strict(language_mode())) {
 | 
|        CheckConflictingVarDeclarations(scope, CHECK_OK);
 | 
|      }
 | 
|    }
 | 
| @@ -4126,7 +4113,6 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser(
 | 
|                                          NULL, stack_limit_);
 | 
|      reusable_preparser_->set_allow_lazy(true);
 | 
|      reusable_preparser_->set_allow_natives(allow_natives());
 | 
| -    reusable_preparser_->set_allow_harmony_scoping(allow_harmony_scoping());
 | 
|      reusable_preparser_->set_allow_harmony_modules(allow_harmony_modules());
 | 
|      reusable_preparser_->set_allow_harmony_arrow_functions(
 | 
|          allow_harmony_arrow_functions());
 | 
| 
 |