mirror of https://github.com/rust-lang/rust
59 lines
1.2 KiB
Rust
59 lines
1.2 KiB
Rust
// Regression test for #80953. Hitting the recursion limit in projection
|
|
// is non-fatal. The above code, minimised from wundergraph shows a case
|
|
// where this is relied on.
|
|
|
|
//@ check-pass
|
|
|
|
struct AlternateTable {}
|
|
struct AlternateQuery {}
|
|
|
|
pub trait Query {}
|
|
pub trait AsQuery {
|
|
type Query;
|
|
}
|
|
impl<T: Query> AsQuery for T {
|
|
type Query = Self;
|
|
}
|
|
impl AsQuery for AlternateTable {
|
|
type Query = AlternateQuery;
|
|
}
|
|
|
|
pub trait Table: AsQuery {
|
|
type PrimaryKey;
|
|
}
|
|
impl Table for AlternateTable {
|
|
type PrimaryKey = ();
|
|
}
|
|
|
|
pub trait FilterDsl<Predicate> {
|
|
type Output;
|
|
}
|
|
pub type Filter<Source, Predicate> = <Source as FilterDsl<Predicate>>::Output;
|
|
impl<T, Predicate> FilterDsl<Predicate> for T
|
|
where
|
|
T: Table,
|
|
T::Query: FilterDsl<Predicate>,
|
|
{
|
|
type Output = Filter<T::Query, Predicate>;
|
|
}
|
|
impl<Predicate> FilterDsl<Predicate> for AlternateQuery {
|
|
type Output = &'static str;
|
|
}
|
|
|
|
pub trait HandleDelete {
|
|
type Filter;
|
|
}
|
|
impl<T> HandleDelete for T
|
|
where
|
|
T: Table,
|
|
T::Query: FilterDsl<T::PrimaryKey>,
|
|
Filter<T::Query, T::PrimaryKey>: ,
|
|
{
|
|
type Filter = Filter<T::Query, T::PrimaryKey>;
|
|
}
|
|
|
|
fn main() {
|
|
let x: <AlternateTable as HandleDelete>::Filter = "Hello, world";
|
|
println!("{}", x);
|
|
}
|