JVM IR: Fix generation of parameterless default constructor

The JVM backend does not generate parameterless default constructors for
private constructors and constructors of local, inner, or inline
classes.
This commit is contained in:
Steven Schäfer
2020-01-13 16:11:14 +01:00
committed by Alexander Udalov
parent 5321a6af33
commit 8e07482862
12 changed files with 217 additions and 3 deletions
@@ -0,0 +1,15 @@
enum class Enum(val x: Int = 0) {
A,
B(0) { override fun f() {} };
open fun f() {}
}
// @Enum.class:
// 0 <init>\(\)V
// 1 private <init>\(Ljava/lang/String;II\)V
// 1 synthetic <init>\(Ljava/lang/String;IIILkotlin/jvm/internal/DefaultConstructorMarker;\)V
// 1 public synthetic <init>\(Ljava/lang/String;IILkotlin/jvm/internal/DefaultConstructorMarker;\)V
// @Enum$B.class:
// 0 <init>\(\)V
// 1 <init>\(Ljava/lang/String;I\)V
@@ -0,0 +1,13 @@
inline class A(val x: Int)
class B(val a: A = A(0))
// @B.class:
// 1 private <init>\(I\)V
// 1 public synthetic <init>\(IILkotlin/jvm/internal/DefaultConstructorMarker;\)V
// 1 public synthetic <init>\(ILkotlin/jvm/internal/DefaultConstructorMarker;\)V
// JVM_TEMPLATES
// 1 private <init>\(\)V
// JVM_IR_TEMPLATES
// 1 public <init>\(\)V
@@ -0,0 +1,13 @@
inline class A(val x: Int = 0)
// 0 <init>\(\)V
// 1 private synthetic <init>\(I\)V
// 1 public final static synthetic box-impl\(I\)LA;
// JVM_TEMPLATES
// 1 public static constructor-impl\(I\)I
// 1 public static synthetic constructor-impl\$default\(IILkotlin/jvm/internal/DefaultConstructorMarker;\)I
// JVM_IR_TEMPLATES
// 1 public final static constructor-impl\(I\)I
// 1 public static synthetic constructor-impl\$default\(IILjava/lang/Object;\)I
@@ -0,0 +1,12 @@
class A(val s: String) {
inner class B(val x: Int = 0)
}
// @A.class
// 1 public <init>\(Ljava/lang/String;\)V
// @A$B.class
// 0 <init>\(\)V
// 0 <init>\(LA;\)V
// 1 public <init>\(LA;I\)V
// 1 public synthetic <init>\(LA;IILkotlin/jvm/internal/DefaultConstructorMarker;\)V
@@ -0,0 +1,5 @@
class A internal constructor(val x: Int = 0)
// 1 public <init>\(\)V
// 1 public <init>\(I\)V
// 1 public synthetic <init>\(IILkotlin/jvm/internal/DefaultConstructorMarker;\)V
@@ -0,0 +1,16 @@
class A(val s: String) {
fun f(): Int {
class B(val x: Int = 0) {
fun f(): Int = x
}
return B().f()
}
}
// @A.class:
// 1 public <init>\(Ljava/lang/String;\)V
// @A$f$B.class:
// 0 <init>\(\)V
// 1 public <init>\(I\)V
// 1 public synthetic <init>\(IILkotlin/jvm/internal/DefaultConstructorMarker;\)V
@@ -0,0 +1,5 @@
class A(val x: Int = 0)
// 1 public <init>\(\)V
// 1 public <init>\(I\)V
// 1 public synthetic <init>\(IILkotlin/jvm/internal/DefaultConstructorMarker;\)V
@@ -0,0 +1,5 @@
class A private constructor(val x: Int = 0)
// 0 <init>\(\)V
// 1 private <init>\(I\)V
// 1 synthetic <init>\(IILkotlin/jvm/internal/DefaultConstructorMarker;\)V
@@ -0,0 +1,5 @@
class A protected constructor(val x: Int = 0)
// 1 protected <init>\(\)V
// 1 protected <init>\(I\)V
// 1 synthetic <init>\(IILkotlin/jvm/internal/DefaultConstructorMarker;\)V