From d4418d5686de513a2ac1a5e9d6c4bdd6b1dbc6b4 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 29 Sep 2016 15:55:28 +0300 Subject: [PATCH] Prohibit not-Unit suspend functions #KT-13560 Fixed --- .../org/jetbrains/kotlin/resolve/SuspendModifierChecker.kt | 4 ++++ .../diagnostics/tests/coroutines/suspendApplicability.kt | 3 +++ .../diagnostics/tests/coroutines/suspendApplicability.txt | 2 ++ idea/testData/checker/infos/suspendApplicability.kt | 2 ++ 4 files changed, 11 insertions(+) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/SuspendModifierChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/SuspendModifierChecker.kt index 1dd7bc6e243..0b0bf8819c8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/SuspendModifierChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/SuspendModifierChecker.kt @@ -80,6 +80,10 @@ object SuspendModifierChecker : SimpleDeclarationChecker { if (continuationParameterType?.arguments?.firstOrNull()?.isStarProjection == true) { report("Continuation<*> is prohibited as a last parameter of suspend function") } + + if (functionDescriptor.returnType?.isUnit() != true) { + report("return type of suspension function must be a kotlin.Unit, but ${functionDescriptor.returnType} was found") + } } } diff --git a/compiler/testData/diagnostics/tests/coroutines/suspendApplicability.kt b/compiler/testData/diagnostics/tests/coroutines/suspendApplicability.kt index 45d81fb151b..0861e54a892 100644 --- a/compiler/testData/diagnostics/tests/coroutines/suspendApplicability.kt +++ b/compiler/testData/diagnostics/tests/coroutines/suspendApplicability.kt @@ -38,4 +38,7 @@ class Controller { suspend fun String.memberExtension(x: Continuation) { } + + suspend fun returnsUnit(x: Continuation) = Unit + suspend fun returnsNotUnit(x: Continuation) = 1 } diff --git a/compiler/testData/diagnostics/tests/coroutines/suspendApplicability.txt b/compiler/testData/diagnostics/tests/coroutines/suspendApplicability.txt index 69b97159f46..f50c3555f93 100644 --- a/compiler/testData/diagnostics/tests/coroutines/suspendApplicability.txt +++ b/compiler/testData/diagnostics/tests/coroutines/suspendApplicability.txt @@ -10,6 +10,8 @@ public suspend fun kotlin.String.wrongExtension(/*0*/ x: kotlin.coroutines.Conti public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public final inline suspend fun inlineFun(/*0*/ x: kotlin.coroutines.Continuation): kotlin.Unit public final suspend fun noParams(): kotlin.Unit + public final suspend fun returnsNotUnit(/*0*/ x: kotlin.coroutines.Continuation): kotlin.Int + public final suspend fun returnsUnit(/*0*/ x: kotlin.coroutines.Continuation): kotlin.Unit public final suspend fun starProjection(/*0*/ x: kotlin.coroutines.Continuation<*>): kotlin.Unit public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public final suspend fun valid(/*0*/ x: kotlin.coroutines.Continuation): kotlin.Unit diff --git a/idea/testData/checker/infos/suspendApplicability.kt b/idea/testData/checker/infos/suspendApplicability.kt index 232fae1fe61..987145420cf 100644 --- a/idea/testData/checker/infos/suspendApplicability.kt +++ b/idea/testData/checker/infos/suspendApplicability.kt @@ -38,4 +38,6 @@ class Controller { suspend fun String.memberExtension(x: Continuation) { } + + suspend fun returnsNotUnit(x: Continuation) = 1 }