133133#[ doc( alias = "&*" ) ]  
134134#[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
135135#[ rustc_diagnostic_item = "Deref" ]  
136+ #[ cfg_attr( not( bootstrap) ,  const_trait) ]  
136137pub  trait  Deref  { 
137138    /// The resulting type after dereferencing. 
138139     #[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
@@ -147,6 +148,7 @@ pub trait Deref {
147148    fn  deref ( & self )  -> & Self :: Target ; 
148149} 
149150
151+ #[ cfg( bootstrap) ]  
150152#[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
151153impl < T :  ?Sized >  Deref  for  & T  { 
152154    type  Target  = T ; 
@@ -157,9 +159,21 @@ impl<T: ?Sized> Deref for &T {
157159    } 
158160} 
159161
162+ #[ cfg( not( bootstrap) ) ]  
163+ #[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
164+ impl < T :  ?Sized >  const  Deref  for  & T  { 
165+     type  Target  = T ; 
166+ 
167+     #[ rustc_diagnostic_item = "noop_method_deref" ]  
168+     fn  deref ( & self )  -> & T  { 
169+         * self 
170+     } 
171+ } 
172+ 
160173#[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
161174impl < T :  ?Sized >  !DerefMut  for  & T  { } 
162175
176+ #[ cfg( bootstrap) ]  
163177#[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
164178impl < T :  ?Sized >  Deref  for  & mut  T  { 
165179    type  Target  = T ; 
@@ -169,6 +183,16 @@ impl<T: ?Sized> Deref for &mut T {
169183    } 
170184} 
171185
186+ #[ cfg( not( bootstrap) ) ]  
187+ #[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
188+ impl < T :  ?Sized >  const  Deref  for  & mut  T  { 
189+     type  Target  = T ; 
190+ 
191+     fn  deref ( & self )  -> & T  { 
192+         * self 
193+     } 
194+ } 
195+ 
172196/// Used for mutable dereferencing operations, like in `*v = 1;`. 
173197/// 
174198/// In addition to being used for explicit dereferencing operations with the 
@@ -258,23 +282,46 @@ impl<T: ?Sized> Deref for &mut T {
258282/// *x = 'b'; 
259283/// assert_eq!('b', x.value); 
260284/// ``` 
285+ #[ cfg( not( bootstrap) ) ]  
286+ #[ lang = "deref_mut" ]  
287+ #[ doc( alias = "*" ) ]  
288+ #[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
289+ #[ const_trait]  
290+ pub  trait  DerefMut :  ~const  Deref  { 
291+     /// Mutably dereferences the value. 
292+      #[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
293+     #[ rustc_diagnostic_item = "deref_mut_method" ]  
294+     fn  deref_mut ( & mut  self )  -> & mut  Self :: Target ; 
295+ } 
296+ 
297+ /// Bootstrap 
261298#[ lang = "deref_mut" ]  
262299#[ doc( alias = "*" ) ]  
263300#[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
301+ #[ cfg( bootstrap) ]  
264302pub  trait  DerefMut :  Deref  { 
265303    /// Mutably dereferences the value. 
266304     #[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
267305    #[ rustc_diagnostic_item = "deref_mut_method" ]  
268306    fn  deref_mut ( & mut  self )  -> & mut  Self :: Target ; 
269307} 
270308
309+ #[ cfg( bootstrap) ]  
271310#[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
272311impl < T :  ?Sized >  DerefMut  for  & mut  T  { 
273312    fn  deref_mut ( & mut  self )  -> & mut  T  { 
274313        * self 
275314    } 
276315} 
277316
317+ #[ cfg( not( bootstrap) ) ]  
318+ #[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
319+ impl < T :  ?Sized >  const  DerefMut  for  & mut  T  { 
320+     fn  deref_mut ( & mut  self )  -> & mut  T  { 
321+         * self 
322+     } 
323+ } 
324+ 
278325/// Perma-unstable marker trait. Indicates that the type has a well-behaved [`Deref`] 
279326/// (and, if applicable, [`DerefMut`]) implementation. This is relied on for soundness 
280327/// of deref patterns. 
0 commit comments