mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
The model for associated types hasn't been fully worked-out for noncopyable generics, but there is some support already that is being used by the stdlib for an internal-only (and rather cursed) protocol `_Pointer` to support `UnsafePointer`, etc. This patch gates the existing experimental support for associated types behind a feature flag. This flag doesn't emit feature-guards in interfaces, since support for it is tied closely to NoncopyableGenerics and has been there from its early days.
69 lines
1.9 KiB
Swift
69 lines
1.9 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %target-swift-emit-module-interface(%t.swiftinterface) %s -module-name Test -enable-experimental-feature NoncopyableGenerics -enable-experimental-feature SuppressedAssociatedTypes
|
|
// RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -module-name Test
|
|
// RUN: %FileCheck %s < %t.swiftinterface
|
|
|
|
// CHECK: #if compiler(>=5.3) && $NoncopyableGenerics
|
|
// CHECK: public protocol P : ~Copyable {
|
|
// CHECK: associatedtype A : ~Copyable
|
|
// CHECK: }
|
|
// CHECK: #else
|
|
// CHECK: public protocol P {
|
|
// CHECK: associatedtype A
|
|
// CHECK: }
|
|
// CHECK: #endif
|
|
public protocol P: ~Copyable {
|
|
associatedtype A: ~Copyable
|
|
}
|
|
|
|
// CHECK: #if compiler(>=5.3) && $NoncopyableGenerics
|
|
// CHECK: public struct X<T> : ~Copyable where T : ~Copyable {
|
|
// CHECK: }
|
|
// CHECK: #else
|
|
// CHECK: public struct X<T> {
|
|
// CHECK: }
|
|
// CHECK: #endif
|
|
public struct X<T: ~Copyable>: ~Copyable { }
|
|
|
|
// CHECK: #if compiler(>=5.3) && $NoncopyableGenerics
|
|
// CHECK: extension Test.X : Swift.Copyable {
|
|
// CHECK-NEXT: func f()
|
|
// CHECK: }
|
|
// CHECK: #else
|
|
// CHECK: extension Test.X {
|
|
// CHECK-NEXT: func f()
|
|
// CHECK: }
|
|
extension X: Copyable {
|
|
public func f() { }
|
|
}
|
|
|
|
// CHECK: #if compiler(>=5.3) && $NoncopyableGenerics
|
|
// CHECK: extension Test.X where T : ~Copyable {
|
|
// CHECK: public func g(other: borrowing T)
|
|
// CHECK: }
|
|
// CHECK: #else
|
|
// CHECK: extension Test.X {
|
|
// CHECK: public func g(other: borrowing T)
|
|
// CHECK: }
|
|
// CHECK: #endif
|
|
extension X where T: ~Copyable {
|
|
public func g(other: borrowing T) { }
|
|
}
|
|
|
|
// CHECK: #if compiler(>=5.3) && $NoncopyableGenerics
|
|
// CHECK: public enum Y<T> : ~Copyable where T : ~Copyable {
|
|
// CHECK: case none
|
|
// CHECK: case some(T)
|
|
// CHECK: }
|
|
// CHECK: #else
|
|
// CHECK: public enum Y<T> {
|
|
// CHECK: case none
|
|
// CHECK: case some(T)
|
|
// CHECK: }
|
|
public enum Y<T: ~Copyable>: ~Copyable {
|
|
case none
|
|
case some(T)
|
|
}
|
|
|
|
extension Y: Copyable where T: Copyable { }
|