@@ -8,6 +8,7 @@ use crate::ty::error::{ExpectedFound, TypeError};
8
8
use crate :: ty:: { self , Expr , ImplSubject , Term , TermKind , Ty , TyCtxt , TypeFoldable } ;
9
9
use crate :: ty:: { GenericArg , GenericArgKind , GenericArgsRef } ;
10
10
use rustc_hir as hir;
11
+ use rustc_hir:: def:: DefKind ;
11
12
use rustc_hir:: def_id:: DefId ;
12
13
use rustc_target:: spec:: abi;
13
14
use std:: iter;
@@ -134,7 +135,7 @@ pub fn relate_type_and_mut<'tcx, R: TypeRelation<'tcx>>(
134
135
}
135
136
136
137
#[ inline]
137
- pub fn relate_args < ' tcx , R : TypeRelation < ' tcx > > (
138
+ pub fn relate_args_invariantly < ' tcx , R : TypeRelation < ' tcx > > (
138
139
relation : & mut R ,
139
140
a_arg : GenericArgsRef < ' tcx > ,
140
141
b_arg : GenericArgsRef < ' tcx > ,
@@ -273,7 +274,20 @@ impl<'tcx> Relate<'tcx> for ty::AliasTy<'tcx> {
273
274
if a. def_id != b. def_id {
274
275
Err ( TypeError :: ProjectionMismatched ( expected_found ( relation, a. def_id , b. def_id ) ) )
275
276
} 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
+ } ;
277
291
Ok ( relation. tcx ( ) . mk_alias_ty ( a. def_id , args) )
278
292
}
279
293
}
@@ -315,7 +329,7 @@ impl<'tcx> Relate<'tcx> for ty::TraitRef<'tcx> {
315
329
if a. def_id != b. def_id {
316
330
Err ( TypeError :: Traits ( expected_found ( relation, a. def_id , b. def_id ) ) )
317
331
} else {
318
- let args = relate_args ( relation, a. args , b. args ) ?;
332
+ let args = relate_args_invariantly ( relation, a. args , b. args ) ?;
319
333
Ok ( ty:: TraitRef :: new ( relation. tcx ( ) , a. def_id , args) )
320
334
}
321
335
}
@@ -331,7 +345,7 @@ impl<'tcx> Relate<'tcx> for ty::ExistentialTraitRef<'tcx> {
331
345
if a. def_id != b. def_id {
332
346
Err ( TypeError :: Traits ( expected_found ( relation, a. def_id , b. def_id ) ) )
333
347
} else {
334
- let args = relate_args ( relation, a. args , b. args ) ?;
348
+ let args = relate_args_invariantly ( relation, a. args , b. args ) ?;
335
349
Ok ( ty:: ExistentialTraitRef { def_id : a. def_id , args } )
336
350
}
337
351
}
@@ -449,7 +463,7 @@ pub fn structurally_relate_tys<'tcx, R: TypeRelation<'tcx>>(
449
463
// All Generator types with the same id represent
450
464
// the (anonymous) type of the same generator expression. So
451
465
// 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) ?;
453
467
Ok ( Ty :: new_generator ( tcx, a_id, args, movability) )
454
468
}
455
469
@@ -459,15 +473,15 @@ pub fn structurally_relate_tys<'tcx, R: TypeRelation<'tcx>>(
459
473
// All GeneratorWitness types with the same id represent
460
474
// the (anonymous) type of the same generator expression. So
461
475
// 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) ?;
463
477
Ok ( Ty :: new_generator_witness ( tcx, a_id, args) )
464
478
}
465
479
466
480
( & ty:: Closure ( a_id, a_args) , & ty:: Closure ( b_id, b_args) ) if a_id == b_id => {
467
481
// All Closure types with the same id represent
468
482
// the (anonymous) type of the same closure expression. So
469
483
// 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) ?;
471
485
Ok ( Ty :: new_closure ( tcx, a_id, & args) )
472
486
}
473
487
@@ -536,24 +550,6 @@ pub fn structurally_relate_tys<'tcx, R: TypeRelation<'tcx>>(
536
550
Ok ( Ty :: new_fn_ptr ( tcx, fty) )
537
551
}
538
552
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
-
557
553
// Alias tend to mostly already be handled downstream due to normalization.
558
554
( & ty:: Alias ( a_kind, a_data) , & ty:: Alias ( b_kind, b_data) ) => {
559
555
let alias_ty = relation. relate ( a_data, b_data) ?;
@@ -709,7 +705,7 @@ impl<'tcx> Relate<'tcx> for ty::ClosureArgs<'tcx> {
709
705
a : ty:: ClosureArgs < ' tcx > ,
710
706
b : ty:: ClosureArgs < ' tcx > ,
711
707
) -> 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 ) ?;
713
709
Ok ( ty:: ClosureArgs { args } )
714
710
}
715
711
}
@@ -720,7 +716,7 @@ impl<'tcx> Relate<'tcx> for ty::GeneratorArgs<'tcx> {
720
716
a : ty:: GeneratorArgs < ' tcx > ,
721
717
b : ty:: GeneratorArgs < ' tcx > ,
722
718
) -> 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 ) ?;
724
720
Ok ( ty:: GeneratorArgs { args } )
725
721
}
726
722
}
@@ -731,7 +727,7 @@ impl<'tcx> Relate<'tcx> for GenericArgsRef<'tcx> {
731
727
a : GenericArgsRef < ' tcx > ,
732
728
b : GenericArgsRef < ' tcx > ,
733
729
) -> RelateResult < ' tcx , GenericArgsRef < ' tcx > > {
734
- relate_args ( relation, a, b)
730
+ relate_args_invariantly ( relation, a, b)
735
731
}
736
732
}
737
733
@@ -835,19 +831,6 @@ impl<'tcx> Relate<'tcx> for Term<'tcx> {
835
831
}
836
832
}
837
833
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
-
851
834
///////////////////////////////////////////////////////////////////////////
852
835
// Error handling
853
836
0 commit comments