[FIR] Improve TYPE_PARAMETER_AS_REIFIED detecting, implement TYPE_PARAMETER_AS_REIFIED_ARRAY, TYPE_PARAMETER_AS_REIFIED_ARRAY_WARNING

This commit is contained in:
Ivan Kochurkin
2021-07-14 23:13:50 +03:00
committed by teamcityserver
parent 2333b1bcf6
commit bade6cb611
26 changed files with 161 additions and 120 deletions
@@ -1,13 +0,0 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
inline operator fun <reified T> T.plus(p: T): T = this
inline operator fun <reified T> T.invoke(): T = this
fun <A> main(tp: A, any: Any) {
tp + tp
any + any
tp()
any()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
inline operator fun <reified T> T.plus(p: T): T = this
@@ -1,19 +0,0 @@
// !LANGUAGE: +ProhibitNonReifiedArraysAsReifiedTypeArguments
// !DIAGNOSTICS: -UNUSED_PARAMETER
inline fun <reified T> foo() {}
fun <T> bar() {
foo<T>()
foo<Array<T>>()
foo<Array<Array<T>>>()
foo<Array<Int>>()
foo<Array<Array<Int>>>()
foo<IntArray>()
foo<List<T>>()
foo<List<Array<T>>>()
}
fun test(x: Array<String>, y: Array<*>) {
bar<Int>()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +ProhibitNonReifiedArraysAsReifiedTypeArguments
// !DIAGNOSTICS: -UNUSED_PARAMETER
@@ -1,19 +0,0 @@
// !LANGUAGE: -ProhibitNonReifiedArraysAsReifiedTypeArguments
// !DIAGNOSTICS: -UNUSED_PARAMETER
inline fun <reified T> foo() {}
fun <T> bar() {
foo<T>()
foo<Array<T>>()
foo<Array<Array<T>>>()
foo<Array<Int>>()
foo<Array<Array<Int>>>()
foo<IntArray>()
foo<List<T>>()
foo<List<Array<T>>>()
}
fun test(x: Array<String>, y: Array<*>) {
bar<Int>()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: -ProhibitNonReifiedArraysAsReifiedTypeArguments
// !DIAGNOSTICS: -UNUSED_PARAMETER
@@ -1,16 +0,0 @@
class C<<!REIFIED_TYPE_PARAMETER_NO_INLINE!>reified<!> T>
fun <T> id(p: T): T = p
fun <A> main() {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>C<!>()
val a: C<A> = C()
C<A>()
val b: C<Int> = C()
C<Int>()
// TODO svtk, uncomment when extensions are called for nested calls!
//val < !UNUSED_VARIABLE!>с< !>: C<A> = id(< !TYPE_PARAMETER_AS_REIFIED!>C< !>())
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
class C<<!REIFIED_TYPE_PARAMETER_NO_INLINE!>reified<!> T>
fun <T> id(p: T): T = p
@@ -11,11 +11,11 @@ fun <T> id(p: T): T = p
fun <A> main() {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>f<!>()
val a: A = f()
f<A>()
val a: A = <!TYPE_PARAMETER_AS_REIFIED!>f<!>()
f<<!TYPE_PARAMETER_AS_REIFIED!>A<!>>()
val b: Int = f()
f<Int>()
val с: A = id(f())
val с: A = id(<!TYPE_PARAMETER_AS_REIFIED!>f<!>())
}
@@ -50,6 +50,6 @@ fun test6() = foo<Nothing>()
class B<T>(val array: Array<T>)
fun <T> bar() = B<Array<T>>(arrayOf())
fun <T> bar() = B<Array<T>>(<!TYPE_PARAMETER_AS_REIFIED_ARRAY!>arrayOf<!>())
fun test7() = bar<Nothing>()
@@ -1,17 +0,0 @@
fun <T> fail1(): Array<T> = Array(1) { null!! }
fun <T> ok1(block: () -> Array<T>): Array<T> = block()
inline fun <reified T> ok2(): Array<T> = Array(1) { null!! }
fun <T> fail2(): Array<T> = ok1 { Array<T>(1) { null!! } }
fun <T> ok3(block: () -> Array<T>): Array<T> = ok1 { block() }
inline fun <reified T> ok4(): Array<T> = ok1 { Array<T>(1) { null!! } }
fun <T> fail3(block: () -> T): Pair<Array<T>, Array<T>> = Pair(arrayOf(
block()), arrayOf()
)
inline fun <reified T> ok5(block: () -> T): Pair<Array<T>, Array<T>> = Pair(
arrayOf(block()), arrayOf()
)
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
fun <T> fail1(): Array<T> = <!TYPE_PARAMETER_AS_REIFIED!>Array<!>(1) { null!! }
fun <T> ok1(block: () -> Array<T>): Array<T> = block()
@@ -1,14 +0,0 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
fun <T> foo() {
val x = arrayOfNulls<T>(5)
}
inline fun <reified T> bar() {
val x = arrayOfNulls<T>(5)
}
fun baz() {
bar<Int>()
val x: Array<Int?> = arrayOfNulls(5)
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_VARIABLE
fun <T> foo() {
@@ -1,9 +0,0 @@
class Inv<T>
inline operator fun <reified T> Inv<T>.invoke() {}
operator fun <K> Inv<K>.get(i: Int): Inv<K> = this
fun <K> test(a: Inv<K>) {
a[1]()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
class Inv<T>
inline operator fun <reified T> Inv<T>.invoke() {}