1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
// RUN: %target-swift-emit-silgen -module-name Swift -parse-stdlib -parse-as-library %s
// This files contains a minimal implementation for Swift to emit foreach loops
// for a type. It acts partially as a guide for users and since it is in the
// form of a test, it ensures that we will always be able to get this test
// through the type checker.
precedencegroup AssignmentPrecedence { assignment: true }
public protocol ExpressibleByNilLiteral {
init(nilLiteral: ())
}
protocol IteratorProtocol {
associatedtype Element
mutating func next() -> Element?
}
protocol Sequence {
associatedtype Element
associatedtype Iterator : IteratorProtocol where Iterator.Element == Element
func makeIterator() -> Iterator
}
enum Optional<T> {
case none
case some(T)
}
func _diagnoseUnexpectedNilOptional(_filenameStart: Builtin.RawPointer,
_filenameLength: Builtin.Word,
_filenameIsASCII: Builtin.Int1,
_line: Builtin.Word) {
// This would usually contain an assert, but we don't need one since we are
// just emitting SILGen.
}
extension Optional : ExpressibleByNilLiteral {
public init(nilLiteral: ()) {
self = .none
}
}
class FakeCollection<T> {
}
struct FakeCollectionIterator<T> {
weak var collection: FakeCollection<T>?
init(_ newCollection: FakeCollection<T>) {
collection = newCollection
}
}
extension FakeCollectionIterator : IteratorProtocol {
public typealias Element = T
public mutating func next() -> Element? {
return .none
}
}
extension FakeCollection : Sequence {
public typealias Element = T
public typealias Iterator = FakeCollectionIterator<T>
public func makeIterator() -> FakeCollectionIterator<T> {
return FakeCollectionIterator(self)
}
}
func useT<T>(_ t: T) {}
func iterateFakeCollection<T>(_ x: FakeCollection<T>) {
for y in x {
useT(y)
}
}
|