catch-parameter-redeclaration.js 2.11 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
// 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}})();
}
`);
}