From 2f89aefe8888bd2b0ec8059ed66b319f50306a1f Mon Sep 17 00:00:00 2001 From: Ziru Niu Date: Wed, 26 Apr 2023 18:16:34 +0800 Subject: [PATCH 1/3] Do not subst nonexistent lifetime in RPIT in recursive function --- .../rustc_borrowck/src/region_infer/opaque_types.rs | 10 +++------- .../recursive-impl-trait-type-direct-with-lifetime.rs | 10 ++++++++++ 2 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 tests/ui/impl-trait/recursive-impl-trait-type-direct-with-lifetime.rs diff --git a/compiler/rustc_borrowck/src/region_infer/opaque_types.rs b/compiler/rustc_borrowck/src/region_infer/opaque_types.rs index 33f07c1d8fc41..80cba31fff13d 100644 --- a/compiler/rustc_borrowck/src/region_infer/opaque_types.rs +++ b/compiler/rustc_borrowck/src/region_infer/opaque_types.rs @@ -88,15 +88,11 @@ impl<'tcx> RegionInferenceContext<'tcx> { Some(region) => { let vid = self.universal_regions.to_region_vid(region); subst_regions.push(vid); - region + Some(region) } None => { subst_regions.push(vid); - ty::Region::new_error_with_message( - infcx.tcx, - concrete_type.span, - "opaque type with non-universal region substs", - ) + None } } }; @@ -118,7 +114,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { return region; } let vid = self.to_region_vid(region); - to_universal_region(vid, &mut subst_regions) + to_universal_region(vid, &mut subst_regions).unwrap_or(region) }); debug!(?universal_substs); debug!(?subst_regions); diff --git a/tests/ui/impl-trait/recursive-impl-trait-type-direct-with-lifetime.rs b/tests/ui/impl-trait/recursive-impl-trait-type-direct-with-lifetime.rs new file mode 100644 index 0000000000000..956a4d4c94641 --- /dev/null +++ b/tests/ui/impl-trait/recursive-impl-trait-type-direct-with-lifetime.rs @@ -0,0 +1,10 @@ +// check-pass + +#![allow(unconditional_recursion)] + +fn test<'a>() -> impl Sized + 'a { + let r: i32 = test(); + r +} + +fn main() {} From 0cf7ab2f100358e28b12a9ccd45927721664ee17 Mon Sep 17 00:00:00 2001 From: Ziru Niu Date: Tue, 30 May 2023 19:18:17 +0800 Subject: [PATCH 2/3] move tests --- .../recursive-impl-trait-type-direct-with-lifetime.rs | 0 .../{ => recursive}/recursive-impl-trait-type-direct.rs | 0 .../recursive-impl-trait-type-indirect.drop_tracking.stderr | 0 .../recursive-impl-trait-type-indirect.drop_tracking_mir.stderr | 0 .../recursive-impl-trait-type-indirect.no_drop_tracking.stderr | 0 .../{ => recursive}/recursive-impl-trait-type-indirect.rs | 0 .../recursive-impl-trait-type-through-non-recursive.rs | 0 .../recursive-impl-trait-type-through-non-recursive.stderr | 0 .../recursive-type-alias-impl-trait-declaration-too-subtle-2.rs | 0 ...ecursive-type-alias-impl-trait-declaration-too-subtle-2.stderr | 0 .../recursive-type-alias-impl-trait-declaration-too-subtle.rs | 0 .../recursive-type-alias-impl-trait-declaration-too-subtle.stderr | 0 .../recursive-type-alias-impl-trait-declaration.rs | 0 13 files changed, 0 insertions(+), 0 deletions(-) rename tests/ui/impl-trait/{ => recursive}/recursive-impl-trait-type-direct-with-lifetime.rs (100%) rename tests/ui/impl-trait/{ => recursive}/recursive-impl-trait-type-direct.rs (100%) rename tests/ui/impl-trait/{ => recursive}/recursive-impl-trait-type-indirect.drop_tracking.stderr (100%) rename tests/ui/impl-trait/{ => recursive}/recursive-impl-trait-type-indirect.drop_tracking_mir.stderr (100%) rename tests/ui/impl-trait/{ => recursive}/recursive-impl-trait-type-indirect.no_drop_tracking.stderr (100%) rename tests/ui/impl-trait/{ => recursive}/recursive-impl-trait-type-indirect.rs (100%) rename tests/ui/impl-trait/{ => recursive}/recursive-impl-trait-type-through-non-recursive.rs (100%) rename tests/ui/impl-trait/{ => recursive}/recursive-impl-trait-type-through-non-recursive.stderr (100%) rename tests/ui/impl-trait/{ => recursive}/recursive-type-alias-impl-trait-declaration-too-subtle-2.rs (100%) rename tests/ui/impl-trait/{ => recursive}/recursive-type-alias-impl-trait-declaration-too-subtle-2.stderr (100%) rename tests/ui/impl-trait/{ => recursive}/recursive-type-alias-impl-trait-declaration-too-subtle.rs (100%) rename tests/ui/impl-trait/{ => recursive}/recursive-type-alias-impl-trait-declaration-too-subtle.stderr (100%) rename tests/ui/impl-trait/{ => recursive}/recursive-type-alias-impl-trait-declaration.rs (100%) diff --git a/tests/ui/impl-trait/recursive-impl-trait-type-direct-with-lifetime.rs b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-lifetime.rs similarity index 100% rename from tests/ui/impl-trait/recursive-impl-trait-type-direct-with-lifetime.rs rename to tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-lifetime.rs diff --git a/tests/ui/impl-trait/recursive-impl-trait-type-direct.rs b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct.rs similarity index 100% rename from tests/ui/impl-trait/recursive-impl-trait-type-direct.rs rename to tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct.rs diff --git a/tests/ui/impl-trait/recursive-impl-trait-type-indirect.drop_tracking.stderr b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-indirect.drop_tracking.stderr similarity index 100% rename from tests/ui/impl-trait/recursive-impl-trait-type-indirect.drop_tracking.stderr rename to tests/ui/impl-trait/recursive/recursive-impl-trait-type-indirect.drop_tracking.stderr diff --git a/tests/ui/impl-trait/recursive-impl-trait-type-indirect.drop_tracking_mir.stderr b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-indirect.drop_tracking_mir.stderr similarity index 100% rename from tests/ui/impl-trait/recursive-impl-trait-type-indirect.drop_tracking_mir.stderr rename to tests/ui/impl-trait/recursive/recursive-impl-trait-type-indirect.drop_tracking_mir.stderr diff --git a/tests/ui/impl-trait/recursive-impl-trait-type-indirect.no_drop_tracking.stderr b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-indirect.no_drop_tracking.stderr similarity index 100% rename from tests/ui/impl-trait/recursive-impl-trait-type-indirect.no_drop_tracking.stderr rename to tests/ui/impl-trait/recursive/recursive-impl-trait-type-indirect.no_drop_tracking.stderr diff --git a/tests/ui/impl-trait/recursive-impl-trait-type-indirect.rs b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-indirect.rs similarity index 100% rename from tests/ui/impl-trait/recursive-impl-trait-type-indirect.rs rename to tests/ui/impl-trait/recursive/recursive-impl-trait-type-indirect.rs diff --git a/tests/ui/impl-trait/recursive-impl-trait-type-through-non-recursive.rs b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-through-non-recursive.rs similarity index 100% rename from tests/ui/impl-trait/recursive-impl-trait-type-through-non-recursive.rs rename to tests/ui/impl-trait/recursive/recursive-impl-trait-type-through-non-recursive.rs diff --git a/tests/ui/impl-trait/recursive-impl-trait-type-through-non-recursive.stderr b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-through-non-recursive.stderr similarity index 100% rename from tests/ui/impl-trait/recursive-impl-trait-type-through-non-recursive.stderr rename to tests/ui/impl-trait/recursive/recursive-impl-trait-type-through-non-recursive.stderr diff --git a/tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle-2.rs b/tests/ui/impl-trait/recursive/recursive-type-alias-impl-trait-declaration-too-subtle-2.rs similarity index 100% rename from tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle-2.rs rename to tests/ui/impl-trait/recursive/recursive-type-alias-impl-trait-declaration-too-subtle-2.rs diff --git a/tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle-2.stderr b/tests/ui/impl-trait/recursive/recursive-type-alias-impl-trait-declaration-too-subtle-2.stderr similarity index 100% rename from tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle-2.stderr rename to tests/ui/impl-trait/recursive/recursive-type-alias-impl-trait-declaration-too-subtle-2.stderr diff --git a/tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle.rs b/tests/ui/impl-trait/recursive/recursive-type-alias-impl-trait-declaration-too-subtle.rs similarity index 100% rename from tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle.rs rename to tests/ui/impl-trait/recursive/recursive-type-alias-impl-trait-declaration-too-subtle.rs diff --git a/tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle.stderr b/tests/ui/impl-trait/recursive/recursive-type-alias-impl-trait-declaration-too-subtle.stderr similarity index 100% rename from tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration-too-subtle.stderr rename to tests/ui/impl-trait/recursive/recursive-type-alias-impl-trait-declaration-too-subtle.stderr diff --git a/tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration.rs b/tests/ui/impl-trait/recursive/recursive-type-alias-impl-trait-declaration.rs similarity index 100% rename from tests/ui/impl-trait/recursive-type-alias-impl-trait-declaration.rs rename to tests/ui/impl-trait/recursive/recursive-type-alias-impl-trait-declaration.rs From 5c69a5d93af06f5290b8b6c2e57796e34cfa5e50 Mon Sep 17 00:00:00 2001 From: Ziru Niu Date: Tue, 30 May 2023 19:54:58 +0800 Subject: [PATCH 3/3] add tests in #111906 --- ...t-type-direct-with-earlybound-lifetime-2.rs | 9 +++++++++ ...pe-direct-with-earlybound-lifetime-2.stderr | 18 ++++++++++++++++++ ...t-type-direct-with-earlybound-lifetime-3.rs | 10 ++++++++++ ...t-type-direct-with-earlybound-lifetime-4.rs | 13 +++++++++++++ ...pe-direct-with-earlybound-lifetime-4.stderr | 14 ++++++++++++++ ...ait-type-direct-with-earlybound-lifetime.rs | 10 ++++++++++ 6 files changed, 74 insertions(+) create mode 100644 tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-2.rs create mode 100644 tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-2.stderr create mode 100644 tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-3.rs create mode 100644 tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-4.rs create mode 100644 tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-4.stderr create mode 100644 tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime.rs diff --git a/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-2.rs b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-2.rs new file mode 100644 index 0000000000000..7250310a59cd7 --- /dev/null +++ b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-2.rs @@ -0,0 +1,9 @@ +#![allow(unconditional_recursion)] + +fn foo<'a: 'a>() -> impl Sized { + let _: *mut &'a () = foo::<'a>(); + //~^ ERROR + loop {} +} + +fn main() {} diff --git a/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-2.stderr b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-2.stderr new file mode 100644 index 0000000000000..13f2b2114a765 --- /dev/null +++ b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-2.stderr @@ -0,0 +1,18 @@ +error[E0700]: hidden type for `impl Sized` captures lifetime that does not appear in bounds + --> $DIR/recursive-impl-trait-type-direct-with-earlybound-lifetime-2.rs:4:12 + | +LL | fn foo<'a: 'a>() -> impl Sized { + | -- ---------- opaque type defined here + | | + | hidden type `*mut &'a ()` captures the lifetime `'a` as defined here +LL | let _: *mut &'a () = foo::<'a>(); + | ^^^^^^^^^^^ + | +help: to declare that `impl Sized` captures `'a`, you can add an explicit `'a` lifetime bound + | +LL | fn foo<'a: 'a>() -> impl Sized + 'a { + | ++++ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0700`. diff --git a/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-3.rs b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-3.rs new file mode 100644 index 0000000000000..6257e87653f63 --- /dev/null +++ b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-3.rs @@ -0,0 +1,10 @@ +// check-pass + +#![allow(unconditional_recursion)] + +fn foo<'a: 'a>() -> impl Sized + 'a { + let _: *mut &'a () = foo::<'a>(); + loop {} +} + +fn main() {} diff --git a/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-4.rs b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-4.rs new file mode 100644 index 0000000000000..77578b60cddee --- /dev/null +++ b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-4.rs @@ -0,0 +1,13 @@ +#![allow(unconditional_recursion)] + +trait Trait<'a, 'b> {} +impl<'a, 'b, T> Trait<'a, 'b> for T {} + +fn foo<'a: 'a, 'b: 'b>() -> impl Trait<'a, 'b> { + let _: *mut &'a () = foo::<'a, 'b>(); + let _: *mut &'b () = foo::<'a, 'b>(); + //~^ ERROR + loop {} +} + +fn main() {} diff --git a/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-4.stderr b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-4.stderr new file mode 100644 index 0000000000000..2fff3b796493f --- /dev/null +++ b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime-4.stderr @@ -0,0 +1,14 @@ +error: concrete type differs from previous defining opaque type use + --> $DIR/recursive-impl-trait-type-direct-with-earlybound-lifetime-4.rs:8:12 + | +LL | let _: *mut &'b () = foo::<'a, 'b>(); + | ^^^^^^^^^^^ expected `*mut &'a ()`, got `*mut &'b ()` + | +note: previous use here + --> $DIR/recursive-impl-trait-type-direct-with-earlybound-lifetime-4.rs:7:12 + | +LL | let _: *mut &'a () = foo::<'a, 'b>(); + | ^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime.rs b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime.rs new file mode 100644 index 0000000000000..7f15d4e6303f5 --- /dev/null +++ b/tests/ui/impl-trait/recursive/recursive-impl-trait-type-direct-with-earlybound-lifetime.rs @@ -0,0 +1,10 @@ +// check-pass + +#![allow(unconditional_recursion)] + +fn foo<'a: 'a>() -> impl Sized { + let _: () = foo::<'a>(); + loop {} +} + +fn main() {}