| // Regression test for #77653 | |
| // When monomorphizing `f` we need to prove `dyn Derived<()>: Base<()>`. This | |
| // requires us to normalize the `Base<<() as Proj>::S>` to `Base<()>` when | |
| // comparing the supertrait `Derived<()>` to the expected trait. | |
| //@ build-pass | |
| //@ revisions: current next | |
| //@ ignore-compare-mode-next-solver (explicit revisions) | |
| //@[next] compile-flags: -Znext-solver | |
| trait Proj { | |
| type S; | |
| } | |
| impl Proj for () { | |
| type S = (); | |
| } | |
| impl Proj for i32 { | |
| type S = i32; | |
| } | |
| trait Base<T> { | |
| fn is_base(&self); | |
| } | |
| trait Derived<B: Proj>: Base<B::S> + Base<()> { | |
| fn is_derived(&self); | |
| } | |
| fn f<P: Proj>(obj: &dyn Derived<P>) { | |
| obj.is_derived(); | |
| Base::<P::S>::is_base(obj); | |
| Base::<()>::is_base(obj); | |
| } | |
| fn main() { | |
| let x: fn(_) = f::<()>; | |
| let x: fn(_) = f::<i32>; | |
| } |