v8/test/mjsunit/regress/regress-4693.js
littledan 11e8c03f94 Add UseCounters for some nonstandard JavaScript features
This patch adds a UseCounter for each of the following:
- Allowing duplicate sloppy-mode block-scoped function declarations
  in the exact same scope
- for-in loops with an initializer

The patch also refactors some of the declaration code to clean it up and
enable the first counter, and adds additional unit tests to nail down
the semantics of edge cases of sloppy-mode block-scoped function declarations.

BUG=v8:4693,chromium:579395
LOG=N
R=adamk

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

Cr-Commit-Position: refs/heads/master@{#33650}
2016-02-01 23:01:59 +00:00

81 lines
1.6 KiB
JavaScript

// Copyright 2016 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-function --nolegacy-const
// In sloppy mode we allow function redeclarations within blocks for webcompat.
(function() {
assertEquals(undefined, f); // Annex B
if (true) {
assertEquals(2, f());
function f() { return 1 }
assertEquals(2, f());
function f() { return 2 }
assertEquals(2, f());
}
assertEquals(2, f()); // Annex B
})();
// Should still fail in strict mode
assertThrows(`
(function() {
"use strict";
if (true) {
function f() { return 1 }
function f() { return 2 }
}
})();
`, SyntaxError);
// Conflicts between let and function still throw
assertThrows(`
(function() {
if (true) {
let f;
function f() { return 2 }
}
})();
`, SyntaxError);
assertThrows(`
(function() {
if (true) {
function f() { return 2 }
let f;
}
})();
`, SyntaxError);
// Conflicts between const and function still throw
assertThrows(`
(function() {
if (true) {
const f;
function f() { return 2 }
}
})();
`, SyntaxError);
assertThrows(`
(function() {
if (true) {
function f() { return 2 }
const f;
}
})();
`, SyntaxError);
// Annex B redefinition semantics still apply with more blocks
(function() {
assertEquals(undefined, f); // Annex B
if (true) {
assertEquals(undefined, f);
{ function f() { return 1 } }
assertEquals(1, f());
{ function f() { return 2 } }
assertEquals(2, f());
}
assertEquals(2, f()); // Annex B
})();