load(libdir + 'asserts.js');
load(libdir + 'iteration.js');

var outer = "unmodified";

function f(v)
{
  if (v + "")
    ({ [(outer = "modified")]: v } = v);
}

assertEq(outer, "unmodified");
f(true);
assertEq(outer, "modified");

outer = "unmodified";
f({});
assertEq(outer, "modified");

outer = "unmodified";
assertThrowsInstanceOf(() => f(null), TypeError);
assertEq(outer, "unmodified");

assertThrowsInstanceOf(() => f(undefined), TypeError);
assertEq(outer, "unmodified");


function g(v)
{
  if (v + "")
    ({ [{ toString() { outer = "modified"; return 0; } }]: v } = v);
}

outer = "unmodified";
g(true);
assertEq(outer, "modified");

outer = "unmodified";
g({});
assertEq(outer, "modified");

outer = "unmodified";
assertThrowsInstanceOf(() => g(undefined), TypeError);
assertEq(outer, "unmodified");

assertThrowsInstanceOf(() => g(null), TypeError);
assertEq(outer, "unmodified");