@@ -324,35 +324,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
324324 Ok ( pick)
325325 }
326326
327- pub ( super ) fn obligation_for_method (
328- & self ,
329- cause : ObligationCause < ' tcx > ,
330- trait_def_id : DefId ,
331- self_ty : Ty < ' tcx > ,
332- opt_input_types : Option < & [ Ty < ' tcx > ] > ,
333- ) -> ( traits:: PredicateObligation < ' tcx > , ty:: GenericArgsRef < ' tcx > ) {
334- // Construct a trait-reference `self_ty : Trait<input_tys>`
335- let args = GenericArgs :: for_item ( self . tcx , trait_def_id, |param, _| {
336- match param. kind {
337- GenericParamDefKind :: Lifetime | GenericParamDefKind :: Const { .. } => { }
338- GenericParamDefKind :: Type { .. } => {
339- if param. index == 0 {
340- return self_ty. into ( ) ;
341- } else if let Some ( input_types) = opt_input_types {
342- return input_types[ param. index as usize - 1 ] . into ( ) ;
343- }
344- }
345- }
346- self . var_for_def ( cause. span , param)
347- } ) ;
348-
349- let trait_ref = ty:: TraitRef :: new_from_args ( self . tcx , trait_def_id, args) ;
350-
351- // Construct an obligation
352- let poly_trait_ref = ty:: Binder :: dummy ( trait_ref) ;
353- ( traits:: Obligation :: new ( self . tcx , cause, self . param_env , poly_trait_ref) , args)
354- }
355-
356327 /// `lookup_method_in_trait` is used for overloaded operators.
357328 /// It does a very narrow slice of what the normal probe/confirm path does.
358329 /// In particular, it doesn't really do any probing: it simply constructs
@@ -365,24 +336,34 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
365336 m_name : Ident ,
366337 trait_def_id : DefId ,
367338 self_ty : Ty < ' tcx > ,
368- opt_input_types : Option < & [ Ty < ' tcx > ] > ,
339+ opt_rhs_ty : Option < Ty < ' tcx > > ,
369340 ) -> Option < InferOk < ' tcx , MethodCallee < ' tcx > > > {
370- let ( obligation, args) =
371- self . obligation_for_method ( cause, trait_def_id, self_ty, opt_input_types) ;
372- self . construct_obligation_for_trait ( m_name, trait_def_id, obligation, args)
373- }
341+ // Construct a trait-reference `self_ty : Trait<input_tys>`
342+ let args = GenericArgs :: for_item ( self . tcx , trait_def_id, |param, _| match param. kind {
343+ GenericParamDefKind :: Lifetime | GenericParamDefKind :: Const { .. } => {
344+ unreachable ! ( "did not expect operator trait to have lifetime/const" )
345+ }
346+ GenericParamDefKind :: Type { .. } => {
347+ if param. index == 0 {
348+ self_ty. into ( )
349+ } else if let Some ( rhs_ty) = opt_rhs_ty {
350+ assert_eq ! ( param. index, 1 , "did not expect >1 param on operator trait" ) ;
351+ rhs_ty. into ( )
352+ } else {
353+ // FIXME: We should stop passing `None` for the failure case
354+ // when probing for call exprs. I.e. `opt_rhs_ty` should always
355+ // be set when it needs to be.
356+ self . var_for_def ( cause. span , param)
357+ }
358+ }
359+ } ) ;
374360
375- // FIXME(#18741): it seems likely that we can consolidate some of this
376- // code with the other method-lookup code. In particular, the second half
377- // of this method is basically the same as confirmation.
378- fn construct_obligation_for_trait (
379- & self ,
380- m_name : Ident ,
381- trait_def_id : DefId ,
382- obligation : traits:: PredicateObligation < ' tcx > ,
383- args : ty:: GenericArgsRef < ' tcx > ,
384- ) -> Option < InferOk < ' tcx , MethodCallee < ' tcx > > > {
385- debug ! ( ?obligation) ;
361+ let obligation = traits:: Obligation :: new (
362+ self . tcx ,
363+ cause,
364+ self . param_env ,
365+ ty:: TraitRef :: new_from_args ( self . tcx , trait_def_id, args) ,
366+ ) ;
386367
387368 // Now we want to know if this can be matched
388369 if !self . predicate_may_hold ( & obligation) {
@@ -406,8 +387,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
406387 debug ! ( "lookup_in_trait_adjusted: method_item={:?}" , method_item) ;
407388 let mut obligations = PredicateObligations :: new ( ) ;
408389
409- // FIXME(effects): revisit when binops get `#[const_trait]`
410-
411390 // Instantiate late-bound regions and instantiate the trait
412391 // parameters into the method type to get the actual method type.
413392 //
@@ -418,12 +397,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
418397 let fn_sig =
419398 self . instantiate_binder_with_fresh_vars ( obligation. cause . span , infer:: FnCall , fn_sig) ;
420399
421- let InferOk { value, obligations : o } =
400+ let InferOk { value : fn_sig , obligations : o } =
422401 self . at ( & obligation. cause , self . param_env ) . normalize ( fn_sig) ;
423- let fn_sig = {
424- obligations. extend ( o) ;
425- value
426- } ;
402+ obligations. extend ( o) ;
427403
428404 // Register obligations for the parameters. This will include the
429405 // `Self` parameter, which in turn has a bound of the main trait,
@@ -435,13 +411,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
435411 // any late-bound regions appearing in its bounds.
436412 let bounds = self . tcx . predicates_of ( def_id) . instantiate ( self . tcx , args) ;
437413
438- let InferOk { value, obligations : o } =
414+ let InferOk { value : bounds , obligations : o } =
439415 self . at ( & obligation. cause , self . param_env ) . normalize ( bounds) ;
440- let bounds = {
441- obligations. extend ( o) ;
442- value
443- } ;
444-
416+ obligations. extend ( o) ;
445417 assert ! ( !bounds. has_escaping_bound_vars( ) ) ;
446418
447419 let predicates_cause = obligation. cause . clone ( ) ;
@@ -454,7 +426,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
454426 // Also add an obligation for the method type being well-formed.
455427 let method_ty = Ty :: new_fn_ptr ( tcx, ty:: Binder :: dummy ( fn_sig) ) ;
456428 debug ! (
457- "lookup_in_trait_adjusted : matched method method_ty={:?} obligation={:?}" ,
429+ "lookup_method_in_trait : matched method method_ty={:?} obligation={:?}" ,
458430 method_ty, obligation
459431 ) ;
460432 obligations. push ( traits:: Obligation :: new (
@@ -467,7 +439,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
467439 ) ) ;
468440
469441 let callee = MethodCallee { def_id, args, sig : fn_sig } ;
470-
471442 debug ! ( "callee = {:?}" , callee) ;
472443
473444 Some ( InferOk { obligations, value : callee } )
0 commit comments