Invalid flags in a RegExp literal should be an early SyntaxError
[WebKit-https.git] / JSTests / stress / catch-parameter-syntax.js
1 function testSyntax(script) {
2     try {
3         eval(script);
4     } catch (error) {
5         if (error instanceof SyntaxError)
6             throw new Error("Bad error: " + String(error));
7     }
8 }
9
10 function testSyntaxError(script, message) {
11     var error = null;
12     try {
13         eval(script);
14     } catch (e) {
15         error = e;
16     }
17     if (!error)
18         throw new Error("Expected syntax error not thrown");
19
20     if (String(error) !== message)
21         throw new Error("Bad error: " + String(error));
22 }
23
24 testSyntaxError(`
25 (function () {
26     try {
27     } catch ([a, a]) {
28     }
29 })
30 `, `SyntaxError: Unexpected identifier 'a'. Cannot declare a lexical variable twice: 'a'.`);
31
32 testSyntaxError(`
33 (function () {
34     try {
35     } catch ({ a, b:a }) {
36     }
37 })
38 `, `SyntaxError: Unexpected identifier 'a'. Cannot declare a lexical variable twice: 'a'.`);
39
40 testSyntax(`
41 (function () {
42     try {
43     } catch (let) {
44     }
45 })
46 `, ``);
47
48 testSyntax(`
49 (function () {
50     try {
51     } catch ([let]) {
52     }
53 })
54 `, ``);
55
56 testSyntaxError(`
57 (function () {
58     'use strict';
59     try {
60     } catch (let) {
61     }
62 })
63 `, `SyntaxError: Cannot use 'let' as a catch parameter name in strict mode.`);
64
65 testSyntaxError(`
66 (function () {
67     'use strict';
68     try {
69     } catch ([let]) {
70     }
71 })
72 `, `SyntaxError: Cannot use 'let' as a catch parameter name in strict mode.`);
73
74
75 testSyntax(`
76 (function () {
77     try {
78     } catch (yield) {
79     }
80 })
81 `);
82
83 testSyntax(`
84 (function () {
85     try {
86     } catch ([yield]) {
87     }
88 })
89 `);
90
91 testSyntaxError(`
92 (function () {
93     'use strict';
94     try {
95     } catch (yield) {
96     }
97 })
98 `, `SyntaxError: Cannot use 'yield' as a catch parameter name in strict mode.`);
99
100 testSyntaxError(`
101 (function () {
102     'use strict';
103     try {
104     } catch ([yield]) {
105     }
106 })
107 `, `SyntaxError: Cannot use 'yield' as a catch parameter name in strict mode.`);
108
109 testSyntaxError(`
110 (function () {
111     try {
112     } catch (yield = 20) {
113     }
114 })
115 `, `SyntaxError: Unexpected token '='. Expected ')' to end a 'catch' target.`);
116
117 testSyntax(`
118 (function () {
119     try {
120     } catch ([...yield]) {
121     }
122 })
123 `);
124
125 testSyntax(`
126 (function () {
127     try {
128     } catch ([yield = 30]) {
129     }
130 })
131 `);
132
133 testSyntax(`
134 (function () {
135     try {
136     } catch ({ yield = 30 }) {
137     }
138 })
139 `);
140
141 testSyntaxError(`
142 (function () {
143     try {
144     } catch (...Hello) {
145     }
146 })
147 `, `SyntaxError: Unexpected token '...'. Expected a parameter pattern or a ')' in parameter list.`);
148
149 testSyntaxError(`
150 (function *() {
151     try {
152     } catch (yield) {
153     }
154 })
155 `, `SyntaxError: Cannot use 'yield' as a catch parameter name in a generator function.`);
156
157 testSyntax(`
158 (function *() {
159     try {
160     } catch ({ value = yield 42 }) {
161     }
162 })
163 `);
164
165 testSyntax(`
166 (function *() {
167     try {
168     } catch ({ value = yield }) {
169     }
170 })
171 `);