@@ -12,9 +12,7 @@ use rustc_middle::mir::{
12
12
FakeReadCause , LocalDecl , LocalInfo , LocalKind , Location , Operand , Place , PlaceRef ,
13
13
ProjectionElem , Rvalue , Statement , StatementKind , Terminator , TerminatorKind , VarBindingForm ,
14
14
} ;
15
- use rustc_middle:: ty:: {
16
- self , suggest_constraining_type_param, suggest_constraining_type_params, PredicateKind , Ty ,
17
- } ;
15
+ use rustc_middle:: ty:: { self , suggest_constraining_type_params, PredicateKind , Ty } ;
18
16
use rustc_mir_dataflow:: move_paths:: { InitKind , MoveOutIndex , MovePathIndex } ;
19
17
use rustc_span:: symbol:: sym;
20
18
use rustc_span:: { BytePos , MultiSpan , Span , DUMMY_SP } ;
@@ -410,86 +408,63 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
410
408
Some ( ref name) => format ! ( "`{}`" , name) ,
411
409
None => "value" . to_owned ( ) ,
412
410
} ;
413
- if let ty:: Param ( param_ty) = ty. kind ( ) {
414
- let tcx = self . infcx . tcx ;
415
- let generics = tcx. generics_of ( self . mir_def_id ( ) ) ;
416
- let param = generics. type_param ( & param_ty, tcx) ;
417
- if let Some ( generics) = tcx
418
- . typeck_root_def_id ( self . mir_def_id ( ) . to_def_id ( ) )
419
- . as_local ( )
420
- . and_then ( |def_id| tcx. hir ( ) . get_generics ( def_id) )
421
- {
422
- suggest_constraining_type_param (
423
- tcx,
424
- generics,
425
- & mut err,
426
- param. name . as_str ( ) ,
427
- "Copy" ,
428
- None ,
411
+
412
+ // Try to find predicates on *generic params* that would allow copying `ty`
413
+ let tcx = self . infcx . tcx ;
414
+ let generics = tcx. generics_of ( self . mir_def_id ( ) ) ;
415
+ if let Some ( hir_generics) = tcx
416
+ . typeck_root_def_id ( self . mir_def_id ( ) . to_def_id ( ) )
417
+ . as_local ( )
418
+ . and_then ( |def_id| tcx. hir ( ) . get_generics ( def_id) )
419
+ {
420
+ let predicates: Result < Vec < _ > , _ > = tcx. infer_ctxt ( ) . enter ( |infcx| {
421
+ let mut fulfill_cx =
422
+ <dyn rustc_infer:: traits:: TraitEngine < ' _ > >:: new ( infcx. tcx ) ;
423
+
424
+ let copy_did = infcx. tcx . lang_items ( ) . copy_trait ( ) . unwrap ( ) ;
425
+ let cause = ObligationCause :: new (
426
+ span,
427
+ self . mir_hir_id ( ) ,
428
+ rustc_infer:: traits:: ObligationCauseCode :: MiscObligation ,
429
429
) ;
430
- }
431
- } else {
432
- // Try to find predicates on *generic params* that would allow copying `ty`
433
-
434
- let tcx = self . infcx . tcx ;
435
- let generics = tcx. generics_of ( self . mir_def_id ( ) ) ;
436
- if let Some ( hir_generics) = tcx
437
- . typeck_root_def_id ( self . mir_def_id ( ) . to_def_id ( ) )
438
- . as_local ( )
439
- . and_then ( |def_id| tcx. hir ( ) . get_generics ( def_id) )
440
- {
441
- let predicates: Result < Vec < _ > , _ > = tcx. infer_ctxt ( ) . enter ( |infcx| {
442
- let mut fulfill_cx =
443
- <dyn rustc_infer:: traits:: TraitEngine < ' _ > >:: new ( infcx. tcx ) ;
444
-
445
- let copy_did = infcx. tcx . lang_items ( ) . copy_trait ( ) . unwrap ( ) ;
446
- let cause = ObligationCause :: new (
447
- span,
448
- self . mir_hir_id ( ) ,
449
- rustc_infer:: traits:: ObligationCauseCode :: MiscObligation ,
450
- ) ;
451
- fulfill_cx. register_bound (
452
- & infcx,
453
- self . param_env ,
454
- // Erase any region vids from the type, which may not be resolved
455
- infcx. tcx . erase_regions ( ty) ,
456
- copy_did,
457
- cause,
458
- ) ;
459
- // Select all, including ambiguous predicates
460
- let errors = fulfill_cx. select_all_or_error ( & infcx) ;
461
-
462
- // Only emit suggestion if all required predicates are on generic
463
- errors
464
- . into_iter ( )
465
- . map ( |err| match err. obligation . predicate . kind ( ) . skip_binder ( ) {
466
- PredicateKind :: Trait ( predicate) => {
467
- match predicate. self_ty ( ) . kind ( ) {
468
- ty:: Param ( param_ty) => Ok ( (
469
- generics. type_param ( param_ty, tcx) ,
470
- predicate
471
- . trait_ref
472
- . print_only_trait_path ( )
473
- . to_string ( ) ,
474
- ) ) ,
475
- _ => Err ( ( ) ) ,
476
- }
430
+ fulfill_cx. register_bound (
431
+ & infcx,
432
+ self . param_env ,
433
+ // Erase any region vids from the type, which may not be resolved
434
+ infcx. tcx . erase_regions ( ty) ,
435
+ copy_did,
436
+ cause,
437
+ ) ;
438
+ // Select all, including ambiguous predicates
439
+ let errors = fulfill_cx. select_all_or_error ( & infcx) ;
440
+
441
+ // Only emit suggestion if all required predicates are on generic
442
+ errors
443
+ . into_iter ( )
444
+ . map ( |err| match err. obligation . predicate . kind ( ) . skip_binder ( ) {
445
+ PredicateKind :: Trait ( predicate) => {
446
+ match predicate. self_ty ( ) . kind ( ) {
447
+ ty:: Param ( param_ty) => Ok ( (
448
+ generics. type_param ( param_ty, tcx) ,
449
+ predicate. trait_ref . print_only_trait_path ( ) . to_string ( ) ,
450
+ ) ) ,
451
+ _ => Err ( ( ) ) ,
477
452
}
478
- _ => Err ( ( ) ) ,
479
- } )
480
- . collect ( )
481
- } ) ;
453
+ }
454
+ _ => Err ( ( ) ) ,
455
+ } )
456
+ . collect ( )
457
+ } ) ;
482
458
483
- if let Ok ( predicates) = predicates {
484
- suggest_constraining_type_params (
485
- tcx,
486
- hir_generics,
487
- & mut err,
488
- predicates. iter ( ) . map ( |( param, constraint) | {
489
- ( param. name . as_str ( ) , & * * constraint, None )
490
- } ) ,
491
- ) ;
492
- }
459
+ if let Ok ( predicates) = predicates {
460
+ suggest_constraining_type_params (
461
+ tcx,
462
+ hir_generics,
463
+ & mut err,
464
+ predicates. iter ( ) . map ( |( param, constraint) | {
465
+ ( param. name . as_str ( ) , & * * constraint, None )
466
+ } ) ,
467
+ ) ;
493
468
}
494
469
}
495
470
0 commit comments