diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index 0a3a0364961..4f98deb55c3 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -255,13 +255,22 @@ public class AsmUtil { flags |= ACC_ABSTRACT; } - if (KotlinTypeMapper.isAccessor(functionDescriptor) || hasJvmSyntheticAnnotation(functionDescriptor)) { + if (KotlinTypeMapper.isAccessor(functionDescriptor) || + hasJvmSyntheticAnnotation(functionDescriptor) || + isInlineClassWrapperConstructor(functionDescriptor, kind) + ) { flags |= ACC_SYNTHETIC; } return flags; } + private static boolean isInlineClassWrapperConstructor(@NotNull FunctionDescriptor functionDescriptor, @NotNull OwnerKind kind) { + if (!(functionDescriptor instanceof ConstructorDescriptor)) return false; + ClassDescriptor classDescriptor = ((ConstructorDescriptor) functionDescriptor).getConstructedClass(); + return classDescriptor.isInline() && kind == OwnerKind.IMPLEMENTATION; + } + public static int getCommonCallableFlags(FunctionDescriptor functionDescriptor, @NotNull GenerationState state) { int flags = getVisibilityAccessFlag(functionDescriptor); flags |= getVarargsFlag(functionDescriptor); diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/companionObjectInsideInlineClass.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/companionObjectInsideInlineClass.txt index 20145196342..175a3671a5f 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/companionObjectInsideInlineClass.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/companionObjectInsideInlineClass.txt @@ -24,7 +24,7 @@ public final class Foo { private final field x: int inner class Foo$Companion static method (): void - public method (p0: int): void + public synthetic method (p0: int): void public method equals(p0: java.lang.Object): boolean public final method getX(): int public method hashCode(): int diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/computablePropertiesInsideInlineClass.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/computablePropertiesInsideInlineClass.txt index c1bba2d4260..da7a8149850 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/computablePropertiesInsideInlineClass.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/computablePropertiesInsideInlineClass.txt @@ -13,7 +13,7 @@ static class Foo$Erased { @kotlin.Metadata public final class Foo { private final field x: int - public method (p0: int): void + public synthetic method (p0: int): void public method equals(p0: java.lang.Object): boolean public final method getX(): int public method hashCode(): int diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassConstructors.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassConstructors.txt index 2201e53bd89..9e4bfc8e9c6 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassConstructors.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassConstructors.txt @@ -12,7 +12,7 @@ static class Foo$Erased { @kotlin.Metadata public final class Foo { private final field x: int - public method (p0: int): void + public synthetic method (p0: int): void public method equals(p0: java.lang.Object): boolean public final method getX(): int public method hashCode(): int diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.txt index 45c409f2f35..dc7e18b445e 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.txt @@ -17,7 +17,7 @@ static class Foo$Erased { @kotlin.Metadata public final class Foo { private final field x: long - public method (p0: long): void + public synthetic method (p0: long): void public method equals(p0: java.lang.Object): boolean public synthetic method foo(p0: java.lang.Object): void public method foo-1e4ch6lh(p0: long): void diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/shapeOfInlineClassWithPrimitive.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/shapeOfInlineClassWithPrimitive.txt index f5f4c19fd88..dee5e27c9a4 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/shapeOfInlineClassWithPrimitive.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/shapeOfInlineClassWithPrimitive.txt @@ -14,7 +14,7 @@ static class Foo$Erased { @kotlin.Metadata public final class Foo { private final field l: long - public method (p0: long): void + public synthetic method (p0: long): void public method equals(p0: java.lang.Object): boolean public final method getL(): long public method hashCode(): int diff --git a/compiler/testData/codegen/bytecodeText/inlineClasses/constructorWithInlineClassParametersIsNotMangled.kt b/compiler/testData/codegen/bytecodeText/inlineClasses/constructorWithInlineClassParametersIsNotMangled.kt index f0638278062..8b21ea321d4 100644 --- a/compiler/testData/codegen/bytecodeText/inlineClasses/constructorWithInlineClassParametersIsNotMangled.kt +++ b/compiler/testData/codegen/bytecodeText/inlineClasses/constructorWithInlineClassParametersIsNotMangled.kt @@ -6,5 +6,5 @@ class C1(val ss: Str) class C2(val ss1: Str, val ss2: Str) -// 2 public \\(Ljava/lang/String;\)V +// 1 public \\(Ljava/lang/String;\)V // 1 public \\(Ljava/lang/String;Ljava/lang/String;\)V \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassWrapperPrimaryConstructorIsSynthetic.kt b/compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassWrapperPrimaryConstructorIsSynthetic.kt new file mode 100644 index 00000000000..8a003ae92c5 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassWrapperPrimaryConstructorIsSynthetic.kt @@ -0,0 +1,6 @@ +// !LANGUAGE: +InlineClasses + +inline class Z(val x: Int) + +// 1 public synthetic \(I\)V +// 1 public static constructor\(I\)I \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java index 74a11fe97f1..c8265ce57c9 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -2113,6 +2113,11 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { runTest("compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassExtendsErasedClass.kt"); } + @TestMetadata("inlineClassWrapperPrimaryConstructorIsSynthetic.kt") + public void testInlineClassWrapperPrimaryConstructorIsSynthetic() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassWrapperPrimaryConstructorIsSynthetic.kt"); + } + @TestMetadata("inlineClassesUnboxingAfterAssertionOperator.kt") public void testInlineClassesUnboxingAfterAssertionOperator() throws Exception { runTest("compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassesUnboxingAfterAssertionOperator.kt");