protocol A { } protocol B: Self.X { associatedtype X: A } class C: A { } class D<Y: A>: A, B { typealias X = Y } extension String: A { } D<String>.self