// RUN: %target-run-simple-swift(-I %S/Inputs/ -Xfrontend -enable-experimental-cxx-interop -Xfrontend -validate-tbd-against-ir=none -Xfrontend -disable-llvm-verify -g) // // REQUIRES: executable_test // XFAIL: OS=windows-msvc // Temporarily disable when running with an older runtime (rdar://128681577) // UNSUPPORTED: use_os_stdlib // UNSUPPORTED: back_deployment_runtime import StdlibUnittest import WitnessTable public protocol ListNode { associatedtype Element func next() -> Element? } public struct List : Sequence, IteratorProtocol where NodeType.Element == NodeType { private var currentNode: NodeType? public init(startingAt start: NodeType?) { currentNode = start } public mutating func next() -> NodeType? { if let node = currentNode { currentNode = node.next() return node } return nil } } @available(SwiftStdlib 5.8, *) extension CxxLinkedList : ListNode { } @available(SwiftStdlib 5.8, *) extension MyCxxSequence : Sequence, IteratorProtocol { } class SwiftLinkedList: ListNode { typealias Element = Int func next() -> Int? { return nil } } if #available(SwiftStdlib 5.8, *) { var WitnessTableTestSuite = TestSuite("Use foreign reference in a generic context") WitnessTableTestSuite.test("As generic argument to List") { let first = makeLinkedList() let list = List(startingAt: first) var count = 0 for e in list { expectEqual(count, Int(e.value)) count += 1 } expectEqual(count, 4) } WitnessTableTestSuite.test("As a Sequence") { let list = makeSequence() var count = 0 for e in list { expectEqual(count, Int(e.value)) count += 1 } expectEqual(count, 3) } WitnessTableTestSuite.test("As an existential") { let existential: any ListNode = makeLinkedList() let cast: CxxLinkedList? = existential as? CxxLinkedList expectNotNil(cast) expectEqual(cast?.value, 0) expectEqual(cast?.next()?.value, 1) expectEqual(cast?.next()?.next()?.value, 2) let notACxxValue: any ListNode = SwiftLinkedList() let invalidCast = notACxxValue as? CxxLinkedList expectNil(invalidCast) } } runAllTests()