summaryrefslogtreecommitdiffstats
path: root/src/test/ui/issues/issue-50687-ice-on-borrow.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/issues/issue-50687-ice-on-borrow.rs')
-rw-r--r--src/test/ui/issues/issue-50687-ice-on-borrow.rs41
1 files changed, 41 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 000000000..7a8a12c2a
--- /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
+}