From 7c43bc037894a0356ebce914d05674e3180611f8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Matthias=20Kr=C3=BCger?= <matthias.krueger@famsik.de>
Date: Sun, 7 Apr 2024 00:48:47 +0200
Subject: [PATCH] add test for  ICE: failed to resolve instance for <fn() ->
 impl ...> #123145

Fixes https://github.com/rust-lang/rust/issues/123145
---
 .../failed-to-resolve-instance-ice-123145.rs  | 20 +++++++++++++++++++
 ...iled-to-resolve-instance-ice-123145.stderr | 15 ++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 tests/ui/impl-trait/failed-to-resolve-instance-ice-123145.rs
 create mode 100644 tests/ui/impl-trait/failed-to-resolve-instance-ice-123145.stderr

diff --git a/tests/ui/impl-trait/failed-to-resolve-instance-ice-123145.rs b/tests/ui/impl-trait/failed-to-resolve-instance-ice-123145.rs
new file mode 100644
index 00000000000..977827f3b55
--- /dev/null
+++ b/tests/ui/impl-trait/failed-to-resolve-instance-ice-123145.rs
@@ -0,0 +1,20 @@
+// ICE failed to resolve instance for ...
+// issue: rust-lang/rust#123145
+//@ build-fail
+//~^^^ ERROR overflow evaluating the requirement `(fn() -> impl Handler
+
+trait Handler {
+    fn handle(&self) {}
+}
+
+impl<H: Handler, F: Fn() -> H> Handler for F {}
+
+impl<L: Handler> Handler for (L,) {}
+
+fn one() -> impl Handler {
+    (one,)
+}
+
+fn main() {
+    one.handle();
+}
diff --git a/tests/ui/impl-trait/failed-to-resolve-instance-ice-123145.stderr b/tests/ui/impl-trait/failed-to-resolve-instance-ice-123145.stderr
new file mode 100644
index 00000000000..f61e8c2f8df
--- /dev/null
+++ b/tests/ui/impl-trait/failed-to-resolve-instance-ice-123145.stderr
@@ -0,0 +1,15 @@
+error[E0275]: overflow evaluating the requirement `(fn() -> impl Handler {one},): Handler`
+   |
+note: required for `fn() -> impl Handler {one}` to implement `Handler`
+  --> $DIR/failed-to-resolve-instance-ice-123145.rs:10:32
+   |
+LL | impl<H: Handler, F: Fn() -> H> Handler for F {}
+   |         -------                ^^^^^^^     ^
+   |         |
+   |         unsatisfied trait bound introduced here
+   = note: 2 redundant requirements hidden
+   = note: required for `fn() -> impl Handler {one}` to implement `Handler`
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0275`.