function testSyntax(script) { try { eval(script); } catch (error) { if (error instanceof SyntaxError) throw new Error("Bad error: " + String(error)); } } function testSyntaxError(script, message) { var error = null; try { eval(script); } catch (e) { error = e; } if (!error) throw new Error("Expected syntax error not thrown"); if (String(error) !== message) throw new Error("Bad error: " + String(error)); } testSyntaxError(` (function () { try { } catch ([a, a]) { } }) `, `SyntaxError: Unexpected identifier 'a'. Cannot declare a lexical variable twice: 'a'.`); testSyntaxError(` (function () { try { } catch ({ a, b:a }) { } }) `, `SyntaxError: Unexpected identifier 'a'. Cannot declare a lexical variable twice: 'a'.`); testSyntax(` (function () { try { } catch (let) { } }) `, ``); testSyntax(` (function () { try { } catch ([let]) { } }) `, ``); testSyntaxError(` (function () { 'use strict'; try { } catch (let) { } }) `, `SyntaxError: Cannot use 'let' as a catch parameter name in strict mode.`); testSyntaxError(` (function () { 'use strict'; try { } catch ([let]) { } }) `, `SyntaxError: Cannot use 'let' as a catch parameter name in strict mode.`); testSyntax(` (function () { try { } catch (yield) { } }) `); testSyntax(` (function () { try { } catch ([yield]) { } }) `); testSyntaxError(` (function () { 'use strict'; try { } catch (yield) { } }) `, `SyntaxError: Cannot use 'yield' as a catch parameter name in strict mode.`); testSyntaxError(` (function () { 'use strict'; try { } catch ([yield]) { } }) `, `SyntaxError: Cannot use 'yield' as a catch parameter name in strict mode.`); testSyntaxError(` (function () { try { } catch (yield = 20) { } }) `, `SyntaxError: Unexpected token '='. Expected ')' to end a 'catch' target.`); testSyntax(` (function () { try { } catch ([...yield]) { } }) `); testSyntax(` (function () { try { } catch ([yield = 30]) { } }) `); testSyntax(` (function () { try { } catch ({ yield = 30 }) { } }) `); testSyntaxError(` (function () { try { } catch (...Hello) { } }) `, `SyntaxError: Unexpected token '...'. Expected a parameter pattern or a ')' in parameter list.`); testSyntaxError(` (function *() { try { } catch (yield) { } }) `, `SyntaxError: Cannot use 'yield' as a catch parameter name in a generator function.`); testSyntax(` (function *() { try { } catch ({ value = yield 42 }) { } }) `); testSyntax(` (function *() { try { } catch ({ value = yield }) { } }) `);