Erase non-reified type parameters by-default when inlining.

Substitution of type arguments to non-reified type parameters may lead
to accidental reification, which should not be done (see ^KT-60174 for
examples). So, we should erase them, except the few cases.

^KT-60174: Fixed
^KT-60175: Fixed
This commit is contained in:
vladislav.grechko
2023-07-27 18:30:50 +02:00
committed by Space Team
parent 29ecc4d987
commit f318b5969d
89 changed files with 2369 additions and 280 deletions
@@ -1,7 +1,5 @@
// IGNORE_BACKEND: WASM
// https://youtrack.jetbrains.com/issue/KT-44571/Segfault-on-unnecessary-int-unboxing
// IGNORE_NATIVE: optimizationMode=DEBUG
// IGNORE_NATIVE: optimizationMode=NO
// NO_CHECK_LAMBDA_INLINING
// FILE: 1.kt
package test
@@ -0,0 +1,7 @@
// FILE: 1.kt
inline fun <T> f(arr: Array<T>, func: (T) -> Int): Int = func(arr[0])
// FILE: 2.kt
fun box(): String = ('O' + f(arrayOf(""), String::length)).toString() + "K"
@@ -0,0 +1,13 @@
// FILE: 1.kt
inline fun <T> foo(): String {
var arr: Array<T> = Array(1) { Any() } as Array<T>
arr[0] = bar()
return arr[0] as String
}
fun <T> bar(): T = "OK" as T
// FILE: 2.kt
fun box() = foo<Int>()
@@ -0,0 +1,11 @@
// FILE: 1.kt
inline fun <T> foo(): String {
return bar<T>()!!.toString()
}
fun <T> bar(): T = "OK" as T
// FILE: 2.kt
fun box() = foo<Int>()
@@ -0,0 +1,12 @@
// FILE: 1.kt
inline fun <T> foo(x: Any?): String {
return with(object {
fun T.bar() = this
}) { (x as T).bar() } as String
}
// FILE: 2.kt
fun box() = foo<Int>("OK")
@@ -0,0 +1,11 @@
// FILE: 1.kt
inline fun <T> foo(x: Any?): String {
return { y: T -> "OK" }.invoke(x as T)
}
// FILE: 2.kt
fun box() = foo<Int>("")
@@ -0,0 +1,15 @@
// FILE: 1.kt
import kotlin.reflect.KProperty
inline fun <T> foo(): String {
val x: T by ""
return x as String
}
operator fun <T> String.getValue(nothing: Any?, property: KProperty<*>) = "OK" as T
// FILE: 2.kt
fun box() = foo<Int>()
@@ -0,0 +1,11 @@
// FILE: 1.kt
inline fun <T> foo(x: Any?): String {
return object {
val y: T = x as T
}.y as String
}
// FILE: 2.kt
fun box() = foo<Int>("OK")
@@ -0,0 +1,10 @@
// FILE: 1.kt
inline fun <T> foo(x: Any?): String {
val y: T = x as T
return y as String
}
// FILE: 2.kt
fun box() = foo<Int>("OK")
@@ -0,0 +1,11 @@
// FILE: 1.kt
inline fun <T> foo(x: Any?): String {
return object {
fun bar(): T = x as T
}.bar() as String
}
// FILE: 2.kt
fun box() = foo<Int>("OK")
@@ -0,0 +1,11 @@
// FILE: 1.kt
inline fun <T> foo(x: Any?): String {
return object {
fun bar(y: T) = y as String
}.bar(x as T)
}
// FILE: 2.kt
fun box() = foo<Int>("OK")
@@ -0,0 +1,15 @@
// FILE: 1.kt
inline fun <T: Unit?> myrun(block: () -> T) = block()
// FILE: 2.kt
fun box(): String {
var x = "Fail"
myrun L@{
if (false) return@L Unit
x = "OK"
null
}
return x
}
@@ -12,14 +12,14 @@ MODULE main
+ 2 1.kt
_1Kt
*L
1#1,18:1
8#2,2:19
1#1,16:1
6#2,2:17
*S KotlinDebug
*F
+ 1 2.kt
_2Kt
*L
16#1:19,2
14#1:17,2
*E
} )
K2
@@ -33,15 +33,15 @@ MODULE main
+ 2 1.kt
_1Kt
*L
1#1,18:1
8#2:19
7#2,3:20
1#1,16:1
6#2:17
5#2,3:18
*S KotlinDebug
*F
+ 1 2.kt
_2Kt
*L
16#1:19
16#1:20,3
14#1:17
14#1:18,3
*E
} )
@@ -1,5 +1,3 @@
// IGNORE_INLINER: IR
// IGNORE_BACKEND: WASM
// JVM_ABI_K1_K2_DIFF: KT-62464
// FILE: 1.kt