Files
swift-mirror/test/ModuleInterface/async_sequence_conformance.swift
Doug Gregor b944be20dd Renamed type witnesses for the Async(Sequence|IteratorProtocol) Failure type
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.
2024-03-11 12:49:25 -07:00

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
}