class A { constructor() { } } class B extends A { constructor() { this; super(); } } noInline(B); function assert(b) { if (!b) throw new Error("Assertion failure"); } noInline(assert); function shouldThrowTDZ(func) { var hasThrown = false; try { func(); } catch(e) { if (e.name.indexOf("ReferenceError") !== -1) hasThrown = true; } assert(hasThrown); } noInline(shouldThrowTDZ); function truth() { return true; } noInline(truth); for (var i = 0; i < 100; ++i) { var exception; try { new B(); } catch (e) { exception = e; if (!(e instanceof ReferenceError)) throw "Exception thrown in iteration " + i + " was not a reference error"; } if (!exception) throw "Exception not thrown for an unitialized this at iteration " + i; } ;(function() { function foo() { return A; class A { } } function bar() { shouldThrowTDZ(function() { return A; }); class A { } } function baz() { class C { static m() { return "m"; } } if (truth()) { class B extends C { } assert(B.m() === "m"); } class B extends A { } class A { } } function taz() { function f(x) { return x; } class C extends f(C) { } } for (var i = 0; i < 100; i++) { shouldThrowTDZ(foo); bar(); shouldThrowTDZ(baz); shouldThrowTDZ(taz); } })();