From 30ceb49442ec70985cc9a3c378a0c8386f6c9ba8 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 15 Nov 2021 15:51:28 +0300 Subject: [PATCH] JVM_IR KT-48945 generate special bridge with unsubstituted signature --- .../FirBlackBoxCodegenTestGenerated.java | 24 ++ .../common/lower/SpecialBridgeMethods.kt | 7 +- .../backend/jvm/lower/BridgeLowering.kt | 31 ++- .../kotlin/backend/jvm/SpecialBridge.kt | 5 + .../backend/jvm/caches/BridgeLoweringCache.kt | 21 +- .../codegen/box/collections/kt48945.kt | 16 ++ .../codegen/box/collections/kt48945a.kt | 17 ++ .../codegen/box/collections/kt48945b.kt | 27 ++ .../codegen/box/collections/kt48945c.kt | 23 ++ .../abstractMapRedefiningGetAny_ir.txt | 4 +- .../byteShortMap_ir.txt | 2 +- .../byteShortMutableMap_ir.txt | 4 +- .../numberStringMap_ir.txt | 2 +- .../numberStringMutableMap_ir.txt | 4 +- .../specializedGenericMap_ir.txt | 2 +- .../collectionByDelegation2WithFullJdk_ir.txt | 2 +- .../collectionByDelegation2_ir.txt | 2 +- .../collectionByDelegation3WithFullJdk_ir.txt | 2 +- .../collectionByDelegation3_ir.txt | 2 +- .../collectionsWithFullJdk_ir.txt | 2 +- .../inheritingFromAbstractMap_ir.txt | 3 + .../mapOfPrimitivesFullJdk_ir.txt | 2 +- .../inlineCollectionOfInlineClass/map_ir.txt | 4 +- .../mutableMap_ir.txt | 4 +- .../bytecodeListing/specialBridges/kt41123.kt | 8 - .../specialBridges/kt41123_ir.txt | 2 + .../bytecodeListing/specialBridges/kt48945.kt | 73 ++++++ .../specialBridges/kt48945.txt | 206 +++++++++++++++ .../specialBridges/kt48945_ir.txt | 238 ++++++++++++++++++ .../signatures/nonGenericClass_ir.txt | 8 +- .../codegen/BlackBoxCodegenTestGenerated.java | 24 ++ .../codegen/BytecodeListingTestGenerated.java | 6 + .../IrBlackBoxCodegenTestGenerated.java | 24 ++ .../IrBytecodeListingTestGenerated.java | 6 + .../LightAnalysisModeTestGenerated.java | 20 ++ .../NativeExtBlackBoxTestGenerated.java | 24 ++ 36 files changed, 809 insertions(+), 42 deletions(-) create mode 100644 compiler/testData/codegen/box/collections/kt48945.kt create mode 100644 compiler/testData/codegen/box/collections/kt48945a.kt create mode 100644 compiler/testData/codegen/box/collections/kt48945b.kt create mode 100644 compiler/testData/codegen/box/collections/kt48945c.kt create mode 100644 compiler/testData/codegen/bytecodeListing/specialBridges/kt48945.kt create mode 100644 compiler/testData/codegen/bytecodeListing/specialBridges/kt48945.txt create mode 100644 compiler/testData/codegen/bytecodeListing/specialBridges/kt48945_ir.txt 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 86f37e5f180..75c081d7667 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 @@ -6556,6 +6556,30 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/collections/kt44233.kt"); } + @Test + @TestMetadata("kt48945.kt") + public void testKt48945() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945.kt"); + } + + @Test + @TestMetadata("kt48945a.kt") + public void testKt48945a() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945a.kt"); + } + + @Test + @TestMetadata("kt48945b.kt") + public void testKt48945b() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945b.kt"); + } + + @Test + @TestMetadata("kt48945c.kt") + public void testKt48945c() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945c.kt"); + } + @Test @TestMetadata("mutableList.kt") public void testMutableList() throws Exception { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SpecialBridgeMethods.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SpecialBridgeMethods.kt index 23b3f52def0..ed520e4bb97 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SpecialBridgeMethods.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/SpecialBridgeMethods.kt @@ -24,6 +24,7 @@ data class SpecialMethodWithDefaultInfo( val defaultValueGenerator: (IrSimpleFunction) -> IrExpression, val argumentsToCheck: Int, val needsGenericSignature: Boolean = false, + val needsUnsubstitutedBridge: Boolean = false ) class BuiltInWithDifferentJvmName( @@ -78,11 +79,11 @@ class SpecialBridgeMethods(val context: CommonBackendContext) { makeDescription(StandardNames.FqNames.list, "lastIndexOf", 1) to SpecialMethodWithDefaultInfo(::constMinusOne, 1), makeDescription(StandardNames.FqNames.map, "getOrDefault", 2) to - SpecialMethodWithDefaultInfo(::getSecondArg, 1, needsGenericSignature = true), + SpecialMethodWithDefaultInfo(::getSecondArg, 1, needsGenericSignature = true, needsUnsubstitutedBridge = true), makeDescription(StandardNames.FqNames.map, "get", 1) to - SpecialMethodWithDefaultInfo(::constNull, 1, needsGenericSignature = true), + SpecialMethodWithDefaultInfo(::constNull, 1, needsGenericSignature = true, needsUnsubstitutedBridge = true), makeDescription(StandardNames.FqNames.mutableMap, "remove", 1) to - SpecialMethodWithDefaultInfo(::constNull, 1, needsGenericSignature = true) + SpecialMethodWithDefaultInfo(::constNull, 1, needsGenericSignature = true, needsUnsubstitutedBridge = true) ) private val specialProperties = mapOf( diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt index 3789703f7d2..2db3d8ff10f 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt @@ -265,18 +265,35 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass irClass.addSpecialBridge(superBridge, superTarget) } } - else -> irFunction + else -> { + irFunction + } } blacklist += bridgeTarget.jvmMethod } - if (irClass.functions.any { !it.isFakeOverride && it.name == irFunction.name && specialBridge.signature == it.jvmMethod }) { - return irFunction + // Add special bridge with unsubstituted signature (as generated by old JVM back-end) if required. + // According to KT-40277 we generate special bridges for 'get', 'getOrDefault', and 'remove' with substituted return type. + // However, this introduces performance regressions and changes in behavior if cases like KT-48945 + // (where a Kotlin class implements a read-only collection interface and extends a Java collection class). + val unsubstitutedSpecialBridge = specialBridge.unsubstitutedSpecialBridge + if (unsubstitutedSpecialBridge != null && + irClass.functions.none { it.isClashingWithPotentialBridge(irFunction.name, unsubstitutedSpecialBridge.signature) } + ) { + blacklist += unsubstitutedSpecialBridge.signature + // TODO what should be the special bridge target if we CAN NOT add a substituted special bridge + // (below, clashes with existing method), + // but CAN add an unsubstituted special bridge (here)? + irClass.addSpecialBridge(unsubstitutedSpecialBridge, bridgeTarget) } - blacklist += specialBridge.signature - return irClass.addSpecialBridge(specialBridge, bridgeTarget) + if (irClass.functions.none { it.isClashingWithPotentialBridge(irFunction.name, specialBridge.signature) }) { + blacklist += specialBridge.signature + return irClass.addSpecialBridge(specialBridge, bridgeTarget) + } + + return irFunction } val specialBridgeTarget = getSpecialBridgeTargetAddingExtraBridges() @@ -339,6 +356,10 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass .forEach { irClass.addBridge(it, bridgeTarget) } } + private fun IrSimpleFunction.isClashingWithPotentialBridge(name: Name, signature: Method): Boolean = + (!this.isFakeOverride || this.modality == Modality.FINAL) && this.name == name && this.jvmMethod == signature + + // Returns the special bridge overridden by the current methods if it exists. private val IrSimpleFunction.specialBridgeOrNull: SpecialBridge? get() = context.bridgeLoweringCache.computeSpecialBridge(this) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/SpecialBridge.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/SpecialBridge.kt index 4711923320a..46797f95575 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/SpecialBridge.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/SpecialBridge.kt @@ -42,4 +42,9 @@ data class SpecialBridge( val isFinal: Boolean = true, val isSynthetic: Boolean = false, val isOverriding: Boolean = true, + // 'true' if we also should produce a synthetic bridge with unsubstituted signature. + // NB this is passed down the hierarchy to the point where 'unsubstitutedSpecialBridge' is created, + // see BridgeLoweringCache::computeSpecialBridge + val needsUnsubstitutedBridge: Boolean = false, + val unsubstitutedSpecialBridge: SpecialBridge? = null ) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/caches/BridgeLoweringCache.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/caches/BridgeLoweringCache.kt index cb03f005a9a..c16fc2707db 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/caches/BridgeLoweringCache.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/caches/BridgeLoweringCache.kt @@ -54,7 +54,10 @@ class BridgeLoweringCache(private val context: JvmBackendContext) { val specialMethodInfo = specialBridgeMethods.getSpecialMethodInfo(function) if (specialMethodInfo != null) return SpecialBridge( - function, computeJvmMethod(function), specialMethodInfo.needsGenericSignature, methodInfo = specialMethodInfo + overridden = function, signature = computeJvmMethod(function), + needsGenericSignature = specialMethodInfo.needsGenericSignature, + methodInfo = specialMethodInfo, + needsUnsubstitutedBridge = specialMethodInfo.needsUnsubstitutedBridge ) val specialBuiltInInfo = specialBridgeMethods.getBuiltInWithDifferentJvmName(function) @@ -87,10 +90,22 @@ class BridgeLoweringCache(private val context: JvmBackendContext) { parent = function.parent } + val substitutedOverrideSignature = computeJvmMethod(substitutedOverride) + val unsubstitutedSpecialBridge = + when { + specialBridge.unsubstitutedSpecialBridge != null -> + specialBridge.unsubstitutedSpecialBridge + specialBridge.needsUnsubstitutedBridge && specialBridge.signature != substitutedOverrideSignature -> + specialBridge.copy(isSynthetic = true) + else -> + null + } + return specialBridge.copy( - signature = computeJvmMethod(substitutedOverride), + signature = substitutedOverrideSignature, substitutedParameterTypes = substitutedParameterTypes, - substitutedReturnType = function.returnType + substitutedReturnType = function.returnType, + unsubstitutedSpecialBridge = unsubstitutedSpecialBridge ) } diff --git a/compiler/testData/codegen/box/collections/kt48945.kt b/compiler/testData/codegen/box/collections/kt48945.kt new file mode 100644 index 00000000000..0a2f7ed648b --- /dev/null +++ b/compiler/testData/codegen/box/collections/kt48945.kt @@ -0,0 +1,16 @@ +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// IGNORE_BACKEND_FIR: JVM_IR +// IGNORE_BACKEND: ANDROID +// ^ NSME: java.util.AbstractMap.remove +// FULL_JDK + +class Test : Map, java.util.AbstractMap() { + override val entries: MutableSet> + get() = throw Exception() +} + +fun box(): String { + Test().remove(null, "") + return "OK" +} diff --git a/compiler/testData/codegen/box/collections/kt48945a.kt b/compiler/testData/codegen/box/collections/kt48945a.kt new file mode 100644 index 00000000000..4e4f58b32cb --- /dev/null +++ b/compiler/testData/codegen/box/collections/kt48945a.kt @@ -0,0 +1,17 @@ +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// IGNORE_BACKEND_FIR: JVM_IR +// IGNORE_BACKEND: ANDROID +// ^ NSME: java.util.AbstractMap.remove +// FULL_JDK +interface MSS : Map + +class Test : MSS, java.util.AbstractMap() { + override val entries: MutableSet> + get() = throw Exception() +} + +fun box(): String { + Test().remove(null, "") + return "OK" +} diff --git a/compiler/testData/codegen/box/collections/kt48945b.kt b/compiler/testData/codegen/box/collections/kt48945b.kt new file mode 100644 index 00000000000..f0d9222f375 --- /dev/null +++ b/compiler/testData/codegen/box/collections/kt48945b.kt @@ -0,0 +1,27 @@ +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// IGNORE_BACKEND_FIR: JVM_IR +// IGNORE_BACKEND: ANDROID +// ^ NSME: java.util.AbstractMap.remove +// FULL_JDK + +// FILE: kt48945b.kt +interface MSS : Map + +class Test : MSS, JASM() { + override val entries: MutableSet> + get() = throw Exception() +} + +fun box(): String { + Test().remove(null, "") + return "OK" +} + +// FILE: JASM.java +public abstract class JASM extends java.util.AbstractMap { + @Override + public V get(Object key) { + return super.get(key); + } +} diff --git a/compiler/testData/codegen/box/collections/kt48945c.kt b/compiler/testData/codegen/box/collections/kt48945c.kt new file mode 100644 index 00000000000..09ea4d384a1 --- /dev/null +++ b/compiler/testData/codegen/box/collections/kt48945c.kt @@ -0,0 +1,23 @@ +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// IGNORE_BACKEND_FIR: JVM_IR +// IGNORE_BACKEND: ANDROID +// ^ NSME: java.util.AbstractMap.remove +// FULL_JDK + +// FILE: kt48945b.kt +interface MSS : Map + +class Test : MSS, JASM() { + override val entries: MutableSet> + get() = throw Exception() +} + +fun box(): String { + Test().remove(null, "") + return "OK" +} + +// FILE: JASM.java +public abstract class JASM extends java.util.AbstractMap { +} diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractMapRedefiningGetAny_ir.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractMapRedefiningGetAny_ir.txt index 74b636c0b90..255ef3c092d 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractMapRedefiningGetAny_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractMapRedefiningGetAny_ir.txt @@ -9,14 +9,14 @@ public abstract class MindMap { public bridge final method entrySet(): java.util.Set public final @org.jetbrains.annotations.Nullable method get(@org.jetbrains.annotations.Nullable p0: java.lang.Object): java.lang.String public abstract method get(p0: int): java.lang.String - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public abstract method getEntries(): java.util.Set public abstract method getKeys(): java.util.Set public abstract method getSize(): int public abstract method getValues(): java.util.Collection public bridge final method keySet(): java.util.Set public abstract method remove(p0: int): java.lang.String - public synthetic bridge method remove(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method remove(p0: java.lang.Object): java.lang.Object public bridge final method remove(p0: java.lang.Object): java.lang.String public bridge final method size(): int public bridge final method values(): java.util.Collection diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/byteShortMap_ir.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/byteShortMap_ir.txt index ee8e520495e..313323c379f 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/byteShortMap_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/byteShortMap_ir.txt @@ -12,7 +12,7 @@ public abstract class method containsValue(p0: java.lang.Object): boolean public abstract method containsValue(p0: short): boolean public abstract method get(p0: byte): java.lang.Short - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public bridge final method get(p0: java.lang.Object): java.lang.Short public abstract method getEntries(): java.util.Set public abstract method getKeys(): java.util.Set diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/byteShortMutableMap_ir.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/byteShortMutableMap_ir.txt index d89087647aa..df78d8877f5 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/byteShortMutableMap_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/byteShortMutableMap_ir.txt @@ -10,14 +10,14 @@ public abstract class method containsValue(p0: java.lang.Object): boolean public abstract method containsValue(p0: short): boolean public abstract method get(p0: byte): java.lang.Short - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public bridge final method get(p0: java.lang.Object): java.lang.Short public abstract method getEntries(): java.util.Set public abstract method getKeys(): java.util.Set public abstract method getSize(): int public abstract method getValues(): java.util.Collection public abstract method remove(p0: byte): java.lang.Short - public synthetic bridge method remove(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method remove(p0: java.lang.Object): java.lang.Object public bridge final method remove(p0: java.lang.Object): java.lang.Short public bridge final method size(): int } diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/numberStringMap_ir.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/numberStringMap_ir.txt index 4043241f3cf..dfd13f242f8 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/numberStringMap_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/numberStringMap_ir.txt @@ -12,7 +12,7 @@ public abstract class method containsValue(p0: java.lang.Object): boolean public abstract method containsValue(p0: java.lang.String): boolean public abstract method get(p0: java.lang.Number): java.lang.String - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public bridge final method get(p0: java.lang.Object): java.lang.String public abstract method getEntries(): java.util.Set public abstract method getKeys(): java.util.Set diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/numberStringMutableMap_ir.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/numberStringMutableMap_ir.txt index 83d426ee4e3..65419d93100 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/numberStringMutableMap_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/numberStringMutableMap_ir.txt @@ -10,14 +10,14 @@ public abstract class method containsValue(p0: java.lang.Object): boolean public abstract method containsValue(p0: java.lang.String): boolean public abstract method get(p0: java.lang.Number): java.lang.String - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public bridge final method get(p0: java.lang.Object): java.lang.String public abstract method getEntries(): java.util.Set public abstract method getKeys(): java.util.Set public abstract method getSize(): int public abstract method getValues(): java.util.Collection public abstract method remove(p0: java.lang.Number): java.lang.String - public synthetic bridge method remove(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method remove(p0: java.lang.Object): java.lang.Object public bridge final method remove(p0: java.lang.Object): java.lang.String public bridge final method size(): int } diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/specializedGenericMap_ir.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/specializedGenericMap_ir.txt index c3b0bc3d955..dd774596503 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/specializedGenericMap_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/abstractStubSignatures/specializedGenericMap_ir.txt @@ -25,6 +25,6 @@ public abstract class;> Numbe public bridge final method containsValue(p0: java.lang.Object): boolean public abstract method containsValue(p0: java.lang.String): boolean public abstract method get(p0: java.lang.Number): java.lang.String - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public bridge final method get(p0: java.lang.Object): java.lang.String } diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation2WithFullJdk_ir.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation2WithFullJdk_ir.txt index 0c5d1000b3b..954808903b8 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation2WithFullJdk_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation2WithFullJdk_ir.txt @@ -169,7 +169,7 @@ public final class DStringMap { public bridge final method entrySet(): java.util.Set public @org.jetbrains.annotations.Nullable method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Number public bridge final method get(p0: java.lang.Object): java.lang.Number - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set public @org.jetbrains.annotations.NotNull method getKeys(): java.util.Set public method getSize(): int diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation2_ir.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation2_ir.txt index 99cb2564282..0469597759f 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation2_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation2_ir.txt @@ -158,7 +158,7 @@ public final class DStringMap { public bridge final method entrySet(): java.util.Set public @org.jetbrains.annotations.Nullable method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Number public bridge final method get(p0: java.lang.Object): java.lang.Number - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set public @org.jetbrains.annotations.NotNull method getKeys(): java.util.Set public method getSize(): int diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation3WithFullJdk_ir.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation3WithFullJdk_ir.txt index 543659c413e..fe01b2df9fc 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation3WithFullJdk_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation3WithFullJdk_ir.txt @@ -169,7 +169,7 @@ public final class DIntMap { public bridge final method entrySet(): java.util.Set public @org.jetbrains.annotations.Nullable method get(p0: int): java.lang.Double public bridge final method get(p0: java.lang.Object): java.lang.Double - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set public @org.jetbrains.annotations.NotNull method getKeys(): java.util.Set public method getSize(): int diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation3_ir.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation3_ir.txt index 54b2f1257dd..8de73fec565 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation3_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionByDelegation3_ir.txt @@ -158,7 +158,7 @@ public final class DIntMap { public bridge final method entrySet(): java.util.Set public @org.jetbrains.annotations.Nullable method get(p0: int): java.lang.Double public bridge final method get(p0: java.lang.Object): java.lang.Double - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set public @org.jetbrains.annotations.NotNull method getKeys(): java.util.Set public method getSize(): int diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionsWithFullJdk_ir.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionsWithFullJdk_ir.txt index 7f923f44a62..7fb75fbd119 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionsWithFullJdk_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/collectionsWithFullJdk_ir.txt @@ -99,7 +99,7 @@ public abstract class AbstractMap { public bridge final method containsValue(p0: java.lang.Object): boolean public bridge final method entrySet(): java.util.Set public bridge final method get(p0: java.lang.Object): java.lang.Number - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public abstract method get(p0: java.lang.String): java.lang.Number public abstract method getEntries(): java.util.Set public abstract method getKeys(): java.util.Set diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/inheritingFromAbstractMap_ir.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/inheritingFromAbstractMap_ir.txt index b9b79d2fef4..a06280e405e 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/inheritingFromAbstractMap_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/inheritingFromAbstractMap_ir.txt @@ -7,8 +7,10 @@ public abstract class AMMapSD { public bridge method containsValue(p0: double): boolean public bridge final method containsValue(p0: java.lang.Object): boolean public bridge final method get(p0: java.lang.Object): java.lang.Double + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public bridge method get(p0: java.lang.String): java.lang.Double public bridge final method remove(p0: java.lang.Object): java.lang.Double + public synthetic bridge final method remove(p0: java.lang.Object): java.lang.Object public bridge method remove(p0: java.lang.String): java.lang.Double } @@ -21,5 +23,6 @@ public abstract class AMapSD { public bridge method containsValue(p0: double): boolean public bridge final method containsValue(p0: java.lang.Object): boolean public bridge final method get(p0: java.lang.Object): java.lang.Double + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public bridge method get(p0: java.lang.String): java.lang.Double } diff --git a/compiler/testData/codegen/bytecodeListing/collectionStubs/mapOfPrimitivesFullJdk_ir.txt b/compiler/testData/codegen/bytecodeListing/collectionStubs/mapOfPrimitivesFullJdk_ir.txt index 00e440066d5..028562f9a3f 100644 --- a/compiler/testData/codegen/bytecodeListing/collectionStubs/mapOfPrimitivesFullJdk_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/collectionStubs/mapOfPrimitivesFullJdk_ir.txt @@ -16,7 +16,7 @@ public abstract class IntIntMap { public bridge final method entrySet(): java.util.Set public abstract method get(p0: int): java.lang.Integer public bridge final method get(p0: java.lang.Object): java.lang.Integer - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public abstract method getEntries(): java.util.Set public abstract method getKeys(): java.util.Set public abstract method getSize(): int diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/map_ir.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/map_ir.txt index da9c4407692..ac55d085053 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/map_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/map_ir.txt @@ -50,7 +50,7 @@ public final class InlineMap { public static method equals-impl(p0: java.util.Map, p1: java.lang.Object): boolean public final static method equals-impl0(p0: java.util.Map, p1: java.util.Map): boolean public bridge final method get(p0: java.lang.Object): IV - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public method get-qgyy0Jc(p0: int): IV public static method get-qgyy0Jc(p0: java.util.Map, p1: int): IV public method getEntries(): java.util.Set @@ -70,7 +70,7 @@ public final class InlineMap { public method put-t80dRTo(p0: int, p1: double): IV public method putAll(p0: java.util.Map): void public bridge final method remove(p0: java.lang.Object): IV - public synthetic bridge method remove(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method remove(p0: java.lang.Object): java.lang.Object public method remove-TbaaF6U(p0: java.lang.Object): IV public synthetic bridge method size(): int public method toString(): java.lang.String diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMap_ir.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMap_ir.txt index c879e3ba8fe..06b606974e2 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMap_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMap_ir.txt @@ -51,7 +51,7 @@ public final class InlineMutableMap { public static method equals-impl(p0: java.util.Map, p1: java.lang.Object): boolean public final static method equals-impl0(p0: java.util.Map, p1: java.util.Map): boolean public bridge final method get(p0: java.lang.Object): IV - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public method get-qgyy0Jc(p0: int): IV public static method get-qgyy0Jc(p0: java.util.Map, p1: int): IV public method getEntries(): java.util.Set @@ -73,7 +73,7 @@ public final class InlineMutableMap { public method putAll(p0: java.util.Map): void public static method putAll-impl(p0: java.util.Map, p1: java.util.Map): void public bridge final method remove(p0: java.lang.Object): IV - public synthetic bridge method remove(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method remove(p0: java.lang.Object): java.lang.Object public method remove-qgyy0Jc(p0: int): IV public static method remove-qgyy0Jc(p0: java.util.Map, p1: int): IV public synthetic bridge method size(): int diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/kt41123.kt b/compiler/testData/codegen/bytecodeListing/specialBridges/kt41123.kt index 0ef0e1d178f..3be9464c34b 100644 --- a/compiler/testData/codegen/bytecodeListing/specialBridges/kt41123.kt +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/kt41123.kt @@ -1,13 +1,5 @@ // WITH_STDLIB -// TODO KT-42391 -// JVM: -// public bridge final method get(p0: java.lang.Object): java.lang.Object -// public bridge final method remove(p0: java.lang.Object): java.lang.Object -// JVM_IR: -// public bridge final method get(p0: java.lang.Object): java.lang.String -// public bridge final method remove(p0: java.lang.Object): java.lang.String - open class A : HashMap() class B : A() \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/kt41123_ir.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/kt41123_ir.txt index b84f5bfbf91..cc571357491 100644 --- a/compiler/testData/codegen/bytecodeListing/specialBridges/kt41123_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/kt41123_ir.txt @@ -7,6 +7,7 @@ public class A { public bridge final method containsValue(p0: java.lang.Object): boolean public bridge method containsValue(p0: java.lang.String): boolean public bridge final method entrySet(): java.util.Set + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public bridge final method get(p0: java.lang.Object): java.lang.String public bridge method get(p0: java.lang.String): java.lang.String public bridge method getEntries(): java.util.Set @@ -14,6 +15,7 @@ public class A { public bridge method getSize(): int public bridge method getValues(): java.util.Collection public bridge final method keySet(): java.util.Set + public synthetic bridge final method remove(p0: java.lang.Object): java.lang.Object public bridge final method remove(p0: java.lang.Object): java.lang.String public bridge method remove(p0: java.lang.String): java.lang.String public bridge final method size(): int diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/kt48945.kt b/compiler/testData/codegen/bytecodeListing/specialBridges/kt48945.kt new file mode 100644 index 00000000000..d88eaee8305 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/kt48945.kt @@ -0,0 +1,73 @@ +// TARGET_BACKEND: JVM +// FULL_JDK + +// FILE: kt48945.kt +interface MSS : Map +interface GM : Map +interface SMSS : GM + +class Test_MapStringString_AbstractMapStringString : + Map, java.util.AbstractMap() +{ + override val entries: MutableSet> + get() = TODO() +} + +class Test_MapStringString_JMapFinalRemove : + Map, JMapFinalRemove() +{ + override val entries: MutableSet> + get() = TODO() +} + +class Test_MSS_AbstractMapStringString : + MSS, java.util.AbstractMap() +{ + override val entries: MutableSet> + get() = TODO() +} + +class Test_MSS_JMapFinalRemove : + MSS, JMapFinalRemove() +{ + override val entries: MutableSet> + get() = TODO() +} + +class Test_GMStringString_AbstractMapStringString : + GM, java.util.AbstractMap() +{ + override val entries: MutableSet> + get() = TODO() +} + +class Test_GMStringString_JMapFinalRemove : + GM, JMapFinalRemove() +{ + override val entries: MutableSet> + get() = TODO() +} + +class Test_SMSS_AbstractMapStringString : + SMSS, java.util.AbstractMap() +{ + override val entries: MutableSet> + get() = TODO() +} + +class Test_SMSS_JMapFinalRemove : + SMSS, JMapFinalRemove() +{ + override val entries: MutableSet> + get() = TODO() +} + +// FILE: JMapFinalRemove.java +import java.util.AbstractMap; + +public abstract class JMapFinalRemove extends AbstractMap { + @Override + public final String remove(Object key) { + return super.remove(key); + } +} diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/kt48945.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/kt48945.txt new file mode 100644 index 00000000000..c800a29405c --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/kt48945.txt @@ -0,0 +1,206 @@ +@kotlin.Metadata +public interface GM { + // source: 'kt48945.kt' +} + +@kotlin.Metadata +public interface MSS { + // source: 'kt48945.kt' +} + +@kotlin.Metadata +public interface SMSS { + // source: 'kt48945.kt' +} + +@kotlin.Metadata +public final class Test_GMStringString_AbstractMapStringString { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public bridge final method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String): java.lang.String + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_GMStringString_JMapFinalRemove { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public bridge final method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String): java.lang.String + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_MSS_AbstractMapStringString { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public bridge final method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String): java.lang.String + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_MSS_JMapFinalRemove { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public bridge final method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String): java.lang.String + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_MapStringString_AbstractMapStringString { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public bridge final method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String): java.lang.String + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_MapStringString_JMapFinalRemove { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public bridge final method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String): java.lang.String + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_SMSS_AbstractMapStringString { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public bridge final method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String): java.lang.String + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_SMSS_JMapFinalRemove { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public bridge final method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String): java.lang.String + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/kt48945_ir.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/kt48945_ir.txt new file mode 100644 index 00000000000..f2d0e343050 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/kt48945_ir.txt @@ -0,0 +1,238 @@ +@kotlin.Metadata +public interface GM { + // source: 'kt48945.kt' +} + +@kotlin.Metadata +public interface MSS { + // source: 'kt48945.kt' +} + +@kotlin.Metadata +public interface SMSS { + // source: 'kt48945.kt' +} + +@kotlin.Metadata +public final class Test_GMStringString_AbstractMapStringString { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge final method get(p0: java.lang.Object): java.lang.String + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public synthetic bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.String): java.lang.String + public bridge method getOrDefault(p0: java.lang.String, p1: java.lang.String): java.lang.String + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public synthetic bridge final method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object): java.lang.String + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String): java.lang.String + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_GMStringString_JMapFinalRemove { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge final method get(p0: java.lang.Object): java.lang.String + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public synthetic bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.String): java.lang.String + public bridge method getOrDefault(p0: java.lang.String, p1: java.lang.String): java.lang.String + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public synthetic bridge method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_MSS_AbstractMapStringString { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge final method get(p0: java.lang.Object): java.lang.String + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public synthetic bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.String): java.lang.String + public bridge method getOrDefault(p0: java.lang.String, p1: java.lang.String): java.lang.String + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public synthetic bridge final method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object): java.lang.String + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String): java.lang.String + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_MSS_JMapFinalRemove { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge final method get(p0: java.lang.Object): java.lang.String + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public synthetic bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.String): java.lang.String + public bridge method getOrDefault(p0: java.lang.String, p1: java.lang.String): java.lang.String + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public synthetic bridge method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_MapStringString_AbstractMapStringString { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge final method get(p0: java.lang.Object): java.lang.String + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public synthetic bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.String): java.lang.String + public bridge method getOrDefault(p0: java.lang.String, p1: java.lang.String): java.lang.String + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public synthetic bridge final method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object): java.lang.String + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String): java.lang.String + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_MapStringString_JMapFinalRemove { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge final method get(p0: java.lang.Object): java.lang.String + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public synthetic bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.String): java.lang.String + public bridge method getOrDefault(p0: java.lang.String, p1: java.lang.String): java.lang.String + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public synthetic bridge method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_SMSS_AbstractMapStringString { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge final method get(p0: java.lang.Object): java.lang.String + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public synthetic bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.String): java.lang.String + public bridge method getOrDefault(p0: java.lang.String, p1: java.lang.String): java.lang.String + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public synthetic bridge final method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object): java.lang.String + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String): java.lang.String + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} + +@kotlin.Metadata +public final class Test_SMSS_JMapFinalRemove { + // source: 'kt48945.kt' + public method (): void + public bridge final method containsKey(p0: java.lang.Object): boolean + public bridge method containsKey(p0: java.lang.String): boolean + public bridge final method containsValue(p0: java.lang.Object): boolean + public bridge method containsValue(p0: java.lang.String): boolean + public bridge final method entrySet(): java.util.Set + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object + public bridge final method get(p0: java.lang.Object): java.lang.String + public bridge method get(p0: java.lang.String): java.lang.String + public @org.jetbrains.annotations.NotNull method getEntries(): java.util.Set + public bridge method getKeys(): java.util.Set + public synthetic bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public bridge final method getOrDefault(p0: java.lang.Object, p1: java.lang.String): java.lang.String + public bridge method getOrDefault(p0: java.lang.String, p1: java.lang.String): java.lang.String + public bridge method getSize(): int + public bridge method getValues(): java.util.Collection + public bridge final method keySet(): java.util.Set + public synthetic bridge method remove(p0: java.lang.Object): java.lang.Object + public bridge final method remove(p0: java.lang.Object, p1: java.lang.Object): boolean + public bridge method remove(p0: java.lang.String, p1: java.lang.String): boolean + public bridge final method size(): int + public bridge final method values(): java.util.Collection +} diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass_ir.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass_ir.txt index c628365b364..37140cd9ac4 100644 --- a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass_ir.txt @@ -15,14 +15,14 @@ public abstract class method containsValue(@org.jetbrains.annotations.NotNull p0: java.lang.String): boolean public bridge final method containsValue(p0: java.lang.Object): boolean public @org.jetbrains.annotations.Nullable method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.String - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public bridge final method get(p0: java.lang.Object): java.lang.String public method getSize(): int public method isEmpty(): boolean public @org.jetbrains.annotations.Nullable method put(@org.jetbrains.annotations.NotNull p0: java.lang.String, @org.jetbrains.annotations.NotNull p1: java.lang.String): java.lang.String public synthetic bridge method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object public @org.jetbrains.annotations.Nullable method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.String - public synthetic bridge method remove(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method remove(p0: java.lang.Object): java.lang.Object public bridge final method remove(p0: java.lang.Object): java.lang.String public bridge final method size(): int private synthetic final field ;> $$delegate_0: java.util.HashMap @@ -45,14 +45,14 @@ public final class method containsValue(@org.jetbrains.annotations.NotNull p0: java.lang.String): boolean public bridge final method containsValue(p0: java.lang.Object): boolean public @org.jetbrains.annotations.Nullable method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.String - public synthetic bridge method get(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method get(p0: java.lang.Object): java.lang.Object public bridge final method get(p0: java.lang.Object): java.lang.String public method getSize(): int public method isEmpty(): boolean public @org.jetbrains.annotations.Nullable method put(@org.jetbrains.annotations.NotNull p0: java.lang.String, @org.jetbrains.annotations.NotNull p1: java.lang.String): java.lang.String public synthetic bridge method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object public @org.jetbrains.annotations.Nullable method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.String - public synthetic bridge method remove(p0: java.lang.Object): java.lang.Object + public synthetic bridge final method remove(p0: java.lang.Object): java.lang.Object public bridge final method remove(p0: java.lang.Object): java.lang.String public bridge final method size(): int private synthetic final field ;> $$delegate_0: java.util.HashMap 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 92fc7dc3dc4..23f717259ba 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 @@ -6484,6 +6484,30 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/collections/kt44233.kt"); } + @Test + @TestMetadata("kt48945.kt") + public void testKt48945() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945.kt"); + } + + @Test + @TestMetadata("kt48945a.kt") + public void testKt48945a() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945a.kt"); + } + + @Test + @TestMetadata("kt48945b.kt") + public void testKt48945b() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945b.kt"); + } + + @Test + @TestMetadata("kt48945c.kt") + public void testKt48945c() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945c.kt"); + } + @Test @TestMetadata("mutableList.kt") public void testMutableList() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeListingTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeListingTestGenerated.java index 016e2528b98..3bb03df737f 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BytecodeListingTestGenerated.java @@ -2248,6 +2248,12 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { runTest("compiler/testData/codegen/bytecodeListing/specialBridges/kt41123.kt"); } + @Test + @TestMetadata("kt48945.kt") + public void testKt48945() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/specialBridges/kt48945.kt"); + } + @Test @TestMetadata("mutableCollectionOfPrimitive.kt") public void testMutableCollectionOfPrimitive() throws Exception { 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 4206cc3fa8e..095ce666a8c 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 @@ -6556,6 +6556,30 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/collections/kt44233.kt"); } + @Test + @TestMetadata("kt48945.kt") + public void testKt48945() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945.kt"); + } + + @Test + @TestMetadata("kt48945a.kt") + public void testKt48945a() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945a.kt"); + } + + @Test + @TestMetadata("kt48945b.kt") + public void testKt48945b() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945b.kt"); + } + + @Test + @TestMetadata("kt48945c.kt") + public void testKt48945c() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945c.kt"); + } + @Test @TestMetadata("mutableList.kt") public void testMutableList() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeListingTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeListingTestGenerated.java index 749c32566ca..0ba0f2f031d 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeListingTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeListingTestGenerated.java @@ -2296,6 +2296,12 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes runTest("compiler/testData/codegen/bytecodeListing/specialBridges/kt41123.kt"); } + @Test + @TestMetadata("kt48945.kt") + public void testKt48945() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/specialBridges/kt48945.kt"); + } + @Test @TestMetadata("mutableCollectionOfPrimitive.kt") public void testMutableCollectionOfPrimitive() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 0e516b954e9..2d86bc6728b 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -5655,6 +5655,26 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/collections/kt44233.kt"); } + @TestMetadata("kt48945.kt") + public void testKt48945() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945.kt"); + } + + @TestMetadata("kt48945a.kt") + public void testKt48945a() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945a.kt"); + } + + @TestMetadata("kt48945b.kt") + public void testKt48945b() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945b.kt"); + } + + @TestMetadata("kt48945c.kt") + public void testKt48945c() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945c.kt"); + } + @TestMetadata("mutableList.kt") public void testMutableList() throws Exception { runTest("compiler/testData/codegen/box/collections/mutableList.kt"); diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java index ba2f8014faf..cba67db82d4 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java @@ -6630,6 +6630,30 @@ public class NativeExtBlackBoxTestGenerated extends AbstractNativeBlackBoxTest { runTest("compiler/testData/codegen/box/collections/kt44233.kt"); } + @Test + @TestMetadata("kt48945.kt") + public void testKt48945() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945.kt"); + } + + @Test + @TestMetadata("kt48945a.kt") + public void testKt48945a() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945a.kt"); + } + + @Test + @TestMetadata("kt48945b.kt") + public void testKt48945b() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945b.kt"); + } + + @Test + @TestMetadata("kt48945c.kt") + public void testKt48945c() throws Exception { + runTest("compiler/testData/codegen/box/collections/kt48945c.kt"); + } + @Test @TestMetadata("mutableList.kt") public void testMutableList() throws Exception {