[JSC] AI should not propagate AbstractValue relying on constant folding phase
[WebKit-https.git] / JSTests / stress / for-in-of-const.js
1 // Check that const variables can't be assigned to from for-in/for-of.
2 // https://bugs.webkit.org/show_bug.cgi?id=156673
3
4 expect_nothrow = function(why, f) {
5     f();
6 }
7
8 expect_throw = function(why, f) {
9     threw = false;
10     try {
11         f();
12     } catch (e) {
13     if (e.toString() != "TypeError: Attempted to assign to readonly property.")
14         throw Error("expected a TypeError, got " + e.toString());
15         threw = true;
16     }
17     if (!threw)
18         throw Error("expected to throw");
19 }
20
21 // for-in
22
23 expect_nothrow("regular for-in",              function() { for (x in [1,2,3]) x; });
24 expect_nothrow("var for-in",                  function() { for (var x in [1,2,3]) x; });
25 expect_nothrow("let for-in",                  function() { for (let x in [1,2,3]) x; });
26 expect_nothrow("for-in with const variable",  function() { for (const x in [1,2,3]) x; });
27 expect_nothrow("for-in which never iterates", function() { const x = 20; for (x in []) x; });
28
29 expect_throw("for-in on const from func's scope", function() { const x = 20; for (x in [1,2,3]) x; });
30 expect_throw("same, with intervening capture",    function() { const x = 20; capture = function() { x; }; for (x in [1,2,3]) x; });
31 expect_throw("same, iterating in capture",        function() { const x = 20; capture = function() { for (x in [1,2,3]) x; }; capture(); });
32
33 // for-of
34
35 expect_nothrow("regular for-of",              function() { for (x of [1,2,3]) x; });
36 expect_nothrow("var for-of",                  function() { for (var x of [1,2,3]) x; });
37 expect_nothrow("let for-of",                  function() { for (let x of [1,2,3]) x; });
38 expect_nothrow("for-of with const variable",  function() { for (const x of [1,2,3]) x; });
39 expect_nothrow("for-of which never iterates", function() { const x = 20; for (x of []) x; });
40
41 expect_throw("for-of on const from func's scope", function() { const x = 20; for (x of [1,2,3]) x; });
42 expect_throw("same, with intervening capture",    function() { const x = 20; capture = function() { x; }; for (x of [1,2,3]) x; });
43 expect_throw("same, iterating in capture",        function() { const x = 20; capture = function() { for (x of [1,2,3]) x; }; capture(); });
44
45 expect_throw("bad destructuring",          function() { let arr = [{x:20}]; const x = 50; for ({x} of arr) x; });
46 expect_nothrow("good destructuring",       function() { let arr = [{x:20}]; const x = 50; for ({x : foo} of arr) x; });
47 expect_nothrow("const good destructuring", function() { let arr = [{x:20}]; const x = 50; for (const {x} of arr) x; });
48 expect_nothrow("let good destructuring",   function() { let arr = [{x:20}]; const x = 50; for (let {x} of arr) x; });
49 // Note: `var {x}` would shadow `const x` and therefore fail.