diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt index 8e69915f77f..5a8400f6cc9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/TypeResolver.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.psi.debugText.getDebugText import org.jetbrains.kotlin.resolve.PossiblyBareType.bare import org.jetbrains.kotlin.resolve.PossiblyBareType.type import org.jetbrains.kotlin.resolve.bindingContextUtil.recordScope +import org.jetbrains.kotlin.resolve.calls.checkers.checkCoroutinesFeature import org.jetbrains.kotlin.resolve.calls.tasks.DynamicCallableDescriptors import org.jetbrains.kotlin.resolve.descriptorUtil.findImplicitOuterClassArguments import org.jetbrains.kotlin.resolve.scopes.LazyScopeAdapter @@ -179,8 +180,12 @@ class TypeResolver( var result: PossiblyBareType? = null val hasSuspendModifier = modifiers?.hasModifier(KtTokens.SUSPEND_KEYWORD) ?: false + val suspendModifier = modifiers?.getModifier(KtTokens.SUSPEND_KEYWORD) if (hasSuspendModifier && typeElement !is KtFunctionType) { - c.trace.report(Errors.WRONG_MODIFIER_TARGET.on(modifiers!!.getModifier(KtTokens.SUSPEND_KEYWORD)!!, KtTokens.SUSPEND_KEYWORD, "non-functional type")) + c.trace.report(Errors.WRONG_MODIFIER_TARGET.on(suspendModifier!!, KtTokens.SUSPEND_KEYWORD, "non-functional type")) + } + else if (hasSuspendModifier) { + checkCoroutinesFeature(languageVersionSettings, c.trace, suspendModifier!!) } typeElement?.accept(object : KtVisitorVoid() { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/coroutineCallChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/coroutineCallChecker.kt index 1fd99f8ce7f..e1d0fdb4610 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/coroutineCallChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/coroutineCallChecker.kt @@ -96,7 +96,7 @@ object BuilderFunctionsCallChecker : CallChecker { } } -private fun checkCoroutinesFeature(languageVersionSettings: LanguageVersionSettings, diagnosticHolder: DiagnosticSink, reportOn: PsiElement) { +fun checkCoroutinesFeature(languageVersionSettings: LanguageVersionSettings, diagnosticHolder: DiagnosticSink, reportOn: PsiElement) { if (!languageVersionSettings.supportsFeature(LanguageFeature.Coroutines)) { diagnosticHolder.report(Errors.UNSUPPORTED_FEATURE.on(reportOn, LanguageFeature.Coroutines)) } diff --git a/compiler/testData/diagnostics/tests/coroutines/coroutinesDisabled.kt b/compiler/testData/diagnostics/tests/coroutines/coroutinesDisabled.kt index cb8f3fa28e2..d240e14f2c9 100644 --- a/compiler/testData/diagnostics/tests/coroutines/coroutinesDisabled.kt +++ b/compiler/testData/diagnostics/tests/coroutines/coroutinesDisabled.kt @@ -3,7 +3,7 @@ suspend fun suspendHere(): String = "OK" -fun builder(c: suspend () -> Unit) { +fun builder(c: suspend () -> Unit) { } diff --git a/compiler/testData/diagnostics/tests/coroutines/coroutinesEnabledWithWarning.kt b/compiler/testData/diagnostics/tests/coroutines/coroutinesEnabledWithWarning.kt index 39131dbdc09..e940bbc76d1 100644 --- a/compiler/testData/diagnostics/tests/coroutines/coroutinesEnabledWithWarning.kt +++ b/compiler/testData/diagnostics/tests/coroutines/coroutinesEnabledWithWarning.kt @@ -3,7 +3,7 @@ suspend fun suspendHere(): String = "OK" -fun builder(c: suspend () -> Unit) { +fun builder(c: suspend () -> Unit) { } diff --git a/compiler/testData/diagnostics/tests/coroutines/unsupported.kt b/compiler/testData/diagnostics/tests/coroutines/unsupported.kt index d1a55519576..3c307aecace 100644 --- a/compiler/testData/diagnostics/tests/coroutines/unsupported.kt +++ b/compiler/testData/diagnostics/tests/coroutines/unsupported.kt @@ -3,7 +3,7 @@ suspend fun suspendHere(): String = "OK" -fun builder(c: suspend () -> Unit) { +fun builder(c: suspend () -> Unit) { }