// check-pass // compile-flags: -Ztrait-solver=next #![feature(rustc_attrs, marker_trait_attr)] #[rustc_coinductive] trait Trait {} impl Trait for (T, U) where (U, T): Trait, (T, U): Inductive, (): ConstrainToU32, {} trait ConstrainToU32 {} impl ConstrainToU32 for () {} // We only prefer the candidate without an inductive cycle // once the inductive cycle has the same constraints as the // other goal. #[marker] trait Inductive {} impl Inductive for (T, U) where (T, U): Trait, {} impl Inductive for (u32, u32) {} fn impls_trait() where (T, U): Trait, {} fn main() { impls_trait::<_, _>(); }