1 // Copyright 2015 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Flags: --harmony-sloppy --harmony-sloppy-let --harmony-sloppy-function 6 // Flags: --legacy-const 7 8 // Legacy-const-let conflict in a function throws, even if the legacy const 9 // is in an eval 10 11 // Throws at the top level of a function 12 assertThrows(function() { 13 let x = 1; 14 eval('const x = 2'); 15 }, TypeError); 16 17 // If the eval is in its own block scope, throws 18 assertThrows(function() { 19 let y = 1; 20 { eval('const y = 2'); } 21 }, TypeError); 22 23 // If the let is in its own block scope, with the eval, throws 24 assertThrows(function() { 25 { 26 let x = 1; 27 eval('const x = 2'); 28 } 29 }, TypeError); 30 31 // Legal if the let is no longer visible 32 assertDoesNotThrow(function() { 33 { 34 let x = 1; 35 } 36 eval('const x = 2'); 37 }); 38 39 // In global scope 40 let caught = false; 41 try { 42 let z = 1; 43 eval('const z = 2'); 44 } catch (e) { 45 caught = true; 46 } 47 assertTrue(caught); 48 49 // Let declarations beyond a function boundary don't conflict 50 caught = false; 51 try { 52 let a = 1; 53 (function() { 54 eval('const a'); 55 })(); 56 } catch (e) { 57 caught = true; 58 } 59 assertFalse(caught); 60 61 // legacy const across with doesn't conflict 62 caught = false; 63 try { 64 (function() { 65 with ({x: 1}) { 66 eval("const x = 2;"); 67 } 68 })(); 69 } catch (e) { 70 caught = true; 71 } 72 assertFalse(caught); 73 74 // legacy const can still conflict with let across a with 75 caught = false; 76 try { 77 (function() { 78 let x; 79 with ({x: 1}) { 80 eval("const x = 2;"); 81 } 82 })(); 83 } catch (e) { 84 caught = true; 85 } 86 assertTrue(caught); 87