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 c4bb466b703..5e1c6b8c5e5 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 @@ -22799,6 +22799,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierTypeGeneric.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); } + @Test + @TestMetadata("secondaryConstructorsWithBody.kt") + public void testSecondaryConstructorsWithBody() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsWithBody.kt"); + } + @Test @TestMetadata("simpleSecondaryConstructor.kt") public void testSimpleSecondaryConstructor() throws Exception { @@ -50621,6 +50627,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/valueClasses/overrides_typeParameters.kt"); } + @Test + @TestMetadata("secondaryConstructorsWithBody.kt") + public void testSecondaryConstructorsWithBody() throws Exception { + runTest("compiler/testData/codegen/box/valueClasses/secondaryConstructorsWithBody.kt"); + } + @Test @TestMetadata("throwingMFVCReassignments.kt") public void testThrowingMFVCReassignments() throws Exception { diff --git a/compiler/testData/codegen/box/inlineClasses/secondaryConstructorsWithBody.kt b/compiler/testData/codegen/box/inlineClasses/secondaryConstructorsWithBody.kt new file mode 100644 index 00000000000..bc6a2425a41 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/secondaryConstructorsWithBody.kt @@ -0,0 +1,29 @@ +// LANGUAGE: +ValueClassesSecondaryConstructorWithBody +// TARGET_BACKEND: JVM_IR +// CHECK_BYTECODE_LISTING +// WITH_STDLIB +// FIR_IDENTICAL + +val l = mutableListOf() + +@JvmInline +value class VC(val x: Int) { + constructor(xD: Double): this(-xD.toInt()) { + l.add(xD) + l.add(x) + l.add(this) + } + + init { + l.add(x) + l.add(this) + } +} + +fun box(): String { + val vc = VC(1) + require(vc == VC(-1.0)) { "$vc\n${VC(-1.0)}"} + val actual = listOf(1, vc, 1, vc, -1.0, 1, vc) + require(l == actual) { "$l\n$actual" } + return "OK" +} diff --git a/compiler/testData/codegen/box/inlineClasses/secondaryConstructorsWithBody.txt b/compiler/testData/codegen/box/inlineClasses/secondaryConstructorsWithBody.txt new file mode 100644 index 00000000000..c6364b2066e --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/secondaryConstructorsWithBody.txt @@ -0,0 +1,28 @@ +@kotlin.Metadata +public final class SecondaryConstructorsWithBodyKt { + // source: 'secondaryConstructorsWithBody.kt' + private final static @org.jetbrains.annotations.NotNull field l: java.util.List + static method (): void + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String + public final static @org.jetbrains.annotations.NotNull method getL(): java.util.List +} + +@kotlin.jvm.JvmInline +@kotlin.Metadata +public final class VC { + // source: 'secondaryConstructorsWithBody.kt' + private final field x: int + private synthetic method (p0: int): void + public synthetic final static method box-impl(p0: int): VC + public static method constructor-impl(p0: double): int + 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 getX(): 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 +} diff --git a/compiler/testData/codegen/box/valueClasses/secondaryConstructorsWithBody.kt b/compiler/testData/codegen/box/valueClasses/secondaryConstructorsWithBody.kt new file mode 100644 index 00000000000..cd8ea2ecbee --- /dev/null +++ b/compiler/testData/codegen/box/valueClasses/secondaryConstructorsWithBody.kt @@ -0,0 +1,32 @@ +// LANGUAGE: +ValueClasses, +ValueClassesSecondaryConstructorWithBody +// TARGET_BACKEND: JVM_IR +// CHECK_BYTECODE_LISTING +// WITH_STDLIB +// FIR_IDENTICAL + +val l = mutableListOf() + +@JvmInline +value class VC(val x: Int, val y: ULong) { + constructor(xD: Double, yD: Double): this(xD.toInt() - 2, yD.toULong() - 2UL) { + l.add(xD) + l.add(yD) + l.add(x) + l.add(y) + l.add(this) + } + + init { + l.add(x) + l.add(y) + l.add(this) + } +} + +fun box(): String { + val vc = VC(1, 2UL) + require(vc == VC(3.0, 4.0)) { "$vc\n${VC(3.0, 4.0)}"} + val actual = listOf(1, 2UL, vc, 1, 2UL, vc, 3.0, 4.0, 1, 2UL, vc) + require(l == actual) { "$l\n$actual" } + return "OK" +} diff --git a/compiler/testData/codegen/box/valueClasses/secondaryConstructorsWithBody.txt b/compiler/testData/codegen/box/valueClasses/secondaryConstructorsWithBody.txt new file mode 100644 index 00000000000..8e4d02bb586 --- /dev/null +++ b/compiler/testData/codegen/box/valueClasses/secondaryConstructorsWithBody.txt @@ -0,0 +1,31 @@ +@kotlin.Metadata +public final class SecondaryConstructorsWithBodyKt { + // source: 'secondaryConstructorsWithBody.kt' + private final static @org.jetbrains.annotations.NotNull field l: java.util.List + static method (): void + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String + public final static @org.jetbrains.annotations.NotNull method getL(): java.util.List +} + +@kotlin.jvm.JvmInline +@kotlin.Metadata +public final class VC { + // source: 'secondaryConstructorsWithBody.kt' + private final field x: int + private final field y: long + private synthetic method (p0: int, p1: long): void + public synthetic final static method box-impl(p0: int, p1: long): VC + public final static @org.jetbrains.annotations.NotNull method constructor-impl(p0: double, p1: double): VC + public final static method constructor-impl(p0: int, p1: long): void + public method equals(@org.jetbrains.annotations.Nullable p0: java.lang.Object): boolean + public static method equals-impl(p0: int, p1: long, p2: java.lang.Object): boolean + public final static method equals-impl0(p0: int, p1: long, p2: int, p3: long): boolean + public final method getX(): int + public final method getY-s-VKNKU(): long + public method hashCode(): int + public static method hashCode-impl(p0: int, p1: long): int + public @org.jetbrains.annotations.NotNull method toString(): java.lang.String + public static method toString-impl(p0: int, p1: long): java.lang.String + public synthetic final method unbox-impl-x(): int + public synthetic final method unbox-impl-y(): long +} 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 44cf62fe4c8..c5944ad54bd 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 @@ -22799,6 +22799,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClassWithPrimitiveCarrierTypeGeneric.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); } + @Test + @TestMetadata("secondaryConstructorsWithBody.kt") + public void testSecondaryConstructorsWithBody() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsWithBody.kt"); + } + @Test @TestMetadata("simpleSecondaryConstructor.kt") public void testSimpleSecondaryConstructor() throws Exception { @@ -50621,6 +50627,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/valueClasses/overrides_typeParameters.kt"); } + @Test + @TestMetadata("secondaryConstructorsWithBody.kt") + public void testSecondaryConstructorsWithBody() throws Exception { + runTest("compiler/testData/codegen/box/valueClasses/secondaryConstructorsWithBody.kt"); + } + @Test @TestMetadata("throwingMFVCReassignments.kt") public void testThrowingMFVCReassignments() throws Exception { diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 301130e5530..686269ba784 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -282,6 +282,7 @@ enum class LanguageFeature( RefineTypeCheckingOnAssignmentsToJavaFields(KOTLIN_1_9, kind = BUG_FIX), // KT-46727 InlineLateinit(KOTLIN_1_9, kind = OTHER), // KT-23814 ReferencesToSyntheticJavaProperties(KOTLIN_1_9), // KT-8575 + ValueClassesSecondaryConstructorWithBody(sinceVersion = KOTLIN_1_9, kind = UNSTABLE_FEATURE), // KT-55333 // Disabled for indefinite time. See KT-53751 @@ -314,7 +315,6 @@ enum class LanguageFeature( JavaSamConversionEqualsHashCode(sinceVersion = null, kind = UNSTABLE_FEATURE), UnitConversionsOnArbitraryExpressions(sinceVersion = null), JsAllowImplementingFunctionInterface(sinceVersion = null, kind = UNSTABLE_FEATURE), - ValueClassesSecondaryConstructorWithBody(sinceVersion = null, kind = UNSTABLE_FEATURE), ; init {