@@ -7,7 +7,7 @@ use rustc_arena::DroplessArena;
77use rustc_hir:: def:: DefKind ;
88use rustc_hir:: def_id:: { DefId , LocalDefId } ;
99use rustc_middle:: query:: Providers ;
10- use rustc_middle:: ty:: { self , CrateVariancesMap , SubstsRef , Ty , TyCtxt } ;
10+ use rustc_middle:: ty:: { self , CrateVariancesMap , ImplTraitInTraitData , SubstsRef , Ty , TyCtxt } ;
1111use rustc_middle:: ty:: { TypeSuperVisitable , TypeVisitable } ;
1212use std:: ops:: ControlFlow ;
1313
@@ -51,20 +51,26 @@ fn variances_of(tcx: TyCtxt<'_>, item_def_id: LocalDefId) -> &[ty::Variance] {
5151 | DefKind :: Struct
5252 | DefKind :: Union
5353 | DefKind :: Variant
54- | DefKind :: Ctor ( ..) => { }
54+ | DefKind :: Ctor ( ..) => {
55+ // These are inferred.
56+ let crate_map = tcx. crate_variances ( ( ) ) ;
57+ return crate_map. variances . get ( & item_def_id. to_def_id ( ) ) . copied ( ) . unwrap_or ( & [ ] ) ;
58+ }
5559 DefKind :: OpaqueTy | DefKind :: ImplTraitPlaceholder => {
5660 return variance_of_opaque ( tcx, item_def_id) ;
5761 }
58- _ => {
59- // Variance not relevant.
60- span_bug ! ( tcx. def_span( item_def_id) , "asked to compute variance for wrong kind of item" )
62+ DefKind :: AssocTy => {
63+ if let Some ( ImplTraitInTraitData :: Trait { .. } ) =
64+ tcx. opt_rpitit_info ( item_def_id. to_def_id ( ) )
65+ {
66+ return variance_of_opaque ( tcx, item_def_id) ;
67+ }
6168 }
69+ _ => { }
6270 }
6371
64- // Everything else must be inferred.
65-
66- let crate_map = tcx. crate_variances ( ( ) ) ;
67- crate_map. variances . get ( & item_def_id. to_def_id ( ) ) . copied ( ) . unwrap_or ( & [ ] )
72+ // Variance not relevant.
73+ span_bug ! ( tcx. def_span( item_def_id) , "asked to compute variance for wrong kind of item" ) ;
6874}
6975
7076#[ instrument( level = "trace" , skip( tcx) , ret) ]
0 commit comments