about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2023-03-22 16:23:36 +0000
committerMichael Goulet <michael@errs.io>2023-03-23 19:00:04 +0000
commit2bab4223939da298593bf1f46154bd8cc0af6070 (patch)
tree9b2e97f03197ed284385cc5fdc3cf70fc9052266 /tests
parentdf7fd9995f10627f25ccb325f693a11b3395a73c (diff)
downloadrust-2bab4223939da298593bf1f46154bd8cc0af6070.tar.gz
rust-2bab4223939da298593bf1f46154bd8cc0af6070.zip
Return nested obligations from canonical response var unification
Diffstat (limited to 'tests')
-rw-r--r--tests/ui/traits/new-solver/alias-eq-in-canonical-response.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/tests/ui/traits/new-solver/alias-eq-in-canonical-response.rs b/tests/ui/traits/new-solver/alias-eq-in-canonical-response.rs
new file mode 100644
index 00000000000..4bfb6323a53
--- /dev/null
+++ b/tests/ui/traits/new-solver/alias-eq-in-canonical-response.rs
@@ -0,0 +1,40 @@
+// check-pass
+// compile-flags: -Ztrait-solver=next
+
+trait Foo {
+    type Gat<'a>
+    where
+        Self: 'a;
+    fn bar(&self) -> Self::Gat<'_>;
+}
+
+enum Option<T> {
+    Some(T),
+    None,
+}
+
+impl<T> Option<T> {
+    fn as_ref(&self) -> Option<&T> {
+        match self {
+            Option::Some(t) => Option::Some(t),
+            Option::None => Option::None,
+        }
+    }
+
+    fn map<U>(self, f: impl FnOnce(T) -> U) -> Option<U> {
+        match self {
+            Option::Some(t) => Option::Some(f(t)),
+            Option::None => Option::None,
+        }
+    }
+}
+
+impl<T: Foo + 'static> Foo for Option<T> {
+    type Gat<'a> = Option<<T as Foo>::Gat<'a>> where Self: 'a;
+
+    fn bar(&self) -> Self::Gat<'_> {
+        self.as_ref().map(Foo::bar)
+    }
+}
+
+fn main() {}