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: Unsize { + fn cast_to(&self) -> &T; + fn cast_mut_to(&mut self) -> &mut T; + fn into_cast_to(self: Box) -> Box; + fn cast_rc_to(self: Rc) -> Rc; + fn cast_arc_to(self: Arc) -> Arc; +} + +impl Cast for T {} +pub trait Cast { + fn cast(&self) -> &T + where + Self: CastTo, + { + self + } + + fn cast_mut(&mut self) -> &mut T + where + Self: CastTo, + { + self.cast_mut_to() + } + + fn into_cast(self: Box) -> Box + where + Self: CastTo, + { + self.into_cast_to() + } + + fn cast_rc(self: Rc) -> Rc + where + Self: CastTo, + { + self.cast_rc_to() + } + + fn cast_arc(self: Arc) -> Arc + where + Self: CastTo, + { + self.cast_arc_to() + } +} +impl> CastTo for U { + fn cast_to(&self) -> &T { + self + } + + fn cast_mut_to(&mut self) -> &mut T { + self + } + + fn into_cast_to(self: Box) -> Box { + self + } + + fn cast_rc_to(self: Rc) -> Rc { + self + } + + fn cast_arc_to(self: Arc) -> Arc { + self + } +} + +pub trait Foo { + fn foo(&self) { + println!("Foo({})", core::any::type_name::()); + } +} + +pub trait Bar: CastTo + CastTo + CastTo<[i32]> { + fn bar(&self) { + println!("Bar({})", core::any::type_name::()); + } +} + +impl Foo for [i32; 10] {} +impl Bar for [i32; 10] {} + +fn main() { + let x = [0; 10]; + let x: Box = 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`.