1- // RUN: %target-swift-frontend -emit-silgen -enable-experimental-feature NoncopyableGenerics -disable-availability-checking -module-name main %s | %FileCheck %s
1+ // RUN: %target-swift-frontend -emit-silgen -enable-experimental-feature NoncopyableGenerics -enable-experimental-feature NonescapableTypes - disable-availability-checking -module-name main %s | %FileCheck %s
22
33protocol NoCopyP : ~ Copyable { }
44
@@ -24,7 +24,31 @@ enum CondCopyableEnum<T: ~Copyable>: ~Copyable {
2424
2525extension CondCopyableEnum : Copyable { }
2626
27- // MARK: ensure certain types are treated as trivial (no ownership in func signature).
27+ protocol NoEscapeP : ~ Escapable { }
28+
29+ struct NE: ~ Escapable { }
30+
31+ struct TooRudeStruct < T: ~ Escapable> : Escapable {
32+ let thing : Int
33+ }
34+
35+ enum TooRudeEnum < T: ~ Escapable> : Escapable {
36+ case holder( Int )
37+ case whatever
38+ }
39+
40+ struct CondEscapableStruct < T: ~ Escapable> : ~ Escapable { }
41+
42+ extension CondEscapableStruct : Escapable { }
43+
44+ enum CondEscapableEnum < T: ~ Escapable> : ~ Escapable {
45+ case some( T )
46+ case none
47+ }
48+
49+ extension CondEscapableEnum : Escapable { }
50+
51+ // MARK: ensure certain conditionally Copyable types are treated as trivial (no ownership in func signature).
2852
2953// CHECK: sil hidden [ossa] @$s4main5checkyyAA10RudeStructVySiGF : $@convention(thin) (RudeStruct<Int>) -> () {
3054func check( _ t: RudeStruct < Int > ) { }
@@ -68,18 +92,68 @@ func check(_ t: consuming any NoCopyP & ~Copyable) {}
6892// CHECK: sil hidden [ossa] @$s4main5checkyyAA7NoCopyP_pRi_s_XPzF : $@convention(thin) (@inout any NoCopyP & ~Copyable) -> () {
6993func check( _ t: inout any NoCopyP & ~ Copyable) { }
7094
71- struct MyStruct < T: ~ Copyable> : ~ Copyable {
95+ // MARK: ensure certain conditionally Escapable types are treated as trivial (no ownership in func signature).
96+
97+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA13TooRudeStructVySiGF : $@convention(thin) (TooRudeStruct<Int>) -> () {
98+ func check( _ t: TooRudeStruct < Int > ) { }
99+
100+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA13TooRudeStructVyAA2NEVGF : $@convention(thin) (TooRudeStruct<NE>) -> () {
101+ func check( _ t: TooRudeStruct < NE > ) { }
102+
103+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA11TooRudeEnumOySiGF : $@convention(thin) (TooRudeEnum<Int>) -> () {
104+ func check( _ t: TooRudeEnum < Int > ) { }
105+
106+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA11TooRudeEnumOyAA2NEVGF : $@convention(thin) (TooRudeEnum<NE>) -> () {
107+ func check( _ t: TooRudeEnum < NE > ) { }
108+
109+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA19CondEscapableStructVySiGF : $@convention(thin) (CondEscapableStruct<Int>) -> () {
110+ func check( _ t: CondEscapableStruct < Int > ) { }
111+
112+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA19CondEscapableStructVyAA2NEVGF : $@convention(thin) (@guaranteed CondEscapableStruct<NE>) -> () {
113+ func check( _ t: borrowing CondEscapableStruct < NE > ) { }
114+
115+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA17CondEscapableEnumOySiGF : $@convention(thin) (CondEscapableEnum<Int>) -> () {
116+ func check( _ t: CondEscapableEnum < Int > ) { }
117+
118+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA17CondEscapableEnumOyAA2NEVGF : $@convention(thin) (@guaranteed CondEscapableEnum<NE>) -> () {
119+ func check( _ t: borrowing CondEscapableEnum < NE > ) { }
120+
121+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA17CondEscapableEnumOyxGlF : $@convention(thin) <T> (@in_guaranteed CondEscapableEnum<T>) -> () {
122+ func check< T> ( _ t: CondEscapableEnum < T > ) { }
123+
124+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA17CondEscapableEnumOyxGRi0_zlF : $@convention(thin) <U where U : ~Escapable> (@in_guaranteed CondEscapableEnum<U>) -> () {
125+ func check< U: ~ Escapable> ( _ t: borrowing CondEscapableEnum < U > ) { }
126+
127+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA9NoEscapeP_pF : $@convention(thin) (@in_guaranteed any NoEscapeP) -> () {
128+ func check( _ t: any NoEscapeP ) { }
129+
130+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA9NoEscapeP_pRi0_s_XPF : $@convention(thin) (@in_guaranteed any NoEscapeP & ~Escapable) -> () {
131+ func check( _ t: borrowing any NoEscapeP & ~ Escapable) { }
132+
133+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA9NoEscapeP_pRi0_s_XPnF : $@convention(thin) (@in any NoEscapeP & ~Escapable) -> () {
134+ func check( _ t: consuming any NoEscapeP & ~ Escapable) { }
135+
136+ // CHECK: sil hidden [ossa] @$s4main5checkyyAA9NoEscapeP_pRi0_s_XPzF : $@convention(thin) (@inout any NoEscapeP & ~Escapable) -> () {
137+ func check( _ t: inout any NoEscapeP & ~ Escapable) { }
138+
139+ // MARK: conditionally Copyable & Escapable SILGen
140+
141+ struct MyStruct< T : ~ Copyable & ~ Escapable> : ~ Copyable & ~ Escapable {
72142 var x : T
73143}
74144
75- extension MyStruct : Copyable where T: Copyable { }
145+ extension MyStruct : Copyable where T: Copyable & ~ Escapable { }
76146
77- enum MyEnum < T: ~ Copyable> : ~ Copyable {
147+ extension MyStruct : Escapable where T: Escapable & ~ Copyable { }
148+
149+ enum MyEnum< T : ~ Copyable & ~ Escapable> : ~ Copyable & ~ Escapable {
78150 case x( T)
79151 case knoll
80152}
81153
82- extension MyEnum : Copyable where T: Copyable { }
154+ extension MyEnum : Copyable where T: Copyable & ~ Escapable { }
155+
156+ extension MyEnum : Escapable where T: Escapable & ~ Copyable { }
83157
84158enum Trivial {
85159 case a, b, c
0 commit comments