Invalid flags in a RegExp literal should be an early SyntaxError
[WebKit-https.git] / JSTests / stress / class-syntax-tdz.js
1
2 class A {
3     constructor() { }
4 }
5
6 class B extends A {
7     constructor() {
8         this;
9         super();
10     }
11 }
12
13 noInline(B);
14
15 function assert(b) {
16     if (!b)
17         throw new Error("Assertion failure");
18 }
19 noInline(assert);
20
21 function shouldThrowTDZ(func) {
22     var hasThrown = false;
23     try {
24         func();
25     } catch(e) {
26         if (e.name.indexOf("ReferenceError") !== -1)
27             hasThrown = true;
28     }
29     assert(hasThrown);
30 }
31 noInline(shouldThrowTDZ);
32
33 function truth() { return true; }
34 noInline(truth);
35
36 for (var i = 0; i < 100; ++i) {
37     var exception;
38     try {
39         new B();
40     } catch (e) {
41         exception = e;
42         if (!(e instanceof ReferenceError))
43             throw "Exception thrown in iteration " + i + " was not a reference error";
44     }
45     if (!exception)
46         throw "Exception not thrown for an unitialized this at iteration " + i;
47 }
48
49
50
51 ;(function() {
52     function foo() {
53         return A;
54         class A { }
55     }
56     function bar() {
57         shouldThrowTDZ(function() { return A; });
58         class A { }
59     }
60     function baz() {
61         class C { static m() { return "m"; } }
62         if (truth()) {
63             class B extends C { }
64             assert(B.m() === "m");
65         }
66         class B extends A { }
67         class A { }
68     }
69     function taz() {
70         function f(x) { return x; }
71         class C extends f(C) { }
72     }
73
74     for (var i = 0; i < 100; i++) {
75         shouldThrowTDZ(foo);
76         bar();
77         shouldThrowTDZ(baz);
78         shouldThrowTDZ(taz);
79     }
80 })();