// run-pass
#![allow(dead_code)]
#![allow(unused_variables)]
// Test that when we match a trait reference like `Foo: Foo0t>`,
// we unify with `?0t` with `A`. In this code, if we failed to do
// that, then you get an unconstrained type-variable in `call`.
//
// Also serves as a regression test for issue #26952, though the test
// was derived from another reported regression with the same cause.
use std::marker::PhantomData;
trait Trait { fn foo(&self); }
struct Type { a: PhantomData }
fn as_trait(t: &Type) -> &dyn Trait { loop { } }
fn want+?Sized>(t: &T) { }
fn call(p: Type) {
let q = as_trait(&p);
want(q); // parameter A to `want` *would* be unconstrained
}
fn main() { }