summaryrefslogtreecommitdiffstats
path: root/src/test/ui/associated-types/project-recursion-limit-non-fatal.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/associated-types/project-recursion-limit-non-fatal.rs')
-rw-r--r--src/test/ui/associated-types/project-recursion-limit-non-fatal.rs58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/test/ui/associated-types/project-recursion-limit-non-fatal.rs b/src/test/ui/associated-types/project-recursion-limit-non-fatal.rs
new file mode 100644
index 000000000..3e68b1401
--- /dev/null
+++ b/src/test/ui/associated-types/project-recursion-limit-non-fatal.rs
@@ -0,0 +1,58 @@
+// 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);
+}