// This function uses UCE to test when the if branch is removed by
// IonMonkey.  Some optimization such as Scalar Replacement are able to remove
// the scope chain, which can cause issues when the scope chain properties are
// not initialized properly.
var uceFault = function (i) {
    if (i % 1500 == 0) {
        uceFault = function (i) { return i % 1500 == 0; };
    }
    return false;
};

function f(i) {
    if (uceFault(i) || uceFault(i))
        g();
    const x = 42;
    function g() {
        return x;
    }
    return g;
}

function loop() {
    for (; i < 4000; i++)
        assertEq(f(i)(), 42);
}

var caught = 0;
var i = 1;
while (i < 4000) {
    try {
        loop();
    } catch(e) {
        assertEq(e instanceof ReferenceError, true);
        assertEq(i == 1500 || i == 3000, true);
        caught += 1;
        i++;
    }
}
assertEq(caught, 2);