From 6431934c133237d2d28ab616971a744917bbbf2c Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Mon, 18 Jun 2018 15:09:27 +0300 Subject: [PATCH] Fix signature mapping for built-in methods inside erased inline class --- .../codegen/state/KotlinTypeMapper.java | 2 +- .../inlineClassImplementsCollection.kt | 25 +++++++++++++++++++ .../inlineClassImplementsCollection.kt | 12 +++++++++ .../inlineClassImplementsCollection.txt | 22 ++++++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 ++++ .../checkers/DiagnosticsTestGenerated.java | 5 ++++ .../DiagnosticsUsingJavacTestGenerated.java | 5 ++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 ++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ 9 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/inlineClassImplementsCollection.kt create mode 100644 compiler/testData/diagnostics/tests/inlineClasses/inlineClassImplementsCollection.kt create mode 100644 compiler/testData/diagnostics/tests/inlineClasses/inlineClassImplementsCollection.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java index f6c964a0ff6..3569aa72436 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java @@ -1257,7 +1257,7 @@ public class KotlinTypeMapper { JvmMethodGenericSignature signature = sw.makeJvmMethodSignature(mapFunctionName(f)); - if (kind != OwnerKind.DEFAULT_IMPLS && !hasSpecialBridge) { + if (kind != OwnerKind.DEFAULT_IMPLS && kind != OwnerKind.ERASED_INLINE_CLASS && !hasSpecialBridge) { SpecialSignatureInfo specialSignatureInfo = BuiltinMethodsWithSpecialGenericSignature.getSpecialSignatureInfo(f); if (specialSignatureInfo != null) { diff --git a/compiler/testData/codegen/box/inlineClasses/inlineClassImplementsCollection.kt b/compiler/testData/codegen/box/inlineClasses/inlineClassImplementsCollection.kt new file mode 100644 index 00000000000..a9fc91d440f --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/inlineClassImplementsCollection.kt @@ -0,0 +1,25 @@ +// !LANGUAGE: +InlineClasses +// WITH_RUNTIME +// TARGET_BACKEND: JVM + +inline class MyUInt(val x: Int) + +inline class MyUIntArray(private val storage: IntArray) : Collection { + public override val size: Int get() = storage.size + + override operator fun iterator() = TODO() + override fun contains(element: MyUInt): Boolean = storage.contains(element.x) + override fun containsAll(elements: Collection): Boolean = elements.all { storage.contains(it.x) } + override fun isEmpty(): Boolean = TODO() +} + +fun box(): String { + val uints = MyUIntArray(intArrayOf(0, 1, 42)) + + if (MyUInt(42) !in uints) return "Fail 1" + + val ints = listOf(MyUInt(1), MyUInt(0)) + if (!uints.containsAll(ints)) return "Fail 2" + + return "OK" +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inlineClasses/inlineClassImplementsCollection.kt b/compiler/testData/diagnostics/tests/inlineClasses/inlineClassImplementsCollection.kt new file mode 100644 index 00000000000..b665afb1e14 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineClasses/inlineClassImplementsCollection.kt @@ -0,0 +1,12 @@ +// !LANGUAGE: +InlineClasses + +inline class UInt(val x: Int) + +inline class UIntArray(private val storage: IntArray) : Collection { + public override val size: Int get() = storage.size + + override operator fun iterator() = TODO() + override fun contains(element: UInt): Boolean = TODO() + override fun containsAll(elements: Collection): Boolean = TODO() + override fun isEmpty(): Boolean = TODO() +} diff --git a/compiler/testData/diagnostics/tests/inlineClasses/inlineClassImplementsCollection.txt b/compiler/testData/diagnostics/tests/inlineClasses/inlineClassImplementsCollection.txt new file mode 100644 index 00000000000..8caefa58c50 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineClasses/inlineClassImplementsCollection.txt @@ -0,0 +1,22 @@ +package + +public final inline class UInt { + public constructor UInt(/*0*/ x: kotlin.Int) + public final val x: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final inline class UIntArray : kotlin.collections.Collection { + public constructor UIntArray(/*0*/ storage: kotlin.IntArray) + public open override /*1*/ val size: kotlin.Int + private final val storage: kotlin.IntArray + public open override /*1*/ fun contains(/*0*/ element: UInt): kotlin.Boolean + public open override /*1*/ fun containsAll(/*0*/ elements: kotlin.collections.Collection): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ fun isEmpty(): kotlin.Boolean + public open override /*1*/ fun iterator(): kotlin.Nothing + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 70efa65f9d9..7c6beccd723 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11264,6 +11264,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/inlineClassAsLastExpressionInInLambda.kt"); } + @TestMetadata("inlineClassImplementsCollection.kt") + public void testInlineClassImplementsCollection() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/inlineClassImplementsCollection.kt"); + } + @TestMetadata("inlineFunctionInsideInlineClass.kt") public void testInlineFunctionInsideInlineClass() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index c449f5bbb17..f89d36c3b98 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -10716,6 +10716,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/diagnostics/tests/inlineClasses/inlineClassDeclarationCheck.kt"); } + @TestMetadata("inlineClassImplementsCollection.kt") + public void testInlineClassImplementsCollection() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/inlineClassImplementsCollection.kt"); + } + @TestMetadata("inlineClassesInsideAnnotations.kt") public void testInlineClassesInsideAnnotations() throws Exception { runTest("compiler/testData/diagnostics/tests/inlineClasses/inlineClassesInsideAnnotations.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index f9c7bc4fcc2..1071f75968d 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -10716,6 +10716,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/inlineClasses/inlineClassDeclarationCheck.kt"); } + @TestMetadata("inlineClassImplementsCollection.kt") + public void testInlineClassImplementsCollection() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/inlineClassImplementsCollection.kt"); + } + @TestMetadata("inlineClassesInsideAnnotations.kt") public void testInlineClassesInsideAnnotations() throws Exception { runTest("compiler/testData/diagnostics/tests/inlineClasses/inlineClassesInsideAnnotations.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index da7bccf32a1..f6e5565f7bf 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11264,6 +11264,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/inlineClassAsLastExpressionInInLambda.kt"); } + @TestMetadata("inlineClassImplementsCollection.kt") + public void testInlineClassImplementsCollection() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/inlineClassImplementsCollection.kt"); + } + @TestMetadata("inlineFunctionInsideInlineClass.kt") public void testInlineFunctionInsideInlineClass() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 24515e988e1..6ac0529dd47 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11264,6 +11264,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/inlineClassAsLastExpressionInInLambda.kt"); } + @TestMetadata("inlineClassImplementsCollection.kt") + public void testInlineClassImplementsCollection() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/inlineClassImplementsCollection.kt"); + } + @TestMetadata("inlineFunctionInsideInlineClass.kt") public void testInlineFunctionInsideInlineClass() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt");