File tree 4 files changed +21
-12
lines changed
4 files changed +21
-12
lines changed Original file line number Diff line number Diff line change 9
9
test( attr( deny( warnings) ) )
10
10
) ]
11
11
#![ feature( box_patterns) ]
12
+ #![ feature( const_default_impls) ]
13
+ #![ feature( const_trait_impl) ]
12
14
#![ feature( crate_visibility_modifier) ]
13
15
#![ feature( if_let_guard) ]
14
16
#![ 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> {
128
128
129
129
impl < T > P < [ T ] > {
130
130
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 ( ) }
139
132
}
140
133
141
134
#[ inline( never) ]
Original file line number Diff line number Diff line change @@ -1192,17 +1192,25 @@ impl<T: Default> Default for Box<T> {
1192
1192
1193
1193
#[ cfg( not( no_global_oom_handling) ) ]
1194
1194
#[ 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 ] > {
1196
1197
fn default ( ) -> Self {
1197
- Box :: < [ T ; 0 ] > :: new ( [ ] )
1198
+ let ptr: Unique < [ T ] > = Unique :: < [ T ; 0 ] > :: dangling ( ) ;
1199
+ Box ( ptr, Global )
1198
1200
}
1199
1201
}
1200
1202
1201
1203
#[ cfg( not( no_global_oom_handling) ) ]
1202
1204
#[ 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 > {
1204
1207
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 )
1206
1214
}
1207
1215
}
1208
1216
Original file line number Diff line number Diff line change @@ -6,6 +6,9 @@ pub const MY_VEC2: Vec<usize> = Default::default();
6
6
pub const MY_STRING : String = String :: new ( ) ;
7
7
pub const MY_STRING2 : String = Default :: default ( ) ;
8
8
9
+ pub const MY_BOXED_SLICE : Box < [ usize ] > = Default :: default ( ) ;
10
+ pub const MY_BOXED_STR : Box < str > = Default :: default ( ) ;
11
+
9
12
use std:: collections:: { BTreeMap , BTreeSet } ;
10
13
11
14
pub const MY_BTREEMAP : BTreeMap < usize , usize > = BTreeMap :: new ( ) ;
@@ -23,6 +26,9 @@ fn test_const() {
23
26
assert_eq ! ( MY_VEC , MY_VEC2 ) ;
24
27
assert_eq ! ( MY_STRING , MY_STRING2 ) ;
25
28
29
+ assert_eq ! ( MY_VEC , * MY_BOXED_SLICE ) ;
30
+ assert_eq ! ( MY_STRING , * MY_BOXED_STR ) ;
31
+
26
32
assert_eq ! ( MAP_LEN , 0 ) ;
27
33
assert_eq ! ( SET_LEN , 0 ) ;
28
34
assert ! ( MAP_IS_EMPTY && SET_IS_EMPTY ) ;
You can’t perform that action at this time.
0 commit comments