Fix false negative UPPER_BOUND_VIOLATED with typealiases in supertypes

^KT-50797 Fixed
^KT-50798 Open
This commit is contained in:
Denis.Zharkov
2022-01-14 19:29:39 +03:00
parent 8d0b511e95
commit b2543b7a26
16 changed files with 244 additions and 30 deletions
@@ -0,0 +1,27 @@
// SKIP_TXT
// !LANGUAGE: -ReportMissingUpperBoundsViolatedErrorOnAbbreviationAtSupertypes
interface I
open class TK<T : I, K : I>
typealias One<X> = TK<X, X>
typealias OneList<X> = List<TK<X, X>>
typealias Both<T, K> = TK<T, K>
typealias BothList<T, K> = List<TK<T, K>>
object O1 : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>One<Any><!>() // compiler error expected
object O2 : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>Both<Any, Any><!>()
class A1<T : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>One<Any><!>>
class A2<T : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>One<Any, Any><!>>
interface IO1 : OneList<Any> {}
interface IO2 : BothList<Any, Any> {}
fun foo1(x: <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>One<Any><!>) {}
fun foo2(x: <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>Both<Any, Any><!>) {}
fun main() {
<!UPPER_BOUND_VIOLATED, UPPER_BOUND_VIOLATED!>One<Any>()<!>
<!UPPER_BOUND_VIOLATED, UPPER_BOUND_VIOLATED!>Both<Any, Any>()<!>
}
@@ -0,0 +1,27 @@
// SKIP_TXT
// !LANGUAGE: -ReportMissingUpperBoundsViolatedErrorOnAbbreviationAtSupertypes
interface I
open class TK<T : I, K : I>
typealias One<X> = TK<X, X>
typealias OneList<X> = List<TK<X, X>>
typealias Both<T, K> = TK<T, K>
typealias BothList<T, K> = List<TK<T, K>>
object O1 : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION_WARNING!>One<Any><!>() // compiler error expected
object O2 : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>Both<Any, Any><!>()
class A1<T : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION_WARNING!>One<Any><!>>
class A2<T : One<!WRONG_NUMBER_OF_TYPE_ARGUMENTS!><Any, Any><!>>
interface IO1 : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>OneList<Any><!> {}
interface IO2 : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION_WARNING!>BothList<Any, Any><!> {}
fun foo1(x: One<<!UPPER_BOUND_VIOLATED!>Any<!>>) {}
fun foo2(x: Both<<!UPPER_BOUND_VIOLATED!>Any<!>, <!UPPER_BOUND_VIOLATED!>Any<!>>) {}
fun main() {
One<<!UPPER_BOUND_VIOLATED!>Any<!>>()
Both<<!UPPER_BOUND_VIOLATED!>Any<!>, <!UPPER_BOUND_VIOLATED!>Any<!>>()
}
@@ -0,0 +1,27 @@
// SKIP_TXT
// !LANGUAGE: +ReportMissingUpperBoundsViolatedErrorOnAbbreviationAtSupertypes
interface I
open class TK<T : I, K : I>
typealias One<X> = TK<X, X>
typealias OneList<X> = List<TK<X, X>>
typealias Both<T, K> = TK<T, K>
typealias BothList<T, K> = List<TK<T, K>>
object O1 : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>One<Any><!>() // compiler error expected
object O2 : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>Both<Any, Any><!>()
class A1<T : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>One<Any><!>>
class A2<T : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>One<Any, Any><!>>
interface IO1 : OneList<Any> {}
interface IO2 : BothList<Any, Any> {}
fun foo1(x: <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>One<Any><!>) {}
fun foo2(x: <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>Both<Any, Any><!>) {}
fun main() {
<!UPPER_BOUND_VIOLATED, UPPER_BOUND_VIOLATED!>One<Any>()<!>
<!UPPER_BOUND_VIOLATED, UPPER_BOUND_VIOLATED!>Both<Any, Any>()<!>
}
@@ -0,0 +1,27 @@
// SKIP_TXT
// !LANGUAGE: +ReportMissingUpperBoundsViolatedErrorOnAbbreviationAtSupertypes
interface I
open class TK<T : I, K : I>
typealias One<X> = TK<X, X>
typealias OneList<X> = List<TK<X, X>>
typealias Both<T, K> = TK<T, K>
typealias BothList<T, K> = List<TK<T, K>>
object O1 : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>One<Any><!>() // compiler error expected
object O2 : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>Both<Any, Any><!>()
class A1<T : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>One<Any><!>>
class A2<T : One<!WRONG_NUMBER_OF_TYPE_ARGUMENTS!><Any, Any><!>>
interface IO1 : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>OneList<Any><!> {}
interface IO2 : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>BothList<Any, Any><!> {}
fun foo1(x: One<<!UPPER_BOUND_VIOLATED!>Any<!>>) {}
fun foo2(x: Both<<!UPPER_BOUND_VIOLATED!>Any<!>, <!UPPER_BOUND_VIOLATED!>Any<!>>) {}
fun main() {
One<<!UPPER_BOUND_VIOLATED!>Any<!>>()
Both<<!UPPER_BOUND_VIOLATED!>Any<!>, <!UPPER_BOUND_VIOLATED!>Any<!>>()
}
@@ -1,11 +0,0 @@
interface Order<T>
typealias Ord<T> = Order<T>
class Test1<T1 : Ord<T1>>
interface Num<T : Number>
typealias N<T> = Num<T>
class Test2<T : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>N<String><!>>
+2 -1
View File
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
interface Order<T>
typealias Ord<T> = Order<T>
@@ -8,4 +9,4 @@ interface Num<T : Number>
typealias N<T> = Num<T>
class Test2<T : N<<!UPPER_BOUND_VIOLATED!>String<!>>>
class Test2<T : <!UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION!>N<String><!>>