| //! Regression test for destructuring trait references (`&dyn T`/`Box<dyn T>`). |
| //! Checks cases where number of `&`/`Box` patterns (n) matches/doesn't match references (m). |
| //! |
| //! Issue: https://github.com/rust-lang/rust/issues/15031 |
| |
| #![feature(box_patterns)] |
| |
| trait T { |
| fn foo(&self) {} |
| } |
| |
| impl T for isize {} |
| |
| fn main() { |
| // Valid cases: n < m (can dereference) |
| let &x = &(&1isize as &dyn T); |
| let &x = &&(&1isize as &dyn T); |
| let &&x = &&(&1isize as &dyn T); |
| |
| // Error cases: n == m (cannot dereference trait object) |
| let &x = &1isize as &dyn T; //~ ERROR type `&dyn T` cannot be dereferenced |
| let &&x = &(&1isize as &dyn T); //~ ERROR type `&dyn T` cannot be dereferenced |
| let box x = Box::new(1isize) as Box<dyn T>; //~ ERROR type `Box<dyn T>` cannot be dereferenced |
| |
| // Error cases: n > m (type mismatch) |
| let &&x = &1isize as &dyn T; //~ ERROR mismatched types |
| let &&&x = &(&1isize as &dyn T); //~ ERROR mismatched types |
| let box box x = Box::new(1isize) as Box<dyn T>; //~ ERROR mismatched types |
| } |