From 33ff1e1e2981ea8c22ac61265659cab36f1a25c1 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 14 Mar 2016 15:17:45 +0300 Subject: [PATCH] Use correct function to check for function type in InlineParameterChecker There's no use of noinline/crossinline modifiers on parameters of _subtypes_ of function types #KT-11411 Fixed --- .../jetbrains/kotlin/resolve/InlineParameterChecker.kt | 4 ++-- .../diagnostics/tests/modifiers/inlineParameters.kt | 9 +++++++++ .../diagnostics/tests/modifiers/inlineParameters.txt | 9 +++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/InlineParameterChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/InlineParameterChecker.kt index 833f1f275bc..afb8791c380 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/InlineParameterChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/InlineParameterChecker.kt @@ -16,7 +16,7 @@ package org.jetbrains.kotlin.resolve -import org.jetbrains.kotlin.builtins.isFunctionTypeOrSubtype +import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.diagnostics.Errors @@ -34,7 +34,7 @@ object InlineParameterChecker : DeclarationChecker { val inline = declaration.hasModifier(KtTokens.INLINE_KEYWORD) for (parameter in declaration.valueParameters) { val parameterDescriptor = bindingContext.get(BindingContext.VALUE_PARAMETER, parameter) - if (!inline || (parameterDescriptor != null && !parameterDescriptor.type.isFunctionTypeOrSubtype)) { + if (!inline || (parameterDescriptor != null && !parameterDescriptor.type.isFunctionType)) { parameter.reportIncorrectInline(KtTokens.NOINLINE_KEYWORD, diagnosticHolder) parameter.reportIncorrectInline(KtTokens.CROSSINLINE_KEYWORD, diagnosticHolder) } diff --git a/compiler/testData/diagnostics/tests/modifiers/inlineParameters.kt b/compiler/testData/diagnostics/tests/modifiers/inlineParameters.kt index 2c167f2aeba..735ef96c7c8 100644 --- a/compiler/testData/diagnostics/tests/modifiers/inlineParameters.kt +++ b/compiler/testData/diagnostics/tests/modifiers/inlineParameters.kt @@ -9,3 +9,12 @@ fun gav(noinline x: (Int) -> Unit, Unit, crossinline y: (String) -> Int) {} inline fun incompatible(noinline crossinline x: () -> String) {} + +class FunctionSubtype : () -> Unit { + override fun invoke() {} +} + +inline fun functionSubtype( + noinline f: FunctionSubtype, + crossinline g: FunctionSubtype +) { } diff --git a/compiler/testData/diagnostics/tests/modifiers/inlineParameters.txt b/compiler/testData/diagnostics/tests/modifiers/inlineParameters.txt index 60a9ce4ee33..e1c30f4d2a3 100644 --- a/compiler/testData/diagnostics/tests/modifiers/inlineParameters.txt +++ b/compiler/testData/diagnostics/tests/modifiers/inlineParameters.txt @@ -3,5 +3,14 @@ package public inline fun bar(/*0*/ y: kotlin.Int, /*1*/ crossinline x: kotlin.String): kotlin.Unit public inline fun correct(/*0*/ noinline x: (kotlin.Int) -> kotlin.Unit, /*1*/ crossinline y: (kotlin.String) -> kotlin.Int): kotlin.Unit public inline fun foo(/*0*/ noinline x: kotlin.Int): kotlin.Unit +public inline fun functionSubtype(/*0*/ noinline f: FunctionSubtype, /*1*/ crossinline g: FunctionSubtype): kotlin.Unit public fun gav(/*0*/ noinline x: (kotlin.Int) -> kotlin.Unit, /*1*/ crossinline y: (kotlin.String) -> kotlin.Int): kotlin.Unit public inline fun incompatible(/*0*/ crossinline noinline x: () -> kotlin.String): kotlin.Unit + +public final class FunctionSubtype : () -> kotlin.Unit { + public constructor FunctionSubtype() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ fun invoke(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +}