// RUN: %target-run-simple-swift(-target %target-swift-5.9-abi-triple) // REQUIRES: executable_test // UNSUPPORTED: use_os_stdlib // UNSUPPORTED: back_deployment_runtime import StdlibUnittest var conformances = TestSuite("VariadicGenericConformances") protocol TypeMaker { func makeType() -> Any.Type } struct TupleMaker : TypeMaker { func makeType() -> Any.Type { return (repeat (each T)).self } } func makeTypeIndirectly(_ t: T) -> Any.Type { return t.makeType() } struct ElementTupleMaker : TypeMaker { func makeType() -> Any.Type { return (repeat (each T).Element).self } } conformances.test("makeTuple1") { expectEqual("()", _typeName(makeTypeIndirectly(TupleMaker< >()))) expectEqual("Swift.Int", _typeName(makeTypeIndirectly(TupleMaker()))) expectEqual("(Swift.Int, Swift.Bool)", _typeName(makeTypeIndirectly(TupleMaker()))) } conformances.test("makeTuple2") { expectEqual("()", _typeName(makeTypeIndirectly(ElementTupleMaker< >()))) expectEqual("Swift.Int", _typeName(makeTypeIndirectly(ElementTupleMaker>()))) expectEqual("(Swift.Int, Swift.Bool)", _typeName(makeTypeIndirectly(ElementTupleMaker, Set>()))) } protocol Q { associatedtype A func makeA() -> A } extension Q { func makeA() -> [Self] { return [self] } } extension String: Q {} extension Int: Q {} extension Bool: Q {} protocol HasPackRequirements { func doStuff1(_ value: repeat each T) -> (repeat (each T).A) func doStuff2(_ value: repeat each T) -> (repeat (each T).A) } extension HasPackRequirements { func doStuff1(_ value: repeat each T) -> (repeat (each T).A) { return (repeat (each value).makeA()) } } struct ConformsPackRequirements: HasPackRequirements { func doStuff2(_ value: repeat each T) -> (repeat (each T).A) { return (repeat (each value).makeA()) } } func testPackRequirements1(_ t: T, _ u: repeat each U) -> (repeat (each U).A) { return t.doStuff1(repeat each u) } func testPackRequirements2(_ t: T, _ u: repeat each U) -> (repeat (each U).A) { return t.doStuff2(repeat each u) } conformances.test("packRequirements") { expectEqual(([1], ["hi"], [false]), testPackRequirements1(ConformsPackRequirements(), 1, "hi", false)) expectEqual(([1], ["hi"], [false]), testPackRequirements2(ConformsPackRequirements(), 1, "hi", false)) } runAllTests()