From c62093f54cf3d9caa041bc3f9c81cb7468744a19 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Tue, 3 Nov 2020 01:05:52 +0100 Subject: [PATCH] IC mangling: Change mangling rules 1. Use 'x' for each parameter, which is not an inline class, every possible clash is handled by signature rather than name. This change makes more API changes binary-compatible. So, the changes are in line with the vision of inline classes are value classes, like primitives. 2. Take return type into account when mangling a function if the return type is inline class. Otherwise, boxing bridge will not be generated, which leads to CCE at runtime. --- .../codegen/state/inlineClassManglingUtils.kt | 31 +++++++++++-------- ...irOldFrontendDiagnosticsTestGenerated.java | 5 +++ .../ir/FirBlackBoxCodegenTestGenerated.java | 5 +++ .../jvm/lower/FunctionReferenceLowering.kt | 2 +- .../jvm/lower/inlineclasses/InlineClassAbi.kt | 21 ++++++------- .../overrideGenericWithInlineClass.kt | 20 ++++++++++++ .../inlineCollectionOfInlineClass/list.txt | 8 ++--- .../inlineCollectionOfInlineClass/list_ir.txt | 8 ++--- .../inlineCollectionOfInlineClass/map.txt | 6 ++-- .../mapEntry.txt | 2 +- .../mapEntry_ir.txt | 2 +- .../inlineCollectionOfInlineClass/map_ir.txt | 8 ++--- .../mutableList.txt | 16 +++++----- .../mutableList_ir.txt | 16 +++++----- .../mutableMap.txt | 12 +++---- .../mutableMapEntry.txt | 4 +-- .../mutableMap_ir.txt | 12 +++---- .../nullableAndNotNullPrimitive.kt | 6 ++++ .../nullableAndNotNullPrimitive.txt | 24 ++++++++++++++ .../codegen/bytecodeListing/kt42879.txt | 4 +-- .../delegatedPropertyMangling.kt | 2 +- ...elegatedPropertyWithInlineClassDelegate.kt | 2 +- .../inlineClasses/suspendFunctionMangling.kt | 8 ++--- ...dinaryClassIsBinaryCompatibleChange.fir.kt | 7 +++++ ...OfOrdinaryClassIsBinaryCompatibleChange.kt | 7 +++++ ...fOrdinaryClassIsBinaryCompatibleChange.txt | 12 +++++++ ...OfOrdinaryClassIsBinaryCompatibleChange.kt | 7 +++++ ...fOrdinaryClassIsBinaryCompatibleChange.txt | 12 +++++++ .../inlineClasses/genericMethodInsideClass.kt | 2 +- ...ignatureWithInlineClassTypesAsPrimitive.kt | 2 +- .../checkers/DiagnosticsTestGenerated.java | 5 +++ ...gnosticsTestWithJvmIrBackendGenerated.java | 5 +++ ...nosticsTestWithOldJvmBackendGenerated.java | 5 +++ .../DiagnosticsUsingJavacTestGenerated.java | 5 +++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++ .../codegen/BytecodeListingTestGenerated.java | 5 +++ .../LightAnalysisModeTestGenerated.java | 5 +++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++ .../ir/IrBytecodeListingTestGenerated.java | 5 +++ .../IrJsCodegenBoxES6TestGenerated.java | 5 +++ .../IrJsCodegenBoxTestGenerated.java | 5 +++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++ 42 files changed, 250 insertions(+), 83 deletions(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt create mode 100644 compiler/testData/codegen/bytecodeListing/inlineClasses/nullableAndNotNullPrimitive.kt create mode 100644 compiler/testData/codegen/bytecodeListing/inlineClasses/nullableAndNotNullPrimitive.txt create mode 100644 compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.fir.kt create mode 100644 compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt create mode 100644 compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.txt create mode 100644 compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt create mode 100644 compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt index edf1a14238d..79a2974981b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.codegen.state +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.codegen.coroutines.unwrapInitialDescriptorForSuspendFunction import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.resolve.DescriptorUtils @@ -13,6 +14,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.jvm.requiresFunctionNameManglingForParameterTypes import org.jetbrains.kotlin.resolve.jvm.requiresFunctionNameManglingForReturnType import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.typeUtil.isPrimitiveNumberOrNullableType import org.jetbrains.kotlin.types.typeUtil.representativeUpperBound import java.security.MessageDigest import java.util.* @@ -29,19 +31,20 @@ fun getManglingSuffixBasedOnKotlinSignature( // Some stdlib functions ('Result.success', 'Result.failure') are annotated with '@JvmName' as a workaround for forward compatibility. if (DescriptorUtils.hasJvmNameAnnotation(descriptor)) return null - // If a function accepts inline class parameters, mangle its name. - if (requiresFunctionNameManglingForParameterTypes(descriptor)) { - return "-" + md5base64(collectSignatureForMangling(descriptor)) - } + val unwrappedDescriptor = descriptor.unwrapInitialDescriptorForSuspendFunction() - // If a class member function returns inline class value, mangle its name. - // NB here function can be a suspend function JVM view with return type replaced with 'Any', - // should unwrap it and take original return type instead. - if (shouldMangleByReturnType) { - val unwrappedDescriptor = descriptor.unwrapInitialDescriptorForSuspendFunction() - if (requiresFunctionNameManglingForReturnType(unwrappedDescriptor)) { - return "-" + md5base64(":" + getSignatureElementForMangling(unwrappedDescriptor.returnType!!)) - } + // If a function accepts inline class parameters, mangle its name. + if (requiresFunctionNameManglingForParameterTypes(descriptor) || + (shouldMangleByReturnType && requiresFunctionNameManglingForReturnType(unwrappedDescriptor)) + ) { + // If a class member function returns inline class value, mangle its name. + // NB here function can be a suspend function JVM view with return type replaced with 'Any', + // should unwrap it and take original return type instead. + val signature = collectSignatureForMangling(descriptor) + + if (shouldMangleByReturnType && requiresFunctionNameManglingForReturnType(unwrappedDescriptor)) + ":" + getSignatureElementForMangling(unwrappedDescriptor.returnType!!) + else "" + return "-" + md5base64(signature) } return null } @@ -54,11 +57,13 @@ private fun collectSignatureForMangling(descriptor: CallableMemberDescriptor): S private fun getSignatureElementForMangling(type: KotlinType): String = buildString { val descriptor = type.constructor.declarationDescriptor ?: return "" when (descriptor) { - is ClassDescriptor -> { + is ClassDescriptor -> if (descriptor.isInline) { append('L') append(descriptor.fqNameUnsafe) if (type.isMarkedNullable) append('?') append(';') + } else { + append('x') } is TypeParameterDescriptor -> { diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java index 3053f16d46f..e2694f20f07 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java @@ -12837,6 +12837,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte runTest("compiler/testData/diagnostics/tests/inlineClasses/basicInlineClassDeclarationDisabled.kt"); } + @TestMetadata("changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt") + public void testChangingNullabilityOfOrdinaryClassIsBinaryCompatibleChange() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt"); + } + @TestMetadata("constructorsJvmSignaturesClash.kt") public void testConstructorsJvmSignaturesClash() throws Exception { runTest("compiler/testData/diagnostics/tests/inlineClasses/constructorsJvmSignaturesClash.kt"); 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 c510346ab76..d8d95005c45 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 @@ -14397,6 +14397,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt"); } + @TestMetadata("overrideGenericWithInlineClass.kt") + public void testOverrideGenericWithInlineClass() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt"); + } + @TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt") public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt"); diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt index 4dd8caa22a0..7587f6d4095 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FunctionReferenceLowering.kt @@ -369,7 +369,7 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext) name = if (samSuperType == null && callee.returnType.erasedUpperBound.isInline && context.state.functionsWithInlineClassReturnTypesMangled) { // For functions with inline class return type we need to mangle the invoke method. // Otherwise, bridge lowering may fail to generate bridges for inline class types erasing to Any. - val suffix = InlineClassAbi.returnHashSuffix(callee) + val suffix = InlineClassAbi.hashSuffix(callee, true) Name.identifier("${superMethod.owner.name.asString()}-${suffix}") } else superMethod.owner.name returnType = callee.returnType diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/InlineClassAbi.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/InlineClassAbi.kt index 204849bdb18..a4f811e8633 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/InlineClassAbi.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/inlineclasses/InlineClassAbi.kt @@ -72,10 +72,8 @@ object InlineClassAbi { } val suffix = when { - irFunction.fullValueParameterList.any { it.type.requiresMangling } -> - hashSuffix(irFunction) - mangleReturnTypes && irFunction.hasMangledReturnType -> - returnHashSuffix(irFunction) + irFunction.fullValueParameterList.any { it.type.requiresMangling } || (mangleReturnTypes && irFunction.hasMangledReturnType) -> + hashSuffix(irFunction, mangleReturnTypes) (irFunction.parent as? IrClass)?.isInline == true && irFunction.origin != IrDeclarationOrigin.IR_BUILTINS_STUB -> "impl" @@ -100,27 +98,26 @@ object InlineClassAbi { private val IrFunction.propertyName: Name get() = (this as IrSimpleFunction).correspondingPropertySymbol!!.owner.name - fun returnHashSuffix(irFunction: IrFunction) = - md5base64(":${irFunction.returnType.eraseToString()}") - - private fun hashSuffix(irFunction: IrFunction): String { + fun hashSuffix(irFunction: IrFunction, mangleReturnTypes: Boolean): String { val signatureElementsForMangling = irFunction.fullValueParameterList.mapTo(mutableListOf()) { it.type.eraseToString() } if (irFunction.isSuspend) { // The JVM backend computes mangled names after creating suspend function views, but before default argument // stub insertion. It would be nice if this part of the continuation lowering happened earlier in the pipeline. // TODO: Move suspend function view creation before JvmInlineClassLowering. - signatureElementsForMangling += "Lkotlin.coroutines.Continuation;" + signatureElementsForMangling += "x" } - return md5base64(signatureElementsForMangling.joinToString()) + val signatureString = signatureElementsForMangling.joinToString() + + if (mangleReturnTypes && irFunction.hasMangledReturnType) ":${irFunction.returnType.eraseToString()}" else "" + return md5base64(signatureString) } - private fun IrType.eraseToString() = buildString { + private fun IrType.eraseToString() = if (getClass()?.isInline == true) buildString { append('L') append(erasedUpperBound.fqNameWhenAvailable!!) if (isNullable()) append('?') append(';') - } + } else "x" } internal val IrType.requiresMangling: Boolean diff --git a/compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt b/compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt new file mode 100644 index 00000000000..cd364e0730f --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt @@ -0,0 +1,20 @@ +inline class Marker(val i: Int) + +interface I { + fun foo(i: Marker) : T +} + +inline class IC(val a: Any) + +class C : I { + override fun foo(i: Marker): IC = IC("OK") +} + +fun box(): String { + val i: I = C() + val foo: IC = i.foo(Marker(0)) + if (foo.a != "OK") return "FAIL 1" + val foo1: IC = C().foo(Marker(0)) + if (foo1.a != "OK") return "FAIL 2" + return "OK" +} diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/list.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/list.txt index 749284caf33..5a214731a3a 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/list.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/list.txt @@ -21,8 +21,8 @@ public final class InlineList { private synthetic method (p0: java.util.List): void public synthetic method add(p0: int, p1: java.lang.Object): void public synthetic method add(p0: java.lang.Object): boolean - public method add-_bimVNw(p0: int, p1: int): void public method add-jHY5zpA(p0: int): boolean + public method add-rENGgLQ(p0: int, p1: int): void public method addAll(p0: int, p1: java.util.Collection): boolean public method addAll(p0: java.util.Collection): boolean public synthetic final static method box-impl(p0: java.util.List): InlineList @@ -37,8 +37,8 @@ public final class InlineList { public static method equals-impl(p0: java.util.List, p1: java.lang.Object): boolean public final static method equals-impl0(p0: java.util.List, p1: java.util.List): boolean public synthetic bridge method get(p0: int): java.lang.Object - public method get-XAcLw3A(p0: int): int - public static method get-XAcLw3A(p0: java.util.List, p1: int): int + public method get-JnfgTak(p0: int): int + public static method get-JnfgTak(p0: java.util.List, p1: int): int public method getSize(): int public static method getSize-impl(p0: java.util.List): int public method hashCode(): int @@ -63,7 +63,7 @@ public final class InlineList { public method removeAll(p0: java.util.Collection): boolean public method retainAll(p0: java.util.Collection): boolean public synthetic method set(p0: int, p1: java.lang.Object): java.lang.Object - public method set-_bimVNw(p0: int, p1: int): int + public method set-Geu8JnU(p0: int, p1: int): int public bridge final method size(): int public method subList(p0: int, p1: int): java.util.List public static method subList-impl(p0: java.util.List, p1: int, p2: int): java.util.List diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/list_ir.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/list_ir.txt index 0ebc3e3c566..545c025b400 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/list_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/list_ir.txt @@ -21,8 +21,8 @@ public final class InlineList { private synthetic method (p0: java.util.List): void public synthetic bridge method add(p0: int, p1: java.lang.Object): void public synthetic bridge method add(p0: java.lang.Object): boolean - public method add-_bimVNw(p0: int, p1: int): void public method add-jHY5zpA(p0: int): boolean + public method add-rENGgLQ(p0: int, p1: int): void public method addAll(p0: int, p1: java.util.Collection): boolean public method addAll(p0: java.util.Collection): boolean public synthetic final static method box-impl(p0: java.util.List): InlineList @@ -37,8 +37,8 @@ public final class InlineList { public static method equals-impl(p0: java.util.List, p1: java.lang.Object): boolean public final static method equals-impl0(p0: java.util.List, p1: java.util.List): boolean public synthetic bridge method get(p0: int): java.lang.Object - public method get-XAcLw3A(p0: int): int - public static method get-XAcLw3A(p0: java.util.List, p1: int): int + public method get-JnfgTak(p0: int): int + public static method get-JnfgTak(p0: java.util.List, p1: int): int public method getSize(): int public static method getSize-impl(p0: java.util.List): int public method hashCode(): int @@ -63,7 +63,7 @@ public final class InlineList { public method removeAll(p0: java.util.Collection): boolean public method retainAll(p0: java.util.Collection): boolean public synthetic bridge method set(p0: int, p1: java.lang.Object): java.lang.Object - public method set-_bimVNw(p0: int, p1: int): int + public method set-Geu8JnU(p0: int, p1: int): int public synthetic bridge method size(): int public method subList(p0: int, p1: int): java.util.List public static method subList-impl(p0: java.util.List, p1: int, p2: int): java.util.List diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/map.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/map.txt index f49fe34f3c4..72a6cd266db 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/map.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/map.txt @@ -50,8 +50,8 @@ 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): java.lang.Object - public method get-FSIWiWE(p0: int): IV - public static method get-FSIWiWE(p0: java.util.Map, p1: int): IV + 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 public static method getEntries-impl(p0: java.util.Map): java.util.Set public method getKeys(): java.util.Set @@ -66,7 +66,7 @@ public final class InlineMap { public static method isEmpty-impl(p0: java.util.Map): boolean public bridge final method keySet(): java.util.Set public synthetic method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object - public method put-pjrbk2k(p0: int, p1: double): IV + public method put-eSoqwEg(p0: int, p1: double): IV public method putAll(p0: java.util.Map): void public method remove(p0: java.lang.Object): java.lang.Object public bridge final method size(): int diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mapEntry.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mapEntry.txt index 1e92d29064c..45a7fff750d 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mapEntry.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mapEntry.txt @@ -50,7 +50,7 @@ public final class InlineMapEntry { public method hashCode(): int public static method hashCode-impl(p0: java.util.Map$Entry): int public synthetic method setValue(p0: java.lang.Object): java.lang.Object - public method setValue-jbX5DO8(p0: double): double + public method setValue-cYiyq8k(p0: double): double public method toString(): java.lang.String public static method toString-impl(p0: java.util.Map$Entry): java.lang.String public synthetic final method unbox-impl(): java.util.Map$Entry diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mapEntry_ir.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mapEntry_ir.txt index 6564cf86e94..c93d273e7b4 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mapEntry_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mapEntry_ir.txt @@ -50,7 +50,7 @@ public final class InlineMapEntry { public method hashCode(): int public static method hashCode-impl(p0: java.util.Map$Entry): int public synthetic bridge method setValue(p0: java.lang.Object): java.lang.Object - public method setValue-jbX5DO8(p0: double): double + public method setValue-cYiyq8k(p0: double): double public method toString(): java.lang.String public static method toString-impl(p0: java.util.Map$Entry): java.lang.String public synthetic final method unbox-impl(): java.util.Map$Entry diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/map_ir.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/map_ir.txt index cb491d7ac80..79daf9cdeea 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/map_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/map_ir.txt @@ -50,8 +50,8 @@ 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 synthetic bridge method get(p0: java.lang.Object): java.lang.Object - public method get-FSIWiWE(p0: int): IV - public static method get-FSIWiWE(p0: java.util.Map, p1: int): IV + 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 public static method getEntries-impl(p0: java.util.Map): java.util.Set public method getKeys(): java.util.Set @@ -66,11 +66,11 @@ public final class InlineMap { public static method isEmpty-impl(p0: java.util.Map): boolean public synthetic bridge method keySet(): java.util.Set public synthetic bridge method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object - public method put-pjrbk2k(p0: int, p1: double): IV + public method put-eSoqwEg(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 method remove-i7hxwoc(p0: java.lang.Object): IV + public method remove-Ilea9M0(p0: java.lang.Object): IV public synthetic bridge method size(): int public method toString(): java.lang.String public static method toString-impl(p0: java.util.Map): java.lang.String diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableList.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableList.txt index 1b78c07af56..01dac07b709 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableList.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableList.txt @@ -21,10 +21,10 @@ public final class InlineMutableList { private synthetic method (p0: java.util.List): void public synthetic bridge method add(p0: int, p1: java.lang.Object): void public synthetic bridge method add(p0: java.lang.Object): boolean - public method add-_bimVNw(p0: int, p1: long): void - public static method add-_bimVNw(p0: java.util.List, p1: int, p2: long): void public static method add-jHY5zpA(p0: java.util.List, p1: long): boolean public method add-jHY5zpA(p0: long): boolean + public method add-rENGgLQ(p0: int, p1: long): void + public static method add-rENGgLQ(p0: java.util.List, p1: int, p2: long): void public method addAll(p0: int, p1: java.util.Collection): boolean public method addAll(p0: java.util.Collection): boolean public static method addAll-impl(p0: java.util.List, p1: int, p2: java.util.Collection): boolean @@ -42,8 +42,8 @@ public final class InlineMutableList { public static method equals-impl(p0: java.util.List, p1: java.lang.Object): boolean public final static method equals-impl0(p0: java.util.List, p1: java.util.List): boolean public synthetic bridge method get(p0: int): java.lang.Object - public method get-XAcLw3A(p0: int): long - public static method get-XAcLw3A(p0: java.util.List, p1: int): long + public method get-JnfgTak(p0: int): long + public static method get-JnfgTak(p0: java.util.List, p1: int): long public method getSize(): int public static method getSize-impl(p0: java.util.List): int public method hashCode(): int @@ -69,13 +69,13 @@ public final class InlineMutableList { public method remove-jHY5zpA(p0: long): boolean public method removeAll(p0: java.util.Collection): boolean public static method removeAll-impl(p0: java.util.List, p1: java.util.Collection): boolean - public method removeAt-XAcLw3A(p0: int): long - public static method removeAt-XAcLw3A(p0: java.util.List, p1: int): long + public method removeAt-JnfgTak(p0: int): long + public static method removeAt-JnfgTak(p0: java.util.List, p1: int): long public method retainAll(p0: java.util.Collection): boolean public static method retainAll-impl(p0: java.util.List, p1: java.util.Collection): boolean public synthetic bridge method set(p0: int, p1: java.lang.Object): java.lang.Object - public method set-_bimVNw(p0: int, p1: long): long - public static method set-_bimVNw(p0: java.util.List, p1: int, p2: long): long + public method set-Geu8JnU(p0: int, p1: long): long + public static method set-Geu8JnU(p0: java.util.List, p1: int, p2: long): long public bridge final method size(): int public method subList(p0: int, p1: int): java.util.List public static method subList-impl(p0: java.util.List, p1: int, p2: int): java.util.List diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableList_ir.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableList_ir.txt index c17c4e5d9c0..62efe7547f3 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableList_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableList_ir.txt @@ -21,10 +21,10 @@ public final class InlineMutableList { private synthetic method (p0: java.util.List): void public synthetic bridge method add(p0: int, p1: java.lang.Object): void public synthetic bridge method add(p0: java.lang.Object): boolean - public method add-_bimVNw(p0: int, p1: long): void - public static method add-_bimVNw(p0: java.util.List, p1: int, p2: long): void public static method add-jHY5zpA(p0: java.util.List, p1: long): boolean public method add-jHY5zpA(p0: long): boolean + public method add-rENGgLQ(p0: int, p1: long): void + public static method add-rENGgLQ(p0: java.util.List, p1: int, p2: long): void public method addAll(p0: int, p1: java.util.Collection): boolean public method addAll(p0: java.util.Collection): boolean public static method addAll-impl(p0: java.util.List, p1: int, p2: java.util.Collection): boolean @@ -42,8 +42,8 @@ public final class InlineMutableList { public static method equals-impl(p0: java.util.List, p1: java.lang.Object): boolean public final static method equals-impl0(p0: java.util.List, p1: java.util.List): boolean public synthetic bridge method get(p0: int): java.lang.Object - public method get-XAcLw3A(p0: int): long - public static method get-XAcLw3A(p0: java.util.List, p1: int): long + public method get-JnfgTak(p0: int): long + public static method get-JnfgTak(p0: java.util.List, p1: int): long public method getSize(): int public static method getSize-impl(p0: java.util.List): int public method hashCode(): int @@ -69,13 +69,13 @@ public final class InlineMutableList { public method remove-jHY5zpA(p0: long): boolean public method removeAll(p0: java.util.Collection): boolean public static method removeAll-impl(p0: java.util.List, p1: java.util.Collection): boolean - public method removeAt-XAcLw3A(p0: int): long - public static method removeAt-XAcLw3A(p0: java.util.List, p1: int): long + public method removeAt-JnfgTak(p0: int): long + public static method removeAt-JnfgTak(p0: java.util.List, p1: int): long public method retainAll(p0: java.util.Collection): boolean public static method retainAll-impl(p0: java.util.List, p1: java.util.Collection): boolean public synthetic bridge method set(p0: int, p1: java.lang.Object): java.lang.Object - public method set-_bimVNw(p0: int, p1: long): long - public static method set-_bimVNw(p0: java.util.List, p1: int, p2: long): long + public method set-Geu8JnU(p0: int, p1: long): long + public static method set-Geu8JnU(p0: java.util.List, p1: int, p2: long): long public synthetic bridge method size(): int public method subList(p0: int, p1: int): java.util.List public static method subList-impl(p0: java.util.List, p1: int, p2: int): java.util.List diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMap.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMap.txt index 7239d03d579..da3683dba69 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMap.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMap.txt @@ -51,8 +51,8 @@ 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): java.lang.Object - public method get-FSIWiWE(p0: int): IV - public static method get-FSIWiWE(p0: java.util.Map, p1: int): IV + 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 public static method getEntries-impl(p0: java.util.Map): java.util.Set public method getKeys(): java.util.Set @@ -67,13 +67,13 @@ public final class InlineMutableMap { public static method isEmpty-impl(p0: java.util.Map): boolean public bridge final method keySet(): java.util.Set public synthetic bridge method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object - public method put-pjrbk2k(p0: int, p1: double): IV - public static method put-pjrbk2k(p0: java.util.Map, p1: int, p2: double): IV + public method put-eSoqwEg(p0: int, p1: double): IV + public static method put-eSoqwEg(p0: java.util.Map, p1: int, p2: double): IV 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): java.lang.Object - public method remove-FSIWiWE(p0: int): IV - public static method remove-FSIWiWE(p0: java.util.Map, p1: int): IV + public method remove-qgyy0Jc(p0: int): IV + public static method remove-qgyy0Jc(p0: java.util.Map, p1: int): IV public bridge final method size(): int public method toString(): java.lang.String public static method toString-impl(p0: java.util.Map): java.lang.String diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMapEntry.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMapEntry.txt index a0e0083055f..c785efd7c01 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMapEntry.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMapEntry.txt @@ -50,8 +50,8 @@ public final class InlineMutableMapEntry { public method hashCode(): int public static method hashCode-impl(p0: java.util.Map$Entry): int public synthetic bridge method setValue(p0: java.lang.Object): java.lang.Object - public method setValue-jbX5DO8(p0: double): double - public static method setValue-jbX5DO8(p0: java.util.Map$Entry, p1: double): double + public method setValue-cYiyq8k(p0: double): double + public static method setValue-cYiyq8k(p0: java.util.Map$Entry, p1: double): double public method toString(): java.lang.String public static method toString-impl(p0: java.util.Map$Entry): java.lang.String public synthetic final method unbox-impl(): java.util.Map$Entry diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMap_ir.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMap_ir.txt index 657df961e74..d0692071ecb 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMap_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineCollectionOfInlineClass/mutableMap_ir.txt @@ -51,8 +51,8 @@ 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 synthetic bridge method get(p0: java.lang.Object): java.lang.Object - public method get-FSIWiWE(p0: int): IV - public static method get-FSIWiWE(p0: java.util.Map, p1: int): IV + 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 public static method getEntries-impl(p0: java.util.Map): java.util.Set public method getKeys(): java.util.Set @@ -67,14 +67,14 @@ public final class InlineMutableMap { public static method isEmpty-impl(p0: java.util.Map): boolean public synthetic bridge method keySet(): java.util.Set public synthetic bridge method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object - public method put-pjrbk2k(p0: int, p1: double): IV - public static method put-pjrbk2k(p0: java.util.Map, p1: int, p2: double): IV + public method put-eSoqwEg(p0: int, p1: double): IV + public static method put-eSoqwEg(p0: java.util.Map, p1: int, p2: double): IV 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 method remove-FSIWiWE(p0: int): IV - public static method remove-FSIWiWE(p0: java.util.Map, p1: int): IV + 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 public method toString(): java.lang.String public static method toString-impl(p0: java.util.Map): java.lang.String diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/nullableAndNotNullPrimitive.kt b/compiler/testData/codegen/bytecodeListing/inlineClasses/nullableAndNotNullPrimitive.kt new file mode 100644 index 00000000000..f80a9a0f85f --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/nullableAndNotNullPrimitive.kt @@ -0,0 +1,6 @@ +// !LANGUAGE: +InlineClasses + +inline class IC(val i: Int) + +fun foo(i: Int, ic: IC) {} +fun foo(i: Int?, ic: IC) {} \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/nullableAndNotNullPrimitive.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/nullableAndNotNullPrimitive.txt new file mode 100644 index 00000000000..6fd2d077823 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/nullableAndNotNullPrimitive.txt @@ -0,0 +1,24 @@ +@kotlin.Metadata +public final class IC { + // source: 'nullableAndNotNullPrimitive.kt' + private final field i: int + private synthetic method (p0: int): void + public synthetic final static method box-impl(p0: int): IC + public static method constructor-impl(p0: int): int + public method equals(p0: java.lang.Object): boolean + public static method equals-impl(p0: int, p1: java.lang.Object): boolean + public final static method equals-impl0(p0: int, p1: int): boolean + public final method getI(): int + public method hashCode(): int + public static method hashCode-impl(p0: int): int + public method toString(): java.lang.String + public static method toString-impl(p0: int): java.lang.String + public synthetic final method unbox-impl(): int +} + +@kotlin.Metadata +public final class NullableAndNotNullPrimitiveKt { + // source: 'nullableAndNotNullPrimitive.kt' + public final static method foo-MSgPiiU(@org.jetbrains.annotations.Nullable p0: java.lang.Integer, p1: int): void + public final static method foo-MSgPiiU(p0: int, p1: int): void +} diff --git a/compiler/testData/codegen/bytecodeListing/kt42879.txt b/compiler/testData/codegen/bytecodeListing/kt42879.txt index 08e63465dff..f52a4c4eeb0 100644 --- a/compiler/testData/codegen/bytecodeListing/kt42879.txt +++ b/compiler/testData/codegen/bytecodeListing/kt42879.txt @@ -19,7 +19,7 @@ public final class A { @kotlin.Metadata public interface I { // source: 'kt42879.kt' - public abstract method compute-GKOAj6k(p0: int): int + public abstract method compute-WzO2ekY(p0: int): int } @kotlin.Metadata @@ -30,7 +30,7 @@ final class Kt42879Kt$g$1 { inner (anonymous) class Kt42879Kt$g$1 static method (): void method (): void - public final method compute-GKOAj6k(p0: int): int + public final method compute-WzO2ekY(p0: int): int } @kotlin.Metadata diff --git a/compiler/testData/codegen/bytecodeText/inlineClasses/delegatedPropertyMangling.kt b/compiler/testData/codegen/bytecodeText/inlineClasses/delegatedPropertyMangling.kt index 6f0898a27cb..bb28ea1d8a0 100644 --- a/compiler/testData/codegen/bytecodeText/inlineClasses/delegatedPropertyMangling.kt +++ b/compiler/testData/codegen/bytecodeText/inlineClasses/delegatedPropertyMangling.kt @@ -18,6 +18,6 @@ class B : A { override val i by Delegate() } -// 1 public final getValue-lPtA-2M\(Ljava/lang/Object;Lkotlin/reflect/KProperty;\)I +// 1 public final getValue-Y6jMyTM\(Ljava/lang/Object;Lkotlin/reflect/KProperty;\)I // 1 public getI-lPtA-2M\(\)I // 1 public abstract getI-lPtA-2M\(\)I diff --git a/compiler/testData/codegen/bytecodeText/inlineClasses/noBoxingUnboxingInAccessorsForDelegatedPropertyWithInlineClassDelegate.kt b/compiler/testData/codegen/bytecodeText/inlineClasses/noBoxingUnboxingInAccessorsForDelegatedPropertyWithInlineClassDelegate.kt index a6a83e59960..fe53aa20950 100644 --- a/compiler/testData/codegen/bytecodeText/inlineClasses/noBoxingUnboxingInAccessorsForDelegatedPropertyWithInlineClassDelegate.kt +++ b/compiler/testData/codegen/bytecodeText/inlineClasses/noBoxingUnboxingInAccessorsForDelegatedPropertyWithInlineClassDelegate.kt @@ -28,6 +28,6 @@ inline class Delegate(val default: Int) { // 0 DelegateFactory\.unbox // 0 Delegate\.box // 0 Delegate\.unbox -// 1 INVOKESTATIC DelegateFactory\.provideDelegate-ARVzKNs \(ILjava/lang/Object;Ljava/lang/Object;\)I +// 1 INVOKESTATIC DelegateFactory\.provideDelegate-gy51yk8 \(ILjava/lang/Object;Ljava/lang/Object;\)I // 1 INVOKESTATIC Delegate\.getValue-impl \(ILjava/lang/Object;Ljava/lang/Object;\)I // 1 INVOKESTATIC Delegate\.setValue-impl \(ILjava/lang/Object;Ljava/lang/Object;I\)V \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/inlineClasses/suspendFunctionMangling.kt b/compiler/testData/codegen/bytecodeText/inlineClasses/suspendFunctionMangling.kt index 730fcca579d..dea971a8d24 100644 --- a/compiler/testData/codegen/bytecodeText/inlineClasses/suspendFunctionMangling.kt +++ b/compiler/testData/codegen/bytecodeText/inlineClasses/suspendFunctionMangling.kt @@ -13,7 +13,7 @@ suspend fun bar(p: P) {} // The mangled name for a suspend function includes the continuation parameter in the hash computation, but not the // default argument mask and handler. -// 1 public final static foo-zMJ7EWY\(ILkotlin/coroutines/Continuation;\)Ljava/lang/Object; -// 1 public static synthetic foo-zMJ7EWY\$default\(ILkotlin/coroutines/Continuation;ILjava/lang/Object;\)Ljava/lang/Object; -// 1 INVOKESTATIC a/TestKt.foo-zMJ7EWY \(ILkotlin/coroutines/Continuation;\)Ljava/lang/Object; -// 1 public final static bar-zMJ7EWY\(ILkotlin/coroutines/Continuation;\)Ljava/lang/Object; \ No newline at end of file +// 1 public final static foo-opU5HYo\(ILkotlin/coroutines/Continuation;\)Ljava/lang/Object; +// 1 public static synthetic foo-opU5HYo\$default\(ILkotlin/coroutines/Continuation;ILjava/lang/Object;\)Ljava/lang/Object; +// 1 INVOKESTATIC a/TestKt.foo-opU5HYo \(ILkotlin/coroutines/Continuation;\)Ljava/lang/Object; +// 1 public final static bar-opU5HYo\(ILkotlin/coroutines/Continuation;\)Ljava/lang/Object; \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.fir.kt b/compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.fir.kt new file mode 100644 index 00000000000..3ad0a8a9070 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.fir.kt @@ -0,0 +1,7 @@ +// !LANGUAGE: +InlineClasses +// !DIAGNOSTICS: -UNUSED_PARAMETER + +inline class IC(val i: Int) + +fun foo(a: Any, ic: IC) {} +fun foo(a: Any?, ic: IC) {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt b/compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt new file mode 100644 index 00000000000..f0d500dabbd --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt @@ -0,0 +1,7 @@ +// !LANGUAGE: +InlineClasses +// !DIAGNOSTICS: -UNUSED_PARAMETER + +inline class IC(val i: Int) + +fun foo(a: Any, ic: IC) {} +fun foo(a: Any?, ic: IC) {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.txt b/compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.txt new file mode 100644 index 00000000000..bf10ceb74b6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.txt @@ -0,0 +1,12 @@ +package + +public fun foo(/*0*/ a: kotlin.Any, /*1*/ ic: IC): kotlin.Unit +public fun foo(/*0*/ a: kotlin.Any?, /*1*/ ic: IC): kotlin.Unit + +public final inline class IC { + public constructor IC(/*0*/ i: kotlin.Int) + public final val i: kotlin.Int + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt b/compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt new file mode 100644 index 00000000000..f0d500dabbd --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt @@ -0,0 +1,7 @@ +// !LANGUAGE: +InlineClasses +// !DIAGNOSTICS: -UNUSED_PARAMETER + +inline class IC(val i: Int) + +fun foo(a: Any, ic: IC) {} +fun foo(a: Any?, ic: IC) {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.txt b/compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.txt new file mode 100644 index 00000000000..bf10ceb74b6 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.txt @@ -0,0 +1,12 @@ +package + +public fun foo(/*0*/ a: kotlin.Any, /*1*/ ic: IC): kotlin.Unit +public fun foo(/*0*/ a: kotlin.Any?, /*1*/ ic: IC): kotlin.Unit + +public final inline class IC { + public constructor IC(/*0*/ i: kotlin.Int) + public final val i: kotlin.Int + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/writeSignature/inlineClasses/genericMethodInsideClass.kt b/compiler/testData/writeSignature/inlineClasses/genericMethodInsideClass.kt index 452dabd40c8..a1c6ee3525a 100644 --- a/compiler/testData/writeSignature/inlineClasses/genericMethodInsideClass.kt +++ b/compiler/testData/writeSignature/inlineClasses/genericMethodInsideClass.kt @@ -22,6 +22,6 @@ inline class SomeClass(val v: Int) { // jvm signature: (ILjava/lang/Object;)Ljava/lang/Object; // generic signature: (ITK;)TK; -// method: SomeClass$Companion::comp-Uh6wWds +// method: SomeClass$Companion::comp-aew-wRw // jvm signature: (ILjava/lang/Object;)Ljava/lang/Object; // generic signature: (ITT;)TT; \ No newline at end of file diff --git a/compiler/testData/writeSignature/inlineClasses/simpleSignatureWithInlineClassTypesAsPrimitive.kt b/compiler/testData/writeSignature/inlineClasses/simpleSignatureWithInlineClassTypesAsPrimitive.kt index 66b6444e9a4..3e122d9cb7d 100644 --- a/compiler/testData/writeSignature/inlineClasses/simpleSignatureWithInlineClassTypesAsPrimitive.kt +++ b/compiler/testData/writeSignature/inlineClasses/simpleSignatureWithInlineClassTypesAsPrimitive.kt @@ -21,6 +21,6 @@ object Test { // jvm signature: (I)V // generic signature: null -// method: Test::asAll--J2ODwA +// method: Test::asAll-wqC9CcI // jvm signature: (ILjava/lang/Object;II)I // generic signature: null diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 8bc1276f43e..bf42951674e 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -12844,6 +12844,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali runTest("compiler/testData/diagnostics/tests/inlineClasses/basicInlineClassDeclarationDisabled.kt"); } + @TestMetadata("changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt") + public void testChangingNullabilityOfOrdinaryClassIsBinaryCompatibleChange() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt"); + } + @TestMetadata("constructorsJvmSignaturesClash.kt") public void testConstructorsJvmSignaturesClash() throws Exception { runTest("compiler/testData/diagnostics/tests/inlineClasses/constructorsJvmSignaturesClash.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJvmIrBackendGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJvmIrBackendGenerated.java index e0cd9473b27..865e2a9417a 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJvmIrBackendGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJvmIrBackendGenerated.java @@ -61,6 +61,11 @@ public class DiagnosticsTestWithJvmIrBackendGenerated extends AbstractDiagnostic runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/caseInProperties.kt"); } + @TestMetadata("changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt") + public void testChangingNullabilityOfOrdinaryClassIsBinaryCompatibleChange() throws Exception { + runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt"); + } + @TestMetadata("vararg.kt") public void testVararg() throws Exception { runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/vararg.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithOldJvmBackendGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithOldJvmBackendGenerated.java index 8589ffca787..7caddc4167e 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithOldJvmBackendGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithOldJvmBackendGenerated.java @@ -61,6 +61,11 @@ public class DiagnosticsTestWithOldJvmBackendGenerated extends AbstractDiagnosti runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/caseInProperties.kt"); } + @TestMetadata("changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt") + public void testChangingNullabilityOfOrdinaryClassIsBinaryCompatibleChange() throws Exception { + runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt"); + } + @TestMetadata("vararg.kt") public void testVararg() throws Exception { runTest("compiler/testData/diagnostics/testsWithJvmBackend/duplicateJvmSignature/vararg.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 69aee9d9d3e..2c8875e5bf0 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -12839,6 +12839,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/inlineClasses/basicInlineClassDeclarationDisabled.kt"); } + @TestMetadata("changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt") + public void testChangingNullabilityOfOrdinaryClassIsBinaryCompatibleChange() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/changingNullabilityOfOrdinaryClassIsBinaryCompatibleChange.kt"); + } + @TestMetadata("constructorsJvmSignaturesClash.kt") public void testConstructorsJvmSignaturesClash() throws Exception { runTest("compiler/testData/diagnostics/tests/inlineClasses/constructorsJvmSignaturesClash.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 5ef49e33862..cf272f439bf 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -15797,6 +15797,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt"); } + @TestMetadata("overrideGenericWithInlineClass.kt") + public void testOverrideGenericWithInlineClass() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt"); + } + @TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt") public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java index dbaf2b71209..bf0b3616a62 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java @@ -987,6 +987,11 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/nullabilityInExpansion.kt"); } + @TestMetadata("nullableAndNotNullPrimitive.kt") + public void testNullableAndNotNullPrimitive() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/nullableAndNotNullPrimitive.kt"); + } + @TestMetadata("overridingGenericMethodWithInlineClassParameterType.kt") public void testOverridingGenericMethodWithInlineClassParameterType() throws Exception { runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/overridingGenericMethodWithInlineClassParameterType.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index c09f7381aa5..54557305203 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -15797,6 +15797,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt"); } + @TestMetadata("overrideGenericWithInlineClass.kt") + public void testOverrideGenericWithInlineClass() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt"); + } + @TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt") public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 47e76b02666..dbd4c719cbc 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -14397,6 +14397,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt"); } + @TestMetadata("overrideGenericWithInlineClass.kt") + public void testOverrideGenericWithInlineClass() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt"); + } + @TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt") public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java index d8b11c49fc1..3f148602bf5 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java @@ -957,6 +957,11 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/nullabilityInExpansion.kt"); } + @TestMetadata("nullableAndNotNullPrimitive.kt") + public void testNullableAndNotNullPrimitive() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/nullableAndNotNullPrimitive.kt"); + } + @TestMetadata("overridingGenericMethodWithInlineClassParameterType.kt") public void testOverridingGenericMethodWithInlineClassParameterType() throws Exception { runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/overridingGenericMethodWithInlineClassParameterType.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 80951a4b7fa..186b2ee5c47 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 @@ -12392,6 +12392,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt"); } + @TestMetadata("overrideGenericWithInlineClass.kt") + public void testOverrideGenericWithInlineClass() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt"); + } + @TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt") public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.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 61fc3d19434..a048e4df518 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 @@ -12392,6 +12392,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt"); } + @TestMetadata("overrideGenericWithInlineClass.kt") + public void testOverrideGenericWithInlineClass() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt"); + } + @TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt") public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.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 4f712e2fd20..717af2f9742 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 @@ -12457,6 +12457,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/kt35234a.kt"); } + @TestMetadata("overrideGenericWithInlineClass.kt") + public void testOverrideGenericWithInlineClass() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithInlineClass.kt"); + } + @TestMetadata("overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt") public void testOverrideGenericWithNullableInlineClassUpperBoundWithNonNullAny() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/boxReturnValueOnOverride/overrideGenericWithNullableInlineClassUpperBoundWithNonNullAny.kt");