@@ -1891,150 +1891,205 @@ pub fn hash<T: ?Sized, S: hash::Hasher>(hashee: *const T, into: &mut S) {
18911891    hashee. hash ( into) ; 
18921892} 
18931893
1894- // If this is a unary fn pointer, it adds a doc comment. 
1895- // Otherwise, it hides the docs entirely. 
1896- macro_rules!  maybe_fnptr_doc { 
1897-     ( @ #[ $meta: meta]  $item: item)  => { 
1898-         #[ doc( hidden) ] 
1899-         #[ $meta] 
1900-         $item
1901-     } ; 
1902-     ( $a: ident @ #[ $meta: meta]  $item: item)  => { 
1903-         #[ doc( fake_variadic) ] 
1904-         #[ doc = "This trait is implemented for function pointers with up to twelve arguments." ] 
1905-         #[ $meta] 
1906-         $item
1907-     } ; 
1908-     ( $a: ident $( $rest_a: ident) + @ #[ $meta: meta]  $item: item)  => { 
1909-         #[ doc( hidden) ] 
1910-         #[ $meta] 
1911-         $item
1912-     } ; 
1913- } 
1894+ #[ cfg( bootstrap) ]  
1895+ mod  old_fn_ptr_impl { 
1896+     use  super :: * ; 
1897+     // If this is a unary fn pointer, it adds a doc comment. 
1898+     // Otherwise, it hides the docs entirely. 
1899+     macro_rules!  maybe_fnptr_doc { 
1900+         ( @ #[ $meta: meta]  $item: item)  => { 
1901+             #[ doc( hidden) ] 
1902+             #[ $meta] 
1903+             $item
1904+         } ; 
1905+         ( $a: ident @ #[ $meta: meta]  $item: item)  => { 
1906+             #[ doc( fake_variadic) ] 
1907+             #[ doc = "This trait is implemented for function pointers with up to twelve arguments." ] 
1908+             #[ $meta] 
1909+             $item
1910+         } ; 
1911+         ( $a: ident $( $rest_a: ident) + @ #[ $meta: meta]  $item: item)  => { 
1912+             #[ doc( hidden) ] 
1913+             #[ $meta] 
1914+             $item
1915+         } ; 
1916+     } 
19141917
1915- // FIXME(strict_provenance_magic): function pointers have buggy codegen that 
1916- // necessitates casting to a usize to get the backend to do the right thing. 
1917- // for now I will break AVR to silence *a billion* lints. We should probably 
1918- // have a proper "opaque function pointer type" to handle this kind of thing. 
1918+      // FIXME(strict_provenance_magic): function pointers have buggy codegen that 
1919+      // necessitates casting to a usize to get the backend to do the right thing. 
1920+      // for now I will break AVR to silence *a billion* lints. We should probably 
1921+      // have a proper "opaque function pointer type" to handle this kind of thing. 
19191922
1920- // Impls for function pointers 
1921- macro_rules!  fnptr_impls_safety_abi { 
1922-     ( $FnTy:  ty,  $( $Arg:  ident) ,* )  => { 
1923+      // Impls for function pointers 
1924+      macro_rules!  fnptr_impls_safety_abi { 
1925+          ( $FnTy:  ty,  $( $Arg:  ident) ,* )  => { 
19231926        fnptr_impls_safety_abi! {  #[ stable( feature = "fnptr_impls" ,  since = "1.4.0" ) ]  $FnTy,  $( $Arg) ,*  } 
19241927    } ; 
19251928    ( @c_unwind $FnTy:  ty,  $( $Arg:  ident) ,* )  => { 
19261929        fnptr_impls_safety_abi! {  #[ unstable( feature = "c_unwind" ,  issue = "74990" ) ]  $FnTy,  $( $Arg) ,*  } 
19271930    } ; 
19281931    ( #[ $meta: meta]  $FnTy:  ty,  $( $Arg:  ident) ,* )  => { 
1929-         maybe_fnptr_doc! { 
1930-             $( $Arg) *  @
1931-             #[ $meta] 
1932-             impl <Ret ,  $( $Arg) ,* > PartialEq  for  $FnTy { 
1933-                 #[ inline] 
1934-                 fn  eq( & self ,  other:  & Self )  -> bool  { 
1935-                     * self  as  usize  == * other as  usize 
1932+             maybe_fnptr_doc! { 
1933+                 $( $Arg) *  @
1934+                 #[ $meta] 
1935+                 impl <Ret ,  $( $Arg) ,* > PartialEq  for  $FnTy { 
1936+                     #[ inline] 
1937+                     fn  eq( & self ,  other:  & Self )  -> bool  { 
1938+                         * self  as  usize  == * other as  usize 
1939+                     } 
19361940                } 
19371941            } 
1938-         } 
19391942
1940-         maybe_fnptr_doc! { 
1941-             $( $Arg) *  @
1942-             #[ $meta] 
1943-             impl <Ret ,  $( $Arg) ,* > Eq  for  $FnTy { } 
1944-         } 
1943+              maybe_fnptr_doc! { 
1944+                  $( $Arg) *  @
1945+                  #[ $meta] 
1946+                  impl <Ret ,  $( $Arg) ,* > Eq  for  $FnTy { } 
1947+              } 
19451948
1946-         maybe_fnptr_doc! { 
1947-             $( $Arg) *  @
1948-             #[ $meta] 
1949-             impl <Ret ,  $( $Arg) ,* > PartialOrd  for  $FnTy { 
1950-                 #[ inline] 
1951-                 fn  partial_cmp( & self ,  other:  & Self )  -> Option <Ordering > { 
1952-                     ( * self  as  usize ) . partial_cmp( & ( * other as  usize ) ) 
1949+             maybe_fnptr_doc! { 
1950+                 $( $Arg) *  @
1951+                 #[ $meta] 
1952+                 impl <Ret ,  $( $Arg) ,* > PartialOrd  for  $FnTy { 
1953+                     #[ inline] 
1954+                     fn  partial_cmp( & self ,  other:  & Self )  -> Option <Ordering > { 
1955+                         ( * self  as  usize ) . partial_cmp( & ( * other as  usize ) ) 
1956+                     } 
19531957                } 
19541958            } 
1955-         } 
19561959
1957-         maybe_fnptr_doc! { 
1958-             $( $Arg) *  @
1959-             #[ $meta] 
1960-             impl <Ret ,  $( $Arg) ,* > Ord  for  $FnTy { 
1961-                 #[ inline] 
1962-                 fn  cmp( & self ,  other:  & Self )  -> Ordering  { 
1963-                     ( * self  as  usize ) . cmp( & ( * other as  usize ) ) 
1960+             maybe_fnptr_doc! { 
1961+                 $( $Arg) *  @
1962+                 #[ $meta] 
1963+                 impl <Ret ,  $( $Arg) ,* > Ord  for  $FnTy { 
1964+                     #[ inline] 
1965+                     fn  cmp( & self ,  other:  & Self )  -> Ordering  { 
1966+                         ( * self  as  usize ) . cmp( & ( * other as  usize ) ) 
1967+                     } 
19641968                } 
19651969            } 
1966-         } 
19671970
1968-         maybe_fnptr_doc! { 
1969-             $( $Arg) *  @
1970-             #[ $meta] 
1971-             impl <Ret ,  $( $Arg) ,* > hash:: Hash  for  $FnTy { 
1972-                 fn  hash<HH :  hash:: Hasher >( & self ,  state:  & mut  HH )  { 
1973-                     state. write_usize( * self  as  usize ) 
1971+             maybe_fnptr_doc! { 
1972+                 $( $Arg) *  @
1973+                 #[ $meta] 
1974+                 impl <Ret ,  $( $Arg) ,* > hash:: Hash  for  $FnTy { 
1975+                     fn  hash<HH :  hash:: Hasher >( & self ,  state:  & mut  HH )  { 
1976+                         state. write_usize( * self  as  usize ) 
1977+                     } 
19741978                } 
19751979            } 
1976-         } 
19771980
1978-         maybe_fnptr_doc! { 
1979-             $( $Arg) *  @
1980-             #[ $meta] 
1981-             impl <Ret ,  $( $Arg) ,* > fmt:: Pointer  for  $FnTy { 
1982-                 fn  fmt( & self ,  f:  & mut  fmt:: Formatter <' _>)  -> fmt:: Result  { 
1983-                     fmt:: pointer_fmt_inner( * self  as  usize ,  f) 
1981+             maybe_fnptr_doc! { 
1982+                 $( $Arg) *  @
1983+                 #[ $meta] 
1984+                 impl <Ret ,  $( $Arg) ,* > fmt:: Pointer  for  $FnTy { 
1985+                     fn  fmt( & self ,  f:  & mut  fmt:: Formatter <' _>)  -> fmt:: Result  { 
1986+                         fmt:: pointer_fmt_inner( * self  as  usize ,  f) 
1987+                     } 
19841988                } 
19851989            } 
1986-         } 
19871990
1988-         maybe_fnptr_doc! { 
1989-             $( $Arg) *  @
1990-             #[ $meta] 
1991-             impl <Ret ,  $( $Arg) ,* > fmt:: Debug  for  $FnTy { 
1992-                 fn  fmt( & self ,  f:  & mut  fmt:: Formatter <' _>)  -> fmt:: Result  { 
1993-                     fmt:: pointer_fmt_inner( * self  as  usize ,  f) 
1991+             maybe_fnptr_doc! { 
1992+                 $( $Arg) *  @
1993+                 #[ $meta] 
1994+                 impl <Ret ,  $( $Arg) ,* > fmt:: Debug  for  $FnTy { 
1995+                     fn  fmt( & self ,  f:  & mut  fmt:: Formatter <' _>)  -> fmt:: Result  { 
1996+                         fmt:: pointer_fmt_inner( * self  as  usize ,  f) 
1997+                     } 
19941998                } 
19951999            } 
19962000        } 
19972001    } 
1998- } 
19992002
2000- macro_rules!  fnptr_impls_args { 
2001-     ( $( $Arg:  ident) ,+)  => { 
2002-         fnptr_impls_safety_abi! {  extern "Rust"  fn ( $( $Arg) ,+)  -> Ret ,  $( $Arg) ,+ } 
2003-         fnptr_impls_safety_abi! {  extern "C"  fn ( $( $Arg) ,+)  -> Ret ,  $( $Arg) ,+ } 
2004-         fnptr_impls_safety_abi! {  extern "C"  fn ( $( $Arg) ,+ ,  ...)  -> Ret ,  $( $Arg) ,+ } 
2003+      macro_rules!  fnptr_impls_args { 
2004+          ( $( $Arg:  ident) ,+)  => { 
2005+              fnptr_impls_safety_abi! {  extern "Rust"  fn ( $( $Arg) ,+)  -> Ret ,  $( $Arg) ,+ } 
2006+              fnptr_impls_safety_abi! {  extern "C"  fn ( $( $Arg) ,+)  -> Ret ,  $( $Arg) ,+ } 
2007+              fnptr_impls_safety_abi! {  extern "C"  fn ( $( $Arg) ,+ ,  ...)  -> Ret ,  $( $Arg) ,+ } 
20052008        fnptr_impls_safety_abi! {  @c_unwind extern "C-unwind"  fn ( $( $Arg) ,+)  -> Ret ,  $( $Arg) ,+ } 
20062009        fnptr_impls_safety_abi! {  @c_unwind extern "C-unwind"  fn ( $( $Arg) ,+ ,  ...)  -> Ret ,  $( $Arg) ,+ } 
2007-         fnptr_impls_safety_abi! {  unsafe  extern "Rust"  fn ( $( $Arg) ,+)  -> Ret ,  $( $Arg) ,+ } 
2008-         fnptr_impls_safety_abi! {  unsafe  extern "C"  fn ( $( $Arg) ,+)  -> Ret ,  $( $Arg) ,+ } 
2009-         fnptr_impls_safety_abi! {  unsafe  extern "C"  fn ( $( $Arg) ,+ ,  ...)  -> Ret ,  $( $Arg) ,+ } 
2010+              fnptr_impls_safety_abi! {  unsafe  extern "Rust"  fn ( $( $Arg) ,+)  -> Ret ,  $( $Arg) ,+ } 
2011+              fnptr_impls_safety_abi! {  unsafe  extern "C"  fn ( $( $Arg) ,+)  -> Ret ,  $( $Arg) ,+ } 
2012+              fnptr_impls_safety_abi! {  unsafe  extern "C"  fn ( $( $Arg) ,+ ,  ...)  -> Ret ,  $( $Arg) ,+ } 
20102013        fnptr_impls_safety_abi! {  @c_unwind unsafe  extern "C-unwind"  fn ( $( $Arg) ,+)  -> Ret ,  $( $Arg) ,+ } 
20112014        fnptr_impls_safety_abi! {  @c_unwind unsafe  extern "C-unwind"  fn ( $( $Arg) ,+ ,  ...)  -> Ret ,  $( $Arg) ,+ } 
2012-     } ; 
2013-     ( )  => { 
2014-         // No variadic functions with 0 parameters 
2015-         fnptr_impls_safety_abi! {  extern "Rust"  fn ( )  -> Ret ,  } 
2016-         fnptr_impls_safety_abi! {  extern "C"  fn ( )  -> Ret ,  } 
2015+          } ; 
2016+          ( )  => { 
2017+              // No variadic functions with 0 parameters 
2018+              fnptr_impls_safety_abi! {  extern "Rust"  fn ( )  -> Ret ,  } 
2019+              fnptr_impls_safety_abi! {  extern "C"  fn ( )  -> Ret ,  } 
20172020        fnptr_impls_safety_abi! {  @c_unwind extern "C-unwind"  fn ( )  -> Ret ,  } 
2018-         fnptr_impls_safety_abi! {  unsafe  extern "Rust"  fn ( )  -> Ret ,  } 
2019-         fnptr_impls_safety_abi! {  unsafe  extern "C"  fn ( )  -> Ret ,  } 
2021+              fnptr_impls_safety_abi! {  unsafe  extern "Rust"  fn ( )  -> Ret ,  } 
2022+              fnptr_impls_safety_abi! {  unsafe  extern "C"  fn ( )  -> Ret ,  } 
20202023        fnptr_impls_safety_abi! {  @c_unwind unsafe  extern "C-unwind"  fn ( )  -> Ret ,  } 
2021-     } ; 
2024+         } ; 
2025+     } 
2026+ 
2027+     fnptr_impls_args !  { } 
2028+     fnptr_impls_args !  {  T  } 
2029+     fnptr_impls_args !  {  A ,  B  } 
2030+     fnptr_impls_args !  {  A ,  B ,  C  } 
2031+     fnptr_impls_args !  {  A ,  B ,  C ,  D  } 
2032+     fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E  } 
2033+     fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F  } 
2034+     fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F ,  G  } 
2035+     fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F ,  G ,  H  } 
2036+     fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F ,  G ,  H ,  I  } 
2037+     fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F ,  G ,  H ,  I ,  J  } 
2038+     fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F ,  G ,  H ,  I ,  J ,  K  } 
2039+     fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F ,  G ,  H ,  I ,  J ,  K ,  L  } 
20222040} 
20232041
2024- fnptr_impls_args !  { } 
2025- fnptr_impls_args !  {  T  } 
2026- fnptr_impls_args !  {  A ,  B  } 
2027- fnptr_impls_args !  {  A ,  B ,  C  } 
2028- fnptr_impls_args !  {  A ,  B ,  C ,  D  } 
2029- fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E  } 
2030- fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F  } 
2031- fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F ,  G  } 
2032- fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F ,  G ,  H  } 
2033- fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F ,  G ,  H ,  I  } 
2034- fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F ,  G ,  H ,  I ,  J  } 
2035- fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F ,  G ,  H ,  I ,  J ,  K  } 
2036- fnptr_impls_args !  {  A ,  B ,  C ,  D ,  E ,  F ,  G ,  H ,  I ,  J ,  K ,  L  } 
2042+ #[ cfg( not( bootstrap) ) ]  
2043+ mod  new_fn_ptr_impl { 
2044+     use  super :: * ; 
2045+     use  crate :: marker:: FnPtr ; 
2046+ 
2047+     #[ stable( feature = "fnptr_impls" ,  since = "1.4.0" ) ]  
2048+     impl < F :  FnPtr >  PartialEq  for  F  { 
2049+         #[ inline]  
2050+         fn  eq ( & self ,  other :  & Self )  -> bool  { 
2051+             self . addr ( )  == other. addr ( ) 
2052+         } 
2053+     } 
2054+     #[ stable( feature = "fnptr_impls" ,  since = "1.4.0" ) ]  
2055+     impl < F :  FnPtr >  Eq  for  F  { } 
2056+ 
2057+     #[ stable( feature = "fnptr_impls" ,  since = "1.4.0" ) ]  
2058+     impl < F :  FnPtr >  PartialOrd  for  F  { 
2059+         #[ inline]  
2060+         fn  partial_cmp ( & self ,  other :  & Self )  -> Option < Ordering >  { 
2061+             self . addr ( ) . partial_cmp ( & other. addr ( ) ) 
2062+         } 
2063+     } 
2064+     #[ stable( feature = "fnptr_impls" ,  since = "1.4.0" ) ]  
2065+     impl < F :  FnPtr >  Ord  for  F  { 
2066+         #[ inline]  
2067+         fn  cmp ( & self ,  other :  & Self )  -> Ordering  { 
2068+             self . addr ( ) . cmp ( & other. addr ( ) ) 
2069+         } 
2070+     } 
2071+ 
2072+     #[ stable( feature = "fnptr_impls" ,  since = "1.4.0" ) ]  
2073+     impl < F :  FnPtr >  hash:: Hash  for  F  { 
2074+         fn  hash < HH :  hash:: Hasher > ( & self ,  state :  & mut  HH )  { 
2075+             state. write_usize ( self . addr ( )  as  _ ) 
2076+         } 
2077+     } 
2078+ 
2079+     #[ stable( feature = "fnptr_impls" ,  since = "1.4.0" ) ]  
2080+     impl < F :  FnPtr >  fmt:: Pointer  for  F  { 
2081+         fn  fmt ( & self ,  f :  & mut  fmt:: Formatter < ' _ > )  -> fmt:: Result  { 
2082+             fmt:: pointer_fmt_inner ( self . addr ( )  as  _ ,  f) 
2083+         } 
2084+     } 
20372085
2086+     #[ stable( feature = "fnptr_impls" ,  since = "1.4.0" ) ]  
2087+     impl < F :  FnPtr >  fmt:: Debug  for  F  { 
2088+         fn  fmt ( & self ,  f :  & mut  fmt:: Formatter < ' _ > )  -> fmt:: Result  { 
2089+             fmt:: pointer_fmt_inner ( self . addr ( )  as  _ ,  f) 
2090+         } 
2091+     } 
2092+ } 
20382093/// Create a `const` raw pointer to a place, without creating an intermediate reference. 
20392094/// 
20402095/// Creating a reference with `&`/`&mut` is only allowed if the pointer is properly aligned 
0 commit comments