summaryrefslogtreecommitdiffstats
path: root/src/test/ui/impl-trait/wf-eval-order.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/impl-trait/wf-eval-order.rs')
-rw-r--r--src/test/ui/impl-trait/wf-eval-order.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/test/ui/impl-trait/wf-eval-order.rs b/src/test/ui/impl-trait/wf-eval-order.rs
new file mode 100644
index 000000000..c7d6bb870
--- /dev/null
+++ b/src/test/ui/impl-trait/wf-eval-order.rs
@@ -0,0 +1,39 @@
+// Check that we handle evaluating `wf` predicates correctly.
+
+// check-pass
+
+struct X<T: B>(T)
+where
+ T::V: Clone;
+
+fn hide<T>(t: T) -> impl Sized {
+ t
+}
+
+trait A {
+ type U;
+}
+
+impl<T> A for T {
+ type U = T;
+}
+
+trait B {
+ type V;
+}
+
+impl<S: A<U = T>, T> B for S {
+ type V = T;
+}
+
+fn main() {
+ // Evaluating `typeof(x): Sized` requires
+ //
+ // - `wf(typeof(x))` because we use a projection candidate.
+ // - `<i32 as B>::V: Clone` because that's a bound on the trait.
+ // - `<i32 as B>::V` normalizes to `_#1` where `<i32 as A>::U == _#1`
+ //
+ // This all works if we evaluate `<i32 as A>::U == _#1` before
+ // `<i32 as B>::V`, but we previously had the opposite order.
+ let x = hide(X(0));
+}