// Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --harmony-sloppy --harmony-sloppy-let --harmony-sloppy-function // Var-let conflict in a function throws, even if the var is in an eval // Throws at the top level of a function assertThrows(function() { let x = 1; eval('const x = 2'); }, TypeError); // If the eval is in its own block scope, throws assertThrows(function() { let y = 1; { eval('const y = 2'); } }, TypeError); // If the let is in its own block scope, with the eval, throws assertThrows(function() { { let x = 1; eval('const x = 2'); } }, TypeError); // Legal if the let is no longer visible assertDoesNotThrow(function() { { let x = 1; } eval('const x = 2'); }); // In global scope let caught = false; try { let z = 1; eval('const z = 2'); } catch (e) { caught = true; } assertTrue(caught); // Let declarations beyond a function boundary don't conflict caught = false; try { let a = 1; (function() { eval('const a'); })(); } catch (e) { caught = true; } assertFalse(caught); // var across with doesn't conflict caught = false; try { (function() { with ({x: 1}) { eval("const x = 2;"); } })(); } catch (e) { caught = true; } assertFalse(caught); // var can still conflict with let across a with caught = false; try { (function() { let x; with ({x: 1}) { eval("const x = 2;"); } })(); } catch (e) { caught = true; } assertTrue(caught);