blob: 3abbf207d0341591cb2e31011629305e48c159ba [file] [log] [blame]
function assert(b, m = "Bad!") {
if (!b) {
throw new Error(m);
}
}
function test(f, iters = 1000) {
for (let i = 0; i < iters; i++)
f();
}
function shouldThrowTDZ(f) {
let threw = false;
try {
f();
} catch(e) {
assert(e instanceof ReferenceError);
assert(e.toString() === "ReferenceError: Cannot access uninitialized variable.");
threw = true;
}
assert(threw);
}
test(function() {
class A {
get foo() {
return this._x;
}
set foo(x) {
this._x = x;
}
}
function fooProp() { return 'foo'; }
class B extends A {
constructor() {
super.foo = 20;
}
}
class C extends A {
constructor() {
super[fooProp()] = 20;
}
}
class D extends A {
constructor() {
super[fooProp()];
}
}
class E extends A {
constructor() {
super.foo;
}
}
class F extends A {
constructor() {
(() => super.foo = 20)();
}
}
class G extends A {
constructor() {
(() => super[fooProp()] = 20)();
}
}
class H extends A {
constructor() {
(() => super[fooProp()])();
}
}
class I extends A {
constructor() {
(() => super.foo)();
}
}
shouldThrowTDZ(function() { new B; });
shouldThrowTDZ(function() { new C; });
shouldThrowTDZ(function() { new D; });
shouldThrowTDZ(function() { new E; });
shouldThrowTDZ(function() { new F; });
shouldThrowTDZ(function() { new G; });
shouldThrowTDZ(function() { new H; });
shouldThrowTDZ(function() { new I; });
});