@@ -11,7 +11,7 @@ pub use self::suggest::SelfSource;
1111pub  use  self :: MethodError :: * ; 
1212
1313use  crate :: errors:: OpMethodGenericParams ; 
14- use  crate :: { Expectation ,   FnCtxt } ; 
14+ use  crate :: FnCtxt ; 
1515use  rustc_data_structures:: sync:: Lrc ; 
1616use  rustc_errors:: { Applicability ,  Diagnostic } ; 
1717use  rustc_hir as  hir; 
@@ -264,7 +264,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
264264
265265    pub ( super )  fn  obligation_for_method ( 
266266        & self , 
267-         span :   Span , 
267+         cause :   ObligationCause < ' tcx > , 
268268        trait_def_id :  DefId , 
269269        self_ty :  Ty < ' tcx > , 
270270        opt_input_types :  Option < & [ Ty < ' tcx > ] > , 
@@ -282,71 +282,19 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
282282                    } 
283283                } 
284284            } 
285-             self . var_for_def ( span,  param) 
286-         } ) ; 
287- 
288-         let  trait_ref = self . tcx . mk_trait_ref ( trait_def_id,  substs) ; 
289- 
290-         // Construct an obligation 
291-         let  poly_trait_ref = ty:: Binder :: dummy ( trait_ref) ; 
292-         ( 
293-             traits:: Obligation :: misc ( 
294-                 self . tcx , 
295-                 span, 
296-                 self . body_id , 
297-                 self . param_env , 
298-                 poly_trait_ref. without_const ( ) , 
299-             ) , 
300-             substs, 
301-         ) 
302-     } 
303- 
304-     pub ( super )  fn  obligation_for_op_method ( 
305-         & self , 
306-         span :  Span , 
307-         trait_def_id :  DefId , 
308-         self_ty :  Ty < ' tcx > , 
309-         opt_input_type :  Option < Ty < ' tcx > > , 
310-         opt_input_expr :  Option < & ' tcx  hir:: Expr < ' tcx > > , 
311-         expected :  Expectation < ' tcx > , 
312-     )  -> ( traits:: Obligation < ' tcx ,  ty:: Predicate < ' tcx > > ,  & ' tcx  ty:: List < ty:: subst:: GenericArg < ' tcx > > ) 
313-     { 
314-         // Construct a trait-reference `self_ty : Trait<input_tys>` 
315-         let  substs = InternalSubsts :: for_item ( self . tcx ,  trait_def_id,  |param,  _| { 
316-             match  param. kind  { 
317-                 GenericParamDefKind :: Lifetime  | GenericParamDefKind :: Const  {  .. }  => { } 
318-                 GenericParamDefKind :: Type  {  .. }  => { 
319-                     if  param. index  == 0  { 
320-                         return  self_ty. into ( ) ; 
321-                     }  else  if  let  Some ( input_type)  = opt_input_type { 
322-                         return  input_type. into ( ) ; 
323-                     } 
324-                 } 
325-             } 
326-             self . var_for_def ( span,  param) 
285+             self . var_for_def ( cause. span ,  param) 
327286        } ) ; 
328287
329288        let  trait_ref = self . tcx . mk_trait_ref ( trait_def_id,  substs) ; 
330289
331290        // Construct an obligation 
332291        let  poly_trait_ref = ty:: Binder :: dummy ( trait_ref) ; 
333-         let  output_ty = expected. only_has_type ( self ) . and_then ( |ty| ( !ty. needs_infer ( ) ) . then ( || ty) ) ; 
334- 
335292        ( 
336293            traits:: Obligation :: new ( 
337294                self . tcx , 
338-                 traits:: ObligationCause :: new ( 
339-                     span, 
340-                     self . body_id , 
341-                     traits:: BinOp  { 
342-                         rhs_span :  opt_input_expr. map ( |expr| expr. span ) , 
343-                         is_lit :  opt_input_expr
344-                             . map_or ( false ,  |expr| matches ! ( expr. kind,  hir:: ExprKind :: Lit ( _) ) ) , 
345-                         output_ty, 
346-                     } , 
347-                 ) , 
295+                 cause, 
348296                self . param_env , 
349-                 poly_trait_ref, 
297+                 poly_trait_ref. without_const ( ) , 
350298            ) , 
351299            substs, 
352300        ) 
@@ -357,69 +305,29 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
357305/// In particular, it doesn't really do any probing: it simply constructs 
358306/// an obligation for a particular trait with the given self type and checks 
359307/// whether that trait is implemented. 
360- #[ instrument( level = "debug" ,  skip( self ,  span ) ) ]  
308+ #[ instrument( level = "debug" ,  skip( self ) ) ]  
361309    pub ( super )  fn  lookup_method_in_trait ( 
362310        & self , 
363-         span :   Span , 
311+         cause :   ObligationCause < ' tcx > , 
364312        m_name :  Ident , 
365313        trait_def_id :  DefId , 
366314        self_ty :  Ty < ' tcx > , 
367315        opt_input_types :  Option < & [ Ty < ' tcx > ] > , 
368316    )  -> Option < InferOk < ' tcx ,  MethodCallee < ' tcx > > >  { 
369317        let  ( obligation,  substs)  =
370-             self . obligation_for_method ( span,  trait_def_id,  self_ty,  opt_input_types) ; 
371-         self . construct_obligation_for_trait ( 
372-             span, 
373-             m_name, 
374-             trait_def_id, 
375-             obligation, 
376-             substs, 
377-             None , 
378-             false , 
379-         ) 
380-     } 
381- 
382-     pub ( super )  fn  lookup_op_method_in_trait ( 
383-         & self , 
384-         span :  Span , 
385-         m_name :  Ident , 
386-         trait_def_id :  DefId , 
387-         self_ty :  Ty < ' tcx > , 
388-         opt_input_type :  Option < Ty < ' tcx > > , 
389-         opt_input_expr :  Option < & ' tcx  hir:: Expr < ' tcx > > , 
390-         expected :  Expectation < ' tcx > , 
391-     )  -> Option < InferOk < ' tcx ,  MethodCallee < ' tcx > > >  { 
392-         let  ( obligation,  substs)  = self . obligation_for_op_method ( 
393-             span, 
394-             trait_def_id, 
395-             self_ty, 
396-             opt_input_type, 
397-             opt_input_expr, 
398-             expected, 
399-         ) ; 
400-         self . construct_obligation_for_trait ( 
401-             span, 
402-             m_name, 
403-             trait_def_id, 
404-             obligation, 
405-             substs, 
406-             opt_input_expr, 
407-             true , 
408-         ) 
318+             self . obligation_for_method ( cause,  trait_def_id,  self_ty,  opt_input_types) ; 
319+         self . construct_obligation_for_trait ( m_name,  trait_def_id,  obligation,  substs) 
409320    } 
410321
411322    // FIXME(#18741): it seems likely that we can consolidate some of this 
412323    // code with the other method-lookup code. In particular, the second half 
413324    // of this method is basically the same as confirmation. 
414325    fn  construct_obligation_for_trait ( 
415326        & self , 
416-         span :  Span , 
417327        m_name :  Ident , 
418328        trait_def_id :  DefId , 
419329        obligation :  traits:: PredicateObligation < ' tcx > , 
420330        substs :  & ' tcx  ty:: List < ty:: subst:: GenericArg < ' tcx > > , 
421-         opt_input_expr :  Option < & ' tcx  hir:: Expr < ' tcx > > , 
422-         is_op :  bool , 
423331    )  -> Option < InferOk < ' tcx ,  MethodCallee < ' tcx > > >  { 
424332        debug ! ( ?obligation) ; 
425333
@@ -435,7 +343,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
435343        let  tcx = self . tcx ; 
436344        let  Some ( method_item)  = self . associated_value ( trait_def_id,  m_name)  else  { 
437345            tcx. sess . delay_span_bug ( 
438-                 span, 
346+                 obligation . cause . span , 
439347                "operator trait does not have corresponding operator method" , 
440348            ) ; 
441349            return  None ; 
@@ -461,24 +369,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
461369        // with bound regions. 
462370        let  fn_sig = tcx. bound_fn_sig ( def_id) ; 
463371        let  fn_sig = fn_sig. subst ( self . tcx ,  substs) ; 
464-         let  fn_sig = self . replace_bound_vars_with_fresh_vars ( span,  infer:: FnCall ,  fn_sig) ; 
465- 
466-         let  cause = if  is_op { 
467-             ObligationCause :: new ( 
468-                 span, 
469-                 self . body_id , 
470-                 traits:: BinOp  { 
471-                     rhs_span :  opt_input_expr. map ( |expr| expr. span ) , 
472-                     is_lit :  opt_input_expr
473-                         . map_or ( false ,  |expr| matches ! ( expr. kind,  hir:: ExprKind :: Lit ( _) ) ) , 
474-                     output_ty :  None , 
475-                 } , 
476-             ) 
477-         }  else  { 
478-             traits:: ObligationCause :: misc ( span,  self . body_id ) 
479-         } ; 
372+         let  fn_sig =
373+             self . replace_bound_vars_with_fresh_vars ( obligation. cause . span ,  infer:: FnCall ,  fn_sig) ; 
480374
481-         let  InferOk  {  value,  obligations :  o }  = self . at ( & cause,  self . param_env ) . normalize ( fn_sig) ; 
375+         let  InferOk  {  value,  obligations :  o }  =
376+             self . at ( & obligation. cause ,  self . param_env ) . normalize ( fn_sig) ; 
482377        let  fn_sig = { 
483378            obligations. extend ( o) ; 
484379            value
@@ -494,15 +389,16 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
494389        // any late-bound regions appearing in its bounds. 
495390        let  bounds = self . tcx . predicates_of ( def_id) . instantiate ( self . tcx ,  substs) ; 
496391
497-         let  InferOk  {  value,  obligations :  o }  = self . at ( & cause,  self . param_env ) . normalize ( bounds) ; 
392+         let  InferOk  {  value,  obligations :  o }  =
393+             self . at ( & obligation. cause ,  self . param_env ) . normalize ( bounds) ; 
498394        let  bounds = { 
499395            obligations. extend ( o) ; 
500396            value
501397        } ; 
502398
503399        assert ! ( !bounds. has_escaping_bound_vars( ) ) ; 
504400
505-         let  predicates_cause = cause. clone ( ) ; 
401+         let  predicates_cause = obligation . cause . clone ( ) ; 
506402        obligations. extend ( traits:: predicates_for_generics ( 
507403            move  |_,  _| predicates_cause. clone ( ) , 
508404            self . param_env , 
@@ -517,7 +413,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
517413        ) ; 
518414        obligations. push ( traits:: Obligation :: new ( 
519415            tcx, 
520-             cause, 
416+             obligation . cause , 
521417            self . param_env , 
522418            ty:: Binder :: dummy ( ty:: PredicateKind :: WellFormed ( method_ty. into ( ) ) ) , 
523419        ) ) ; 
0 commit comments