// Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --strong-mode 'use strong'; class C {} let indirect_eval = eval; function assertTypeError(script) { assertThrows(script, TypeError) } function assertSyntaxError(script) { assertThrows(script, SyntaxError) } function assertReferenceError(script) { assertThrows(script, ReferenceError) } (function ImmutableClassBindings() { class D {} assertTypeError(function(){ indirect_eval("C = 0") }); assertEquals('function', typeof C); assertEquals('function', typeof D); assertTypeError("'use strong'; (function f() {class E {}; E = 0})()"); })(); function constructor(body) { return "'use strong'; " + "(class extends Object { constructor() { " + body + " } })"; } (function NoSuperExceptCall() { assertSyntaxError(constructor("super.a;")); assertSyntaxError(constructor("super['a'];")); assertSyntaxError(constructor("super.f();")); assertSyntaxError(constructor("super.a;")); assertSyntaxError(constructor("{ super.a }")); assertSyntaxError(constructor("if (0) super.a;")); // TODO(rossberg): arrow functions do not handle 'super' yet. // assertSyntaxError(constructor("() => super.a;")); // assertSyntaxError(constructor("() => () => super.a;")); // assertSyntaxError(constructor("() => { () => if (0) { super.a; } }")); })(); (function NoMissingSuper() { assertReferenceError(constructor("")); assertReferenceError(constructor("1")); })(); (function NoNestedSuper() { assertSyntaxError(constructor("super(), 0;")); assertSyntaxError(constructor("(super());")); assertSyntaxError(constructor("super().a;")); assertSyntaxError(constructor("(() => super())();")); assertSyntaxError(constructor("{ super(); }")); assertSyntaxError(constructor("if (1) super();")); assertSyntaxError(constructor("label: super();")); })(); (function NoDuplicateSuper() { assertSyntaxError(constructor("super(), super();")); assertSyntaxError(constructor("super(); super();")); assertSyntaxError(constructor("super(); (super());")); assertSyntaxError(constructor("super(); { super() }")); assertSyntaxError(constructor("super(); (() => super())();")); })(); (function NoSuperAfterThis() { assertSyntaxError(constructor("this.a = 0, super();")); assertSyntaxError(constructor("this.a = 0; super();")); assertSyntaxError(constructor("this.a = 0; super(); this.b = 0;")); assertSyntaxError(constructor("this.a = 0; (super());")); assertSyntaxError(constructor("super(this.a = 0);")); })(); (function NoReturnValue() { assertSyntaxError(constructor("return {};")); assertSyntaxError(constructor("return undefined;")); assertSyntaxError(constructor("return this;")); assertSyntaxError(constructor("return this.a = 0;")); assertSyntaxError(constructor("{ return {}; }")); assertSyntaxError(constructor("if (1) return {};")); })(); (function NoReturnBeforeSuper() { assertSyntaxError(constructor("return; super();")); assertSyntaxError(constructor("if (0) return; super();")); assertSyntaxError(constructor("{ return; } super();")); })(); (function NoReturnBeforeThis() { assertSyntaxError(constructor("return; this.a = 0;")); assertSyntaxError(constructor("if (0) return; this.a = 0;")); assertSyntaxError(constructor("{ return; } this.a = 0;")); })(); (function NoThisExceptInitialization() { assertSyntaxError(constructor("this;")); assertSyntaxError(constructor("this.a;")); assertSyntaxError(constructor("this['a'];")); assertSyntaxError(constructor("this();")); assertSyntaxError(constructor("this.a();")); assertSyntaxError(constructor("this.a.b = 0;")); assertSyntaxError(constructor("{ this }")); assertSyntaxError(constructor("if (0) this;")); // TODO(rossberg): this does not handle arrow functions yet. // assertSyntaxError(constructor("() => this;")); // assertSyntaxError(constructor("() => () => this;")); // assertSyntaxError(constructor("() => { () => if (0) { this; } }")); })(); (function NoNestedThis() { assertSyntaxError(constructor("(this.a = 0);")); assertSyntaxError(constructor("{ this.a = 0; }")); assertSyntaxError(constructor("if (0) this.a = 0;")); // TODO(rossberg): this does not handle arrow functions yet. // assertSyntaxError(constructor("() => this.a = 0;")); // assertSyntaxError(constructor("() => { this.a = 0; }")); assertSyntaxError(constructor("label: this.a = 0;")); })();