diff options
| author | Michael Goulet <michael@errs.io> | 2022-11-01 22:28:40 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2022-11-01 23:25:24 +0000 |
| commit | 72fbb54c5d8cb7e333d14e28d0e683a4363a5ab2 (patch) | |
| tree | 5f792ca6237785b115f150ee2e48ac008d5da620 | |
| parent | ab5a2bc7316012ee9b2a4a4f3821673f2677f3d5 (diff) | |
| download | rust-72fbb54c5d8cb7e333d14e28d0e683a4363a5ab2.tar.gz rust-72fbb54c5d8cb7e333d14e28d0e683a4363a5ab2.zip | |
Don't remap early-bound RPITIT regions that originate from impl
| -rw-r--r-- | compiler/rustc_hir_analysis/src/check/compare_method.rs | 8 | ||||
| -rw-r--r-- | src/test/ui/async-await/in-trait/early-bound-1.rs | 17 | ||||
| -rw-r--r-- | src/test/ui/async-await/in-trait/early-bound-2.rs | 15 |
3 files changed, 39 insertions, 1 deletions
diff --git a/compiler/rustc_hir_analysis/src/check/compare_method.rs b/compiler/rustc_hir_analysis/src/check/compare_method.rs index aeaf7a6cfe1..b695de13750 100644 --- a/compiler/rustc_hir_analysis/src/check/compare_method.rs +++ b/compiler/rustc_hir_analysis/src/check/compare_method.rs @@ -590,7 +590,13 @@ pub fn collect_trait_impl_trait_tys<'tcx>( let num_trait_substs = trait_to_impl_substs.len(); let num_impl_substs = tcx.generics_of(impl_m.container_id(tcx)).params.len(); let ty = tcx.fold_regions(ty, |region, _| { - let (ty::ReFree(_) | ty::ReEarlyBound(_)) = region.kind() else { return region; }; + match region.kind() { + // Remap all free regions, which correspond to late-bound regions in the function. + ty::ReFree(_) => {} + // Remap early-bound regions as long as they don't come from the `impl` itself. + ty::ReEarlyBound(ebr) if tcx.parent(ebr.def_id) != impl_m.container_id(tcx) => {} + _ => return region, + } let Some(ty::ReEarlyBound(e)) = map.get(®ion.into()).map(|r| r.expect_region().kind()) else { tcx diff --git a/src/test/ui/async-await/in-trait/early-bound-1.rs b/src/test/ui/async-await/in-trait/early-bound-1.rs new file mode 100644 index 00000000000..6b3b142014b --- /dev/null +++ b/src/test/ui/async-await/in-trait/early-bound-1.rs @@ -0,0 +1,17 @@ +// check-pass +// edition:2021 + +#![feature(async_fn_in_trait)] +#![allow(incomplete_features)] + +pub trait Foo { + async fn foo(&mut self); +} + +struct MyFoo<'a>(&'a mut ()); + +impl<'a> Foo for MyFoo<'a> { + async fn foo(&mut self) {} +} + +fn main() {} diff --git a/src/test/ui/async-await/in-trait/early-bound-2.rs b/src/test/ui/async-await/in-trait/early-bound-2.rs new file mode 100644 index 00000000000..270443229b0 --- /dev/null +++ b/src/test/ui/async-await/in-trait/early-bound-2.rs @@ -0,0 +1,15 @@ +// check-pass +// edition:2021 + +#![feature(async_fn_in_trait)] +#![allow(incomplete_features)] + +pub trait Foo { + async fn foo(&mut self); +} + +impl<T: Foo> Foo for &mut T { + async fn foo(&mut self) {} +} + +fn main() {} |
