88@_silgen_name ( " external_symbol " )
99func external_symbol( )
1010
11+ public protocol P {
12+ static func foo( )
13+ }
14+
1115public class C < T> {
1216 deinit {
1317 external_symbol ( )
@@ -66,6 +70,31 @@ public struct OuterNC_2<T> : ~Copyable {
6670 public let i : InnerDeinitingDestructableNC < T >
6771}
6872
73+ public struct GenericContext_1 < T> {
74+ }
75+
76+ extension GenericContext_1 : P where T : P {
77+ public static func foo( ) {
78+ T . foo ( )
79+ }
80+ public struct OuterNC_1 : ~ Copyable {
81+ let i : Inner_NC1
82+
83+ func doit( ) {
84+ i. beinit ( )
85+ }
86+ }
87+
88+ public struct Inner_NC1 : ~ Copyable {
89+ let t : T
90+ let ptr : Int
91+ deinit {
92+ T . foo ( )
93+ }
94+ func beinit( ) { }
95+ }
96+ }
97+
6998// Destroyed value:
7099// - has deinit
71100// On lifetime end:
@@ -98,13 +127,9 @@ public func takeOuterDeinitingNC_1<T>(_ t: consuming OuterDeinitingNC_1<T>) {
98127// CHECK-SAME: ptr{{.*}} %0,
99128// CHECK-SAME: ptr %T)
100129// CHECK-SAME: {
101- // CHECK: [[RESPONSE:%[^,]+]] = call{{.*}} @"$s24moveonly_value_functions26InnerDeinitingReleasableNCVMa"(
102- // : i64 0,
103- // CHECK-SAME: ptr %T)
104- // CHECK: [[INNER_DEINITING_RELEASABLE_NC_METADATA:%[^,]+]] = extractvalue %swift.metadata_response [[RESPONSE]]
105130// CHECK: call{{.*}} @"$s24moveonly_value_functions9OuterNC_1VyxGlWOs"(
106131// CHECK-SAME: ptr %0,
107- // CHECK-SAME: ptr [[INNER_DEINITING_RELEASABLE_NC_METADATA]] )
132+ // CHECK-SAME: ptr %T )
108133// CHECK: }
109134
110135// Verify that the outlined release function takes the metadata for the
@@ -113,12 +138,16 @@ public func takeOuterDeinitingNC_1<T>(_ t: consuming OuterDeinitingNC_1<T>) {
113138// $s24moveonly_value_functions9OuterNC_1VyxGlWOs ---> outlined release of moveonly_value_functions.OuterNC_2<A>
114139// CHECK-LABEL: define{{.*}} @"$s24moveonly_value_functions9OuterNC_1VyxGlWOs"(
115140// CHECK-SAME: ptr %0,
116- // CHECK-SAME: ptr %"InnerDeinitingReleasableNC<T>" )
141+ // CHECK-SAME: ptr %T )
117142// CHECK-SAME: {
118143// ...
119144// ...
145+ // CHECK: [[RESPONSE:%[^,]+]] = call{{.*}} @"$s24moveonly_value_functions26InnerDeinitingReleasableNCVMa"(
146+ // : i64 0,
147+ // CHECK-SAME: ptr %T)
148+ // CHECK: [[INNER_DEINITING_RELEASABLE_NC_METADATA:%[^,]+]] = extractvalue %swift.metadata_response [[RESPONSE]]
120149// CHECK: call swiftcc void @"$s24moveonly_value_functions26InnerDeinitingReleasableNCVfD"(
121- // CHECK-SAME: ptr %"InnerDeinitingReleasableNC<T>" ,
150+ // CHECK-SAME: ptr [[INNER_DEINITING_RELEASABLE_NC_METADATA]] ,
122151// : ptr noalias nocapture swiftself dereferenceable(64) %deinit.arg)
123152// CHECK: }
124153public func takeOuterNC_1< T> ( _ o: consuming OuterNC_1 < T > ) {
@@ -137,15 +166,9 @@ public func takeOuterNC_1<T>(_ o: consuming OuterNC_1<T>) {
137166// CHECK-SAME: ptr{{.*}} %0,
138167// CHECK-SAME: ptr %T)
139168// CHECK-SAME: {
140- // CHECK: [[RESPONSE:%[^,]+]] = call{{.*}} @"$s24moveonly_value_functions28InnerDeinitingDestructableNCVMa"(
141- // CHECK-SAME: [[INT]] 0,
142- // CHECK-SAME: ptr %T)
143- // CHECK: [[INNER_DEINITING_DESTRUCTABLE_NC_METADATA:%[^,]+]] = extractvalue %swift.metadata_response [[RESPONSE]]
144169// CHECK: call{{.*}} @"$s24moveonly_value_functions9OuterNC_2VyxGlWOh"(
145170// CHECK-SAME: ptr %0,
146- // CHECK-SAME: ptr %T,
147- // CHECK-SAME: ptr [[INNER_DEINITING_DESTRUCTABLE_NC_METADATA]],
148- // : ptr %4)
171+ // CHECK-SAME: ptr %T)
149172// CHECK: }
150173
151174// Verify that the outlined destroy function takes the metadata for the
@@ -154,16 +177,44 @@ public func takeOuterNC_1<T>(_ o: consuming OuterNC_1<T>) {
154177// $s24moveonly_value_functions9OuterNC_2VyxGlWOh ---> outlined destroy of moveonly_value_functions.OuterNC_2<A>
155178// CHECK-LABEL: define{{.*}} @"$s24moveonly_value_functions9OuterNC_2VyxGlWOh"(
156179// CHECK-SAME: ptr %0,
157- // CHECK-SAME: ptr %T,
158- // CHECK-SAME: ptr %"InnerDeinitingDestructableNC<T>",
159- // CHECK-SAME: ptr %"OuterNC_2<T>")
180+ // CHECK-SAME: ptr %T)
160181// CHECK-SAME: {
161182// ...
162183// ...
184+ // CHECK: [[RESPONSE:%[^,]+]] = call{{.*}} @"$s24moveonly_value_functions28InnerDeinitingDestructableNCVMa"(
185+ // : [[INT]] 0,
186+ // CHECK-SAME: ptr %T)
187+ // CHECK: [[INNER_DEINITING_DESTRUCTABLE_NC_METADATA:%[^,]+]] = extractvalue %swift.metadata_response [[RESPONSE]]
163188// CHECK: call{{.*}} @"$s24moveonly_value_functions28InnerDeinitingDestructableNCVfD"(
164- // CHECK-SAME: ptr %"InnerDeinitingDestructableNC<T>" ,
189+ // CHECK-SAME: ptr [[INNER_DEINITING_DESTRUCTABLE_NC_METADATA]] ,
165190// : ptr noalias swiftself %3)
166191// CHECK: }
167192public func takeOuterNC_2< T> ( _ o: consuming OuterNC_2 < T > ) {
168193 external_symbol ( )
169194}
195+
196+ // CHECK-LABEL: define{{.*}} @"$s24moveonly_value_functions29takeGenericContext_1OuterNC_1yyAA0eF2_1VA2A1PRzlE0gH2_1Vyx_GnAaERzlF"(
197+ // CHECK-SAME: ptr noalias %0,
198+ // CHECK-SAME: ptr %T,
199+ // CHECK-SAME: ptr %T.P)
200+ // CHECK-SAME: {
201+ // CHECK: call ptr @"$s24moveonly_value_functions16GenericContext_1VA2A1PRzlE9OuterNC_1Vyx_GAaDRzlWOh"(
202+ // CHECK-SAME: ptr %0,
203+ // CHECK-SAME: ptr %T,
204+ // CHECK-SAME: ptr %T.P)
205+ // CHECK: }
206+ // CHECK-LABEL: define{{.*}} @"$s24moveonly_value_functions16GenericContext_1VA2A1PRzlE9OuterNC_1Vyx_GAaDRzlWOh"(
207+ // CHECK-SAME: ptr %0,
208+ // CHECK-SAME: ptr %T,
209+ // CHECK-SAME: ptr %T.P)
210+ // CHECK-SAME: {
211+ // CHECK: [[RESPONSE:%[^,]+]] = call{{.*}} @"$s24moveonly_value_functions16GenericContext_1VA2A1PRzlE9Inner_NC1VMa"(
212+ // : i64 0,
213+ // CHECK-SAME: ptr %T,
214+ // CHECK-SAME: ptr %T.P)
215+ // CHECK: [[GENERIC_CONTEXT_1_INNER_NC_1_METADATA:%[^,]+]] = extractvalue %swift.metadata_response [[RESPONSE]], 0
216+ // CHECK: call swiftcc void @"$s24moveonly_value_functions16GenericContext_1VA2A1PRzlE9Inner_NC1VfD"(
217+ // CHECK-SAME: ptr [[GENERIC_CONTEXT_1_INNER_NC_1_METADATA]],
218+ // CHECK-SAME: ptr noalias swiftself %0)
219+ // CHECK: }
220+ public func takeGenericContext_1OuterNC_1< T : P > ( _ e: consuming GenericContext_1 < T > . OuterNC_1 ) { }
0 commit comments