From 4f53b085ec6e6a02a9b93d10e9a6ac97df004b5c Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Wed, 4 May 2022 23:33:28 +0200 Subject: [PATCH] Do not override collection stub, if the override is suspend but the stub is not. The other way around should be OK. #KT-52237 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 12 +++++ .../jvm/lower/CollectionStubMethodLowering.kt | 1 + .../bridges/mapSuspendAbstractClear.kt | 54 +++++++++++++++++++ .../box/coroutines/bridges/mapSuspendClear.kt | 52 ++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 12 +++++ .../IrBlackBoxCodegenTestGenerated.java | 12 +++++ .../LightAnalysisModeTestGenerated.java | 10 ++++ .../js/test/JsCodegenBoxTestGenerated.java | 12 +++++ .../test/ir/IrJsCodegenBoxTestGenerated.java | 12 +++++ .../IrCodegenBoxWasmTestGenerated.java | 10 ++++ .../NativeCodegenBoxTestGenerated.java | 12 +++++ 11 files changed, 199 insertions(+) create mode 100644 compiler/testData/codegen/box/coroutines/bridges/mapSuspendAbstractClear.kt create mode 100644 compiler/testData/codegen/box/coroutines/bridges/mapSuspendClear.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index f7158989903..c4579a86856 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -10613,6 +10613,18 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT public void testLambdaWithMultipleParameters() throws Exception { runTest("compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters.kt"); } + + @Test + @TestMetadata("mapSuspendAbstractClear.kt") + public void testMapSuspendAbstractClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendAbstractClear.kt"); + } + + @Test + @TestMetadata("mapSuspendClear.kt") + public void testMapSuspendClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendClear.kt"); + } } @Nested diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt index cf6d086bde1..4e1fc6a9d3c 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/CollectionStubMethodLowering.kt @@ -205,6 +205,7 @@ internal class CollectionStubMethodLowering(val context: JvmBackendContext) : Cl if (superFun.name != overridingFun.name) return false if (superFun.typeParameters.size != overridingFun.typeParameters.size) return false if (superFun.valueParameters.size != overridingFun.valueParameters.size) return false + if (!superFun.isSuspend && overridingFun.isSuspend) return false val typeChecker = createTypeCheckerState(superFun, overridingFun) diff --git a/compiler/testData/codegen/box/coroutines/bridges/mapSuspendAbstractClear.kt b/compiler/testData/codegen/box/coroutines/bridges/mapSuspendAbstractClear.kt new file mode 100644 index 00000000000..7eb8f76eb71 --- /dev/null +++ b/compiler/testData/codegen/box/coroutines/bridges/mapSuspendAbstractClear.kt @@ -0,0 +1,54 @@ +// WITH_STDLIB + +import kotlin.coroutines.* + +abstract class SuspendingMutableMap( + protected val map: MutableMap, +) : Map { + abstract suspend fun clear() + + override val entries: Set> + get() = TODO("Not yet implemented") + override val keys: Set + get() = TODO("Not yet implemented") + override val size: Int + get() = TODO("Not yet implemented") + override val values: Collection + get() = TODO("Not yet implemented") + + override fun isEmpty(): Boolean { + TODO("Not yet implemented") + } + + override fun get(key: K): V? { + TODO("Not yet implemented") + } + + override fun containsValue(value: V): Boolean { + TODO("Not yet implemented") + } + + override fun containsKey(key: K): Boolean { + TODO("Not yet implemented") + } +} + +fun builder(c: suspend () -> Unit) { + c.startCoroutine(Continuation(EmptyCoroutineContext) { + it.getOrThrow() + }) +} + +fun box(): String { + builder { + val m = mutableMapOf(1 to 1) + val map = object: SuspendingMutableMap(m) { + override suspend fun clear() { + map.clear() + } + } + map.clear() + if (m.isNotEmpty()) error ("FAIL") + } + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/coroutines/bridges/mapSuspendClear.kt b/compiler/testData/codegen/box/coroutines/bridges/mapSuspendClear.kt new file mode 100644 index 00000000000..dd673b4ba8e --- /dev/null +++ b/compiler/testData/codegen/box/coroutines/bridges/mapSuspendClear.kt @@ -0,0 +1,52 @@ +// WITH_STDLIB + +import kotlin.coroutines.* + +class SuspendingMutableMap( + private val map: MutableMap, +) : Map { + suspend fun clear() { + map.clear() + } + + override val entries: Set> + get() = TODO("Not yet implemented") + override val keys: Set + get() = TODO("Not yet implemented") + override val size: Int + get() = TODO("Not yet implemented") + override val values: Collection + get() = TODO("Not yet implemented") + + override fun isEmpty(): Boolean { + TODO("Not yet implemented") + } + + override fun get(key: K): V? { + TODO("Not yet implemented") + } + + override fun containsValue(value: V): Boolean { + TODO("Not yet implemented") + } + + override fun containsKey(key: K): Boolean { + TODO("Not yet implemented") + } +} + +fun builder(c: suspend () -> Unit) { + c.startCoroutine(Continuation(EmptyCoroutineContext) { + it.getOrThrow() + }) +} + +fun box(): String { + builder { + val m = mutableMapOf(1 to 1) + val map = SuspendingMutableMap(m) + map.clear() + if (m.isNotEmpty()) error ("FAIL") + } + return "OK" +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index ce714d7ff71..909b44b8df1 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -10493,6 +10493,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { public void testLambdaWithMultipleParameters() throws Exception { runTest("compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters.kt"); } + + @Test + @TestMetadata("mapSuspendAbstractClear.kt") + public void testMapSuspendAbstractClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendAbstractClear.kt"); + } + + @Test + @TestMetadata("mapSuspendClear.kt") + public void testMapSuspendClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendClear.kt"); + } } @Nested diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 3b6d846036f..477da51916e 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -10613,6 +10613,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes public void testLambdaWithMultipleParameters() throws Exception { runTest("compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters.kt"); } + + @Test + @TestMetadata("mapSuspendAbstractClear.kt") + public void testMapSuspendAbstractClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendAbstractClear.kt"); + } + + @Test + @TestMetadata("mapSuspendClear.kt") + public void testMapSuspendClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendClear.kt"); + } } @Nested diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 6d4c04ff5cd..c055720246e 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -8275,6 +8275,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes public void testLambdaWithMultipleParameters() throws Exception { runTest("compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters.kt"); } + + @TestMetadata("mapSuspendAbstractClear.kt") + public void testMapSuspendAbstractClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendAbstractClear.kt"); + } + + @TestMetadata("mapSuspendClear.kt") + public void testMapSuspendClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendClear.kt"); + } } @TestMetadata("compiler/testData/codegen/box/coroutines/controlFlow") diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index 3f413fe87cf..8643afabeec 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -7549,6 +7549,18 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { public void testLambdaWithMultipleParameters() throws Exception { runTest("compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters.kt"); } + + @Test + @TestMetadata("mapSuspendAbstractClear.kt") + public void testMapSuspendAbstractClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendAbstractClear.kt"); + } + + @Test + @TestMetadata("mapSuspendClear.kt") + public void testMapSuspendClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendClear.kt"); + } } @Nested diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index 85c0ad5b8a0..91bfd3121a5 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -7591,6 +7591,18 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { public void testLambdaWithMultipleParameters() throws Exception { runTest("compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters.kt"); } + + @Test + @TestMetadata("mapSuspendAbstractClear.kt") + public void testMapSuspendAbstractClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendAbstractClear.kt"); + } + + @Test + @TestMetadata("mapSuspendClear.kt") + public void testMapSuspendClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendClear.kt"); + } } @Nested diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 79b9f4aad8b..ca50f66fe6c 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -6665,6 +6665,16 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest public void testLambdaWithMultipleParameters() throws Exception { runTest("compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters.kt"); } + + @TestMetadata("mapSuspendAbstractClear.kt") + public void testMapSuspendAbstractClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendAbstractClear.kt"); + } + + @TestMetadata("mapSuspendClear.kt") + public void testMapSuspendClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendClear.kt"); + } } @TestMetadata("compiler/testData/codegen/box/coroutines/controlFlow") diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index 5e416496798..b519076ecea 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -8435,6 +8435,18 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest public void testLambdaWithMultipleParameters() throws Exception { runTest("compiler/testData/codegen/box/coroutines/bridges/lambdaWithMultipleParameters.kt"); } + + @Test + @TestMetadata("mapSuspendAbstractClear.kt") + public void testMapSuspendAbstractClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendAbstractClear.kt"); + } + + @Test + @TestMetadata("mapSuspendClear.kt") + public void testMapSuspendClear() throws Exception { + runTest("compiler/testData/codegen/box/coroutines/bridges/mapSuspendClear.kt"); + } } @Nested