2022-10-06 07:44:38 +00:00
#![ warn(clippy::box_default) ]
2024-03-31 13:22:04 +00:00
#![ allow(clippy::boxed_local, clippy::default_constructed_unit_structs) ]
2022-10-06 07:44:38 +00:00
#[ derive(Default) ]
struct ImplementsDefault ;
struct OwnDefault ;
impl OwnDefault {
fn default ( ) -> Self {
Self
}
}
2024-03-31 13:22:04 +00:00
macro_rules ! default {
( ) = > {
Default ::default ( )
} ;
}
macro_rules ! string_new {
( ) = > {
String ::new ( )
} ;
}
macro_rules ! box_new {
( $e :expr ) = > {
Box ::new ( $e )
2022-10-06 07:44:38 +00:00
} ;
}
fn main ( ) {
2024-03-31 13:22:04 +00:00
let string1 : Box < String > = Box ::new ( Default ::default ( ) ) ;
let string2 : Box < String > = Box ::new ( String ::new ( ) ) ;
let impl1 : Box < ImplementsDefault > = Box ::new ( Default ::default ( ) ) ;
let vec : Box < Vec < u8 > > = Box ::new ( Vec ::new ( ) ) ;
let byte : Box < u8 > = Box ::new ( u8 ::default ( ) ) ;
let vec2 : Box < Vec < ImplementsDefault > > = Box ::new ( vec! [ ] ) ;
let vec3 : Box < Vec < bool > > = Box ::new ( Vec ::from ( [ ] ) ) ;
let plain_default = Box ::new ( Default ::default ( ) ) ;
let _ : Box < String > = plain_default ;
let _ : Box < String > = Box ::new ( default! ( ) ) ;
let _ : Box < String > = Box ::new ( string_new! ( ) ) ;
let _ : Box < String > = box_new! ( Default ::default ( ) ) ;
let _ : Box < String > = box_new! ( String ::new ( ) ) ;
let _ : Box < String > = box_new! ( default! ( ) ) ;
let _ : Box < String > = box_new! ( string_new! ( ) ) ;
let own : Box < OwnDefault > = Box ::new ( OwnDefault ::default ( ) ) ; // should not lint
// Do not suggest where a turbofish would be required
let impl2 = Box ::new ( ImplementsDefault ::default ( ) ) ;
let impl3 = Box ::new ( < ImplementsDefault as Default > ::default ( ) ) ;
let vec4 : Box < _ > = Box ::new ( Vec ::from ( [ false ; 0 ] ) ) ;
let more = ret_ty_fn ( ) ;
2022-10-23 13:18:45 +00:00
call_ty_fn ( Box ::new ( u8 ::default ( ) ) ) ;
2023-02-26 00:08:29 +00:00
issue_10381 ( ) ;
2023-05-20 13:39:26 +00:00
// `Box::<Option<_>>::default()` would be valid here, but not `Box::default()` or
2023-09-09 06:36:50 +00:00
// `Box::<Option<{closure@...}>::default()`
2023-05-20 13:39:26 +00:00
//
// Would have a suggestion after https://github.com/rust-lang/rust/blob/fdd030127cc68afec44a8d3f6341525dd34e50ae/compiler/rustc_middle/src/ty/diagnostics.rs#L554-L563
let mut unnameable = Box ::new ( Option ::default ( ) ) ;
let _ = unnameable . insert ( | | { } ) ;
2022-10-23 13:18:45 +00:00
}
fn ret_ty_fn ( ) -> Box < bool > {
2024-03-31 13:22:04 +00:00
Box ::new ( bool ::default ( ) ) // Could lint, currently doesn't
2022-10-23 13:18:45 +00:00
}
fn call_ty_fn ( _b : Box < u8 > ) {
issue_9621_dyn_trait ( ) ;
}
use std ::io ::{ Read , Result } ;
impl Read for ImplementsDefault {
fn read ( & mut self , _ : & mut [ u8 ] ) -> Result < usize > {
Ok ( 0 )
}
}
fn issue_9621_dyn_trait ( ) {
let _ : Box < dyn Read > = Box ::new ( ImplementsDefault ::default ( ) ) ;
2023-01-12 18:48:13 +00:00
issue_10089 ( ) ;
}
fn issue_10089 ( ) {
let _closure = | | {
#[ derive(Default) ]
struct WeirdPathed ;
let _ = Box ::new ( WeirdPathed ::default ( ) ) ;
} ;
2022-10-06 07:44:38 +00:00
}
2023-02-26 00:08:29 +00:00
fn issue_10381 ( ) {
#[ derive(Default) ]
pub struct Foo { }
pub trait Bar { }
impl Bar for Foo { }
fn maybe_get_bar ( i : u32 ) -> Option < Box < dyn Bar > > {
if i % 2 = = 0 {
Some ( Box ::new ( Foo ::default ( ) ) )
} else {
None
}
}
assert! ( maybe_get_bar ( 2 ) . is_some ( ) ) ;
}
2023-11-26 17:11:50 +00:00
2024-02-26 11:58:41 +00:00
// Issue #11927: The quickfix for the `Box::new` suggests replacing with `Box::<Inner>::default()`,
// removing the `outer::` segment.
fn issue_11927 ( ) {
mod outer {
#[ derive(Default) ]
pub struct Inner {
_i : usize ,
}
}
fn foo ( ) {
let _b = Box ::new ( outer ::Inner ::default ( ) ) ;
let _b = Box ::new ( std ::collections ::HashSet ::< i32 > ::new ( ) ) ;
}
}