@@ -17,6 +17,7 @@ use rustc_middle::mir::interpret::{sign_extend, ConstValue, Scalar};
17
17
use rustc_middle:: ty:: subst:: { GenericArgKind , SubstsRef } ;
18
18
use rustc_middle:: ty:: { self , DefIdTree , Ty , TyCtxt } ;
19
19
use rustc_span:: symbol:: { kw, sym, Symbol } ;
20
+ use smallvec:: SmallVec ;
20
21
use std:: mem;
21
22
22
23
pub fn krate ( mut cx : & mut DocContext < ' _ > ) -> Crate {
@@ -349,11 +350,14 @@ pub fn qpath_to_string(p: &hir::QPath<'_>) -> String {
349
350
s
350
351
}
351
352
352
- pub fn impl_for_type ( tcx : TyCtxt < ' _ > , primitive : PrimitiveType ) -> Option < DefId > {
353
+ pub fn impl_for_type ( tcx : TyCtxt < ' _ > , primitive : PrimitiveType ) -> SmallVec < [ DefId ; 4 ] > {
353
354
use self :: PrimitiveType :: * ;
354
355
356
+ let both =
357
+ |a : Option < DefId > , b : Option < DefId > | -> SmallVec < _ > { a. into_iter ( ) . chain ( b) . collect ( ) } ;
358
+
355
359
let lang_items = tcx. lang_items ( ) ;
356
- match primitive {
360
+ let primary_impl = match primitive {
357
361
Isize => lang_items. isize_impl ( ) ,
358
362
I8 => lang_items. i8_impl ( ) ,
359
363
I16 => lang_items. i16_impl ( ) ,
@@ -366,20 +370,38 @@ pub fn impl_for_type(tcx: TyCtxt<'_>, primitive: PrimitiveType) -> Option<DefId>
366
370
U32 => lang_items. u32_impl ( ) ,
367
371
U64 => lang_items. u64_impl ( ) ,
368
372
U128 => lang_items. u128_impl ( ) ,
369
- F32 => lang_items. f32_impl ( ) ,
370
- F64 => lang_items. f64_impl ( ) ,
373
+ F32 => return both ( lang_items. f32_impl ( ) , lang_items . f32_runtime_impl ( ) ) ,
374
+ F64 => return both ( lang_items. f64_impl ( ) , lang_items . f64_runtime_impl ( ) ) ,
371
375
Char => lang_items. char_impl ( ) ,
372
376
Bool => lang_items. bool_impl ( ) ,
373
- Str => lang_items. str_impl ( ) ,
374
- Slice => lang_items. slice_impl ( ) ,
377
+ Str => return both ( lang_items. str_impl ( ) , lang_items. str_alloc_impl ( ) ) ,
378
+ Slice => {
379
+ return lang_items
380
+ . slice_impl ( )
381
+ . into_iter ( )
382
+ . chain ( lang_items. slice_u8_impl ( ) )
383
+ . chain ( lang_items. slice_alloc_impl ( ) )
384
+ . chain ( lang_items. slice_u8_alloc_impl ( ) )
385
+ . collect ( ) ;
386
+ }
375
387
Array => lang_items. array_impl ( ) ,
376
388
Tuple => None ,
377
389
Unit => None ,
378
- RawPointer => lang_items. const_ptr_impl ( ) ,
390
+ RawPointer => {
391
+ return lang_items
392
+ . const_ptr_impl ( )
393
+ . into_iter ( )
394
+ . chain ( lang_items. mut_ptr_impl ( ) )
395
+ . chain ( lang_items. const_slice_ptr_impl ( ) )
396
+ . chain ( lang_items. mut_slice_ptr_impl ( ) )
397
+ . collect ( ) ;
398
+ }
379
399
Reference => None ,
380
400
Fn => None ,
381
401
Never => None ,
382
- }
402
+ } ;
403
+
404
+ primary_impl. into_iter ( ) . collect ( )
383
405
}
384
406
385
407
pub fn build_deref_target_impls ( cx : & DocContext < ' _ > , items : & [ Item ] , ret : & mut Vec < Item > ) {
@@ -401,8 +423,7 @@ pub fn build_deref_target_impls(cx: &DocContext<'_>, items: &[Item], ret: &mut V
401
423
None => continue ,
402
424
} ,
403
425
} ;
404
- let did = impl_for_type ( tcx, primitive) ;
405
- if let Some ( did) = did {
426
+ for did in impl_for_type ( tcx, primitive) {
406
427
if !did. is_local ( ) {
407
428
inline:: build_impl ( cx, did, None , ret) ;
408
429
}
0 commit comments