blob: b5b2ff30b4f04075ad96759a0ed7aedda191a807 [file]
class Out<out T>
class X
// Why we want this to be translated to 'Out<Out<X>> f()' instead of 'Out<? extends Out<? extebds X>> f()'
// For return types default behaviour is skipping all declaration-site wildcards.
// The intuition behind this rule is simple: return types are basically used in subtype position
// (as an argument for another call), and here everything works well in case of 'out'-variance.
// For example we have 'Out<Out<T>>>' as subtype both for 'Out<Out<T>>>' and 'Out<? extends Out<? extends T>>>',
// so values of such type is more flexible in contrast to `Out<? extends Out<? extends T>>>` that could be used only
// for the second case.
fun f(): Out<Out<X>> = throw Exception()
// method: OutOfOutInOutPositionKt::f
// jvm signature: ()LOut;
// generic signature: ()LOut<LOut<LX;>;>;