// RUN: %empty-directory(%t) // RUN: %target-swift-frontend -swift-version 5 -enable-library-evolution -emit-module \ // RUN: -enable-experimental-feature NoncopyableGenerics \ // RUN: -enable-experimental-feature NonescapableTypes \ // RUN: -o %t/NoncopyableGenerics_Misc.swiftmodule \ // RUN: -emit-module-interface-path %t/NoncopyableGenerics_Misc.swiftinterface \ // RUN: %S/Inputs/NoncopyableGenerics_Misc.swift // RUN: %target-swift-frontend -swift-version 5 -enable-library-evolution -emit-module \ // RUN: -enable-experimental-feature NoncopyableGenerics \ // RUN: -enable-experimental-feature NonescapableTypes \ // RUN: -enable-experimental-feature BorrowingSwitch \ // RUN: -o %t/Swiftskell.swiftmodule \ // RUN: -emit-module-interface-path %t/Swiftskell.swiftinterface \ // RUN: %S/../Inputs/Swiftskell.swift // Check the interfaces // RUN: %FileCheck %s --check-prefix=CHECK-MISC < %t/NoncopyableGenerics_Misc.swiftinterface // RUN: %FileCheck %s < %t/Swiftskell.swiftinterface // See if we can compile a module through just the interface and typecheck using it. // RUN: %target-swift-frontend -compile-module-from-interface \ // RUN: -enable-experimental-feature NoncopyableGenerics \ // RUN: -enable-experimental-feature NonescapableTypes \ // RUN: %t/NoncopyableGenerics_Misc.swiftinterface -o %t/NoncopyableGenerics_Misc.swiftmodule // RUN: %target-swift-frontend -compile-module-from-interface \ // RUN: -enable-experimental-feature NoncopyableGenerics \ // RUN: -enable-experimental-feature NonescapableTypes \ // RUN: %t/Swiftskell.swiftinterface -o %t/Swiftskell.swiftmodule // RUN: %target-swift-frontend -emit-silgen -I %t %s \ // RUN: -enable-experimental-feature NoncopyableGenerics \ // RUN: -enable-experimental-feature NonescapableTypes \ // RUN: -o %t/final.silgen // RUN: %FileCheck %s --check-prefix=CHECK-SILGEN < %t/final.silgen import NoncopyableGenerics_Misc // CHECK-MISC: public struct _Toys { // CHECK-MISC: public struct rdar118697289_S1 { // CHECK-MISC: public struct rdar118697289_S2 { // CHECK-MISC: public static func allCopyable1(_ a: T, _ b: T) -> T // CHECK-MISC: public static func allCopyable2(_ s: T) where T : NoncopyableGenerics_Misc._NoCopyP // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: public static func oneCopyable1(_ s: T, _ v: borrowing V) where T : {{.*}}._NoCopyP, V : ~Copyable // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: public static func oneCopyable2(_ s: borrowing T, _ v: V) where T : {{.*}}._NoCopyP, T : ~Copyable // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: public static func oneCopyable3(_ s: borrowing T, _ v: V) where T : {{.*}}._NoCopyP, T : ~Copyable // CHECK-MISC: public static func basic_some(_ s: some _NoCopyP) // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: public static func basic_some_nc(_ s: borrowing some _NoCopyP & ~Copyable) // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: public static func oneEscapable(_ s: T, _ v: V) where T : NoncopyableGenerics_Misc._NoEscapableP, T : ~Escapable // CHECK-MISC: public static func canEscapeButConforms(_ t: T) where T : {{.*}}._NoEscapableP // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: public static func opaqueNonEscapable(_ s: some _NoEscapableP & ~Escapable) // CHECK-MISC: public static func opaqueEscapable(_ s: some _NoEscapableP) // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: public struct ExplicitHello : ~Copyable where T : ~Copyable { // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: extension {{.*}}.ExplicitHello : Swift.Copyable { // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: public struct Hello : ~Copyable, ~Escapable where T : ~Copyable, T : ~Escapable { // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: extension NoncopyableGenerics_Misc.Hello : Swift.Escapable where T : ~Copyable { // CHECK-MISC-NEXT: } // CHECK-MISC: #endif // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: extension NoncopyableGenerics_Misc.Hello : Swift.Copyable where T : ~Escapable { // CHECK-MISC-NEXT: } // CHECK-MISC: #endif // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: public protocol TestAssocTypes { // CHECK-MISC-NEXT: associatedtype A : {{.*}}._NoCopyP, ~Copyable // CHECK-MISC: public typealias SomeAlias = {{.*}}.Hello // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: public typealias AliasWithInverse = {{.*}}.Hello where G : ~Copyable, G : ~Escapable // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: public struct RudePointer : Swift.Copyable where T : ~Copyable { // CHECK-MISC: noInversesSTART // CHECK-MISC-NOT: ~ // CHECK-MISC: noInversesEND // CHECK-MISC: public func checkAnyInv1(_ t: borrowing Result) where Result : ~Copyable // CHECK-MISC: public func checkAnyInv2(_ t: borrowing Result) where Result : ~Copyable, Result : ~Escapable // CHECK-MISC: public func checkAnyObject(_ t: Result) where Result : AnyObject // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: public struct Outer : ~Copyable where A : ~Copyable { // CHECK-MISC-NEXT: public func innerFn(_ b: borrowing B) where B : ~Copyable // CHECK-MISC: public struct InnerStruct : ~Copyable where C : ~Copyable { // CHECK-MISC-NEXT: public func g(_ d: borrowing D) where D : ~Copyable // CHECK-MISC: public struct InnerVariation1 : ~Copyable, ~Escapable where D : ~Copyable // CHECK-MISC: public struct InnerVariation2 : ~Copyable, ~Escapable where D : ~Escapable // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: extension {{.*}}.Outer : Swift.Copyable { // CHECK-MISC: #endif // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: extension {{.*}}.Outer.InnerStruct : Swift.Copyable { // CHECK-MISC: #endif // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: extension {{.*}}.Outer.InnerVariation1 : Swift.Copyable { // CHECK-MISC: #endif // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: extension {{.*}}.Outer.InnerVariation2 : Swift.Escapable { // CHECK-MISC: #endif // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: extension {{.*}}.Outer.InnerStruct { // CHECK-MISC-NEXT: public func hello(_ t: T) where T : ~Escapable // CHECK-MISC: #endif // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: @_preInverseGenerics public func old_swap(_ a: inout T, _ b: inout T) where T : ~Copyable // CHECK-MISC-NEXT: #else // CHECK-MISC-NOT: @_preInverseGenerics // CHECK-MISC-NEXT: public func old_swap(_ a: inout T, _ b: inout T) // CHECK-MISC: #endif // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: @_preInverseGenerics public func borrowsNoncopyable(_ t: borrowing T) where T : ~Copyable // CHECK-MISC-NEXT: #else // CHECK-MISC-NOT: @_preInverseGenerics // CHECK-MISC-NEXT: public func borrowsNoncopyable(_ t: T) // CHECK-MISC-NEXT: #endif // CHECK-MISC: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-MISC-NEXT: public func suppressesNoncopyableGenerics(_ t: borrowing T) where T : ~Copyable // CHECK-MISC-NEXT: #endif import Swiftskell // CHECK: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-NEXT: public protocol Show : ~Copyable { // CHECK: #endif // CHECK: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-NEXT: public func print(_ s: borrowing some Show & ~Copyable) // CHECK: #endif // CHECK: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-NEXT: public protocol Eq : ~Copyable { // CHECK: #endif // CHECK: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-NEXT: extension Swiftskell.Eq where Self : ~Copyable { // CHECK: #endif // CHECK: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-NEXT: public enum Either : ~Copyable where Failure : Swift.Error, Success : ~Copyable { // CHECK: #endif /// This one is position dependent so we can ensure the associated type was printed correctly. // CHECK: public protocol Generator : ~Copyable { // CHECK-NEXT: associatedtype Element : ~Copyable // CHECK: #endif // CHECK: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-NEXT: public enum Pair : ~Copyable where L : ~Copyable, R : ~Copyable { // CHECK: #endif // CHECK: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-NEXT: public enum Maybe : ~Copyable where Value : ~Copyable { // CHECK: #endif // CHECK: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-NEXT: extension Swiftskell.Maybe : Swift.Copyable { // CHECK: #endif // CHECK: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-NEXT: extension Swiftskell.Maybe : Swiftskell.Show where Value : Swiftskell.Show, Value : ~Copyable { // CHECK: #endif // CHECK: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-NEXT: extension Swiftskell.Maybe : Swiftskell.Eq where Value : Swiftskell.Eq, Value : ~Copyable { // CHECK: #endif // CHECK: #if compiler(>=5.3) && $NoncopyableGenerics // CHECK-NEXT: public func isJust(_ m: borrowing Swiftskell.Maybe) -> Swift.Bool where A : ~Copyable // CHECK: #endif struct FileDescriptor: ~Copyable, Eq, Show { let id: Int func show() -> String { return "FileDescriptor(id:\(id))" } static func ==(_ a: borrowing Self, _ b: borrowing Self) -> Bool { return a.id == b.id } mutating func exchangeWith(_ other: inout Self) { // CHECK-SILGEN: function_ref @$s24NoncopyableGenerics_Misc8old_swapyyxz_xztlF old_swap(&self, &other) } }