[FIR] Add FINAL_UPPER_BOUND checker
This commit is contained in:
+1
-1
@@ -40,4 +40,4 @@ fun test() {
|
||||
|
||||
fun <T : Any> foo() {}
|
||||
fun <T : Int?> bar() {}
|
||||
fun <T : Int> Int.buzz() : Unit {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Int<!>> Int.buzz() : Unit {}
|
||||
|
||||
@@ -43,12 +43,12 @@ fun test() {
|
||||
|
||||
class Foo() {}
|
||||
|
||||
class Bar<T : Foo>
|
||||
class Bar<T : <!FINAL_UPPER_BOUND!>Foo<!>>
|
||||
|
||||
class Buzz<T> where T : Bar<Int>, T : <!UNRESOLVED_REFERENCE!>nioho<!>
|
||||
class Buzz<T> where T : <!FINAL_UPPER_BOUND!>Bar<Int><!>, T : <!UNRESOLVED_REFERENCE!>nioho<!>
|
||||
|
||||
class X<T : Foo>
|
||||
class Y<T> where T : Foo, T : Bar<Foo>
|
||||
class X<T : <!FINAL_UPPER_BOUND!>Foo<!>>
|
||||
class Y<T> where T : <!FINAL_UPPER_BOUND!>Foo<!>, T : <!FINAL_UPPER_BOUND!>Bar<Foo><!>
|
||||
|
||||
fun <T> test2(t : T)
|
||||
where
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ fun <T> takeFun(f: (T) -> Unit) {}
|
||||
fun <T, R> callFun(f: (T) -> R): R = TODO()
|
||||
|
||||
fun <T> foo(s: T) {}
|
||||
fun <T : Int> fooInt(s: T) {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Int<!>> fooInt(s: T) {}
|
||||
|
||||
open class Wrapper<T>(val value: T)
|
||||
fun <T, R : Wrapper<in T>> createWrapper(s: T): R = TODO()
|
||||
|
||||
-97
@@ -1,97 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
// SKIP_TXT
|
||||
// Issues: KT-25105
|
||||
|
||||
class Message1
|
||||
class Task<T>
|
||||
object Message2
|
||||
enum class Message3
|
||||
data class Message4(val x: Int)
|
||||
|
||||
sealed class Message5<T> {
|
||||
open fun <A : T> execute() {}
|
||||
}
|
||||
|
||||
interface Manager<T> {
|
||||
fun <A : T> execute1(task: Task<A>) {}
|
||||
fun <T : Int> execute2(task: T) {}
|
||||
fun <T : Message2> execute3() {}
|
||||
fun <A : T> execute4() {}
|
||||
fun <A : T> execute5() {}
|
||||
val <A : T> A.x get() = 10
|
||||
var <A : T> A.y
|
||||
get() = 10
|
||||
set(value) {}
|
||||
}
|
||||
|
||||
object MessageManager1 : Manager<Message1> {
|
||||
override fun <T : Message1> execute1(task: Task<T>) {}
|
||||
override fun <T : Int> execute2(task: T) {}
|
||||
override fun <T : Message2> execute3() {}
|
||||
}
|
||||
|
||||
object MessageManager2 : Manager<Message3> {
|
||||
override fun <T : Message3> execute4() {}
|
||||
}
|
||||
|
||||
object MessageManager3 : Manager<Message4> {
|
||||
override fun <T : Message4> execute5() {}
|
||||
}
|
||||
|
||||
class MessageManager4 : Manager<Message1> {
|
||||
override fun <T : Message1> execute1(task: Task<T>) {}
|
||||
override fun <T : Int> execute2(task: T) {}
|
||||
override fun <T : Message2> execute3() {}
|
||||
}
|
||||
|
||||
class MessageManager5 : Manager<Message3> {
|
||||
override fun <T : Message3> execute4() {}
|
||||
}
|
||||
|
||||
class MessageManager6 : Manager<Message4> {
|
||||
override fun <T : Message4> execute5() {}
|
||||
}
|
||||
|
||||
interface MessageManager7 : Manager<Message4> {
|
||||
override fun <T : Message4> execute5() {}
|
||||
}
|
||||
|
||||
interface MessageManager8 : Manager<Message1> {
|
||||
override fun <T : Message1> execute1(task: Task<T>) {}
|
||||
override fun <T : Int> execute2(task: T) {}
|
||||
override fun <T : Message2> execute3() {}
|
||||
}
|
||||
|
||||
interface MessageManager9 : Manager<Message3> {
|
||||
override fun <T : Message3> execute4() {}
|
||||
}
|
||||
|
||||
object MessageManager10 : Message5<Int>() {
|
||||
override fun <T : Int> execute() {}
|
||||
}
|
||||
|
||||
class MessageManager11<A> : Message5<Message5<A>>() {
|
||||
override fun <T : Message5<A>> execute() {}
|
||||
}
|
||||
|
||||
data class MessageManager12(val x: Int) : Message5<Message2>() {
|
||||
override fun <T : Message2> execute() {}
|
||||
}
|
||||
|
||||
sealed class MessageManager13<A> : Message5<A>() {
|
||||
override fun <T : A> execute() {}
|
||||
}
|
||||
|
||||
class MessageManager14 : Manager<Message2> {
|
||||
override val <T : Message2> T.x get() = 10
|
||||
override var <T : Message2> T.y
|
||||
get() = 10
|
||||
set(value) {}
|
||||
}
|
||||
|
||||
object MessageManager15 : Manager<Int> {
|
||||
override val <T : Int> T.x get() = 10
|
||||
override var <T : Int> T.y
|
||||
get() = 10
|
||||
set(value) {}
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
// SKIP_TXT
|
||||
// Issues: KT-25105
|
||||
|
||||
+18
-18
@@ -10,9 +10,9 @@ data class Message4(val x: Int)
|
||||
interface Manager<T> {}
|
||||
|
||||
object MessageManager1 : Manager<Message1> {
|
||||
fun <T : Message1> execute1(task: Task<T>) {}
|
||||
fun <T : Int> execute2(task: T) {}
|
||||
fun <T : Message2> execute3() {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Message1<!>> execute1(task: Task<T>) {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Int<!>> execute2(task: T) {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Message2<!>> execute3() {}
|
||||
}
|
||||
|
||||
object MessageManager2 : Manager<Message3> {
|
||||
@@ -20,13 +20,13 @@ object MessageManager2 : Manager<Message3> {
|
||||
}
|
||||
|
||||
object MessageManager3 : Manager<Message4> {
|
||||
fun <T : Message4> execute5() {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Message4<!>> execute5() {}
|
||||
}
|
||||
|
||||
class MessageManager4 : Manager<Message1> {
|
||||
fun <T : Message1> execute1(task: Task<T>) {}
|
||||
fun <T : Int> execute2(task: T) {}
|
||||
fun <T : Message2> execute3() {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Message1<!>> execute1(task: Task<T>) {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Int<!>> execute2(task: T) {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Message2<!>> execute3() {}
|
||||
}
|
||||
|
||||
class MessageManager5 : Manager<Message3> {
|
||||
@@ -34,17 +34,17 @@ class MessageManager5 : Manager<Message3> {
|
||||
}
|
||||
|
||||
class MessageManager6 : Manager<Message4> {
|
||||
fun <T : Message4> execute5() {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Message4<!>> execute5() {}
|
||||
}
|
||||
|
||||
interface MessageManager7 : Manager<Message4> {
|
||||
fun <T : Message4> execute5() {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Message4<!>> execute5() {}
|
||||
}
|
||||
|
||||
interface MessageManager8 : Manager<Message1> {
|
||||
fun <T : Message1> execute1(task: Task<T>) {}
|
||||
fun <T : Int> execute2(task: T) {}
|
||||
fun <T : Message2> execute3() {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Message1<!>> execute1(task: Task<T>) {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Int<!>> execute2(task: T) {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Message2<!>> execute3() {}
|
||||
}
|
||||
|
||||
interface MessageManager9 : Manager<Message3> {
|
||||
@@ -52,7 +52,7 @@ interface MessageManager9 : Manager<Message3> {
|
||||
}
|
||||
|
||||
object MessageManager10 : <!UNRESOLVED_REFERENCE!>Message5<Int><!>() {
|
||||
fun <T : Int> execute() {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Int<!>> execute() {}
|
||||
}
|
||||
|
||||
class MessageManager11<A> : <!UNRESOLVED_REFERENCE!>Message5<<!UNRESOLVED_REFERENCE!>Message5<A><!>><!>() {
|
||||
@@ -60,7 +60,7 @@ class MessageManager11<A> : <!UNRESOLVED_REFERENCE!>Message5<<!UNRESOLVED_REFERE
|
||||
}
|
||||
|
||||
data class MessageManager12(val x: Int) : <!UNRESOLVED_REFERENCE!>Message5<Message2><!>() {
|
||||
fun <T : Message2> execute() {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>Message2<!>> execute() {}
|
||||
}
|
||||
|
||||
sealed class MessageManager13<A> : <!UNRESOLVED_REFERENCE!>Message5<A><!>() {
|
||||
@@ -68,15 +68,15 @@ sealed class MessageManager13<A> : <!UNRESOLVED_REFERENCE!>Message5<A><!>() {
|
||||
}
|
||||
|
||||
class MessageManager14 : Manager<Message2> {
|
||||
val <T : Message2> T.x get() = 10
|
||||
var <T : Message2> T.y
|
||||
val <T : <!FINAL_UPPER_BOUND!>Message2<!>> T.x get() = 10
|
||||
var <T : <!FINAL_UPPER_BOUND!>Message2<!>> T.y
|
||||
get() = 10
|
||||
set(value) {}
|
||||
}
|
||||
|
||||
object MessageManager15 : Manager<Int> {
|
||||
val <T : Int> T.x get() = 10
|
||||
var <T : Int> T.y
|
||||
val <T : <!FINAL_UPPER_BOUND!>Int<!>> T.x get() = 10
|
||||
var <T : <!FINAL_UPPER_BOUND!>Int<!>> T.y
|
||||
get() = 10
|
||||
set(value) {}
|
||||
}
|
||||
|
||||
+1
-1
@@ -53,7 +53,7 @@ fun testCaptured(cSub: SubInv<out Number>, cInv: Inv<out Number>) {
|
||||
|
||||
fun testVariableWithBound() {
|
||||
fun <K : Number> createWithNumberBound(): Inv<K> = TODO()
|
||||
fun <K : Int> createWithIntBound(): Inv<K> = TODO()
|
||||
fun <K : <!FINAL_UPPER_BOUND!>Int<!>> createWithIntBound(): Inv<K> = TODO()
|
||||
|
||||
val c1 = select(SubInv<Int>(), createWithNumberBound())
|
||||
|
||||
|
||||
+1
-1
@@ -15,4 +15,4 @@ enum class E1
|
||||
class A5<T> where T : C1, T : E1
|
||||
|
||||
object O1
|
||||
class A6<T> where T : O1, T : C2
|
||||
class A6<T> where T : <!FINAL_UPPER_BOUND!>O1<!>, T : C2
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ fun <A : Array<Any>> f1() {}
|
||||
fun <T, A : Array<out T>> f2() {}
|
||||
fun <S, T : S, A> f3() where A : Array<out S>, A : Array<out T> {}
|
||||
|
||||
fun <T : IntArray> f4() {}
|
||||
fun <T : <!FINAL_UPPER_BOUND!>IntArray<!>> f4() {}
|
||||
|
||||
fun <T> f5() where T : Array<Any> {}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user