// RUN: %target-typecheck-verify-swift -target %target-swift-5.9-abi-triple /// Used to verify the type of an expression. Use like this: /// ``` /// var types = SwiftTypePair(typeOf: expr, type2: SwiftType.self) /// types.assertTypesAreEqual() /// ``` struct SwiftType {} struct SwiftTypePair { init(typeOf: T1, type2: SwiftType.Type) {} mutating func assertTypesAreEqual() where T1 == T2 {} } class ClassBase {} class ClassDerived: ClassBase {} protocol CovariantAssocTypeErasure { associatedtype A1 associatedtype A2: AnyObject associatedtype A3: CovariantAssocTypeErasure associatedtype A4: ClassBase associatedtype A5: ClassDerived associatedtype A6: CovariantAssocTypeErasure & ClassBase associatedtype A7: ClassDerived & CovariantAssocTypeErasure associatedtype B1 where B1 == Optional associatedtype B2 where B2 == (A2, Bool) associatedtype B3 where B3 == A3.Type associatedtype B4 where B4 == Array associatedtype B5 where B5 == Dictionary func method1() -> A1 func method2() -> A2 func method3() -> A3 func method4() -> A4 func method5() -> A5 func method6() -> A6 func method7() -> A7 func method8() -> B1 func method9() -> B2 func method10() -> B3 func method11() -> B4 func method12() -> B5 } protocol CovariantAssocTypeErasureDerived: CovariantAssocTypeErasure where A1: CovariantAssocTypeErasureDerived, A2: ClassBase, A3: CovariantAssocTypeErasureDerived, A4: CovariantAssocTypeErasureDerived, A5: CovariantAssocTypeErasureDerived, A6: CovariantAssocTypeErasureDerived, A7: Sequence {} do { let exist: any CovariantAssocTypeErasure do { var types = SwiftTypePair(typeOf: exist.method1(), type2: SwiftType.self) types.assertTypesAreEqual() } do { var types = SwiftTypePair(typeOf: exist.method2(), type2: SwiftType.self) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method3(), type2: SwiftType.self ) types.assertTypesAreEqual() } do { var types = SwiftTypePair(typeOf: exist.method4(), type2: SwiftType.self) types.assertTypesAreEqual() } do { var types = SwiftTypePair(typeOf: exist.method5(), type2: SwiftType.self) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method6(), type2: SwiftType.self ) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method7(), type2: SwiftType.self ) types.assertTypesAreEqual() } do { var types = SwiftTypePair(typeOf: exist.method8(), type2: SwiftType.self) types.assertTypesAreEqual() } do { var types = SwiftTypePair(typeOf: exist.method9(), type2: SwiftType<(AnyObject, Bool)>.self) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method10(), type2: SwiftType.self ) types.assertTypesAreEqual() } do { var types = SwiftTypePair(typeOf: exist.method11(), type2: SwiftType>.self) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method12(), type2: SwiftType>.self ) types.assertTypesAreEqual() } let _ = exist.method1() let _ = exist.method2() let _ = exist.method3() let _ = exist.method4() let _ = exist.method5() let _ = exist.method6() let _ = exist.method7() let _ = exist.method8() let _ = exist.method9() let _ = exist.method10() let _ = exist.method11() let _ = exist.method12() } do { let exist: any CovariantAssocTypeErasureDerived do { var types = SwiftTypePair( typeOf: exist.method1(), type2: SwiftType.self ) types.assertTypesAreEqual() } do { var types = SwiftTypePair(typeOf: exist.method2(), type2: SwiftType.self) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method3(), type2: SwiftType.self ) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method4(), type2: SwiftType.self ) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method5(), type2: SwiftType.self ) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method6(), type2: SwiftType.self ) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method7(), type2: SwiftType.self ) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method8(), type2: SwiftType<(any CovariantAssocTypeErasureDerived)?>.self ) types.assertTypesAreEqual() } do { var types = SwiftTypePair(typeOf: exist.method9(), type2: SwiftType<(ClassBase, Bool)>.self) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method10(), type2: SwiftType.self ) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method11(), type2: SwiftType>.self ) types.assertTypesAreEqual() } do { var types = SwiftTypePair( typeOf: exist.method12(), type2: SwiftType>.self ) types.assertTypesAreEqual() } }