diff --git a/compiler/rustc_infer/src/infer/glb.rs b/compiler/rustc_infer/src/infer/glb.rs index 1570a08f3ca8b..0d38b94965afe 100644 --- a/compiler/rustc_infer/src/infer/glb.rs +++ b/compiler/rustc_infer/src/infer/glb.rs @@ -95,20 +95,12 @@ impl<'tcx> TypeRelation<'tcx> for Glb<'_, '_, 'tcx> { T: Relate<'tcx>, { debug!("binders(a={:?}, b={:?})", a, b); - if a.skip_binder().has_escaping_bound_vars() || b.skip_binder().has_escaping_bound_vars() { - // When higher-ranked types are involved, computing the GLB is - // very challenging, switch to invariance. This is obviously - // overly conservative but works ok in practice. - self.relate_with_variance( - ty::Variance::Invariant, - ty::VarianceDiagInfo::default(), - a, - b, - )?; - Ok(a) - } else { - Ok(ty::Binder::dummy(self.relate(a.skip_binder(), b.skip_binder())?)) - } + + // When higher-ranked types are involved, computing the LUB is + // very challenging, switch to invariance. This is obviously + // overly conservative but works ok in practice. + self.relate_with_variance(ty::Variance::Invariant, ty::VarianceDiagInfo::default(), a, b)?; + Ok(a) } } diff --git a/compiler/rustc_infer/src/infer/lub.rs b/compiler/rustc_infer/src/infer/lub.rs index 9f96d52c85034..498c1e907c4e1 100644 --- a/compiler/rustc_infer/src/infer/lub.rs +++ b/compiler/rustc_infer/src/infer/lub.rs @@ -95,20 +95,12 @@ impl<'tcx> TypeRelation<'tcx> for Lub<'_, '_, 'tcx> { T: Relate<'tcx>, { debug!("binders(a={:?}, b={:?})", a, b); - if a.skip_binder().has_escaping_bound_vars() || b.skip_binder().has_escaping_bound_vars() { - // When higher-ranked types are involved, computing the LUB is - // very challenging, switch to invariance. This is obviously - // overly conservative but works ok in practice. - self.relate_with_variance( - ty::Variance::Invariant, - ty::VarianceDiagInfo::default(), - a, - b, - )?; - Ok(a) - } else { - Ok(ty::Binder::dummy(self.relate(a.skip_binder(), b.skip_binder())?)) - } + + // When higher-ranked types are involved, computing the LUB is + // very challenging, switch to invariance. This is obviously + // overly conservative but works ok in practice. + self.relate_with_variance(ty::Variance::Invariant, ty::VarianceDiagInfo::default(), a, b)?; + Ok(a) } } diff --git a/src/test/ui/lub-glb/empty-binder-future-compat.rs b/src/test/ui/lub-glb/empty-binder-future-compat.rs deleted file mode 100644 index 8700a88a36ea0..0000000000000 --- a/src/test/ui/lub-glb/empty-binder-future-compat.rs +++ /dev/null @@ -1,22 +0,0 @@ -// check-pass -fn lt_in_fn_fn<'a: 'a>() -> fn(fn(&'a ())) { - |_| () -} - - -fn foo<'a, 'b, 'lower>(v: bool) -where - 'a: 'lower, - 'b: 'lower, -{ - // if we infer `x` to be higher ranked in the future, - // this would cause a type error. - let x = match v { - true => lt_in_fn_fn::<'a>(), - false => lt_in_fn_fn::<'b>(), - }; - - let _: fn(fn(&'lower())) = x; -} - -fn main() {} diff --git a/src/test/ui/lub-glb/empty-binders-err.rs b/src/test/ui/lub-glb/empty-binders-err.rs deleted file mode 100644 index 557480173ee62..0000000000000 --- a/src/test/ui/lub-glb/empty-binders-err.rs +++ /dev/null @@ -1,55 +0,0 @@ -fn lt<'a: 'a>() -> &'a () { - &() -} - -fn lt_in_fn<'a: 'a>() -> fn(&'a ()) { - |_| () -} - -struct Contra<'a>(fn(&'a ())); -fn lt_in_contra<'a: 'a>() -> Contra<'a> { - Contra(|_| ()) -} - -fn covariance<'a, 'b, 'upper>(v: bool) -where - 'upper: 'a, - 'upper: 'b, - -{ - let _: &'upper () = match v { - //~^ ERROR lifetime may not live long enough - //~| ERROR lifetime may not live long enough - true => lt::<'a>(), - false => lt::<'b>(), - }; -} - -fn contra_fn<'a, 'b, 'lower>(v: bool) -where - 'a: 'lower, - 'b: 'lower, - -{ - - let _: fn(&'lower ()) = match v { - //~^ ERROR lifetime may not live long enough - true => lt_in_fn::<'a>(), - false => lt_in_fn::<'b>(), - }; -} - -fn contra_struct<'a, 'b, 'lower>(v: bool) -where - 'a: 'lower, - 'b: 'lower, - -{ - let _: Contra<'lower> = match v { - //~^ ERROR lifetime may not live long enough - true => lt_in_contra::<'a>(), - false => lt_in_contra::<'b>(), - }; -} - -fn main() {} diff --git a/src/test/ui/lub-glb/empty-binders-err.stderr b/src/test/ui/lub-glb/empty-binders-err.stderr deleted file mode 100644 index f86f22d5e40bf..0000000000000 --- a/src/test/ui/lub-glb/empty-binders-err.stderr +++ /dev/null @@ -1,59 +0,0 @@ -error: lifetime may not live long enough - --> $DIR/empty-binders-err.rs:20:12 - | -LL | fn covariance<'a, 'b, 'upper>(v: bool) - | -- ------ lifetime `'upper` defined here - | | - | lifetime `'a` defined here -... -LL | let _: &'upper () = match v { - | ^^^^^^^^^^ type annotation requires that `'a` must outlive `'upper` - | - = help: consider adding the following bound: `'a: 'upper` - -error: lifetime may not live long enough - --> $DIR/empty-binders-err.rs:20:12 - | -LL | fn covariance<'a, 'b, 'upper>(v: bool) - | -- ------ lifetime `'upper` defined here - | | - | lifetime `'b` defined here -... -LL | let _: &'upper () = match v { - | ^^^^^^^^^^ type annotation requires that `'b` must outlive `'upper` - | - = help: consider adding the following bound: `'b: 'upper` - -help: the following changes may resolve your lifetime errors - | - = help: add bound `'a: 'upper` - = help: add bound `'b: 'upper` - -error: lifetime may not live long enough - --> $DIR/empty-binders-err.rs:35:12 - | -LL | fn contra_fn<'a, 'b, 'lower>(v: bool) - | -- ------ lifetime `'lower` defined here - | | - | lifetime `'a` defined here -... -LL | let _: fn(&'lower ()) = match v { - | ^^^^^^^^^^^^^^ type annotation requires that `'lower` must outlive `'a` - | - = help: consider adding the following bound: `'lower: 'a` - -error: lifetime may not live long enough - --> $DIR/empty-binders-err.rs:48:12 - | -LL | fn contra_struct<'a, 'b, 'lower>(v: bool) - | -- ------ lifetime `'lower` defined here - | | - | lifetime `'a` defined here -... -LL | let _: Contra<'lower> = match v { - | ^^^^^^^^^^^^^^ type annotation requires that `'lower` must outlive `'a` - | - = help: consider adding the following bound: `'lower: 'a` - -error: aborting due to 4 previous errors - diff --git a/src/test/ui/lub-glb/empty-binders.rs b/src/test/ui/lub-glb/empty-binders.rs deleted file mode 100644 index f9d07e79fdabf..0000000000000 --- a/src/test/ui/lub-glb/empty-binders.rs +++ /dev/null @@ -1,45 +0,0 @@ -// check-pass -// -// Check that computing the lub works even for empty binders. -fn lt<'a: 'a>() -> &'a () { - &() -} - -fn lt_in_fn<'a: 'a>() -> fn(&'a ()) { - |_| () -} - -struct Contra<'a>(fn(&'a ())); -fn lt_in_contra<'a: 'a>() -> Contra<'a> { - Contra(|_| ()) -} - -fn ok<'a, 'b, 'upper, 'lower>(v: bool) -where - 'upper: 'a, - 'upper: 'b, - 'a: 'lower, - 'b: 'lower, - -{ - let _: &'lower () = match v { - true => lt::<'a>(), - false => lt::<'b>(), - }; - - // This errored in the past because LUB and GLB always - // bailed out when encountering binders, even if they were - // empty. - let _: fn(&'upper ()) = match v { - true => lt_in_fn::<'a>(), - false => lt_in_fn::<'b>(), - }; - - // This was already accepted, as relate didn't encounter any binders. - let _: Contra<'upper> = match v { - true => lt_in_contra::<'a>(), - false => lt_in_contra::<'b>(), - }; -} - -fn main() {}