@@ -157,9 +157,10 @@ impl Layout {
157157     /// allocate backing structure for `T` (which could be a trait 
158158     /// or other unsized type like a slice). 
159159     #[ stable( feature = "alloc_layout" ,  since = "1.28.0" ) ]  
160+     #[ rustc_const_unstable( feature = "const_alloc_layout" ,  issue = "67521" ) ]  
160161    #[ must_use]  
161162    #[ inline]  
162-     pub  fn  for_value < T :  ?Sized > ( t :  & T )  -> Self  { 
163+     pub  const   fn  for_value < T :  ?Sized > ( t :  & T )  -> Self  { 
163164        let  ( size,  align)  = ( mem:: size_of_val ( t) ,  mem:: align_of_val ( t) ) ; 
164165        // SAFETY: see rationale in `new` for why this is using the unsafe variant 
165166        unsafe  {  Layout :: from_size_align_unchecked ( size,  align)  } 
@@ -191,8 +192,9 @@ impl Layout {
191192     /// [trait object]: ../../book/ch17-02-trait-objects.html 
192193     /// [extern type]: ../../unstable-book/language-features/extern-types.html 
193194     #[ unstable( feature = "layout_for_ptr" ,  issue = "69835" ) ]  
195+     #[ rustc_const_unstable( feature = "const_alloc_layout" ,  issue = "67521" ) ]  
194196    #[ must_use]  
195-     pub  unsafe  fn  for_value_raw < T :  ?Sized > ( t :  * const  T )  -> Self  { 
197+     pub  const   unsafe  fn  for_value_raw < T :  ?Sized > ( t :  * const  T )  -> Self  { 
196198        // SAFETY: we pass along the prerequisites of these functions to the caller 
197199        let  ( size,  align)  = unsafe  {  ( mem:: size_of_val_raw ( t) ,  mem:: align_of_val_raw ( t) )  } ; 
198200        // SAFETY: see rationale in `new` for why this is using the unsafe variant 
@@ -229,8 +231,9 @@ impl Layout {
229231     /// Returns an error if the combination of `self.size()` and the given 
230232     /// `align` violates the conditions listed in [`Layout::from_size_align`]. 
231233     #[ stable( feature = "alloc_layout_manipulation" ,  since = "1.44.0" ) ]  
234+     #[ rustc_const_unstable( feature = "const_alloc_layout" ,  issue = "67521" ) ]  
232235    #[ inline]  
233-     pub  fn  align_to ( & self ,  align :  usize )  -> Result < Self ,  LayoutError >  { 
236+     pub  const   fn  align_to ( & self ,  align :  usize )  -> Result < Self ,  LayoutError >  { 
234237        Layout :: from_size_align ( self . size ( ) ,  cmp:: max ( self . align ( ) ,  align) ) 
235238    } 
236239
@@ -287,10 +290,11 @@ impl Layout {
287290     /// This is equivalent to adding the result of `padding_needed_for` 
288291     /// to the layout's current size. 
289292     #[ stable( feature = "alloc_layout_manipulation" ,  since = "1.44.0" ) ]  
293+     #[ rustc_const_unstable( feature = "const_alloc_layout" ,  issue = "67521" ) ]  
290294    #[ must_use = "this returns a new `Layout`, \   
291295                   without modifying the original"] 
292296    #[ inline]  
293-     pub  fn  pad_to_align ( & self )  -> Layout  { 
297+     pub  const   fn  pad_to_align ( & self )  -> Layout  { 
294298        let  pad = self . padding_needed_for ( self . align ( ) ) ; 
295299        // This cannot overflow. Quoting from the invariant of Layout: 
296300        // > `size`, when rounded up to the nearest multiple of `align`, 
@@ -311,8 +315,9 @@ impl Layout {
311315     /// 
312316     /// On arithmetic overflow, returns `LayoutError`. 
313317     #[ unstable( feature = "alloc_layout_extra" ,  issue = "55724" ) ]  
318+     #[ rustc_const_unstable( feature = "const_alloc_layout" ,  issue = "67521" ) ]  
314319    #[ inline]  
315-     pub  fn  repeat ( & self ,  n :  usize )  -> Result < ( Self ,  usize ) ,  LayoutError >  { 
320+     pub  const   fn  repeat ( & self ,  n :  usize )  -> Result < ( Self ,  usize ) ,  LayoutError >  { 
316321        // This cannot overflow. Quoting from the invariant of Layout: 
317322        // > `size`, when rounded up to the nearest multiple of `align`, 
318323        // > must not overflow isize (i.e., the rounded value must be 
@@ -321,7 +326,8 @@ impl Layout {
321326        let  alloc_size = padded_size. checked_mul ( n) . ok_or ( LayoutError ) ?; 
322327
323328        // The safe constructor is called here to enforce the isize size limit. 
324-         Layout :: from_size_alignment ( alloc_size,  self . align ) . map ( |layout| ( layout,  padded_size) ) 
329+         let  layout = Layout :: from_size_alignment ( alloc_size,  self . align ) ?; 
330+         Ok ( ( layout,  padded_size) ) 
325331    } 
326332
327333    /// Creates a layout describing the record for `self` followed by 
@@ -370,8 +376,9 @@ impl Layout {
370376     /// # assert_eq!(repr_c(&[u64, u32, u16, u32]), Ok((s, vec![0, 8, 12, 16]))); 
371377     /// ``` 
372378     #[ stable( feature = "alloc_layout_manipulation" ,  since = "1.44.0" ) ]  
379+     #[ rustc_const_unstable( feature = "const_alloc_layout" ,  issue = "67521" ) ]  
373380    #[ inline]  
374-     pub  fn  extend ( & self ,  next :  Self )  -> Result < ( Self ,  usize ) ,  LayoutError >  { 
381+     pub  const   fn  extend ( & self ,  next :  Self )  -> Result < ( Self ,  usize ) ,  LayoutError >  { 
375382        let  new_align = cmp:: max ( self . align ,  next. align ) ; 
376383        let  pad = self . padding_needed_for ( next. align ( ) ) ; 
377384
@@ -396,8 +403,9 @@ impl Layout {
396403     /// 
397404     /// On arithmetic overflow, returns `LayoutError`. 
398405     #[ unstable( feature = "alloc_layout_extra" ,  issue = "55724" ) ]  
406+     #[ rustc_const_unstable( feature = "const_alloc_layout" ,  issue = "67521" ) ]  
399407    #[ inline]  
400-     pub  fn  repeat_packed ( & self ,  n :  usize )  -> Result < Self ,  LayoutError >  { 
408+     pub  const   fn  repeat_packed ( & self ,  n :  usize )  -> Result < Self ,  LayoutError >  { 
401409        let  size = self . size ( ) . checked_mul ( n) . ok_or ( LayoutError ) ?; 
402410        // The safe constructor is called here to enforce the isize size limit. 
403411        Layout :: from_size_alignment ( size,  self . align ) 
@@ -410,8 +418,9 @@ impl Layout {
410418     /// 
411419     /// On arithmetic overflow, returns `LayoutError`. 
412420     #[ unstable( feature = "alloc_layout_extra" ,  issue = "55724" ) ]  
421+     #[ rustc_const_unstable( feature = "const_alloc_layout" ,  issue = "67521" ) ]  
413422    #[ inline]  
414-     pub  fn  extend_packed ( & self ,  next :  Self )  -> Result < Self ,  LayoutError >  { 
423+     pub  const   fn  extend_packed ( & self ,  next :  Self )  -> Result < Self ,  LayoutError >  { 
415424        let  new_size = self . size ( ) . checked_add ( next. size ( ) ) . ok_or ( LayoutError ) ?; 
416425        // The safe constructor is called here to enforce the isize size limit. 
417426        Layout :: from_size_alignment ( new_size,  self . align ) 
@@ -422,13 +431,18 @@ impl Layout {
422431     /// On arithmetic overflow or when the total size would exceed 
423432     /// `isize::MAX`, returns `LayoutError`. 
424433     #[ stable( feature = "alloc_layout_manipulation" ,  since = "1.44.0" ) ]  
434+     #[ rustc_const_unstable( feature = "const_alloc_layout" ,  issue = "67521" ) ]  
425435    #[ inline]  
426-     pub  fn  array < T > ( n :  usize )  -> Result < Self ,  LayoutError >  { 
436+     pub  const   fn  array < T > ( n :  usize )  -> Result < Self ,  LayoutError >  { 
427437        // Reduce the amount of code we need to monomorphize per `T`. 
428438        return  inner ( mem:: size_of :: < T > ( ) ,  Alignment :: of :: < T > ( ) ,  n) ; 
429439
430440        #[ inline]  
431-         fn  inner ( element_size :  usize ,  align :  Alignment ,  n :  usize )  -> Result < Layout ,  LayoutError >  { 
441+         const  fn  inner ( 
442+             element_size :  usize , 
443+             align :  Alignment , 
444+             n :  usize , 
445+         )  -> Result < Layout ,  LayoutError >  { 
432446            // We need to check two things about the size: 
433447            //  - That the total size won't overflow a `usize`, and 
434448            //  - That the total size still fits in an `isize`. 
0 commit comments