From 8ede477f99979183c11f9862d2b8d2ceb8a26585 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 7 Dec 2018 14:11:37 +0300 Subject: [PATCH] KT-28585 Fix boxing for values of captured vars of inline class type --- .../jetbrains/kotlin/codegen/StackValue.java | 16 +++++++++++----- .../codegen/box/inlineClasses/kt28585.kt | 18 ++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 7 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/kt28585.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java index bec9284202f..0f441f17ae5 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java @@ -728,15 +728,20 @@ public abstract class StackValue { @NotNull Field refWrapper, @NotNull VariableDescriptor variableDescriptor ) { - return new FieldForSharedVar(localType, classType, fieldName, refWrapper, - variableDescriptor.isLateInit(), variableDescriptor.getName()); + return new FieldForSharedVar( + localType, variableDescriptor.getType(), classType, fieldName, refWrapper, + variableDescriptor.isLateInit(), variableDescriptor.getName() + ); } @NotNull public static FieldForSharedVar fieldForSharedVar(@NotNull FieldForSharedVar field, @NotNull StackValue newReceiver) { Field oldReceiver = (Field) field.receiver; Field newSharedVarReceiver = field(oldReceiver, newReceiver); - return new FieldForSharedVar(field.type, field.owner, field.name, newSharedVarReceiver, field.isLateinit, field.variableName); + return new FieldForSharedVar( + field.type, field.kotlinType, + field.owner, field.name, newSharedVarReceiver, field.isLateinit, field.variableName + ); } public static StackValue coercion(@NotNull StackValue value, @NotNull Type castType, @Nullable KotlinType castKotlinType) { @@ -1900,10 +1905,11 @@ public abstract class StackValue { final Name variableName; public FieldForSharedVar( - Type type, Type owner, String name, StackValue.Field receiver, + Type type, KotlinType kotlinType, + Type owner, String name, StackValue.Field receiver, boolean isLateinit, Name variableName ) { - super(type, null, false, false, receiver, receiver.canHaveSideEffects()); + super(type, kotlinType, false, false, receiver, receiver.canHaveSideEffects()); if (isLateinit && variableName == null) { throw new IllegalArgumentException("variableName should be non-null for captured lateinit variable " + name); diff --git a/compiler/testData/codegen/box/inlineClasses/kt28585.kt b/compiler/testData/codegen/box/inlineClasses/kt28585.kt new file mode 100644 index 00000000000..ae31de7972a --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/kt28585.kt @@ -0,0 +1,18 @@ +// !LANGUAGE: +InlineClasses +// WITH_RUNTIME +// IGNORE_BACKEND: JVM_IR + +fun box(): String { + var uint1 = 1u + var uint2 = 2u + var uint3 = 3u + val uintSet = mutableSetOf(uint1) + uintSet.add(uint2); + { + uintSet.add(uint3) + if (!uintSet.contains(1u)) throw AssertionError() + if (!uintSet.contains(2u)) throw AssertionError() + if (!uintSet.contains(3u)) throw AssertionError() + }() + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index e7b2e6539dc..e0c6026d27a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12125,6 +12125,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/kt28405.kt"); } + @TestMetadata("kt28585.kt") + public void testKt28585() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28585.kt"); + } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 40da6125c6a..3f7c45f9dbe 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12125,6 +12125,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/kt28405.kt"); } + @TestMetadata("kt28585.kt") + public void testKt28585() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28585.kt"); + } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 546f2d5ecca..a31d9c97c39 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -12130,6 +12130,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/kt28405.kt"); } + @TestMetadata("kt28585.kt") + public void testKt28585() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28585.kt"); + } + @TestMetadata("mapInlineClassesWithSuppressWildcardsMode.kt") public void testMapInlineClassesWithSuppressWildcardsMode() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/mapInlineClassesWithSuppressWildcardsMode.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 75991d5ee5a..e2434bc7734 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 @@ -10495,6 +10495,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/kt28405.kt"); } + @TestMetadata("kt28585.kt") + public void testKt28585() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28585.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.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 13138a3bb73..6ed4f02f0a9 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 @@ -11550,6 +11550,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/kt28405.kt"); } + @TestMetadata("kt28585.kt") + public void testKt28585() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/kt28585.kt"); + } + @TestMetadata("noAssertionsOnInlineClassBasedOnNullableType.kt") public void testNoAssertionsOnInlineClassBasedOnNullableType() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/noAssertionsOnInlineClassBasedOnNullableType.kt");