summaryrefslogtreecommitdiffstats
path: root/tests/ui/traits/next-solver/cycles/inductive-cycle-but-ok.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/traits/next-solver/cycles/inductive-cycle-but-ok.rs')
-rw-r--r--tests/ui/traits/next-solver/cycles/inductive-cycle-but-ok.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/ui/traits/next-solver/cycles/inductive-cycle-but-ok.rs b/tests/ui/traits/next-solver/cycles/inductive-cycle-but-ok.rs
new file mode 100644
index 000000000..d6d9762bb
--- /dev/null
+++ b/tests/ui/traits/next-solver/cycles/inductive-cycle-but-ok.rs
@@ -0,0 +1,44 @@
+// compile-flags: -Znext-solver
+// check-pass
+#![feature(trivial_bounds, marker_trait_attr)]
+#![allow(trivial_bounds)]
+
+// This previously triggered a bug in the provisional cache.
+//
+// This has the proof tree
+// - `Root: Trait` proven via impl
+// - `MultipleCandidates: Trait`
+// - candidate: overflow-impl
+// - `Root: Trait` (inductive cycle ~> OVERFLOW)
+// - candidate: trivial-impl ~> YES
+// - merge respones ~> YES
+// - `MultipleCandidates: Trait` (in provisional cache ~> OVERFLOW)
+//
+// We previously incorrectly treated the `MultipleCandidates: Trait` as
+// overflow because it was in the cache and reached via an inductive cycle.
+// It should be `YES`.
+
+struct Root;
+struct MultipleCandidates;
+
+#[marker]
+trait Trait {}
+impl Trait for Root
+where
+ MultipleCandidates: Trait,
+ MultipleCandidates: Trait,
+{}
+
+// overflow-impl
+impl Trait for MultipleCandidates
+where
+ Root: Trait,
+{}
+// trivial-impl
+impl Trait for MultipleCandidates {}
+
+fn impls_trait<T: Trait>() {}
+
+fn main() {
+ impls_trait::<Root>();
+}