Skip to content

Commit bcc488e

Browse files
Give RPITITs variance for precise capturing
1 parent 1dea922 commit bcc488e

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

compiler/rustc_hir_analysis/src/variance/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ fn variances_of(tcx: TyCtxt<'_>, item_def_id: LocalDefId) -> &[ty::Variance] {
6161
let crate_map = tcx.crate_variances(());
6262
return crate_map.variances.get(&item_def_id.to_def_id()).copied().unwrap_or(&[]);
6363
}
64+
DefKind::AssocTy => match tcx.opt_rpitit_info(item_def_id.to_def_id()) {
65+
Some(ty::ImplTraitInTraitData::Trait { opaque_def_id, .. }) => {
66+
return variance_of_opaque(tcx, opaque_def_id.expect_local());
67+
}
68+
None => {}
69+
Some(ty::ImplTraitInTraitData::Impl { .. }) => {}
70+
},
6471
DefKind::OpaqueTy => {
6572
return variance_of_opaque(tcx, item_def_id);
6673
}

compiler/rustc_metadata/src/rmeta/encoder.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1086,9 +1086,12 @@ fn should_encode_variances<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, def_kind: Def
10861086
| DefKind::Fn
10871087
| DefKind::Ctor(..)
10881088
| DefKind::AssocFn => true,
1089+
DefKind::AssocTy => {
1090+
// Only encode variances for RPITITs (for traits)
1091+
matches!(tcx.opt_rpitit_info(def_id), Some(ty::ImplTraitInTraitData::Trait { .. }))
1092+
}
10891093
DefKind::Mod
10901094
| DefKind::Field
1091-
| DefKind::AssocTy
10921095
| DefKind::AssocConst
10931096
| DefKind::TyParam
10941097
| DefKind::ConstParam

compiler/rustc_middle/src/ty/relate.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,16 @@ impl<'tcx> Relate<'tcx> for ty::AliasTy<'tcx> {
233233
b.args,
234234
false, // do not fetch `type_of(a_def_id)`, as it will cause a cycle
235235
)?,
236+
DefKind::AssocTy if relation.tcx().is_impl_trait_in_trait(a.def_id) => {
237+
relate_args_with_variances(
238+
relation,
239+
a.def_id,
240+
relation.tcx().variances_of(a.def_id),
241+
a.args,
242+
b.args,
243+
false, // do not fetch `type_of(a_def_id)`, as it will cause a cycle
244+
)?
245+
}
236246
DefKind::AssocTy | DefKind::AssocConst | DefKind::TyAlias => {
237247
relate_args_invariantly(relation, a.args, b.args)?
238248
}

0 commit comments

Comments
 (0)