Function chalk_solve::clauses::push_auto_trait_impls
source · pub fn push_auto_trait_impls<I: Interner>(
builder: &mut ClauseBuilder<'_, I>,
auto_trait_id: TraitId<I>,
ty: &TyKind<I>,
) -> Result<(), Floundered>
Expand description
FIXME(#505) update comments for ADTs For auto-traits, we generate a default rule for every struct, unless there is a manual impl for that struct given explicitly.
So, if you have impl Send for MyList<Foo>
, then we would
generate no rule for MyList
at all – similarly if you have
impl !Send for MyList<Foo>
, or impl<T> Send for MyList<T>
.
But if you have no rules at all for Send
/ MyList
, then we
generate an impl based on the field types of MyList
. For example
given the following program:
#[auto] trait Send { }
struct MyList<T> {
data: T,
next: Box<Option<MyList<T>>>,
}
we generate:
forall<T> {
Implemented(MyList<T>: Send) :-
Implemented(T: Send),
Implemented(Box<Option<MyList<T>>>: Send).
}