@@ -779,49 +779,54 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
779779 let ( lt1, sig1) = get_lifetimes ( sig1) ;
780780 let ( lt2, sig2) = get_lifetimes ( sig2) ;
781781
782- // unsafe extern "C" for<'a> fn(&'a T) -> &'a T
782+ // #[target_features] for<'a> unsafe extern "C" fn(&'a T) -> &'a T
783783 let mut values =
784784 ( DiagStyledString :: normal ( "" . to_string ( ) ) , DiagStyledString :: normal ( "" . to_string ( ) ) ) ;
785785
786- // unsafe extern "C" for<'a> fn(&'a T) -> &'a T
787- // ^^^^^^
788- let safety = |fn_def, sig : ty:: FnSig < ' _ > | match fn_def {
789- None => sig. safety ( ) . prefix_str ( ) ,
786+ // #[target_features] for<'a> unsafe extern "C" fn(&'a T) -> &'a T
787+ // ^^^^^^^^^^^^^^^^^^
788+ let fn_item_prefix_and_safety = |fn_def, sig : ty:: FnSig < ' _ > | match fn_def {
789+ None => ( "" , sig. safety ( ) . prefix_str ( ) ) ,
790790 Some ( ( did, _) ) => {
791791 if self . tcx . codegen_fn_attrs ( did) . safe_target_features {
792- "#[target_features] "
792+ ( "#[target_features] " , "" )
793793 } else {
794- sig. safety ( ) . prefix_str ( )
794+ ( "" , sig. safety ( ) . prefix_str ( ) )
795795 }
796796 }
797797 } ;
798- let safety1 = safety ( fn_def1, sig1) ;
799- let safety2 = safety ( fn_def2, sig2) ;
798+ let ( prefix1, safety1) = fn_item_prefix_and_safety ( fn_def1, sig1) ;
799+ let ( prefix2, safety2) = fn_item_prefix_and_safety ( fn_def2, sig2) ;
800+ values. 0 . push ( prefix1, prefix1 != prefix2) ;
801+ values. 1 . push ( prefix2, prefix1 != prefix2) ;
802+
803+ // #[target_features] for<'a> unsafe extern "C" fn(&'a T) -> &'a T
804+ // ^^^^^^^^
805+ let lifetime_diff = lt1 != lt2;
806+ values. 0 . push ( lt1, lifetime_diff) ;
807+ values. 1 . push ( lt2, lifetime_diff) ;
808+
809+ // #[target_features] for<'a> unsafe extern "C" fn(&'a T) -> &'a T
810+ // ^^^^^^
800811 values. 0 . push ( safety1, safety1 != safety2) ;
801812 values. 1 . push ( safety2, safety1 != safety2) ;
802813
803- // unsafe extern "C" for<'a> fn(&'a T) -> &'a T
804- // ^^^^^^^^^^
814+ // #[target_features] for<'a> unsafe extern "C" fn(&'a T) -> &'a T
815+ // ^^^^^^^^^^
805816 if sig1. abi ( ) != ExternAbi :: Rust {
806817 values. 0 . push ( format ! ( "extern {} " , sig1. abi( ) ) , sig1. abi ( ) != sig2. abi ( ) ) ;
807818 }
808819 if sig2. abi ( ) != ExternAbi :: Rust {
809820 values. 1 . push ( format ! ( "extern {} " , sig2. abi( ) ) , sig1. abi ( ) != sig2. abi ( ) ) ;
810821 }
811822
812- // unsafe extern "C" for<'a> fn(&'a T) -> &'a T
813- // ^^^^^^^^
814- let lifetime_diff = lt1 != lt2;
815- values. 0 . push ( lt1, lifetime_diff) ;
816- values. 1 . push ( lt2, lifetime_diff) ;
817-
818- // unsafe extern "C" for<'a> fn(&'a T) -> &'a T
819- // ^^^
823+ // #[target_features] for<'a> unsafe extern "C" fn(&'a T) -> &'a T
824+ // ^^^
820825 values. 0 . push_normal ( "fn(" ) ;
821826 values. 1 . push_normal ( "fn(" ) ;
822827
823- // unsafe extern "C" for<'a> fn(&'a T) -> &'a T
824- // ^^^^^
828+ // #[target_features] for<'a> unsafe extern "C" fn(&'a T) -> &'a T
829+ // ^^^^^
825830 let len1 = sig1. inputs ( ) . len ( ) ;
826831 let len2 = sig2. inputs ( ) . len ( ) ;
827832 if len1 == len2 {
@@ -859,13 +864,13 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
859864 values. 1 . push ( "..." , !sig1. c_variadic ( ) ) ;
860865 }
861866
862- // unsafe extern "C" for<'a> fn(&'a T) -> &'a T
863- // ^
867+ // #[target_features] for<'a> unsafe extern "C" fn(&'a T) -> &'a T
868+ // ^
864869 values. 0 . push_normal ( ")" ) ;
865870 values. 1 . push_normal ( ")" ) ;
866871
867- // unsafe extern "C" for<'a> fn(&'a T) -> &'a T
868- // ^^^^^^^^
872+ // #[target_features] for<'a> unsafe extern "C" fn(&'a T) -> &'a T
873+ // ^^^^^^^^
869874 let output1 = sig1. output ( ) ;
870875 let output2 = sig2. output ( ) ;
871876 let ( x1, x2) = self . cmp ( output1, output2) ;
0 commit comments