From d2ea7e2059601fec28f39e250ecef9e160468f8d Mon Sep 17 00:00:00 2001
From: Oli Scherer <git-spam-no-reply9815368754983@oli-obk.de>
Date: Tue, 21 Jun 2022 08:47:02 +0000
Subject: [PATCH] Avoid an ICE and instead let the compiler report a useful
 error

---
 .../rustc_infer/src/infer/nll_relate/mod.rs    |  6 +++++-
 src/test/ui/issues/issue-98299.rs              | 18 ++++++++++++++++++
 src/test/ui/issues/issue-98299.stderr          |  9 +++++++++
 3 files changed, 32 insertions(+), 1 deletion(-)
 create mode 100644 src/test/ui/issues/issue-98299.rs
 create mode 100644 src/test/ui/issues/issue-98299.stderr

diff --git a/compiler/rustc_infer/src/infer/nll_relate/mod.rs b/compiler/rustc_infer/src/infer/nll_relate/mod.rs
index ebe156d081d32..846e7f7b92155 100644
--- a/compiler/rustc_infer/src/infer/nll_relate/mod.rs
+++ b/compiler/rustc_infer/src/infer/nll_relate/mod.rs
@@ -662,7 +662,11 @@ where
         match b.kind() {
             ty::ConstKind::Infer(InferConst::Var(_)) if D::forbid_inference_vars() => {
                 // Forbid inference variables in the RHS.
-                bug!("unexpected inference var {:?}", b)
+                self.infcx.tcx.sess.delay_span_bug(
+                    self.delegate.span(),
+                    format!("unexpected inference var {:?}", b,),
+                );
+                Ok(a)
             }
             // FIXME(invariance): see the related FIXME above.
             _ => self.infcx.super_combine_consts(self, a, b),
diff --git a/src/test/ui/issues/issue-98299.rs b/src/test/ui/issues/issue-98299.rs
new file mode 100644
index 0000000000000..63c058f91fc7c
--- /dev/null
+++ b/src/test/ui/issues/issue-98299.rs
@@ -0,0 +1,18 @@
+use std::convert::TryFrom;
+
+pub fn test_usage(p: ()) {
+    SmallCString::try_from(p).map(|cstr| cstr);
+    //~^ ERROR: type annotations needed
+}
+
+pub struct SmallCString<const N: usize> {}
+
+impl<const N: usize> TryFrom<()> for SmallCString<N> {
+    type Error = ();
+
+    fn try_from(path: ()) -> Result<Self, Self::Error> {
+        unimplemented!();
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/issues/issue-98299.stderr b/src/test/ui/issues/issue-98299.stderr
new file mode 100644
index 0000000000000..a61bffa91e784
--- /dev/null
+++ b/src/test/ui/issues/issue-98299.stderr
@@ -0,0 +1,9 @@
+error[E0282]: type annotations needed
+  --> $DIR/issue-98299.rs:4:5
+   |
+LL |     SmallCString::try_from(p).map(|cstr| cstr);
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type for enum `Result<SmallCString<{_: usize}>, ()>`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0282`.