@@ -8,6 +8,7 @@ use crate::ty::error::{ExpectedFound, TypeError};
88use  crate :: ty:: { self ,  Expr ,  ImplSubject ,  Term ,  TermKind ,  Ty ,  TyCtxt ,  TypeFoldable } ; 
99use  crate :: ty:: { GenericArg ,  GenericArgKind ,  GenericArgsRef } ; 
1010use  rustc_hir as  hir; 
11+ use  rustc_hir:: def:: DefKind ; 
1112use  rustc_hir:: def_id:: DefId ; 
1213use  rustc_target:: spec:: abi; 
1314use  std:: iter; 
@@ -134,7 +135,7 @@ pub fn relate_type_and_mut<'tcx, R: TypeRelation<'tcx>>(
134135} 
135136
136137#[ inline]  
137- pub  fn  relate_args < ' tcx ,  R :  TypeRelation < ' tcx > > ( 
138+ pub  fn  relate_args_invariantly < ' tcx ,  R :  TypeRelation < ' tcx > > ( 
138139    relation :  & mut  R , 
139140    a_arg :  GenericArgsRef < ' tcx > , 
140141    b_arg :  GenericArgsRef < ' tcx > , 
@@ -273,7 +274,20 @@ impl<'tcx> Relate<'tcx> for ty::AliasTy<'tcx> {
273274        if  a. def_id  != b. def_id  { 
274275            Err ( TypeError :: ProjectionMismatched ( expected_found ( relation,  a. def_id ,  b. def_id ) ) ) 
275276        }  else  { 
276-             let  args = relation. relate ( a. args ,  b. args ) ?; 
277+             let  args = match  relation. tcx ( ) . def_kind ( a. def_id )  { 
278+                 DefKind :: OpaqueTy  => relate_args_with_variances ( 
279+                     relation, 
280+                     a. def_id , 
281+                     relation. tcx ( ) . variances_of ( a. def_id ) , 
282+                     a. args , 
283+                     b. args , 
284+                     false ,  // do not fetch `type_of(a_def_id)`, as it will cause a cycle 
285+                 ) ?, 
286+                 DefKind :: AssocTy  | DefKind :: AssocConst  | DefKind :: TyAlias  => { 
287+                     relate_args_invariantly ( relation,  a. args ,  b. args ) ?
288+                 } 
289+                 def => bug ! ( "unknown alias DefKind: {def:?}" ) , 
290+             } ; 
277291            Ok ( relation. tcx ( ) . mk_alias_ty ( a. def_id ,  args) ) 
278292        } 
279293    } 
@@ -315,7 +329,7 @@ impl<'tcx> Relate<'tcx> for ty::TraitRef<'tcx> {
315329        if  a. def_id  != b. def_id  { 
316330            Err ( TypeError :: Traits ( expected_found ( relation,  a. def_id ,  b. def_id ) ) ) 
317331        }  else  { 
318-             let  args = relate_args ( relation,  a. args ,  b. args ) ?; 
332+             let  args = relate_args_invariantly ( relation,  a. args ,  b. args ) ?; 
319333            Ok ( ty:: TraitRef :: new ( relation. tcx ( ) ,  a. def_id ,  args) ) 
320334        } 
321335    } 
@@ -331,7 +345,7 @@ impl<'tcx> Relate<'tcx> for ty::ExistentialTraitRef<'tcx> {
331345        if  a. def_id  != b. def_id  { 
332346            Err ( TypeError :: Traits ( expected_found ( relation,  a. def_id ,  b. def_id ) ) ) 
333347        }  else  { 
334-             let  args = relate_args ( relation,  a. args ,  b. args ) ?; 
348+             let  args = relate_args_invariantly ( relation,  a. args ,  b. args ) ?; 
335349            Ok ( ty:: ExistentialTraitRef  {  def_id :  a. def_id ,  args } ) 
336350        } 
337351    } 
@@ -449,7 +463,7 @@ pub fn structurally_relate_tys<'tcx, R: TypeRelation<'tcx>>(
449463            // All Generator types with the same id represent 
450464            // the (anonymous) type of the same generator expression. So 
451465            // all of their regions should be equated. 
452-             let  args = relation . relate ( a_args,  b_args) ?; 
466+             let  args = relate_args_invariantly ( relation ,   a_args,  b_args) ?; 
453467            Ok ( Ty :: new_generator ( tcx,  a_id,  args,  movability) ) 
454468        } 
455469
@@ -459,15 +473,15 @@ pub fn structurally_relate_tys<'tcx, R: TypeRelation<'tcx>>(
459473            // All GeneratorWitness types with the same id represent 
460474            // the (anonymous) type of the same generator expression. So 
461475            // all of their regions should be equated. 
462-             let  args = relation . relate ( a_args,  b_args) ?; 
476+             let  args = relate_args_invariantly ( relation ,   a_args,  b_args) ?; 
463477            Ok ( Ty :: new_generator_witness ( tcx,  a_id,  args) ) 
464478        } 
465479
466480        ( & ty:: Closure ( a_id,  a_args) ,  & ty:: Closure ( b_id,  b_args) )  if  a_id == b_id => { 
467481            // All Closure types with the same id represent 
468482            // the (anonymous) type of the same closure expression. So 
469483            // all of their regions should be equated. 
470-             let  args = relation . relate ( a_args,  b_args) ?; 
484+             let  args = relate_args_invariantly ( relation ,   a_args,  b_args) ?; 
471485            Ok ( Ty :: new_closure ( tcx,  a_id,  & args) ) 
472486        } 
473487
@@ -536,24 +550,6 @@ pub fn structurally_relate_tys<'tcx, R: TypeRelation<'tcx>>(
536550            Ok ( Ty :: new_fn_ptr ( tcx,  fty) ) 
537551        } 
538552
539-         // The args of opaque types may not all be invariant, so we have 
540-         // to treat them separately from other aliases. 
541-         ( 
542-             & ty:: Alias ( ty:: Opaque ,  ty:: AliasTy  {  def_id :  a_def_id,  args :  a_args,  .. } ) , 
543-             & ty:: Alias ( ty:: Opaque ,  ty:: AliasTy  {  def_id :  b_def_id,  args :  b_args,  .. } ) , 
544-         )  if  a_def_id == b_def_id => { 
545-             let  opt_variances = tcx. variances_of ( a_def_id) ; 
546-             let  args = relate_args_with_variances ( 
547-                 relation, 
548-                 a_def_id, 
549-                 opt_variances, 
550-                 a_args, 
551-                 b_args, 
552-                 false ,  // do not fetch `type_of(a_def_id)`, as it will cause a cycle 
553-             ) ?; 
554-             Ok ( Ty :: new_opaque ( tcx,  a_def_id,  args) ) 
555-         } 
556- 
557553        // Alias tend to mostly already be handled downstream due to normalization. 
558554        ( & ty:: Alias ( a_kind,  a_data) ,  & ty:: Alias ( b_kind,  b_data) )  => { 
559555            let  alias_ty = relation. relate ( a_data,  b_data) ?; 
@@ -709,7 +705,7 @@ impl<'tcx> Relate<'tcx> for ty::ClosureArgs<'tcx> {
709705        a :  ty:: ClosureArgs < ' tcx > , 
710706        b :  ty:: ClosureArgs < ' tcx > , 
711707    )  -> RelateResult < ' tcx ,  ty:: ClosureArgs < ' tcx > >  { 
712-         let  args = relate_args ( relation,  a. args ,  b. args ) ?; 
708+         let  args = relate_args_invariantly ( relation,  a. args ,  b. args ) ?; 
713709        Ok ( ty:: ClosureArgs  {  args } ) 
714710    } 
715711} 
@@ -720,7 +716,7 @@ impl<'tcx> Relate<'tcx> for ty::GeneratorArgs<'tcx> {
720716        a :  ty:: GeneratorArgs < ' tcx > , 
721717        b :  ty:: GeneratorArgs < ' tcx > , 
722718    )  -> RelateResult < ' tcx ,  ty:: GeneratorArgs < ' tcx > >  { 
723-         let  args = relate_args ( relation,  a. args ,  b. args ) ?; 
719+         let  args = relate_args_invariantly ( relation,  a. args ,  b. args ) ?; 
724720        Ok ( ty:: GeneratorArgs  {  args } ) 
725721    } 
726722} 
@@ -731,7 +727,7 @@ impl<'tcx> Relate<'tcx> for GenericArgsRef<'tcx> {
731727        a :  GenericArgsRef < ' tcx > , 
732728        b :  GenericArgsRef < ' tcx > , 
733729    )  -> RelateResult < ' tcx ,  GenericArgsRef < ' tcx > >  { 
734-         relate_args ( relation,  a,  b) 
730+         relate_args_invariantly ( relation,  a,  b) 
735731    } 
736732} 
737733
@@ -835,19 +831,6 @@ impl<'tcx> Relate<'tcx> for Term<'tcx> {
835831    } 
836832} 
837833
838- impl < ' tcx >  Relate < ' tcx >  for  ty:: ProjectionPredicate < ' tcx >  { 
839-     fn  relate < R :  TypeRelation < ' tcx > > ( 
840-         relation :  & mut  R , 
841-         a :  ty:: ProjectionPredicate < ' tcx > , 
842-         b :  ty:: ProjectionPredicate < ' tcx > , 
843-     )  -> RelateResult < ' tcx ,  ty:: ProjectionPredicate < ' tcx > >  { 
844-         Ok ( ty:: ProjectionPredicate  { 
845-             projection_ty :  relation. relate ( a. projection_ty ,  b. projection_ty ) ?, 
846-             term :  relation. relate ( a. term ,  b. term ) ?, 
847-         } ) 
848-     } 
849- } 
850- 
851834/////////////////////////////////////////////////////////////////////////// 
852835// Error handling 
853836
0 commit comments