diff --git a/test/language/expressions/class/constructor-this-tdz-during-initializers.js b/test/language/expressions/class/constructor-this-tdz-during-initializers.js new file mode 100644 index 00000000000..fe859e7531c --- /dev/null +++ b/test/language/expressions/class/constructor-this-tdz-during-initializers.js @@ -0,0 +1,43 @@ +// Copyright (C) 2018 Kevin Gibbons. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-super-keyword-runtime-semantics-evaluation +description: > + `this` is bound in the constructor of derived classes immediately before running initializers +info: | + [...] + 6. Let result be ? Construct(func, argList, newTarget). + [...] + 10. Perform ? thisER.BindThisValue(result). + 11. Perform ? InitializeInstanceFields(result, F). + [...] +features: [class-fields-public] +---*/ + + +var probeCtorThis; +var thisDuringField; +var thisFromProbe; +var thisDuringCtor; + +class Base { + constructor() { + assert.throws(ReferenceError, probeCtorThis); + } +} + +var C = class extends Base { + field = (thisDuringField = this, thisFromProbe = probeCtorThis()); + constructor() { + probeCtorThis = () => this; + assert.throws(ReferenceError, probeCtorThis); + super(); + thisDuringCtor = this; + } +}; + +var instance = new C(); + +assert.sameValue(thisDuringField, instance); +assert.sameValue(thisFromProbe, instance); +assert.sameValue(thisDuringCtor, instance);