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 9240c47a3bb..402a7b57395 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt @@ -54,16 +54,6 @@ private fun md5radix36string(signatureForMangling: String): String { fun KotlinType.isTypeParameterWithInlineClassUpperBound(): Boolean { val descriptor = constructor.declarationDescriptor as? TypeParameterDescriptor ?: return false - return descriptor.isWithInlineClassUpperBoundInner(hashSetOf(descriptor)) -} - -private fun TypeParameterDescriptor.isWithInlineClassUpperBoundInner(visited: MutableSet): Boolean { - for (type in typeConstructor.supertypes) { - if (type.isInlineClassType()) return true - - val typeParameterDescriptor = type.constructor.declarationDescriptor as? TypeParameterDescriptor ?: continue - if (!visited.add(typeParameterDescriptor)) continue - if (typeParameterDescriptor.isWithInlineClassUpperBoundInner(visited)) return true - } - return false + val bound = getRepresentativeUpperBound(descriptor) + return bound.isInlineClassType() || bound.isTypeParameterWithInlineClassUpperBound() } \ No newline at end of file diff --git a/compiler/testData/codegen/box/inlineClasses/functionNameMangling/extensionFunctionsDoNotClash.kt b/compiler/testData/codegen/box/inlineClasses/functionNameMangling/extensionFunctionsDoNotClash.kt index 23ea9559a6e..e4b72a7fa11 100644 --- a/compiler/testData/codegen/box/inlineClasses/functionNameMangling/extensionFunctionsDoNotClash.kt +++ b/compiler/testData/codegen/box/inlineClasses/functionNameMangling/extensionFunctionsDoNotClash.kt @@ -11,6 +11,10 @@ fun Id.test() { if (id != "OK") throw AssertionError() } +fun Id?.test() { + if (this != null) throw AssertionError() +} + fun Name.test() { if (name != "OK") throw AssertionError() } @@ -41,6 +45,7 @@ class Outer { fun box(): String { Id("OK").test() + null.test() Name("OK").test() test(Password("OK")) diff --git a/compiler/testData/codegen/box/inlineClasses/functionNameMangling/genericSignatureOfFunctionWithMangledName.kt b/compiler/testData/codegen/box/inlineClasses/functionNameMangling/genericSignatureOfFunctionWithMangledName.kt new file mode 100644 index 00000000000..c2b584c67c1 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/functionNameMangling/genericSignatureOfFunctionWithMangledName.kt @@ -0,0 +1,21 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR, JS, JS_IR +// WITH_REFLECT + +import kotlin.reflect.KFunction +import kotlin.reflect.jvm.javaMethod +import kotlin.test.* + +inline class InlineClass1(val s: String) +inline class InlineClass2(val n: Number) + +fun foo(t: T, u: U) {} + +fun box(): String { + val fooRef: (InlineClass1, InlineClass2) -> Unit = ::foo + val fooMethod = (fooRef as KFunction<*>).javaMethod!! + + assertEquals("[T, U]", fooMethod.genericParameterTypes.asList().toString()) + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForFunctionWithMangledName.kt b/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForFunctionWithMangledName.kt index 6df0b44a3e4..d01f1f5e50e 100644 --- a/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForFunctionWithMangledName.kt +++ b/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForFunctionWithMangledName.kt @@ -1,5 +1,5 @@ // !LANGUAGE: +InlineClasses -// IGNORE_BACKEND: JVM_IR, JS, JS_IR +// IGNORE_BACKEND: JVM_IR // WITH_RUNTIME import kotlin.test.* diff --git a/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForLocalClassInFunctionWithMangledName.kt b/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForLocalClassInFunctionWithMangledName.kt index 273613a5f6f..acabe61bf74 100644 --- a/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForLocalClassInFunctionWithMangledName.kt +++ b/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForLocalClassInFunctionWithMangledName.kt @@ -3,8 +3,6 @@ // WITH_REFLECT import kotlin.test.* -import kotlin.test.* - inline class S(val string: String) fun test(s: S) { diff --git a/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForPropertyOfInlineClassType.kt b/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForPropertyOfInlineClassType.kt index 0f8a4e3ff2a..675dda14e21 100644 --- a/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForPropertyOfInlineClassType.kt +++ b/compiler/testData/codegen/box/inlineClasses/functionNameMangling/reflectionForPropertyOfInlineClassType.kt @@ -1,5 +1,5 @@ // !LANGUAGE: +InlineClasses -// IGNORE_BACKEND: JVM_IR, JS, JS_IR +// IGNORE_BACKEND: JVM_IR, JS // WITH_RUNTIME import kotlin.test.* diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 09c2635a73b..37f70d2bdf3 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11790,6 +11790,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/genericFunctionsDoNotClash.kt"); } + @TestMetadata("genericSignatureOfFunctionWithMangledName.kt") + public void testGenericSignatureOfFunctionWithMangledName() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/genericSignatureOfFunctionWithMangledName.kt"); + } + @TestMetadata("localClassInFunctionWithMangledName.kt") public void testLocalClassInFunctionWithMangledName() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/localClassInFunctionWithMangledName.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 03f36ca23c6..1e404d523e3 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11790,6 +11790,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/genericFunctionsDoNotClash.kt"); } + @TestMetadata("genericSignatureOfFunctionWithMangledName.kt") + public void testGenericSignatureOfFunctionWithMangledName() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/genericSignatureOfFunctionWithMangledName.kt"); + } + @TestMetadata("localClassInFunctionWithMangledName.kt") public void testLocalClassInFunctionWithMangledName() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/localClassInFunctionWithMangledName.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index a8f830ce18b..5b57805a349 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11790,6 +11790,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/genericFunctionsDoNotClash.kt"); } + @TestMetadata("genericSignatureOfFunctionWithMangledName.kt") + public void testGenericSignatureOfFunctionWithMangledName() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/genericSignatureOfFunctionWithMangledName.kt"); + } + @TestMetadata("localClassInFunctionWithMangledName.kt") public void testLocalClassInFunctionWithMangledName() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/localClassInFunctionWithMangledName.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index f48c4e903cd..ff037d6e7c7 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -10340,6 +10340,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/genericFunctionsDoNotClash.kt"); } + @TestMetadata("genericSignatureOfFunctionWithMangledName.kt") + public void testGenericSignatureOfFunctionWithMangledName() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/genericSignatureOfFunctionWithMangledName.kt"); + } + @TestMetadata("localClassInFunctionWithMangledName.kt") public void testLocalClassInFunctionWithMangledName() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/localClassInFunctionWithMangledName.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 be4d6d5ef48..631a543c008 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 @@ -11400,6 +11400,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/genericFunctionsDoNotClash.kt"); } + @TestMetadata("genericSignatureOfFunctionWithMangledName.kt") + public void testGenericSignatureOfFunctionWithMangledName() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/genericSignatureOfFunctionWithMangledName.kt"); + } + @TestMetadata("localClassInFunctionWithMangledName.kt") public void testLocalClassInFunctionWithMangledName() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/functionNameMangling/localClassInFunctionWithMangledName.kt");