| #![feature(plugin, box_syntax)] |
| #![plugin(clippy)] |
| #![allow(warnings, clippy)] |
| |
| #![deny(boxed_local)] |
| |
| #[derive(Clone)] |
| struct A; |
| |
| impl A { |
| fn foo(&self){} |
| } |
| |
| trait Z { |
| fn bar(&self); |
| } |
| |
| impl Z for A { |
| fn bar(&self) { |
| //nothing |
| } |
| } |
| |
| fn main() { |
| } |
| |
| fn ok_box_trait(boxed_trait: &Box<Z>) { |
| let boxed_local = boxed_trait; |
| // done |
| } |
| |
| fn warn_call() { |
| let x = box A; //~ ERROR local variable |
| x.foo(); |
| } |
| |
| fn warn_arg(x: Box<A>) { //~ ERROR local variable |
| x.foo(); |
| } |
| |
| fn nowarn_closure_arg() { |
| let x = Some(box A); |
| x.map_or((), |x| take_ref(&x)); |
| } |
| |
| fn warn_rename_call() { |
| let x = box A; |
| |
| let y = x; //~ ERROR local variable |
| y.foo(); // via autoderef |
| } |
| |
| fn warn_notuse() { |
| let bz = box A; //~ ERROR local variable |
| } |
| |
| fn warn_pass() { |
| let bz = box A; //~ ERROR local variable |
| take_ref(&bz); // via deref coercion |
| } |
| |
| fn nowarn_return() -> Box<A> { |
| let fx = box A; |
| fx // moved out, "escapes" |
| } |
| |
| fn nowarn_move() { |
| let bx = box A; |
| drop(bx) // moved in, "escapes" |
| } |
| fn nowarn_call() { |
| let bx = box A; |
| bx.clone(); // method only available to Box, not via autoderef |
| } |
| |
| fn nowarn_pass() { |
| let bx = box A; |
| take_box(&bx); // fn needs &Box |
| } |
| |
| |
| fn take_box(x: &Box<A>) {} |
| fn take_ref(x: &A) {} |
| |
| |
| fn nowarn_ref_take() { |
| // false positive, should actually warn |
| let x = box A; //~ ERROR local variable |
| let y = &x; |
| take_box(y); |
| } |
| |
| fn nowarn_match() { |
| let x = box A; // moved into a match |
| match x { |
| y => drop(y) |
| } |
| } |
| |
| fn warn_match() { |
| let x = box A; //~ ERROR local variable |
| match &x { // not moved |
| ref y => () |
| } |
| } |