| Index: test/mjsunit/es6/catch-parameter-redeclaration.js
|
| diff --git a/test/mjsunit/es6/catch-parameter-redeclaration.js b/test/mjsunit/es6/catch-parameter-redeclaration.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0d6ce061f8c526538eda91e3f24a3f81fd301ad4
|
| --- /dev/null
|
| +++ b/test/mjsunit/es6/catch-parameter-redeclaration.js
|
| @@ -0,0 +1,104 @@
|
| +// 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 {e} = 0',
|
| + 'let [e] = 0',
|
| + 'let {f:e} = 0',
|
| + 'let [[[], e]] = 0',
|
| + 'const 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 {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}})();
|
| +}
|
| +`);
|
| +}
|
|
|