diff options
| author | Camille GILLOT <gillot.camille@gmail.com> | 2022-10-23 20:38:34 +0000 |
|---|---|---|
| committer | Camille GILLOT <gillot.camille@gmail.com> | 2022-11-12 09:59:36 +0000 |
| commit | 5fc261e9a0902cc7aa41fd434b23fa0c18ed9d7f (patch) | |
| tree | 3def85b0d0c1ef638deceff44f691b1231261b2a /compiler/rustc_middle/src | |
| parent | b95650930bdd4a972aed911380b9706dbaec6409 (diff) | |
Inherit generics for impl-trait.
Diffstat (limited to 'compiler/rustc_middle/src')
| -rw-r--r-- | compiler/rustc_middle/src/ty/mod.rs | 4 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/relate.rs | 22 |
2 files changed, 23 insertions, 3 deletions
diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs index 18eb06b83c9..bf000e4fd0e 100644 --- a/compiler/rustc_middle/src/ty/mod.rs +++ b/compiler/rustc_middle/src/ty/mod.rs @@ -1338,8 +1338,8 @@ impl<'tcx> OpaqueHiddenType<'tcx> { // HACK: The HIR lowering for async fn does not generate // any `+ Captures<'x>` bounds for the `impl Future<...>`, so all async fns with lifetimes // would now fail to compile. We should probably just make hir lowering fill this in properly. - OpaqueTyOrigin::AsyncFn(_) => map.collect(), - OpaqueTyOrigin::FnReturn(_) | OpaqueTyOrigin::TyAlias => { + OpaqueTyOrigin::FnReturn(_) | OpaqueTyOrigin::AsyncFn(_) => map.collect(), + OpaqueTyOrigin::TyAlias => { // Opaque types may only use regions that are bound. So for // ```rust // type Foo<'a, 'b, 'c> = impl Trait<'a> + 'b; diff --git a/compiler/rustc_middle/src/ty/relate.rs b/compiler/rustc_middle/src/ty/relate.rs index c083a405e3c..42a1314b14d 100644 --- a/compiler/rustc_middle/src/ty/relate.rs +++ b/compiler/rustc_middle/src/ty/relate.rs @@ -170,6 +170,26 @@ pub fn relate_substs_with_variances<'tcx, R: TypeRelation<'tcx>>( tcx.mk_substs(params) } +#[instrument(level = "trace", skip(relation), ret)] +fn relate_opaque_item_substs<'tcx, R: TypeRelation<'tcx>>( + relation: &mut R, + def_id: DefId, + a_subst: SubstsRef<'tcx>, + b_subst: SubstsRef<'tcx>, +) -> RelateResult<'tcx, SubstsRef<'tcx>> { + let tcx = relation.tcx(); + let variances = tcx.variances_of(def_id); + debug!(?variances); + + let params = iter::zip(a_subst, b_subst).enumerate().map(|(i, (a, b))| { + let variance = variances[i]; + let variance_info = ty::VarianceDiagInfo::default(); + relation.relate_with_variance(variance, variance_info, a, b) + }); + + tcx.mk_substs(params) +} + impl<'tcx> Relate<'tcx> for ty::FnSig<'tcx> { fn relate<R: TypeRelation<'tcx>>( relation: &mut R, @@ -561,7 +581,7 @@ pub fn super_relate_tys<'tcx, R: TypeRelation<'tcx>>( (&ty::Opaque(a_def_id, a_substs), &ty::Opaque(b_def_id, b_substs)) if a_def_id == b_def_id => { - let substs = relate_substs(relation, a_substs, b_substs)?; + let substs = relate_opaque_item_substs(relation, a_def_id, a_substs, b_substs)?; Ok(tcx.mk_opaque(a_def_id, substs)) } |
