8
8
@_silgen_name ( " external_symbol " )
9
9
func external_symbol( )
10
10
11
+ public protocol P {
12
+ static func foo( )
13
+ }
14
+
11
15
public class C < T> {
12
16
deinit {
13
17
external_symbol ( )
@@ -66,6 +70,31 @@ public struct OuterNC_2<T> : ~Copyable {
66
70
public let i : InnerDeinitingDestructableNC < T >
67
71
}
68
72
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
+
69
98
// Destroyed value:
70
99
// - has deinit
71
100
// On lifetime end:
@@ -98,13 +127,9 @@ public func takeOuterDeinitingNC_1<T>(_ t: consuming OuterDeinitingNC_1<T>) {
98
127
// CHECK-SAME: ptr{{.*}} %0,
99
128
// CHECK-SAME: ptr %T)
100
129
// 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]]
105
130
// CHECK: call{{.*}} @"$s24moveonly_value_functions9OuterNC_1VyxGlWOs"(
106
131
// CHECK-SAME: ptr %0,
107
- // CHECK-SAME: ptr [[INNER_DEINITING_RELEASABLE_NC_METADATA]] )
132
+ // CHECK-SAME: ptr %T )
108
133
// CHECK: }
109
134
110
135
// 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>) {
113
138
// $s24moveonly_value_functions9OuterNC_1VyxGlWOs ---> outlined release of moveonly_value_functions.OuterNC_2<A>
114
139
// CHECK-LABEL: define{{.*}} @"$s24moveonly_value_functions9OuterNC_1VyxGlWOs"(
115
140
// CHECK-SAME: ptr %0,
116
- // CHECK-SAME: ptr %"InnerDeinitingReleasableNC<T>" )
141
+ // CHECK-SAME: ptr %T )
117
142
// CHECK-SAME: {
118
143
// ...
119
144
// ...
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]]
120
149
// CHECK: call swiftcc void @"$s24moveonly_value_functions26InnerDeinitingReleasableNCVfD"(
121
- // CHECK-SAME: ptr %"InnerDeinitingReleasableNC<T>" ,
150
+ // CHECK-SAME: ptr [[INNER_DEINITING_RELEASABLE_NC_METADATA]] ,
122
151
// : ptr noalias nocapture swiftself dereferenceable(64) %deinit.arg)
123
152
// CHECK: }
124
153
public func takeOuterNC_1< T> ( _ o: consuming OuterNC_1 < T > ) {
@@ -137,15 +166,9 @@ public func takeOuterNC_1<T>(_ o: consuming OuterNC_1<T>) {
137
166
// CHECK-SAME: ptr{{.*}} %0,
138
167
// CHECK-SAME: ptr %T)
139
168
// 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]]
144
169
// CHECK: call{{.*}} @"$s24moveonly_value_functions9OuterNC_2VyxGlWOh"(
145
170
// 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)
149
172
// CHECK: }
150
173
151
174
// 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>) {
154
177
// $s24moveonly_value_functions9OuterNC_2VyxGlWOh ---> outlined destroy of moveonly_value_functions.OuterNC_2<A>
155
178
// CHECK-LABEL: define{{.*}} @"$s24moveonly_value_functions9OuterNC_2VyxGlWOh"(
156
179
// 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)
160
181
// CHECK-SAME: {
161
182
// ...
162
183
// ...
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]]
163
188
// CHECK: call{{.*}} @"$s24moveonly_value_functions28InnerDeinitingDestructableNCVfD"(
164
- // CHECK-SAME: ptr %"InnerDeinitingDestructableNC<T>" ,
189
+ // CHECK-SAME: ptr [[INNER_DEINITING_DESTRUCTABLE_NC_METADATA]] ,
165
190
// : ptr noalias swiftself %3)
166
191
// CHECK: }
167
192
public func takeOuterNC_2< T> ( _ o: consuming OuterNC_2 < T > ) {
168
193
external_symbol ( )
169
194
}
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