This repository was archived by the owner on May 28, 2025. It is now read-only.
File tree Expand file tree Collapse file tree 4 files changed +21
-12
lines changed Expand file tree Collapse file tree 4 files changed +21
-12
lines changed Original file line number Diff line number Diff line change 99 test( attr( deny( warnings) ) )
1010) ]
1111#![ feature( box_patterns) ]
12+ #![ feature( const_default_impls) ]
13+ #![ feature( const_trait_impl) ]
1214#![ feature( crate_visibility_modifier) ]
1315#![ feature( if_let_guard) ]
1416#![ feature( label_break_value) ]
Original file line number Diff line number Diff line change @@ -128,14 +128,7 @@ impl<S: Encoder, T: Encodable<S>> Encodable<S> for P<T> {
128128
129129impl < T > P < [ T ] > {
130130 pub const fn new ( ) -> P < [ T ] > {
131- // HACK(eddyb) bypass the lack of a `const fn` to create an empty `Box<[T]>`
132- // (as trait methods, `default` in this case, can't be `const fn` yet).
133- P {
134- ptr : unsafe {
135- use std:: ptr:: NonNull ;
136- std:: mem:: transmute ( NonNull :: < [ T ; 0 ] > :: dangling ( ) as NonNull < [ T ] > )
137- } ,
138- }
131+ P { ptr : Box :: default ( ) }
139132 }
140133
141134 #[ inline( never) ]
Original file line number Diff line number Diff line change @@ -1192,17 +1192,25 @@ impl<T: Default> Default for Box<T> {
11921192
11931193#[ cfg( not( no_global_oom_handling) ) ]
11941194#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1195- impl < T > Default for Box < [ T ] > {
1195+ #[ rustc_const_unstable( feature = "const_default_impls" , issue = "87864" ) ]
1196+ impl < T > const Default for Box < [ T ] > {
11961197 fn default ( ) -> Self {
1197- Box :: < [ T ; 0 ] > :: new ( [ ] )
1198+ let ptr: Unique < [ T ] > = Unique :: < [ T ; 0 ] > :: dangling ( ) ;
1199+ Box ( ptr, Global )
11981200 }
11991201}
12001202
12011203#[ cfg( not( no_global_oom_handling) ) ]
12021204#[ stable( feature = "default_box_extra" , since = "1.17.0" ) ]
1203- impl Default for Box < str > {
1205+ #[ rustc_const_unstable( feature = "const_default_impls" , issue = "87864" ) ]
1206+ impl const Default for Box < str > {
12041207 fn default ( ) -> Self {
1205- unsafe { from_boxed_utf8_unchecked ( Default :: default ( ) ) }
1208+ // SAFETY: This is the same as `Unique::cast<U>` but with an unsized `U = str`.
1209+ let ptr: Unique < str > = unsafe {
1210+ let bytes: Unique < [ u8 ] > = Unique :: < [ u8 ; 0 ] > :: dangling ( ) ;
1211+ Unique :: new_unchecked ( bytes. as_ptr ( ) as * mut str )
1212+ } ;
1213+ Box ( ptr, Global )
12061214 }
12071215}
12081216
Original file line number Diff line number Diff line change @@ -6,6 +6,9 @@ pub const MY_VEC2: Vec<usize> = Default::default();
66pub const MY_STRING : String = String :: new ( ) ;
77pub const MY_STRING2 : String = Default :: default ( ) ;
88
9+ pub const MY_BOXED_SLICE : Box < [ usize ] > = Default :: default ( ) ;
10+ pub const MY_BOXED_STR : Box < str > = Default :: default ( ) ;
11+
912use std:: collections:: { BTreeMap , BTreeSet } ;
1013
1114pub const MY_BTREEMAP : BTreeMap < usize , usize > = BTreeMap :: new ( ) ;
@@ -23,6 +26,9 @@ fn test_const() {
2326 assert_eq ! ( MY_VEC , MY_VEC2 ) ;
2427 assert_eq ! ( MY_STRING , MY_STRING2 ) ;
2528
29+ assert_eq ! ( MY_VEC , * MY_BOXED_SLICE ) ;
30+ assert_eq ! ( MY_STRING , * MY_BOXED_STR ) ;
31+
2632 assert_eq ! ( MAP_LEN , 0 ) ;
2733 assert_eq ! ( SET_LEN , 0 ) ;
2834 assert ! ( MAP_IS_EMPTY && SET_IS_EMPTY ) ;
You can’t perform that action at this time.
0 commit comments