diff --git a/plugins/noarg/noarg-cli/src/NoArgExpressionCodegenExtension.kt b/plugins/noarg/noarg-cli/src/NoArgExpressionCodegenExtension.kt index 2d61e61f661..32fccd04444 100644 --- a/plugins/noarg/noarg-cli/src/NoArgExpressionCodegenExtension.kt +++ b/plugins/noarg/noarg-cli/src/NoArgExpressionCodegenExtension.kt @@ -44,15 +44,24 @@ class NoArgExpressionCodegenExtension(val invokeInitializers: Boolean = false) : val constructorDescriptor = createNoArgConstructorDescriptor(descriptor) + val isParentASealedClass = (descriptor.containingDeclaration as? ClassDescriptor)?.modality == Modality.SEALED + functionCodegen.generateMethod(JvmDeclarationOrigin.NO_ORIGIN, constructorDescriptor, object: CodegenBased(state) { override fun doGenerateBody(codegen: ExpressionCodegen, signature: JvmMethodSignature) { codegen.v.load(0, AsmTypes.OBJECT_TYPE) - codegen.v.visitMethodInsn(Opcodes.INVOKESPECIAL, superClassInternalName, "", "()V", false) + + if (isParentASealedClass) { + codegen.v.aconst(null) + codegen.v.visitMethodInsn(Opcodes.INVOKESPECIAL, superClassInternalName, "", + "(Lkotlin/jvm/internal/DefaultConstructorMarker;)V", false) + } + else { + codegen.v.visitMethodInsn(Opcodes.INVOKESPECIAL, superClassInternalName, "", "()V", false) + } if (invokeInitializers) { generateInitializers(codegen) } - codegen.v.visitInsn(Opcodes.RETURN) } }) diff --git a/plugins/noarg/noarg-cli/testData/box/kt18245.kt b/plugins/noarg/noarg-cli/testData/box/kt18245.kt new file mode 100644 index 00000000000..2de048987d2 --- /dev/null +++ b/plugins/noarg/noarg-cli/testData/box/kt18245.kt @@ -0,0 +1,22 @@ +// WITH_RUNTIME + +annotation class NoArg + +sealed class Test { + abstract val test: String + + @NoArg + data class Test1(override val test: String) : Test() + + @NoArg + data class Test2(override val test: String) : Test() +} + +fun box(): String { + Test::class.java.declaredConstructors.forEach { it.isAccessible = true } + Test.Test1::class.java.declaredConstructors.forEach { it.isAccessible = true } + + val instance = Test.Test1::class.java.newInstance() // Error + + return "OK" +} \ No newline at end of file diff --git a/plugins/plugins-tests/tests/org/jetbrains/kotlin/noarg/BlackBoxCodegenTestForNoArgGenerated.java b/plugins/plugins-tests/tests/org/jetbrains/kotlin/noarg/BlackBoxCodegenTestForNoArgGenerated.java index 250ec9f258c..d50b4997806 100644 --- a/plugins/plugins-tests/tests/org/jetbrains/kotlin/noarg/BlackBoxCodegenTestForNoArgGenerated.java +++ b/plugins/plugins-tests/tests/org/jetbrains/kotlin/noarg/BlackBoxCodegenTestForNoArgGenerated.java @@ -48,6 +48,12 @@ public class BlackBoxCodegenTestForNoArgGenerated extends AbstractBlackBoxCodege doTest(fileName); } + @TestMetadata("kt18245.kt") + public void testKt18245() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("plugins/noarg/noarg-cli/testData/box/kt18245.kt"); + doTest(fileName); + } + @TestMetadata("kt18667.kt") public void testKt18667() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("plugins/noarg/noarg-cli/testData/box/kt18667.kt");