@@ -975,7 +975,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
975975 ( None , None )
976976 } else {
977977 match ( & prev_ty. kind ( ) , & new_ty. kind ( ) ) {
978- ( & ty:: FnDef ( ..) , & ty:: FnDef ( ..) ) => {
978+ ( & ty:: FnDef ( ..) | & ty :: FnPtr ( .. ) , & ty:: FnDef ( .. ) | & ty :: FnPtr ( ..) ) => {
979979 // Don't reify if the function types have a LUB, i.e., they
980980 // are the same function and their parameters have a LUB.
981981 match self
@@ -1040,34 +1040,51 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
10401040 // Reify both sides and return the reified fn pointer type.
10411041 let fn_ptr = self . tcx . mk_fn_ptr ( sig) ;
10421042 let prev_adjustment = match prev_ty. kind ( ) {
1043- ty:: Closure ( ..) => Adjust :: Pointer ( PointerCast :: ClosureFnPointer ( a_sig. unsafety ( ) ) ) ,
1043+ ty:: Closure ( ..) => {
1044+ Some ( Adjust :: Pointer ( PointerCast :: ClosureFnPointer ( a_sig. unsafety ( ) ) ) )
1045+ }
10441046 ty:: FnDef ( ..) => {
1047+ Some ( Adjust :: Pointer ( PointerCast :: ReifyFnPointer ) )
1048+ }
1049+ ty:: FnPtr ( ..) => {
10451050 if prev_drop_const {
1046- Adjust :: Pointer ( PointerCast :: ReifyNotConstFnPointer )
1051+ Some ( Adjust :: Pointer ( PointerCast :: NotConstFnPointer ) )
10471052 } else {
1048- Adjust :: Pointer ( PointerCast :: ReifyFnPointer )
1053+ None
10491054 }
10501055 }
10511056 _ => unreachable ! ( ) ,
10521057 } ;
10531058 let next_adjustment = match new_ty. kind ( ) {
1054- ty:: Closure ( ..) => Adjust :: Pointer ( PointerCast :: ClosureFnPointer ( b_sig. unsafety ( ) ) ) ,
1059+ ty:: Closure ( ..) => {
1060+ Some ( Adjust :: Pointer ( PointerCast :: ClosureFnPointer ( b_sig. unsafety ( ) ) ) )
1061+ }
10551062 ty:: FnDef ( ..) => {
1063+ Some ( Adjust :: Pointer ( PointerCast :: ReifyFnPointer ) )
1064+ }
1065+ ty:: FnPtr ( ..) => {
10561066 if new_drop_const {
1057- Adjust :: Pointer ( PointerCast :: ReifyNotConstFnPointer )
1067+ Some ( Adjust :: Pointer ( PointerCast :: NotConstFnPointer ) )
10581068 } else {
1059- Adjust :: Pointer ( PointerCast :: ReifyFnPointer )
1069+ None
10601070 }
10611071 }
10621072 _ => unreachable ! ( ) ,
10631073 } ;
1064- for expr in exprs. iter ( ) . map ( |e| e. as_coercion_site ( ) ) {
1074+ if prev_adjustment. is_some ( ) {
1075+ for expr in exprs. iter ( ) . map ( |e| e. as_coercion_site ( ) ) {
1076+ self . apply_adjustments (
1077+ expr,
1078+ vec ! [ Adjustment { kind: prev_adjustment. clone( ) . unwrap( ) . clone( ) , target: fn_ptr } ] ,
1079+ ) ;
1080+ }
1081+ }
1082+ if next_adjustment. is_some ( ) {
10651083 self . apply_adjustments (
1066- expr ,
1067- vec ! [ Adjustment { kind: prev_adjustment . clone ( ) , target: fn_ptr } ] ,
1084+ new ,
1085+ vec ! [ Adjustment { kind: next_adjustment . unwrap ( ) , target: fn_ptr } ] ,
10681086 ) ;
10691087 }
1070- self . apply_adjustments ( new, vec ! [ Adjustment { kind: next_adjustment, target: fn_ptr } ] ) ;
10711088 return Ok ( fn_ptr) ;
10721089 }
10731090
0 commit comments