diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 69f0cf57e02..1b98640c239 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -21188,6 +21188,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/inline/valueClasses.kt"); } + @Test + @TestMetadata("valueOfKFunctionTypeAsArgumentOfInlineFunction.kt") + public void testValueOfKFunctionTypeAsArgumentOfInlineFunction() { + runTest("compiler/testData/diagnostics/tests/inline/valueOfKFunctionTypeAsArgumentOfInlineFunction.kt"); + } + @Test @TestMetadata("vararg.kt") public void testVararg() { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 43485bf3c32..2addb0f1dfa 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -21188,6 +21188,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/inline/valueClasses.kt"); } + @Test + @TestMetadata("valueOfKFunctionTypeAsArgumentOfInlineFunction.kt") + public void testValueOfKFunctionTypeAsArgumentOfInlineFunction() { + runTest("compiler/testData/diagnostics/tests/inline/valueOfKFunctionTypeAsArgumentOfInlineFunction.kt"); + } + @Test @TestMetadata("vararg.kt") public void testVararg() { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 986bc7baea9..c871d617294 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -21182,6 +21182,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/inline/valueClasses.kt"); } + @Test + @TestMetadata("valueOfKFunctionTypeAsArgumentOfInlineFunction.kt") + public void testValueOfKFunctionTypeAsArgumentOfInlineFunction() { + runTest("compiler/testData/diagnostics/tests/inline/valueOfKFunctionTypeAsArgumentOfInlineFunction.kt"); + } + @Test @TestMetadata("vararg.kt") public void testVararg() { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index f70c15e6448..e09c19e7106 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -21188,6 +21188,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/inline/valueClasses.kt"); } + @Test + @TestMetadata("valueOfKFunctionTypeAsArgumentOfInlineFunction.kt") + public void testValueOfKFunctionTypeAsArgumentOfInlineFunction() { + runTest("compiler/testData/diagnostics/tests/inline/valueOfKFunctionTypeAsArgumentOfInlineFunction.kt"); + } + @Test @TestMetadata("vararg.kt") public void testVararg() { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt index cd1ef818e34..d2668f055bd 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt @@ -457,7 +457,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker(MppCheckerKind.Common) { function.valueParameters.any { param -> val type = param.returnTypeRef.coneType !param.isNoinline && !type.isNullable - && (type.isBasicFunctionType(session) || type.isSuspendOrKSuspendFunctionType(session)) + && type.isNonKFunctionType(session) } if (hasInlinableParameters) return if (function.isInlineOnly(session)) return diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/FunctionalTypeUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/FunctionalTypeUtils.kt index 0010ebe33d8..90df61a53c2 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/FunctionalTypeUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/FunctionalTypeUtils.kt @@ -59,6 +59,11 @@ fun ConeKotlinType.isBasicFunctionType(session: FirSession): Boolean { return isFunctionTypeWithPredicate(session) { it == FunctionTypeKind.Function } } +// Function, SuspendFunction, KSuspendFunction, [Custom]Function, K[Custom]Function +fun ConeKotlinType.isNonKFunctionType(session: FirSession): Boolean { + return isFunctionTypeWithPredicate(session) { it != FunctionTypeKind.KFunction } +} + // SuspendFunction, KSuspendFunction fun ConeKotlinType.isSuspendOrKSuspendFunctionType(session: FirSession): Boolean { return isFunctionTypeWithPredicate(session) { diff --git a/compiler/testData/diagnostics/tests/inline/valueOfKFunctionTypeAsArgumentOfInlineFunction.kt b/compiler/testData/diagnostics/tests/inline/valueOfKFunctionTypeAsArgumentOfInlineFunction.kt new file mode 100644 index 00000000000..6844605a802 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/valueOfKFunctionTypeAsArgumentOfInlineFunction.kt @@ -0,0 +1,7 @@ +// FIR_IDENTICAL +// ISSUE: KT-65959 +import kotlin.reflect.KFunction0 + +inline fun foo(block: KFunction0) { + block() +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 39c3a850220..f55b2893207 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -21188,6 +21188,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/inline/valueClasses.kt"); } + @Test + @TestMetadata("valueOfKFunctionTypeAsArgumentOfInlineFunction.kt") + public void testValueOfKFunctionTypeAsArgumentOfInlineFunction() { + runTest("compiler/testData/diagnostics/tests/inline/valueOfKFunctionTypeAsArgumentOfInlineFunction.kt"); + } + @Test @TestMetadata("vararg.kt") public void testVararg() { diff --git a/plugins/fir-plugin-prototype/testData/diagnostics/checkers/ValueOfCustomFunctionTypeAsArgumentOfInlineFunction.fir.txt b/plugins/fir-plugin-prototype/testData/diagnostics/checkers/ValueOfCustomFunctionTypeAsArgumentOfInlineFunction.fir.txt new file mode 100644 index 00000000000..bdcb12a4061 --- /dev/null +++ b/plugins/fir-plugin-prototype/testData/diagnostics/checkers/ValueOfCustomFunctionTypeAsArgumentOfInlineFunction.fir.txt @@ -0,0 +1,4 @@ +FILE: ValueOfCustomFunctionTypeAsArgumentOfInlineFunction.kt + @R|org/jetbrains/kotlin/fir/plugin/MyComposable|() public final inline fun inlineFunction(block: R|@R|org/jetbrains/kotlin/fir/plugin/MyComposable|() some/MyComposableFunction0|): R|T| { + ^inlineFunction R|/block|.R|SubstitutionOverride|() + } diff --git a/plugins/fir-plugin-prototype/testData/diagnostics/checkers/ValueOfCustomFunctionTypeAsArgumentOfInlineFunction.kt b/plugins/fir-plugin-prototype/testData/diagnostics/checkers/ValueOfCustomFunctionTypeAsArgumentOfInlineFunction.kt new file mode 100644 index 00000000000..95bc951b885 --- /dev/null +++ b/plugins/fir-plugin-prototype/testData/diagnostics/checkers/ValueOfCustomFunctionTypeAsArgumentOfInlineFunction.kt @@ -0,0 +1,8 @@ +// ISSUE: KT-65959 + +import org.jetbrains.kotlin.fir.plugin.MyComposable + +@MyComposable +inline fun inlineFunction(block: @MyComposable () -> T): T { + return block() +} diff --git a/plugins/fir-plugin-prototype/tests-gen/org/jetbrains/kotlin/fir/plugin/runners/FirPsiPluginDiagnosticTestGenerated.java b/plugins/fir-plugin-prototype/tests-gen/org/jetbrains/kotlin/fir/plugin/runners/FirPsiPluginDiagnosticTestGenerated.java index 1ffb8d9315c..5b73e9522c3 100644 --- a/plugins/fir-plugin-prototype/tests-gen/org/jetbrains/kotlin/fir/plugin/runners/FirPsiPluginDiagnosticTestGenerated.java +++ b/plugins/fir-plugin-prototype/tests-gen/org/jetbrains/kotlin/fir/plugin/runners/FirPsiPluginDiagnosticTestGenerated.java @@ -62,6 +62,12 @@ public class FirPsiPluginDiagnosticTestGenerated extends AbstractFirPsiPluginDia public void testSimple() { runTest("plugins/fir-plugin-prototype/testData/diagnostics/checkers/simple.kt"); } + + @Test + @TestMetadata("ValueOfCustomFunctionTypeAsArgumentOfInlineFunction.kt") + public void testValueOfCustomFunctionTypeAsArgumentOfInlineFunction() { + runTest("plugins/fir-plugin-prototype/testData/diagnostics/checkers/ValueOfCustomFunctionTypeAsArgumentOfInlineFunction.kt"); + } } @Nested