From d7ca7e17c94c7d74741656129ff53a16f45a5d4e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 24 May 2022 15:45:09 +0200 Subject: [PATCH] FE 10: wrap ext. receiver inlining prohibition in the language feature See KT-52502 --- ...agnosisCompilerTestFE10TestdataTestGenerated.java | 12 ++++++++++++ .../FirOldFrontendDiagnosticsTestGenerated.java | 12 ++++++++++++ ...rontendDiagnosticsWithLightTreeTestGenerated.java | 12 ++++++++++++ .../src/org/jetbrains/kotlin/diagnostics/Errors.java | 1 + .../diagnostics/rendering/DefaultErrorMessages.java | 1 + .../kotlin/resolve/calls/checkers/InlineChecker.kt | 8 +++++++- .../tests/inline/binaryExpressions/arrayAccess.kt | 1 + .../tests/inline/binaryExpressions/assignment.kt | 1 + .../tests/inline/binaryExpressions/comparison.kt | 1 + .../inline/binaryExpressions/componentAccess.fir.kt | 1 + .../inline/binaryExpressions/componentAccess.kt | 1 + .../tests/inline/binaryExpressions/contains.kt | 1 + .../tests/inline/binaryExpressions/mathOperations.kt | 1 + .../tests/inline/binaryExpressions/rangeTo.kt | 1 + .../testData/diagnostics/tests/inline/capture.kt | 1 + .../diagnostics/tests/inline/extensionOnFunction.kt | 1 + ...tensionCallsOnInlineFunctionalParameters_after.kt | 12 ++++++++++++ ...ensionCallsOnInlineFunctionalParameters_after.txt | 5 +++++ ...onCallsOnInlineFunctionalParameters_before.fir.kt | 11 +++++++++++ ...ensionCallsOnInlineFunctionalParameters_before.kt | 11 +++++++++++ ...nsionCallsOnInlineFunctionalParameters_before.txt | 5 +++++ .../inline/unaryExpressions/mathOperation.fir.kt | 1 + .../tests/inline/unaryExpressions/mathOperation.kt | 1 + .../tests/inline/unaryExpressions/notOperation.kt | 1 + .../inlineOrdinaryOfCrossinlineOrdinary.fir.kt | 1 + .../inlineOrdinaryOfCrossinlineOrdinary.kt | 1 + .../inlineOrdinaryOfCrossinlineSuspend.kt | 1 + .../inlineOrdinaryOfOrdinary.fir.kt | 1 + .../inlineCrossinline/inlineOrdinaryOfOrdinary.kt | 1 + .../inlineCrossinline/inlineOrdinaryOfSuspend.fir.kt | 1 + .../inlineCrossinline/inlineOrdinaryOfSuspend.kt | 1 + .../inlineSuspendOfCrossinlineOrdinary.fir.kt | 1 + .../inlineSuspendOfCrossinlineOrdinary.kt | 1 + .../inlineCrossinline/inlineSuspendOfSuspend.fir.kt | 1 + .../inlineCrossinline/inlineSuspendOfSuspend.kt | 1 + .../kotlin/test/runners/DiagnosticTestGenerated.java | 12 ++++++++++++ .../kotlin/config/LanguageVersionSettings.kt | 1 + 37 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_after.kt create mode 100644 compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_after.txt create mode 100644 compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.fir.kt create mode 100644 compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.kt create mode 100644 compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.txt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index aaaa03ed162..e2b2375dbe6 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -16926,6 +16926,18 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt"); } + @Test + @TestMetadata("forbidExtensionCallsOnInlineFunctionalParameters_after.kt") + public void testForbidExtensionCallsOnInlineFunctionalParameters_after() throws Exception { + runTest("compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_after.kt"); + } + + @Test + @TestMetadata("forbidExtensionCallsOnInlineFunctionalParameters_before.kt") + public void testForbidExtensionCallsOnInlineFunctionalParameters_before() throws Exception { + runTest("compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.kt"); + } + @Test @TestMetadata("fromInlineToNoInline.kt") public void testFromInlineToNoInline() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 0d3d56e8b9a..0e9dcf95185 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -16926,6 +16926,18 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt"); } + @Test + @TestMetadata("forbidExtensionCallsOnInlineFunctionalParameters_after.kt") + public void testForbidExtensionCallsOnInlineFunctionalParameters_after() throws Exception { + runTest("compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_after.kt"); + } + + @Test + @TestMetadata("forbidExtensionCallsOnInlineFunctionalParameters_before.kt") + public void testForbidExtensionCallsOnInlineFunctionalParameters_before() throws Exception { + runTest("compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.kt"); + } + @Test @TestMetadata("fromInlineToNoInline.kt") public void testFromInlineToNoInline() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index c5e5e16dafa..6677ee754a7 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -16926,6 +16926,18 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt"); } + @Test + @TestMetadata("forbidExtensionCallsOnInlineFunctionalParameters_after.kt") + public void testForbidExtensionCallsOnInlineFunctionalParameters_after() throws Exception { + runTest("compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_after.kt"); + } + + @Test + @TestMetadata("forbidExtensionCallsOnInlineFunctionalParameters_before.kt") + public void testForbidExtensionCallsOnInlineFunctionalParameters_before() throws Exception { + runTest("compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.kt"); + } + @Test @TestMetadata("fromInlineToNoInline.kt") public void testFromInlineToNoInline() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index c68e3974df4..edf4cfd828c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -1266,6 +1266,7 @@ public interface Errors { DiagnosticFactory1.create(ERROR, NOT_SUPPORTED_IN_INLINE_MOST_RELEVANT); DiagnosticFactory0 NOTHING_TO_INLINE = DiagnosticFactory0.create(WARNING); DiagnosticFactory2 USAGE_IS_NOT_INLINABLE = DiagnosticFactory2.create(ERROR); + DiagnosticFactory2 USAGE_IS_NOT_INLINABLE_WARNING = DiagnosticFactory2.create(WARNING); DiagnosticFactory2 NULLABLE_INLINE_PARAMETER = DiagnosticFactory2.create(ERROR); DiagnosticFactory2 RECURSION_IN_INLINE = DiagnosticFactory2.create(ERROR); DiagnosticFactory0 DECLARATION_CANT_BE_INLINED = DiagnosticFactory0.create(ERROR, INLINE_FUN_MODIFIER); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index ac2908122b0..09dda1e1f54 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -1085,6 +1085,7 @@ public class DefaultErrorMessages { MAP.put(REIFIED_TYPE_PARAMETER_IN_OVERRIDE, "Override by a function with reified type parameter"); MAP.put(NOTHING_TO_INLINE, "Expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of functional types"); MAP.put(USAGE_IS_NOT_INLINABLE, "Illegal usage of inline-parameter ''{0}'' in ''{1}''. Add ''noinline'' modifier to the parameter declaration", ELEMENT_TEXT, SHORT_NAMES_IN_TYPES); + MAP.put(USAGE_IS_NOT_INLINABLE_WARNING, "Deprecated usage of inline-parameter ''{0}'' in ''{1}''. Add ''noinline'' modifier to the parameter declaration. See https://youtrack.jetbrains.com/issue/KT-52502", ELEMENT_TEXT, SHORT_NAMES_IN_TYPES); MAP.put(NULLABLE_INLINE_PARAMETER, "Inline-parameter ''{0}'' of ''{1}'' must not be nullable. Add ''noinline'' modifier to the parameter declaration or make its type not nullable", ELEMENT_TEXT, SHORT_NAMES_IN_TYPES); MAP.put(RECURSION_IN_INLINE, "Inline function ''{1}'' cannot be recursive", ELEMENT_TEXT, SHORT_NAMES_IN_TYPES); MAP.put(INLINE_PROPERTY_WITH_BACKING_FIELD, "Inline property cannot have backing field"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.kt index 8288320cddc..5506eb5f6ca 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/InlineChecker.kt @@ -218,7 +218,13 @@ internal class InlineChecker(private val descriptor: FunctionDescriptor) : CallC ) { val inlinableCall = isInvokeOrInlineExtension(callDescriptor) if (!inlinableCall) { - context.trace.report(USAGE_IS_NOT_INLINABLE.on(receiverExpression, receiverExpression, descriptor)) + if (InlineUtil.isInline(callDescriptor) && + !context.languageVersionSettings.supportsFeature(LanguageFeature.ForbidExtensionCallsOnInlineFunctionalParameters) + ) { + context.trace.report(USAGE_IS_NOT_INLINABLE_WARNING.on(receiverExpression, receiverExpression, descriptor)) + } else { + context.trace.report(USAGE_IS_NOT_INLINABLE.on(receiverExpression, receiverExpression, descriptor)) + } } else { checkNonLocalReturn(context, lambdaDescriptor, receiverExpression) } diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.kt index b62a860d9e8..b950607952e 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.kt @@ -1,4 +1,5 @@ // FIR_IDENTICAL +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE operator inline fun Function1.get(index : Int) { diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt index f2955905da8..a9028a20ea4 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt @@ -1,4 +1,5 @@ // FIR_IDENTICAL +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -NON_LOCAL_RETURN_NOT_ALLOWED operator fun Function1.minusAssign(p: Function1) {} diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.kt index c3fecb48864..b2b11d47d03 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.kt @@ -1,4 +1,5 @@ // FIR_IDENTICAL +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE inline operator fun Function1.compareTo(p: Function1) = 1 diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.fir.kt index 13fd7b57299..42a343559a8 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.fir.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE inline operator fun Function1.component1() = 1 inline operator fun Function1.component2() = 2 diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.kt index 4c7576c38ea..5fb1989416c 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE inline operator fun Function1.component1() = 1 inline operator fun Function1.component2() = 2 diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.kt index 2ef4b130a48..82dfabc58a9 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.kt @@ -1,4 +1,5 @@ // FIR_IDENTICAL +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -RECURSION_IN_INLINE operator inline fun Function1.contains(p: Function1): Boolean { this in p diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt index 0ab1edf5cee..58aa0085930 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt @@ -1,4 +1,5 @@ // FIR_IDENTICAL +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -CONFLICTING_JVM_DECLARATIONS -CONFLICTING_OVERLOADS operator fun Function1.minus(p: Function1) { diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.kt index 1623b270964..93a54502ae6 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.kt @@ -1,4 +1,5 @@ // FIR_IDENTICAL +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -RECURSION_IN_INLINE inline operator fun Function1.rangeTo(p: Function1): ClosedRange { diff --git a/compiler/testData/diagnostics/tests/inline/capture.kt b/compiler/testData/diagnostics/tests/inline/capture.kt index 9d42734abf3..8930a262d60 100644 --- a/compiler/testData/diagnostics/tests/inline/capture.kt +++ b/compiler/testData/diagnostics/tests/inline/capture.kt @@ -1,4 +1,5 @@ // FIR_IDENTICAL +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -NON_LOCAL_RETURN_NOT_ALLOWED infix fun Function1.noInlineExt(p: Int) {} diff --git a/compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt b/compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt index 00275e923cc..28d04b49c21 100644 --- a/compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt +++ b/compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt @@ -1,4 +1,5 @@ // FIR_IDENTICAL +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE infix fun Function1.noInlineExt(p: Int) {} diff --git a/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_after.kt b/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_after.kt new file mode 100644 index 00000000000..82d9e9bbfe6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_after.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters + +fun main() { + test { } +} +inline fun (() -> Unit).call() { + invoke() +} +inline fun test(block: () -> Unit) { + block.call() +} diff --git a/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_after.txt b/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_after.txt new file mode 100644 index 00000000000..53d0c6fff48 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_after.txt @@ -0,0 +1,5 @@ +package + +public fun main(): kotlin.Unit +public inline fun test(/*0*/ block: () -> kotlin.Unit): kotlin.Unit +public inline fun (() -> kotlin.Unit).call(): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.fir.kt b/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.fir.kt new file mode 100644 index 00000000000..856a0244f2e --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.fir.kt @@ -0,0 +1,11 @@ +// !LANGUAGE: -ForbidExtensionCallsOnInlineFunctionalParameters + +fun main() { + test { } +} +inline fun (() -> Unit).call() { + invoke() +} +inline fun test(block: () -> Unit) { + block.call() +} diff --git a/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.kt b/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.kt new file mode 100644 index 00000000000..a567eba5ef4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.kt @@ -0,0 +1,11 @@ +// !LANGUAGE: -ForbidExtensionCallsOnInlineFunctionalParameters + +fun main() { + test { } +} +inline fun (() -> Unit).call() { + invoke() +} +inline fun test(block: () -> Unit) { + block.call() +} diff --git a/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.txt b/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.txt new file mode 100644 index 00000000000..53d0c6fff48 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.txt @@ -0,0 +1,5 @@ +package + +public fun main(): kotlin.Unit +public inline fun test(/*0*/ block: () -> kotlin.Unit): kotlin.Unit +public inline fun (() -> kotlin.Unit).call(): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.fir.kt b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.fir.kt index cfc93922589..f11639df69c 100644 --- a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.fir.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -VAL_REASSIGNMENT -UNUSED_CHANGED_VALUE -VARIABLE_EXPECTED inline operator fun Function1.unaryPlus() = this diff --git a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt index 2a4af0dfe62..c1a280bac92 100644 --- a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt +++ b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -VAL_REASSIGNMENT -UNUSED_CHANGED_VALUE -VARIABLE_EXPECTED inline operator fun Function1.unaryPlus() = this diff --git a/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.kt b/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.kt index 28f4e340290..0f9ee6aea41 100644 --- a/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.kt +++ b/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.kt @@ -1,4 +1,5 @@ // FIR_IDENTICAL +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -RECURSION_IN_INLINE inline operator fun Function1.not() : Boolean { return !this diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.fir.kt index c542ab6897b..45acdc0704b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.fir.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_VARIABLE // WITH_COROUTINES // SKIP_TXT diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.kt index 863a608ddd4..a86a8232188 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_VARIABLE // WITH_COROUTINES // SKIP_TXT diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.kt index 46bbab8b33f..f718cd6e2a4 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.kt @@ -1,4 +1,5 @@ // FIR_IDENTICAL +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -NOTHING_TO_INLINE // SKIP_TXT // WITH_COROUTINES diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.fir.kt index 4bfef496ace..3d1b6c64f55 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.fir.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_VARIABLE // SKIP_TXT // WITH_COROUTINES diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.kt index c08b9608e54..d15fa810be4 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_VARIABLE // SKIP_TXT // WITH_COROUTINES diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.fir.kt index f93e0b838b0..754d7c89c85 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.fir.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_VARIABLE -NOTHING_TO_INLINE -UNUSED_PARAMETER // SKIP_TXT // WITH_COROUTINES diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.kt index 7567093d39d..b8ffd08e273 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_VARIABLE -NOTHING_TO_INLINE -UNUSED_PARAMETER // SKIP_TXT // WITH_COROUTINES diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.fir.kt index 92a91f00d5d..fea304885c0 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.fir.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_VARIABLE // SKIP_TXT // WITH_COROUTINES diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.kt index 24e4f06072d..e37a26b991e 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_VARIABLE // SKIP_TXT // WITH_COROUTINES diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt index c6010d3c017..6065e065bdd 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -NOTHING_TO_INLINE // SKIP_TXT // WITH_COROUTINES diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.kt index 58ac52872eb..c824c523728 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.kt @@ -1,3 +1,4 @@ +// !LANGUAGE: +ForbidExtensionCallsOnInlineFunctionalParameters // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -NOTHING_TO_INLINE // SKIP_TXT // WITH_COROUTINES 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 da83634f7f3..79956207e1e 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 @@ -16932,6 +16932,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt"); } + @Test + @TestMetadata("forbidExtensionCallsOnInlineFunctionalParameters_after.kt") + public void testForbidExtensionCallsOnInlineFunctionalParameters_after() throws Exception { + runTest("compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_after.kt"); + } + + @Test + @TestMetadata("forbidExtensionCallsOnInlineFunctionalParameters_before.kt") + public void testForbidExtensionCallsOnInlineFunctionalParameters_before() throws Exception { + runTest("compiler/testData/diagnostics/tests/inline/forbidExtensionCallsOnInlineFunctionalParameters_before.kt"); + } + @Test @TestMetadata("fromInlineToNoInline.kt") public void testFromInlineToNoInline() throws Exception { diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index a6ad4d8e454..77357c8d3fd 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -276,6 +276,7 @@ enum class LanguageFeature( ReportTypeVarianceConflictOnQualifierArguments(KOTLIN_1_9, kind = BUG_FIX), // KT-50947 ReportErrorsOnRecursiveTypeInsidePlusAssignment(KOTLIN_1_9, kind = BUG_FIX), // KT-48546 ForbidInferringTypeVariablesIntoEmptyIntersection(KOTLIN_1_9, kind = BUG_FIX), // KT-51221 + ForbidExtensionCallsOnInlineFunctionalParameters(KOTLIN_1_9, kind = BUG_FIX), // KT-52502 // Disabled for indefinite time. See KT-48535 and related discussion ApproximateIntegerLiteralTypesInReceiverPosition(sinceVersion = null),