Files
swift-mirror/test/ModuleInterface/invertible_constraints.swift
Nate Chandler ba467d2bd2 [Sema] Enable suppression of inferred conformances.
Add the machinery to support suppression of inference of conformance to
protocols that would otherwise be derived automatically.

This commit does not enable any conformances to be suppressed.
2024-04-15 16:46:22 -07:00

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> : ~Swift.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> : ~Swift.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 { }