| #![deny(clippy::borrowed_box)] | |
| #![allow(dead_code, unused_variables)] | |
| #![allow( | |
| clippy::uninlined_format_args, | |
| clippy::disallowed_names, | |
| clippy::needless_pass_by_ref_mut, | |
| clippy::needless_lifetimes | |
| )] | |
| use std::fmt::Display; | |
| pub fn test1(foo: &mut Box<bool>) { | |
| // Although this function could be changed to "&mut bool", | |
| // avoiding the Box, mutable references to boxes are not | |
| // flagged by this lint. | |
| // | |
| // This omission is intentional: By passing a mutable Box, | |
| // the memory location of the pointed-to object could be | |
| // modified. By passing a mutable reference, the contents | |
| // could change, but not the location. | |
| println!("{:?}", foo) | |
| } | |
| pub fn test2() { | |
| let foo: &bool; | |
| //~^ borrowed_box | |
| } | |
| struct Test3<'a> { | |
| foo: &'a bool, | |
| //~^ borrowed_box | |
| } | |
| trait Test4 { | |
| fn test4(a: &bool); | |
| //~^ borrowed_box | |
| } | |
| use std::any::Any; | |
| pub fn test5(foo: &mut Box<dyn Any>) { | |
| println!("{:?}", foo) | |
| } | |
| pub fn test6() { | |
| let foo: &Box<dyn Any>; | |
| } | |
| struct Test7<'a> { | |
| foo: &'a Box<dyn Any>, | |
| } | |
| trait Test8 { | |
| fn test8(a: &Box<dyn Any>); | |
| } | |
| impl<'a> Test8 for Test7<'a> { | |
| fn test8(a: &Box<dyn Any>) { | |
| unimplemented!(); | |
| } | |
| } | |
| pub fn test9(foo: &mut Box<dyn Any + Send + Sync>) { | |
| let _ = foo; | |
| } | |
| pub fn test10() { | |
| let foo: &Box<dyn Any + Send + 'static>; | |
| } | |
| struct Test11<'a> { | |
| foo: &'a Box<dyn Any + Send>, | |
| } | |
| trait Test12 { | |
| fn test4(a: &Box<dyn Any + 'static>); | |
| } | |
| impl<'a> Test12 for Test11<'a> { | |
| fn test4(a: &Box<dyn Any + 'static>) { | |
| unimplemented!(); | |
| } | |
| } | |
| pub fn test13(boxed_slice: &mut Box<[i32]>) { | |
| // Unconditionally replaces the box pointer. | |
| // | |
| // This cannot be accomplished if "&mut [i32]" is passed, | |
| // and provides a test case where passing a reference to | |
| // a Box is valid. | |
| let mut data = vec![12]; | |
| *boxed_slice = data.into_boxed_slice(); | |
| } | |
| // The suggestion should include proper parentheses to avoid a syntax error. | |
| pub fn test14(_display: &dyn Display) {} | |
| //~^ borrowed_box | |
| pub fn test15(_display: &(dyn Display + Send)) {} | |
| //~^ borrowed_box | |
| pub fn test16<'a>(_display: &'a (dyn Display + 'a)) {} | |
| //~^ borrowed_box | |
| pub fn test17(_display: &impl Display) {} | |
| //~^ borrowed_box | |
| pub fn test18(_display: &(impl Display + Send)) {} | |
| //~^ borrowed_box | |
| pub fn test19<'a>(_display: &'a (impl Display + 'a)) {} | |
| //~^ borrowed_box | |
| // This exists only to check what happens when parentheses are already present. | |
| // Even though the current implementation doesn't put extra parentheses, | |
| // it's fine that unnecessary parentheses appear in the future for some reason. | |
| pub fn test20(_display: &(dyn Display + Send)) {} | |
| //~^ borrowed_box | |
| #[allow(clippy::borrowed_box)] | |
| trait Trait { | |
| fn f(b: &Box<bool>); | |
| } | |
| // Trait impls are not linted | |
| impl Trait for () { | |
| fn f(_: &Box<bool>) {} | |
| } | |
| fn main() { | |
| test1(&mut Box::new(false)); | |
| test2(); | |
| test5(&mut (Box::new(false) as Box<dyn Any>)); | |
| test6(); | |
| test9(&mut (Box::new(false) as Box<dyn Any + Send + Sync>)); | |
| test10(); | |
| } |