//! Regression test for destructuring trait references (`&dyn T`/`Box`). //! 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; //~ ERROR type `Box` 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; //~ ERROR mismatched types }