Rewritten captured type approximation test

Approximation bounds may be non-trivial both (in this case we ignore 'in' projection);
no need for special interpretation of 'Nothing?'
This commit is contained in:
Svetlana Isakova
2014-12-17 16:45:36 +03:00
parent 7daf9b53ce
commit 37abdc2ca6
22 changed files with 1892 additions and 276 deletions
@@ -1,11 +0,0 @@
class Contr<in T>
fun foo<T>(a: Contr<T>) {}
// T captures 'in Int'
// lower: Contr<Any?>
// upper: Contr<Int>
// T captures 'out Int'
// lower: Contr<Int>
// upper: Contr<Nothing>
@@ -1,11 +0,0 @@
class Cov<out T>
fun foo<T>(a: Cov<T>) {}
// T captures 'in Int'
// lower: Cov<Int>
// upper: Cov<Any?>
// T captures 'out Int'
// lower: Cov<Nothing>
// upper: Cov<Int>
@@ -0,0 +1,10 @@
// declarations
class Inv<T>
class Out<out T>
class In<in T>
class Inv2<T, R>
class Fun<in T, out R>
fun <T, R> foo(): #TestType# = throw Exception()
@@ -1,11 +0,0 @@
class Inv<T>
fun foo<T>(a: Inv<T>) {}
// T captures 'in Int'
// lower: Nothing
// upper: Inv<in Int>
// T captures 'out Int'
// lower: Nothing
// upper: Inv<out Int>
@@ -1,12 +0,0 @@
class Cov<out T>
class Inv<T>
fun foo<T>(a: Cov<Inv<T>>) {}
// T captures 'in Int'
// lower: Cov<Nothing>
// upper: Cov<Inv<in Int>>
// T captures 'out Int'
// lower: Cov<Nothing>
// upper: Cov<Inv<out Int>>
@@ -1,11 +0,0 @@
class Inv<T>
fun foo<T>(a: Inv<Inv<T>>) {}
// T captures 'in Int'
// lower: Nothing
// upper: Inv<out Inv<in Int>>
// T captures 'out Int'
// lower: Nothing
// upper: Inv<out Inv<out Int>>
@@ -1,11 +0,0 @@
class Inv<T>
fun foo<T>(a: Inv<Inv<Inv<T>>>) {}
// T captures 'in Int'
// lower: Nothing
// upper: Inv<out Inv<out Inv<in Int>>>
// T captures 'out Int'
// lower: Nothing
// upper: Inv<out Inv<out Inv<out Int>>>
@@ -0,0 +1,279 @@
In<T?>
in Int. lower: In<Any?>; upper: In<Int?>; substitution: In<Int?>
out Int. lower: In<Int?>; upper: In<Nothing?>; substitution: In<out Any?>
Out<T?>
in Int. lower: Out<Int?>; upper: Out<Any?>; substitution: Out<Any?>
out Int. lower: Out<Nothing?>; upper: Out<Int?>; substitution: Out<Int?>
Inv<T?>
in Int. lower: Nothing; upper: Inv<in Int?>; substitution: Inv<in Int?>
out Int. lower: Nothing; upper: Inv<out Int?>; substitution: Inv<out Int?>
Inv<in T?>
in Int. lower: Inv<Any?>; upper: Inv<in Int?>; substitution: Inv<in Int?>
out Int. lower: Inv<in Int?>; upper: Inv<in Nothing?>; substitution: Inv<in Int?>
Inv<out T?>
in Int. lower: Inv<out Int?>; upper: Inv<out Any?>; substitution: Inv<out Int?>
out Int. lower: Inv<out Nothing?>; upper: Inv<out Int?>; substitution: Inv<out Int?>
In<In<T?>>
in Int. lower: In<In<Int?>>; upper: In<In<Any?>>; substitution: In<In<Int?>>
out Int. lower: In<In<Nothing?>>; upper: In<In<Int?>>; substitution: In<In<out Any?>>
In<Out<T?>>
in Int. lower: In<Out<Any?>>; upper: In<Out<Int?>>; substitution: In<Out<Any?>>
out Int. lower: In<Out<Int?>>; upper: In<Out<Nothing?>>; substitution: In<Out<Int?>>
In<Inv<T?>>
in Int. lower: In<Inv<in Int?>>; upper: In<Nothing>; substitution: In<Inv<in Int?>>
out Int. lower: In<Inv<out Int?>>; upper: In<Nothing>; substitution: In<Inv<out Int?>>
In<Inv<in T?>>
in Int. lower: In<Inv<in Int?>>; upper: In<Inv<Any?>>; substitution: In<Inv<in Int?>>
out Int. lower: In<Inv<in Nothing?>>; upper: In<Inv<in Int?>>; substitution: In<Inv<in Int?>>
In<Inv<out T?>>
in Int. lower: In<Inv<out Any?>>; upper: In<Inv<out Int?>>; substitution: In<Inv<out Int?>>
out Int. lower: In<Inv<out Int?>>; upper: In<Inv<out Nothing?>>; substitution: In<Inv<out Int?>>
Out<In<T?>>
in Int. lower: Out<In<Any?>>; upper: Out<In<Int?>>; substitution: Out<In<Int?>>
out Int. lower: Out<In<Int?>>; upper: Out<In<Nothing?>>; substitution: Out<In<out Any?>>
Out<Out<T?>>
in Int. lower: Out<Out<Int?>>; upper: Out<Out<Any?>>; substitution: Out<Out<Any?>>
out Int. lower: Out<Out<Nothing?>>; upper: Out<Out<Int?>>; substitution: Out<Out<Int?>>
Out<Inv<T?>>
in Int. lower: Out<Nothing>; upper: Out<Inv<in Int?>>; substitution: Out<Inv<in Int?>>
out Int. lower: Out<Nothing>; upper: Out<Inv<out Int?>>; substitution: Out<Inv<out Int?>>
Out<Inv<in T?>>
in Int. lower: Out<Inv<Any?>>; upper: Out<Inv<in Int?>>; substitution: Out<Inv<in Int?>>
out Int. lower: Out<Inv<in Int?>>; upper: Out<Inv<in Nothing?>>; substitution: Out<Inv<in Int?>>
Out<Inv<out T?>>
in Int. lower: Out<Inv<out Int?>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<out Int?>>
out Int. lower: Out<Inv<out Nothing?>>; upper: Out<Inv<out Int?>>; substitution: Out<Inv<out Int?>>
Inv<In<T?>>
in Int. lower: Nothing; upper: Inv<out In<Int?>>; substitution: Inv<In<Int?>>
out Int. lower: Nothing; upper: Inv<out In<Nothing?>>; substitution: Inv<In<out Any?>>
Inv<Out<T?>>
in Int. lower: Nothing; upper: Inv<out Out<Any?>>; substitution: Inv<Out<Any?>>
out Int. lower: Nothing; upper: Inv<out Out<Int?>>; substitution: Inv<Out<Int?>>
Inv<Inv<T?>>
in Int. lower: Nothing; upper: Inv<out Inv<in Int?>>; substitution: Inv<Inv<in Int?>>
out Int. lower: Nothing; upper: Inv<out Inv<out Int?>>; substitution: Inv<Inv<out Int?>>
Inv<Inv<in T?>>
in Int. lower: Nothing; upper: Inv<out Inv<in Int?>>; substitution: Inv<Inv<in Int?>>
out Int. lower: Nothing; upper: Inv<out Inv<in Nothing?>>; substitution: Inv<Inv<in Int?>>
Inv<Inv<out T?>>
in Int. lower: Nothing; upper: Inv<out Inv<out Any?>>; substitution: Inv<Inv<out Int?>>
out Int. lower: Nothing; upper: Inv<out Inv<out Int?>>; substitution: Inv<Inv<out Int?>>
Inv<in In<T?>>
in Int. lower: Inv<in In<Int?>>; upper: Inv<in In<Any?>>; substitution: Inv<in In<Int?>>
out Int. lower: Inv<in In<Nothing?>>; upper: Inv<in In<Int?>>; substitution: Inv<in In<out Any?>>
Inv<in Out<T?>>
in Int. lower: Inv<in Out<Any?>>; upper: Inv<in Out<Int?>>; substitution: Inv<in Out<Any?>>
out Int. lower: Inv<in Out<Int?>>; upper: Inv<in Out<Nothing?>>; substitution: Inv<in Out<Int?>>
Inv<in Inv<T?>>
in Int. lower: Inv<in Inv<in Int?>>; upper: Inv<out Any?>; substitution: Inv<in Inv<in Int?>>
out Int. lower: Inv<in Inv<out Int?>>; upper: Inv<out Any?>; substitution: Inv<in Inv<out Int?>>
Inv<in Inv<in T?>>
in Int. lower: Inv<in Inv<in Int?>>; upper: Inv<in Inv<Any?>>; substitution: Inv<in Inv<in Int?>>
out Int. lower: Inv<in Inv<in Nothing?>>; upper: Inv<in Inv<in Int?>>; substitution: Inv<in Inv<in Int?>>
Inv<in Inv<out T?>>
in Int. lower: Inv<in Inv<out Any?>>; upper: Inv<in Inv<out Int?>>; substitution: Inv<in Inv<out Int?>>
out Int. lower: Inv<in Inv<out Int?>>; upper: Inv<in Inv<out Nothing?>>; substitution: Inv<in Inv<out Int?>>
Inv<out In<T?>>
in Int. lower: Inv<out In<Any?>>; upper: Inv<out In<Int?>>; substitution: Inv<out In<Int?>>
out Int. lower: Inv<out In<Int?>>; upper: Inv<out In<Nothing?>>; substitution: Inv<out In<out Any?>>
Inv<out Out<T?>>
in Int. lower: Inv<out Out<Int?>>; upper: Inv<out Out<Any?>>; substitution: Inv<out Out<Any?>>
out Int. lower: Inv<out Out<Nothing?>>; upper: Inv<out Out<Int?>>; substitution: Inv<out Out<Int?>>
Inv<out Inv<T?>>
in Int. lower: Inv<Nothing>; upper: Inv<out Inv<in Int?>>; substitution: Inv<out Inv<in Int?>>
out Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Int?>>; substitution: Inv<out Inv<out Int?>>
Inv<out Inv<in T?>>
in Int. lower: Inv<out Inv<Any?>>; upper: Inv<out Inv<in Int?>>; substitution: Inv<out Inv<in Int?>>
out Int. lower: Inv<out Inv<in Int?>>; upper: Inv<out Inv<in Nothing?>>; substitution: Inv<out Inv<in Int?>>
Inv<out Inv<out T?>>
in Int. lower: Inv<out Inv<out Int?>>; upper: Inv<out Inv<out Any?>>; substitution: Inv<out Inv<out Int?>>
out Int. lower: Inv<out Inv<out Nothing?>>; upper: Inv<out Inv<out Int?>>; substitution: Inv<out Inv<out Int?>>
In<Inv<Out<T?>>>
in Int. lower: In<Inv<out Out<Any?>>>; upper: In<Nothing>; substitution: In<Inv<Out<Any?>>>
out Int. lower: In<Inv<out Out<Int?>>>; upper: In<Nothing>; substitution: In<Inv<Out<Int?>>>
Out<Out<Out<T?>>>
in Int. lower: Out<Out<Out<Int?>>>; upper: Out<Out<Out<Any?>>>; substitution: Out<Out<Out<Any?>>>
out Int. lower: Out<Out<Out<Nothing?>>>; upper: Out<Out<Out<Int?>>>; substitution: Out<Out<Out<Int?>>>
Inv<Inv<in In<T?>>>
in Int. lower: Nothing; upper: Inv<out Inv<in In<Any?>>>; substitution: Inv<Inv<in In<Int?>>>
out Int. lower: Nothing; upper: Inv<out Inv<in In<Int?>>>; substitution: Inv<Inv<in In<out Any?>>>
Inv<out Inv<Out<T?>>>
in Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Out<Any?>>>; substitution: Inv<out Inv<Out<Any?>>>
out Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Out<Int?>>>; substitution: Inv<out Inv<Out<Int?>>>
Inv<in Inv<Inv<T?>>>
in Int. lower: Inv<in Inv<out Inv<in Int?>>>; upper: Inv<out Any?>; substitution: Inv<in Inv<Inv<in Int?>>>
out Int. lower: Inv<in Inv<out Inv<out Int?>>>; upper: Inv<out Any?>; substitution: Inv<in Inv<Inv<out Int?>>>
Out<Inv<In<T?>>>
in Int. lower: Out<Nothing>; upper: Out<Inv<out In<Int?>>>; substitution: Out<Inv<In<Int?>>>
out Int. lower: Out<Nothing>; upper: Out<Inv<out In<Nothing?>>>; substitution: Out<Inv<In<out Any?>>>
Inv<out Out<Out<T?>>>
in Int. lower: Inv<out Out<Out<Int?>>>; upper: Inv<out Out<Out<Any?>>>; substitution: Inv<out Out<Out<Any?>>>
out Int. lower: Inv<out Out<Out<Nothing?>>>; upper: Inv<out Out<Out<Int?>>>; substitution: Inv<out Out<Out<Int?>>>
Out<In<Inv<T?>>>
in Int. lower: Out<In<Inv<in Int?>>>; upper: Out<In<Nothing>>; substitution: Out<In<Inv<in Int?>>>
out Int. lower: Out<In<Inv<out Int?>>>; upper: Out<In<Nothing>>; substitution: Out<In<Inv<out Int?>>>
Inv<out In<Out<T?>>>
in Int. lower: Inv<out In<Out<Any?>>>; upper: Inv<out In<Out<Int?>>>; substitution: Inv<out In<Out<Any?>>>
out Int. lower: Inv<out In<Out<Int?>>>; upper: Inv<out In<Out<Nothing?>>>; substitution: Inv<out In<Out<Int?>>>
In<Out<Inv<T?>>>
in Int. lower: In<Out<Inv<in Int?>>>; upper: In<Out<Nothing>>; substitution: In<Out<Inv<in Int?>>>
out Int. lower: In<Out<Inv<out Int?>>>; upper: In<Out<Nothing>>; substitution: In<Out<Inv<out Int?>>>
Inv<out Inv<Inv<out Inv<in T?>>>>
in Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Inv<out Inv<in Int?>>>>; substitution: Inv<out Inv<Inv<out Inv<in Int?>>>>
out Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Inv<out Inv<in Nothing?>>>>; substitution: Inv<out Inv<Inv<out Inv<in Int?>>>>
Inv<in Out<In<Inv<in T?>>>>
in Int. lower: Inv<in Out<In<Inv<Any?>>>>; upper: Inv<in Out<In<Inv<in Int?>>>>; substitution: Inv<in Out<In<Inv<in Int?>>>>
out Int. lower: Inv<in Out<In<Inv<in Int?>>>>; upper: Inv<in Out<In<Inv<in Nothing?>>>>; substitution: Inv<in Out<In<Inv<in Int?>>>>
Inv<in In<Inv<out Inv<in T?>>>>
in Int. lower: Inv<in In<Inv<out Inv<Any?>>>>; upper: Inv<in In<Inv<out Inv<in Int?>>>>; substitution: Inv<in In<Inv<out Inv<in Int?>>>>
out Int. lower: Inv<in In<Inv<out Inv<in Int?>>>>; upper: Inv<in In<Inv<out Inv<in Nothing?>>>>; substitution: Inv<in In<Inv<out Inv<in Int?>>>>
Inv<In<In<Inv<in T?>>>>
in Int. lower: Nothing; upper: Inv<out In<In<Inv<in Int?>>>>; substitution: Inv<In<In<Inv<in Int?>>>>
out Int. lower: Nothing; upper: Inv<out In<In<Inv<in Nothing?>>>>; substitution: Inv<In<In<Inv<in Int?>>>>
Inv<out Inv<out Inv<out Inv<T?>>>>
in Int. lower: Inv<out Inv<out Inv<Nothing>>>; upper: Inv<out Inv<out Inv<out Inv<in Int?>>>>; substitution: Inv<out Inv<out Inv<out Inv<in Int?>>>>
out Int. lower: Inv<out Inv<out Inv<Nothing>>>; upper: Inv<out Inv<out Inv<out Inv<out Int?>>>>; substitution: Inv<out Inv<out Inv<out Inv<out Int?>>>>
Inv<out Out<Inv<out Inv<in T?>>>>
in Int. lower: Inv<out Out<Inv<out Inv<Any?>>>>; upper: Inv<out Out<Inv<out Inv<in Int?>>>>; substitution: Inv<out Out<Inv<out Inv<in Int?>>>>
out Int. lower: Inv<out Out<Inv<out Inv<in Int?>>>>; upper: Inv<out Out<Inv<out Inv<in Nothing?>>>>; substitution: Inv<out Out<Inv<out Inv<in Int?>>>>
Out<Inv<out Inv<out In<T?>>>>
in Int. lower: Out<Inv<out Inv<out In<Any?>>>>; upper: Out<Inv<out Inv<out In<Int?>>>>; substitution: Out<Inv<out Inv<out In<Int?>>>>
out Int. lower: Out<Inv<out Inv<out In<Int?>>>>; upper: Out<Inv<out Inv<out In<Nothing?>>>>; substitution: Out<Inv<out Inv<out In<out Any?>>>>
In<Inv<in In<Inv<in T?>>>>
in Int. lower: In<Inv<in In<Inv<in Int?>>>>; upper: In<Inv<in In<Inv<Any?>>>>; substitution: In<Inv<in In<Inv<in Int?>>>>
out Int. lower: In<Inv<in In<Inv<in Nothing?>>>>; upper: In<Inv<in In<Inv<in Int?>>>>; substitution: In<Inv<in In<Inv<in Int?>>>>
Out<Inv<in In<Inv<T?>>>>
in Int. lower: Out<Inv<in In<Nothing>>>; upper: Out<Inv<in In<Inv<in Int?>>>>; substitution: Out<Inv<in In<Inv<in Int?>>>>
out Int. lower: Out<Inv<in In<Nothing>>>; upper: Out<Inv<in In<Inv<out Int?>>>>; substitution: Out<Inv<in In<Inv<out Int?>>>>
Out<Inv<in Inv<in Inv<T?>>>>
in Int. lower: Out<Inv<in Inv<out Any?>>>; upper: Out<Inv<in Inv<in Inv<in Int?>>>>; substitution: Out<Inv<in Inv<in Inv<in Int?>>>>
out Int. lower: Out<Inv<in Inv<out Any?>>>; upper: Out<Inv<in Inv<in Inv<out Int?>>>>; substitution: Out<Inv<in Inv<in Inv<out Int?>>>>
In<In<Inv<In<In<T?>>>>>
in Int. lower: In<In<Nothing>>; upper: In<In<Inv<out In<In<Any?>>>>>; substitution: In<In<Inv<In<In<Int?>>>>>
out Int. lower: In<In<Nothing>>; upper: In<In<Inv<out In<In<Int?>>>>>; substitution: In<In<Inv<In<In<out Any?>>>>>
Inv<Inv<Inv<Out<Inv<in T?>>>>>
in Int. lower: Nothing; upper: Inv<out Inv<out Inv<out Out<Inv<in Int?>>>>>; substitution: Inv<Inv<Inv<Out<Inv<in Int?>>>>>
out Int. lower: Nothing; upper: Inv<out Inv<out Inv<out Out<Inv<in Nothing?>>>>>; substitution: Inv<Inv<Inv<Out<Inv<in Int?>>>>>
Out<Inv<Out<Out<Inv<out T?>>>>>
in Int. lower: Out<Nothing>; upper: Out<Inv<out Out<Out<Inv<out Any?>>>>>; substitution: Out<Inv<Out<Out<Inv<out Int?>>>>>
out Int. lower: Out<Nothing>; upper: Out<Inv<out Out<Out<Inv<out Int?>>>>>; substitution: Out<Inv<Out<Out<Inv<out Int?>>>>>
Inv<In<Inv<in In<Inv<out T?>>>>>
in Int. lower: Nothing; upper: Inv<out In<Inv<in In<Inv<out Int?>>>>>; substitution: Inv<In<Inv<in In<Inv<out Int?>>>>>
out Int. lower: Nothing; upper: Inv<out In<Inv<in In<Inv<out Nothing?>>>>>; substitution: Inv<In<Inv<in In<Inv<out Int?>>>>>
Inv<in Inv<out In<Out<Inv<out T?>>>>>
in Int. lower: Inv<in Inv<out In<Out<Inv<out Int?>>>>>; upper: Inv<in Inv<out In<Out<Inv<out Any?>>>>>; substitution: Inv<in Inv<out In<Out<Inv<out Int?>>>>>
out Int. lower: Inv<in Inv<out In<Out<Inv<out Nothing?>>>>>; upper: Inv<in Inv<out In<Out<Inv<out Int?>>>>>; substitution: Inv<in Inv<out In<Out<Inv<out Int?>>>>>
Inv<out Out<Inv<in Inv<in Inv<in T?>>>>>
in Int. lower: Inv<out Out<Inv<in Inv<in Inv<Any?>>>>>; upper: Inv<out Out<Inv<in Inv<in Inv<in Int?>>>>>; substitution: Inv<out Out<Inv<in Inv<in Inv<in Int?>>>>>
out Int. lower: Inv<out Out<Inv<in Inv<in Inv<in Int?>>>>>; upper: Inv<out Out<Inv<in Inv<in Inv<in Nothing?>>>>>; substitution: Inv<out Out<Inv<in Inv<in Inv<in Int?>>>>>
Out<Out<Inv<Out<Inv<out T?>>>>>
in Int. lower: Out<Out<Nothing>>; upper: Out<Out<Inv<out Out<Inv<out Any?>>>>>; substitution: Out<Out<Inv<Out<Inv<out Int?>>>>>
out Int. lower: Out<Out<Nothing>>; upper: Out<Out<Inv<out Out<Inv<out Int?>>>>>; substitution: Out<Out<Inv<Out<Inv<out Int?>>>>>
In<Inv<In<In<Inv<out T?>>>>>
in Int. lower: In<Inv<out In<In<Inv<out Any?>>>>>; upper: In<Nothing>; substitution: In<Inv<In<In<Inv<out Int?>>>>>
out Int. lower: In<Inv<out In<In<Inv<out Int?>>>>>; upper: In<Nothing>; substitution: In<Inv<In<In<Inv<out Int?>>>>>
Inv<out Inv<in Inv<Inv<out Inv<out T?>>>>>
in Int. lower: Inv<out Inv<in Inv<out Inv<out Inv<out Any?>>>>>; upper: Inv<out Inv<out Any?>>; substitution: Inv<out Inv<in Inv<Inv<out Inv<out Int?>>>>>
out Int. lower: Inv<out Inv<in Inv<out Inv<out Inv<out Int?>>>>>; upper: Inv<out Inv<out Any?>>; substitution: Inv<out Inv<in Inv<Inv<out Inv<out Int?>>>>>
In<Inv<in In<In<Inv<out T?>>>>>
in Int. lower: In<Inv<in In<In<Inv<out Int?>>>>>; upper: In<Inv<in In<In<Inv<out Any?>>>>>; substitution: In<Inv<in In<In<Inv<out Int?>>>>>
out Int. lower: In<Inv<in In<In<Inv<out Nothing?>>>>>; upper: In<Inv<in In<In<Inv<out Int?>>>>>; substitution: In<Inv<in In<In<Inv<out Int?>>>>>
In<Inv<Out<In<Inv<Inv<T?>>>>>>
in Int. lower: In<Inv<out Out<In<Nothing>>>>; upper: In<Nothing>; substitution: In<Inv<Out<In<Inv<Inv<in Int?>>>>>>
out Int. lower: In<Inv<out Out<In<Nothing>>>>; upper: In<Nothing>; substitution: In<Inv<Out<In<Inv<Inv<out Int?>>>>>>
Out<Inv<Inv<out Inv<Inv<in In<T?>>>>>>
in Int. lower: Out<Nothing>; upper: Out<Inv<out Inv<out Inv<out Inv<in In<Any?>>>>>>; substitution: Out<Inv<Inv<out Inv<Inv<in In<Int?>>>>>>
out Int. lower: Out<Nothing>; upper: Out<Inv<out Inv<out Inv<out Inv<in In<Int?>>>>>>; substitution: Out<Inv<Inv<out Inv<Inv<in In<out Any?>>>>>>
Inv<Out<In<In<Inv<in In<T?>>>>>>
in Int. lower: Nothing; upper: Inv<out Out<In<In<Inv<in In<Any?>>>>>>; substitution: Inv<Out<In<In<Inv<in In<Int?>>>>>>
out Int. lower: Nothing; upper: Inv<out Out<In<In<Inv<in In<Int?>>>>>>; substitution: Inv<Out<In<In<Inv<in In<out Any?>>>>>>
Inv<In<Inv<Inv<in Inv<out Inv<out T?>>>>>>
in Int. lower: Nothing; upper: Inv<out In<Nothing>>; substitution: Inv<In<Inv<Inv<in Inv<out Inv<out Int?>>>>>>
out Int. lower: Nothing; upper: Inv<out In<Nothing>>; substitution: Inv<In<Inv<Inv<in Inv<out Inv<out Int?>>>>>>
In<Inv<out Inv<in Inv<Inv<in Inv<out T?>>>>>>
in Int. lower: In<Inv<out Inv<out Any?>>>; upper: In<Inv<out Inv<in Inv<out Inv<in Inv<out Int?>>>>>>; substitution: In<Inv<out Inv<in Inv<Inv<in Inv<out Int?>>>>>>
out Int. lower: In<Inv<out Inv<out Any?>>>; upper: In<Inv<out Inv<in Inv<out Inv<in Inv<out Nothing?>>>>>>; substitution: In<Inv<out Inv<in Inv<Inv<in Inv<out Int?>>>>>>
In<Inv<Inv<out Inv<out In<In<T?>>>>>>
in Int. lower: In<Inv<out Inv<out Inv<out In<In<Any?>>>>>>; upper: In<Nothing>; substitution: In<Inv<Inv<out Inv<out In<In<Int?>>>>>>
out Int. lower: In<Inv<out Inv<out Inv<out In<In<Int?>>>>>>; upper: In<Nothing>; substitution: In<Inv<Inv<out Inv<out In<In<out Any?>>>>>>
Out<In<Inv<Out<Inv<Out<T?>>>>>>
in Int. lower: Out<In<Inv<out Out<Inv<out Out<Any?>>>>>>; upper: Out<In<Nothing>>; substitution: Out<In<Inv<Out<Inv<Out<Any?>>>>>>
out Int. lower: Out<In<Inv<out Out<Inv<out Out<Int?>>>>>>; upper: Out<In<Nothing>>; substitution: Out<In<Inv<Out<Inv<Out<Int?>>>>>>
Inv<out Inv<Inv<in Out<Inv<out Inv<in T?>>>>>>
in Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Inv<in Out<Inv<out Inv<Any?>>>>>>; substitution: Inv<out Inv<Inv<in Out<Inv<out Inv<in Int?>>>>>>
out Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Inv<in Out<Inv<out Inv<in Int?>>>>>>; substitution: Inv<out Inv<Inv<in Out<Inv<out Inv<in Int?>>>>>>
Out<Inv<in Inv<Out<Inv<Out<T?>>>>>>
in Int. lower: Out<Inv<in Inv<out Out<Inv<out Out<Any?>>>>>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<in Inv<Out<Inv<Out<Any?>>>>>>
out Int. lower: Out<Inv<in Inv<out Out<Inv<out Out<Int?>>>>>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<in Inv<Out<Inv<Out<Int?>>>>>>
Inv<Inv<in Inv<in In<In<Out<T?>>>>>>
in Int. lower: Nothing; upper: Inv<out Inv<in Inv<in In<In<Out<Any?>>>>>>; substitution: Inv<Inv<in Inv<in In<In<Out<Any?>>>>>>
out Int. lower: Nothing; upper: Inv<out Inv<in Inv<in In<In<Out<Int?>>>>>>; substitution: Inv<Inv<in Inv<in In<In<Out<Int?>>>>>>
@@ -1,11 +0,0 @@
class Inv<T>
fun foo<T>(a: Inv<T?>) {}
// T captures 'in Int'
// lower: Nothing
// upper: Inv<in Int?>
// T captures 'out Int'
// lower: Nothing
// upper: Inv<out Int?>
@@ -0,0 +1,279 @@
In<T>
in Int. lower: In<Any?>; upper: In<Int>; substitution: In<Int>
out Int. lower: In<Int>; upper: In<Nothing>; substitution: In<out Any?>
Out<T>
in Int. lower: Out<Int>; upper: Out<Any?>; substitution: Out<Any?>
out Int. lower: Out<Nothing>; upper: Out<Int>; substitution: Out<Int>
Inv<T>
in Int. lower: Nothing; upper: Inv<in Int>; substitution: Inv<in Int>
out Int. lower: Nothing; upper: Inv<out Int>; substitution: Inv<out Int>
Inv<in T>
in Int. lower: Inv<Any?>; upper: Inv<in Int>; substitution: Inv<in Int>
out Int. lower: Inv<in Int>; upper: Inv<out Any?>; substitution: Inv<in Int>
Inv<out T>
in Int. lower: Inv<out Int>; upper: Inv<out Any?>; substitution: Inv<out Int>
out Int. lower: Inv<Nothing>; upper: Inv<out Int>; substitution: Inv<out Int>
In<In<T>>
in Int. lower: In<In<Int>>; upper: In<In<Any?>>; substitution: In<In<Int>>
out Int. lower: In<In<Nothing>>; upper: In<In<Int>>; substitution: In<In<out Any?>>
In<Out<T>>
in Int. lower: In<Out<Any?>>; upper: In<Out<Int>>; substitution: In<Out<Any?>>
out Int. lower: In<Out<Int>>; upper: In<Out<Nothing>>; substitution: In<Out<Int>>
In<Inv<T>>
in Int. lower: In<Inv<in Int>>; upper: In<Nothing>; substitution: In<Inv<in Int>>
out Int. lower: In<Inv<out Int>>; upper: In<Nothing>; substitution: In<Inv<out Int>>
In<Inv<in T>>
in Int. lower: In<Inv<in Int>>; upper: In<Inv<Any?>>; substitution: In<Inv<in Int>>
out Int. lower: In<Inv<out Any?>>; upper: In<Inv<in Int>>; substitution: In<Inv<in Int>>
In<Inv<out T>>
in Int. lower: In<Inv<out Any?>>; upper: In<Inv<out Int>>; substitution: In<Inv<out Int>>
out Int. lower: In<Inv<out Int>>; upper: In<Inv<Nothing>>; substitution: In<Inv<out Int>>
Out<In<T>>
in Int. lower: Out<In<Any?>>; upper: Out<In<Int>>; substitution: Out<In<Int>>
out Int. lower: Out<In<Int>>; upper: Out<In<Nothing>>; substitution: Out<In<out Any?>>
Out<Out<T>>
in Int. lower: Out<Out<Int>>; upper: Out<Out<Any?>>; substitution: Out<Out<Any?>>
out Int. lower: Out<Out<Nothing>>; upper: Out<Out<Int>>; substitution: Out<Out<Int>>
Out<Inv<T>>
in Int. lower: Out<Nothing>; upper: Out<Inv<in Int>>; substitution: Out<Inv<in Int>>
out Int. lower: Out<Nothing>; upper: Out<Inv<out Int>>; substitution: Out<Inv<out Int>>
Out<Inv<in T>>
in Int. lower: Out<Inv<Any?>>; upper: Out<Inv<in Int>>; substitution: Out<Inv<in Int>>
out Int. lower: Out<Inv<in Int>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<in Int>>
Out<Inv<out T>>
in Int. lower: Out<Inv<out Int>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<out Int>>
out Int. lower: Out<Inv<Nothing>>; upper: Out<Inv<out Int>>; substitution: Out<Inv<out Int>>
Inv<In<T>>
in Int. lower: Nothing; upper: Inv<out In<Int>>; substitution: Inv<In<Int>>
out Int. lower: Nothing; upper: Inv<out In<Nothing>>; substitution: Inv<In<out Any?>>
Inv<Out<T>>
in Int. lower: Nothing; upper: Inv<out Out<Any?>>; substitution: Inv<Out<Any?>>
out Int. lower: Nothing; upper: Inv<out Out<Int>>; substitution: Inv<Out<Int>>
Inv<Inv<T>>
in Int. lower: Nothing; upper: Inv<out Inv<in Int>>; substitution: Inv<Inv<in Int>>
out Int. lower: Nothing; upper: Inv<out Inv<out Int>>; substitution: Inv<Inv<out Int>>
Inv<Inv<in T>>
in Int. lower: Nothing; upper: Inv<out Inv<in Int>>; substitution: Inv<Inv<in Int>>
out Int. lower: Nothing; upper: Inv<out Inv<out Any?>>; substitution: Inv<Inv<in Int>>
Inv<Inv<out T>>
in Int. lower: Nothing; upper: Inv<out Inv<out Any?>>; substitution: Inv<Inv<out Int>>
out Int. lower: Nothing; upper: Inv<out Inv<out Int>>; substitution: Inv<Inv<out Int>>
Inv<in In<T>>
in Int. lower: Inv<in In<Int>>; upper: Inv<in In<Any?>>; substitution: Inv<in In<Int>>
out Int. lower: Inv<in In<Nothing>>; upper: Inv<in In<Int>>; substitution: Inv<in In<out Any?>>
Inv<in Out<T>>
in Int. lower: Inv<in Out<Any?>>; upper: Inv<in Out<Int>>; substitution: Inv<in Out<Any?>>
out Int. lower: Inv<in Out<Int>>; upper: Inv<in Out<Nothing>>; substitution: Inv<in Out<Int>>
Inv<in Inv<T>>
in Int. lower: Inv<in Inv<in Int>>; upper: Inv<out Any?>; substitution: Inv<in Inv<in Int>>
out Int. lower: Inv<in Inv<out Int>>; upper: Inv<out Any?>; substitution: Inv<in Inv<out Int>>
Inv<in Inv<in T>>
in Int. lower: Inv<in Inv<in Int>>; upper: Inv<in Inv<Any?>>; substitution: Inv<in Inv<in Int>>
out Int. lower: Inv<in Inv<out Any?>>; upper: Inv<in Inv<in Int>>; substitution: Inv<in Inv<in Int>>
Inv<in Inv<out T>>
in Int. lower: Inv<in Inv<out Any?>>; upper: Inv<in Inv<out Int>>; substitution: Inv<in Inv<out Int>>
out Int. lower: Inv<in Inv<out Int>>; upper: Inv<in Inv<Nothing>>; substitution: Inv<in Inv<out Int>>
Inv<out In<T>>
in Int. lower: Inv<out In<Any?>>; upper: Inv<out In<Int>>; substitution: Inv<out In<Int>>
out Int. lower: Inv<out In<Int>>; upper: Inv<out In<Nothing>>; substitution: Inv<out In<out Any?>>
Inv<out Out<T>>
in Int. lower: Inv<out Out<Int>>; upper: Inv<out Out<Any?>>; substitution: Inv<out Out<Any?>>
out Int. lower: Inv<out Out<Nothing>>; upper: Inv<out Out<Int>>; substitution: Inv<out Out<Int>>
Inv<out Inv<T>>
in Int. lower: Inv<Nothing>; upper: Inv<out Inv<in Int>>; substitution: Inv<out Inv<in Int>>
out Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Int>>; substitution: Inv<out Inv<out Int>>
Inv<out Inv<in T>>
in Int. lower: Inv<out Inv<Any?>>; upper: Inv<out Inv<in Int>>; substitution: Inv<out Inv<in Int>>
out Int. lower: Inv<out Inv<in Int>>; upper: Inv<out Inv<out Any?>>; substitution: Inv<out Inv<in Int>>
Inv<out Inv<out T>>
in Int. lower: Inv<out Inv<out Int>>; upper: Inv<out Inv<out Any?>>; substitution: Inv<out Inv<out Int>>
out Int. lower: Inv<out Inv<Nothing>>; upper: Inv<out Inv<out Int>>; substitution: Inv<out Inv<out Int>>
In<Inv<Out<T>>>
in Int. lower: In<Inv<out Out<Any?>>>; upper: In<Nothing>; substitution: In<Inv<Out<Any?>>>
out Int. lower: In<Inv<out Out<Int>>>; upper: In<Nothing>; substitution: In<Inv<Out<Int>>>
Out<Out<Out<T>>>
in Int. lower: Out<Out<Out<Int>>>; upper: Out<Out<Out<Any?>>>; substitution: Out<Out<Out<Any?>>>
out Int. lower: Out<Out<Out<Nothing>>>; upper: Out<Out<Out<Int>>>; substitution: Out<Out<Out<Int>>>
Inv<Inv<in In<T>>>
in Int. lower: Nothing; upper: Inv<out Inv<in In<Any?>>>; substitution: Inv<Inv<in In<Int>>>
out Int. lower: Nothing; upper: Inv<out Inv<in In<Int>>>; substitution: Inv<Inv<in In<out Any?>>>
Inv<out Inv<Out<T>>>
in Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Out<Any?>>>; substitution: Inv<out Inv<Out<Any?>>>
out Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Out<Int>>>; substitution: Inv<out Inv<Out<Int>>>
Inv<in Inv<Inv<T>>>
in Int. lower: Inv<in Inv<out Inv<in Int>>>; upper: Inv<out Any?>; substitution: Inv<in Inv<Inv<in Int>>>
out Int. lower: Inv<in Inv<out Inv<out Int>>>; upper: Inv<out Any?>; substitution: Inv<in Inv<Inv<out Int>>>
Out<Inv<In<T>>>
in Int. lower: Out<Nothing>; upper: Out<Inv<out In<Int>>>; substitution: Out<Inv<In<Int>>>
out Int. lower: Out<Nothing>; upper: Out<Inv<out In<Nothing>>>; substitution: Out<Inv<In<out Any?>>>
Inv<out Out<Out<T>>>
in Int. lower: Inv<out Out<Out<Int>>>; upper: Inv<out Out<Out<Any?>>>; substitution: Inv<out Out<Out<Any?>>>
out Int. lower: Inv<out Out<Out<Nothing>>>; upper: Inv<out Out<Out<Int>>>; substitution: Inv<out Out<Out<Int>>>
Out<In<Inv<T>>>
in Int. lower: Out<In<Inv<in Int>>>; upper: Out<In<Nothing>>; substitution: Out<In<Inv<in Int>>>
out Int. lower: Out<In<Inv<out Int>>>; upper: Out<In<Nothing>>; substitution: Out<In<Inv<out Int>>>
Inv<out In<Out<T>>>
in Int. lower: Inv<out In<Out<Any?>>>; upper: Inv<out In<Out<Int>>>; substitution: Inv<out In<Out<Any?>>>
out Int. lower: Inv<out In<Out<Int>>>; upper: Inv<out In<Out<Nothing>>>; substitution: Inv<out In<Out<Int>>>
In<Out<Inv<T>>>
in Int. lower: In<Out<Inv<in Int>>>; upper: In<Out<Nothing>>; substitution: In<Out<Inv<in Int>>>
out Int. lower: In<Out<Inv<out Int>>>; upper: In<Out<Nothing>>; substitution: In<Out<Inv<out Int>>>
Inv<out Inv<Inv<out Inv<in T>>>>
in Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Inv<out Inv<in Int>>>>; substitution: Inv<out Inv<Inv<out Inv<in Int>>>>
out Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Inv<out Inv<out Any?>>>>; substitution: Inv<out Inv<Inv<out Inv<in Int>>>>
Inv<in Out<In<Inv<in T>>>>
in Int. lower: Inv<in Out<In<Inv<Any?>>>>; upper: Inv<in Out<In<Inv<in Int>>>>; substitution: Inv<in Out<In<Inv<in Int>>>>
out Int. lower: Inv<in Out<In<Inv<in Int>>>>; upper: Inv<in Out<In<Inv<out Any?>>>>; substitution: Inv<in Out<In<Inv<in Int>>>>
Inv<in In<Inv<out Inv<in T>>>>
in Int. lower: Inv<in In<Inv<out Inv<Any?>>>>; upper: Inv<in In<Inv<out Inv<in Int>>>>; substitution: Inv<in In<Inv<out Inv<in Int>>>>
out Int. lower: Inv<in In<Inv<out Inv<in Int>>>>; upper: Inv<in In<Inv<out Inv<out Any?>>>>; substitution: Inv<in In<Inv<out Inv<in Int>>>>
Inv<In<In<Inv<in T>>>>
in Int. lower: Nothing; upper: Inv<out In<In<Inv<in Int>>>>; substitution: Inv<In<In<Inv<in Int>>>>
out Int. lower: Nothing; upper: Inv<out In<In<Inv<out Any?>>>>; substitution: Inv<In<In<Inv<in Int>>>>
Inv<out Inv<out Inv<out Inv<T>>>>
in Int. lower: Inv<out Inv<out Inv<Nothing>>>; upper: Inv<out Inv<out Inv<out Inv<in Int>>>>; substitution: Inv<out Inv<out Inv<out Inv<in Int>>>>
out Int. lower: Inv<out Inv<out Inv<Nothing>>>; upper: Inv<out Inv<out Inv<out Inv<out Int>>>>; substitution: Inv<out Inv<out Inv<out Inv<out Int>>>>
Inv<out Out<Inv<out Inv<in T>>>>
in Int. lower: Inv<out Out<Inv<out Inv<Any?>>>>; upper: Inv<out Out<Inv<out Inv<in Int>>>>; substitution: Inv<out Out<Inv<out Inv<in Int>>>>
out Int. lower: Inv<out Out<Inv<out Inv<in Int>>>>; upper: Inv<out Out<Inv<out Inv<out Any?>>>>; substitution: Inv<out Out<Inv<out Inv<in Int>>>>
Out<Inv<out Inv<out In<T>>>>
in Int. lower: Out<Inv<out Inv<out In<Any?>>>>; upper: Out<Inv<out Inv<out In<Int>>>>; substitution: Out<Inv<out Inv<out In<Int>>>>
out Int. lower: Out<Inv<out Inv<out In<Int>>>>; upper: Out<Inv<out Inv<out In<Nothing>>>>; substitution: Out<Inv<out Inv<out In<out Any?>>>>
In<Inv<in In<Inv<in T>>>>
in Int. lower: In<Inv<in In<Inv<in Int>>>>; upper: In<Inv<in In<Inv<Any?>>>>; substitution: In<Inv<in In<Inv<in Int>>>>
out Int. lower: In<Inv<in In<Inv<out Any?>>>>; upper: In<Inv<in In<Inv<in Int>>>>; substitution: In<Inv<in In<Inv<in Int>>>>
Out<Inv<in In<Inv<T>>>>
in Int. lower: Out<Inv<in In<Nothing>>>; upper: Out<Inv<in In<Inv<in Int>>>>; substitution: Out<Inv<in In<Inv<in Int>>>>
out Int. lower: Out<Inv<in In<Nothing>>>; upper: Out<Inv<in In<Inv<out Int>>>>; substitution: Out<Inv<in In<Inv<out Int>>>>
Out<Inv<in Inv<in Inv<T>>>>
in Int. lower: Out<Inv<in Inv<out Any?>>>; upper: Out<Inv<in Inv<in Inv<in Int>>>>; substitution: Out<Inv<in Inv<in Inv<in Int>>>>
out Int. lower: Out<Inv<in Inv<out Any?>>>; upper: Out<Inv<in Inv<in Inv<out Int>>>>; substitution: Out<Inv<in Inv<in Inv<out Int>>>>
In<In<Inv<In<In<T>>>>>
in Int. lower: In<In<Nothing>>; upper: In<In<Inv<out In<In<Any?>>>>>; substitution: In<In<Inv<In<In<Int>>>>>
out Int. lower: In<In<Nothing>>; upper: In<In<Inv<out In<In<Int>>>>>; substitution: In<In<Inv<In<In<out Any?>>>>>
Inv<Inv<Inv<Out<Inv<in T>>>>>
in Int. lower: Nothing; upper: Inv<out Inv<out Inv<out Out<Inv<in Int>>>>>; substitution: Inv<Inv<Inv<Out<Inv<in Int>>>>>
out Int. lower: Nothing; upper: Inv<out Inv<out Inv<out Out<Inv<out Any?>>>>>; substitution: Inv<Inv<Inv<Out<Inv<in Int>>>>>
Out<Inv<Out<Out<Inv<out T>>>>>
in Int. lower: Out<Nothing>; upper: Out<Inv<out Out<Out<Inv<out Any?>>>>>; substitution: Out<Inv<Out<Out<Inv<out Int>>>>>
out Int. lower: Out<Nothing>; upper: Out<Inv<out Out<Out<Inv<out Int>>>>>; substitution: Out<Inv<Out<Out<Inv<out Int>>>>>
Inv<In<Inv<in In<Inv<out T>>>>>
in Int. lower: Nothing; upper: Inv<out In<Inv<in In<Inv<out Int>>>>>; substitution: Inv<In<Inv<in In<Inv<out Int>>>>>
out Int. lower: Nothing; upper: Inv<out In<Inv<in In<Inv<Nothing>>>>>; substitution: Inv<In<Inv<in In<Inv<out Int>>>>>
Inv<in Inv<out In<Out<Inv<out T>>>>>
in Int. lower: Inv<in Inv<out In<Out<Inv<out Int>>>>>; upper: Inv<in Inv<out In<Out<Inv<out Any?>>>>>; substitution: Inv<in Inv<out In<Out<Inv<out Int>>>>>
out Int. lower: Inv<in Inv<out In<Out<Inv<Nothing>>>>>; upper: Inv<in Inv<out In<Out<Inv<out Int>>>>>; substitution: Inv<in Inv<out In<Out<Inv<out Int>>>>>
Inv<out Out<Inv<in Inv<in Inv<in T>>>>>
in Int. lower: Inv<out Out<Inv<in Inv<in Inv<Any?>>>>>; upper: Inv<out Out<Inv<in Inv<in Inv<in Int>>>>>; substitution: Inv<out Out<Inv<in Inv<in Inv<in Int>>>>>
out Int. lower: Inv<out Out<Inv<in Inv<in Inv<in Int>>>>>; upper: Inv<out Out<Inv<in Inv<in Inv<out Any?>>>>>; substitution: Inv<out Out<Inv<in Inv<in Inv<in Int>>>>>
Out<Out<Inv<Out<Inv<out T>>>>>
in Int. lower: Out<Out<Nothing>>; upper: Out<Out<Inv<out Out<Inv<out Any?>>>>>; substitution: Out<Out<Inv<Out<Inv<out Int>>>>>
out Int. lower: Out<Out<Nothing>>; upper: Out<Out<Inv<out Out<Inv<out Int>>>>>; substitution: Out<Out<Inv<Out<Inv<out Int>>>>>
In<Inv<In<In<Inv<out T>>>>>
in Int. lower: In<Inv<out In<In<Inv<out Any?>>>>>; upper: In<Nothing>; substitution: In<Inv<In<In<Inv<out Int>>>>>
out Int. lower: In<Inv<out In<In<Inv<out Int>>>>>; upper: In<Nothing>; substitution: In<Inv<In<In<Inv<out Int>>>>>
Inv<out Inv<in Inv<Inv<out Inv<out T>>>>>
in Int. lower: Inv<out Inv<in Inv<out Inv<out Inv<out Any?>>>>>; upper: Inv<out Inv<out Any?>>; substitution: Inv<out Inv<in Inv<Inv<out Inv<out Int>>>>>
out Int. lower: Inv<out Inv<in Inv<out Inv<out Inv<out Int>>>>>; upper: Inv<out Inv<out Any?>>; substitution: Inv<out Inv<in Inv<Inv<out Inv<out Int>>>>>
In<Inv<in In<In<Inv<out T>>>>>
in Int. lower: In<Inv<in In<In<Inv<out Int>>>>>; upper: In<Inv<in In<In<Inv<out Any?>>>>>; substitution: In<Inv<in In<In<Inv<out Int>>>>>
out Int. lower: In<Inv<in In<In<Inv<Nothing>>>>>; upper: In<Inv<in In<In<Inv<out Int>>>>>; substitution: In<Inv<in In<In<Inv<out Int>>>>>
In<Inv<Out<In<Inv<Inv<T>>>>>>
in Int. lower: In<Inv<out Out<In<Nothing>>>>; upper: In<Nothing>; substitution: In<Inv<Out<In<Inv<Inv<in Int>>>>>>
out Int. lower: In<Inv<out Out<In<Nothing>>>>; upper: In<Nothing>; substitution: In<Inv<Out<In<Inv<Inv<out Int>>>>>>
Out<Inv<Inv<out Inv<Inv<in In<T>>>>>>
in Int. lower: Out<Nothing>; upper: Out<Inv<out Inv<out Inv<out Inv<in In<Any?>>>>>>; substitution: Out<Inv<Inv<out Inv<Inv<in In<Int>>>>>>
out Int. lower: Out<Nothing>; upper: Out<Inv<out Inv<out Inv<out Inv<in In<Int>>>>>>; substitution: Out<Inv<Inv<out Inv<Inv<in In<out Any?>>>>>>
Inv<Out<In<In<Inv<in In<T>>>>>>
in Int. lower: Nothing; upper: Inv<out Out<In<In<Inv<in In<Any?>>>>>>; substitution: Inv<Out<In<In<Inv<in In<Int>>>>>>
out Int. lower: Nothing; upper: Inv<out Out<In<In<Inv<in In<Int>>>>>>; substitution: Inv<Out<In<In<Inv<in In<out Any?>>>>>>
Inv<In<Inv<Inv<in Inv<out Inv<out T>>>>>>
in Int. lower: Nothing; upper: Inv<out In<Nothing>>; substitution: Inv<In<Inv<Inv<in Inv<out Inv<out Int>>>>>>
out Int. lower: Nothing; upper: Inv<out In<Nothing>>; substitution: Inv<In<Inv<Inv<in Inv<out Inv<out Int>>>>>>
In<Inv<out Inv<in Inv<Inv<in Inv<out T>>>>>>
in Int. lower: In<Inv<out Inv<out Any?>>>; upper: In<Inv<out Inv<in Inv<out Inv<in Inv<out Int>>>>>>; substitution: In<Inv<out Inv<in Inv<Inv<in Inv<out Int>>>>>>
out Int. lower: In<Inv<out Inv<out Any?>>>; upper: In<Inv<out Inv<in Inv<out Inv<in Inv<Nothing>>>>>>; substitution: In<Inv<out Inv<in Inv<Inv<in Inv<out Int>>>>>>
In<Inv<Inv<out Inv<out In<In<T>>>>>>
in Int. lower: In<Inv<out Inv<out Inv<out In<In<Any?>>>>>>; upper: In<Nothing>; substitution: In<Inv<Inv<out Inv<out In<In<Int>>>>>>
out Int. lower: In<Inv<out Inv<out Inv<out In<In<Int>>>>>>; upper: In<Nothing>; substitution: In<Inv<Inv<out Inv<out In<In<out Any?>>>>>>
Out<In<Inv<Out<Inv<Out<T>>>>>>
in Int. lower: Out<In<Inv<out Out<Inv<out Out<Any?>>>>>>; upper: Out<In<Nothing>>; substitution: Out<In<Inv<Out<Inv<Out<Any?>>>>>>
out Int. lower: Out<In<Inv<out Out<Inv<out Out<Int>>>>>>; upper: Out<In<Nothing>>; substitution: Out<In<Inv<Out<Inv<Out<Int>>>>>>
Inv<out Inv<Inv<in Out<Inv<out Inv<in T>>>>>>
in Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Inv<in Out<Inv<out Inv<Any?>>>>>>; substitution: Inv<out Inv<Inv<in Out<Inv<out Inv<in Int>>>>>>
out Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Inv<in Out<Inv<out Inv<in Int>>>>>>; substitution: Inv<out Inv<Inv<in Out<Inv<out Inv<in Int>>>>>>
Out<Inv<in Inv<Out<Inv<Out<T>>>>>>
in Int. lower: Out<Inv<in Inv<out Out<Inv<out Out<Any?>>>>>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<in Inv<Out<Inv<Out<Any?>>>>>>
out Int. lower: Out<Inv<in Inv<out Out<Inv<out Out<Int>>>>>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<in Inv<Out<Inv<Out<Int>>>>>>
Inv<Inv<in Inv<in In<In<Out<T>>>>>>
in Int. lower: Nothing; upper: Inv<out Inv<in Inv<in In<In<Out<Any?>>>>>>; substitution: Inv<Inv<in Inv<in In<In<Out<Any?>>>>>>
out Int. lower: Nothing; upper: Inv<out Inv<in Inv<in In<In<Out<Int>>>>>>; substitution: Inv<Inv<in Inv<in In<In<Out<Int>>>>>>
@@ -0,0 +1,179 @@
In<Fun<T, R>>
T = in Int. R = out String. lower: In<Fun<Int, String>>; upper: In<Fun<Any?, Nothing>>; substitution: In<Fun<Int, String>>
Out<Fun<T, R>>
T = in Int. R = out String. lower: Out<Fun<Any?, Nothing>>; upper: Out<Fun<Int, String>>; substitution: Out<Fun<Int, String>>
Inv<Fun<T, R>>
T = in Int. R = out String. lower: Nothing; upper: Inv<out Fun<Int, String>>; substitution: Inv<Fun<Int, String>>
Inv<in Fun<T, R>>
T = in Int. R = out String. lower: Inv<in Fun<Int, String>>; upper: Inv<in Fun<Any?, Nothing>>; substitution: Inv<in Fun<Int, String>>
Inv<out Fun<T, R>>
T = in Int. R = out String. lower: Inv<out Fun<Any?, Nothing>>; upper: Inv<out Fun<Int, String>>; substitution: Inv<out Fun<Int, String>>
Fun<In<T>, In<R>>
T = in Int. R = out String. lower: Fun<In<Int>, In<String>>; upper: Fun<In<Any?>, In<Nothing>>; substitution: Fun<In<Int>, In<out Any?>>
Fun<In<T>, Out<R>>
T = in Int. R = out String. lower: Fun<In<Int>, Out<Nothing>>; upper: Fun<In<Any?>, Out<String>>; substitution: Fun<In<Int>, Out<String>>
Fun<In<T>, Inv<R>>
T = in Int. R = out String. lower: Fun<In<Int>, Nothing>; upper: Fun<In<Any?>, Inv<out String>>; substitution: Fun<In<Int>, Inv<out String>>
Fun<In<T>, Inv<in R>>
T = in Int. R = out String. lower: Fun<In<Int>, Inv<in String>>; upper: Fun<In<Any?>, Inv<out Any?>>; substitution: Fun<In<Int>, Inv<in String>>
Fun<In<T>, Inv<out R>>
T = in Int. R = out String. lower: Fun<In<Int>, Inv<Nothing>>; upper: Fun<In<Any?>, Inv<out String>>; substitution: Fun<In<Int>, Inv<out String>>
Fun<Out<T>, In<R>>
T = in Int. R = out String. lower: Fun<Out<Any?>, In<String>>; upper: Fun<Out<Int>, In<Nothing>>; substitution: Fun<Out<Any?>, In<out Any?>>
Fun<Out<T>, Out<R>>
T = in Int. R = out String. lower: Fun<Out<Any?>, Out<Nothing>>; upper: Fun<Out<Int>, Out<String>>; substitution: Fun<Out<Any?>, Out<String>>
Fun<Out<T>, Inv<R>>
T = in Int. R = out String. lower: Fun<Out<Any?>, Nothing>; upper: Fun<Out<Int>, Inv<out String>>; substitution: Fun<Out<Any?>, Inv<out String>>
Fun<Out<T>, Inv<in R>>
T = in Int. R = out String. lower: Fun<Out<Any?>, Inv<in String>>; upper: Fun<Out<Int>, Inv<out Any?>>; substitution: Fun<Out<Any?>, Inv<in String>>
Fun<Out<T>, Inv<out R>>
T = in Int. R = out String. lower: Fun<Out<Any?>, Inv<Nothing>>; upper: Fun<Out<Int>, Inv<out String>>; substitution: Fun<Out<Any?>, Inv<out String>>
Fun<Inv<T>, In<R>>
T = in Int. R = out String. lower: Fun<Inv<in Int>, In<String>>; upper: Fun<Nothing, In<Nothing>>; substitution: Fun<Inv<in Int>, In<out Any?>>
Fun<Inv<T>, Out<R>>
T = in Int. R = out String. lower: Fun<Inv<in Int>, Out<Nothing>>; upper: Fun<Nothing, Out<String>>; substitution: Fun<Inv<in Int>, Out<String>>
Fun<Inv<T>, Inv<R>>
T = in Int. R = out String. lower: Fun<Inv<in Int>, Nothing>; upper: Fun<Nothing, Inv<out String>>; substitution: Fun<Inv<in Int>, Inv<out String>>
Fun<Inv<T>, Inv<in R>>
T = in Int. R = out String. lower: Fun<Inv<in Int>, Inv<in String>>; upper: Fun<Nothing, Inv<out Any?>>; substitution: Fun<Inv<in Int>, Inv<in String>>
Fun<Inv<T>, Inv<out R>>
T = in Int. R = out String. lower: Fun<Inv<in Int>, Inv<Nothing>>; upper: Fun<Nothing, Inv<out String>>; substitution: Fun<Inv<in Int>, Inv<out String>>
Fun<Inv<in T>, In<R>>
T = in Int. R = out String. lower: Fun<Inv<in Int>, In<String>>; upper: Fun<Inv<Any?>, In<Nothing>>; substitution: Fun<Inv<in Int>, In<out Any?>>
Fun<Inv<in T>, Out<R>>
T = in Int. R = out String. lower: Fun<Inv<in Int>, Out<Nothing>>; upper: Fun<Inv<Any?>, Out<String>>; substitution: Fun<Inv<in Int>, Out<String>>
Fun<Inv<in T>, Inv<R>>
T = in Int. R = out String. lower: Fun<Inv<in Int>, Nothing>; upper: Fun<Inv<Any?>, Inv<out String>>; substitution: Fun<Inv<in Int>, Inv<out String>>
Fun<Inv<in T>, Inv<in R>>
T = in Int. R = out String. lower: Fun<Inv<in Int>, Inv<in String>>; upper: Fun<Inv<Any?>, Inv<out Any?>>; substitution: Fun<Inv<in Int>, Inv<in String>>
Fun<Inv<in T>, Inv<out R>>
T = in Int. R = out String. lower: Fun<Inv<in Int>, Inv<Nothing>>; upper: Fun<Inv<Any?>, Inv<out String>>; substitution: Fun<Inv<in Int>, Inv<out String>>
Fun<Inv<out T>, In<R>>
T = in Int. R = out String. lower: Fun<Inv<out Any?>, In<String>>; upper: Fun<Inv<out Int>, In<Nothing>>; substitution: Fun<Inv<out Int>, In<out Any?>>
Fun<Inv<out T>, Out<R>>
T = in Int. R = out String. lower: Fun<Inv<out Any?>, Out<Nothing>>; upper: Fun<Inv<out Int>, Out<String>>; substitution: Fun<Inv<out Int>, Out<String>>
Fun<Inv<out T>, Inv<R>>
T = in Int. R = out String. lower: Fun<Inv<out Any?>, Nothing>; upper: Fun<Inv<out Int>, Inv<out String>>; substitution: Fun<Inv<out Int>, Inv<out String>>
Fun<Inv<out T>, Inv<in R>>
T = in Int. R = out String. lower: Fun<Inv<out Any?>, Inv<in String>>; upper: Fun<Inv<out Int>, Inv<out Any?>>; substitution: Fun<Inv<out Int>, Inv<in String>>
Fun<Inv<out T>, Inv<out R>>
T = in Int. R = out String. lower: Fun<Inv<out Any?>, Inv<Nothing>>; upper: Fun<Inv<out Int>, Inv<out String>>; substitution: Fun<Inv<out Int>, Inv<out String>>
In<Inv2<T, R>>
T = in Int. R = out String. lower: In<Inv2<in Int, out String>>; upper: In<Nothing>; substitution: In<Inv2<in Int, out String>>
Out<Inv2<T, R>>
T = in Int. R = out String. lower: Out<Nothing>; upper: Out<Inv2<in Int, out String>>; substitution: Out<Inv2<in Int, out String>>
Inv<Inv2<T, R>>
T = in Int. R = out String. lower: Nothing; upper: Inv<out Inv2<in Int, out String>>; substitution: Inv<Inv2<in Int, out String>>
Inv<in Inv2<T, R>>
T = in Int. R = out String. lower: Inv<in Inv2<in Int, out String>>; upper: Inv<out Any?>; substitution: Inv<in Inv2<in Int, out String>>
Inv<out Inv2<T, R>>
T = in Int. R = out String. lower: Inv<Nothing>; upper: Inv<out Inv2<in Int, out String>>; substitution: Inv<out Inv2<in Int, out String>>
Inv2<In<T>, In<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out In<Int>, out In<Nothing>>; substitution: Inv2<In<Int>, In<out Any?>>
Inv2<In<T>, Out<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out In<Int>, out Out<String>>; substitution: Inv2<In<Int>, Out<String>>
Inv2<In<T>, Inv<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out In<Int>, out Inv<out String>>; substitution: Inv2<In<Int>, Inv<out String>>
Inv2<In<T>, Inv<in R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out In<Int>, out Inv<out Any?>>; substitution: Inv2<In<Int>, Inv<in String>>
Inv2<In<T>, Inv<out R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out In<Int>, out Inv<out String>>; substitution: Inv2<In<Int>, Inv<out String>>
Inv2<Out<T>, In<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Out<Any?>, out In<Nothing>>; substitution: Inv2<Out<Any?>, In<out Any?>>
Inv2<Out<T>, Out<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Out<Any?>, out Out<String>>; substitution: Inv2<Out<Any?>, Out<String>>
Inv2<Out<T>, Inv<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Out<Any?>, out Inv<out String>>; substitution: Inv2<Out<Any?>, Inv<out String>>
Inv2<Out<T>, Inv<in R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Out<Any?>, out Inv<out Any?>>; substitution: Inv2<Out<Any?>, Inv<in String>>
Inv2<Out<T>, Inv<out R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Out<Any?>, out Inv<out String>>; substitution: Inv2<Out<Any?>, Inv<out String>>
Inv2<Inv<T>, In<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<in Int>, out In<Nothing>>; substitution: Inv2<Inv<in Int>, In<out Any?>>
Inv2<Inv<T>, Out<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<in Int>, out Out<String>>; substitution: Inv2<Inv<in Int>, Out<String>>
Inv2<Inv<T>, Inv<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<in Int>, out Inv<out String>>; substitution: Inv2<Inv<in Int>, Inv<out String>>
Inv2<Inv<T>, Inv<in R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<in Int>, out Inv<out Any?>>; substitution: Inv2<Inv<in Int>, Inv<in String>>
Inv2<Inv<T>, Inv<out R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<in Int>, out Inv<out String>>; substitution: Inv2<Inv<in Int>, Inv<out String>>
Inv2<Inv<in T>, In<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<in Int>, out In<Nothing>>; substitution: Inv2<Inv<in Int>, In<out Any?>>
Inv2<Inv<in T>, Out<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<in Int>, out Out<String>>; substitution: Inv2<Inv<in Int>, Out<String>>
Inv2<Inv<in T>, Inv<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<in Int>, out Inv<out String>>; substitution: Inv2<Inv<in Int>, Inv<out String>>
Inv2<Inv<in T>, Inv<in R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<in Int>, out Inv<out Any?>>; substitution: Inv2<Inv<in Int>, Inv<in String>>
Inv2<Inv<in T>, Inv<out R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<in Int>, out Inv<out String>>; substitution: Inv2<Inv<in Int>, Inv<out String>>
Inv2<Inv<out T>, In<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<out Any?>, out In<Nothing>>; substitution: Inv2<Inv<out Int>, In<out Any?>>
Inv2<Inv<out T>, Out<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<out Any?>, out Out<String>>; substitution: Inv2<Inv<out Int>, Out<String>>
Inv2<Inv<out T>, Inv<R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<out Any?>, out Inv<out String>>; substitution: Inv2<Inv<out Int>, Inv<out String>>
Inv2<Inv<out T>, Inv<in R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<out Any?>, out Inv<out Any?>>; substitution: Inv2<Inv<out Int>, Inv<in String>>
Inv2<Inv<out T>, Inv<out R>>
T = in Int. R = out String. lower: Nothing; upper: Inv2<out Inv<out Any?>, out Inv<out String>>; substitution: Inv2<Inv<out Int>, Inv<out String>>
@@ -0,0 +1,236 @@
In<in T?>
in Int. lower: In<Any?>; upper: In<Int?>; substitution: In<Int?>
out Int. lower: In<Int?>; upper: In<Nothing?>; substitution: In<out Any?>
Out<in T?>
compiler error
Inv<in T?>
in Int. lower: Inv<Any?>; upper: Inv<in Int?>; substitution: Inv<in Int?>
out Int. lower: Inv<in Int?>; upper: Inv<in Nothing?>; substitution: Inv<in Int?>
Inv<in in T?>
compiler error
Inv<out in T?>
compiler error
In<In<in T?>>
in Int. lower: In<In<Int?>>; upper: In<In<Any?>>; substitution: In<In<Int?>>
out Int. lower: In<In<Nothing?>>; upper: In<In<Int?>>; substitution: In<In<out Any?>>
In<Out<in T?>>
compiler error
In<Inv<in T?>>
in Int. lower: In<Inv<in Int?>>; upper: In<Inv<Any?>>; substitution: In<Inv<in Int?>>
out Int. lower: In<Inv<in Nothing?>>; upper: In<Inv<in Int?>>; substitution: In<Inv<in Int?>>
In<Inv<in in T?>>
compiler error
In<Inv<out in T?>>
compiler error
Out<In<in T?>>
in Int. lower: Out<In<Any?>>; upper: Out<In<Int?>>; substitution: Out<In<Int?>>
out Int. lower: Out<In<Int?>>; upper: Out<In<Nothing?>>; substitution: Out<In<out Any?>>
Out<Out<in T?>>
compiler error
Out<Inv<in T?>>
in Int. lower: Out<Inv<Any?>>; upper: Out<Inv<in Int?>>; substitution: Out<Inv<in Int?>>
out Int. lower: Out<Inv<in Int?>>; upper: Out<Inv<in Nothing?>>; substitution: Out<Inv<in Int?>>
Out<Inv<in in T?>>
compiler error
Out<Inv<out in T?>>
compiler error
Inv<In<in T?>>
in Int. lower: Nothing; upper: Inv<out In<Int?>>; substitution: Inv<In<Int?>>
out Int. lower: Nothing; upper: Inv<out In<Nothing?>>; substitution: Inv<In<out Any?>>
Inv<Out<in T?>>
compiler error
Inv<Inv<in T?>>
in Int. lower: Nothing; upper: Inv<out Inv<in Int?>>; substitution: Inv<Inv<in Int?>>
out Int. lower: Nothing; upper: Inv<out Inv<in Nothing?>>; substitution: Inv<Inv<in Int?>>
Inv<Inv<in in T?>>
compiler error
Inv<Inv<out in T?>>
compiler error
Inv<in In<in T?>>
in Int. lower: Inv<in In<Int?>>; upper: Inv<in In<Any?>>; substitution: Inv<in In<Int?>>
out Int. lower: Inv<in In<Nothing?>>; upper: Inv<in In<Int?>>; substitution: Inv<in In<out Any?>>
Inv<in Out<in T?>>
compiler error
Inv<in Inv<in T?>>
in Int. lower: Inv<in Inv<in Int?>>; upper: Inv<in Inv<Any?>>; substitution: Inv<in Inv<in Int?>>
out Int. lower: Inv<in Inv<in Nothing?>>; upper: Inv<in Inv<in Int?>>; substitution: Inv<in Inv<in Int?>>
Inv<in Inv<in in T?>>
compiler error
Inv<in Inv<out in T?>>
compiler error
Inv<out In<in T?>>
in Int. lower: Inv<out In<Any?>>; upper: Inv<out In<Int?>>; substitution: Inv<out In<Int?>>
out Int. lower: Inv<out In<Int?>>; upper: Inv<out In<Nothing?>>; substitution: Inv<out In<out Any?>>
Inv<out Out<in T?>>
compiler error
Inv<out Inv<in T?>>
in Int. lower: Inv<out Inv<Any?>>; upper: Inv<out Inv<in Int?>>; substitution: Inv<out Inv<in Int?>>
out Int. lower: Inv<out Inv<in Int?>>; upper: Inv<out Inv<in Nothing?>>; substitution: Inv<out Inv<in Int?>>
Inv<out Inv<in in T?>>
compiler error
Inv<out Inv<out in T?>>
compiler error
In<Inv<Out<in T?>>>
compiler error
Out<Out<Out<in T?>>>
compiler error
Inv<Inv<in In<in T?>>>
in Int. lower: Nothing; upper: Inv<out Inv<in In<Any?>>>; substitution: Inv<Inv<in In<Int?>>>
out Int. lower: Nothing; upper: Inv<out Inv<in In<Int?>>>; substitution: Inv<Inv<in In<out Any?>>>
Inv<out Inv<Out<in T?>>>
compiler error
Inv<in Inv<Inv<in T?>>>
in Int. lower: Inv<in Inv<out Inv<in Int?>>>; upper: Inv<out Any?>; substitution: Inv<in Inv<Inv<in Int?>>>
out Int. lower: Inv<in Inv<out Inv<in Nothing?>>>; upper: Inv<out Any?>; substitution: Inv<in Inv<Inv<in Int?>>>
Out<Inv<In<in T?>>>
in Int. lower: Out<Nothing>; upper: Out<Inv<out In<Int?>>>; substitution: Out<Inv<In<Int?>>>
out Int. lower: Out<Nothing>; upper: Out<Inv<out In<Nothing?>>>; substitution: Out<Inv<In<out Any?>>>
Inv<out Out<Out<in T?>>>
compiler error
Out<In<Inv<in T?>>>
in Int. lower: Out<In<Inv<in Int?>>>; upper: Out<In<Inv<Any?>>>; substitution: Out<In<Inv<in Int?>>>
out Int. lower: Out<In<Inv<in Nothing?>>>; upper: Out<In<Inv<in Int?>>>; substitution: Out<In<Inv<in Int?>>>
Inv<out In<Out<in T?>>>
compiler error
In<Out<Inv<in T?>>>
in Int. lower: In<Out<Inv<in Int?>>>; upper: In<Out<Inv<Any?>>>; substitution: In<Out<Inv<in Int?>>>
out Int. lower: In<Out<Inv<in Nothing?>>>; upper: In<Out<Inv<in Int?>>>; substitution: In<Out<Inv<in Int?>>>
Inv<out Inv<Inv<out Inv<in in T?>>>>
compiler error
Inv<in Out<In<Inv<in in T?>>>>
compiler error
Inv<in In<Inv<out Inv<in in T?>>>>
compiler error
Inv<In<In<Inv<in in T?>>>>
compiler error
Inv<out Inv<out Inv<out Inv<in T?>>>>
in Int. lower: Inv<out Inv<out Inv<out Inv<Any?>>>>; upper: Inv<out Inv<out Inv<out Inv<in Int?>>>>; substitution: Inv<out Inv<out Inv<out Inv<in Int?>>>>
out Int. lower: Inv<out Inv<out Inv<out Inv<in Int?>>>>; upper: Inv<out Inv<out Inv<out Inv<in Nothing?>>>>; substitution: Inv<out Inv<out Inv<out Inv<in Int?>>>>
Inv<out Out<Inv<out Inv<in in T?>>>>
compiler error
Out<Inv<out Inv<out In<in T?>>>>
in Int. lower: Out<Inv<out Inv<out In<Any?>>>>; upper: Out<Inv<out Inv<out In<Int?>>>>; substitution: Out<Inv<out Inv<out In<Int?>>>>
out Int. lower: Out<Inv<out Inv<out In<Int?>>>>; upper: Out<Inv<out Inv<out In<Nothing?>>>>; substitution: Out<Inv<out Inv<out In<out Any?>>>>
In<Inv<in In<Inv<in in T?>>>>
compiler error
Out<Inv<in In<Inv<in T?>>>>
in Int. lower: Out<Inv<in In<Inv<Any?>>>>; upper: Out<Inv<in In<Inv<in Int?>>>>; substitution: Out<Inv<in In<Inv<in Int?>>>>
out Int. lower: Out<Inv<in In<Inv<in Int?>>>>; upper: Out<Inv<in In<Inv<in Nothing?>>>>; substitution: Out<Inv<in In<Inv<in Int?>>>>
Out<Inv<in Inv<in Inv<in T?>>>>
in Int. lower: Out<Inv<in Inv<in Inv<Any?>>>>; upper: Out<Inv<in Inv<in Inv<in Int?>>>>; substitution: Out<Inv<in Inv<in Inv<in Int?>>>>
out Int. lower: Out<Inv<in Inv<in Inv<in Int?>>>>; upper: Out<Inv<in Inv<in Inv<in Nothing?>>>>; substitution: Out<Inv<in Inv<in Inv<in Int?>>>>
In<In<Inv<In<In<in T?>>>>>
in Int. lower: In<In<Nothing>>; upper: In<In<Inv<out In<In<Any?>>>>>; substitution: In<In<Inv<In<In<Int?>>>>>
out Int. lower: In<In<Nothing>>; upper: In<In<Inv<out In<In<Int?>>>>>; substitution: In<In<Inv<In<In<out Any?>>>>>
Inv<Inv<Inv<Out<Inv<in in T?>>>>>
compiler error
Out<Inv<Out<Out<Inv<out in T?>>>>>
compiler error
Inv<In<Inv<in In<Inv<out in T?>>>>>
compiler error
Inv<in Inv<out In<Out<Inv<out in T?>>>>>
compiler error
Inv<out Out<Inv<in Inv<in Inv<in in T?>>>>>
compiler error
Out<Out<Inv<Out<Inv<out in T?>>>>>
compiler error
In<Inv<In<In<Inv<out in T?>>>>>
compiler error
Inv<out Inv<in Inv<Inv<out Inv<out in T?>>>>>
compiler error
In<Inv<in In<In<Inv<out in T?>>>>>
compiler error
In<Inv<Out<In<Inv<Inv<in T?>>>>>>
in Int. lower: In<Inv<out Out<In<Nothing>>>>; upper: In<Nothing>; substitution: In<Inv<Out<In<Inv<Inv<in Int?>>>>>>
out Int. lower: In<Inv<out Out<In<Nothing>>>>; upper: In<Nothing>; substitution: In<Inv<Out<In<Inv<Inv<in Int?>>>>>>
Out<Inv<Inv<out Inv<Inv<in In<in T?>>>>>>
in Int. lower: Out<Nothing>; upper: Out<Inv<out Inv<out Inv<out Inv<in In<Any?>>>>>>; substitution: Out<Inv<Inv<out Inv<Inv<in In<Int?>>>>>>
out Int. lower: Out<Nothing>; upper: Out<Inv<out Inv<out Inv<out Inv<in In<Int?>>>>>>; substitution: Out<Inv<Inv<out Inv<Inv<in In<out Any?>>>>>>
Inv<Out<In<In<Inv<in In<in T?>>>>>>
in Int. lower: Nothing; upper: Inv<out Out<In<In<Inv<in In<Any?>>>>>>; substitution: Inv<Out<In<In<Inv<in In<Int?>>>>>>
out Int. lower: Nothing; upper: Inv<out Out<In<In<Inv<in In<Int?>>>>>>; substitution: Inv<Out<In<In<Inv<in In<out Any?>>>>>>
Inv<In<Inv<Inv<in Inv<out Inv<out in T?>>>>>>
compiler error
In<Inv<out Inv<in Inv<Inv<in Inv<out in T?>>>>>>
compiler error
In<Inv<Inv<out Inv<out In<In<in T?>>>>>>
in Int. lower: In<Inv<out Inv<out Inv<out In<In<Any?>>>>>>; upper: In<Nothing>; substitution: In<Inv<Inv<out Inv<out In<In<Int?>>>>>>
out Int. lower: In<Inv<out Inv<out Inv<out In<In<Int?>>>>>>; upper: In<Nothing>; substitution: In<Inv<Inv<out Inv<out In<In<out Any?>>>>>>
Out<In<Inv<Out<Inv<Out<in T?>>>>>>
compiler error
Inv<out Inv<Inv<in Out<Inv<out Inv<in in T?>>>>>>
compiler error
Out<Inv<in Inv<Out<Inv<Out<in T?>>>>>>
compiler error
Inv<Inv<in Inv<in In<In<Out<in T?>>>>>>
compiler error
@@ -0,0 +1,236 @@
In<in T>
in Int. lower: In<Any?>; upper: In<Int>; substitution: In<Int>
out Int. lower: In<Int>; upper: In<Nothing>; substitution: In<out Any?>
Out<in T>
compiler error
Inv<in T>
in Int. lower: Inv<Any?>; upper: Inv<in Int>; substitution: Inv<in Int>
out Int. lower: Inv<in Int>; upper: Inv<out Any?>; substitution: Inv<in Int>
Inv<in in T>
compiler error
Inv<out in T>
compiler error
In<In<in T>>
in Int. lower: In<In<Int>>; upper: In<In<Any?>>; substitution: In<In<Int>>
out Int. lower: In<In<Nothing>>; upper: In<In<Int>>; substitution: In<In<out Any?>>
In<Out<in T>>
compiler error
In<Inv<in T>>
in Int. lower: In<Inv<in Int>>; upper: In<Inv<Any?>>; substitution: In<Inv<in Int>>
out Int. lower: In<Inv<out Any?>>; upper: In<Inv<in Int>>; substitution: In<Inv<in Int>>
In<Inv<in in T>>
compiler error
In<Inv<out in T>>
compiler error
Out<In<in T>>
in Int. lower: Out<In<Any?>>; upper: Out<In<Int>>; substitution: Out<In<Int>>
out Int. lower: Out<In<Int>>; upper: Out<In<Nothing>>; substitution: Out<In<out Any?>>
Out<Out<in T>>
compiler error
Out<Inv<in T>>
in Int. lower: Out<Inv<Any?>>; upper: Out<Inv<in Int>>; substitution: Out<Inv<in Int>>
out Int. lower: Out<Inv<in Int>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<in Int>>
Out<Inv<in in T>>
compiler error
Out<Inv<out in T>>
compiler error
Inv<In<in T>>
in Int. lower: Nothing; upper: Inv<out In<Int>>; substitution: Inv<In<Int>>
out Int. lower: Nothing; upper: Inv<out In<Nothing>>; substitution: Inv<In<out Any?>>
Inv<Out<in T>>
compiler error
Inv<Inv<in T>>
in Int. lower: Nothing; upper: Inv<out Inv<in Int>>; substitution: Inv<Inv<in Int>>
out Int. lower: Nothing; upper: Inv<out Inv<out Any?>>; substitution: Inv<Inv<in Int>>
Inv<Inv<in in T>>
compiler error
Inv<Inv<out in T>>
compiler error
Inv<in In<in T>>
in Int. lower: Inv<in In<Int>>; upper: Inv<in In<Any?>>; substitution: Inv<in In<Int>>
out Int. lower: Inv<in In<Nothing>>; upper: Inv<in In<Int>>; substitution: Inv<in In<out Any?>>
Inv<in Out<in T>>
compiler error
Inv<in Inv<in T>>
in Int. lower: Inv<in Inv<in Int>>; upper: Inv<in Inv<Any?>>; substitution: Inv<in Inv<in Int>>
out Int. lower: Inv<in Inv<out Any?>>; upper: Inv<in Inv<in Int>>; substitution: Inv<in Inv<in Int>>
Inv<in Inv<in in T>>
compiler error
Inv<in Inv<out in T>>
compiler error
Inv<out In<in T>>
in Int. lower: Inv<out In<Any?>>; upper: Inv<out In<Int>>; substitution: Inv<out In<Int>>
out Int. lower: Inv<out In<Int>>; upper: Inv<out In<Nothing>>; substitution: Inv<out In<out Any?>>
Inv<out Out<in T>>
compiler error
Inv<out Inv<in T>>
in Int. lower: Inv<out Inv<Any?>>; upper: Inv<out Inv<in Int>>; substitution: Inv<out Inv<in Int>>
out Int. lower: Inv<out Inv<in Int>>; upper: Inv<out Inv<out Any?>>; substitution: Inv<out Inv<in Int>>
Inv<out Inv<in in T>>
compiler error
Inv<out Inv<out in T>>
compiler error
In<Inv<Out<in T>>>
compiler error
Out<Out<Out<in T>>>
compiler error
Inv<Inv<in In<in T>>>
in Int. lower: Nothing; upper: Inv<out Inv<in In<Any?>>>; substitution: Inv<Inv<in In<Int>>>
out Int. lower: Nothing; upper: Inv<out Inv<in In<Int>>>; substitution: Inv<Inv<in In<out Any?>>>
Inv<out Inv<Out<in T>>>
compiler error
Inv<in Inv<Inv<in T>>>
in Int. lower: Inv<in Inv<out Inv<in Int>>>; upper: Inv<out Any?>; substitution: Inv<in Inv<Inv<in Int>>>
out Int. lower: Inv<in Inv<out Inv<out Any?>>>; upper: Inv<out Any?>; substitution: Inv<in Inv<Inv<in Int>>>
Out<Inv<In<in T>>>
in Int. lower: Out<Nothing>; upper: Out<Inv<out In<Int>>>; substitution: Out<Inv<In<Int>>>
out Int. lower: Out<Nothing>; upper: Out<Inv<out In<Nothing>>>; substitution: Out<Inv<In<out Any?>>>
Inv<out Out<Out<in T>>>
compiler error
Out<In<Inv<in T>>>
in Int. lower: Out<In<Inv<in Int>>>; upper: Out<In<Inv<Any?>>>; substitution: Out<In<Inv<in Int>>>
out Int. lower: Out<In<Inv<out Any?>>>; upper: Out<In<Inv<in Int>>>; substitution: Out<In<Inv<in Int>>>
Inv<out In<Out<in T>>>
compiler error
In<Out<Inv<in T>>>
in Int. lower: In<Out<Inv<in Int>>>; upper: In<Out<Inv<Any?>>>; substitution: In<Out<Inv<in Int>>>
out Int. lower: In<Out<Inv<out Any?>>>; upper: In<Out<Inv<in Int>>>; substitution: In<Out<Inv<in Int>>>
Inv<out Inv<Inv<out Inv<in in T>>>>
compiler error
Inv<in Out<In<Inv<in in T>>>>
compiler error
Inv<in In<Inv<out Inv<in in T>>>>
compiler error
Inv<In<In<Inv<in in T>>>>
compiler error
Inv<out Inv<out Inv<out Inv<in T>>>>
in Int. lower: Inv<out Inv<out Inv<out Inv<Any?>>>>; upper: Inv<out Inv<out Inv<out Inv<in Int>>>>; substitution: Inv<out Inv<out Inv<out Inv<in Int>>>>
out Int. lower: Inv<out Inv<out Inv<out Inv<in Int>>>>; upper: Inv<out Inv<out Inv<out Inv<out Any?>>>>; substitution: Inv<out Inv<out Inv<out Inv<in Int>>>>
Inv<out Out<Inv<out Inv<in in T>>>>
compiler error
Out<Inv<out Inv<out In<in T>>>>
in Int. lower: Out<Inv<out Inv<out In<Any?>>>>; upper: Out<Inv<out Inv<out In<Int>>>>; substitution: Out<Inv<out Inv<out In<Int>>>>
out Int. lower: Out<Inv<out Inv<out In<Int>>>>; upper: Out<Inv<out Inv<out In<Nothing>>>>; substitution: Out<Inv<out Inv<out In<out Any?>>>>
In<Inv<in In<Inv<in in T>>>>
compiler error
Out<Inv<in In<Inv<in T>>>>
in Int. lower: Out<Inv<in In<Inv<Any?>>>>; upper: Out<Inv<in In<Inv<in Int>>>>; substitution: Out<Inv<in In<Inv<in Int>>>>
out Int. lower: Out<Inv<in In<Inv<in Int>>>>; upper: Out<Inv<in In<Inv<out Any?>>>>; substitution: Out<Inv<in In<Inv<in Int>>>>
Out<Inv<in Inv<in Inv<in T>>>>
in Int. lower: Out<Inv<in Inv<in Inv<Any?>>>>; upper: Out<Inv<in Inv<in Inv<in Int>>>>; substitution: Out<Inv<in Inv<in Inv<in Int>>>>
out Int. lower: Out<Inv<in Inv<in Inv<in Int>>>>; upper: Out<Inv<in Inv<in Inv<out Any?>>>>; substitution: Out<Inv<in Inv<in Inv<in Int>>>>
In<In<Inv<In<In<in T>>>>>
in Int. lower: In<In<Nothing>>; upper: In<In<Inv<out In<In<Any?>>>>>; substitution: In<In<Inv<In<In<Int>>>>>
out Int. lower: In<In<Nothing>>; upper: In<In<Inv<out In<In<Int>>>>>; substitution: In<In<Inv<In<In<out Any?>>>>>
Inv<Inv<Inv<Out<Inv<in in T>>>>>
compiler error
Out<Inv<Out<Out<Inv<out in T>>>>>
compiler error
Inv<In<Inv<in In<Inv<out in T>>>>>
compiler error
Inv<in Inv<out In<Out<Inv<out in T>>>>>
compiler error
Inv<out Out<Inv<in Inv<in Inv<in in T>>>>>
compiler error
Out<Out<Inv<Out<Inv<out in T>>>>>
compiler error
In<Inv<In<In<Inv<out in T>>>>>
compiler error
Inv<out Inv<in Inv<Inv<out Inv<out in T>>>>>
compiler error
In<Inv<in In<In<Inv<out in T>>>>>
compiler error
In<Inv<Out<In<Inv<Inv<in T>>>>>>
in Int. lower: In<Inv<out Out<In<Nothing>>>>; upper: In<Nothing>; substitution: In<Inv<Out<In<Inv<Inv<in Int>>>>>>
out Int. lower: In<Inv<out Out<In<Nothing>>>>; upper: In<Nothing>; substitution: In<Inv<Out<In<Inv<Inv<in Int>>>>>>
Out<Inv<Inv<out Inv<Inv<in In<in T>>>>>>
in Int. lower: Out<Nothing>; upper: Out<Inv<out Inv<out Inv<out Inv<in In<Any?>>>>>>; substitution: Out<Inv<Inv<out Inv<Inv<in In<Int>>>>>>
out Int. lower: Out<Nothing>; upper: Out<Inv<out Inv<out Inv<out Inv<in In<Int>>>>>>; substitution: Out<Inv<Inv<out Inv<Inv<in In<out Any?>>>>>>
Inv<Out<In<In<Inv<in In<in T>>>>>>
in Int. lower: Nothing; upper: Inv<out Out<In<In<Inv<in In<Any?>>>>>>; substitution: Inv<Out<In<In<Inv<in In<Int>>>>>>
out Int. lower: Nothing; upper: Inv<out Out<In<In<Inv<in In<Int>>>>>>; substitution: Inv<Out<In<In<Inv<in In<out Any?>>>>>>
Inv<In<Inv<Inv<in Inv<out Inv<out in T>>>>>>
compiler error
In<Inv<out Inv<in Inv<Inv<in Inv<out in T>>>>>>
compiler error
In<Inv<Inv<out Inv<out In<In<in T>>>>>>
in Int. lower: In<Inv<out Inv<out Inv<out In<In<Any?>>>>>>; upper: In<Nothing>; substitution: In<Inv<Inv<out Inv<out In<In<Int>>>>>>
out Int. lower: In<Inv<out Inv<out Inv<out In<In<Int>>>>>>; upper: In<Nothing>; substitution: In<Inv<Inv<out Inv<out In<In<out Any?>>>>>>
Out<In<Inv<Out<Inv<Out<in T>>>>>>
compiler error
Inv<out Inv<Inv<in Out<Inv<out Inv<in in T>>>>>>
compiler error
Out<Inv<in Inv<Out<Inv<Out<in T>>>>>>
compiler error
Inv<Inv<in Inv<in In<In<Out<in T>>>>>>
compiler error
@@ -0,0 +1,236 @@
In<out T?>
compiler error
Out<out T?>
in Int. lower: Out<Int?>; upper: Out<Any?>; substitution: Out<Any?>
out Int. lower: Out<Nothing?>; upper: Out<Int?>; substitution: Out<Int?>
Inv<out T?>
in Int. lower: Inv<out Int?>; upper: Inv<out Any?>; substitution: Inv<out Int?>
out Int. lower: Inv<out Nothing?>; upper: Inv<out Int?>; substitution: Inv<out Int?>
Inv<in out T?>
compiler error
Inv<out out T?>
compiler error
In<In<out T?>>
compiler error
In<Out<out T?>>
in Int. lower: In<Out<Any?>>; upper: In<Out<Int?>>; substitution: In<Out<Any?>>
out Int. lower: In<Out<Int?>>; upper: In<Out<Nothing?>>; substitution: In<Out<Int?>>
In<Inv<out T?>>
in Int. lower: In<Inv<out Any?>>; upper: In<Inv<out Int?>>; substitution: In<Inv<out Int?>>
out Int. lower: In<Inv<out Int?>>; upper: In<Inv<out Nothing?>>; substitution: In<Inv<out Int?>>
In<Inv<in out T?>>
compiler error
In<Inv<out out T?>>
compiler error
Out<In<out T?>>
compiler error
Out<Out<out T?>>
in Int. lower: Out<Out<Int?>>; upper: Out<Out<Any?>>; substitution: Out<Out<Any?>>
out Int. lower: Out<Out<Nothing?>>; upper: Out<Out<Int?>>; substitution: Out<Out<Int?>>
Out<Inv<out T?>>
in Int. lower: Out<Inv<out Int?>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<out Int?>>
out Int. lower: Out<Inv<out Nothing?>>; upper: Out<Inv<out Int?>>; substitution: Out<Inv<out Int?>>
Out<Inv<in out T?>>
compiler error
Out<Inv<out out T?>>
compiler error
Inv<In<out T?>>
compiler error
Inv<Out<out T?>>
in Int. lower: Nothing; upper: Inv<out Out<Any?>>; substitution: Inv<Out<Any?>>
out Int. lower: Nothing; upper: Inv<out Out<Int?>>; substitution: Inv<Out<Int?>>
Inv<Inv<out T?>>
in Int. lower: Nothing; upper: Inv<out Inv<out Any?>>; substitution: Inv<Inv<out Int?>>
out Int. lower: Nothing; upper: Inv<out Inv<out Int?>>; substitution: Inv<Inv<out Int?>>
Inv<Inv<in out T?>>
compiler error
Inv<Inv<out out T?>>
compiler error
Inv<in In<out T?>>
compiler error
Inv<in Out<out T?>>
in Int. lower: Inv<in Out<Any?>>; upper: Inv<in Out<Int?>>; substitution: Inv<in Out<Any?>>
out Int. lower: Inv<in Out<Int?>>; upper: Inv<in Out<Nothing?>>; substitution: Inv<in Out<Int?>>
Inv<in Inv<out T?>>
in Int. lower: Inv<in Inv<out Any?>>; upper: Inv<in Inv<out Int?>>; substitution: Inv<in Inv<out Int?>>
out Int. lower: Inv<in Inv<out Int?>>; upper: Inv<in Inv<out Nothing?>>; substitution: Inv<in Inv<out Int?>>
Inv<in Inv<in out T?>>
compiler error
Inv<in Inv<out out T?>>
compiler error
Inv<out In<out T?>>
compiler error
Inv<out Out<out T?>>
in Int. lower: Inv<out Out<Int?>>; upper: Inv<out Out<Any?>>; substitution: Inv<out Out<Any?>>
out Int. lower: Inv<out Out<Nothing?>>; upper: Inv<out Out<Int?>>; substitution: Inv<out Out<Int?>>
Inv<out Inv<out T?>>
in Int. lower: Inv<out Inv<out Int?>>; upper: Inv<out Inv<out Any?>>; substitution: Inv<out Inv<out Int?>>
out Int. lower: Inv<out Inv<out Nothing?>>; upper: Inv<out Inv<out Int?>>; substitution: Inv<out Inv<out Int?>>
Inv<out Inv<in out T?>>
compiler error
Inv<out Inv<out out T?>>
compiler error
In<Inv<Out<out T?>>>
in Int. lower: In<Inv<out Out<Any?>>>; upper: In<Nothing>; substitution: In<Inv<Out<Any?>>>
out Int. lower: In<Inv<out Out<Int?>>>; upper: In<Nothing>; substitution: In<Inv<Out<Int?>>>
Out<Out<Out<out T?>>>
in Int. lower: Out<Out<Out<Int?>>>; upper: Out<Out<Out<Any?>>>; substitution: Out<Out<Out<Any?>>>
out Int. lower: Out<Out<Out<Nothing?>>>; upper: Out<Out<Out<Int?>>>; substitution: Out<Out<Out<Int?>>>
Inv<Inv<in In<out T?>>>
compiler error
Inv<out Inv<Out<out T?>>>
in Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Out<Any?>>>; substitution: Inv<out Inv<Out<Any?>>>
out Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Out<Int?>>>; substitution: Inv<out Inv<Out<Int?>>>
Inv<in Inv<Inv<out T?>>>
in Int. lower: Inv<in Inv<out Inv<out Any?>>>; upper: Inv<out Any?>; substitution: Inv<in Inv<Inv<out Int?>>>
out Int. lower: Inv<in Inv<out Inv<out Int?>>>; upper: Inv<out Any?>; substitution: Inv<in Inv<Inv<out Int?>>>
Out<Inv<In<out T?>>>
compiler error
Inv<out Out<Out<out T?>>>
in Int. lower: Inv<out Out<Out<Int?>>>; upper: Inv<out Out<Out<Any?>>>; substitution: Inv<out Out<Out<Any?>>>
out Int. lower: Inv<out Out<Out<Nothing?>>>; upper: Inv<out Out<Out<Int?>>>; substitution: Inv<out Out<Out<Int?>>>
Out<In<Inv<out T?>>>
in Int. lower: Out<In<Inv<out Any?>>>; upper: Out<In<Inv<out Int?>>>; substitution: Out<In<Inv<out Int?>>>
out Int. lower: Out<In<Inv<out Int?>>>; upper: Out<In<Inv<out Nothing?>>>; substitution: Out<In<Inv<out Int?>>>
Inv<out In<Out<out T?>>>
in Int. lower: Inv<out In<Out<Any?>>>; upper: Inv<out In<Out<Int?>>>; substitution: Inv<out In<Out<Any?>>>
out Int. lower: Inv<out In<Out<Int?>>>; upper: Inv<out In<Out<Nothing?>>>; substitution: Inv<out In<Out<Int?>>>
In<Out<Inv<out T?>>>
in Int. lower: In<Out<Inv<out Any?>>>; upper: In<Out<Inv<out Int?>>>; substitution: In<Out<Inv<out Int?>>>
out Int. lower: In<Out<Inv<out Int?>>>; upper: In<Out<Inv<out Nothing?>>>; substitution: In<Out<Inv<out Int?>>>
Inv<out Inv<Inv<out Inv<in out T?>>>>
compiler error
Inv<in Out<In<Inv<in out T?>>>>
compiler error
Inv<in In<Inv<out Inv<in out T?>>>>
compiler error
Inv<In<In<Inv<in out T?>>>>
compiler error
Inv<out Inv<out Inv<out Inv<out T?>>>>
in Int. lower: Inv<out Inv<out Inv<out Inv<out Int?>>>>; upper: Inv<out Inv<out Inv<out Inv<out Any?>>>>; substitution: Inv<out Inv<out Inv<out Inv<out Int?>>>>
out Int. lower: Inv<out Inv<out Inv<out Inv<out Nothing?>>>>; upper: Inv<out Inv<out Inv<out Inv<out Int?>>>>; substitution: Inv<out Inv<out Inv<out Inv<out Int?>>>>
Inv<out Out<Inv<out Inv<in out T?>>>>
compiler error
Out<Inv<out Inv<out In<out T?>>>>
compiler error
In<Inv<in In<Inv<in out T?>>>>
compiler error
Out<Inv<in In<Inv<out T?>>>>
in Int. lower: Out<Inv<in In<Inv<out Int?>>>>; upper: Out<Inv<in In<Inv<out Any?>>>>; substitution: Out<Inv<in In<Inv<out Int?>>>>
out Int. lower: Out<Inv<in In<Inv<out Nothing?>>>>; upper: Out<Inv<in In<Inv<out Int?>>>>; substitution: Out<Inv<in In<Inv<out Int?>>>>
Out<Inv<in Inv<in Inv<out T?>>>>
in Int. lower: Out<Inv<in Inv<in Inv<out Int?>>>>; upper: Out<Inv<in Inv<in Inv<out Any?>>>>; substitution: Out<Inv<in Inv<in Inv<out Int?>>>>
out Int. lower: Out<Inv<in Inv<in Inv<out Nothing?>>>>; upper: Out<Inv<in Inv<in Inv<out Int?>>>>; substitution: Out<Inv<in Inv<in Inv<out Int?>>>>
In<In<Inv<In<In<out T?>>>>>
compiler error
Inv<Inv<Inv<Out<Inv<in out T?>>>>>
compiler error
Out<Inv<Out<Out<Inv<out out T?>>>>>
compiler error
Inv<In<Inv<in In<Inv<out out T?>>>>>
compiler error
Inv<in Inv<out In<Out<Inv<out out T?>>>>>
compiler error
Inv<out Out<Inv<in Inv<in Inv<in out T?>>>>>
compiler error
Out<Out<Inv<Out<Inv<out out T?>>>>>
compiler error
In<Inv<In<In<Inv<out out T?>>>>>
compiler error
Inv<out Inv<in Inv<Inv<out Inv<out out T?>>>>>
compiler error
In<Inv<in In<In<Inv<out out T?>>>>>
compiler error
In<Inv<Out<In<Inv<Inv<out T?>>>>>>
in Int. lower: In<Inv<out Out<In<Nothing>>>>; upper: In<Nothing>; substitution: In<Inv<Out<In<Inv<Inv<out Int?>>>>>>
out Int. lower: In<Inv<out Out<In<Nothing>>>>; upper: In<Nothing>; substitution: In<Inv<Out<In<Inv<Inv<out Int?>>>>>>
Out<Inv<Inv<out Inv<Inv<in In<out T?>>>>>>
compiler error
Inv<Out<In<In<Inv<in In<out T?>>>>>>
compiler error
Inv<In<Inv<Inv<in Inv<out Inv<out out T?>>>>>>
compiler error
In<Inv<out Inv<in Inv<Inv<in Inv<out out T?>>>>>>
compiler error
In<Inv<Inv<out Inv<out In<In<out T?>>>>>>
compiler error
Out<In<Inv<Out<Inv<Out<out T?>>>>>>
in Int. lower: Out<In<Inv<out Out<Inv<out Out<Any?>>>>>>; upper: Out<In<Nothing>>; substitution: Out<In<Inv<Out<Inv<Out<Any?>>>>>>
out Int. lower: Out<In<Inv<out Out<Inv<out Out<Int?>>>>>>; upper: Out<In<Nothing>>; substitution: Out<In<Inv<Out<Inv<Out<Int?>>>>>>
Inv<out Inv<Inv<in Out<Inv<out Inv<in out T?>>>>>>
compiler error
Out<Inv<in Inv<Out<Inv<Out<out T?>>>>>>
in Int. lower: Out<Inv<in Inv<out Out<Inv<out Out<Any?>>>>>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<in Inv<Out<Inv<Out<Any?>>>>>>
out Int. lower: Out<Inv<in Inv<out Out<Inv<out Out<Int?>>>>>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<in Inv<Out<Inv<Out<Int?>>>>>>
Inv<Inv<in Inv<in In<In<Out<out T?>>>>>>
in Int. lower: Nothing; upper: Inv<out Inv<in Inv<in In<In<Out<Any?>>>>>>; substitution: Inv<Inv<in Inv<in In<In<Out<Any?>>>>>>
out Int. lower: Nothing; upper: Inv<out Inv<in Inv<in In<In<Out<Int?>>>>>>; substitution: Inv<Inv<in Inv<in In<In<Out<Int?>>>>>>
@@ -0,0 +1,236 @@
In<out T>
compiler error
Out<out T>
in Int. lower: Out<Int>; upper: Out<Any?>; substitution: Out<Any?>
out Int. lower: Out<Nothing>; upper: Out<Int>; substitution: Out<Int>
Inv<out T>
in Int. lower: Inv<out Int>; upper: Inv<out Any?>; substitution: Inv<out Int>
out Int. lower: Inv<Nothing>; upper: Inv<out Int>; substitution: Inv<out Int>
Inv<in out T>
compiler error
Inv<out out T>
compiler error
In<In<out T>>
compiler error
In<Out<out T>>
in Int. lower: In<Out<Any?>>; upper: In<Out<Int>>; substitution: In<Out<Any?>>
out Int. lower: In<Out<Int>>; upper: In<Out<Nothing>>; substitution: In<Out<Int>>
In<Inv<out T>>
in Int. lower: In<Inv<out Any?>>; upper: In<Inv<out Int>>; substitution: In<Inv<out Int>>
out Int. lower: In<Inv<out Int>>; upper: In<Inv<Nothing>>; substitution: In<Inv<out Int>>
In<Inv<in out T>>
compiler error
In<Inv<out out T>>
compiler error
Out<In<out T>>
compiler error
Out<Out<out T>>
in Int. lower: Out<Out<Int>>; upper: Out<Out<Any?>>; substitution: Out<Out<Any?>>
out Int. lower: Out<Out<Nothing>>; upper: Out<Out<Int>>; substitution: Out<Out<Int>>
Out<Inv<out T>>
in Int. lower: Out<Inv<out Int>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<out Int>>
out Int. lower: Out<Inv<Nothing>>; upper: Out<Inv<out Int>>; substitution: Out<Inv<out Int>>
Out<Inv<in out T>>
compiler error
Out<Inv<out out T>>
compiler error
Inv<In<out T>>
compiler error
Inv<Out<out T>>
in Int. lower: Nothing; upper: Inv<out Out<Any?>>; substitution: Inv<Out<Any?>>
out Int. lower: Nothing; upper: Inv<out Out<Int>>; substitution: Inv<Out<Int>>
Inv<Inv<out T>>
in Int. lower: Nothing; upper: Inv<out Inv<out Any?>>; substitution: Inv<Inv<out Int>>
out Int. lower: Nothing; upper: Inv<out Inv<out Int>>; substitution: Inv<Inv<out Int>>
Inv<Inv<in out T>>
compiler error
Inv<Inv<out out T>>
compiler error
Inv<in In<out T>>
compiler error
Inv<in Out<out T>>
in Int. lower: Inv<in Out<Any?>>; upper: Inv<in Out<Int>>; substitution: Inv<in Out<Any?>>
out Int. lower: Inv<in Out<Int>>; upper: Inv<in Out<Nothing>>; substitution: Inv<in Out<Int>>
Inv<in Inv<out T>>
in Int. lower: Inv<in Inv<out Any?>>; upper: Inv<in Inv<out Int>>; substitution: Inv<in Inv<out Int>>
out Int. lower: Inv<in Inv<out Int>>; upper: Inv<in Inv<Nothing>>; substitution: Inv<in Inv<out Int>>
Inv<in Inv<in out T>>
compiler error
Inv<in Inv<out out T>>
compiler error
Inv<out In<out T>>
compiler error
Inv<out Out<out T>>
in Int. lower: Inv<out Out<Int>>; upper: Inv<out Out<Any?>>; substitution: Inv<out Out<Any?>>
out Int. lower: Inv<out Out<Nothing>>; upper: Inv<out Out<Int>>; substitution: Inv<out Out<Int>>
Inv<out Inv<out T>>
in Int. lower: Inv<out Inv<out Int>>; upper: Inv<out Inv<out Any?>>; substitution: Inv<out Inv<out Int>>
out Int. lower: Inv<out Inv<Nothing>>; upper: Inv<out Inv<out Int>>; substitution: Inv<out Inv<out Int>>
Inv<out Inv<in out T>>
compiler error
Inv<out Inv<out out T>>
compiler error
In<Inv<Out<out T>>>
in Int. lower: In<Inv<out Out<Any?>>>; upper: In<Nothing>; substitution: In<Inv<Out<Any?>>>
out Int. lower: In<Inv<out Out<Int>>>; upper: In<Nothing>; substitution: In<Inv<Out<Int>>>
Out<Out<Out<out T>>>
in Int. lower: Out<Out<Out<Int>>>; upper: Out<Out<Out<Any?>>>; substitution: Out<Out<Out<Any?>>>
out Int. lower: Out<Out<Out<Nothing>>>; upper: Out<Out<Out<Int>>>; substitution: Out<Out<Out<Int>>>
Inv<Inv<in In<out T>>>
compiler error
Inv<out Inv<Out<out T>>>
in Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Out<Any?>>>; substitution: Inv<out Inv<Out<Any?>>>
out Int. lower: Inv<Nothing>; upper: Inv<out Inv<out Out<Int>>>; substitution: Inv<out Inv<Out<Int>>>
Inv<in Inv<Inv<out T>>>
in Int. lower: Inv<in Inv<out Inv<out Any?>>>; upper: Inv<out Any?>; substitution: Inv<in Inv<Inv<out Int>>>
out Int. lower: Inv<in Inv<out Inv<out Int>>>; upper: Inv<out Any?>; substitution: Inv<in Inv<Inv<out Int>>>
Out<Inv<In<out T>>>
compiler error
Inv<out Out<Out<out T>>>
in Int. lower: Inv<out Out<Out<Int>>>; upper: Inv<out Out<Out<Any?>>>; substitution: Inv<out Out<Out<Any?>>>
out Int. lower: Inv<out Out<Out<Nothing>>>; upper: Inv<out Out<Out<Int>>>; substitution: Inv<out Out<Out<Int>>>
Out<In<Inv<out T>>>
in Int. lower: Out<In<Inv<out Any?>>>; upper: Out<In<Inv<out Int>>>; substitution: Out<In<Inv<out Int>>>
out Int. lower: Out<In<Inv<out Int>>>; upper: Out<In<Inv<Nothing>>>; substitution: Out<In<Inv<out Int>>>
Inv<out In<Out<out T>>>
in Int. lower: Inv<out In<Out<Any?>>>; upper: Inv<out In<Out<Int>>>; substitution: Inv<out In<Out<Any?>>>
out Int. lower: Inv<out In<Out<Int>>>; upper: Inv<out In<Out<Nothing>>>; substitution: Inv<out In<Out<Int>>>
In<Out<Inv<out T>>>
in Int. lower: In<Out<Inv<out Any?>>>; upper: In<Out<Inv<out Int>>>; substitution: In<Out<Inv<out Int>>>
out Int. lower: In<Out<Inv<out Int>>>; upper: In<Out<Inv<Nothing>>>; substitution: In<Out<Inv<out Int>>>
Inv<out Inv<Inv<out Inv<in out T>>>>
compiler error
Inv<in Out<In<Inv<in out T>>>>
compiler error
Inv<in In<Inv<out Inv<in out T>>>>
compiler error
Inv<In<In<Inv<in out T>>>>
compiler error
Inv<out Inv<out Inv<out Inv<out T>>>>
in Int. lower: Inv<out Inv<out Inv<out Inv<out Int>>>>; upper: Inv<out Inv<out Inv<out Inv<out Any?>>>>; substitution: Inv<out Inv<out Inv<out Inv<out Int>>>>
out Int. lower: Inv<out Inv<out Inv<out Inv<Nothing>>>>; upper: Inv<out Inv<out Inv<out Inv<out Int>>>>; substitution: Inv<out Inv<out Inv<out Inv<out Int>>>>
Inv<out Out<Inv<out Inv<in out T>>>>
compiler error
Out<Inv<out Inv<out In<out T>>>>
compiler error
In<Inv<in In<Inv<in out T>>>>
compiler error
Out<Inv<in In<Inv<out T>>>>
in Int. lower: Out<Inv<in In<Inv<out Int>>>>; upper: Out<Inv<in In<Inv<out Any?>>>>; substitution: Out<Inv<in In<Inv<out Int>>>>
out Int. lower: Out<Inv<in In<Inv<Nothing>>>>; upper: Out<Inv<in In<Inv<out Int>>>>; substitution: Out<Inv<in In<Inv<out Int>>>>
Out<Inv<in Inv<in Inv<out T>>>>
in Int. lower: Out<Inv<in Inv<in Inv<out Int>>>>; upper: Out<Inv<in Inv<in Inv<out Any?>>>>; substitution: Out<Inv<in Inv<in Inv<out Int>>>>
out Int. lower: Out<Inv<in Inv<in Inv<Nothing>>>>; upper: Out<Inv<in Inv<in Inv<out Int>>>>; substitution: Out<Inv<in Inv<in Inv<out Int>>>>
In<In<Inv<In<In<out T>>>>>
compiler error
Inv<Inv<Inv<Out<Inv<in out T>>>>>
compiler error
Out<Inv<Out<Out<Inv<out out T>>>>>
compiler error
Inv<In<Inv<in In<Inv<out out T>>>>>
compiler error
Inv<in Inv<out In<Out<Inv<out out T>>>>>
compiler error
Inv<out Out<Inv<in Inv<in Inv<in out T>>>>>
compiler error
Out<Out<Inv<Out<Inv<out out T>>>>>
compiler error
In<Inv<In<In<Inv<out out T>>>>>
compiler error
Inv<out Inv<in Inv<Inv<out Inv<out out T>>>>>
compiler error
In<Inv<in In<In<Inv<out out T>>>>>
compiler error
In<Inv<Out<In<Inv<Inv<out T>>>>>>
in Int. lower: In<Inv<out Out<In<Nothing>>>>; upper: In<Nothing>; substitution: In<Inv<Out<In<Inv<Inv<out Int>>>>>>
out Int. lower: In<Inv<out Out<In<Nothing>>>>; upper: In<Nothing>; substitution: In<Inv<Out<In<Inv<Inv<out Int>>>>>>
Out<Inv<Inv<out Inv<Inv<in In<out T>>>>>>
compiler error
Inv<Out<In<In<Inv<in In<out T>>>>>>
compiler error
Inv<In<Inv<Inv<in Inv<out Inv<out out T>>>>>>
compiler error
In<Inv<out Inv<in Inv<Inv<in Inv<out out T>>>>>>
compiler error
In<Inv<Inv<out Inv<out In<In<out T>>>>>>
compiler error
Out<In<Inv<Out<Inv<Out<out T>>>>>>
in Int. lower: Out<In<Inv<out Out<Inv<out Out<Any?>>>>>>; upper: Out<In<Nothing>>; substitution: Out<In<Inv<Out<Inv<Out<Any?>>>>>>
out Int. lower: Out<In<Inv<out Out<Inv<out Out<Int>>>>>>; upper: Out<In<Nothing>>; substitution: Out<In<Inv<Out<Inv<Out<Int>>>>>>
Inv<out Inv<Inv<in Out<Inv<out Inv<in out T>>>>>>
compiler error
Out<Inv<in Inv<Out<Inv<Out<out T>>>>>>
in Int. lower: Out<Inv<in Inv<out Out<Inv<out Out<Any?>>>>>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<in Inv<Out<Inv<Out<Any?>>>>>>
out Int. lower: Out<Inv<in Inv<out Out<Inv<out Out<Int>>>>>>; upper: Out<Inv<out Any?>>; substitution: Out<Inv<in Inv<Out<Inv<Out<Int>>>>>>
Inv<Inv<in Inv<in In<In<Out<out T>>>>>>
in Int. lower: Nothing; upper: Inv<out Inv<in Inv<in In<In<Out<Any?>>>>>>; substitution: Inv<Inv<in Inv<in In<In<Out<Any?>>>>>>
out Int. lower: Nothing; upper: Inv<out Inv<in Inv<in In<In<Out<Int>>>>>>; substitution: Inv<Inv<in Inv<in In<In<Out<Int>>>>>>
@@ -1,11 +0,0 @@
class Inv<T>
fun foo<T>(a: Inv<in T>) {}
// T captures 'in Int'
// lower: Inv<Any?>
// upper: Inv<in Int>
// T captures 'out Int'
// lower: Inv<in Int>
// upper: Inv<out Any?>
@@ -1,11 +0,0 @@
class Inv<T>
fun foo<T>(a: Inv<out T>) {}
// T captures 'in Int'
// lower: Inv<out Int>
// upper: Inv<out Any?>
// T captures 'out Int'
// lower: Inv<Nothing>
// upper: Inv<out Int>
@@ -1,75 +0,0 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.resolve.typeApproximation
import org.jetbrains.jet.JetLiteFixture
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment
import org.jetbrains.jet.ConfigurationKind
import java.io.File
import org.jetbrains.jet.lang.resolve.lazy.JvmResolveUtil
import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
import org.jetbrains.jet.lang.types.TypeSubstitutor
import org.jetbrains.jet.lang.types.TypeProjectionImpl
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
import org.jetbrains.jet.lang.types.Variance
import org.jetbrains.jet.lang.types.typesApproximation.approximateCapturedTypes
import org.jetbrains.jet.JetTestUtils
import org.jetbrains.jet.lang.psi.JetPsiFactory
import org.jetbrains.jet.lang.resolve.calls.inference.CapturedTypeConstructor
import org.jetbrains.jet.lang.types.JetTypeImpl
import org.jetbrains.jet.lang.resolve.calls.inference.createCapturedType
abstract public class AbstractCapturedTypeApproximationTest() : JetLiteFixture() {
override fun createEnvironment(): JetCoreEnvironment = createEnvironmentWithMockJdk(ConfigurationKind.ALL)
public fun doTest(filePath: String) {
val file = File(filePath)
val text = JetTestUtils.doLoadFile(file)!!
val jetFile = JetPsiFactory(getProject()).createFile(text)
val bindingContext = JvmResolveUtil.analyzeOneFileWithJavaIntegration(jetFile).bindingContext
val functions = bindingContext.getSliceContents(BindingContext.FUNCTION)
val functionFoo = functions.values().firstOrNull { it.getName().asString() == "foo" } ?:
throw AssertionError("Function 'foo' is not declared")
val typeParameter = functionFoo.getTypeParameters().first()
val parameter = functionFoo.getValueParameters().first().getType()
val result = StringBuilder {
val endIndex = text.indexOf("// T captures")
appendln(if (endIndex == -1) text else text.substring(0, endIndex).trimTrailing())
for (variance in listOf(Variance.IN_VARIANCE, Variance.OUT_VARIANCE)) {
val captured = createCapturedType(TypeProjectionImpl(variance, KotlinBuiltIns.getInstance().getIntType()))
val typeSubstitutor = TypeSubstitutor.create(mapOf(typeParameter.getTypeConstructor() to TypeProjectionImpl(captured)))
val typeWithCapturedType = typeSubstitutor.substituteWithoutApproximation(
TypeProjectionImpl(Variance.INVARIANT, parameter))!!.getType()
val (lower, upper) = approximateCapturedTypes(typeWithCapturedType)
appendln()
appendln("// T captures '${(captured.getConstructor() as CapturedTypeConstructor).typeProjection}'")
appendln("// lower: $lower")
appendln("// upper: $upper")
}
}.toString()
JetTestUtils.assertEqualsToFile(file, result)
}
}
@@ -0,0 +1,199 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.resolve.typeApproximation
import org.jetbrains.jet.JetLiteFixture
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment
import org.jetbrains.jet.ConfigurationKind
import java.io.File
import org.jetbrains.jet.lang.resolve.lazy.JvmResolveUtil
import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lang.types.TypeSubstitutor
import org.jetbrains.jet.lang.types.TypeProjectionImpl
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
import org.jetbrains.jet.lang.types.Variance
import org.jetbrains.jet.lang.types.Variance.*
import org.jetbrains.jet.lang.types.typesApproximation.approximateCapturedTypes
import org.jetbrains.jet.JetTestUtils
import org.jetbrains.jet.lang.psi.JetPsiFactory
import org.jetbrains.jet.lang.resolve.calls.inference.CapturedTypeConstructor
import org.jetbrains.jet.lang.resolve.calls.inference.createCapturedType
import org.jetbrains.jet.lang.diagnostics.Severity
import org.jetbrains.jet.lang.types.typesApproximation.approximateCapturedTypesIfNecessary
import java.util.ArrayList
import org.jetbrains.jet.lang.types.TypeProjection
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor
public class CapturedTypeApproximationTest() : JetLiteFixture() {
override fun getTestDataPath() = "compiler/testData/capturedTypeApproximation/"
override fun createEnvironment(): JetCoreEnvironment = createEnvironmentWithMockJdk(ConfigurationKind.JDK_ONLY)
public fun doTest(filePath: String, vararg substitutions: String) {
assert(substitutions.size() in 1..2, "Captured type approximation test requires substitutions for (T) or (T, R)")
val oneTypeVariable = substitutions.size() == 1
val declarationsText = JetTestUtils.doLoadFile(File(getTestDataPath() + "/declarations.kt"))
fun analyzeTestFile(testType: String) = run {
val test = declarationsText.replace("#TestType#", testType)
val testFile = JetPsiFactory(getProject()).createFile(test)
val bindingContext = JvmResolveUtil.analyzeOneFileWithJavaIntegration(testFile).bindingContext
val functions = bindingContext.getSliceContents(BindingContext.FUNCTION)
val functionFoo = functions.values().firstOrNull { it.getName().asString() == "foo" } ?:
throw AssertionError("Function 'foo' is not declared")
Pair(bindingContext, functionFoo)
}
fun createTestType(testTypeWithT: String): String {
val testType = testTypeWithT.replace("#T#", substitutions[0])
if (oneTypeVariable) return testType
return testType.replace("#R#", substitutions[1])
}
fun createTestSubstitutions(typeParameters: List<TypeParameterDescriptor>) = run {
val intType = KotlinBuiltIns.getInstance().getIntType()
val stringType = KotlinBuiltIns.getInstance().getStringType()
val t = typeParameters[0]
val r = typeParameters[1]
if (oneTypeVariable)
listOf(mapOf(t to TypeProjectionImpl(IN_VARIANCE, intType)),
mapOf(t to TypeProjectionImpl(OUT_VARIANCE, intType)))
else {
listOf(mapOf(
t to TypeProjectionImpl(IN_VARIANCE, intType),
r to TypeProjectionImpl(OUT_VARIANCE, stringType))
)
}
}
fun createTestSubstitutor(testSubstitution: Map<TypeParameterDescriptor, TypeProjection>): TypeSubstitutor {
val substitutionContext = testSubstitution.map {
val (typeParameter, typeProjection) = it
typeParameter.getTypeConstructor() to TypeProjectionImpl(createCapturedType(typeProjection))
}.toMap()
return TypeSubstitutor.create(substitutionContext)
}
val testTypes = if (oneTypeVariable) getTestTypesForOneTypeVariable() else getTestTypesForTwoTypeVariables()
val result = StringBuilder {
for ((index, testTypeWithUnsubstitutedTypeVars) in testTypes.withIndex()) {
val testType = createTestType(testTypeWithUnsubstitutedTypeVars)
val (bindingContext, functionFoo) = analyzeTestFile(testType)
val typeParameters = functionFoo.getTypeParameters()
val type = functionFoo.getReturnType()
appendln(testType)
if (bindingContext.getDiagnostics().any { it.getSeverity() == Severity.ERROR }) {
appendln(" compiler error\n")
continue
}
val testSubstitutions = createTestSubstitutions(typeParameters)
for (testSubstitution in testSubstitutions) {
val typeSubstitutor = createTestSubstitutor(testSubstitution)
val typeWithCapturedType = typeSubstitutor.substituteWithoutApproximation(TypeProjectionImpl(INVARIANT, type))!!.getType()
val (lower, upper) = approximateCapturedTypes(typeWithCapturedType)
val substitution = approximateCapturedTypesIfNecessary(TypeProjectionImpl(INVARIANT, typeWithCapturedType))
append(" ")
for (typeParameter in testSubstitution.keySet()) {
if (testSubstitution.size() > 1) append("${typeParameter.getName()} = ")
append("${testSubstitution[typeParameter]}. ")
}
appendln("lower: $lower; upper: $upper; substitution: $substitution")
}
if (testTypes.lastIndex != index) appendln()
}
}
JetTestUtils.assertEqualsToFile(File(getTestDataPath() + "/" + filePath), result.toString())
}
private fun getTypePatternsForOneTypeVariable() = listOf("In<#T#>", "Out<#T#>", "Inv<#T#>", "Inv<in #T#>", "Inv<out #T#>")
private fun getTypePatternsForTwoTypeVariables() = listOf("Fun<#T#, #R#>", "Inv2<#T#, #R#>")
private fun getTestTypesForOneTypeVariable(): List<String> {
val typePatterns = getTypePatternsForOneTypeVariable()
val range = typePatterns.size().indices
val variants = ArrayList<List<Int>>()
for (i in range) variants.add(listOf(i))
for (i in range) for (j in range) variants.add(listOf(i, j))
fun addRandomVariants(vararg randomVariants: String) {
variants.addAll(randomVariants.map { digits -> digits.map { digit -> digit - '0' } })
}
assert (typePatterns.size() == 5, "Generated random variants below depend on size 5")
//From 021 the following is generated: In<Inv<Out<T>>>, where In = typePatterns[0], Inv = typePatterns[2], Out = typePatterns[1]
addRandomVariants("021", "111", "230", "421", "322", "120", "411", "102", "401", "012")
addRandomVariants("4243", "3103", "3043", "2003", "4442", "4143", "1440", "0303", "1302", "1332")
addRandomVariants("00200", "22213", "12114", "20304", "34014", "41333", "11214", "02004", "43244", "03004")
addRandomVariants("021022", "124230", "210030", "202344", "043234", "024400", "102121", "423143", "132121", "233001")
return variants.map { it.fold("#T#") {(type, index) -> type.replace("#T#", typePatterns[index]) } }
}
private fun getTestTypesForTwoTypeVariables(): List<String> {
val typePatterns = getTypePatternsForOneTypeVariable()
val range = typePatterns.size().indices
val result = ArrayList<String>()
for (pattern in getTypePatternsForTwoTypeVariables()) {
for (i in range) {
result.add(typePatterns[i].replace("#T#", pattern))
}
for (i in range) {
for (j in range) {
result.add(pattern.replace("#T#", typePatterns[i]).replace("#R#", typePatterns[j].replace("#T#", "#R#")))
}
}
}
return result
}
public fun testSimpleT() {
doTest("simpleT.txt", "T");
}
public fun testNullableT() {
doTest("nullableT.txt", "T?")
}
public fun testUseSiteInT() {
doTest("useSiteInT.txt", "in T");
}
public fun testUseSiteInNullableT() {
doTest("useSiteInNullableT.txt", "in T?");
}
public fun testUseSiteOutT() {
doTest("useSiteOutT.txt", "out T");
}
public fun testUseSiteOutNullableT() {
doTest("useSiteOutNullableT.txt", "out T?");
}
public fun testTwoVariables() {
doTest("twoVariables.txt", "T", "R")
}
}
@@ -1,92 +0,0 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.resolve.typeApproximation;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.jet.JUnit3RunnerWithInners;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.test.InnerTestClasses;
import org.jetbrains.jet.test.TestMetadata;
import org.junit.runner.RunWith;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("compiler/testData/capturedTypeApproximation")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public class CapturedTypeApproximationTestGenerated extends AbstractCapturedTypeApproximationTest {
public void testAllFilesPresentInCapturedTypeApproximation() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/capturedTypeApproximation"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("contravariant.kt")
public void testContravariant() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/contravariant.kt");
doTest(fileName);
}
@TestMetadata("covariant.kt")
public void testCovariant() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/covariant.kt");
doTest(fileName);
}
@TestMetadata("invariant.kt")
public void testInvariant() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/invariant.kt");
doTest(fileName);
}
@TestMetadata("nestedCov.kt")
public void testNestedCov() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/nestedCov.kt");
doTest(fileName);
}
@TestMetadata("nestedInv.kt")
public void testNestedInv() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/nestedInv.kt");
doTest(fileName);
}
@TestMetadata("nestedInvLevel2.kt")
public void testNestedInvLevel2() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/nestedInvLevel2.kt");
doTest(fileName);
}
@TestMetadata("nullableTypeVariable.kt")
public void testNullableTypeVariable() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/nullableTypeVariable.kt");
doTest(fileName);
}
@TestMetadata("useSiteVarianceIn.kt")
public void testUseSiteVarianceIn() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/useSiteVarianceIn.kt");
doTest(fileName);
}
@TestMetadata("useSiteVarianceOut.kt")
public void testUseSiteVarianceOut() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/useSiteVarianceOut.kt");
doTest(fileName);
}
}
@@ -51,17 +51,15 @@ private val NULLABLE_ANY = KotlinBuiltIns.getInstance().getNullableAnyType()
private val NOTHING = KotlinBuiltIns.getInstance().getNothingType()
private val NULLABLE_NOTHING = KotlinBuiltIns.getInstance().getNullableNothingType()
private fun TypeArgument.toTypeProjection(): TypeProjection {
assert(isConsistent) { "Only consistent enhanced type propection can be converted to type projection" }
fun removeProjectionIfRedundant(variance: Variance) = if (variance == typeParameter.getVariance()) Variance.INVARIANT else variance
return when {
inProjection == outProjection -> TypeProjectionImpl(inProjection)
(inProjection == NOTHING || inProjection == NULLABLE_NOTHING) && typeParameter.getVariance() != Variance.IN_VARIANCE ->
inProjection == NOTHING && typeParameter.getVariance() != Variance.IN_VARIANCE ->
TypeProjectionImpl(removeProjectionIfRedundant(Variance.OUT_VARIANCE), outProjection)
outProjection == NULLABLE_ANY -> TypeProjectionImpl(removeProjectionIfRedundant(Variance.IN_VARIANCE), inProjection)
else -> throw AssertionError("Enhanced type projection can't be converted to type projection: $this")
else -> TypeProjectionImpl(removeProjectionIfRedundant(Variance.OUT_VARIANCE), outProjection)
}
}
@@ -116,7 +116,6 @@ import org.jetbrains.jet.lang.resolve.java.AbstractJavaTypeSubstitutorTest
import org.jetbrains.jet.plugin.intentions.declarations.AbstractJoinLinesTest
import org.jetbrains.jet.codegen.AbstractScriptCodegenTest
import org.jetbrains.jet.plugin.parameterInfo.AbstractFunctionParameterInfoTest
import org.jetbrains.jet.resolve.typeApproximation.AbstractCapturedTypeApproximationTest
import org.jetbrains.jet.psi.patternMatching.AbstractJetPsiUnifierTest
import org.jetbrains.jet.completion.weighers.AbstractBasicCompletionWeigherTest
import org.jetbrains.jet.completion.weighers.AbstractSmartCompletionWeigherTest
@@ -172,10 +171,6 @@ fun main(args: Array<String>) {
model("constraintSystem", extension = "bounds")
}
testClass(javaClass<AbstractCapturedTypeApproximationTest>()) {
model("capturedTypeApproximation")
}
testClass(javaClass<AbstractJetParsingTest>()) {
model("psi", testMethod = "doParsingTest", pattern = "^(.*)\\.kts?$")
model("parseCodeFragment/expression", testMethod = "doExpressionCodeFragmentParsingTest", extension = "kt")