@@ -177,15 +177,55 @@ fn resolve_associated_item<'tcx>(
177
177
178
178
Some ( ty:: Instance :: new ( leaf_def. item . def_id , substs) )
179
179
}
180
- traits:: ImplSource :: Generator ( generator_data) => Some ( Instance {
181
- def : ty:: InstanceDef :: Item ( generator_data. generator_def_id ) ,
182
- substs : generator_data. substs ,
183
- } ) ,
184
- traits:: ImplSource :: Future ( future_data) => Some ( Instance {
185
- def : ty:: InstanceDef :: Item ( future_data. generator_def_id ) ,
186
- substs : future_data. substs ,
187
- } ) ,
180
+ traits:: ImplSource :: Generator ( generator_data) => {
181
+ if cfg ! ( debug_assertions) && tcx. item_name ( trait_item_id) != sym:: resume {
182
+ // For compiler developers who'd like to add new items to `Generator`,
183
+ // you either need to generate a shim body, or perhaps return
184
+ // `InstanceDef::Item` pointing to a trait default method body if
185
+ // it is given a default implementation by the trait.
186
+ span_bug ! (
187
+ tcx. def_span( generator_data. generator_def_id) ,
188
+ "no definition for `{trait_ref}::{}` for built-in generator type" ,
189
+ tcx. item_name( trait_item_id)
190
+ )
191
+ }
192
+ Some ( Instance {
193
+ def : ty:: InstanceDef :: Item ( generator_data. generator_def_id ) ,
194
+ substs : generator_data. substs ,
195
+ } )
196
+ }
197
+ traits:: ImplSource :: Future ( future_data) => {
198
+ if cfg ! ( debug_assertions) && tcx. item_name ( trait_item_id) != sym:: poll {
199
+ // For compiler developers who'd like to add new items to `Future`,
200
+ // you either need to generate a shim body, or perhaps return
201
+ // `InstanceDef::Item` pointing to a trait default method body if
202
+ // it is given a default implementation by the trait.
203
+ span_bug ! (
204
+ tcx. def_span( future_data. generator_def_id) ,
205
+ "no definition for `{trait_ref}::{}` for built-in async generator type" ,
206
+ tcx. item_name( trait_item_id)
207
+ )
208
+ }
209
+ Some ( Instance {
210
+ def : ty:: InstanceDef :: Item ( future_data. generator_def_id ) ,
211
+ substs : future_data. substs ,
212
+ } )
213
+ }
188
214
traits:: ImplSource :: Closure ( closure_data) => {
215
+ if cfg ! ( debug_assertions)
216
+ && ![ sym:: call, sym:: call_mut, sym:: call_once]
217
+ . contains ( & tcx. item_name ( trait_item_id) )
218
+ {
219
+ // For compiler developers who'd like to add new items to `Fn`/`FnMut`/`FnOnce`,
220
+ // you either need to generate a shim body, or perhaps return
221
+ // `InstanceDef::Item` pointing to a trait default method body if
222
+ // it is given a default implementation by the trait.
223
+ span_bug ! (
224
+ tcx. def_span( closure_data. closure_def_id) ,
225
+ "no definition for `{trait_ref}::{}` for built-in closure type" ,
226
+ tcx. item_name( trait_item_id)
227
+ )
228
+ }
189
229
let trait_closure_kind = tcx. fn_trait_kind_from_def_id ( trait_id) . unwrap ( ) ;
190
230
Instance :: resolve_closure (
191
231
tcx,
@@ -195,11 +235,29 @@ fn resolve_associated_item<'tcx>(
195
235
)
196
236
}
197
237
traits:: ImplSource :: FnPointer ( ref data) => match data. fn_ty . kind ( ) {
198
- ty:: FnDef ( ..) | ty:: FnPtr ( ..) => Some ( Instance {
199
- def : ty:: InstanceDef :: FnPtrShim ( trait_item_id, data. fn_ty ) ,
200
- substs : rcvr_substs,
201
- } ) ,
202
- _ => None ,
238
+ ty:: FnDef ( ..) | ty:: FnPtr ( ..) => {
239
+ if cfg ! ( debug_assertions)
240
+ && ![ sym:: call, sym:: call_mut, sym:: call_once]
241
+ . contains ( & tcx. item_name ( trait_item_id) )
242
+ {
243
+ // For compiler developers who'd like to add new items to `Fn`/`FnMut`/`FnOnce`,
244
+ // you either need to generate a shim body, or perhaps return
245
+ // `InstanceDef::Item` pointing to a trait default method body if
246
+ // it is given a default implementation by the trait.
247
+ bug ! (
248
+ "no definition for `{trait_ref}::{}` for built-in fn type" ,
249
+ tcx. item_name( trait_item_id)
250
+ )
251
+ }
252
+ Some ( Instance {
253
+ def : ty:: InstanceDef :: FnPtrShim ( trait_item_id, data. fn_ty ) ,
254
+ substs : rcvr_substs,
255
+ } )
256
+ }
257
+ _ => bug ! (
258
+ "no built-in definition for `{trait_ref}::{}` for non-fn type" ,
259
+ tcx. item_name( trait_item_id)
260
+ ) ,
203
261
} ,
204
262
traits:: ImplSource :: Object ( ref data) => {
205
263
traits:: get_vtable_index_of_object_method ( tcx, data, trait_item_id) . map ( |index| {
0 commit comments