diff options
| author | Ross MacArthur <ross@macarthur.io> | 2020-05-25 09:23:00 +0200 |
|---|---|---|
| committer | Ross MacArthur <ross@macarthur.io> | 2020-05-25 09:23:00 +0200 |
| commit | 4e4b1edda850157ea2e65b97ed77b2bef934cb85 (patch) | |
| tree | 34d36bce412d2140cdbf101e49594eeeec5b2e10 /src | |
| parent | 7b657d340d715f48449189fea9d032350323a13f (diff) | |
| download | rust-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.rs | 41 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-50687-ice-on-borrow.stderr | 16 |
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`. |
