v8/test/mjsunit/regress/regress-2506.js
dslomov 6ac4de87a8 harmony-scoping: make assignment to 'const' a late error.
Per TC39 Nov 2014 decision.

This patch also changes behavior for "legacy const": assignments to sloppy const in strict mode is now also a type error. This fixes v8:2243 and also brings us in compliance with other engines re assignment to function names (see updated webkit test), but might have bigger implications.
That change can easily be reverted by changing Variable::IsSignallingAssignmentToConst.

BUG=v8:3713,v8:2243
LOG=N

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

Cr-Commit-Position: refs/heads/master@{#25516}
2014-11-26 11:21:23 +00:00

79 lines
1.2 KiB
JavaScript

// Copyright 2014 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-scoping
'use strict';
// Top-level code
let s = 0;
let f = [undefined, undefined, undefined]
for (const x of [1,2,3]) {
s += x;
f[x-1] = function() { return x; }
}
assertEquals(6, s);
assertEquals(1, f[0]());
assertEquals(2, f[1]());
assertEquals(3, f[2]());
let x = 1;
s = 0;
for (const x of [x, x+1, x+2]) {
s += x;
}
assertEquals(6, s);
s = 0;
var q = 1;
for (const q of [q, q+1, q+2]) {
s += q;
}
assertEquals(6, s);
let z = 1;
s = 0;
for (const x = 1; z < 2; z++) {
s += x + z;
}
assertEquals(2, s);
s = "";
for (const x in [1,2,3]) {
s += x;
}
assertEquals("012", s);
assertThrows("'use strict'; for (const x in [1,2,3]) { x++ }", TypeError);
// Function scope
(function() {
let s = 0;
for (const x of [1,2,3]) {
s += x;
}
assertEquals(6, s);
let x = 1;
s = 0;
for (const x of [x, x+1, x+2]) {
s += x;
}
assertEquals(6, s);
s = 0;
var q = 1;
for (const q of [q, q+1, q+2]) {
s += q;
}
assertEquals(6, s);
s = "";
for (const x in [1,2,3]) {
s += x;
}
assertEquals("012", s);
}());