Rollup merge of #72194 - doctorn:dispatch-from-dyn-ice, r=estebank
Don't ICE on missing `Unsize` impl
Previously code of the form
```rust
#![feature(unsize, dispatch_from_dyn)]
use std::marker::Unsize;
use std::ops::DispatchFromDyn;
pub struct Foo<'a, T: ?Sized> {
_inner: &'a &'a T,
}
impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Foo<'a, U>> for Foo<'a, T> {}
```
would generate an ICE due to the missing `Unsize` impl being run through the `suggest_change_mut` suggestion. This PR adds an early exit and a pointer to the appropriate docs regarding `Unsize` instead:
```
error[E0277]: the trait bound `&'a T: std::marker::Unsize<&'a U>` is not satisfied
--> src/test/ui/issues/issue-71036.rs:11:1
|
11 | impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Foo<'a, U>> for Foo<'a, T> {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Unsize<&'a U>` is not implemented for `&'a T`
|
= note: all implementations of `Unsize` are provided automatically by the compiler, see <https://doc.rust-lang.org/stable/std/marker/trait.Unsize.html> for more information
= note: required because of the requirements on the impl of `std::ops::DispatchFromDyn<&'a &'a U>` for `&'a &'a T`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0277`.
```
r? @estebank
Resolves #71036
This commit is contained in:
commit
7b5bc61e99
3 changed files with 52 additions and 6 deletions
17
src/test/ui/issues/issue-71036.rs
Normal file
17
src/test/ui/issues/issue-71036.rs
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
#![feature(unsize, dispatch_from_dyn)]
|
||||
|
||||
use std::marker::Unsize;
|
||||
use std::ops::DispatchFromDyn;
|
||||
|
||||
#[allow(unused)]
|
||||
struct Foo<'a, T: ?Sized> {
|
||||
_inner: &'a &'a T,
|
||||
}
|
||||
|
||||
impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Foo<'a, U>> for Foo<'a, T> {}
|
||||
//~^ ERROR the trait bound `&'a T: std::marker::Unsize<&'a U>` is not satisfied
|
||||
//~| NOTE the trait `std::marker::Unsize<&'a U>` is not implemented for `&'a T`
|
||||
//~| NOTE all implementations of `Unsize` are provided automatically by the compiler
|
||||
//~| NOTE required because of the requirements on the impl
|
||||
|
||||
fn main() {}
|
||||
12
src/test/ui/issues/issue-71036.stderr
Normal file
12
src/test/ui/issues/issue-71036.stderr
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
error[E0277]: the trait bound `&'a T: std::marker::Unsize<&'a U>` is not satisfied
|
||||
--> $DIR/issue-71036.rs:11:1
|
||||
|
|
||||
LL | impl<'a, T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Foo<'a, U>> for Foo<'a, T> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::marker::Unsize<&'a U>` is not implemented for `&'a T`
|
||||
|
|
||||
= note: all implementations of `Unsize` are provided automatically by the compiler, see <https://doc.rust-lang.org/stable/std/marker/trait.Unsize.html> for more information
|
||||
= note: required because of the requirements on the impl of `std::ops::DispatchFromDyn<&'a &'a U>` for `&'a &'a T`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue