@@ -115,6 +115,13 @@ class Outer<TOuter> {
115115 let d = p2 . 0 . getInner ( ) // $ target=Outer.Inner.getInner field=Tuple2.0 type=d:Int
116116 }
117117
118+ typealias Unbound = Holder . InnerAlias
119+
120+ func f4 ( x : Outer < String > . Unbound < Int > ) {
121+ let outer = x . getOuter ( ) // $ target=Outer.Inner.getOuter type=outer:String
122+ let inner = x . getInner ( ) // $ target=Outer.Inner.getInner type=inner:Int
123+ }
124+
118125 enum E { case empty }
119126}
120127
@@ -272,3 +279,31 @@ func f(_ x: G<String>.InnerAlias<Bool>) {
272279 let outer = x . getOuter ( ) // $ target=Outer.Inner.getOuter type=outer:String
273280 let inner = x . getInner ( ) // $ target=Outer.Inner.getInner type=inner:Bool
274281}
282+
283+ class Base2 < T > {
284+ struct Nested {
285+ var x : T
286+
287+ func getX ( ) -> T {
288+ return x // $ field=Base2.Nested.x
289+ }
290+ }
291+ }
292+ class Sub : Base2 < String > {
293+ typealias Element = Nested
294+
295+ typealias Element2 = Sub . Nested
296+ }
297+ class SubSub : Sub {
298+ func f (
299+ x1 : Sub . Element , // $ MISSING: type=x1@Base2.Nested<(parent:Nested)>:Sub
300+ x2 : Element , // $ type=x2@Base2.Nested<(parent:Nested)>:SubSub
301+ x3 : Element2 , // $ type=x3@Base2.Nested<(parent:Nested)>:Sub
302+ x4 : SubSub . Element2 // $ type=x4@Base2.Nested<(parent:Nested)>:Sub
303+ ) {
304+ let a = x1 . getX ( ) // $ target=Base2.Nested.getX $ MISSING: type=a:String -- this is an instance of variance sub typing
305+ let b = x2 . getX ( ) // $ target=Base2.Nested.getX $ MISSING: type=b:String -- this is an instance of variance sub typing
306+ let c = x3 . getX ( ) // $ target=Base2.Nested.getX $ MISSING: type=c:String -- this is an instance of variance sub typing
307+ let d = x4 . getX ( ) // $ target=Base2.Nested.getX $ MISSING: type=d:String -- this is an instance of variance sub typing
308+ }
309+ }
0 commit comments