about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2020-10-15 08:35:45 +0900
committerYuki Okushi <huyuumi.dev@gmail.com>2020-10-18 07:57:24 +0900
commitc266c07453afe4d7c0f1b3bd96fdb202e23810f0 (patch)
treed7f89ee9abfb6e47569157678ad92e24f78b9150
parent11a188a194b0f62945e8bfb76534f7198e08effe (diff)
downloadrust-c266c07453afe4d7c0f1b3bd96fdb202e23810f0.tar.gz
rust-c266c07453afe4d7c0f1b3bd96fdb202e23810f0.zip
Add test for issue-71659
-rw-r--r--src/test/ui/unsized/issue-71659.rs94
-rw-r--r--src/test/ui/unsized/issue-71659.stderr9
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`.