about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2022-06-15 10:49:09 -0400
committerNiko Matsakis <niko@alum.mit.edu>2022-06-15 17:28:16 -0400
commitad25ee09c70e3c87cc88cf93496dd97ef971bab2 (patch)
tree4c17874ec3fbdfbdeb119eff3fe229b60a6b731c /src
parent12912b9cde4791dead52e49ae87f80c579bc0cd5 (diff)
downloadrust-ad25ee09c70e3c87cc88cf93496dd97ef971bab2.tar.gz
rust-ad25ee09c70e3c87cc88cf93496dd97ef971bab2.zip
mark issue-91139 and issue-92096 as FIXME
These were "fixed" as part of switching on NLL but seems
to be due to another problem. Preliminary investigation
suggests they are both PROBABLY "implied bounds" related.
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/generic-associated-types/issue-91139.rs18
-rw-r--r--src/test/ui/generic-associated-types/issue-91139.stderr50
-rw-r--r--src/test/ui/generic-associated-types/issue-92096.rs9
-rw-r--r--src/test/ui/generic-associated-types/issue-92096.stderr8
4 files changed, 82 insertions, 3 deletions
diff --git a/src/test/ui/generic-associated-types/issue-91139.rs b/src/test/ui/generic-associated-types/issue-91139.rs
index 03dc8ef93fe..092fa939c30 100644
--- a/src/test/ui/generic-associated-types/issue-91139.rs
+++ b/src/test/ui/generic-associated-types/issue-91139.rs
@@ -1,5 +1,3 @@
-//check-pass
-
 #![feature(generic_associated_types)]
 
 trait Foo<T> {
@@ -16,6 +14,22 @@ impl<T> Foo<T> for () {
 
 fn foo<T>() {
     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+    //~^ ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //
+    // FIXME: This error is bogus, but it arises because we try to validate
+    // that `<() as Foo<T>>::Type<'a>` is valid, which requires proving
+    // that `T: 'a`. Since `'a` is higher-ranked, this becomes
+    // `for<'a> T: 'a`, which is not true. Of course, the error is bogus
+    // because there *ought* to be an implied bound stating that `'a` is
+    // not any lifetime but specifically
+    // "some `'a` such that `<() as Foo<T>>::Type<'a>" is valid".
 }
 
 pub fn main() {}
diff --git a/src/test/ui/generic-associated-types/issue-91139.stderr b/src/test/ui/generic-associated-types/issue-91139.stderr
new file mode 100644
index 00000000000..6c5092978c8
--- /dev/null
+++ b/src/test/ui/generic-associated-types/issue-91139.stderr
@@ -0,0 +1,50 @@
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:12
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:12
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:12
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:12
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:58
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |                                                          ^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:58
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |                                                          ^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:58
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |                                                          ^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:58
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |                                                          ^^^^^^^^^
+
+error: aborting due to 8 previous errors
+
diff --git a/src/test/ui/generic-associated-types/issue-92096.rs b/src/test/ui/generic-associated-types/issue-92096.rs
index bfe0fc15fd3..59dd7ea5563 100644
--- a/src/test/ui/generic-associated-types/issue-92096.rs
+++ b/src/test/ui/generic-associated-types/issue-92096.rs
@@ -1,5 +1,4 @@
 // edition:2018
-// check-pass
 
 #![feature(generic_associated_types)]
 
@@ -18,6 +17,14 @@ where
     C: Client + Send + Sync,
 {
     async move { c.connect().await }
+    //~^ ERROR `C` does not live long enough
+    //
+    // FIXME. This is because we infer at some point a value of
+    //
+    // impl Future<Output = <C as Client>::Connection<'_>>
+    //
+    // and then we somehow fail the WF check because `where C: 'a` is not known,
+    // but I'm not entirely sure how that comes about.
 }
 
 fn main() {}
diff --git a/src/test/ui/generic-associated-types/issue-92096.stderr b/src/test/ui/generic-associated-types/issue-92096.stderr
new file mode 100644
index 00000000000..ca61a0f435e
--- /dev/null
+++ b/src/test/ui/generic-associated-types/issue-92096.stderr
@@ -0,0 +1,8 @@
+error: `C` does not live long enough
+  --> $DIR/issue-92096.rs:19:5
+   |
+LL |     async move { c.connect().await }
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+