NI: clean calls in coroutine inference before the second analysis of `+=` only for right side ^KT-39660 Fixed
diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index d44c6e6..1c0070c 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java
@@ -12409,6 +12409,11 @@ runTest("compiler/testData/codegen/box/inference/lastExpressionOfLambdaWithNothingConstraint.kt"); } + @TestMetadata("plusAssignInsideLambda.kt") + public void testPlusAssignInsideLambda() throws Exception { + runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java index 0ceb583..5719709 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java
@@ -248,7 +248,7 @@ // Check for '+' // We should clear calls info for coroutine inference within right side as here we analyze it a second time in another context if (context.inferenceSession instanceof CoroutineInferenceSession) { - ((CoroutineInferenceSession) context.inferenceSession).clearCallsInfoByContainingElement(expression); + ((CoroutineInferenceSession) context.inferenceSession).clearCallsInfoByContainingElement(right); } Name counterpartName = OperatorConventions.BINARY_OPERATION_NAMES.get(OperatorConventions.ASSIGNMENT_OPERATION_COUNTERPARTS.get(operationType)); binaryOperationDescriptors = components.callResolver.resolveBinaryCall(
diff --git a/compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt b/compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt new file mode 100644 index 0000000..b6d4ea8 --- /dev/null +++ b/compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt
@@ -0,0 +1,22 @@ +// WITH_RUNTIME + +import kotlin.experimental.ExperimentalTypeInference + +interface SendChannel<in T> { + suspend fun send(value: T) +} + +@OptIn(ExperimentalTypeInference::class) +public fun <T> flux(@BuilderInference block: suspend SendChannel<T>.() -> Unit) {} + +suspend inline fun <T> T.collect(action: (T) -> Unit) { action(this) } + +fun test() { + flux { + var result = "" + "OK".collect { result += it } + send(result) + } +} + +fun box() = "OK" \ No newline at end of file
diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index b1162db..b1b68c4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java
@@ -13629,6 +13629,11 @@ runTest("compiler/testData/codegen/box/inference/lastExpressionOfLambdaWithNothingConstraint.kt"); } + @TestMetadata("plusAssignInsideLambda.kt") + public void testPlusAssignInsideLambda() throws Exception { + runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");
diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index dca4410..79f3482 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java
@@ -13629,6 +13629,11 @@ runTest("compiler/testData/codegen/box/inference/lastExpressionOfLambdaWithNothingConstraint.kt"); } + @TestMetadata("plusAssignInsideLambda.kt") + public void testPlusAssignInsideLambda() throws Exception { + runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");
diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index be93593..1ac47eb 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java
@@ -12409,6 +12409,11 @@ runTest("compiler/testData/codegen/box/inference/lastExpressionOfLambdaWithNothingConstraint.kt"); } + @TestMetadata("plusAssignInsideLambda.kt") + public void testPlusAssignInsideLambda() throws Exception { + runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 2928d86..89fc138 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java
@@ -10674,6 +10674,11 @@ runTest("compiler/testData/codegen/box/inference/lastExpressionOfLambdaWithNothingConstraint.kt"); } + @TestMetadata("plusAssignInsideLambda.kt") + public void testPlusAssignInsideLambda() throws Exception { + runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 72318fd..f29e7f5 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java
@@ -10684,6 +10684,11 @@ runTest("compiler/testData/codegen/box/inference/lastExpressionOfLambdaWithNothingConstraint.kt"); } + @TestMetadata("plusAssignInsideLambda.kt") + public void testPlusAssignInsideLambda() throws Exception { + runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");
diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index f0b653f..4caf0e9 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java
@@ -10749,6 +10749,11 @@ runTest("compiler/testData/codegen/box/inference/lastExpressionOfLambdaWithNothingConstraint.kt"); } + @TestMetadata("plusAssignInsideLambda.kt") + public void testPlusAssignInsideLambda() throws Exception { + runTest("compiler/testData/codegen/box/inference/plusAssignInsideLambda.kt"); + } + @TestMetadata("unsafeVarianceCodegen.kt") public void testUnsafeVarianceCodegen() throws Exception { runTest("compiler/testData/codegen/box/inference/unsafeVarianceCodegen.kt");