// RUN: %empty-directory(%t) // RUN: %target-swift-frontend -swift-version 5 -enable-library-evolution -emit-module \ // RUN: -enable-experimental-feature SuppressedAssociatedTypes \ // RUN: -enable-experimental-feature LifetimeDependence \ // RUN: -enable-experimental-feature SE427NoInferenceOnExtension \ // 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 SuppressedAssociatedTypes \ // RUN: -enable-experimental-feature LifetimeDependence \ // RUN: -enable-experimental-feature SE427NoInferenceOnExtension \ // 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 SuppressedAssociatedTypes \ // RUN: -enable-experimental-feature LifetimeDependence \ // RUN: -enable-experimental-feature SE427NoInferenceOnExtension \ // RUN: %t/NoncopyableGenerics_Misc.swiftinterface -o %t/NoncopyableGenerics_Misc.swiftmodule // RUN: %target-swift-frontend -compile-module-from-interface \ // RUN: -enable-experimental-feature SuppressedAssociatedTypes \ // RUN: -enable-experimental-feature LifetimeDependence \ // RUN: -enable-experimental-feature SE427NoInferenceOnExtension \ // RUN: %t/Swiftskell.swiftinterface -o %t/Swiftskell.swiftmodule // RUN: %target-swift-frontend -emit-silgen -I %t %s \ // RUN: -enable-experimental-feature SuppressedAssociatedTypes \ // RUN: -enable-experimental-feature LifetimeDependence \ // RUN: -enable-experimental-feature SE427NoInferenceOnExtension \ // RUN: -o %t/final.silgen // RUN: %FileCheck %s --check-prefix=CHECK-SILGEN < %t/final.silgen // REQUIRES: swift_feature_LifetimeDependence // REQUIRES: swift_feature_SE427NoInferenceOnExtension // REQUIRES: swift_feature_SuppressedAssociatedTypes 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: public static func oneCopyable1(_ s: T, _ v: borrowing V) where T : {{.*}}._NoCopyP, V : ~Copyable // CHECK-MISC: public static func oneCopyable2(_ s: borrowing T, _ v: V) where T : {{.*}}._NoCopyP, T : ~Copyable // CHECK-MISC: 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: public static func basic_some_nc(_ s: borrowing some _NoCopyP & ~Copyable) // CHECK-MISC: 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: public static func opaqueNonEscapable(_ s: some _NoEscapableP & ~Escapable) // CHECK-MISC: public static func opaqueEscapable(_ s: some _NoEscapableP) // CHECK-MISC: public struct ExplicitHello : ~Swift.Copyable where T : ~Copyable { // CHECK-MISC: extension {{.*}}.ExplicitHello : Swift.Copyable where T : Swift.Copyable { // CHECK-MISC: public struct Hello : ~Swift.Copyable, ~Swift.Escapable where T : ~Copyable, T : ~Escapable { // CHECK-MISC: extension NoncopyableGenerics_Misc.Hello : Swift.Escapable where T : Swift.Escapable, T : ~Copyable { // CHECK-MISC-NEXT: } // CHECK-MISC: extension NoncopyableGenerics_Misc.Hello : Swift.Copyable where T : Swift.Copyable, T : ~Escapable { // CHECK-MISC-NEXT: } // CHECK-MISC: public protocol TestAssocTypes { // CHECK-MISC-NEXT: associatedtype A : {{.*}}._NoCopyP, ~Copyable // CHECK-MISC: public typealias SomeAlias = {{.*}}.Hello // CHECK-MISC: public typealias AliasWithInverse = {{.*}}.Hello where G : ~Copyable, G : ~Escapable // CHECK-MISC: 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: public struct Outer : ~Swift.Copyable where A : ~Copyable { // CHECK-MISC-NEXT: public func innerFn(_ b: borrowing B) where B : ~Copyable // CHECK-MISC: public struct InnerStruct : ~Swift.Copyable where C : ~Copyable { // CHECK-MISC-NEXT: public func g(_ d: borrowing D) where D : ~Copyable // CHECK-MISC: public struct InnerVariation1 : ~Swift.Copyable, ~Swift.Escapable where D : ~Copyable // CHECK-MISC: public struct InnerVariation2 : ~Swift.Copyable, ~Swift.Escapable where D : ~Escapable // CHECK-MISC: extension {{.*}}.Outer : Swift.Copyable where A : Swift.Copyable { // CHECK-MISC: extension {{.*}}.Outer.InnerStruct : Swift.Copyable where A : Swift.Copyable, C : Swift.Copyable { // CHECK-MISC: extension {{.*}}.Outer.InnerVariation1 : Swift.Copyable where A : Swift.Copyable, D : Swift.Copyable { // CHECK-MISC: extension {{.*}}.Outer.InnerVariation2 : Swift.Escapable where D : Swift.Escapable, A : ~Copyable { // CHECK-MISC: extension {{.*}}.Outer.InnerStruct { // CHECK-MISC-NEXT: #if compiler(>=5.3) && $NonescapableTypes // CHECK-MISC-NEXT: public func hello(_ t: T) where T : ~Escapable // CHECK-MISC-NEXT: #endif // CHECK-MISC: @_preInverseGenerics public func old_swap(_ a: inout T, _ b: inout T) where T : ~Copyable // CHECK-MISC: @_preInverseGenerics public func borrowsNoncopyable(_ t: borrowing T) where T : ~Copyable // CHECK-MISC: public func suppressesNoncopyableGenerics(_ t: borrowing T) where T : ~Copyable // CHECK-MISC: public struct LoudlyNC where T : ~Copyable { // CHECK-MISC-NEXT: } // CHECK-MISC-NEXT: public func _indexHumongousDonuts(_ aggregate: Swift.UnsafePointer, _ index: Swift.Int) -> T // CHECK-MISC-NEXT: public func referToLoud(_ t: {{.*}}.LoudlyNC) // CHECK-MISC-NEXT: public func referToLoudProperGuarding(_ t: {{.*}}.LoudlyNC) // CHECK-MISC-NEXT: public struct NoCopyPls : ~Swift.Copyable { // CHECK-MISC-NEXT: } // CHECK-MISC-NEXT: public func substCopyable(_ t: Swift.String?) // CHECK-MISC-NEXT: public func substGenericCopyable(_ t: T?) // NOTE: we really shouldn't be emitting the else branch for the two funcs // below, since the suppressed version isn't valid. We don't have a good way of // fixing that right now, either. // CHECK-MISC-NEXT: public func substNC(_ t: borrowing {{.*}}.NoCopyPls?) // CHECK-MISC-NEXT: public func substGenericNC(_ t: borrowing T?) where T : ~Copyable // CHECK-MISC: public protocol Publik : ~Copyable { // CHECK-MISC-NEXT: } // CHECK-MISC-NEXT: public struct Concrete : ~Copyable { // CHECK-MISC-NEXT: } // CHECK-MISC-NEXT: public struct Generic : ~Copyable where T : {{.*}}.Publik, T : ~Copyable { // CHECK-MISC-NEXT: } // CHECK-MISC-NEXT: public struct VeryNested : ~Copyable { // CHECK-MISC-NEXT: } // CHECK-MISC-NEXT: public struct Twice : ~Copyable, ~Copyable { // CHECK-MISC-NEXT: } // CHECK-MISC-NEXT: public struct RegularTwice : ~Swift.Copyable, ~Swift.Copyable { // CHECK-MISC-NEXT: } // CHECK-MISC-NEXT: public struct Continuation where E : Swift.Error, T : ~Copyable { // CHECK-MISC: @frozen public enum Moptional : ~Swift.Copyable, ~Swift.Escapable where Wrapped : ~Copyable, Wrapped : ~Escapable { // CHECK-MISC: extension {{.*}}.Moptional : Swift.Copyable where Wrapped : Swift.Copyable, Wrapped : ~Escapable { // CHECK-MISC: extension {{.*}}.Moptional : Swift.Escapable where Wrapped : Swift.Escapable, Wrapped : ~Copyable { // CHECK-MISC-NOT: ~ // NOTE: below are extensions emitted at the end of NoncopyableGenerics_Misc.swift // CHECK-MISC: extension {{.*}}.VeryNested : {{.*}}.Publik {} import Swiftskell // CHECK: public protocol Show : ~Copyable { // CHECK: public func print(_ s: borrowing some Show & ~Copyable) // CHECK: public protocol Eq : ~Copyable { // CHECK: extension Swiftskell.Eq where Self : ~Copyable { // CHECK: public enum Either : ~Swift.Copyable where Failure : Swift.Error, Success : ~Copyable { /// 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: public enum Pair : ~Swift.Copyable where L : ~Copyable, R : ~Copyable { // CHECK: extension Swiftskell.Pair : Swift.Copyable where L : Swift.Copyable, R : Swift.Copyable { // CHECK: public enum Maybe : ~Swift.Copyable where Wrapped : ~Copyable { // CHECK: extension Swiftskell.Maybe : Swift.Copyable where Wrapped : Swift.Copyable { // CHECK: extension Swiftskell.Maybe : Swiftskell.Show where Wrapped : Swiftskell.Show, Wrapped : ~Copyable { // CHECK: extension Swiftskell.Maybe : Swiftskell.Eq where Wrapped : Swiftskell.Eq, Wrapped : ~Copyable { // CHECK: public func isJust(_ m: borrowing Swiftskell.Maybe) -> Swift.Bool where A : ~Copyable 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) } }