diff options
| author | Yuki Okushi <huyuumi.dev@gmail.com> | 2020-10-15 08:35:45 +0900 |
|---|---|---|
| committer | Yuki Okushi <huyuumi.dev@gmail.com> | 2020-10-18 07:57:24 +0900 |
| commit | c266c07453afe4d7c0f1b3bd96fdb202e23810f0 (patch) | |
| tree | d7f89ee9abfb6e47569157678ad92e24f78b9150 | |
| parent | 11a188a194b0f62945e8bfb76534f7198e08effe (diff) | |
| download | rust-c266c07453afe4d7c0f1b3bd96fdb202e23810f0.tar.gz rust-c266c07453afe4d7c0f1b3bd96fdb202e23810f0.zip | |
Add test for issue-71659
| -rw-r--r-- | src/test/ui/unsized/issue-71659.rs | 94 | ||||
| -rw-r--r-- | src/test/ui/unsized/issue-71659.stderr | 9 |
2 files changed, 103 insertions, 0 deletions
diff --git a/src/test/ui/unsized/issue-71659.rs b/src/test/ui/unsized/issue-71659.rs new file mode 100644 index 00000000000..ef5ff19153e --- /dev/null +++ b/src/test/ui/unsized/issue-71659.rs @@ -0,0 +1,94 @@ +#![feature(unsize)] + +use std::marker::Unsize; +use std::rc::Rc; +use std::sync::Arc; + +pub trait CastTo<T: ?Sized>: Unsize<T> { + fn cast_to(&self) -> &T; + fn cast_mut_to(&mut self) -> &mut T; + fn into_cast_to(self: Box<Self>) -> Box<T>; + fn cast_rc_to(self: Rc<Self>) -> Rc<T>; + fn cast_arc_to(self: Arc<Self>) -> Arc<T>; +} + +impl<T: ?Sized> Cast for T {} +pub trait Cast { + fn cast<T: ?Sized>(&self) -> &T + where + Self: CastTo<T>, + { + self + } + + fn cast_mut<T>(&mut self) -> &mut T + where + Self: CastTo<T>, + { + self.cast_mut_to() + } + + fn into_cast<T>(self: Box<Self>) -> Box<T> + where + Self: CastTo<T>, + { + self.into_cast_to() + } + + fn cast_rc<T>(self: Rc<Self>) -> Rc<T> + where + Self: CastTo<T>, + { + self.cast_rc_to() + } + + fn cast_arc<T>(self: Arc<Self>) -> Arc<T> + where + Self: CastTo<T>, + { + self.cast_arc_to() + } +} +impl<T: ?Sized, U: ?Sized + Unsize<T>> CastTo<T> for U { + fn cast_to(&self) -> &T { + self + } + + fn cast_mut_to(&mut self) -> &mut T { + self + } + + fn into_cast_to(self: Box<Self>) -> Box<T> { + self + } + + fn cast_rc_to(self: Rc<Self>) -> Rc<T> { + self + } + + fn cast_arc_to(self: Arc<Self>) -> Arc<T> { + self + } +} + +pub trait Foo { + fn foo(&self) { + println!("Foo({})", core::any::type_name::<Self>()); + } +} + +pub trait Bar: CastTo<dyn Foo> + CastTo<dyn core::fmt::Debug> + CastTo<[i32]> { + fn bar(&self) { + println!("Bar({})", core::any::type_name::<Self>()); + } +} + +impl Foo for [i32; 10] {} +impl Bar for [i32; 10] {} + +fn main() { + let x = [0; 10]; + let x: Box<dyn Bar> = Box::new(x); + let x = (*x).cast::<[i32]>(); + //~^ ERROR: the trait bound `dyn Bar: CastTo<[i32]>` is not satisfied +} diff --git a/src/test/ui/unsized/issue-71659.stderr b/src/test/ui/unsized/issue-71659.stderr new file mode 100644 index 00000000000..5d23e991472 --- /dev/null +++ b/src/test/ui/unsized/issue-71659.stderr @@ -0,0 +1,9 @@ +error[E0277]: the trait bound `dyn Bar: CastTo<[i32]>` is not satisfied + --> $DIR/issue-71659.rs:92:18 + | +LL | let x = (*x).cast::<[i32]>(); + | ^^^^ the trait `CastTo<[i32]>` is not implemented for `dyn Bar` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. |
