// Regression test for #53789. // // check-pass use std::collections::BTreeMap; trait ValueTree { type Value; } trait Strategy { type Value: ValueTree; } type StrategyFor = StrategyType<'static, A>; type StrategyType<'a, A> = >::Strategy; impl Strategy for (K, V) { type Value = TupleValueTree<(K, V)>; } impl ValueTree for TupleValueTree<(K, V)> { type Value = BTreeMapValueTree; } struct TupleValueTree { tree: T, } struct BTreeMapStrategy(std::marker::PhantomData<(K, V)>) where K: Strategy, V: Strategy; struct BTreeMapValueTree(std::marker::PhantomData<(K, V)>) where K: ValueTree, V: ValueTree; impl Strategy for BTreeMapStrategy where K: Strategy, V: Strategy, { type Value = BTreeMapValueTree; } impl ValueTree for BTreeMapValueTree where K: ValueTree, V: ValueTree, { type Value = BTreeMap; } trait Arbitrary<'a>: Sized { fn arbitrary_with(args: Self::Parameters) -> Self::Strategy; type Parameters; type Strategy: Strategy; type ValueTree: ValueTree; } impl<'a, A, B> Arbitrary<'a> for BTreeMap where A: Arbitrary<'static>, B: Arbitrary<'static>, StrategyFor: 'static, StrategyFor: 'static, { type ValueTree = ::Value; type Parameters = (A::Parameters, B::Parameters); type Strategy = BTreeMapStrategy; fn arbitrary_with(args: Self::Parameters) -> BTreeMapStrategy { let (a, b) = args; btree_map(any_with::(a), any_with::(b)) } } fn btree_map(key: K, value: V) -> BTreeMapStrategy { unimplemented!() } fn any_with<'a, A: Arbitrary<'a>>(args: A::Parameters) -> StrategyType<'a, A> { unimplemented!() } fn main() { }