@@ -354,6 +354,7 @@ impl<T: Ord, const N: usize> Ord for [T; N] {
354
354
}
355
355
356
356
/// This module implements `Default` for arrays.
357
+ #[ cfg( not( bootstrap) ) ]
357
358
mod default_impls {
358
359
// A trait implemented by all arrays which are either empty or contain a type implementing `Default`.
359
360
#[ unstable(
@@ -399,14 +400,37 @@ mod default_impls {
399
400
[ T ; N ] : ArrayDefault ,
400
401
{
401
402
fn default ( ) -> [ T ; N ] {
402
- assert_eq ! ( std :: mem:: size_of:: <[ ( ) ; N ] >( ) , 0 ) ;
403
+ assert_eq ! ( crate :: mem:: size_of:: <[ ( ) ; N ] >( ) , 0 ) ;
403
404
// SAFETY: it is always valid to use `zeroed` for zero-sized value.
404
- let arr: [ ( ) ; N ] = unsafe { std :: mem:: zeroed ( ) } ;
405
+ let arr: [ ( ) ; N ] = unsafe { crate :: mem:: zeroed ( ) } ;
405
406
arr. map ( |_unit| DefaultHack :: default_hack ( ) )
406
407
}
407
408
}
408
409
}
409
410
411
+ #[ cfg( bootstrap) ]
412
+ mod default_impls {
413
+ macro_rules! array_impl_default {
414
+ { $n: expr, $t: ident $( $ts: ident) * } => {
415
+ #[ stable( since = "1.4.0" , feature = "array_default" ) ]
416
+ impl <T > Default for [ T ; $n] where T : Default {
417
+ fn default ( ) -> [ T ; $n] {
418
+ [ $t:: default ( ) , $( $ts:: default ( ) ) ,* ]
419
+ }
420
+ }
421
+ array_impl_default!{ ( $n - 1 ) , $( $ts) * }
422
+ } ;
423
+ { $n: expr, } => {
424
+ #[ stable( since = "1.4.0" , feature = "array_default" ) ]
425
+ impl <T > Default for [ T ; $n] {
426
+ fn default ( ) -> [ T ; $n] { [ ] }
427
+ }
428
+ } ;
429
+ }
430
+
431
+ array_impl_default ! { 16 , T T T T T T T T T T T T T T T T }
432
+ }
433
+
410
434
411
435
#[ lang = "array" ]
412
436
impl < T , const N : usize > [ T ; N ] {
0 commit comments