mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The type aliases for inferred type witnesses to the AsyncSequence and AsyncIteratorProtocol's Failure associated type are getting in the way of existing types with the same name. Therefore, when we create these type aliases, given them weird names (e.g., `__AsyncSequence.Failure`) and wire them up with `@_implements(<protocol>, Failure)` so that associated type inference will find them. This is probably a model we should move to in general, because it's odd that we inject new declarations into types that could cause conflicts. However, start by staging it in for just this one associated type where we have source-compatibility concerns, and we can expand it over time. Fixes rdar://124362873.
58 lines
2.1 KiB
Swift
58 lines
2.1 KiB
Swift
// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %s -module-name conformances
|
|
// RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -module-name conformances
|
|
// RUN: %FileCheck %s < %t.swiftinterface
|
|
|
|
// REQUIRES: concurrency, OS=macosx
|
|
|
|
// CHECK: @available(
|
|
// CHECK-NEXT: public struct SequenceAdapte
|
|
@available(SwiftStdlib 5.1, *)
|
|
public struct SequenceAdapter<Base: AsyncSequence>: AsyncSequence {
|
|
// CHECK-LABEL: public struct AsyncIterator
|
|
// CHECK: @available{{.*}}macOS 10.15
|
|
// CHECK-NEXT: public typealias Element = Base.Element
|
|
// CHECK: @available(
|
|
// CHECK: @_implements(_Concurrency.AsyncIteratorProtocol, Failure)
|
|
// CHECK-SAME: public typealias __AsyncIteratorProtocol_Failure = Base.Failure
|
|
public typealias Element = Base.Element
|
|
|
|
public struct AsyncIterator: AsyncIteratorProtocol {
|
|
public mutating func next() async rethrows -> Base.Element? { nil }
|
|
}
|
|
|
|
// CHECK-LABEL: public func makeAsyncIterator
|
|
public func makeAsyncIterator() -> AsyncIterator { AsyncIterator() }
|
|
|
|
// CHECK: @available(
|
|
// CHECK: @_implements(_Concurrency.AsyncSequence, Failure)
|
|
// CHECK-SAME: public typealias __AsyncSequence_Failure = Base.Failure
|
|
}
|
|
|
|
// CHECK: @available(
|
|
// CHECK-NEXT: public struct OtherSequenceAdapte
|
|
@available(SwiftStdlib 5.1, *)
|
|
public struct OtherSequenceAdapter<Base: AsyncSequence>: AsyncSequence {
|
|
// CHECK: public typealias Element = Base.Element
|
|
// CHECK-NOT: public typealias Failure
|
|
// CHECK: public struct Failure
|
|
|
|
// CHECK-LABEL: public struct AsyncIterator
|
|
// CHECK: @available{{.*}}macOS 10.15
|
|
// CHECK: @available(
|
|
// CHECK: @_implements(_Concurrency.AsyncIteratorProtocol, Failure)
|
|
// CHECK-SAME: public typealias __AsyncIteratorProtocol_Failure = Base.Failure
|
|
public typealias Element = Base.Element
|
|
|
|
public struct Failure: Error { }
|
|
|
|
// CHECK-NOT: public typealias Failure
|
|
public struct AsyncIterator: AsyncIteratorProtocol {
|
|
public mutating func next() async rethrows -> Base.Element? { nil }
|
|
}
|
|
|
|
// CHECK: public func makeAsyncIterator
|
|
public func makeAsyncIterator() -> AsyncIterator { AsyncIterator() }
|
|
|
|
// CHECK-NOT: public typealias Failure
|
|
}
|