1 use crate::clauses
::ClauseBuilder
;
2 use crate::rust_ir
::WellKnownTrait
;
3 use crate::{Interner, RustIrDatabase, TraitRef}
;
4 use chalk_ir
::{Floundered, Substitution, Ty, TyKind}
;
6 /// Add implicit impl for the `Tuple` trait for all tuples
7 pub fn add_tuple_program_clauses
<I
: Interner
>(
8 db
: &dyn RustIrDatabase
<I
>,
9 builder
: &mut ClauseBuilder
<'_
, I
>,
11 ) -> Result
<(), Floundered
> {
12 let interner
= db
.interner();
14 match self_ty
.kind(interner
) {
15 TyKind
::Tuple(..) => {
16 let trait_id
= db
.well_known_trait_id(WellKnownTrait
::Tuple
).unwrap();
18 builder
.push_fact(TraitRef
{
20 substitution
: Substitution
::from1(interner
, self_ty
),
26 // Tuple trait is non-enumerable
27 TyKind
::InferenceVar(..) | TyKind
::BoundVar(_
) | TyKind
::Alias(..) => Err(Floundered
),