// Bug 1099956

load(libdir + "asserts.js");

// ES6 treating yield as an identifier except in ES6 generators introduces a
// syntax conflict with permissible JS >= 1.7 legacy generator syntax.  Is
// |yield /a/g| inside a function an attempt to convert the function into a
// legacy generator, yielding a RegExp instance?  Or does it instead read as
// |(yield / a) / g|?  Similar ambiguities exist for different textual content
// in place of |a| -- |yield /x+17/g| or |(yield / x) + 17 / g|, and so on.
// (And, much less importantly, is |yield /a/g| a syntax error in global code
// as in JS >= 1.7, or is it |(yield / a) / g|.)
//
// For now, in JS >= 1.7, we preserve the old behavior.  In all other JS we
// conform to ES6: |yield /a/g| is a YieldExpression inside an ES6 generator,
// and it's an IdentifierReference divided twice when not in an ES6 generator.
// This test will need changes if we change our JS >= 1.7 parsing to be
// ES6-compatible.

function f1() {
  yield /abc/g;
}

var g = f1();
var v;
v = g.next();
assertEq(v instanceof RegExp, true);
assertEq(v.toString(), "/abc/g");
assertThrowsValue(() => g.next(), StopIteration);

function* f2() {
  yield /abc/g;
}

g = f2();
v = g.next();
assertEq(v.done, false);
assertEq(v.value instanceof RegExp, true);
assertEq(v.value.toString(), "/abc/g");
v = g.next();
assertEq(v.done, true);