@@ -985,7 +985,7 @@ impl<'tcx, Cx: TypeInformationCtxt<'tcx>, D: Delegate<'tcx>> ExprUseVisitor<'tcx
985985 // of the pattern, as this just looks confusing, instead use the span
986986 // of the discriminant.
987987 match bm. 0 {
988- hir:: ByRef :: Yes ( m) => {
988+ hir:: ByRef :: Yes ( _ , m) => {
989989 let bk = ty:: BorrowKind :: from_mutbl ( m) ;
990990 self . delegate . borrow_mut ( ) . borrow ( place, discr_place. hir_id , bk) ;
991991 }
@@ -1003,7 +1003,7 @@ impl<'tcx, Cx: TypeInformationCtxt<'tcx>, D: Delegate<'tcx>> ExprUseVisitor<'tcx
10031003 // Deref patterns on boxes don't borrow, so we ignore them here.
10041004 // HACK: this could be a fake pattern corresponding to a deref inserted by match
10051005 // ergonomics, in which case `pat.hir_id` will be the id of the subpattern.
1006- if let hir:: ByRef :: Yes ( mutability) =
1006+ if let hir:: ByRef :: Yes ( _ , mutability) =
10071007 self . cx . typeck_results ( ) . deref_pat_borrow_mode ( place. place . ty ( ) , subpattern)
10081008 {
10091009 let bk = ty:: BorrowKind :: from_mutbl ( mutability) ;
@@ -1255,22 +1255,34 @@ impl<'tcx, Cx: TypeInformationCtxt<'tcx>, D: Delegate<'tcx>> ExprUseVisitor<'tcx
12551255 . get ( pat. hir_id )
12561256 . expect ( "missing binding mode" ) ;
12571257
1258- if matches ! ( bm. 0 , hir:: ByRef :: Yes ( _) ) {
1259- // a bind-by-ref means that the base_ty will be the type of the ident itself,
1260- // but what we want here is the type of the underlying value being borrowed.
1261- // So peel off one-level, turning the &T into T.
1262- match self . cx . structurally_resolve_type ( pat. span , base_ty) . builtin_deref ( false )
1263- {
1264- Some ( ty) => Ok ( ty) ,
1265- None => {
1266- debug ! ( "By-ref binding of non-derefable type" ) ;
1267- Err ( self
1268- . cx
1269- . report_bug ( pat. span , "by-ref binding of non-derefable type" ) )
1258+ match bm. 0 {
1259+ hir:: ByRef :: Yes ( pinnedness, _) => {
1260+ let base_ty = if pinnedness. is_pinned ( ) {
1261+ base_ty. pinned_ty ( ) . ok_or_else ( || {
1262+ debug ! ( "By-pin-ref binding of non-`Pin` type" ) ;
1263+ self . cx . report_bug ( pat. span , "by-pin-ref binding of non-`Pin` type" )
1264+ } ) ?
1265+ } else {
1266+ base_ty
1267+ } ;
1268+ // a bind-by-ref means that the base_ty will be the type of the ident itself,
1269+ // but what we want here is the type of the underlying value being borrowed.
1270+ // So peel off one-level, turning the &T into T.
1271+ match self
1272+ . cx
1273+ . structurally_resolve_type ( pat. span , base_ty)
1274+ . builtin_deref ( false )
1275+ {
1276+ Some ( ty) => Ok ( ty) ,
1277+ None => {
1278+ debug ! ( "By-ref binding of non-derefable type" ) ;
1279+ Err ( self
1280+ . cx
1281+ . report_bug ( pat. span , "by-ref binding of non-derefable type" ) )
1282+ }
12701283 }
12711284 }
1272- } else {
1273- Ok ( base_ty)
1285+ _ => Ok ( base_ty) ,
12741286 }
12751287 }
12761288 _ => Ok ( base_ty) ,
@@ -1696,6 +1708,18 @@ impl<'tcx, Cx: TypeInformationCtxt<'tcx>, D: Delegate<'tcx>> ExprUseVisitor<'tcx
16961708 } ;
16971709 self . pat_deref_place ( pat. hir_id , place_with_id, pat, target_ty) ?
16981710 }
1711+ adjustment:: PatAdjust :: PinDeref => {
1712+ debug ! ( "`PinDeref` of non-pinned-reference type: {:?}" , adjust. source) ;
1713+ let target_ty = adjust. source . pinned_ty ( ) . ok_or_else ( || {
1714+ self . cx . report_bug (
1715+ self . cx . tcx ( ) . hir_span ( pat. hir_id ) ,
1716+ "`PinDeref` of non-pinned-reference type" ,
1717+ )
1718+ } ) ?;
1719+ let kind = ProjectionKind :: Field ( FieldIdx :: ZERO , FIRST_VARIANT ) ;
1720+ place_with_id = self . cat_projection ( pat. hir_id , place_with_id, target_ty, kind) ;
1721+ self . cat_deref ( pat. hir_id , place_with_id) ?
1722+ }
16991723 } ;
17001724 }
17011725 drop ( typeck_results) ; // explicitly release borrow of typeck results, just in case.
@@ -1867,7 +1891,7 @@ impl<'tcx, Cx: TypeInformationCtxt<'tcx>, D: Delegate<'tcx>> ExprUseVisitor<'tcx
18671891 // Deref patterns on boxes are lowered using a built-in deref.
18681892 hir:: ByRef :: No => self . cat_deref ( hir_id, base_place) ,
18691893 // For other types, we create a temporary to match on.
1870- hir:: ByRef :: Yes ( mutability) => {
1894+ hir:: ByRef :: Yes ( _ , mutability) => {
18711895 let re_erased = self . cx . tcx ( ) . lifetimes . re_erased ;
18721896 let ty = Ty :: new_ref ( self . cx . tcx ( ) , re_erased, target_ty, mutability) ;
18731897 // A deref pattern stores the result of `Deref::deref` or `DerefMut::deref_mut` ...
0 commit comments