From fad35b95d4186df0487bb681d253f45858d61d36 Mon Sep 17 00:00:00 2001 From: pyos Date: Thu, 19 May 2022 13:09:52 +0200 Subject: [PATCH] FE: forbid extension calls on inline functional parameters Extension receivers are currently implicitly noinline, and changing that would require modifying the syntax to allow marking them noinline or crossinline. ^KT-5837 Open ^KT-25787 Fixed ^KT-47965 Fixed ^KT-50107 Fixed ^KT-52403 Fixed --- .../FirInlineDeclarationChecker.kt | 5 +- .../resolve/calls/checkers/InlineChecker.kt | 6 +-- .../binaryExpressions/arrayAccess.fir.kt | 22 -------- .../inline/binaryExpressions/arrayAccess.kt | 3 +- .../binaryExpressions/assignment.fir.kt | 30 ----------- .../inline/binaryExpressions/assignment.kt | 9 ++-- .../binaryExpressions/comparison.fir.kt | 26 ---------- .../inline/binaryExpressions/comparison.kt | 9 ++-- .../binaryExpressions/componentAccess.kt | 2 +- .../inline/binaryExpressions/contains.fir.kt | 24 --------- .../inline/binaryExpressions/contains.kt | 7 +-- .../binaryExpressions/mathOperations.kt | 8 +-- .../inline/binaryExpressions/rangeTo.fir.kt | 29 ----------- .../tests/inline/binaryExpressions/rangeTo.kt | 7 +-- .../diagnostics/tests/inline/capture.fir.kt | 51 ------------------- .../diagnostics/tests/inline/capture.kt | 3 +- .../tests/inline/extensionOnFunction.fir.kt | 28 ---------- .../tests/inline/extensionOnFunction.kt | 3 +- .../unaryExpressions/mathOperation.fir.kt | 16 +++--- .../inline/unaryExpressions/mathOperation.kt | 12 ++--- .../unaryExpressions/notOperation.fir.kt | 21 -------- .../inline/unaryExpressions/notOperation.kt | 3 +- ...inlineOrdinaryOfCrossinlineOrdinary.fir.kt | 2 +- .../inlineOrdinaryOfCrossinlineSuspend.fir.kt | 37 -------------- .../inlineOrdinaryOfCrossinlineSuspend.kt | 1 + .../inlineOrdinaryOfOrdinary.fir.kt | 2 +- .../inlineOrdinaryOfSuspend.fir.kt | 2 +- .../inlineSuspendOfCrossinlineOrdinary.fir.kt | 2 +- .../inlineSuspendOfCrossinlineSuspend.fir.kt | 40 --------------- .../inlineSuspendOfCrossinlineSuspend.kt | 1 + .../inlineSuspendOfOrdinary.fir.kt | 2 +- .../inlineSuspendOfSuspend.fir.kt | 2 +- 32 files changed, 59 insertions(+), 356 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/inline/capture.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/inline/extensionOnFunction.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.fir.kt delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.fir.kt delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineSuspend.fir.kt 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 2779d483c04..e6e42c0f2c7 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 @@ -187,7 +187,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { if (receiverSymbol in inalienableParameters) { if (!isInvokeOrInlineExtension(targetSymbol)) { reporter.reportOn( - qualifiedAccessExpression.source, + receiverExpression.source ?: qualifiedAccessExpression.source, FirErrors.USAGE_IS_NOT_INLINABLE, receiverSymbol, context @@ -198,7 +198,8 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { private fun isInvokeOrInlineExtension(targetSymbol: FirBasedSymbol<*>?): Boolean { if (targetSymbol !is FirNamedFunctionSymbol) return false - if (targetSymbol.isInline) return true + // TODO: receivers are currently not inline (KT-5837) + // if (targetSymbol.isInline) return true return targetSymbol.name == OperatorNameConventions.INVOKE && targetSymbol.dispatchReceiverType?.isBuiltinFunctionalType(session) == true } 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 ac15450869b..8288320cddc 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 @@ -238,12 +238,12 @@ internal class InlineChecker(private val descriptor: FunctionDescriptor) : CallC if (descriptor !is SimpleFunctionDescriptor) { return false } + // TODO: receivers are currently not inline (KT-5837) + // if (InlineUtil.isInline(descriptor)) return true val containingDeclaration = descriptor.getContainingDeclaration() - val isInvoke = descriptor.getName() == OperatorNameConventions.INVOKE && + return descriptor.getName() == OperatorNameConventions.INVOKE && containingDeclaration is ClassDescriptor && containingDeclaration.defaultType.isBuiltinFunctionalType - - return isInvoke || InlineUtil.isInline(descriptor) } private fun checkVisibilityAndAccess( diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.fir.kt deleted file mode 100644 index d82ac861104..00000000000 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.fir.kt +++ /dev/null @@ -1,22 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE -operator inline fun Function1.get(index : Int) { - -} - -inline fun inlineFunWithInvoke(s: (p: T) -> U) { - s[1] -} - -//noinline -operator fun Function2.get(index : Int) { - -} - -operator fun @ExtensionFunctionType Function3.get(index : Int) { - -} - -inline fun inlineFunWithInvoke(s: (p: T, l: U) -> V, ext: T.(p: U, l: V) -> W) { - s[1] - ext[1] -} diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.kt index 19a60b6e122..b62a860d9e8 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/arrayAccess.kt @@ -1,10 +1,11 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNUSED_VALUE operator inline fun Function1.get(index : Int) { } inline fun inlineFunWithInvoke(s: (p: T) -> U) { - s[1] + s[1] } //noinline diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.fir.kt deleted file mode 100644 index 7182ae34917..00000000000 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.fir.kt +++ /dev/null @@ -1,30 +0,0 @@ -// !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) {} - -inline operator fun Function1.modAssign(p: Function1) = { - this += p - p += this -} - -inline operator fun Function1.plusAssign(p: Function1) { - this -= p - p -= this -} - -operator fun @ExtensionFunctionType Function2.minusAssign(ext : @ExtensionFunctionType Function2) {} - -inline operator fun @ExtensionFunctionType Function2.modAssign(ext : @ExtensionFunctionType Function2) = { - this += ext - ext += this -} - -inline operator fun @ExtensionFunctionType Function2.plusAssign(ext : @ExtensionFunctionType Function2) { - this -= ext - ext -= this -} - -inline fun inlineFunWithInvoke(s: (p: T) -> U, ext: T.(p: U) -> V) { - s += s - ext += ext -} diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt index 47c85879256..f2955905da8 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/assignment.kt @@ -1,10 +1,11 @@ +// FIR_IDENTICAL // !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) {} inline operator fun Function1.modAssign(p: Function1) = { this += p - p += this + p += this } inline operator fun Function1.plusAssign(p: Function1) { @@ -16,7 +17,7 @@ operator fun @ExtensionFunctionType Function2.minusAssign(ext inline operator fun @ExtensionFunctionType Function2.modAssign(ext : @ExtensionFunctionType Function2) = { this += ext - ext += this + ext += this } inline operator fun @ExtensionFunctionType Function2.plusAssign(ext : @ExtensionFunctionType Function2) { @@ -25,6 +26,6 @@ inline operator fun @ExtensionFunctionType Function2.plusAssi } inline fun inlineFunWithInvoke(s: (p: T) -> U, ext: T.(p: U) -> V) { - s += s - ext += ext + s += s + ext += ext } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.fir.kt deleted file mode 100644 index 130195d5232..00000000000 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.fir.kt +++ /dev/null @@ -1,26 +0,0 @@ -// !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 - -inline fun inlineFunWithInvoke(s: (p: T) -> U) { - s < s - s <= s - s > s - s >= s -} - -//noinline -operator fun Function2.compareTo(index : Function2) = 1 -operator fun @ExtensionFunctionType Function3.compareTo(index : @ExtensionFunctionType Function3) = 1 - -inline fun inlineFunWithInvoke(s: (p: T, l: U) -> V, ext: T.(p: U, l: V) -> W) { - s < s - s <= s - s > s - s >= s - - ext < ext - ext > ext - ext <= ext - ext >= ext -} diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.kt index 6166c6656d8..c3fecb48864 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/comparison.kt @@ -1,12 +1,13 @@ +// FIR_IDENTICAL // !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 inline fun inlineFunWithInvoke(s: (p: T) -> U) { - s < s - s <= s - s > s - s >= s + s < s + s <= s + s > s + s >= s } //noinline diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.kt index 52baa63c0d5..4c7576c38ea 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/componentAccess.kt @@ -3,7 +3,7 @@ inline operator fun Function1.component1() = 1 inline operator fun Function1.component2() = 2 inline fun inlineFunWithInvoke(s: (p: T) -> U) { - val (d1, e1) = s + val (d1, e1) = s } operator fun Function2.component1() = 1 diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.fir.kt deleted file mode 100644 index f5d238ec527..00000000000 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.fir.kt +++ /dev/null @@ -1,24 +0,0 @@ -// !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 - p in this - return false -} - -inline fun inlineFunWithInvoke(s: (p: T) -> U) { - s in s - s !in s -} - - -operator fun Function2.contains(p: Function2): Boolean = false - -operator fun @ExtensionFunctionType Function3.contains(ext: @ExtensionFunctionType Function3): Boolean = false - -inline fun inlineFunWithInvoke(s: (p: T, l: U) -> U, ext: T.(p: U, l: U) -> V) { - s in s - s !in s - - ext in ext - ext !in ext -} diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.kt index 6f77e98b20a..2ef4b130a48 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/contains.kt @@ -1,13 +1,14 @@ +// FIR_IDENTICAL // !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 + this in p p in this return false } inline fun inlineFunWithInvoke(s: (p: T) -> U) { - s in s - s !in s + s in s + s !in s } diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt index 42a440c50e6..0ab1edf5cee 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/mathOperations.kt @@ -17,13 +17,13 @@ inline operator fun @ExtensionFunctionType Function2.plus(p: } inline fun inlineFunWithInvoke(s: (p: T) -> U, ext: T.(p: U) -> V) { - s + s - ext + ext + s + s + ext + ext } inline fun inlineFunWithInvoke(s: (p: T) -> U, ext: T.(p: U) -> V) { - s + s - ext + ext + s + s + ext + ext } inline fun Function1.submit() { diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.fir.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.fir.kt deleted file mode 100644 index 2ac05af30c4..00000000000 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.fir.kt +++ /dev/null @@ -1,29 +0,0 @@ -// !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 { - this..p - p..this - return 1..2 -} - -inline fun inlineFunWithInvoke(s: (p: T) -> U) { - s..s - s..s -} - - -operator fun Function2.rangeTo(p: Function2): ClosedRange { - return 1..2 -} - -operator fun @ExtensionFunctionType Function3.rangeTo(ext: @ExtensionFunctionType Function3): ClosedRange { - return 1..2 -} - -inline fun inlineFunWithInvoke(s: (p: T, l: U) -> U, ext: T.(p: U, l: U) -> V) { - s..s - s..s - - ext..ext - ext..ext -} diff --git a/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.kt b/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.kt index 508750fb971..1623b270964 100644 --- a/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.kt +++ b/compiler/testData/diagnostics/tests/inline/binaryExpressions/rangeTo.kt @@ -1,14 +1,15 @@ +// FIR_IDENTICAL // !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 { this..p - p..this + p..this return 1..2 } inline fun inlineFunWithInvoke(s: (p: T) -> U) { - s..s - s..s + s..s + s..s } diff --git a/compiler/testData/diagnostics/tests/inline/capture.fir.kt b/compiler/testData/diagnostics/tests/inline/capture.fir.kt deleted file mode 100644 index 565b4c4b5d7..00000000000 --- a/compiler/testData/diagnostics/tests/inline/capture.fir.kt +++ /dev/null @@ -1,51 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -NON_LOCAL_RETURN_NOT_ALLOWED - -infix fun Function1.noInlineExt(p: Int) {} - -inline infix fun Function1.inlineExt2(p: Int) { - { - noInlineExt(11) - this.noInlineExt(11) - this noInlineExt 11 - this - }() -} - - -inline fun Function1.inlineExt() { - { - inlineExt2(1) - this.inlineExt2(1) - this inlineExt2 1 - this(11) - }() -} - -inline fun inlineFunWithInvoke(s: (p: Int) -> Unit) { - { - s(11) - s.invoke(11) - s invoke 11 - }() -} - -inline fun inlineFunWithInvokeNonInline(noinline s: (p: Int) -> Unit) { - { - s(11) - s.invoke(11) - s invoke 11 - }() -} - - -inline fun testExtension(s: (p: Int) -> Unit) { - { - s.inlineExt() - } () -} - -inline fun inlineFunWrongExtension(s: (p: Int) -> Unit) { - { - s.noInlineExt(11) - } () -} diff --git a/compiler/testData/diagnostics/tests/inline/capture.kt b/compiler/testData/diagnostics/tests/inline/capture.kt index fe659ffca08..9d42734abf3 100644 --- a/compiler/testData/diagnostics/tests/inline/capture.kt +++ b/compiler/testData/diagnostics/tests/inline/capture.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE -NON_LOCAL_RETURN_NOT_ALLOWED infix fun Function1.noInlineExt(p: Int) {} @@ -40,7 +41,7 @@ inline fun inlineFunWithInvokeNonInline(noinline s: (p: Int) -> Unit) { inline fun testExtension(s: (p: Int) -> Unit) { { - s.inlineExt() + s.inlineExt() } () } diff --git a/compiler/testData/diagnostics/tests/inline/extensionOnFunction.fir.kt b/compiler/testData/diagnostics/tests/inline/extensionOnFunction.fir.kt deleted file mode 100644 index d38f4feffb3..00000000000 --- a/compiler/testData/diagnostics/tests/inline/extensionOnFunction.fir.kt +++ /dev/null @@ -1,28 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE - -infix fun Function1.noInlineExt(p: Int) {} - -inline infix fun Function1.inlineExt2(p: Int) { - noInlineExt(11) - this.noInlineExt(11) - this noInlineExt 11 - this -} - -inline fun Function1.inlineExt() { - inlineExt2(1) - this.inlineExt2(1) - this inlineExt2 1 -} - -inline fun testExtension(s: (p: Int) -> Unit) { - s.inlineExt() -} - -inline fun inlineFunWrongExtension(s: (p: Int) -> Unit) { - s.noInlineExt(11) -} - -inline fun inlineFunNoInline(noinline s: (p: Int) -> Unit) { - s.noInlineExt(11) -} diff --git a/compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt b/compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt index 296fee919e9..00275e923cc 100644 --- a/compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt +++ b/compiler/testData/diagnostics/tests/inline/extensionOnFunction.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE infix fun Function1.noInlineExt(p: Int) {} @@ -16,7 +17,7 @@ inline fun Function1.inlineExt() { } inline fun testExtension(s: (p: Int) -> Unit) { - s.inlineExt() + s.inlineExt() } inline fun inlineFunWrongExtension(s: (p: Int) -> Unit) { diff --git a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.fir.kt b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.fir.kt index e2d8ae2025b..cfc93922589 100644 --- a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.fir.kt +++ b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.fir.kt @@ -11,18 +11,18 @@ inline operator fun @ExtensionFunctionType Function2.inc() = thi operator fun @ExtensionFunctionType Function2.dec() = this inline fun inlineFunWithInvoke(s: (p: T) -> V, ext: T.(p: T) -> V) { - +s - -s + +s + -s s++ - ++s + ++s s-- - --s - +ext - -ext + --s + +ext + -ext ext++ - ++ext + ++ext ext-- - --ext + --ext } inline fun Function1.inlineFunWithInvoke() { diff --git a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt index b41252e2e0a..2a4af0dfe62 100644 --- a/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt +++ b/compiler/testData/diagnostics/tests/inline/unaryExpressions/mathOperation.kt @@ -11,16 +11,16 @@ inline operator fun @ExtensionFunctionType Function2.inc() = thi operator fun @ExtensionFunctionType Function2.dec() = this inline fun inlineFunWithInvoke(s: (p: T) -> V, ext: T.(p: T) -> V) { - +s + +s -s - s++ - ++s + s++ + ++s s-- --s - +ext + +ext -ext - ext++ - ++ext + ext++ + ++ext ext-- --ext } diff --git a/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.fir.kt b/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.fir.kt deleted file mode 100644 index 3b844d5a19d..00000000000 --- a/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.fir.kt +++ /dev/null @@ -1,21 +0,0 @@ -// !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 -} - -inline fun inlineFunWithInvoke(s: (p: T) -> V) { - !s -} - -operator fun Function2.not() : Boolean { - return !this -} - -operator fun @ExtensionFunctionType Function3.not() : Boolean { - return !this -} - -inline fun inlineFunWithInvoke(s: (p: T, l: U) -> V, ext: T.(p: T, l : U) -> V) { - !s - !ext -} diff --git a/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.kt b/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.kt index 143083b00d7..28f4e340290 100644 --- a/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.kt +++ b/compiler/testData/diagnostics/tests/inline/unaryExpressions/notOperation.kt @@ -1,10 +1,11 @@ +// FIR_IDENTICAL // !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 } inline fun inlineFunWithInvoke(s: (p: T) -> V) { - !s + !s } operator fun Function2.not() : Boolean { diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.fir.kt index 88d4dec8b30..c542ab6897b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineOrdinary.fir.kt @@ -21,7 +21,7 @@ inline fun test(crossinline c: () -> Unit) { } } val l = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } suspend fun calculate() = "OK" diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.fir.kt deleted file mode 100644 index f4af3db3a6f..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.fir.kt +++ /dev/null @@ -1,37 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -NOTHING_TO_INLINE -// SKIP_TXT -// WITH_COROUTINES -import kotlin.coroutines.* -import kotlin.coroutines.intrinsics.* -import helpers.* - -interface SuspendRunnable { - suspend fun run() -} - -// Function is NOT suspend -// parameter is crossinline -// parameter is suspend -// Block is NOT allowed to be called inside the body of owner inline function -// Block is allowed to be called from nested classes/lambdas (as common crossinlines) -// It is NOT possible to call startCoroutine on the parameter -// suspend calls possible inside lambda matching to the parameter - -inline fun test(crossinline c: suspend () -> Unit) { - c() - val o = object : SuspendRunnable { - override suspend fun run() { - c() - } - } - val l: suspend () -> Unit = { c() } - c.startCoroutine(EmptyContinuation) -} - -suspend fun calculate() = "OK" - -fun box() { - test { - calculate() - } -} diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.kt index 9588905e908..46bbab8b33f 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfCrossinlineSuspend.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !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 8c7416bd4c5..4bfef496ace 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfOrdinary.fir.kt @@ -21,7 +21,7 @@ inline fun test(c: () -> Unit) { } } val l = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } fun builder(c: suspend () -> Unit) { diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.fir.kt index d417be923c2..f93e0b838b0 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineOrdinaryOfSuspend.fir.kt @@ -25,7 +25,7 @@ inline fun test(c: suspend () -> Uni } } val l: suspend () -> Unit = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } fun builder(c: suspend () -> Unit) {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.fir.kt index e013695fd00..92a91f00d5d 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineOrdinary.fir.kt @@ -20,7 +20,7 @@ suspend inline fun test(crossinline c: () -> Unit) { } } val l = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } fun builder(c: suspend () -> Unit) { diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineSuspend.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineSuspend.fir.kt deleted file mode 100644 index 6b523193efe..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineSuspend.fir.kt +++ /dev/null @@ -1,40 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -NOTHING_TO_INLINE -// SKIP_TXT -// WITH_COROUTINES -import kotlin.coroutines.* -import kotlin.coroutines.intrinsics.* -import helpers.* - -interface SuspendRunnable { - suspend fun run() -} - -// Function is suspend -// parameter is crossinline -// parameter is suspend -// Block is allowed to be called inside the body of owner inline function -// Block is allowed to be called from nested classes/lambdas (as common crossinlines) -// It is NOT possible to call startCoroutine on the parameter -// suspend calls possible inside lambda matching to the parameter -suspend inline fun test(crossinline c: suspend () -> Unit) { - c() - val o = object : SuspendRunnable { - override suspend fun run() { - c() - } - } - val l: suspend () -> Unit = { c() } - c.startCoroutine(EmptyContinuation) -} - -fun builder(c: suspend () -> Unit) {} - -suspend fun calculate() = "OK" - -fun box() { - builder { - test { - calculate() - } - } -} diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineSuspend.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineSuspend.kt index 96a048574b7..0de5b343a08 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineSuspend.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfCrossinlineSuspend.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -NOTHING_TO_INLINE // SKIP_TXT // WITH_COROUTINES diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfOrdinary.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfOrdinary.fir.kt index 0e5dcd52f96..79180ae7052 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfOrdinary.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfOrdinary.fir.kt @@ -20,7 +20,7 @@ suspend inline fun test(c: () -> Unit) { } } val l = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } suspend fun calculate() = "OK" diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt index f5341a4cae7..c6010d3c017 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt @@ -24,7 +24,7 @@ suspend inline fun test(c: suspend } } val l: suspend () -> Unit = { c() } - c.startCoroutine(EmptyContinuation) + c.startCoroutine(EmptyContinuation) } fun builder(c: suspend () -> Unit) {