v8/test/mjsunit/harmony/block-let-contextual-sloppy.js
littledan 7e113c47b7 Prohibit let in lexical bindings
This patch prohibits lexical bindings from being called 'let', even in
sloppy mode, following the ES2015 specification. The change affects
multiple cases of lexical bindings, including simple let/const declarations
and both kinds of for loops. var and legacy const bindings still permit
the name to be let, including in destructuring cases. Tests are added to
verify, though some cases are commented out since they led to (pre-existing)
crashes.

BUG=v8:4403
R=adamk
LOG=Y

Review URL: https://codereview.chromium.org/1371263003

Cr-Commit-Position: refs/heads/master@{#31115}
2015-10-05 20:29:22 +00:00

67 lines
1.5 KiB
JavaScript

// 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-destructuring
// let is usable as a variable with var or legacy const, not let or ES6 const
(function (){
assertEquals(undefined, let);
var let;
let = 5;
assertEquals(5, let);
(function() { var let = 1; assertEquals(1, let); })();
assertEquals(5, let);
})();
assertThrows(function() { return let; }, ReferenceError);
(function() {
var let, sum = 0;
for (let in [1, 2, 3, 4]) sum += Number(let);
assertEquals(6, sum);
(function() { for (var let of [4, 5]) sum += let; })();
assertEquals(15, sum);
(function() { for (var let in [6]) sum += Number([6][let]); })();
assertEquals(21, sum);
for (let = 7; let < 8; let++) sum += let;
assertEquals(28, sum);
assertEquals(8, let);
(function() { for (var let = 8; let < 9; let++) sum += let; })();
assertEquals(36, sum);
assertEquals(8, let);
})();
assertThrows(function() { return let; }, ReferenceError);
(function () {
let obj = {};
var {let} = {let() { return obj; }};
let().x = 1;
assertEquals(1, obj.x);
})();
(function () {
let obj = {};
const [let] = [function() { return obj; }];
let().x = 1;
assertEquals(1, obj.x);
})();
(function() {
function let() {
return 1;
}
assertEquals(1, let());
})()
assertThrows('for (let of []) {}', SyntaxError);