text: // This file was procedurally generated from the following sources:
  // - src/dstr-assignment/array-rest-iter-rtrn-close-null.case
  // - src/dstr-assignment/default/for-of.template
  /*---
  description: IteratorClose throws a TypeError when `return` returns a non-Object value (For..of statement)
  esid: sec-for-in-and-for-of-statements-runtime-semantics-labelledevaluation
  features: [Symbol.iterator, generators, destructuring-binding]
  flags: [generated]
  info: |
      IterationStatement :
        for ( LeftHandSideExpression of AssignmentExpression ) Statement
  
      1. Let keyResult be the result of performing ? ForIn/OfHeadEvaluation(« »,
         AssignmentExpression, iterate).
      2. Return ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement,
         keyResult, assignment, labelSet).
  
      13.7.5.13 Runtime Semantics: ForIn/OfBodyEvaluation
  
      [...]
      4. If destructuring is true and if lhsKind is assignment, then
         a. Assert: lhs is a LeftHandSideExpression.
         b. Let assignmentPattern be the parse of the source text corresponding to
            lhs using AssignmentPattern as the goal symbol.
      [...]
  
      ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ]
  
      [...]
      5. Let result be the result of performing
         IteratorDestructuringAssignmentEvaluation of AssignmentRestElement with
         iteratorRecord as the argument
      6. If iteratorRecord.[[done]] is false, return IteratorClose(iterator,
         result).
  
      AssignmentRestElement[Yield] : ... DestructuringAssignmentTarget
  
      1. If DestructuringAssignmentTarget is neither an ObjectLiteral nor an
         ArrayLiteral, then
         a. Let lref be the result of evaluating DestructuringAssignmentTarget.
         b. ReturnIfAbrupt(lref).
  
      7.4.6 IteratorClose( iterator, completion )
  
      [...]
      6. Let innerResult be Call(return, iterator, « »).
      [...]
  
      7.4.6 IteratorClose( iterator, completion )
  
      [...]
      6. Let innerResult be Call(return, iterator, « »).
      7. If completion.[[type]] is throw, return Completion(completion).
      8. If innerResult.[[type]] is throw, return Completion(innerResult).
  
  ---*/
  var iterable = {};
  var iterator = {
    return: function() {
      return null;
    }
  };
  var iter;
  iterable[Symbol.iterator] = function() {
    return iterator;
  };
  
  function* g() {
  
  var counter = 0;
  
  for ([...{}[yield]] of [iterable]) {
    
    counter += 1;
  }
  
  assert.sameValue(counter, 1);
  
  }
  
  iter = g();
  iter.next();
  
  assert.throws(TypeError, function() {
    iter.return();
  });
  