|  | //@ revisions: rfail1 rfail2 | 
|  | //@ failure-status: 101 | 
|  | //@ error-pattern: not implemented | 
|  | //@ needs-unwind -Cpanic=abort causes abort instead of exit(101) | 
|  |  | 
|  | pub trait Interner { | 
|  | type InternedVariableKinds; | 
|  | } | 
|  |  | 
|  | trait RustIrDatabase<I: Interner> { | 
|  | fn associated_ty_data(&self) -> AssociatedTyDatum<I>; | 
|  | fn impl_datum(&self) -> ImplDatum<I>; | 
|  | } | 
|  |  | 
|  | trait Fold<I: Interner> { | 
|  | type Result; | 
|  | } | 
|  | impl<T, I: Interner> Fold<I> for Binders<T> | 
|  | where | 
|  | T: HasInterner<Interner = I> + Fold<I>, | 
|  | <T as Fold<I>>::Result: HasInterner<Interner = I>, | 
|  | I: Interner, | 
|  | { | 
|  | type Result = Binders<T::Result>; | 
|  | } | 
|  | impl<I: Interner> Fold<I> for WhereClause<I> { | 
|  | type Result = Binders<WhereClause<I>>; | 
|  | } | 
|  |  | 
|  | trait HasInterner { | 
|  | type Interner: Interner; | 
|  | } | 
|  | impl<T: HasInterner> HasInterner for Vec<T> { | 
|  | type Interner = T::Interner; | 
|  | } | 
|  | impl<T: HasInterner + ?Sized> HasInterner for &T { | 
|  | type Interner = T::Interner; | 
|  | } | 
|  |  | 
|  | pub struct VariableKind<I: Interner> { | 
|  | _marker: std::marker::PhantomData<I>, | 
|  | } | 
|  |  | 
|  | struct VariableKinds<I: Interner> { | 
|  | _interned: I::InternedVariableKinds, | 
|  | } | 
|  |  | 
|  | struct WhereClause<I: Interner> { | 
|  | _marker: std::marker::PhantomData<I>, | 
|  | } | 
|  | impl<I: Interner> HasInterner for WhereClause<I> { | 
|  | type Interner = I; | 
|  | } | 
|  |  | 
|  | struct Binders<T> { | 
|  | _marker: std::marker::PhantomData<T>, | 
|  | } | 
|  | impl<T: HasInterner> HasInterner for Binders<T> { | 
|  | type Interner = T::Interner; | 
|  | } | 
|  | impl<T> Binders<&T> { | 
|  | fn cloned(self) -> Binders<T> { | 
|  | unimplemented!() | 
|  | } | 
|  | } | 
|  | impl<T: HasInterner> Binders<T> { | 
|  | fn map_ref<'a, U, OP>(&'a self, _op: OP) -> Binders<U> | 
|  | where | 
|  | OP: FnOnce(&'a T) -> U, | 
|  | U: HasInterner<Interner = T::Interner>, | 
|  | { | 
|  | unimplemented!() | 
|  | } | 
|  | } | 
|  | impl<T, I: Interner> Binders<T> | 
|  | where | 
|  | T: Fold<I> + HasInterner<Interner = I>, | 
|  | I: Interner, | 
|  | { | 
|  | fn substitute(self) -> T::Result { | 
|  | unimplemented!() | 
|  | } | 
|  | } | 
|  | impl<V, U> IntoIterator for Binders<V> | 
|  | where | 
|  | V: HasInterner + IntoIterator<Item = U>, | 
|  | U: HasInterner<Interner = V::Interner>, | 
|  | { | 
|  | type Item = Binders<U>; | 
|  | type IntoIter = BindersIntoIterator<V>; | 
|  | fn into_iter(self) -> Self::IntoIter { | 
|  | unimplemented!() | 
|  | } | 
|  | } | 
|  | struct BindersIntoIterator<V: HasInterner> { | 
|  | _binders: VariableKinds<V::Interner>, | 
|  | } | 
|  | impl<V> Iterator for BindersIntoIterator<V> | 
|  | where | 
|  | V: HasInterner + IntoIterator, | 
|  | <V as IntoIterator>::Item: HasInterner<Interner = V::Interner>, | 
|  | { | 
|  | type Item = Binders<<V as IntoIterator>::Item>; | 
|  | fn next(&mut self) -> Option<Self::Item> { | 
|  | unimplemented!() | 
|  | } | 
|  | } | 
|  |  | 
|  | struct ImplDatum<I: Interner> { | 
|  | binders: Binders<ImplDatumBound<I>>, | 
|  | } | 
|  | struct ImplDatumBound<I: Interner> { | 
|  | where_clauses: Vec<Binders<WhereClause<I>>>, | 
|  | } | 
|  | impl<I: Interner> HasInterner for ImplDatumBound<I> { | 
|  | type Interner = I; | 
|  | } | 
|  |  | 
|  | struct AssociatedTyDatum<I: Interner> { | 
|  | binders: Binders<AssociatedTyDatumBound<I>>, | 
|  | } | 
|  |  | 
|  | struct AssociatedTyDatumBound<I: Interner> { | 
|  | where_clauses: Vec<Binders<WhereClause<I>>>, | 
|  | } | 
|  | impl<I: Interner> HasInterner for AssociatedTyDatumBound<I> { | 
|  | type Interner = I; | 
|  | } | 
|  |  | 
|  | struct ClauseBuilder<'me, I: Interner> { | 
|  | db: &'me dyn RustIrDatabase<I>, | 
|  | } | 
|  | impl<'me, I: Interner> ClauseBuilder<'me, I> { | 
|  | fn new() -> Self { | 
|  | unimplemented!() | 
|  | } | 
|  | fn push_clause(&mut self, _conditions: impl Iterator<Item = Binders<Binders<WhereClause<I>>>>) { | 
|  | unimplemented!() | 
|  | } | 
|  | } | 
|  |  | 
|  | pub(crate) struct Forest<I: Interner> { | 
|  | _marker: std::marker::PhantomData<I>, | 
|  | } | 
|  |  | 
|  | impl<I: Interner> Forest<I> { | 
|  | fn iter_answers<'f>(&'f self) { | 
|  | let builder = &mut ClauseBuilder::<I>::new(); | 
|  | let impl_datum = builder.db.impl_datum(); | 
|  | let impl_where_clauses = impl_datum | 
|  | .binders | 
|  | .map_ref(|b| &b.where_clauses) | 
|  | .into_iter() | 
|  | .map(|wc| wc.cloned().substitute()); | 
|  | let associated_ty = builder.db.associated_ty_data(); | 
|  | let assoc_ty_where_clauses = associated_ty | 
|  | .binders | 
|  | .map_ref(|b| &b.where_clauses) | 
|  | .into_iter() | 
|  | .map(|wc| wc.cloned().substitute()); | 
|  | builder.push_clause(impl_where_clauses.chain(assoc_ty_where_clauses)); | 
|  | } | 
|  | } | 
|  |  | 
|  | pub struct SLGSolver { | 
|  | pub(crate) forest: Forest<ChalkIr>, | 
|  | } | 
|  | impl SLGSolver { | 
|  | fn new() -> Self { | 
|  | unimplemented!() | 
|  | } | 
|  | fn solve_multiple(&self) { | 
|  | let _answers = self.forest.iter_answers(); | 
|  | } | 
|  | } | 
|  |  | 
|  | pub struct ChalkIr; | 
|  | impl Interner for ChalkIr { | 
|  | type InternedVariableKinds = Vec<VariableKind<ChalkIr>>; | 
|  | } | 
|  |  | 
|  | fn main() { | 
|  | let solver = SLGSolver::new(); | 
|  | solver.solve_multiple(); | 
|  | } |