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