v8/test/mjsunit/es6/catch-parameter-redeclaration.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

113 lines
2.1 KiB
JavaScript
Raw Normal View History

Reland of Add errors for declarations which conflict with catch parameters. (patchset #1 id:1 of https://codereview.chromium.org/2112223002/ ) Reason for revert: Correcting issue. Original issue's description: > Revert of Add errors for declarations which conflict with catch parameters. (patchset #6 id:100001 of https://codereview.chromium.org/2109733003/ ) > > Reason for revert: > Fuzzer claims `try { \"\" ; } catch(x) { let x1 = [1,,], x = x; }` causes a crash. > > Original issue's description: > > Add errors for declarations which conflict with catch parameters. > > > > Catch parameters are largely treated as lexical declarations in the > > block which contains their body for the purposes of early syntax errors, > > with some exceptions outlined in B.3.5. This patch introduces most of > > those errors, except those from `eval('for (var e of ...);')` inside of > > a catch with a simple parameter named 'e'. > > > > Note that annex B.3.5 allows var declarations to conflict with simple > > catch parameters, except when the variable declaration is the init of a > > for-of statement. > > > > BUG=v8:5112,v8:4231 > > > > Committed: https://crrev.com/2907c726b2bb5cf20b2bec639ca9e6a521585406 > > Cr-Commit-Position: refs/heads/master@{#37462} > > TBR=littledan@chromium.org > # Skipping CQ checks because original CL landed less than 1 days ago. > NOPRESUBMIT=true > NOTREECHECKS=true > NOTRY=true > BUG=v8:5112,v8:4231 > > Committed: https://crrev.com/8834d5ecb559001c87c42322969471da60574a8c > Cr-Commit-Position: refs/heads/master@{#37464} R=littledan@chromium.org BUG=v8:5112,v8:4231 Review-Url: https://codereview.chromium.org/2119933002 Cr-Commit-Position: refs/heads/master@{#37728}
2016-07-13 19:28:56 +00:00
// 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.
function checkIsRedeclarationError(code) {
try {
eval(`
checkIsRedeclarationError : {
break checkIsRedeclarationError;
${code}
}
`);
assertUnreachable();
} catch(e) {
assertInstanceof(e, SyntaxError );
assertTrue( e.toString().indexOf("has already been declared") >= 0 );
}
}
function checkIsNotRedeclarationError(code) {
assertDoesNotThrow(()=>eval(`
checkIsNotRedeclarationError_label : {
break checkIsNotRedeclarationError_label;
${code}
}
`));
}
let lexical_e = [
'let e',
'let f, g, e',
'let [f] = [], [] = [], e = e, h',
'let {e} = 0',
'let {f, e} = 0',
'let {f, g} = 0, {e} = 0',
'let {f = 0, e = 1} = 0',
'let [e] = 0',
'let [f, e] = 0',
'let {f:e} = 0',
'let [[[], e]] = 0',
'const e = 0',
'const f = 0, g = 0, e = 0',
'const {e} = 0',
'const [e] = 0',
'const {f:e} = 0',
'const [[[], e]] = 0',
'function e(){}',
'function* e(){}',
];
let not_lexical_e = [
'var e',
'var f, e',
'var {e} = 0',
'let {} = 0',
'let {e:f} = 0',
'{ function e(){} }'
];
// Check that lexical declarations cannot override a simple catch parameter
for (let declaration of lexical_e) {
checkIsRedeclarationError(`
try {
throw 0;
} catch(e) {
${declaration}
}
`);
}
// Check that lexical declarations cannot override a complex catch parameter
for (let declaration of lexical_e) {
checkIsRedeclarationError(`
try {
throw 0;
} catch({e}) {
${declaration}
}
`);
}
// Check that non-lexical declarations can override a simple catch parameter
for (let declaration of not_lexical_e) {
checkIsNotRedeclarationError(`
try {
throw 0;
} catch(e) {
${declaration}
}
`);
}
// Check that the above error does not occur if a declaration scope is between
// the catch and the loop.
for (let declaration of lexical_e) {
checkIsNotRedeclarationError(`
try {
throw 0;
} catch(e) {
(()=>{${declaration}})();
}
`);
checkIsNotRedeclarationError(`
try {
throw 0;
} catch(e) {
(function(){${declaration}})();
}
`);
}