1# Copyright 2013 the V8 project authors. All rights reserved.
2# Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions
6# are met:
7# 1.  Redistributions of source code must retain the above copyright
8#     notice, this list of conditions and the following disclaimer.
9# 2.  Redistributions in binary form must reproduce the above copyright
10#     notice, this list of conditions and the following disclaimer in the
11#     documentation and/or other materials provided with the distribution.
12#
13# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
24This test checks that the following expressions or statements are valid ECMASCRIPT code or should throw parse error
25
26On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
27
28
29Unary operators and member access
30PASS Valid:   ""
31PASS Valid:   "function f() {  }"
32PASS Invalid: "(a"
33PASS Invalid: "function f() { (a }"
34PASS Invalid: "a[5"
35PASS Invalid: "function f() { a[5 }"
36PASS Invalid: "a[5 + 6"
37PASS Invalid: "function f() { a[5 + 6 }"
38PASS Invalid: "a."
39PASS Invalid: "function f() { a. }"
40PASS Invalid: "()"
41PASS Invalid: "function f() { () }"
42PASS Invalid: "a.'l'"
43PASS Invalid: "function f() { a.'l' }"
44PASS Valid:   "a: +~!new a"
45PASS Valid:   "function f() { a: +~!new a }"
46PASS Invalid: "new -a"
47PASS Invalid: "function f() { new -a }"
48PASS Valid:   "new (-1)"
49PASS Valid:   "function f() { new (-1) }"
50PASS Valid:   "a: b: c: new f(x++)++"
51PASS Valid:   "function f() { a: b: c: new f(x++)++ }"
52PASS Valid:   "(a)++"
53PASS Valid:   "function f() { (a)++ }"
54PASS Valid:   "(1--).x"
55PASS Valid:   "function f() { (1--).x }"
56PASS Invalid: "a-- ++"
57PASS Invalid: "function f() { a-- ++ }"
58PASS Invalid: "(a:) --b"
59PASS Invalid: "function f() { (a:) --b }"
60PASS Valid:   "++ -- ++ a"
61PASS Valid:   "function f() { ++ -- ++ a }"
62PASS Valid:   "++ new new a ++"
63PASS Valid:   "function f() { ++ new new a ++ }"
64PASS Valid:   "delete void 0"
65PASS Valid:   "function f() { delete void 0 }"
66PASS Invalid: "delete the void"
67PASS Invalid: "function f() { delete the void }"
68PASS Invalid: "(a++"
69PASS Invalid: "function f() { (a++ }"
70PASS Valid:   "++a--"
71PASS Valid:   "function f() { ++a-- }"
72PASS Valid:   "++((a))--"
73PASS Valid:   "function f() { ++((a))-- }"
74PASS Valid:   "(a.x++)++"
75PASS Valid:   "function f() { (a.x++)++ }"
76PASS Invalid: "1: null"
77PASS Invalid: "function f() { 1: null }"
78PASS Invalid: "+-!~"
79PASS Invalid: "function f() { +-!~ }"
80PASS Invalid: "+-!~(("
81PASS Invalid: "function f() { +-!~(( }"
82PASS Invalid: "a)"
83PASS Invalid: "function f() { a) }"
84PASS Invalid: "a]"
85PASS Invalid: "function f() { a] }"
86PASS Invalid: ".l"
87PASS Invalid: "function f() { .l }"
88PASS Invalid: "1.l"
89PASS Invalid: "function f() { 1.l }"
90PASS Valid:   "1 .l"
91PASS Valid:   "function f() { 1 .l }"
92Binary and conditional operators
93PASS Valid:   "a + + typeof this"
94PASS Valid:   "function f() { a + + typeof this }"
95PASS Invalid: "a + * b"
96PASS Invalid: "function f() { a + * b }"
97PASS Invalid: "a ? b"
98PASS Invalid: "function f() { a ? b }"
99PASS Invalid: "a ? b :"
100PASS Invalid: "function f() { a ? b : }"
101PASS Invalid: "%a"
102PASS Invalid: "function f() { %a }"
103PASS Invalid: "a-"
104PASS Invalid: "function f() { a- }"
105PASS Valid:   "a = b ? b = c : d = e"
106PASS Valid:   "function f() { a = b ? b = c : d = e }"
107PASS Valid:   "s: a[1].l ? b.l['s'] ? c++ : d : true"
108PASS Valid:   "function f() { s: a[1].l ? b.l['s'] ? c++ : d : true }"
109PASS Valid:   "a ? b + 1 ? c + 3 * d.l : d[5][6] : e"
110PASS Valid:   "function f() { a ? b + 1 ? c + 3 * d.l : d[5][6] : e }"
111PASS Valid:   "a in b instanceof delete -c"
112PASS Valid:   "function f() { a in b instanceof delete -c }"
113PASS Invalid: "a in instanceof b.l"
114PASS Invalid: "function f() { a in instanceof b.l }"
115PASS Valid:   "- - true % 5"
116PASS Valid:   "function f() { - - true % 5 }"
117FAIL Invalid: "- false = 3" should throw undefined
118FAIL Invalid: "function f() { - false = 3 }" should throw undefined
119PASS Valid:   "a: b: c: (1 + null) = 3"
120PASS Valid:   "function f() { a: b: c: (1 + null) = 3 }"
121PASS Valid:   "a[2] = b.l += c /= 4 * 7 ^ !6"
122PASS Valid:   "function f() { a[2] = b.l += c /= 4 * 7 ^ !6 }"
123FAIL Invalid: "a + typeof b += c in d" should throw undefined
124FAIL Invalid: "function f() { a + typeof b += c in d }" should throw undefined
125FAIL Invalid: "typeof a &= typeof b" should throw undefined
126FAIL Invalid: "function f() { typeof a &= typeof b }" should throw undefined
127PASS Valid:   "a: ((typeof (a))) >>>= a || b.l && c"
128PASS Valid:   "function f() { a: ((typeof (a))) >>>= a || b.l && c }"
129PASS Valid:   "a: b: c[a /= f[a %= b]].l[c[x] = 7] -= a ? b <<= f : g"
130PASS Valid:   "function f() { a: b: c[a /= f[a %= b]].l[c[x] = 7] -= a ? b <<= f : g }"
131PASS Valid:   "-void+x['y'].l == x.l != 5 - f[7]"
132PASS Valid:   "function f() { -void+x['y'].l == x.l != 5 - f[7] }"
133Function calls (and new with arguments)
134PASS Valid:   "a()()()"
135PASS Valid:   "function f() { a()()() }"
136PASS Valid:   "s: l: a[2](4 == 6, 5 = 6)(f[4], 6)"
137PASS Valid:   "function f() { s: l: a[2](4 == 6, 5 = 6)(f[4], 6) }"
138PASS Valid:   "s: eval(a.apply(), b.call(c[5] - f[7]))"
139PASS Valid:   "function f() { s: eval(a.apply(), b.call(c[5] - f[7])) }"
140PASS Invalid: "a("
141PASS Invalid: "function f() { a( }"
142PASS Invalid: "a(5"
143PASS Invalid: "function f() { a(5 }"
144PASS Invalid: "a(5,"
145PASS Invalid: "function f() { a(5, }"
146PASS Invalid: "a(5,)"
147PASS Invalid: "function f() { a(5,) }"
148PASS Invalid: "a(5,6"
149PASS Invalid: "function f() { a(5,6 }"
150PASS Valid:   "a(b[7], c <d> e.l, new a() > b)"
151PASS Valid:   "function f() { a(b[7], c <d> e.l, new a() > b) }"
152PASS Invalid: "a(b[5)"
153PASS Invalid: "function f() { a(b[5) }"
154PASS Invalid: "a(b.)"
155PASS Invalid: "function f() { a(b.) }"
156PASS Valid:   "~new new a(1)(i++)(c[l])"
157PASS Valid:   "function f() { ~new new a(1)(i++)(c[l]) }"
158PASS Invalid: "a(*a)"
159PASS Invalid: "function f() { a(*a) }"
160PASS Valid:   "((((a))((b)()).l))()"
161PASS Valid:   "function f() { ((((a))((b)()).l))() }"
162PASS Valid:   "(a)[b + (c) / (d())].l--"
163PASS Valid:   "function f() { (a)[b + (c) / (d())].l-- }"
164PASS Valid:   "new (5)"
165PASS Valid:   "function f() { new (5) }"
166PASS Invalid: "new a(5"
167PASS Invalid: "function f() { new a(5 }"
168PASS Valid:   "new (f + 5)(6, (g)() - 'l'() - true(false))"
169PASS Valid:   "function f() { new (f + 5)(6, (g)() - 'l'() - true(false)) }"
170PASS Invalid: "a(.length)"
171PASS Invalid: "function f() { a(.length) }"
172function declaration and expression
173PASS Valid:   "function f() {}"
174PASS Valid:   "function f() { function f() {} }"
175PASS Valid:   "function f(a,b) {}"
176PASS Valid:   "function f() { function f(a,b) {} }"
177PASS Invalid: "function () {}"
178PASS Invalid: "function f() { function () {} }"
179PASS Invalid: "function f(a b) {}"
180PASS Invalid: "function f() { function f(a b) {} }"
181PASS Invalid: "function f(a,) {}"
182PASS Invalid: "function f() { function f(a,) {} }"
183PASS Invalid: "function f(a,"
184PASS Invalid: "function f() { function f(a, }"
185PASS Invalid: "function f(a, 1) {}"
186PASS Invalid: "function f() { function f(a, 1) {} }"
187PASS Valid:   "function g(arguments, eval) {}"
188PASS Valid:   "function f() { function g(arguments, eval) {} }"
189PASS Valid:   "function f() {} + function g() {}"
190PASS Valid:   "function f() { function f() {} + function g() {} }"
191PASS Invalid: "(function a{})"
192PASS Invalid: "function f() { (function a{}) }"
193PASS Invalid: "(function this(){})"
194PASS Invalid: "function f() { (function this(){}) }"
195PASS Valid:   "(delete new function f(){} + function(a,b){}(5)(6))"
196PASS Valid:   "function f() { (delete new function f(){} + function(a,b){}(5)(6)) }"
197PASS Valid:   "6 - function (m) { function g() {} }"
198PASS Valid:   "function f() { 6 - function (m) { function g() {} } }"
199PASS Invalid: "function l() {"
200PASS Invalid: "function f() { function l() { }"
201PASS Invalid: "function l++(){}"
202PASS Invalid: "function f() { function l++(){} }"
203Array and object literal, comma operator
204PASS Valid:   "[] in [5,6] * [,5,] / [,,5,,] || [a,] && new [,b] % [,,]"
205PASS Valid:   "function f() { [] in [5,6] * [,5,] / [,,5,,] || [a,] && new [,b] % [,,] }"
206PASS Invalid: "[5,"
207PASS Invalid: "function f() { [5, }"
208PASS Invalid: "[,"
209PASS Invalid: "function f() { [, }"
210PASS Invalid: "(a,)"
211PASS Invalid: "function f() { (a,) }"
212PASS Valid:   "1 + {get get(){}, set set(a){}, get1:4, set1:get-set, }"
213PASS Valid:   "function f() { 1 + {get get(){}, set set(a){}, get1:4, set1:get-set, } }"
214PASS Invalid: "1 + {a"
215PASS Invalid: "function f() { 1 + {a }"
216PASS Invalid: "1 + {a:"
217PASS Invalid: "function f() { 1 + {a: }"
218PASS Invalid: "1 + {get l("
219PASS Invalid: "function f() { 1 + {get l( }"
220PASS Invalid: ",a"
221PASS Invalid: "function f() { ,a }"
222PASS Valid:   "(4,(5,a(3,4))),f[4,a-6]"
223PASS Valid:   "function f() { (4,(5,a(3,4))),f[4,a-6] }"
224PASS Invalid: "(,f)"
225PASS Invalid: "function f() { (,f) }"
226PASS Invalid: "a,,b"
227PASS Invalid: "function f() { a,,b }"
228PASS Invalid: "a ? b, c : d"
229PASS Invalid: "function f() { a ? b, c : d }"
230simple statements
231PASS Valid:   "{ }"
232PASS Valid:   "function f() { { } }"
233PASS Invalid: "{ { }"
234PASS Invalid: "function f() { { { } }"
235PASS Valid:   "{ ; ; ; }"
236PASS Valid:   "function f() { { ; ; ; } }"
237PASS Valid:   "a: { ; }"
238PASS Valid:   "function f() { a: { ; } }"
239PASS Invalid: "{ a: }"
240PASS Invalid: "function f() { { a: } }"
241PASS Valid:   "{} f; { 6 + f() }"
242PASS Valid:   "function f() { {} f; { 6 + f() } }"
243PASS Valid:   "{ a[5],6; {} ++b-new (-5)() } c().l++"
244PASS Valid:   "function f() { { a[5],6; {} ++b-new (-5)() } c().l++ }"
245PASS Valid:   "{ l1: l2: l3: { this } a = 32 ; { i++ ; { { { } } ++i } } }"
246PASS Valid:   "function f() { { l1: l2: l3: { this } a = 32 ; { i++ ; { { { } } ++i } } } }"
247PASS Valid:   "if (a) ;"
248PASS Valid:   "function f() { if (a) ; }"
249PASS Invalid: "{ if (a) }"
250PASS Invalid: "function f() { { if (a) } }"
251PASS Invalid: "if a {}"
252PASS Invalid: "function f() { if a {} }"
253PASS Invalid: "if (a"
254PASS Invalid: "function f() { if (a }"
255PASS Invalid: "if (a { }"
256PASS Invalid: "function f() { if (a { } }"
257PASS Valid:   "x: s: if (a) ; else b"
258PASS Valid:   "function f() { x: s: if (a) ; else b }"
259PASS Invalid: "else {}"
260PASS Invalid: "function f() { else {} }"
261PASS Valid:   "if (a) if (b) y; else {} else ;"
262PASS Valid:   "function f() { if (a) if (b) y; else {} else ; }"
263PASS Invalid: "if (a) {} else x; else"
264PASS Invalid: "function f() { if (a) {} else x; else }"
265PASS Invalid: "if (a) { else }"
266PASS Invalid: "function f() { if (a) { else } }"
267PASS Valid:   "if (a.l + new b()) 4 + 5 - f()"
268PASS Valid:   "function f() { if (a.l + new b()) 4 + 5 - f() }"
269PASS Valid:   "if (a) with (x) ; else with (y) ;"
270PASS Valid:   "function f() { if (a) with (x) ; else with (y) ; }"
271PASS Invalid: "with a.b { }"
272PASS Invalid: "function f() { with a.b { } }"
273PASS Valid:   "while (a() - new b) ;"
274PASS Valid:   "function f() { while (a() - new b) ; }"
275PASS Invalid: "while a {}"
276PASS Invalid: "function f() { while a {} }"
277PASS Valid:   "do ; while(0) i++"
278PASS Valid:   "function f() { do ; while(0) i++ }"
279PASS Valid:   "do if (a) x; else y; while(z)"
280PASS Valid:   "function f() { do if (a) x; else y; while(z) }"
281PASS Invalid: "do g; while 4"
282PASS Invalid: "function f() { do g; while 4 }"
283PASS Invalid: "do g; while ((4)"
284PASS Invalid: "function f() { do g; while ((4) }"
285PASS Valid:   "{ { do do do ; while(0) while(0) while(0) } }"
286PASS Valid:   "function f() { { { do do do ; while(0) while(0) while(0) } } }"
287PASS Valid:   "do while (0) if (a) {} else y; while(0)"
288PASS Valid:   "function f() { do while (0) if (a) {} else y; while(0) }"
289PASS Valid:   "if (a) while (b) if (c) with(d) {} else e; else f"
290PASS Valid:   "function f() { if (a) while (b) if (c) with(d) {} else e; else f }"
291PASS Invalid: "break ; break your_limits ; continue ; continue living ; debugger"
292PASS Invalid: "function f() { break ; break your_limits ; continue ; continue living ; debugger }"
293PASS Invalid: "debugger X"
294PASS Invalid: "function f() { debugger X }"
295PASS Invalid: "break 0.2"
296PASS Invalid: "function f() { break 0.2 }"
297PASS Invalid: "continue a++"
298PASS Invalid: "function f() { continue a++ }"
299PASS Invalid: "continue (my_friend)"
300PASS Invalid: "function f() { continue (my_friend) }"
301PASS Valid:   "while (1) break"
302PASS Valid:   "function f() { while (1) break }"
303PASS Valid:   "do if (a) with (b) continue; else debugger; while (false)"
304PASS Valid:   "function f() { do if (a) with (b) continue; else debugger; while (false) }"
305PASS Invalid: "do if (a) while (false) else debugger"
306PASS Invalid: "function f() { do if (a) while (false) else debugger }"
307PASS Invalid: "while if (a) ;"
308PASS Invalid: "function f() { while if (a) ; }"
309PASS Valid:   "if (a) function f() {} else function g() {}"
310PASS Valid:   "function f() { if (a) function f() {} else function g() {} }"
311PASS Valid:   "if (a()) while(0) function f() {} else function g() {}"
312PASS Valid:   "function f() { if (a()) while(0) function f() {} else function g() {} }"
313PASS Invalid: "if (a()) function f() { else function g() }"
314PASS Invalid: "function f() { if (a()) function f() { else function g() } }"
315PASS Invalid: "if (a) if (b) ; else function f {}"
316PASS Invalid: "function f() { if (a) if (b) ; else function f {} }"
317PASS Invalid: "if (a) if (b) ; else function (){}"
318PASS Invalid: "function f() { if (a) if (b) ; else function (){} }"
319PASS Valid:   "throw a"
320PASS Valid:   "function f() { throw a }"
321PASS Valid:   "throw a + b in void c"
322PASS Valid:   "function f() { throw a + b in void c }"
323PASS Invalid: "throw"
324PASS Invalid: "function f() { throw }"
325var and const statements
326PASS Valid:   "var a, b = null"
327PASS Valid:   "function f() { var a, b = null }"
328PASS Valid:   "const a = 5, b, c"
329PASS Valid:   "function f() { const a = 5, b, c }"
330PASS Invalid: "var"
331PASS Invalid: "function f() { var }"
332PASS Invalid: "var = 7"
333PASS Invalid: "function f() { var = 7 }"
334PASS Invalid: "var c (6)"
335PASS Invalid: "function f() { var c (6) }"
336PASS Valid:   "if (a) var a,b; else const b, c"
337PASS Valid:   "function f() { if (a) var a,b; else const b, c }"
338PASS Invalid: "var 5 = 6"
339PASS Invalid: "function f() { var 5 = 6 }"
340PASS Valid:   "while (0) var a, b, c=6, d, e, f=5*6, g=f*h, h"
341PASS Valid:   "function f() { while (0) var a, b, c=6, d, e, f=5*6, g=f*h, h }"
342PASS Invalid: "var a = if (b) { c }"
343PASS Invalid: "function f() { var a = if (b) { c } }"
344PASS Invalid: "var a = var b"
345PASS Invalid: "function f() { var a = var b }"
346PASS Valid:   "const a = b += c, a, a, a = (b - f())"
347PASS Valid:   "function f() { const a = b += c, a, a, a = (b - f()) }"
348PASS Invalid: "var a %= b | 5"
349PASS Invalid: "function f() { var a %= b | 5 }"
350PASS Invalid: "var (a) = 5"
351PASS Invalid: "function f() { var (a) = 5 }"
352PASS Invalid: "var a = (4, b = 6"
353PASS Invalid: "function f() { var a = (4, b = 6 }"
354PASS Invalid: "const 'l' = 3"
355PASS Invalid: "function f() { const 'l' = 3 }"
356PASS Invalid: "var var = 3"
357PASS Invalid: "function f() { var var = 3 }"
358PASS Valid:   "var varr = 3 in 1"
359PASS Valid:   "function f() { var varr = 3 in 1 }"
360PASS Valid:   "const a, a, a = void 7 - typeof 8, a = 8"
361PASS Valid:   "function f() { const a, a, a = void 7 - typeof 8, a = 8 }"
362PASS Valid:   "const x_x = 6 /= 7 ? e : f"
363PASS Valid:   "function f() { const x_x = 6 /= 7 ? e : f }"
364PASS Invalid: "var a = ?"
365PASS Invalid: "function f() { var a = ? }"
366PASS Invalid: "const a = *7"
367PASS Invalid: "function f() { const a = *7 }"
368PASS Invalid: "var a = :)"
369PASS Invalid: "function f() { var a = :) }"
370PASS Valid:   "var a = a in b in c instanceof d"
371PASS Valid:   "function f() { var a = a in b in c instanceof d }"
372PASS Invalid: "var a = b ? c, b"
373PASS Invalid: "function f() { var a = b ? c, b }"
374PASS Invalid: "const a = b : c"
375PASS Invalid: "function f() { const a = b : c }"
376for statement
377PASS Valid:   "for ( ; ; ) { break }"
378PASS Valid:   "function f() { for ( ; ; ) { break } }"
379PASS Valid:   "for ( a ; ; ) { break }"
380PASS Valid:   "function f() { for ( a ; ; ) { break } }"
381PASS Valid:   "for ( ; a ; ) { break }"
382PASS Valid:   "function f() { for ( ; a ; ) { break } }"
383PASS Valid:   "for ( ; ; a ) { break }"
384PASS Valid:   "function f() { for ( ; ; a ) { break } }"
385PASS Valid:   "for ( a ; a ; ) break"
386PASS Valid:   "function f() { for ( a ; a ; ) break }"
387PASS Valid:   "for ( a ; ; a ) break"
388PASS Valid:   "function f() { for ( a ; ; a ) break }"
389PASS Valid:   "for ( ; a ; a ) break"
390PASS Valid:   "function f() { for ( ; a ; a ) break }"
391PASS Invalid: "for () { }"
392PASS Invalid: "function f() { for () { } }"
393PASS Invalid: "for ( a ) { }"
394PASS Invalid: "function f() { for ( a ) { } }"
395PASS Invalid: "for ( ; ) ;"
396PASS Invalid: "function f() { for ( ; ) ; }"
397PASS Invalid: "for a ; b ; c { }"
398PASS Invalid: "function f() { for a ; b ; c { } }"
399PASS Invalid: "for (a ; { }"
400PASS Invalid: "function f() { for (a ; { } }"
401PASS Invalid: "for ( a ; ) ;"
402PASS Invalid: "function f() { for ( a ; ) ; }"
403PASS Invalid: "for ( ; a ) break"
404PASS Invalid: "function f() { for ( ; a ) break }"
405PASS Valid:   "for (var a, b ; ; ) { break } "
406PASS Valid:   "function f() { for (var a, b ; ; ) { break }  }"
407PASS Valid:   "for (var a = b, b = a ; ; ) break"
408PASS Valid:   "function f() { for (var a = b, b = a ; ; ) break }"
409PASS Valid:   "for (var a = b, c, d, b = a ; x in b ; ) { break }"
410PASS Valid:   "function f() { for (var a = b, c, d, b = a ; x in b ; ) { break } }"
411PASS Valid:   "for (var a = b, c, d ; ; 1 in a()) break"
412PASS Valid:   "function f() { for (var a = b, c, d ; ; 1 in a()) break }"
413PASS Invalid: "for ( ; var a ; ) break"
414PASS Invalid: "function f() { for ( ; var a ; ) break }"
415FAIL Invalid: "for (const a; ; ) break" should throw undefined
416FAIL Invalid: "function f() { for (const a; ; ) break }" should throw undefined
417PASS Invalid: "for ( %a ; ; ) { }"
418PASS Invalid: "function f() { for ( %a ; ; ) { } }"
419PASS Valid:   "for (a in b) break"
420PASS Valid:   "function f() { for (a in b) break }"
421PASS Valid:   "for (a() in b) break"
422PASS Valid:   "function f() { for (a() in b) break }"
423PASS Valid:   "for (a().l[4] in b) break"
424PASS Valid:   "function f() { for (a().l[4] in b) break }"
425PASS Valid:   "for (new a in b in c in d) break"
426PASS Valid:   "function f() { for (new a in b in c in d) break }"
427PASS Valid:   "for (new new new a in b) break"
428PASS Valid:   "function f() { for (new new new a in b) break }"
429FAIL Invalid: "for (delete new a() in b) break" should throw undefined
430FAIL Invalid: "function f() { for (delete new a() in b) break }" should throw undefined
431FAIL Invalid: "for (a * a in b) break" should throw undefined
432FAIL Invalid: "function f() { for (a * a in b) break }" should throw undefined
433PASS Valid:   "for ((a * a) in b) break"
434PASS Valid:   "function f() { for ((a * a) in b) break }"
435FAIL Invalid: "for (a++ in b) break" should throw undefined
436FAIL Invalid: "function f() { for (a++ in b) break }" should throw undefined
437PASS Valid:   "for ((a++) in b) break"
438PASS Valid:   "function f() { for ((a++) in b) break }"
439FAIL Invalid: "for (++a in b) break" should throw undefined
440FAIL Invalid: "function f() { for (++a in b) break }" should throw undefined
441PASS Valid:   "for ((++a) in b) break"
442PASS Valid:   "function f() { for ((++a) in b) break }"
443FAIL Invalid: "for (a, b in c) break" should throw undefined
444FAIL Invalid: "function f() { for (a, b in c) break }" should throw undefined
445FAIL Invalid: "for (a,b in c ;;) break" should throw undefined
446FAIL Invalid: "function f() { for (a,b in c ;;) break }" should throw undefined
447PASS Valid:   "for (a,(b in c) ;;) break"
448PASS Valid:   "function f() { for (a,(b in c) ;;) break }"
449PASS Valid:   "for ((a, b) in c) break"
450PASS Valid:   "function f() { for ((a, b) in c) break }"
451FAIL Invalid: "for (a ? b : c in c) break" should throw undefined
452FAIL Invalid: "function f() { for (a ? b : c in c) break }" should throw undefined
453PASS Valid:   "for ((a ? b : c) in c) break"
454PASS Valid:   "function f() { for ((a ? b : c) in c) break }"
455PASS Valid:   "for (var a in b in c) break"
456PASS Valid:   "function f() { for (var a in b in c) break }"
457PASS Valid:   "for (var a = 5 += 6 in b) break"
458PASS Valid:   "function f() { for (var a = 5 += 6 in b) break }"
459PASS Invalid: "for (var a += 5 in b) break"
460PASS Invalid: "function f() { for (var a += 5 in b) break }"
461PASS Invalid: "for (var a = in b) break"
462PASS Invalid: "function f() { for (var a = in b) break }"
463PASS Invalid: "for (var a, b in b) break"
464PASS Invalid: "function f() { for (var a, b in b) break }"
465PASS Invalid: "for (var a = -6, b in b) break"
466PASS Invalid: "function f() { for (var a = -6, b in b) break }"
467PASS Invalid: "for (var a, b = 8 in b) break"
468PASS Invalid: "function f() { for (var a, b = 8 in b) break }"
469PASS Valid:   "for (var a = (b in c) in d) break"
470PASS Valid:   "function f() { for (var a = (b in c) in d) break }"
471PASS Invalid: "for (var a = (b in c in d) break"
472PASS Invalid: "function f() { for (var a = (b in c in d) break }"
473PASS Invalid: "for (var (a) in b) { }"
474PASS Invalid: "function f() { for (var (a) in b) { } }"
475PASS Valid:   "for (var a = 7, b = c < d >= d ; f()[6]++ ; --i()[1]++ ) {}"
476PASS Valid:   "function f() { for (var a = 7, b = c < d >= d ; f()[6]++ ; --i()[1]++ ) {} }"
477try statement
478PASS Invalid: "try { break } catch(e) {}"
479PASS Invalid: "function f() { try { break } catch(e) {} }"
480PASS Valid:   "try {} finally { c++ }"
481PASS Valid:   "function f() { try {} finally { c++ } }"
482PASS Valid:   "try { with (x) { } } catch(e) {} finally { if (a) ; }"
483PASS Valid:   "function f() { try { with (x) { } } catch(e) {} finally { if (a) ; } }"
484PASS Invalid: "try {}"
485PASS Invalid: "function f() { try {} }"
486PASS Invalid: "catch(e) {}"
487PASS Invalid: "function f() { catch(e) {} }"
488PASS Invalid: "finally {}"
489PASS Invalid: "function f() { finally {} }"
490PASS Invalid: "try a; catch(e) {}"
491PASS Invalid: "function f() { try a; catch(e) {} }"
492PASS Invalid: "try {} catch(e) a()"
493PASS Invalid: "function f() { try {} catch(e) a() }"
494PASS Invalid: "try {} finally a()"
495PASS Invalid: "function f() { try {} finally a() }"
496PASS Invalid: "try {} catch(e)"
497PASS Invalid: "function f() { try {} catch(e) }"
498PASS Invalid: "try {} finally"
499PASS Invalid: "function f() { try {} finally }"
500PASS Invalid: "try {} finally {} catch(e) {}"
501PASS Invalid: "function f() { try {} finally {} catch(e) {} }"
502PASS Invalid: "try {} catch (...) {}"
503PASS Invalid: "function f() { try {} catch (...) {} }"
504PASS Invalid: "try {} catch {}"
505PASS Invalid: "function f() { try {} catch {} }"
506PASS Valid:   "if (a) try {} finally {} else b;"
507PASS Valid:   "function f() { if (a) try {} finally {} else b; }"
508PASS Valid:   "if (--a()) do with(1) try {} catch(ke) { f() ; g() } while (a in b) else {}"
509PASS Valid:   "function f() { if (--a()) do with(1) try {} catch(ke) { f() ; g() } while (a in b) else {} }"
510PASS Invalid: "if (a) try {} else b; catch (e) { }"
511PASS Invalid: "function f() { if (a) try {} else b; catch (e) { } }"
512PASS Invalid: "try { finally {}"
513PASS Invalid: "function f() { try { finally {} }"
514switch statement
515PASS Valid:   "switch (a) {}"
516PASS Valid:   "function f() { switch (a) {} }"
517PASS Invalid: "switch () {}"
518PASS Invalid: "function f() { switch () {} }"
519PASS Invalid: "case 5:"
520PASS Invalid: "function f() { case 5: }"
521PASS Invalid: "default:"
522PASS Invalid: "function f() { default: }"
523PASS Invalid: "switch (a) b;"
524PASS Invalid: "function f() { switch (a) b; }"
525PASS Invalid: "switch (a) case 3: b;"
526PASS Invalid: "function f() { switch (a) case 3: b; }"
527PASS Valid:   "switch (f()) { case 5 * f(): default: case '6' - 9: ++i }"
528PASS Valid:   "function f() { switch (f()) { case 5 * f(): default: case '6' - 9: ++i } }"
529PASS Invalid: "switch (true) { default: case 6: default: }"
530PASS Invalid: "function f() { switch (true) { default: case 6: default: } }"
531PASS Invalid: "switch (l) { f(); }"
532PASS Invalid: "function f() { switch (l) { f(); } }"
533PASS Invalid: "switch (l) { case 1: ; a: case 5: }"
534PASS Invalid: "function f() { switch (l) { case 1: ; a: case 5: } }"
535PASS Valid:   "switch (g() - h[5].l) { case 1 + 6: a: b: c: ++f }"
536PASS Valid:   "function f() { switch (g() - h[5].l) { case 1 + 6: a: b: c: ++f } }"
537PASS Invalid: "switch (g) { case 1: a: }"
538PASS Invalid: "function f() { switch (g) { case 1: a: } }"
539PASS Invalid: "switch (g) { case 1: a: default: }"
540PASS Invalid: "function f() { switch (g) { case 1: a: default: } }"
541PASS Invalid: "switch g { case 1: l() }"
542PASS Invalid: "function f() { switch g { case 1: l() } }"
543PASS Invalid: "switch (g) { case 1:"
544PASS Invalid: "function f() { switch (g) { case 1: }"
545PASS Valid:   "switch (l) { case a = b ? c : d : }"
546PASS Valid:   "function f() { switch (l) { case a = b ? c : d : } }"
547PASS Valid:   "switch (sw) { case a ? b - 7[1] ? [c,,] : d = 6 : { } : }"
548PASS Valid:   "function f() { switch (sw) { case a ? b - 7[1] ? [c,,] : d = 6 : { } : } }"
549PASS Invalid: "switch (l) { case b ? c : }"
550PASS Invalid: "function f() { switch (l) { case b ? c : } }"
551PASS Valid:   "switch (l) { case 1: a: with(g) switch (g) { case 2: default: } default: }"
552PASS Valid:   "function f() { switch (l) { case 1: a: with(g) switch (g) { case 2: default: } default: } }"
553PASS Invalid: "switch (4 - ) { }"
554PASS Invalid: "function f() { switch (4 - ) { } }"
555PASS Invalid: "switch (l) { default case: 5; }"
556PASS Invalid: "function f() { switch (l) { default case: 5; } }"
557PASS Invalid: "L: L: ;"
558PASS Invalid: "function f() { L: L: ; }"
559PASS Invalid: "L: L1: L: ;"
560PASS Invalid: "function f() { L: L1: L: ; }"
561PASS Invalid: "L: L1: L2: L3: L4: L: ;"
562PASS Invalid: "function f() { L: L1: L2: L3: L4: L: ; }"
563PASS Invalid: "for(var a,b 'this shouldn't be allowed' false ; ) ;"
564PASS Invalid: "function f() { for(var a,b 'this shouldn't be allowed' false ; ) ; }"
565PASS Invalid: "for(var a,b '"
566PASS Invalid: "function f() { for(var a,b ' }"
567PASS Valid:   "function __proto__(){}"
568PASS Valid:   "function f() { function __proto__(){} }"
569PASS Valid:   "(function __proto__(){})"
570PASS Valid:   "function f() { (function __proto__(){}) }"
571PASS Valid:   "'use strict'; function __proto__(){}"
572PASS Valid:   "function f() { 'use strict'; function __proto__(){} }"
573PASS Valid:   "'use strict'; (function __proto__(){})"
574PASS Valid:   "function f() { 'use strict'; (function __proto__(){}) }"
575PASS Valid:   "if (0) $foo; "
576PASS Valid:   "function f() { if (0) $foo;  }"
577PASS Valid:   "if (0) _foo; "
578PASS Valid:   "function f() { if (0) _foo;  }"
579PASS Valid:   "if (0) foo$; "
580PASS Valid:   "function f() { if (0) foo$;  }"
581PASS Valid:   "if (0) foo_; "
582PASS Valid:   "function f() { if (0) foo_;  }"
583PASS Valid:   "if (0) obj.$foo; "
584PASS Valid:   "function f() { if (0) obj.$foo;  }"
585PASS Valid:   "if (0) obj._foo; "
586PASS Valid:   "function f() { if (0) obj._foo;  }"
587PASS Valid:   "if (0) obj.foo$; "
588PASS Valid:   "function f() { if (0) obj.foo$;  }"
589PASS Valid:   "if (0) obj.foo_; "
590PASS Valid:   "function f() { if (0) obj.foo_;  }"
591PASS Valid:   "if (0) obj.foo\u03bb; "
592PASS Valid:   "function f() { if (0) obj.foo\u03bb;  }"
593PASS Valid:   "if (0) new a(b+c).d = 5"
594PASS Valid:   "function f() { if (0) new a(b+c).d = 5 }"
595PASS Valid:   "if (0) new a(b+c) = 5"
596PASS Valid:   "function f() { if (0) new a(b+c) = 5 }"
597PASS Valid:   "([1 || 1].a = 1)"
598PASS Valid:   "function f() { ([1 || 1].a = 1) }"
599PASS Valid:   "({a: 1 || 1}.a = 1)"
600PASS Valid:   "function f() { ({a: 1 || 1}.a = 1) }"
601PASS Invalid: "var a.b = c"
602PASS Invalid: "function f() { var a.b = c }"
603PASS Invalid: "var a.b;"
604PASS Invalid: "function f() { var a.b; }"
605FAIL e.line should be 1 (of type number). Was undefined (of type undefined).
606PASS foo is 'PASS'
607PASS bar is 'PASS'
608PASS successfullyParsed is true
609
610TEST COMPLETE
611
612