rust/tests/ui/higher-ranked/trait-bounds/hrtb-higher-ranker-supertraits.rs
lcnr 4fa5fb684e move leak check out of candidate evaluation
this prevents higher ranked goals from guiding selection
2024-04-03 22:32:46 +01:00

43 lines
1.0 KiB
Rust

// Test a trait (`Bar`) with a higher-ranked supertrait.
#![allow(unconditional_recursion)]
trait Foo<'tcx> {
fn foo(&'tcx self) -> &'tcx isize;
}
trait Bar<'ccx>: for<'tcx> Foo<'tcx> {
fn bar(&'ccx self) -> &'ccx isize;
}
fn want_foo_for_some_tcx<'x, F: Foo<'x>>(f: &'x F) {
want_foo_for_some_tcx(f);
want_foo_for_any_tcx(f);
//~^ ERROR lifetime may not live long enough
//~| ERROR implementation of `Foo` is not general enough
}
fn want_foo_for_any_tcx<F: for<'tcx> Foo<'tcx>>(f: &F) {
want_foo_for_some_tcx(f);
want_foo_for_any_tcx(f);
}
fn want_bar_for_some_ccx<'x, B: Bar<'x>>(b: &B) {
want_foo_for_some_tcx(b);
want_foo_for_any_tcx(b);
want_bar_for_some_ccx(b);
want_bar_for_any_ccx(b);
//~^ ERROR lifetime may not live long enough
//~| ERROR implementation of `Bar` is not general enough
}
fn want_bar_for_any_ccx<B: for<'ccx> Bar<'ccx>>(b: &B) {
want_foo_for_some_tcx(b);
want_foo_for_any_tcx(b);
want_bar_for_some_ccx(b);
want_bar_for_any_ccx(b);
}
fn main() {}