about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
authorRémy Rakic <remy.rakic+github@gmail.com>2023-08-30 14:10:52 +0000
committerRémy Rakic <remy.rakic+github@gmail.com>2023-08-30 14:10:52 +0000
commitf3a1bae88c617330b8956818da3cea256336c1cf (patch)
treebc4454aaaada6c8e05d17caaea4854e4a69c0e15 /tests
parenta725436c292c8a2b379b9b1d328af88585ab9a30 (diff)
downloadrust-f3a1bae88c617330b8956818da3cea256336c1cf.tar.gz
rust-f3a1bae88c617330b8956818da3cea256336c1cf.zip
add test for issue 114907
Diffstat (limited to 'tests')
-rw-r--r--tests/ui/nll/missing-universe-cause-issue-114907.rs40
-rw-r--r--tests/ui/nll/missing-universe-cause-issue-114907.stderr79
2 files changed, 119 insertions, 0 deletions
diff --git a/tests/ui/nll/missing-universe-cause-issue-114907.rs b/tests/ui/nll/missing-universe-cause-issue-114907.rs
new file mode 100644
index 00000000000..94acdccfcf2
--- /dev/null
+++ b/tests/ui/nll/missing-universe-cause-issue-114907.rs
@@ -0,0 +1,40 @@
+// This is a non-regression test for issue #114907 where an ICE happened because of missing
+// `UniverseInfo`s accessed during diagnostics.
+//
+// A couple notes:
+// - the `FnOnce` bounds need an arg that is a reference
+// - a custom `Drop` is needed somewhere in the type that `accept` returns, to create universes
+//   during liveness and dropck outlives computation
+
+// check-fail
+
+trait Role {
+    type Inner;
+}
+
+struct HandshakeCallback<C>(C);
+impl<C: FnOnce(&())> Role for HandshakeCallback<C> {
+    type Inner = ();
+}
+
+struct Handshake<R: Role> {
+    _inner: Option<R::Inner>,
+}
+impl<R: Role> Drop for Handshake<R> {
+    fn drop(&mut self) {}
+}
+
+fn accept<C: FnOnce(&())>(_: C) -> Handshake<HandshakeCallback<C>> {
+    todo!()
+}
+
+fn main() {
+    let callback = |_| {};
+    accept(callback);
+    //~^ ERROR mismatched types
+    //~| ERROR mismatched types
+    //~| ERROR implementation of `FnOnce` is not general enough
+    //~| ERROR implementation of `FnOnce` is not general enough
+    //~| ERROR higher-ranked subtype error
+    //~| ERROR higher-ranked subtype error
+}
diff --git a/tests/ui/nll/missing-universe-cause-issue-114907.stderr b/tests/ui/nll/missing-universe-cause-issue-114907.stderr
new file mode 100644
index 00000000000..c3dd4257a73
--- /dev/null
+++ b/tests/ui/nll/missing-universe-cause-issue-114907.stderr
@@ -0,0 +1,79 @@
+error[E0308]: mismatched types
+  --> $DIR/missing-universe-cause-issue-114907.rs:33:5
+   |
+LL |     accept(callback);
+   |     ^^^^^^^^^^^^^^^^ one type is more general than the other
+   |
+   = note: expected trait `for<'a> FnOnce<(&'a (),)>`
+              found trait `FnOnce<(&(),)>`
+note: this closure does not fulfill the lifetime requirements
+  --> $DIR/missing-universe-cause-issue-114907.rs:32:20
+   |
+LL |     let callback = |_| {};
+   |                    ^^^
+note: the lifetime requirement is introduced here
+  --> $DIR/missing-universe-cause-issue-114907.rs:27:14
+   |
+LL | fn accept<C: FnOnce(&())>(_: C) -> Handshake<HandshakeCallback<C>> {
+   |              ^^^^^^^^^^^
+help: consider specifying the type of the closure parameters
+   |
+LL |     let callback = |_: &_| {};
+   |                    ~~~~~~~
+
+error: implementation of `FnOnce` is not general enough
+  --> $DIR/missing-universe-cause-issue-114907.rs:33:5
+   |
+LL |     accept(callback);
+   |     ^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough
+   |
+   = note: closure with signature `fn(&'2 ())` must implement `FnOnce<(&'1 (),)>`, for any lifetime `'1`...
+   = note: ...but it actually implements `FnOnce<(&'2 (),)>`, for some specific lifetime `'2`
+
+error: implementation of `FnOnce` is not general enough
+  --> $DIR/missing-universe-cause-issue-114907.rs:33:5
+   |
+LL |     accept(callback);
+   |     ^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough
+   |
+   = note: closure with signature `fn(&'2 ())` must implement `FnOnce<(&'1 (),)>`, for any lifetime `'1`...
+   = note: ...but it actually implements `FnOnce<(&'2 (),)>`, for some specific lifetime `'2`
+
+error[E0308]: mismatched types
+  --> $DIR/missing-universe-cause-issue-114907.rs:33:5
+   |
+LL |     accept(callback);
+   |     ^^^^^^^^^^^^^^^^ one type is more general than the other
+   |
+   = note: expected trait `for<'a> FnOnce<(&'a (),)>`
+              found trait `FnOnce<(&(),)>`
+note: this closure does not fulfill the lifetime requirements
+  --> $DIR/missing-universe-cause-issue-114907.rs:32:20
+   |
+LL |     let callback = |_| {};
+   |                    ^^^
+note: the lifetime requirement is introduced here
+  --> $DIR/missing-universe-cause-issue-114907.rs:20:21
+   |
+LL | struct Handshake<R: Role> {
+   |                     ^^^^
+help: consider specifying the type of the closure parameters
+   |
+LL |     let callback = |_: &_| {};
+   |                    ~~~~~~~
+
+error: higher-ranked subtype error
+  --> $DIR/missing-universe-cause-issue-114907.rs:33:21
+   |
+LL |     accept(callback);
+   |                     ^
+
+error: higher-ranked subtype error
+  --> $DIR/missing-universe-cause-issue-114907.rs:33:21
+   |
+LL |     accept(callback);
+   |                     ^
+
+error: aborting due to 6 previous errors
+
+For more information about this error, try `rustc --explain E0308`.