@@ -9,7 +9,7 @@ use rustc_infer::traits::{ImplSource, Obligation, ObligationCause};
99use  rustc_middle:: mir:: visit:: { MutatingUseContext ,  NonMutatingUseContext ,  PlaceContext ,  Visitor } ; 
1010use  rustc_middle:: mir:: * ; 
1111use  rustc_middle:: ty:: cast:: CastTy ; 
12- use  rustc_middle:: ty:: subst:: GenericArgKind ; 
12+ use  rustc_middle:: ty:: subst:: { GenericArgKind ,   InternalSubsts } ; 
1313use  rustc_middle:: ty:: { self ,  adjustment:: PointerCast ,  Instance ,  InstanceDef ,  Ty ,  TyCtxt } ; 
1414use  rustc_middle:: ty:: { Binder ,  TraitPredicate ,  TraitRef } ; 
1515use  rustc_span:: { sym,  Span ,  Symbol } ; 
@@ -793,7 +793,7 @@ impl Visitor<'tcx> for Checker<'mir, 'tcx> {
793793
794794                let  fn_ty = func. ty ( body,  tcx) ; 
795795
796-                 let  ( mut  callee,  substs)  = match  * fn_ty. kind ( )  { 
796+                 let  ( mut  callee,  mut   substs)  = match  * fn_ty. kind ( )  { 
797797                    ty:: FnDef ( def_id,  substs)  => ( def_id,  substs) , 
798798
799799                    ty:: FnPtr ( _)  => { 
@@ -846,29 +846,31 @@ impl Visitor<'tcx> for Checker<'mir, 'tcx> {
846846                                . iter ( ) 
847847                                . find ( |did| tcx. item_name ( * * did)  == callee_name) 
848848                            { 
849+                                 // using internal substs is ok here, since this is only 
850+                                 // used for the `resolve` call below 
851+                                 substs = InternalSubsts :: identity_for_item ( tcx,  did) ; 
849852                                callee = did; 
850853                            } 
851854                        } 
852-                         _ => { 
853-                             if  !tcx. is_const_fn_raw ( callee)  { 
854-                                 // At this point, it is only legal when the caller is marked with 
855-                                 // #[default_method_body_is_const], and the callee is in the same 
856-                                 // trait. 
857-                                 let  callee_trait = tcx. trait_of_item ( callee) ; 
858-                                 if  callee_trait. is_some ( )  { 
859-                                     if  tcx. has_attr ( caller,  sym:: default_method_body_is_const)  { 
860-                                         if  tcx. trait_of_item ( caller)  == callee_trait { 
861-                                             nonconst_call_permission = true ; 
862-                                         } 
855+                         _ if  !tcx. is_const_fn_raw ( callee)  => { 
856+                             // At this point, it is only legal when the caller is marked with 
857+                             // #[default_method_body_is_const], and the callee is in the same 
858+                             // trait. 
859+                             let  callee_trait = tcx. trait_of_item ( callee) ; 
860+                             if  callee_trait. is_some ( )  { 
861+                                 if  tcx. has_attr ( caller,  sym:: default_method_body_is_const)  { 
862+                                     if  tcx. trait_of_item ( caller)  == callee_trait { 
863+                                         nonconst_call_permission = true ; 
863864                                    } 
864865                                } 
866+                             } 
865867
866-                                 if  !nonconst_call_permission { 
867-                                     self . check_op ( ops:: FnCallNonConst ) ; 
868-                                     return ; 
869-                                 } 
868+                             if  !nonconst_call_permission { 
869+                                 self . check_op ( ops:: FnCallNonConst ) ; 
870+                                 return ; 
870871                            } 
871872                        } 
873+                         _ => { } 
872874                    } 
873875
874876                    // Resolve a trait method call to its concrete implementation, which may be in a 
0 commit comments