Redeclaration of var over let/const/class should be a syntax error.
[WebKit-https.git] / JSTests / stress / for-in-invalidate-context-weird-assignments.js
1 function assert(b) {
2     if (!b)
3         throw new Error("Bad");
4 }
5
6 function test(f) {
7     noInline(f);
8     for (let i = 0; i < 1000; ++i)
9         f();
10 }
11
12 function shouldThrowSyntaxError(script) {
13     let error;
14     try {
15         eval(script);
16     } catch (e) {
17         error = e;
18     }
19
20     if (!(error instanceof SyntaxError))
21         throw new Error('Expected SyntaxError!');
22 }
23
24 test(function() {
25     let o = {xx: 0};
26     for (let i in o) {
27         for (i in [0, 1, 2]) { }
28         assert(typeof i === "string");
29         assert(o[i] === undefined);
30     }
31 });
32
33 test(function() {
34     let o = {xx: 0};
35     for (let i in o) {
36         for ({i} of [{i: 0}]) { }
37         assert(typeof i === "number");
38         assert(o[i] === undefined);
39     }
40 });
41
42 test(function() {
43     let o = {xx: 0};
44     for (let i in o) {
45         ;({i} = {i: 0});
46         assert(typeof i === "number");
47         assert(o[i] === undefined);
48     }
49 });
50
51 test(function() {
52     let o = {xx: 0};
53     for (let i in o) {
54         ;([i] = [0]);
55         assert(typeof i === "number");
56         assert(o[i] === undefined);
57     }
58 });
59
60 test(function() {
61     let o = {xx: 0};
62     for (let i in o) {
63         ;({...i} = {a:20, b:30});
64         assert(typeof i === "object");
65         assert(o[i] === undefined);
66     }
67 });
68
69 test(function() {
70     let o = {xx: 0};
71     for (let i in o) {
72         eval("i = 0;");
73         assert(typeof i === "number");
74         assert(o[i] === undefined);
75     }
76 });
77
78 shouldThrowSyntaxError(
79     `function f() {
80         let o = {xx: 0};
81         for (let i in o) {
82             for (var i of [0]) { }
83         }
84     }`
85 );
86
87 shouldThrowSyntaxError(
88     `function f() {
89         let o = {xx: 0};
90         for (let i in o) {
91             var i = 0;
92         }
93     }`
94 );