@@ -11,7 +11,7 @@ use rustc_hir_analysis::hir_ty_lowering::HirTyLowerer;
1111use rustc_infer:: infer:: { BoundRegionConversionTime , DefineOpaqueTypes , InferOk , InferResult } ;
1212use rustc_infer:: traits:: { ObligationCauseCode , PredicateObligations } ;
1313use rustc_macros:: { TypeFoldable , TypeVisitable } ;
14- use rustc_middle:: span_bug;
14+ use rustc_middle:: { bug , span_bug} ;
1515use rustc_middle:: ty:: {
1616 self , ClosureKind , GenericArgs , Ty , TyCtxt , TypeSuperVisitable , TypeVisitable ,
1717 TypeVisitableExt , TypeVisitor ,
@@ -340,6 +340,35 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
340340 ( None , None )
341341 }
342342 } ,
343+ ty:: Closure ( _, args) => match closure_kind {
344+ hir:: ClosureKind :: Closure => {
345+ let closure_args = args. as_closure ( ) ;
346+ let sig = closure_args. sig ( ) ;
347+ tracing:: debug!( ?closure_args, ?sig) ;
348+ let sig = sig. map_bound ( |sig| {
349+ let inputs = sig. inputs_and_output . first ( ) . unwrap ( ) ;
350+ let inputs = match inputs. kind ( ) {
351+ ty:: Tuple ( tys) => tys,
352+ _ => bug ! ( ) ,
353+ } ;
354+ let output = sig. inputs_and_output . last ( ) . unwrap ( ) ;
355+ let inputs_and_output = self . tcx . mk_type_list ( & inputs. iter ( ) . chain ( [ * output] ) . collect :: < smallvec:: SmallVec < [ _ ; 4 ] > > ( ) ) ;
356+ ty:: FnSig {
357+ abi : sig. abi ,
358+ safety : sig. safety ,
359+ c_variadic : sig. c_variadic ,
360+ inputs_and_output,
361+ }
362+ } ) ;
363+ tracing:: debug!( ?sig) ;
364+ let expected_sig = ExpectedSig { cause_span : None , sig } ;
365+ let kind = closure_args. kind_ty ( ) . to_opt_closure_kind ( ) ;
366+ ( Some ( expected_sig) , kind)
367+ }
368+ hir:: ClosureKind :: Coroutine ( _) | hir:: ClosureKind :: CoroutineClosure ( _) => {
369+ ( None , None )
370+ }
371+ }
343372 _ => ( None , None ) ,
344373 }
345374 }
0 commit comments