// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --harmony-function-sent


{
  function* g() { return function.sent }
  assertEquals({value: 42, done: true}, g().next(42));
}


{
  function* g() {
    try {
      yield function.sent;
    } finally {
      yield function.sent;
      return function.sent;
    }
  }

  {
    let x = g();
    assertEquals({value: 1, done: false}, x.next(1));
    assertEquals({value: 2, done: false}, x.next(2));
    assertEquals({value: 3, done: true}, x.next(3));
  }

  {
    let x = g();
    assertEquals({value: 1, done: false}, x.next(1));
    assertEquals({value: 2, done: false}, x.throw(2));
    assertEquals({value: 3, done: true}, x.next(3));
  }

  {
    let x = g();
    assertEquals({value: 1, done: false}, x.next(1));
    assertEquals({value: 2, done: false}, x.return(2));
    assertEquals({value: 3, done: true}, x.next(3));
  }
}


{
  function* inner() {
    try {
      yield function.sent;
    } finally {
      return 666;
    }
  }

  function* g() {
    yield function.sent;
    yield* inner();
    return function.sent;
  }

  {
    let x = g();
    assertEquals({value: 1, done: false}, x.next(1));
    assertEquals({value: undefined, done: false}, x.next(2));
    assertEquals({value: 3, done: true}, x.next(3));
  }

  {
    let x = g();
    assertEquals({value: 1, done: false}, x.next(1));
    assertEquals({value: undefined, done: false}, x.next(2));
    assertEquals({value: 42, done: true}, x.throw(42));
  }

  {
    let x = g();
    assertEquals({value: 1, done: false}, x.next(1));
    assertEquals({value: undefined, done: false}, x.next(2));
    assertEquals({value: 42, done: true}, x.return(42));
  }
}


assertThrows("function f() { return function.sent }", SyntaxError);
assertThrows("() => { return function.sent }", SyntaxError);
assertThrows("() => { function.sent }", SyntaxError);
assertThrows("() => function.sent", SyntaxError);
assertThrows("({*f() { function.sent }})", SyntaxError);
assertDoesNotThrow("({*f() { return function.sent }})");
