| Index: test/mjsunit/harmony/block-eval-var-over-legacy-const.js
|
| diff --git a/test/mjsunit/harmony/block-eval-var-over-legacy-const.js b/test/mjsunit/harmony/block-eval-var-over-legacy-const.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fc4d22fead4027f5e15390c24c01d314d54bec6e
|
| --- /dev/null
|
| +++ b/test/mjsunit/harmony/block-eval-var-over-legacy-const.js
|
| @@ -0,0 +1,84 @@
|
| +// 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);
|
|
|