diff options
| author | Dylan DPC <dylan.dpc@gmail.com> | 2020-05-27 03:09:15 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-27 03:09:15 +0200 |
| commit | 2b3b115a4deac7b8c72d0028576cd4c6dbf036d8 (patch) | |
| tree | 781f39b8b4593661c710b6b39e8924c9871e1ac3 | |
| parent | 8f95dc8d4e31f24185db831fc92b7d5752ba9d7f (diff) | |
| parent | 4e4b1edda850157ea2e65b97ed77b2bef934cb85 (diff) | |
Rollup merge of #72548 - rossmacarthur:add-mcve-for-50687, r=nikomatsakis
Add test for old compiler ICE when using `Borrow` The original issue was caused by implementing `Borrow` on a local type and using the tokio-reactor crate which had this impl: https://github.com/tokio-rs/tokio/blob/tokio-0.1.4/tokio-reactor/src/poll_evented.rs#L547-L577 This causes an ICE on Rust 1.27.0: ```console $ RUSTUP_TOOLCHAIN=1.27.0 rustc src/test/ui/issues/issue-50687-ice-on-borrow.rs error: internal compiler error: librustc/traits/structural_impls.rs:180: impossible case reached thread 'main' panicked at 'Box<Any>', librustc_errors/lib.rs:554:9 note: Run with `RUST_BACKTRACE=1` for a backtrace. error: aborting due to previous error note: the compiler unexpectedly panicked. this is a bug. note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports note: rustc 1.27.0 (3eda71b00 2018-06-19) running on x86_64-apple-darwin ``` Closes #50687
| -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`. |
