blob: 132fb4bca0ad802b44aae4432cdb14102a5f0fed [file] [log] [blame]
# Copyright 2013 the V8 project authors. All rights reserved.
# Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This test checks that the following expressions or statements are valid ECMASCRIPT code or should throw parse error
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Unary operators and member access
PASS Valid: ""
PASS Valid: "function f() { }"
PASS Invalid: "(a"
PASS Invalid: "function f() { (a }"
PASS Invalid: "a[5"
PASS Invalid: "function f() { a[5 }"
PASS Invalid: "a[5 + 6"
PASS Invalid: "function f() { a[5 + 6 }"
PASS Invalid: "a."
PASS Invalid: "function f() { a. }"
PASS Invalid: "()"
PASS Invalid: "function f() { () }"
PASS Invalid: "a.'l'"
PASS Invalid: "function f() { a.'l' }"
PASS Valid: "a: +~!new a"
PASS Valid: "function f() { a: +~!new a }"
PASS Invalid: "new -a"
PASS Invalid: "function f() { new -a }"
PASS Valid: "new (-1)"
PASS Valid: "function f() { new (-1) }"
PASS Valid: "a: b: c: new f(x++)++"
PASS Valid: "function f() { a: b: c: new f(x++)++ }"
PASS Valid: "(a)++"
PASS Valid: "function f() { (a)++ }"
PASS Valid: "(1--).x"
PASS Valid: "function f() { (1--).x }"
PASS Invalid: "a-- ++"
PASS Invalid: "function f() { a-- ++ }"
PASS Invalid: "(a:) --b"
PASS Invalid: "function f() { (a:) --b }"
PASS Valid: "++ -- ++ a"
PASS Valid: "function f() { ++ -- ++ a }"
PASS Valid: "++ new new a ++"
PASS Valid: "function f() { ++ new new a ++ }"
PASS Valid: "delete void 0"
PASS Valid: "function f() { delete void 0 }"
PASS Invalid: "delete the void"
PASS Invalid: "function f() { delete the void }"
PASS Invalid: "(a++"
PASS Invalid: "function f() { (a++ }"
PASS Valid: "++a--"
PASS Valid: "function f() { ++a-- }"
PASS Valid: "++((a))--"
PASS Valid: "function f() { ++((a))-- }"
PASS Valid: "(a.x++)++"
PASS Valid: "function f() { (a.x++)++ }"
PASS Invalid: "1: null"
PASS Invalid: "function f() { 1: null }"
PASS Invalid: "+-!~"
PASS Invalid: "function f() { +-!~ }"
PASS Invalid: "+-!~(("
PASS Invalid: "function f() { +-!~(( }"
PASS Invalid: "a)"
PASS Invalid: "function f() { a) }"
PASS Invalid: "a]"
PASS Invalid: "function f() { a] }"
PASS Invalid: ".l"
PASS Invalid: "function f() { .l }"
PASS Invalid: "1.l"
PASS Invalid: "function f() { 1.l }"
PASS Valid: "1 .l"
PASS Valid: "function f() { 1 .l }"
Binary and conditional operators
PASS Valid: "a + + typeof this"
PASS Valid: "function f() { a + + typeof this }"
PASS Invalid: "a + * b"
PASS Invalid: "function f() { a + * b }"
PASS Invalid: "a ? b"
PASS Invalid: "function f() { a ? b }"
PASS Invalid: "a ? b :"
PASS Invalid: "function f() { a ? b : }"
PASS Invalid: "%a"
PASS Invalid: "function f() { %a }"
PASS Invalid: "a-"
PASS Invalid: "function f() { a- }"
PASS Valid: "a = b ? b = c : d = e"
PASS Valid: "function f() { a = b ? b = c : d = e }"
PASS Valid: "s: a[1].l ? b.l['s'] ? c++ : d : true"
PASS Valid: "function f() { s: a[1].l ? b.l['s'] ? c++ : d : true }"
PASS Valid: "a ? b + 1 ? c + 3 * d.l : d[5][6] : e"
PASS Valid: "function f() { a ? b + 1 ? c + 3 * d.l : d[5][6] : e }"
PASS Valid: "a in b instanceof delete -c"
PASS Valid: "function f() { a in b instanceof delete -c }"
PASS Invalid: "a in instanceof b.l"
PASS Invalid: "function f() { a in instanceof b.l }"
PASS Valid: "- - true % 5"
PASS Valid: "function f() { - - true % 5 }"
FAIL Invalid: "- false = 3" should throw undefined
FAIL Invalid: "function f() { - false = 3 }" should throw undefined
PASS Valid: "a: b: c: (1 + null) = 3"
PASS Valid: "function f() { a: b: c: (1 + null) = 3 }"
PASS Valid: "a[2] = b.l += c /= 4 * 7 ^ !6"
PASS Valid: "function f() { a[2] = b.l += c /= 4 * 7 ^ !6 }"
FAIL Invalid: "a + typeof b += c in d" should throw undefined
FAIL Invalid: "function f() { a + typeof b += c in d }" should throw undefined
FAIL Invalid: "typeof a &= typeof b" should throw undefined
FAIL Invalid: "function f() { typeof a &= typeof b }" should throw undefined
PASS Valid: "a: ((typeof (a))) >>>= a || b.l && c"
PASS Valid: "function f() { a: ((typeof (a))) >>>= a || b.l && c }"
PASS Valid: "a: b: c[a /= f[a %= b]].l[c[x] = 7] -= a ? b <<= f : g"
PASS Valid: "function f() { a: b: c[a /= f[a %= b]].l[c[x] = 7] -= a ? b <<= f : g }"
PASS Valid: "-void+x['y'].l == x.l != 5 - f[7]"
PASS Valid: "function f() { -void+x['y'].l == x.l != 5 - f[7] }"
Function calls (and new with arguments)
PASS Valid: "a()()()"
PASS Valid: "function f() { a()()() }"
PASS Valid: "s: l: a[2](4 == 6, 5 = 6)(f[4], 6)"
PASS Valid: "function f() { s: l: a[2](4 == 6, 5 = 6)(f[4], 6) }"
PASS Valid: "s: eval(a.apply(), b.call(c[5] - f[7]))"
PASS Valid: "function f() { s: eval(a.apply(), b.call(c[5] - f[7])) }"
PASS Invalid: "a("
PASS Invalid: "function f() { a( }"
PASS Invalid: "a(5"
PASS Invalid: "function f() { a(5 }"
PASS Invalid: "a(5,"
PASS Invalid: "function f() { a(5, }"
PASS Invalid: "a(5,)"
PASS Invalid: "function f() { a(5,) }"
PASS Invalid: "a(5,6"
PASS Invalid: "function f() { a(5,6 }"
PASS Valid: "a(b[7], c <d> e.l, new a() > b)"
PASS Valid: "function f() { a(b[7], c <d> e.l, new a() > b) }"
PASS Invalid: "a(b[5)"
PASS Invalid: "function f() { a(b[5) }"
PASS Invalid: "a(b.)"
PASS Invalid: "function f() { a(b.) }"
PASS Valid: "~new new a(1)(i++)(c[l])"
PASS Valid: "function f() { ~new new a(1)(i++)(c[l]) }"
PASS Invalid: "a(*a)"
PASS Invalid: "function f() { a(*a) }"
PASS Valid: "((((a))((b)()).l))()"
PASS Valid: "function f() { ((((a))((b)()).l))() }"
PASS Valid: "(a)[b + (c) / (d())].l--"
PASS Valid: "function f() { (a)[b + (c) / (d())].l-- }"
PASS Valid: "new (5)"
PASS Valid: "function f() { new (5) }"
PASS Invalid: "new a(5"
PASS Invalid: "function f() { new a(5 }"
PASS Valid: "new (f + 5)(6, (g)() - 'l'() - true(false))"
PASS Valid: "function f() { new (f + 5)(6, (g)() - 'l'() - true(false)) }"
PASS Invalid: "a(.length)"
PASS Invalid: "function f() { a(.length) }"
function declaration and expression
PASS Valid: "function f() {}"
PASS Valid: "function f() { function f() {} }"
PASS Valid: "function f(a,b) {}"
PASS Valid: "function f() { function f(a,b) {} }"
PASS Invalid: "function () {}"
PASS Invalid: "function f() { function () {} }"
PASS Invalid: "function f(a b) {}"
PASS Invalid: "function f() { function f(a b) {} }"
PASS Invalid: "function f(a,) {}"
PASS Invalid: "function f() { function f(a,) {} }"
PASS Invalid: "function f(a,"
PASS Invalid: "function f() { function f(a, }"
PASS Invalid: "function f(a, 1) {}"
PASS Invalid: "function f() { function f(a, 1) {} }"
PASS Valid: "function g(arguments, eval) {}"
PASS Valid: "function f() { function g(arguments, eval) {} }"
PASS Valid: "function f() {} + function g() {}"
PASS Valid: "function f() { function f() {} + function g() {} }"
PASS Invalid: "(function a{})"
PASS Invalid: "function f() { (function a{}) }"
PASS Invalid: "(function this(){})"
PASS Invalid: "function f() { (function this(){}) }"
PASS Valid: "(delete new function f(){} + function(a,b){}(5)(6))"
PASS Valid: "function f() { (delete new function f(){} + function(a,b){}(5)(6)) }"
PASS Valid: "6 - function (m) { function g() {} }"
PASS Valid: "function f() { 6 - function (m) { function g() {} } }"
PASS Invalid: "function l() {"
PASS Invalid: "function f() { function l() { }"
PASS Invalid: "function l++(){}"
PASS Invalid: "function f() { function l++(){} }"
Array and object literal, comma operator
PASS Valid: "[] in [5,6] * [,5,] / [,,5,,] || [a,] && new [,b] % [,,]"
PASS Valid: "function f() { [] in [5,6] * [,5,] / [,,5,,] || [a,] && new [,b] % [,,] }"
PASS Invalid: "[5,"
PASS Invalid: "function f() { [5, }"
PASS Invalid: "[,"
PASS Invalid: "function f() { [, }"
PASS Invalid: "(a,)"
PASS Invalid: "function f() { (a,) }"
PASS Valid: "1 + {get get(){}, set set(a){}, get1:4, set1:get-set, }"
PASS Valid: "function f() { 1 + {get get(){}, set set(a){}, get1:4, set1:get-set, } }"
PASS Invalid: "1 + {a"
PASS Invalid: "function f() { 1 + {a }"
PASS Invalid: "1 + {a:"
PASS Invalid: "function f() { 1 + {a: }"
PASS Invalid: "1 + {get l("
PASS Invalid: "function f() { 1 + {get l( }"
PASS Invalid: ",a"
PASS Invalid: "function f() { ,a }"
PASS Valid: "(4,(5,a(3,4))),f[4,a-6]"
PASS Valid: "function f() { (4,(5,a(3,4))),f[4,a-6] }"
PASS Invalid: "(,f)"
PASS Invalid: "function f() { (,f) }"
PASS Invalid: "a,,b"
PASS Invalid: "function f() { a,,b }"
PASS Invalid: "a ? b, c : d"
PASS Invalid: "function f() { a ? b, c : d }"
simple statements
PASS Valid: "{ }"
PASS Valid: "function f() { { } }"
PASS Invalid: "{ { }"
PASS Invalid: "function f() { { { } }"
PASS Valid: "{ ; ; ; }"
PASS Valid: "function f() { { ; ; ; } }"
PASS Valid: "a: { ; }"
PASS Valid: "function f() { a: { ; } }"
PASS Invalid: "{ a: }"
PASS Invalid: "function f() { { a: } }"
PASS Valid: "{} f; { 6 + f() }"
PASS Valid: "function f() { {} f; { 6 + f() } }"
PASS Valid: "{ a[5],6; {} ++b-new (-5)() } c().l++"
PASS Valid: "function f() { { a[5],6; {} ++b-new (-5)() } c().l++ }"
PASS Valid: "{ l1: l2: l3: { this } a = 32 ; { i++ ; { { { } } ++i } } }"
PASS Valid: "function f() { { l1: l2: l3: { this } a = 32 ; { i++ ; { { { } } ++i } } } }"
PASS Valid: "if (a) ;"
PASS Valid: "function f() { if (a) ; }"
PASS Invalid: "{ if (a) }"
PASS Invalid: "function f() { { if (a) } }"
PASS Invalid: "if a {}"
PASS Invalid: "function f() { if a {} }"
PASS Invalid: "if (a"
PASS Invalid: "function f() { if (a }"
PASS Invalid: "if (a { }"
PASS Invalid: "function f() { if (a { } }"
PASS Valid: "x: s: if (a) ; else b"
PASS Valid: "function f() { x: s: if (a) ; else b }"
PASS Invalid: "else {}"
PASS Invalid: "function f() { else {} }"
PASS Valid: "if (a) if (b) y; else {} else ;"
PASS Valid: "function f() { if (a) if (b) y; else {} else ; }"
PASS Invalid: "if (a) {} else x; else"
PASS Invalid: "function f() { if (a) {} else x; else }"
PASS Invalid: "if (a) { else }"
PASS Invalid: "function f() { if (a) { else } }"
PASS Valid: "if (a.l + new b()) 4 + 5 - f()"
PASS Valid: "function f() { if (a.l + new b()) 4 + 5 - f() }"
PASS Valid: "if (a) with (x) ; else with (y) ;"
PASS Valid: "function f() { if (a) with (x) ; else with (y) ; }"
PASS Invalid: "with a.b { }"
PASS Invalid: "function f() { with a.b { } }"
PASS Valid: "while (a() - new b) ;"
PASS Valid: "function f() { while (a() - new b) ; }"
PASS Invalid: "while a {}"
PASS Invalid: "function f() { while a {} }"
PASS Valid: "do ; while(0) i++"
PASS Valid: "function f() { do ; while(0) i++ }"
PASS Valid: "do if (a) x; else y; while(z)"
PASS Valid: "function f() { do if (a) x; else y; while(z) }"
PASS Invalid: "do g; while 4"
PASS Invalid: "function f() { do g; while 4 }"
PASS Invalid: "do g; while ((4)"
PASS Invalid: "function f() { do g; while ((4) }"
PASS Valid: "{ { do do do ; while(0) while(0) while(0) } }"
PASS Valid: "function f() { { { do do do ; while(0) while(0) while(0) } } }"
PASS Valid: "do while (0) if (a) {} else y; while(0)"
PASS Valid: "function f() { do while (0) if (a) {} else y; while(0) }"
PASS Valid: "if (a) while (b) if (c) with(d) {} else e; else f"
PASS Valid: "function f() { if (a) while (b) if (c) with(d) {} else e; else f }"
PASS Invalid: "break ; break your_limits ; continue ; continue living ; debugger"
PASS Invalid: "function f() { break ; break your_limits ; continue ; continue living ; debugger }"
PASS Invalid: "debugger X"
PASS Invalid: "function f() { debugger X }"
PASS Invalid: "break 0.2"
PASS Invalid: "function f() { break 0.2 }"
PASS Invalid: "continue a++"
PASS Invalid: "function f() { continue a++ }"
PASS Invalid: "continue (my_friend)"
PASS Invalid: "function f() { continue (my_friend) }"
PASS Valid: "while (1) break"
PASS Valid: "function f() { while (1) break }"
PASS Valid: "do if (a) with (b) continue; else debugger; while (false)"
PASS Valid: "function f() { do if (a) with (b) continue; else debugger; while (false) }"
PASS Invalid: "do if (a) while (false) else debugger"
PASS Invalid: "function f() { do if (a) while (false) else debugger }"
PASS Invalid: "while if (a) ;"
PASS Invalid: "function f() { while if (a) ; }"
PASS Valid: "if (a) function f() {} else function g() {}"
PASS Valid: "function f() { if (a) function f() {} else function g() {} }"
PASS Valid: "if (a()) while(0) function f() {} else function g() {}"
PASS Valid: "function f() { if (a()) while(0) function f() {} else function g() {} }"
PASS Invalid: "if (a()) function f() { else function g() }"
PASS Invalid: "function f() { if (a()) function f() { else function g() } }"
PASS Invalid: "if (a) if (b) ; else function f {}"
PASS Invalid: "function f() { if (a) if (b) ; else function f {} }"
PASS Invalid: "if (a) if (b) ; else function (){}"
PASS Invalid: "function f() { if (a) if (b) ; else function (){} }"
PASS Valid: "throw a"
PASS Valid: "function f() { throw a }"
PASS Valid: "throw a + b in void c"
PASS Valid: "function f() { throw a + b in void c }"
PASS Invalid: "throw"
PASS Invalid: "function f() { throw }"
var and const statements
PASS Valid: "var a, b = null"
PASS Valid: "function f() { var a, b = null }"
FAIL Valid: "const a = 5, b, c" should NOT throw
FAIL Valid: "function f() { const a = 5, b, c }" should NOT throw
PASS Invalid: "var"
PASS Invalid: "function f() { var }"
PASS Invalid: "var = 7"
PASS Invalid: "function f() { var = 7 }"
PASS Invalid: "var c (6)"
PASS Invalid: "function f() { var c (6) }"
FAIL Valid: "if (a) var a,b; else const b, c" should NOT throw
FAIL Valid: "function f() { if (a) var a,b; else const b, c }" should NOT throw
PASS Invalid: "var 5 = 6"
PASS Invalid: "function f() { var 5 = 6 }"
PASS Valid: "while (0) var a, b, c=6, d, e, f=5*6, g=f*h, h"
PASS Valid: "function f() { while (0) var a, b, c=6, d, e, f=5*6, g=f*h, h }"
PASS Invalid: "var a = if (b) { c }"
PASS Invalid: "function f() { var a = if (b) { c } }"
PASS Invalid: "var a = var b"
PASS Invalid: "function f() { var a = var b }"
FAIL Valid: "const a = b += c, a, a, a = (b - f())" should NOT throw
FAIL Valid: "function f() { const a = b += c, a, a, a = (b - f()) }" should NOT throw
PASS Invalid: "var a %= b | 5"
PASS Invalid: "function f() { var a %= b | 5 }"
PASS Invalid: "var (a) = 5"
PASS Invalid: "function f() { var (a) = 5 }"
PASS Invalid: "var a = (4, b = 6"
PASS Invalid: "function f() { var a = (4, b = 6 }"
PASS Invalid: "const 'l' = 3"
PASS Invalid: "function f() { const 'l' = 3 }"
PASS Invalid: "var var = 3"
PASS Invalid: "function f() { var var = 3 }"
PASS Valid: "var varr = 3 in 1"
PASS Valid: "function f() { var varr = 3 in 1 }"
FAIL Valid: "const a, a, a = void 7 - typeof 8, a = 8" should NOT throw
FAIL Valid: "function f() { const a, a, a = void 7 - typeof 8, a = 8 }" should NOT throw
PASS Valid: "const x_x = 6 /= 7 ? e : f"
PASS Valid: "function f() { const x_x = 6 /= 7 ? e : f }"
PASS Invalid: "var a = ?"
PASS Invalid: "function f() { var a = ? }"
PASS Invalid: "const a = *7"
PASS Invalid: "function f() { const a = *7 }"
PASS Invalid: "var a = :)"
PASS Invalid: "function f() { var a = :) }"
PASS Valid: "var a = a in b in c instanceof d"
PASS Valid: "function f() { var a = a in b in c instanceof d }"
PASS Invalid: "var a = b ? c, b"
PASS Invalid: "function f() { var a = b ? c, b }"
PASS Invalid: "const a = b : c"
PASS Invalid: "function f() { const a = b : c }"
for statement
PASS Valid: "for ( ; ; ) { break }"
PASS Valid: "function f() { for ( ; ; ) { break } }"
PASS Valid: "for ( a ; ; ) { break }"
PASS Valid: "function f() { for ( a ; ; ) { break } }"
PASS Valid: "for ( ; a ; ) { break }"
PASS Valid: "function f() { for ( ; a ; ) { break } }"
PASS Valid: "for ( ; ; a ) { break }"
PASS Valid: "function f() { for ( ; ; a ) { break } }"
PASS Valid: "for ( a ; a ; ) break"
PASS Valid: "function f() { for ( a ; a ; ) break }"
PASS Valid: "for ( a ; ; a ) break"
PASS Valid: "function f() { for ( a ; ; a ) break }"
PASS Valid: "for ( ; a ; a ) break"
PASS Valid: "function f() { for ( ; a ; a ) break }"
PASS Invalid: "for () { }"
PASS Invalid: "function f() { for () { } }"
PASS Invalid: "for ( a ) { }"
PASS Invalid: "function f() { for ( a ) { } }"
PASS Invalid: "for ( ; ) ;"
PASS Invalid: "function f() { for ( ; ) ; }"
PASS Invalid: "for a ; b ; c { }"
PASS Invalid: "function f() { for a ; b ; c { } }"
PASS Invalid: "for (a ; { }"
PASS Invalid: "function f() { for (a ; { } }"
PASS Invalid: "for ( a ; ) ;"
PASS Invalid: "function f() { for ( a ; ) ; }"
PASS Invalid: "for ( ; a ) break"
PASS Invalid: "function f() { for ( ; a ) break }"
PASS Valid: "for (var a, b ; ; ) { break } "
PASS Valid: "function f() { for (var a, b ; ; ) { break } }"
PASS Valid: "for (var a = b, b = a ; ; ) break"
PASS Valid: "function f() { for (var a = b, b = a ; ; ) break }"
PASS Valid: "for (var a = b, c, d, b = a ; x in b ; ) { break }"
PASS Valid: "function f() { for (var a = b, c, d, b = a ; x in b ; ) { break } }"
PASS Valid: "for (var a = b, c, d ; ; 1 in a()) break"
PASS Valid: "function f() { for (var a = b, c, d ; ; 1 in a()) break }"
PASS Invalid: "for ( ; var a ; ) break"
PASS Invalid: "function f() { for ( ; var a ; ) break }"
PASS Invalid: "for (const a; ; ) break"
PASS Invalid: "function f() { for (const a; ; ) break }"
PASS Invalid: "for ( %a ; ; ) { }"
PASS Invalid: "function f() { for ( %a ; ; ) { } }"
PASS Valid: "for (a in b) break"
PASS Valid: "function f() { for (a in b) break }"
PASS Valid: "for (a() in b) break"
PASS Valid: "function f() { for (a() in b) break }"
PASS Valid: "for (a().l[4] in b) break"
PASS Valid: "function f() { for (a().l[4] in b) break }"
PASS Invalid: "for (new a in b in c in d) break"
PASS Invalid: "function f() { for (new a in b in c in d) break }"
PASS Invalid: "for (new new new a in b) break"
PASS Invalid: "function f() { for (new new new a in b) break }"
PASS Invalid: "for (delete new a() in b) break"
PASS Invalid: "function f() { for (delete new a() in b) break }"
PASS Invalid: "for (a * a in b) break"
PASS Invalid: "function f() { for (a * a in b) break }"
PASS Invalid: "for ((a * a) in b) break"
PASS Invalid: "function f() { for ((a * a) in b) break }"
PASS Invalid: "for (a++ in b) break"
PASS Invalid: "function f() { for (a++ in b) break }"
PASS Invalid: "for ((a++) in b) break"
PASS Invalid: "function f() { for ((a++) in b) break }"
PASS Invalid: "for (++a in b) break"
PASS Invalid: "function f() { for (++a in b) break }"
PASS Invalid: "for ((++a) in b) break"
PASS Invalid: "function f() { for ((++a) in b) break }"
PASS Invalid: "for (a, b in c) break"
PASS Invalid: "function f() { for (a, b in c) break }"
PASS Invalid: "for (a,b in c ;;) break"
PASS Invalid: "function f() { for (a,b in c ;;) break }"
PASS Valid: "for (a,(b in c) ;;) break"
PASS Valid: "function f() { for (a,(b in c) ;;) break }"
PASS Invalid: "for ((a, b) in c) break"
PASS Invalid: "function f() { for ((a, b) in c) break }"
PASS Invalid: "for (a ? b : c in c) break"
PASS Invalid: "function f() { for (a ? b : c in c) break }"
PASS Invalid: "for ((a ? b : c) in c) break"
PASS Invalid: "function f() { for ((a ? b : c) in c) break }"
PASS Valid: "for (var a in b in c) break"
PASS Valid: "function f() { for (var a in b in c) break }"
PASS Valid: "for (var a = 5 += 6 in b) break"
PASS Valid: "function f() { for (var a = 5 += 6 in b) break }"
PASS Invalid: "for (var a += 5 in b) break"
PASS Invalid: "function f() { for (var a += 5 in b) break }"
PASS Invalid: "for (var a = in b) break"
PASS Invalid: "function f() { for (var a = in b) break }"
PASS Invalid: "for (var a, b in b) break"
PASS Invalid: "function f() { for (var a, b in b) break }"
PASS Invalid: "for (var a = -6, b in b) break"
PASS Invalid: "function f() { for (var a = -6, b in b) break }"
PASS Invalid: "for (var a, b = 8 in b) break"
PASS Invalid: "function f() { for (var a, b = 8 in b) break }"
PASS Valid: "for (var a = (b in c) in d) break"
PASS Valid: "function f() { for (var a = (b in c) in d) break }"
PASS Invalid: "for (var a = (b in c in d) break"
PASS Invalid: "function f() { for (var a = (b in c in d) break }"
PASS Invalid: "for (var (a) in b) { }"
PASS Invalid: "function f() { for (var (a) in b) { } }"
PASS Valid: "for (var a = 7, b = c < d >= d ; f()[6]++ ; --i()[1]++ ) {}"
PASS Valid: "function f() { for (var a = 7, b = c < d >= d ; f()[6]++ ; --i()[1]++ ) {} }"
try statement
PASS Invalid: "try { break } catch(e) {}"
PASS Invalid: "function f() { try { break } catch(e) {} }"
PASS Valid: "try {} finally { c++ }"
PASS Valid: "function f() { try {} finally { c++ } }"
PASS Valid: "try { with (x) { } } catch(e) {} finally { if (a) ; }"
PASS Valid: "function f() { try { with (x) { } } catch(e) {} finally { if (a) ; } }"
PASS Invalid: "try {}"
PASS Invalid: "function f() { try {} }"
PASS Invalid: "catch(e) {}"
PASS Invalid: "function f() { catch(e) {} }"
PASS Invalid: "finally {}"
PASS Invalid: "function f() { finally {} }"
PASS Invalid: "try a; catch(e) {}"
PASS Invalid: "function f() { try a; catch(e) {} }"
PASS Invalid: "try {} catch(e) a()"
PASS Invalid: "function f() { try {} catch(e) a() }"
PASS Invalid: "try {} finally a()"
PASS Invalid: "function f() { try {} finally a() }"
PASS Invalid: "try {} catch(e)"
PASS Invalid: "function f() { try {} catch(e) }"
PASS Invalid: "try {} finally"
PASS Invalid: "function f() { try {} finally }"
PASS Invalid: "try {} finally {} catch(e) {}"
PASS Invalid: "function f() { try {} finally {} catch(e) {} }"
PASS Invalid: "try {} catch (...) {}"
PASS Invalid: "function f() { try {} catch (...) {} }"
PASS Invalid: "try {} catch {}"
PASS Invalid: "function f() { try {} catch {} }"
PASS Valid: "if (a) try {} finally {} else b;"
PASS Valid: "function f() { if (a) try {} finally {} else b; }"
PASS Valid: "if (--a()) do with(1) try {} catch(ke) { f() ; g() } while (a in b) else {}"
PASS Valid: "function f() { if (--a()) do with(1) try {} catch(ke) { f() ; g() } while (a in b) else {} }"
PASS Invalid: "if (a) try {} else b; catch (e) { }"
PASS Invalid: "function f() { if (a) try {} else b; catch (e) { } }"
PASS Invalid: "try { finally {}"
PASS Invalid: "function f() { try { finally {} }"
switch statement
PASS Valid: "switch (a) {}"
PASS Valid: "function f() { switch (a) {} }"
PASS Invalid: "switch () {}"
PASS Invalid: "function f() { switch () {} }"
PASS Invalid: "case 5:"
PASS Invalid: "function f() { case 5: }"
PASS Invalid: "default:"
PASS Invalid: "function f() { default: }"
PASS Invalid: "switch (a) b;"
PASS Invalid: "function f() { switch (a) b; }"
PASS Invalid: "switch (a) case 3: b;"
PASS Invalid: "function f() { switch (a) case 3: b; }"
PASS Valid: "switch (f()) { case 5 * f(): default: case '6' - 9: ++i }"
PASS Valid: "function f() { switch (f()) { case 5 * f(): default: case '6' - 9: ++i } }"
PASS Invalid: "switch (true) { default: case 6: default: }"
PASS Invalid: "function f() { switch (true) { default: case 6: default: } }"
PASS Invalid: "switch (l) { f(); }"
PASS Invalid: "function f() { switch (l) { f(); } }"
PASS Invalid: "switch (l) { case 1: ; a: case 5: }"
PASS Invalid: "function f() { switch (l) { case 1: ; a: case 5: } }"
PASS Valid: "switch (g() - h[5].l) { case 1 + 6: a: b: c: ++f }"
PASS Valid: "function f() { switch (g() - h[5].l) { case 1 + 6: a: b: c: ++f } }"
PASS Invalid: "switch (g) { case 1: a: }"
PASS Invalid: "function f() { switch (g) { case 1: a: } }"
PASS Invalid: "switch (g) { case 1: a: default: }"
PASS Invalid: "function f() { switch (g) { case 1: a: default: } }"
PASS Invalid: "switch g { case 1: l() }"
PASS Invalid: "function f() { switch g { case 1: l() } }"
PASS Invalid: "switch (g) { case 1:"
PASS Invalid: "function f() { switch (g) { case 1: }"
PASS Valid: "switch (l) { case a = b ? c : d : }"
PASS Valid: "function f() { switch (l) { case a = b ? c : d : } }"
PASS Valid: "switch (sw) { case a ? b - 7[1] ? [c,,] : d = 6 : { } : }"
PASS Valid: "function f() { switch (sw) { case a ? b - 7[1] ? [c,,] : d = 6 : { } : } }"
PASS Invalid: "switch (l) { case b ? c : }"
PASS Invalid: "function f() { switch (l) { case b ? c : } }"
PASS Valid: "switch (l) { case 1: a: with(g) switch (g) { case 2: default: } default: }"
PASS Valid: "function f() { switch (l) { case 1: a: with(g) switch (g) { case 2: default: } default: } }"
PASS Invalid: "switch (4 - ) { }"
PASS Invalid: "function f() { switch (4 - ) { } }"
PASS Invalid: "switch (l) { default case: 5; }"
PASS Invalid: "function f() { switch (l) { default case: 5; } }"
PASS Invalid: "L: L: ;"
PASS Invalid: "function f() { L: L: ; }"
PASS Invalid: "L: L1: L: ;"
PASS Invalid: "function f() { L: L1: L: ; }"
PASS Invalid: "L: L1: L2: L3: L4: L: ;"
PASS Invalid: "function f() { L: L1: L2: L3: L4: L: ; }"
PASS Invalid: "for(var a,b 'this shouldn't be allowed' false ; ) ;"
PASS Invalid: "function f() { for(var a,b 'this shouldn't be allowed' false ; ) ; }"
PASS Invalid: "for(var a,b '"
PASS Invalid: "function f() { for(var a,b ' }"
PASS Valid: "function __proto__(){}"
PASS Valid: "function f() { function __proto__(){} }"
PASS Valid: "(function __proto__(){})"
PASS Valid: "function f() { (function __proto__(){}) }"
PASS Valid: "'use strict'; function __proto__(){}"
PASS Valid: "function f() { 'use strict'; function __proto__(){} }"
PASS Valid: "'use strict'; (function __proto__(){})"
PASS Valid: "function f() { 'use strict'; (function __proto__(){}) }"
PASS Valid: "if (0) $foo; "
PASS Valid: "function f() { if (0) $foo; }"
PASS Valid: "if (0) _foo; "
PASS Valid: "function f() { if (0) _foo; }"
PASS Valid: "if (0) foo$; "
PASS Valid: "function f() { if (0) foo$; }"
PASS Valid: "if (0) foo_; "
PASS Valid: "function f() { if (0) foo_; }"
PASS Valid: "if (0) obj.$foo; "
PASS Valid: "function f() { if (0) obj.$foo; }"
PASS Valid: "if (0) obj._foo; "
PASS Valid: "function f() { if (0) obj._foo; }"
PASS Valid: "if (0) obj.foo$; "
PASS Valid: "function f() { if (0) obj.foo$; }"
PASS Valid: "if (0) obj.foo_; "
PASS Valid: "function f() { if (0) obj.foo_; }"
PASS Valid: "if (0) obj.foo\u03bb; "
PASS Valid: "function f() { if (0) obj.foo\u03bb; }"
PASS Valid: "if (0) new a(b+c).d = 5"
PASS Valid: "function f() { if (0) new a(b+c).d = 5 }"
PASS Valid: "if (0) new a(b+c) = 5"
PASS Valid: "function f() { if (0) new a(b+c) = 5 }"
PASS Valid: "([1 || 1].a = 1)"
PASS Valid: "function f() { ([1 || 1].a = 1) }"
PASS Valid: "({a: 1 || 1}.a = 1)"
PASS Valid: "function f() { ({a: 1 || 1}.a = 1) }"
PASS Invalid: "var a.b = c"
PASS Invalid: "function f() { var a.b = c }"
PASS Invalid: "var a.b;"
PASS Invalid: "function f() { var a.b; }"
FAIL e.line should be 1 (of type number). Was undefined (of type undefined).
PASS foo is 'PASS'
PASS bar is 'PASS'
PASS successfullyParsed is true
TEST COMPLETE