@@ -952,6 +952,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
952952 {
953953 let prev_ty = self . resolve_vars_with_obligations ( prev_ty) ;
954954 let new_ty = self . resolve_vars_with_obligations ( new_ty) ;
955+ let mut prev_drop_const = false ;
956+ let mut new_drop_const = false ;
955957 debug ! (
956958 "coercion::try_find_coercion_lub({:?}, {:?}, exprs={:?} exprs)" ,
957959 prev_ty,
@@ -982,7 +984,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
982984 // We have a LUB of prev_ty and new_ty, just return it.
983985 Ok ( ok) => return Ok ( self . register_infer_ok_obligations ( ok) ) ,
984986 Err ( _) => {
985- ( Some ( prev_ty. fn_sig ( self . tcx ) ) , Some ( new_ty. fn_sig ( self . tcx ) ) )
987+ let mut prev_sig = prev_ty. fn_sig ( self . tcx ) ;
988+ let mut new_sig = new_ty. fn_sig ( self . tcx ) ;
989+ if prev_sig. constness ( ) != new_sig. constness ( ) {
990+ if prev_sig. constness ( ) == hir:: Constness :: Const {
991+ prev_sig = self . tcx . signature_not_const_fn ( prev_sig) ;
992+ prev_drop_const = true ;
993+ } else {
994+ new_sig = self . tcx . signature_not_const_fn ( prev_sig) ;
995+ new_drop_const = true ;
996+ }
997+ }
998+ ( Some ( prev_sig) , Some ( new_sig) )
986999 }
9871000 }
9881001 }
@@ -1028,12 +1041,24 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
10281041 let fn_ptr = self . tcx . mk_fn_ptr ( sig) ;
10291042 let prev_adjustment = match prev_ty. kind ( ) {
10301043 ty:: Closure ( ..) => Adjust :: Pointer ( PointerCast :: ClosureFnPointer ( a_sig. unsafety ( ) ) ) ,
1031- ty:: FnDef ( ..) => Adjust :: Pointer ( PointerCast :: ReifyFnPointer ) ,
1044+ ty:: FnDef ( ..) => {
1045+ if prev_drop_const {
1046+ Adjust :: Pointer ( PointerCast :: ReifyNotConstFnPointer )
1047+ } else {
1048+ Adjust :: Pointer ( PointerCast :: ReifyFnPointer )
1049+ }
1050+ }
10321051 _ => unreachable ! ( ) ,
10331052 } ;
10341053 let next_adjustment = match new_ty. kind ( ) {
10351054 ty:: Closure ( ..) => Adjust :: Pointer ( PointerCast :: ClosureFnPointer ( b_sig. unsafety ( ) ) ) ,
1036- ty:: FnDef ( ..) => Adjust :: Pointer ( PointerCast :: ReifyFnPointer ) ,
1055+ ty:: FnDef ( ..) => {
1056+ if new_drop_const {
1057+ Adjust :: Pointer ( PointerCast :: ReifyNotConstFnPointer )
1058+ } else {
1059+ Adjust :: Pointer ( PointerCast :: ReifyFnPointer )
1060+ }
1061+ }
10371062 _ => unreachable ! ( ) ,
10381063 } ;
10391064 for expr in exprs. iter ( ) . map ( |e| e. as_coercion_site ( ) ) {
0 commit comments