diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e59641bed412e..54d6daca678a3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -28342,6 +28342,9 @@ namespace ts { if (flags & ModifierFlags.Private) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "private", "abstract"); } + if (flags & ModifierFlags.Async) { + return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "async", "abstract"); + } } flags |= ModifierFlags.Abstract; diff --git a/tests/baselines/reference/abstractAsync.errors.txt b/tests/baselines/reference/abstractAsync.errors.txt new file mode 100644 index 0000000000000..d0f741468b28b --- /dev/null +++ b/tests/baselines/reference/abstractAsync.errors.txt @@ -0,0 +1,9 @@ +tests/cases/compiler/abstractAsync.ts(2,9): error TS1243: 'async' modifier cannot be used with 'abstract' modifier. + + +==== tests/cases/compiler/abstractAsync.ts (1 errors) ==== + abstract class ShouldFailClass { + async abstract badMethod(): Promise; + ~~~~~~~~ +!!! error TS1243: 'async' modifier cannot be used with 'abstract' modifier. + } \ No newline at end of file diff --git a/tests/baselines/reference/abstractAsync.js b/tests/baselines/reference/abstractAsync.js new file mode 100644 index 0000000000000..96665a0ada194 --- /dev/null +++ b/tests/baselines/reference/abstractAsync.js @@ -0,0 +1,11 @@ +//// [abstractAsync.ts] +abstract class ShouldFailClass { + async abstract badMethod(): Promise; +} + +//// [abstractAsync.js] +var ShouldFailClass = /** @class */ (function () { + function ShouldFailClass() { + } + return ShouldFailClass; +}()); diff --git a/tests/baselines/reference/abstractAsync.symbols b/tests/baselines/reference/abstractAsync.symbols new file mode 100644 index 0000000000000..e0cf473f8b8b5 --- /dev/null +++ b/tests/baselines/reference/abstractAsync.symbols @@ -0,0 +1,8 @@ +=== tests/cases/compiler/abstractAsync.ts === +abstract class ShouldFailClass { +>ShouldFailClass : Symbol(ShouldFailClass, Decl(abstractAsync.ts, 0, 0)) + + async abstract badMethod(): Promise; +>badMethod : Symbol(ShouldFailClass.badMethod, Decl(abstractAsync.ts, 0, 32)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) +} diff --git a/tests/baselines/reference/abstractAsync.types b/tests/baselines/reference/abstractAsync.types new file mode 100644 index 0000000000000..1b1771c2ca753 --- /dev/null +++ b/tests/baselines/reference/abstractAsync.types @@ -0,0 +1,8 @@ +=== tests/cases/compiler/abstractAsync.ts === +abstract class ShouldFailClass { +>ShouldFailClass : ShouldFailClass + + async abstract badMethod(): Promise; +>badMethod : () => Promise +>Promise : Promise +} diff --git a/tests/cases/compiler/abstractAsync.ts b/tests/cases/compiler/abstractAsync.ts new file mode 100644 index 0000000000000..efd6d979ed16c --- /dev/null +++ b/tests/cases/compiler/abstractAsync.ts @@ -0,0 +1,4 @@ +// @lib: es2015 +abstract class ShouldFailClass { + async abstract badMethod(): Promise; +} \ No newline at end of file