summaryrefslogtreecommitdiffstats
path: root/tests/ui/codegen/subtyping-enforces-type-equality.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/codegen/subtyping-enforces-type-equality.rs')
-rw-r--r--tests/ui/codegen/subtyping-enforces-type-equality.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/tests/ui/codegen/subtyping-enforces-type-equality.rs b/tests/ui/codegen/subtyping-enforces-type-equality.rs
new file mode 100644
index 000000000..a5ffcb3f8
--- /dev/null
+++ b/tests/ui/codegen/subtyping-enforces-type-equality.rs
@@ -0,0 +1,48 @@
+// ignore-pass
+// build-pass
+// edition:2021
+use std::future::Future;
+use std::pin::Pin;
+
+type BoxFuture<T> = Pin<Box<dyn Future<Output = T>>>;
+
+fn main() {
+ let _ = wrapper_call(handler);
+}
+
+async fn wrapper_call(handler: impl Handler) {
+ handler.call().await;
+}
+async fn handler() {
+ f(&()).await;
+}
+async fn f<'a>(db: impl Acquire<'a>) {
+ db.acquire().await;
+}
+
+trait Handler {
+ type Future: Future;
+ fn call(self) -> Self::Future;
+}
+
+impl<Fut, F> Handler for F
+where
+ F: Fn() -> Fut,
+ Fut: Future,
+{
+ type Future = Fut;
+ fn call(self) -> Self::Future {
+ loop {}
+ }
+}
+
+trait Acquire<'a> {
+ type Connection;
+ fn acquire(self) -> BoxFuture<Self::Connection>;
+}
+impl<'a> Acquire<'a> for &'a () {
+ type Connection = Self;
+ fn acquire(self) -> BoxFuture<Self> {
+ loop {}
+ }
+}