| Index: src/parser.cc
 | 
| diff --git a/src/parser.cc b/src/parser.cc
 | 
| index 354f1c33187a33196be7b7db2813f089baa507b3..6497833d14869269ac8e0930496fec2fc5b0ae03 100644
 | 
| --- a/src/parser.cc
 | 
| +++ b/src/parser.cc
 | 
| @@ -4088,7 +4088,11 @@ void ParserTraits::ParseArrowFunctionFormalParameters(
 | 
|                                       parser_->scope_, parameters->scope);
 | 
|    }
 | 
|  
 | 
| -  AddFormalParameter(parameters, expr, initializer, is_rest);
 | 
| +  // TODO(adamk): params_loc.end_pos is not the correct initializer position,
 | 
| +  // but it should be conservative enough to trigger hole checks for variables
 | 
| +  // referenced in the initializer (if any).
 | 
| +  AddFormalParameter(parameters, expr, initializer, params_loc.end_pos,
 | 
| +                     is_rest);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -4550,7 +4554,15 @@ Block* Parser::BuildParameterInitializationBlock(
 | 
|      descriptor.is_const = false;
 | 
|      descriptor.needs_init = true;
 | 
|      descriptor.declaration_pos = parameter.pattern->position();
 | 
| +    // The position that will be used by the AssignmentExpression
 | 
| +    // which copies from the temp parameter to the pattern.
 | 
| +    //
 | 
| +    // TODO(adamk): Should this be RelocInfo::kNoPosition, since
 | 
| +    // it's just copying from a temp var to the real param var?
 | 
|      descriptor.initialization_pos = parameter.pattern->position();
 | 
| +    // The initializer position which will end up in,
 | 
| +    // Variable::initializer_position(), used for hole check elimination.
 | 
| +    int initializer_position = parameter.pattern->position();
 | 
|      Expression* initial_value =
 | 
|          factory()->NewVariableProxy(parameters.scope->parameter(i));
 | 
|      if (parameter.initializer != nullptr) {
 | 
| @@ -4565,6 +4577,7 @@ Block* Parser::BuildParameterInitializationBlock(
 | 
|            condition, parameter.initializer, initial_value,
 | 
|            RelocInfo::kNoPosition);
 | 
|        descriptor.initialization_pos = parameter.initializer->position();
 | 
| +      initializer_position = parameter.initializer_end_position;
 | 
|      } else if (parameter.is_rest) {
 | 
|        // $rest = [];
 | 
|        // for (var $argument_index = $rest_index;
 | 
| @@ -4576,7 +4589,6 @@ Block* Parser::BuildParameterInitializationBlock(
 | 
|        DCHECK(parameter.pattern->IsVariableProxy());
 | 
|        DCHECK_EQ(i, parameters.params.length() - 1);
 | 
|  
 | 
| -      int pos = parameter.pattern->position();
 | 
|        Variable* temp_var = parameters.scope->parameter(i);
 | 
|        auto empty_values = new (zone()) ZoneList<Expression*>(0, zone());
 | 
|        auto empty_array = factory()->NewArrayLiteral(
 | 
| @@ -4640,8 +4652,6 @@ Block* Parser::BuildParameterInitializationBlock(
 | 
|            zone());
 | 
|  
 | 
|        init_block->statements()->Add(loop, zone());
 | 
| -
 | 
| -      descriptor.initialization_pos = pos;
 | 
|      }
 | 
|  
 | 
|      Scope* param_scope = scope_;
 | 
| @@ -4660,7 +4670,7 @@ Block* Parser::BuildParameterInitializationBlock(
 | 
|      {
 | 
|        BlockState block_state(&scope_, param_scope);
 | 
|        DeclarationParsingResult::Declaration decl(
 | 
| -          parameter.pattern, parameter.pattern->position(), initial_value);
 | 
| +          parameter.pattern, initializer_position, initial_value);
 | 
|        PatternRewriter::DeclareAndInitializeVariables(param_block, &descriptor,
 | 
|                                                       &decl, nullptr, CHECK_OK);
 | 
|      }
 | 
| 
 |