Refine subtyping check: pay attention to corresponding supertype nullability

F: Any, T : F? => !isSubtype(T, Any)

It helps to identify upper bounds violation like in KT-7455

 #KT-7455 Fixed
 #KT-2924 Fixed
 #KT-3015 Fixed
This commit is contained in:
Denis Zharkov
2015-08-26 11:22:40 +03:00
parent a906be6dd7
commit 6ecfa6e985
11 changed files with 184 additions and 3 deletions
@@ -0,0 +1,31 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER, -BASE_WITH_NULLABLE_UPPER_BOUND
class A<F> {
fun <E : F> foo1(x: E) {}
fun <E : F?> foo2(x: E) {}
fun <Z : F, W : Z?> bar(x: F, y: F?, z: Z, w: W) {
foo1<F>(x)
foo1(x)
foo2<F>(x)
foo2(x)
foo1<<!UPPER_BOUND_VIOLATED!>F?<!>>(y)
<!TYPE_INFERENCE_UPPER_BOUND_VIOLATED!>foo1<!>(y)
foo2<F?>(y)
foo2(y)
foo1<F>(<!TYPE_MISMATCH!>y<!>)
foo2<F>(<!TYPE_MISMATCH!>y<!>)
foo1<Z>(z)
foo1(z)
foo2<Z>(z)
foo2(z)
foo1<<!UPPER_BOUND_VIOLATED!>W<!>>(w)
<!TYPE_INFERENCE_UPPER_BOUND_VIOLATED!>foo1<!>(w)
foo2<W>(w)
foo2(w)
foo1<<!UPPER_BOUND_VIOLATED!>W<!>>(w)
}
}