about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--tests/ui/impl-trait/failed-to-resolve-instance-ice-105488.rs42
-rw-r--r--tests/ui/impl-trait/failed-to-resolve-instance-ice-105488.stderr16
2 files changed, 58 insertions, 0 deletions
diff --git a/tests/ui/impl-trait/failed-to-resolve-instance-ice-105488.rs b/tests/ui/impl-trait/failed-to-resolve-instance-ice-105488.rs
new file mode 100644
index 00000000000..994a5073947
--- /dev/null
+++ b/tests/ui/impl-trait/failed-to-resolve-instance-ice-105488.rs
@@ -0,0 +1,42 @@
+// ICE failed to resolve instance for <fn() -> impl MyFnOnce  ...
+// issue: rust-lang/rust#105488
+//@ build-fail
+//~^^^ ERROR overflow evaluating the requirement `fn() -> impl MyFnOnce
+
+pub trait MyFnOnce {
+    type Output;
+
+    fn call_my_fn_once(self) -> Self::Output;
+}
+
+pub struct WrapFnOnce<F>(F);
+
+impl<F: FnOnce() -> D, D: MyFnOnce> MyFnOnce for WrapFnOnce<F> {
+    type Output = D::Output;
+
+    fn call_my_fn_once(self) -> Self::Output {
+        D::call_my_fn_once(self.0())
+    }
+}
+
+impl<F: FnOnce() -> D, D: MyFnOnce> MyFnOnce for F {
+    type Output = D::Output;
+
+    fn call_my_fn_once(self) -> Self::Output {
+        D::call_my_fn_once(self())
+    }
+}
+
+pub fn my_fn_1() -> impl MyFnOnce {
+    my_fn_2
+}
+
+pub fn my_fn_2() -> impl MyFnOnce {
+    WrapFnOnce(my_fn_1)
+}
+
+fn main() {
+    let v = my_fn_1();
+
+    let _ = v.call_my_fn_once();
+}
diff --git a/tests/ui/impl-trait/failed-to-resolve-instance-ice-105488.stderr b/tests/ui/impl-trait/failed-to-resolve-instance-ice-105488.stderr
new file mode 100644
index 00000000000..c2782b79d90
--- /dev/null
+++ b/tests/ui/impl-trait/failed-to-resolve-instance-ice-105488.stderr
@@ -0,0 +1,16 @@
+error[E0275]: overflow evaluating the requirement `fn() -> impl MyFnOnce {my_fn_2}: MyFnOnce`
+   |
+   = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`failed_to_resolve_instance_ice_105488`)
+note: required for `WrapFnOnce<fn() -> impl MyFnOnce {my_fn_1}>` to implement `MyFnOnce`
+  --> $DIR/failed-to-resolve-instance-ice-105488.rs:14:37
+   |
+LL | impl<F: FnOnce() -> D, D: MyFnOnce> MyFnOnce for WrapFnOnce<F> {
+   |                           --------  ^^^^^^^^     ^^^^^^^^^^^^^
+   |                           |
+   |                           unsatisfied trait bound introduced here
+   = note: 126 redundant requirements hidden
+   = note: required for `WrapFnOnce<fn() -> impl MyFnOnce {my_fn_1}>` to implement `MyFnOnce`
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0275`.