function assert(b) { if (!b) throw new Error("Bad"); } function test(f) { noInline(f); for (let i = 0; i < 1000; ++i) f(); } function shouldThrowSyntaxError(script) { let error; try { eval(script); } catch (e) { error = e; } if (!(error instanceof SyntaxError)) throw new Error('Expected SyntaxError!'); } test(function() { let o = {xx: 0}; for (let i in o) { for (i in [0, 1, 2]) { } assert(typeof i === "string"); assert(o[i] === undefined); } }); test(function() { let o = {xx: 0}; for (let i in o) { for ({i} of [{i: 0}]) { } assert(typeof i === "number"); assert(o[i] === undefined); } }); test(function() { let o = {xx: 0}; for (let i in o) { ;({i} = {i: 0}); assert(typeof i === "number"); assert(o[i] === undefined); } }); test(function() { let o = {xx: 0}; for (let i in o) { ;([i] = [0]); assert(typeof i === "number"); assert(o[i] === undefined); } }); test(function() { let o = {xx: 0}; for (let i in o) { ;({...i} = {a:20, b:30}); assert(typeof i === "object"); assert(o[i] === undefined); } }); test(function() { let o = {xx: 0}; for (let i in o) { eval("i = 0;"); assert(typeof i === "number"); assert(o[i] === undefined); } }); shouldThrowSyntaxError( `function f() { let o = {xx: 0}; for (let i in o) { for (var i of [0]) { } } }` ); shouldThrowSyntaxError( `function f() { let o = {xx: 0}; for (let i in o) { var i = 0; } }` );