// http://ecma-international.org/ecma-262/6.0/#sec-identifiers-static-semantics-early-errors
// If the "yield" label is used under the sloppy mode and the context is not
// a generator context, we can use "yield" as a label.

(function () {
    {
        yield: for (var i = 0; i < 1000; ++i) {
            break yield;
        }
    }
    {
        yield: for (var i = 0; i < 1000; ++i) {
            continue yield;
        }
    }
}());


function testSyntaxError(script, message) {
    var error = null;
    try {
        eval(script);
    } catch (e) {
        error = e;
    }
    if (!error)
        throw new Error("Expected syntax error not thrown");

    if (String(error) !== message)
        throw new Error("Bad error: " + String(error));
}

testSyntaxError(`
function test() {
    "use strict";
    {
        yield: for (var i = 0; i < 1000; ++i) {
            break yield;
        }
    }
}
`, `SyntaxError: Unexpected keyword 'yield'. Expected an identifier as the target for a break statement.`);

testSyntaxError(`
function test() {
    "use strict";
    {
        yield: for (var i = 0; i < 1000; ++i) {
            continue yield;
        }
    }
}
`, `SyntaxError: Unexpected keyword 'yield'. Expected an identifier as the target for a continue statement.`)
