Fix bridge methods generation when inline class types are used

This commit is contained in:
Mikhail Zarechenskiy
2018-06-19 15:58:31 +03:00
parent f326fd66be
commit fcacdc1fc5
10 changed files with 91 additions and 11 deletions
@@ -0,0 +1,34 @@
// !LANGUAGE: +InlineClasses
// IGNORE_BACKEND: JS_IR
inline class InlinedComparable(val x: Int) : Comparable<InlinedComparable> {
override fun compareTo(other: InlinedComparable): Int {
return x.compareTo(other.x)
}
}
fun <T> generic(c: Comparable<T>, element: T) = c.compareTo(element)
interface Base<T> {
fun Base<T>.foo(a: Base<T>, b: T): Base<T>
}
inline class InlinedBase(val x: Int) : Base<InlinedBase> {
override fun Base<InlinedBase>.foo(a: Base<InlinedBase>, b: InlinedBase): Base<InlinedBase> {
return if (a is InlinedBase) InlinedBase(a.x + b.x) else this
}
fun double(): InlinedBase {
return this.foo(this, this) as InlinedBase
}
}
fun box(): String {
val a = InlinedComparable(42)
if (generic(a, a) != 0) return "Fail 1"
val b = InlinedBase(3)
if (b.double().x != 6) return "Fail 2"
return "OK"
}
@@ -13,6 +13,10 @@ inline class MyUIntArray(private val storage: IntArray) : Collection<MyUInt> {
override fun isEmpty(): Boolean = TODO()
}
fun <T> checkBoxed(c: Collection<T>, element: T): Boolean {
return c.contains(element) && c.containsAll(listOf(element))
}
fun box(): String {
val uints = MyUIntArray(intArrayOf(0, 1, 42))
@@ -21,5 +25,7 @@ fun box(): String {
val ints = listOf(MyUInt(1), MyUInt(0))
if (!uints.containsAll(ints)) return "Fail 2"
if (!checkBoxed(uints, MyUInt(0))) return "Fail 3"
return "OK"
}
@@ -8,7 +8,7 @@ inline class UIntArray(private val intArray: IntArray) {
inline class UIntIterator(private val intIterator: IntIterator) : Iterator<UInt> {
override fun next(): UInt {
return UInt(intIterator.next())
return UInt(intIterator.next()) // box inside bridge that returns java/lang/Object
}
override fun hasNext(): Boolean {
@@ -27,7 +27,7 @@ fun test() {
fun takeUInt(u: UInt) {}
// 0 INVOKESTATIC UInt\$Erased.box
// 1 INVOKESTATIC UInt\$Erased.box
// 0 INVOKEVIRTUAL UInt.unbox
// 0 INVOKEVIRTUAL UIntIterator.iterator
@@ -35,5 +35,4 @@ fun takeUInt(u: UInt) {}
// 0 intValue
// inside wrong bridge
// 1 valueOf
// 0 valueOf