about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorRoss MacArthur <ross@macarthur.io>2020-05-25 09:23:00 +0200
committerRoss MacArthur <ross@macarthur.io>2020-05-25 09:23:00 +0200
commit4e4b1edda850157ea2e65b97ed77b2bef934cb85 (patch)
tree34d36bce412d2140cdbf101e49594eeeec5b2e10 /src
parent7b657d340d715f48449189fea9d032350323a13f (diff)
downloadrust-4e4b1edda850157ea2e65b97ed77b2bef934cb85.tar.gz
rust-4e4b1edda850157ea2e65b97ed77b2bef934cb85.zip
Add test for old compiler ICE when using `Borrow`
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/issues/issue-50687-ice-on-borrow.rs41
-rw-r--r--src/test/ui/issues/issue-50687-ice-on-borrow.stderr16
2 files changed, 57 insertions, 0 deletions
diff --git a/src/test/ui/issues/issue-50687-ice-on-borrow.rs b/src/test/ui/issues/issue-50687-ice-on-borrow.rs
new file mode 100644
index 00000000000..7a8a12c2a93
--- /dev/null
+++ b/src/test/ui/issues/issue-50687-ice-on-borrow.rs
@@ -0,0 +1,41 @@
+// This previously caused an ICE at:
+// librustc/traits/structural_impls.rs:180: impossible case reached
+
+#![no_main]
+
+use std::borrow::Borrow;
+use std::io;
+use std::io::Write;
+
+trait Constraint {}
+
+struct Container<T> {
+    t: T,
+}
+
+struct Borrowed;
+struct Owned;
+
+impl<'a, T> Write for &'a Container<T>
+where
+    T: Constraint,
+    &'a T: Write,
+{
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        Ok(buf.len())
+    }
+
+    fn flush(&mut self) -> io::Result<()> {
+        Ok(())
+    }
+}
+
+impl Borrow<Borrowed> for Owned {
+    fn borrow(&self) -> &Borrowed {
+        &Borrowed
+    }
+}
+
+fn func(owned: Owned) {
+    let _: () = Borrow::borrow(&owned); //~ ERROR mismatched types
+}
diff --git a/src/test/ui/issues/issue-50687-ice-on-borrow.stderr b/src/test/ui/issues/issue-50687-ice-on-borrow.stderr
new file mode 100644
index 00000000000..f6adfc87dad
--- /dev/null
+++ b/src/test/ui/issues/issue-50687-ice-on-borrow.stderr
@@ -0,0 +1,16 @@
+error[E0308]: mismatched types
+  --> $DIR/issue-50687-ice-on-borrow.rs:40:17
+   |
+LL |     let _: () = Borrow::borrow(&owned);
+   |            --   ^^^^^^^^^^^^^^^^^^^^^^
+   |            |    |
+   |            |    expected `()`, found reference
+   |            |    help: consider dereferencing the borrow: `*Borrow::borrow(&owned)`
+   |            expected due to this
+   |
+   = note: expected unit type `()`
+              found reference `&_`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.