@@ -371,10 +371,9 @@ fn clean_where_predicate<'tcx>(
371371            bounds :  wrp. bounds . iter ( ) . filter_map ( |x| clean_generic_bound ( x,  cx) ) . collect ( ) , 
372372        } , 
373373
374-         hir:: WherePredicateKind :: EqPredicate ( wrp)  => WherePredicate :: EqPredicate  { 
375-             lhs :  clean_ty ( wrp. lhs_ty ,  cx) , 
376-             rhs :  clean_ty ( wrp. rhs_ty ,  cx) . into ( ) , 
377-         } , 
374+         // We should never actually reach this case because these predicates should've already been 
375+         // rejected in an earlier compiler pass. This feature isn't fully implemented (#20041). 
376+         hir:: WherePredicateKind :: EqPredicate ( _)  => bug ! ( "EqPredicate" ) , 
378377    } ) 
379378} 
380379
@@ -470,68 +469,55 @@ fn clean_projection_predicate<'tcx>(
470469    cx :  & mut  DocContext < ' tcx > , 
471470)  -> WherePredicate  { 
472471    WherePredicate :: EqPredicate  { 
473-         lhs :  clean_projection ( 
474-             pred. map_bound ( |p| { 
475-                 // FIXME: This needs to be made resilient for `AliasTerm`s that 
476-                 // are associated consts. 
477-                 p. projection_term . expect_ty ( cx. tcx ) 
478-             } ) , 
479-             cx, 
480-             None , 
481-         ) , 
472+         lhs :  clean_projection ( pred. map_bound ( |p| p. projection_term ) ,  cx,  None ) , 
482473        rhs :  clean_middle_term ( pred. map_bound ( |p| p. term ) ,  cx) , 
483474    } 
484475} 
485476
486477fn  clean_projection < ' tcx > ( 
487-     ty :  ty:: Binder < ' tcx ,  ty:: AliasTy < ' tcx > > , 
478+     proj :  ty:: Binder < ' tcx ,  ty:: AliasTerm < ' tcx > > , 
488479    cx :  & mut  DocContext < ' tcx > , 
489-     def_id :  Option < DefId > , 
490- )  -> Type  { 
491-     if  cx. tcx . is_impl_trait_in_trait ( ty. skip_binder ( ) . def_id )  { 
492-         return  clean_middle_opaque_bounds ( cx,  ty. skip_binder ( ) . def_id ,  ty. skip_binder ( ) . args ) ; 
493-     } 
494- 
480+     parent_def_id :  Option < DefId > , 
481+ )  -> QPathData  { 
495482    let  trait_ = clean_trait_ref_with_constraints ( 
496483        cx, 
497-         ty . map_bound ( |ty| ty . trait_ref ( cx. tcx ) ) , 
484+         proj . map_bound ( |proj| proj . trait_ref ( cx. tcx ) ) , 
498485        ThinVec :: new ( ) , 
499486    ) ; 
500-     let  self_type = clean_middle_ty ( ty. map_bound ( |ty| ty. self_ty ( ) ) ,  cx,  None ,  None ) ; 
501-     let  self_def_id = if  let  Some ( def_id)  = def_id { 
502-         cx. tcx . opt_parent ( def_id) . or ( Some ( def_id) ) 
503-     }  else  { 
504-         self_type. def_id ( & cx. cache ) 
487+     let  self_type = clean_middle_ty ( proj. map_bound ( |proj| proj. self_ty ( ) ) ,  cx,  None ,  None ) ; 
488+     let  self_def_id = match  parent_def_id { 
489+         Some ( parent_def_id)  => cx. tcx . opt_parent ( parent_def_id) . or ( Some ( parent_def_id) ) , 
490+         None  => self_type. def_id ( & cx. cache ) , 
505491    } ; 
506-     let  should_show_cast  = compute_should_show_cast ( self_def_id,  & trait_,  & self_type) ; 
507-      Type :: QPath ( Box :: new ( QPathData   { 
508-          assoc :   projection_to_path_segment ( ty ,  cx ) , 
509-         should_show_cast , 
492+     let  should_fully_qualify  = should_fully_qualify_path ( self_def_id,  & trait_,  & self_type) ; 
493+ 
494+     QPathData   { 
495+         assoc :   projection_to_path_segment ( proj ,  cx ) , 
510496        self_type, 
497+         should_fully_qualify, 
511498        trait_ :  Some ( trait_) , 
512-     } ) ) 
499+     } 
513500} 
514501
515- fn  compute_should_show_cast ( self_def_id :  Option < DefId > ,  trait_ :  & Path ,  self_type :  & Type )  -> bool  { 
502+ fn  should_fully_qualify_path ( self_def_id :  Option < DefId > ,  trait_ :  & Path ,  self_type :  & Type )  -> bool  { 
516503    !trait_. segments . is_empty ( ) 
517504        && self_def_id
518505            . zip ( Some ( trait_. def_id ( ) ) ) 
519506            . map_or ( !self_type. is_self_type ( ) ,  |( id,  trait_) | id != trait_) 
520507} 
521508
522509fn  projection_to_path_segment < ' tcx > ( 
523-     ty :  ty:: Binder < ' tcx ,  ty:: AliasTy < ' tcx > > , 
510+     proj :  ty:: Binder < ' tcx ,  ty:: AliasTerm < ' tcx > > , 
524511    cx :  & mut  DocContext < ' tcx > , 
525512)  -> PathSegment  { 
526-     let  def_id = ty. skip_binder ( ) . def_id ; 
527-     let  item = cx. tcx . associated_item ( def_id) ; 
513+     let  def_id = proj. skip_binder ( ) . def_id ; 
528514    let  generics = cx. tcx . generics_of ( def_id) ; 
529515    PathSegment  { 
530-         name :  item . name ( ) , 
516+         name :  cx . tcx . item_name ( def_id ) , 
531517        args :  GenericArgs :: AngleBracketed  { 
532518            args :  clean_middle_generic_args ( 
533519                cx, 
534-                 ty . map_bound ( |ty| & ty. args [ generics. parent_count ..] ) , 
520+                 proj . map_bound ( |ty| & ty. args [ generics. parent_count ..] ) , 
535521                false , 
536522                def_id, 
537523            ) , 
@@ -845,7 +831,7 @@ fn clean_ty_generics<'tcx>(
845831        . predicates 
846832        . iter ( ) 
847833        . flat_map ( |( pred,  _) | { 
848-             let  mut  projection  = None ; 
834+             let  mut  proj_pred  = None ; 
849835            let  param_idx = { 
850836                let  bound_p = pred. kind ( ) ; 
851837                match  bound_p. skip_binder ( )  { 
@@ -860,7 +846,7 @@ fn clean_ty_generics<'tcx>(
860846                    ty:: ClauseKind :: Projection ( p) 
861847                        if  let  ty:: Param ( param)  = p. projection_term . self_ty ( ) . kind ( )  =>
862848                    { 
863-                         projection  = Some ( bound_p. rebind ( p) ) ; 
849+                         proj_pred  = Some ( bound_p. rebind ( p) ) ; 
864850                        Some ( param. index ) 
865851                    } 
866852                    _ => None , 
@@ -874,22 +860,12 @@ fn clean_ty_generics<'tcx>(
874860
875861                bounds. extend ( pred. get_bounds ( ) . into_iter ( ) . flatten ( ) . cloned ( ) ) ; 
876862
877-                 if  let  Some ( proj)  = projection
878-                     && let  lhs = clean_projection ( 
879-                         proj. map_bound ( |p| { 
880-                             // FIXME: This needs to be made resilient for `AliasTerm`s that 
881-                             // are associated consts. 
882-                             p. projection_term . expect_ty ( cx. tcx ) 
883-                         } ) , 
884-                         cx, 
885-                         None , 
886-                     ) 
887-                     && let  Some ( ( _,  trait_did,  name) )  = lhs. projection ( ) 
888-                 { 
863+                 if  let  Some ( pred)  = proj_pred { 
864+                     let  lhs = clean_projection ( pred. map_bound ( |p| p. projection_term ) ,  cx,  None ) ; 
889865                    impl_trait_proj. entry ( param_idx) . or_default ( ) . push ( ( 
890-                         trait_did , 
891-                         name , 
892-                         proj . map_bound ( |p| p. term ) , 
866+                         lhs . trait_ . unwrap ( ) . def_id ( ) , 
867+                         lhs . assoc , 
868+                         pred . map_bound ( |p| p. term ) , 
893869                    ) ) ; 
894870                } 
895871
@@ -1695,10 +1671,11 @@ fn clean_qpath<'tcx>(hir_ty: &hir::Ty<'tcx>, cx: &mut DocContext<'tcx>) -> Type
16951671            register_res ( cx,  trait_. res ) ; 
16961672            let  self_def_id = DefId :: local ( qself. hir_id . owner . def_id . local_def_index ) ; 
16971673            let  self_type = clean_ty ( qself,  cx) ; 
1698-             let  should_show_cast = compute_should_show_cast ( Some ( self_def_id) ,  & trait_,  & self_type) ; 
1674+             let  should_fully_qualify =
1675+                 should_fully_qualify_path ( Some ( self_def_id) ,  & trait_,  & self_type) ; 
16991676            Type :: QPath ( Box :: new ( QPathData  { 
17001677                assoc :  clean_path_segment ( p. segments . last ( ) . expect ( "segments were empty" ) ,  cx) , 
1701-                 should_show_cast , 
1678+                 should_fully_qualify , 
17021679                self_type, 
17031680                trait_ :  Some ( trait_) , 
17041681            } ) ) 
@@ -1707,16 +1684,16 @@ fn clean_qpath<'tcx>(hir_ty: &hir::Ty<'tcx>, cx: &mut DocContext<'tcx>) -> Type
17071684            let  ty = lower_ty ( cx. tcx ,  hir_ty) ; 
17081685            let  self_type = clean_ty ( qself,  cx) ; 
17091686
1710-             let  ( trait_,  should_show_cast )  = match  ty. kind ( )  { 
1687+             let  ( trait_,  should_fully_qualify )  = match  ty. kind ( )  { 
17111688                ty:: Alias ( ty:: Projection ,  proj)  => { 
17121689                    let  res = Res :: Def ( DefKind :: Trait ,  proj. trait_ref ( cx. tcx ) . def_id ) ; 
17131690                    let  trait_ = clean_path ( & hir:: Path  {  span,  res,  segments :  & [ ]  } ,  cx) ; 
17141691                    register_res ( cx,  trait_. res ) ; 
17151692                    let  self_def_id = res. opt_def_id ( ) ; 
1716-                     let  should_show_cast  =
1717-                         compute_should_show_cast ( self_def_id,  & trait_,  & self_type) ; 
1693+                     let  should_fully_qualify  =
1694+                         should_fully_qualify_path ( self_def_id,  & trait_,  & self_type) ; 
17181695
1719-                     ( Some ( trait_) ,  should_show_cast ) 
1696+                     ( Some ( trait_) ,  should_fully_qualify ) 
17201697                } 
17211698                ty:: Alias ( ty:: Inherent ,  _)  => ( None ,  false ) , 
17221699                // Rustdoc handles `ty::Error`s by turning them into `Type::Infer`s. 
@@ -1726,7 +1703,7 @@ fn clean_qpath<'tcx>(hir_ty: &hir::Ty<'tcx>, cx: &mut DocContext<'tcx>) -> Type
17261703
17271704            Type :: QPath ( Box :: new ( QPathData  { 
17281705                assoc :  clean_path_segment ( segment,  cx) , 
1729-                 should_show_cast , 
1706+                 should_fully_qualify , 
17301707                self_type, 
17311708                trait_, 
17321709            } ) ) 
@@ -2145,14 +2122,8 @@ pub(crate) fn clean_middle_ty<'tcx>(
21452122                . map ( |pb| AssocItemConstraint  { 
21462123                    assoc :  projection_to_path_segment ( 
21472124                        pb. map_bound ( |pb| { 
2148-                             pb
2149-                                 // HACK(compiler-errors): Doesn't actually matter what self 
2150-                                 // type we put here, because we're only using the GAT's args. 
2151-                                 . with_self_ty ( cx. tcx ,  cx. tcx . types . self_param ) 
2125+                             pb. with_self_ty ( cx. tcx ,  cx. tcx . types . trait_object_dummy_self ) 
21522126                                . projection_term 
2153-                                 // FIXME: This needs to be made resilient for `AliasTerm`s 
2154-                                 // that are associated consts. 
2155-                                 . expect_ty ( cx. tcx ) 
21562127                        } ) , 
21572128                        cx, 
21582129                    ) , 
@@ -2185,18 +2156,25 @@ pub(crate) fn clean_middle_ty<'tcx>(
21852156            Tuple ( t. iter ( ) . map ( |t| clean_middle_ty ( bound_ty. rebind ( t) ,  cx,  None ,  None ) ) . collect ( ) ) 
21862157        } 
21872158
2188-         ty:: Alias ( ty:: Projection ,  data)  => { 
2189-             clean_projection ( bound_ty. rebind ( data) ,  cx,  parent_def_id) 
2159+         ty:: Alias ( ty:: Projection ,  alias_ty @ ty:: AliasTy  {  def_id,  args,  .. } )  => { 
2160+             if  cx. tcx . is_impl_trait_in_trait ( def_id)  { 
2161+                 clean_middle_opaque_bounds ( cx,  def_id,  args) 
2162+             }  else  { 
2163+                 Type :: QPath ( Box :: new ( clean_projection ( 
2164+                     bound_ty. rebind ( alias_ty. into ( ) ) , 
2165+                     cx, 
2166+                     parent_def_id, 
2167+                 ) ) ) 
2168+             } 
21902169        } 
21912170
2192-         ty:: Alias ( ty:: Inherent ,  alias_ty)  => { 
2193-             let  def_id = alias_ty. def_id ; 
2171+         ty:: Alias ( ty:: Inherent ,  alias_ty @ ty:: AliasTy  {  def_id,  .. } )  => { 
21942172            let  alias_ty = bound_ty. rebind ( alias_ty) ; 
21952173            let  self_type = clean_middle_ty ( alias_ty. map_bound ( |ty| ty. self_ty ( ) ) ,  cx,  None ,  None ) ; 
21962174
21972175            Type :: QPath ( Box :: new ( QPathData  { 
21982176                assoc :  PathSegment  { 
2199-                     name :  cx. tcx . associated_item ( def_id) . name ( ) , 
2177+                     name :  cx. tcx . item_name ( def_id) , 
22002178                    args :  GenericArgs :: AngleBracketed  { 
22012179                        args :  clean_middle_generic_args ( 
22022180                            cx, 
@@ -2207,26 +2185,21 @@ pub(crate) fn clean_middle_ty<'tcx>(
22072185                        constraints :  Default :: default ( ) , 
22082186                    } , 
22092187                } , 
2210-                 should_show_cast :  false , 
2188+                 should_fully_qualify :  false , 
22112189                self_type, 
22122190                trait_ :  None , 
22132191            } ) ) 
22142192        } 
22152193
2216-         ty:: Alias ( ty:: Free ,  data )  => { 
2194+         ty:: Alias ( ty:: Free ,  ty :: AliasTy   {  def_id ,  args ,  ..  } )  => { 
22172195            if  cx. tcx . features ( ) . lazy_type_alias ( )  { 
22182196                // Free type alias `data` represents the `type X` in `type X = Y`. If we need `Y`, 
22192197                // we need to use `type_of`. 
2220-                 let  path = clean_middle_path ( 
2221-                     cx, 
2222-                     data. def_id , 
2223-                     false , 
2224-                     ThinVec :: new ( ) , 
2225-                     bound_ty. rebind ( data. args ) , 
2226-                 ) ; 
2198+                 let  path =
2199+                     clean_middle_path ( cx,  def_id,  false ,  ThinVec :: new ( ) ,  bound_ty. rebind ( args) ) ; 
22272200                Type :: Path  {  path } 
22282201            }  else  { 
2229-                 let  ty = cx. tcx . type_of ( data . def_id ) . instantiate ( cx. tcx ,  data . args ) ; 
2202+                 let  ty = cx. tcx . type_of ( def_id) . instantiate ( cx. tcx ,  args) ; 
22302203                clean_middle_ty ( bound_ty. rebind ( ty) ,  cx,  None ,  None ) 
22312204            } 
22322205        } 
@@ -2313,18 +2286,17 @@ fn clean_middle_opaque_bounds<'tcx>(
23132286            let  bindings:  ThinVec < _ >  = bounds
23142287                . iter ( ) 
23152288                . filter_map ( |( bound,  _) | { 
2316-                     if  let  ty:: ClauseKind :: Projection ( proj)  = bound. kind ( ) . skip_binder ( ) 
2317-                         && proj. projection_term . trait_ref ( cx. tcx )  == trait_ref. skip_binder ( ) 
2289+                     let  bound = bound. kind ( ) ; 
2290+                     if  let  ty:: ClauseKind :: Projection ( proj_pred)  = bound. skip_binder ( ) 
2291+                         && proj_pred. projection_term . trait_ref ( cx. tcx )  == trait_ref. skip_binder ( ) 
23182292                    { 
23192293                        return  Some ( AssocItemConstraint  { 
23202294                            assoc :  projection_to_path_segment ( 
2321-                                 // FIXME: This needs to be made resilient for `AliasTerm`s that 
2322-                                 // are associated consts. 
2323-                                 bound. kind ( ) . rebind ( proj. projection_term . expect_ty ( cx. tcx ) ) , 
2295+                                 bound. rebind ( proj_pred. projection_term ) , 
23242296                                cx, 
23252297                            ) , 
23262298                            kind :  AssocItemConstraintKind :: Equality  { 
2327-                                 term :  clean_middle_term ( bound. kind ( ) . rebind ( proj . term ) ,  cx) , 
2299+                                 term :  clean_middle_term ( bound. rebind ( proj_pred . term ) ,  cx) , 
23282300                            } , 
23292301                        } ) ; 
23302302                    } 
0 commit comments