@@ -27,7 +27,7 @@ use rustc_span::edition::Edition;
27
27
use rustc_span:: source_map:: Spanned ;
28
28
use rustc_span:: { BytePos , DUMMY_SP , Ident , Span , kw, sym} ;
29
29
use rustc_trait_selection:: infer:: InferCtxtExt ;
30
- use rustc_trait_selection:: traits:: { ObligationCause , ObligationCauseCode , ObligationCtxt } ;
30
+ use rustc_trait_selection:: traits:: { ObligationCause , ObligationCauseCode } ;
31
31
use tracing:: { debug, instrument, trace} ;
32
32
use ty:: VariantDef ;
33
33
use ty:: adjustment:: { PatAdjust , PatAdjustment } ;
@@ -402,38 +402,19 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
402
402
let ty = self . check_pat_inner ( pat, opt_path_res, adjust_mode, expected, pat_info) ;
403
403
self . write_ty ( pat. hir_id , ty) ;
404
404
405
- // If we implicitly inserted overloaded dereferences and pinned dereferences before matching,
406
- // check the pattern to see if the dereferenced types need `DerefMut` or `!Unpin` bounds.
407
- if let Some ( derefed_tys) = self . typeck_results . borrow ( ) . pat_adjustments ( ) . get ( pat. hir_id ) {
408
- let mut has_overloaded_deref = false ;
409
- let mut has_pin_deref = false ;
410
- derefed_tys. iter ( ) . for_each ( |adjust| match adjust. kind {
411
- PatAdjust :: BuiltinDeref => { }
412
- PatAdjust :: OverloadedDeref => has_overloaded_deref = true ,
413
- PatAdjust :: PinDeref => has_pin_deref = true ,
414
- } ) ;
415
- if has_overloaded_deref {
416
- self . register_deref_mut_bounds_if_needed (
417
- pat. span ,
418
- pat,
419
- derefed_tys. iter ( ) . filter_map ( |adjust| match adjust. kind {
420
- PatAdjust :: OverloadedDeref => Some ( adjust. source ) ,
421
- PatAdjust :: BuiltinDeref | PatAdjust :: PinDeref => None ,
422
- } ) ,
423
- ) ;
424
- }
425
- if has_pin_deref {
426
- self . register_not_unpin_bounds_if_needed (
427
- pat. span ,
428
- pat,
429
- derefed_tys. iter ( ) . filter_map ( |adjust| match adjust. kind {
430
- PatAdjust :: BuiltinDeref | PatAdjust :: OverloadedDeref => None ,
431
- PatAdjust :: PinDeref => {
432
- Some ( adjust. source . pinned_ref ( ) . expect ( "expected pinned reference" ) . 0 )
433
- }
434
- } ) ,
435
- ) ;
436
- }
405
+ // If we implicitly inserted overloaded dereferences before matching check the pattern to
406
+ // see if the dereferenced types need `DerefMut` bounds.
407
+ if let Some ( derefed_tys) = self . typeck_results . borrow ( ) . pat_adjustments ( ) . get ( pat. hir_id )
408
+ && derefed_tys. iter ( ) . any ( |adjust| adjust. kind == PatAdjust :: OverloadedDeref )
409
+ {
410
+ self . register_deref_mut_bounds_if_needed (
411
+ pat. span ,
412
+ pat,
413
+ derefed_tys. iter ( ) . filter_map ( |adjust| match adjust. kind {
414
+ PatAdjust :: OverloadedDeref => Some ( adjust. source ) ,
415
+ PatAdjust :: BuiltinDeref | PatAdjust :: PinDeref => None ,
416
+ } ) ,
417
+ ) ;
437
418
}
438
419
439
420
// (note_1): In most of the cases where (note_1) is referenced
@@ -582,9 +563,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
582
563
self . misc ( pat. span ) ,
583
564
)
584
565
}
585
- // Once we've checked `pat`, we'll add a `!Unpin` bound if it contains any
586
- // `ref pin` bindings. See `Self::register_not_unpin_bounds_if_needed`.
587
-
588
566
debug ! ( "default binding mode is now {:?}" , binding_mode) ;
589
567
590
568
// Use the old pat info to keep `current_depth` to its old value.
@@ -2677,44 +2655,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2677
2655
}
2678
2656
}
2679
2657
2680
- /// Check if the interior of a pin pattern (either explicit or implicit) has any `ref pin`
2681
- /// bindings of non-`Unpin` types, which would require `!Unpin` to be emitted.
2682
- fn register_not_unpin_bounds_if_needed (
2683
- & self ,
2684
- span : Span ,
2685
- inner : & ' tcx Pat < ' tcx > ,
2686
- derefed_tys : impl IntoIterator < Item = Ty < ' tcx > > ,
2687
- ) {
2688
- // Check if there are subpatterns with `ref pin` binding modes of non-`Unpin` types.
2689
- let unpin = self . tcx . require_lang_item ( hir:: LangItem :: Unpin , span) ;
2690
- let cause = self . misc ( span) ;
2691
- let unpin_obligations = self . probe ( |_| {
2692
- let ocx = ObligationCtxt :: new ( & self ) ;
2693
- self . typeck_results . borrow ( ) . pat_walk_ref_pin_binding_of_non_unpin_type ( inner, |ty| {
2694
- let ty = ocx
2695
- . normalize ( & cause, self . param_env , ty)
2696
- . pinned_ref ( )
2697
- . expect ( "expect pinned reference" )
2698
- . 0 ;
2699
- debug ! ( "check if `Unpin` is implemented for `{ty:?}`" ) ;
2700
- ocx. register_bound ( cause. clone ( ) , self . param_env , ty, unpin) ;
2701
- } ) ;
2702
- ocx. select_all_or_error ( )
2703
- } ) ;
2704
-
2705
- // If any, the current pattern type should implement `!Unpin`.
2706
- if !unpin_obligations. is_empty ( ) {
2707
- for pinned_derefed_ty in derefed_tys {
2708
- debug ! ( "register `!Unpin` for `{pinned_derefed_ty:?}`" ) ;
2709
- self . register_negative_bound (
2710
- pinned_derefed_ty,
2711
- self . tcx . require_lang_item ( hir:: LangItem :: Unpin , span) ,
2712
- self . misc ( span) ,
2713
- ) ;
2714
- }
2715
- }
2716
- }
2717
-
2718
2658
// Precondition: Pat is Ref(inner)
2719
2659
fn check_pat_ref (
2720
2660
& self ,
0 commit comments