From dc374731d9232b21a037a2122608222b35603285 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Thu, 29 Sep 2016 15:09:52 -0700 Subject: [PATCH 1/2] Adding test for #10073 --- tests/baselines/reference/selfReference.errors.txt | 8 ++++++++ tests/baselines/reference/selfReference.js | 6 ++++++ tests/cases/compiler/selfReference.ts | 3 +++ 3 files changed, 17 insertions(+) create mode 100644 tests/baselines/reference/selfReference.errors.txt create mode 100644 tests/baselines/reference/selfReference.js create mode 100644 tests/cases/compiler/selfReference.ts diff --git a/tests/baselines/reference/selfReference.errors.txt b/tests/baselines/reference/selfReference.errors.txt new file mode 100644 index 00000000000..acb7b6685af --- /dev/null +++ b/tests/baselines/reference/selfReference.errors.txt @@ -0,0 +1,8 @@ +tests/cases/compiler/selfReference.ts(2,12): error TS7024: Function implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions. + + +==== tests/cases/compiler/selfReference.ts (1 errors) ==== + declare function asFunction(value: T): () => T; + asFunction(() => { return 1; }); + ~~~~~~~~~~~~~~~~~~~ +!!! error TS7024: Function implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions. \ No newline at end of file diff --git a/tests/baselines/reference/selfReference.js b/tests/baselines/reference/selfReference.js new file mode 100644 index 00000000000..2bb8ce9d9d0 --- /dev/null +++ b/tests/baselines/reference/selfReference.js @@ -0,0 +1,6 @@ +//// [selfReference.ts] +declare function asFunction(value: T): () => T; +asFunction(() => { return 1; }); + +//// [selfReference.js] +asFunction(function () { return 1; }); diff --git a/tests/cases/compiler/selfReference.ts b/tests/cases/compiler/selfReference.ts new file mode 100644 index 00000000000..708acc42e02 --- /dev/null +++ b/tests/cases/compiler/selfReference.ts @@ -0,0 +1,3 @@ +// @noImplicitAny: true +declare function asFunction(value: T): () => T; +asFunction(() => { return 1; }); \ No newline at end of file From 5d9d842a1814d8b9ba5b4a0fcbab4935d0514216 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Tue, 4 Oct 2016 12:02:25 -0700 Subject: [PATCH 2/2] Do not get return type from contextual signature if we are already in process of getting return type of it Fixes #10073 --- src/compiler/checker.ts | 5 ++++- tests/baselines/reference/selfReference.errors.txt | 8 -------- tests/baselines/reference/selfReference.symbols | 11 +++++++++++ tests/baselines/reference/selfReference.types | 14 ++++++++++++++ 4 files changed, 29 insertions(+), 9 deletions(-) delete mode 100644 tests/baselines/reference/selfReference.errors.txt create mode 100644 tests/baselines/reference/selfReference.symbols create mode 100644 tests/baselines/reference/selfReference.types diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ef428f26de9..8fef558968e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -12771,7 +12771,10 @@ namespace ts { if (!contextualSignature) { reportErrorsFromWidening(func, type); } - if (isUnitType(type) && !(contextualSignature && isLiteralContextualType(getReturnTypeOfSignature(contextualSignature)))) { + if (isUnitType(type) && + !(contextualSignature && + isLiteralContextualType( + contextualSignature === getSignatureFromDeclaration(func) ? type : getReturnTypeOfSignature(contextualSignature)))) { type = getWidenedLiteralType(type); } diff --git a/tests/baselines/reference/selfReference.errors.txt b/tests/baselines/reference/selfReference.errors.txt deleted file mode 100644 index acb7b6685af..00000000000 --- a/tests/baselines/reference/selfReference.errors.txt +++ /dev/null @@ -1,8 +0,0 @@ -tests/cases/compiler/selfReference.ts(2,12): error TS7024: Function implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions. - - -==== tests/cases/compiler/selfReference.ts (1 errors) ==== - declare function asFunction(value: T): () => T; - asFunction(() => { return 1; }); - ~~~~~~~~~~~~~~~~~~~ -!!! error TS7024: Function implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions. \ No newline at end of file diff --git a/tests/baselines/reference/selfReference.symbols b/tests/baselines/reference/selfReference.symbols new file mode 100644 index 00000000000..dc618eaae17 --- /dev/null +++ b/tests/baselines/reference/selfReference.symbols @@ -0,0 +1,11 @@ +=== tests/cases/compiler/selfReference.ts === +declare function asFunction(value: T): () => T; +>asFunction : Symbol(asFunction, Decl(selfReference.ts, 0, 0)) +>T : Symbol(T, Decl(selfReference.ts, 0, 28)) +>value : Symbol(value, Decl(selfReference.ts, 0, 31)) +>T : Symbol(T, Decl(selfReference.ts, 0, 28)) +>T : Symbol(T, Decl(selfReference.ts, 0, 28)) + +asFunction(() => { return 1; }); +>asFunction : Symbol(asFunction, Decl(selfReference.ts, 0, 0)) + diff --git a/tests/baselines/reference/selfReference.types b/tests/baselines/reference/selfReference.types new file mode 100644 index 00000000000..eed1da72387 --- /dev/null +++ b/tests/baselines/reference/selfReference.types @@ -0,0 +1,14 @@ +=== tests/cases/compiler/selfReference.ts === +declare function asFunction(value: T): () => T; +>asFunction : (value: T) => () => T +>T : T +>value : T +>T : T +>T : T + +asFunction(() => { return 1; }); +>asFunction(() => { return 1; }) : () => () => 1 +>asFunction : (value: T) => () => T +>() => { return 1; } : () => 1 +>1 : 1 +