diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ErasedInlineClassBodyCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/ErasedInlineClassBodyCodegen.kt index b95fa52c5c3..65b0db5b2ea 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ErasedInlineClassBodyCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ErasedInlineClassBodyCodegen.kt @@ -14,11 +14,14 @@ import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.resolve.InlineClassDescriptorResolver import org.jetbrains.kotlin.resolve.descriptorUtil.secondaryConstructors +import org.jetbrains.kotlin.resolve.jvm.AsmTypes +import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErasedInlineClassOrigin import org.jetbrains.kotlin.resolve.jvm.diagnostics.Synthetic import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodGenericSignature import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type +import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter class ErasedInlineClassBodyCodegen( aClass: KtClass, @@ -28,9 +31,8 @@ class ErasedInlineClassBodyCodegen( parentCodegen: MemberCodegen<*>? ) : ClassBodyCodegen(aClass, context, v, state, parentCodegen) { - private val superClassAsmType: Type by lazy { - SuperClassInfo.getSuperClassInfo(descriptor, typeMapper).type - } + private val wrapperSuperClassAsmType = AsmTypes.OBJECT_TYPE + private val erasedSuperClassAsmType = AsmTypes.OBJECT_TYPE private val classAsmType = typeMapper.mapErasedInlineClass(descriptor) @@ -40,7 +42,7 @@ class ErasedInlineClassBodyCodegen( override fun generateDeclaration() { v.defineClass( - myClass.psiOrParent, state.classFileVersion, Opcodes.ACC_FINAL or Opcodes.ACC_STATIC or Opcodes.ACC_PUBLIC, + myClass.psiOrParent, state.classFileVersion, Opcodes.ACC_STATIC or Opcodes.ACC_PUBLIC, classAsmType.internalName, null, "java/lang/Object", ArrayUtil.EMPTY_STRING_ARRAY ) v.visitSource(myClass.containingKtFile.name, null) @@ -49,15 +51,30 @@ class ErasedInlineClassBodyCodegen( override fun generateConstructors() { val delegationFieldsInfo = DelegationFieldsInfo(classAsmType, descriptor, state, bindingContext) - constructorCodegen.generatePrimaryConstructor( - delegationFieldsInfo.getDelegationFieldsInfo(myClass.superTypeListEntries), superClassAsmType - ) + generateDefaultConstructorForErasedInlineClass() + + constructorCodegen.generatePrimaryConstructor(delegationFieldsInfo, wrapperSuperClassAsmType) for (secondaryConstructor in descriptor.secondaryConstructors) { - constructorCodegen.generateSecondaryConstructor(secondaryConstructor, superClassAsmType) + constructorCodegen.generateSecondaryConstructor(secondaryConstructor, wrapperSuperClassAsmType) } } + private fun generateDefaultConstructorForErasedInlineClass() { + val mv = v.newMethod( + ErasedInlineClassOrigin(myClass.psiOrParent, descriptor), 0, + "", "()V", null, ArrayUtil.EMPTY_STRING_ARRAY + ) + mv.visitCode() + InstructionAdapter(mv).apply { + load(0, AsmTypes.OBJECT_TYPE) + invokespecial(erasedSuperClassAsmType.internalName, "", "()V", false) + areturn(Type.VOID_TYPE) + } + mv.visitMaxs(1, 1) + mv.visitEnd() + } + override fun generateSyntheticPartsAfterBody() { super.generateSyntheticPartsAfterBody() diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 451716563ef..6c5de54ce5d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -131,7 +131,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @Override protected void generateDeclaration() { - getSuperClass(); + superClassInfo = SuperClassInfo.getSuperClassInfo(descriptor, typeMapper); + superClassAsmType = superClassInfo.getType(); JvmClassSignature signature = signature(); @@ -404,11 +405,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { new ArrayList<>(superInterfaces), sw.makeJavaGenericSignature()); } - private void getSuperClass() { - superClassInfo = SuperClassInfo.getSuperClassInfo(descriptor, typeMapper); - superClassAsmType = superClassInfo.getType(); - } - @Override protected void generateSyntheticPartsBeforeBody() { generatePropertyMetadataArrayFieldIfNeeded(classAsmType); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/SuperClassInfo.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/SuperClassInfo.kt index 4d178d5325d..6e197d95289 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/SuperClassInfo.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/SuperClassInfo.kt @@ -25,9 +25,9 @@ import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.org.objectweb.asm.Type class SuperClassInfo( - val type: Type, - // null means java/lang/Object - val kotlinType: KotlinType? + val type: Type, + // null means java/lang/Object or irrelevant + val kotlinType: KotlinType? ) { companion object { @@ -37,6 +37,10 @@ class SuperClassInfo( return SuperClassInfo(OBJECT_TYPE, null) } + if (descriptor.isInline) { + return SuperClassInfo(typeMapper.mapErasedInlineClass(descriptor), null) + } + for (supertype in descriptor.typeConstructor.supertypes) { val superClass = supertype.constructor.declarationDescriptor if (superClass != null && !isJvmInterface(superClass)) { diff --git a/compiler/testData/codegen/box/inlineClasses/overridingFunCallingPrivateFun.kt b/compiler/testData/codegen/box/inlineClasses/overridingFunCallingPrivateFun.kt new file mode 100644 index 00000000000..71e40972f05 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/overridingFunCallingPrivateFun.kt @@ -0,0 +1,16 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR + +interface IFoo { + fun foo(): String +} + +inline class IC(val x: String) : IFoo { + private fun privateFun() = x + override fun foo() = privateFun() +} + +fun box(): String { + val x: IFoo = IC("OK") + return x.foo() +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt b/compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt new file mode 100644 index 00000000000..751e06fb5ce --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt @@ -0,0 +1,12 @@ +// !LANGUAGE: +InlineClasses +// IGNORE_BACKEND: JVM_IR + +inline class IC(val x: String) { + private fun privateFun() = x + override fun toString() = privateFun() +} + +fun box(): String { + val x: Any = IC("OK") + return x.toString() +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxInline/inlineClasses/inlineFunctionInsideInlineClassesBox.kt b/compiler/testData/codegen/boxInline/inlineClasses/inlineFunctionInsideInlineClassesBox.kt index f8ddd877767..5c2a99144e1 100644 --- a/compiler/testData/codegen/boxInline/inlineClasses/inlineFunctionInsideInlineClassesBox.kt +++ b/compiler/testData/codegen/boxInline/inlineClasses/inlineFunctionInsideInlineClassesBox.kt @@ -14,6 +14,8 @@ inline class A(val x: Int) { inline fun stub() {} // FILE: 2.kt +// NO_CHECK_LAMBDA_INLINING +// ^ TODO import test.* diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/companionObjectInsideInlineClass.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/companionObjectInsideInlineClass.txt index 57a51ba002d..4a5791780c1 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/companionObjectInsideInlineClass.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/companionObjectInsideInlineClass.txt @@ -7,7 +7,8 @@ public final class Foo$Companion { } @kotlin.Metadata -public final static class Foo$Erased { +public static class Foo$Erased { + method (): void public final static @org.jetbrains.annotations.NotNull method box(p0: int): Foo public static method constructor(p0: int): int public static method equals(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/computablePropertiesInsideInlineClass.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/computablePropertiesInsideInlineClass.txt index 3717a0419a4..885af5dfca0 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/computablePropertiesInsideInlineClass.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/computablePropertiesInsideInlineClass.txt @@ -1,5 +1,6 @@ @kotlin.Metadata -public final static class Foo$Erased { +public static class Foo$Erased { + method (): void public final static @org.jetbrains.annotations.NotNull method box(p0: int): Foo public static method constructor(p0: int): int public static method equals(p0: int, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.txt index 547888ba51a..9bcf94a7d6f 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.txt @@ -4,7 +4,8 @@ public interface A { } @kotlin.Metadata -public final static class Foo$Erased { +public static class Foo$Erased { + method (): void public final static @org.jetbrains.annotations.NotNull method box(p0: long): Foo public static method constructor(p0: long): long public static method equals(p0: long, @org.jetbrains.annotations.Nullable p1: java.lang.Object): boolean diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/shapeOfInlineClassWithPrimitive.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/shapeOfInlineClassWithPrimitive.txt index 1c9f4750644..27304eac248 100644 --- a/compiler/testData/codegen/bytecodeListing/inlineClasses/shapeOfInlineClassWithPrimitive.txt +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/shapeOfInlineClassWithPrimitive.txt @@ -1,5 +1,6 @@ @kotlin.Metadata -public final static class Foo$Erased { +public static class Foo$Erased { + method (): void public final static @org.jetbrains.annotations.NotNull method box(p0: long): Foo public static method constructor(p0: long): long public final static method empty(p0: long): void diff --git a/compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassExtendsErasedClass.kt b/compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassExtendsErasedClass.kt new file mode 100644 index 00000000000..198e8020933 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassExtendsErasedClass.kt @@ -0,0 +1,15 @@ +// !LANGUAGE: +InlineClasses + +inline class Z(val x: Int) + +interface IFoo +interface IBar +inline class FooBar(val x: Int) : IFoo, IBar + +// 1 public final class Z extends Z\$Erased +// 1 static class Z\$Erased +// 0 public static class Z\$Erased + +// 1 public final class FooBar extends FooBar\$Erased implements IFoo IBar +// 1 static class FooBar\$Erased +// 0 public static class FooBar\$Erased \ 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 8c92662773c..fe70e56df28 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11731,6 +11731,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/nullableEqeqNonNull.kt"); } + @TestMetadata("overridingFunCallingPrivateFun.kt") + public void testOverridingFunCallingPrivateFun() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/overridingFunCallingPrivateFun.kt"); + } + @TestMetadata("passInlineClassAsVararg.kt") public void testPassInlineClassAsVararg() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/passInlineClassAsVararg.kt"); @@ -11761,6 +11766,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt"); } + @TestMetadata("toStringCallingPrivateFun.kt") + public void testToStringCallingPrivateFun() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt"); + } + @TestMetadata("typeChecksForInlineClasses.kt") public void testTypeChecksForInlineClasses() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/typeChecksForInlineClasses.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java index 24babb43116..b4c87f2ab6c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -2088,6 +2088,11 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { runTest("compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassBoxingUnboxingInsideInlinedLambda.kt"); } + @TestMetadata("inlineClassExtendsErasedClass.kt") + public void testInlineClassExtendsErasedClass() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassExtendsErasedClass.kt"); + } + @TestMetadata("inlineClassesUnboxingAfterAssertionOperator.kt") public void testInlineClassesUnboxingAfterAssertionOperator() throws Exception { runTest("compiler/testData/codegen/bytecodeText/inlineClasses/inlineClassesUnboxingAfterAssertionOperator.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 91a21462a41..411cc0f8919 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -11731,6 +11731,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/nullableEqeqNonNull.kt"); } + @TestMetadata("overridingFunCallingPrivateFun.kt") + public void testOverridingFunCallingPrivateFun() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/overridingFunCallingPrivateFun.kt"); + } + @TestMetadata("passInlineClassAsVararg.kt") public void testPassInlineClassAsVararg() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/passInlineClassAsVararg.kt"); @@ -11761,6 +11766,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt"); } + @TestMetadata("toStringCallingPrivateFun.kt") + public void testToStringCallingPrivateFun() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt"); + } + @TestMetadata("typeChecksForInlineClasses.kt") public void testTypeChecksForInlineClasses() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/typeChecksForInlineClasses.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 3d16cdd15b9..d00b24da70e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11731,6 +11731,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/nullableEqeqNonNull.kt"); } + @TestMetadata("overridingFunCallingPrivateFun.kt") + public void testOverridingFunCallingPrivateFun() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/overridingFunCallingPrivateFun.kt"); + } + @TestMetadata("passInlineClassAsVararg.kt") public void testPassInlineClassAsVararg() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/passInlineClassAsVararg.kt"); @@ -11761,6 +11766,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt"); } + @TestMetadata("toStringCallingPrivateFun.kt") + public void testToStringCallingPrivateFun() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt"); + } + @TestMetadata("typeChecksForInlineClasses.kt") public void testTypeChecksForInlineClasses() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/typeChecksForInlineClasses.kt"); diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java index f48c6104eff..fe15481f4a3 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java @@ -26,7 +26,6 @@ import static org.jetbrains.kotlin.resolve.DescriptorUtils.isCompanionObject; public final class JvmAbi { public static final String DEFAULT_IMPLS_CLASS_NAME = "DefaultImpls"; public static final String ERASED_INLINE_CONSTRUCTOR_NAME = "constructor"; - private static final String ERASED_INLINE_CLASS_NAME = "Erased"; public static final FqName JVM_FIELD_ANNOTATION_FQ_NAME = new FqName("kotlin.jvm.JvmField"); /** @@ -58,6 +57,7 @@ public final class JvmAbi { public static final String LOCAL_VARIABLE_NAME_PREFIX_INLINE_ARGUMENT = "$i$a$"; public static final String LOCAL_VARIABLE_NAME_PREFIX_INLINE_FUNCTION = "$i$f$"; + private static final String ERASED_INLINE_CLASS_NAME = "Erased"; public static final String ERASED_INLINE_CLASS_SUFFIX = "$" + ERASED_INLINE_CLASS_NAME; @NotNull 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 e817655439b..19ae636a890 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 @@ -10266,6 +10266,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/nullableEqeqNonNull.kt"); } + @TestMetadata("overridingFunCallingPrivateFun.kt") + public void testOverridingFunCallingPrivateFun() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/overridingFunCallingPrivateFun.kt"); + } + @TestMetadata("passInlineClassAsVararg.kt") public void testPassInlineClassAsVararg() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/passInlineClassAsVararg.kt"); @@ -10296,6 +10301,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt"); } + @TestMetadata("toStringCallingPrivateFun.kt") + public void testToStringCallingPrivateFun() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt"); + } + @TestMetadata("typeChecksForInlineClasses.kt") public void testTypeChecksForInlineClasses() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/typeChecksForInlineClasses.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 62f4385d74a..96db6c3fafc 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 @@ -11331,6 +11331,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/nullableEqeqNonNull.kt"); } + @TestMetadata("overridingFunCallingPrivateFun.kt") + public void testOverridingFunCallingPrivateFun() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/overridingFunCallingPrivateFun.kt"); + } + @TestMetadata("passInlineClassAsVararg.kt") public void testPassInlineClassAsVararg() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/passInlineClassAsVararg.kt"); @@ -11361,6 +11366,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/secondaryConstructorsInsideInlineClass.kt"); } + @TestMetadata("toStringCallingPrivateFun.kt") + public void testToStringCallingPrivateFun() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/toStringCallingPrivateFun.kt"); + } + @TestMetadata("typeChecksForInlineClasses.kt") public void testTypeChecksForInlineClasses() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/typeChecksForInlineClasses.kt");