// compile-flags: -Ztrait-solver=next #![feature(trivial_bounds, marker_trait_attr)] #![allow(trivial_bounds)] // This previously triggered a bug in the provisional cache. // // This has the proof tree // - `MultipleCandidates: Trait` proven via impl-one // - `MultipleNested: Trait` via impl // - `MultipleCandidates: Trait` (inductive cycle ~> OVERFLOW) // - `DoesNotImpl: Trait` (ERR) // - `MultipleCandidates: Trait` proven via impl-two // - `MultipleNested: Trait` (in provisional cache ~> OVERFLOW) // // We previously incorrectly treated the `MultipleCandidates: Trait` as // overflow because it was in the cache and reached via an inductive cycle. // It should be `NoSolution`. struct MultipleCandidates; struct MultipleNested; struct DoesNotImpl; #[marker] trait Trait {} // impl-one impl Trait for MultipleCandidates where MultipleNested: Trait {} // impl-two impl Trait for MultipleCandidates where MultipleNested: Trait, {} impl Trait for MultipleNested where MultipleCandidates: Trait, DoesNotImpl: Trait, {} fn impls_trait() {} fn main() { impls_trait::(); //~^ ERROR the trait bound `MultipleCandidates: Trait` is not satisfied }