diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt index aa30dfc7864..2e646cde807 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt @@ -27,13 +27,13 @@ import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtPureClassOrObject import org.jetbrains.kotlin.psi.KtPureElement import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils -import org.jetbrains.kotlin.resolve.DescriptorUtils.isInterface import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.isInlineClass import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.annotations.findJvmOverloadsAnnotation import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind +import org.jetbrains.kotlin.resolve.jvm.shouldHideConstructorDueToInlineClassTypeValueParameters import org.jetbrains.org.objectweb.asm.Label import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type @@ -268,6 +268,7 @@ class DefaultParameterValueSubstitutor(val state: GenerationState) { if (classOrObject.isLocal) return false if (classDescriptor.isInline) return false + if (shouldHideConstructorDueToInlineClassTypeValueParameters(constructorDescriptor)) return false if (CodegenBinding.canHaveOuter(state.bindingContext, classDescriptor)) return false diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt index 102a6e23472..18b41f8add2 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmDefaultConstructorLowering.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.ir.passTypeArgumentsFrom import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext +import org.jetbrains.kotlin.backend.jvm.lower.inlineclasses.hasMangledParameters import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.ir.builders.declarations.addConstructor @@ -42,6 +43,9 @@ private class JvmDefaultConstructorLowering(val context: JvmBackendContext) : Cl if (DescriptorVisibilities.isPrivate(primaryConstructor.visibility)) return + if (primaryConstructor.hasMangledParameters) + return + if (primaryConstructor.valueParameters.isEmpty() || !primaryConstructor.valueParameters.all { it.hasDefaultValue() }) return diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/noArgConstructorForInlineClassParameter.kt b/compiler/testData/codegen/bytecodeListing/inlineClasses/noArgConstructorForInlineClassParameter.kt new file mode 100644 index 00000000000..1f14b212031 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/noArgConstructorForInlineClassParameter.kt @@ -0,0 +1,3 @@ +inline class Z(val z: Int) + +class Test(val z: Z = Z(42)) \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/noArgConstructorForInlineClassParameter.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/noArgConstructorForInlineClassParameter.txt new file mode 100644 index 00000000000..acfba7c79ca --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/noArgConstructorForInlineClassParameter.txt @@ -0,0 +1,27 @@ +@kotlin.Metadata +public final class Test { + // source: 'noArgConstructorForInlineClassParameter.kt' + private final field z: int + private method (p0: int): void + public synthetic method (p0: int, p1: int, p2: kotlin.jvm.internal.DefaultConstructorMarker): void + public synthetic method (p0: int, p1: kotlin.jvm.internal.DefaultConstructorMarker): void + public final method getZ-a_XrcN0(): int +} + +@kotlin.Metadata +public final class Z { + // source: 'noArgConstructorForInlineClassParameter.kt' + private final field z: int + private synthetic method (p0: int): void + public synthetic final static method box-impl(p0: int): Z + 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 getZ(): 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/bytecodeText/constructors/inlineArgumentPrimaryDefaults.kt b/compiler/testData/codegen/bytecodeText/constructors/inlineArgumentPrimaryDefaults.kt index 4a16844dc7a..852453a3329 100644 --- a/compiler/testData/codegen/bytecodeText/constructors/inlineArgumentPrimaryDefaults.kt +++ b/compiler/testData/codegen/bytecodeText/constructors/inlineArgumentPrimaryDefaults.kt @@ -5,9 +5,4 @@ class B(val a: A = A(0)) // 1 private \(I\)V // 1 public synthetic \(IILkotlin/jvm/internal/DefaultConstructorMarker;\)V // 1 public synthetic \(ILkotlin/jvm/internal/DefaultConstructorMarker;\)V - -// JVM_TEMPLATES -// 1 private \(\)V - -// JVM_IR_TEMPLATES -// 1 public \(\)V +// 0 private \(\)V diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java index d3dd1be808d..1c40b0c0a3b 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java @@ -952,6 +952,11 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassWithManyKindsOfMembers.kt"); } + @TestMetadata("noArgConstructorForInlineClassParameter.kt") + public void testNoArgConstructorForInlineClassParameter() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/noArgConstructorForInlineClassParameter.kt"); + } + @TestMetadata("noBridgesForErasedInlineClass.kt") public void testNoBridgesForErasedInlineClass() throws Exception { runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java index a2f7ee35ff7..cf72b4e1631 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java @@ -922,6 +922,11 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassWithManyKindsOfMembers.kt"); } + @TestMetadata("noArgConstructorForInlineClassParameter.kt") + public void testNoArgConstructorForInlineClassParameter() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/noArgConstructorForInlineClassParameter.kt"); + } + @TestMetadata("noBridgesForErasedInlineClass.kt") public void testNoBridgesForErasedInlineClass() throws Exception { runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.kt");