function shouldBeSyntaxError(s) { let isSyntaxError = false; try { eval(s); } catch(e) { if (e instanceof SyntaxError) isSyntaxError = true; } if (!isSyntaxError) throw new Error("expected a syntax error"); } noInline(shouldBeSyntaxError); function shouldNotBeSyntaxError(s) { let isSyntaxError = false; try { eval(s); } catch(e) { if (e instanceof SyntaxError) isSyntaxError = true; } if (isSyntaxError) throw new Error("did not expect a syntax error"); } function truth() { return true; } noInline(truth); shouldBeSyntaxError("class A { }; class A { };"); shouldBeSyntaxError("function foo() { class A { }; class A { }; }"); shouldBeSyntaxError("function foo() { if (truth()) { class A { }; class A { }; } }"); shouldBeSyntaxError("switch(10) { case 10: class A { }; break; case 20: class A { } }"); shouldBeSyntaxError("if (truth()) class A { }"); shouldNotBeSyntaxError("switch(10) { case 10: { class A { }; break; } case 20: class A { } }"); shouldNotBeSyntaxError("class A { } if (truth()) { class A { } }");