@@ -11,6 +11,7 @@ use hir_expand::name::Name;
1111use rustc_ast_ir:: Mutability ;
1212use rustc_type_ir:: inherent:: { GenericArg as _, GenericArgs as _, IntoKind , SliceLike , Ty as _} ;
1313use stdx:: TupleExt ;
14+ use syntax:: ast:: RangeOp ;
1415
1516use crate :: {
1617 DeclContext , DeclOrigin , InferenceDiagnostic ,
@@ -349,9 +350,51 @@ impl<'db> InferenceContext<'_, 'db> {
349350 self . infer_slice_pat ( expected, prefix, * slice, suffix, default_bm, decl)
350351 }
351352 Pat :: Wild => expected,
352- Pat :: Range { .. } => {
353- // FIXME: do some checks here.
354- expected
353+ Pat :: Range { start, end, range_type } => {
354+ // FIXME: Expectation
355+ let lhs_expectation = Expectation :: none ( ) ;
356+ let lhs_ty =
357+ start. map ( |start| self . infer_expr ( start, & lhs_expectation, ExprIsRead :: Yes ) ) ;
358+ let rhs_expectation = lhs_ty. map_or_else ( Expectation :: none, Expectation :: HasType ) ;
359+ let rhs_ty = end. map ( |end| self . infer_expr ( end, & rhs_expectation, ExprIsRead :: Yes ) ) ;
360+ let single_arg_adt = |adt, ty : Ty < ' db > | {
361+ Ty :: new_adt (
362+ self . interner ( ) ,
363+ adt,
364+ GenericArgs :: new_from_iter ( self . interner ( ) , [ ty. into ( ) ] ) ,
365+ )
366+ } ;
367+ match ( range_type, lhs_ty, rhs_ty) {
368+ ( RangeOp :: Exclusive , None , None ) => match self . resolve_range_full ( ) {
369+ Some ( adt) => Ty :: new_adt ( self . interner ( ) , adt, self . types . empty_args ) ,
370+ None => self . err_ty ( ) ,
371+ } ,
372+ ( RangeOp :: Exclusive , None , Some ( ty) ) => match self . resolve_range_to ( ) {
373+ Some ( adt) => single_arg_adt ( adt, ty) ,
374+ None => self . err_ty ( ) ,
375+ } ,
376+ ( RangeOp :: Inclusive , None , Some ( ty) ) => {
377+ match self . resolve_range_to_inclusive ( ) {
378+ Some ( adt) => single_arg_adt ( adt, ty) ,
379+ None => self . err_ty ( ) ,
380+ }
381+ }
382+ ( RangeOp :: Exclusive , Some ( _) , Some ( ty) ) => match self . resolve_range ( ) {
383+ Some ( adt) => single_arg_adt ( adt, ty) ,
384+ None => self . err_ty ( ) ,
385+ } ,
386+ ( RangeOp :: Inclusive , Some ( _) , Some ( ty) ) => {
387+ match self . resolve_range_inclusive ( ) {
388+ Some ( adt) => single_arg_adt ( adt, ty) ,
389+ None => self . err_ty ( ) ,
390+ }
391+ }
392+ ( RangeOp :: Exclusive , Some ( ty) , None ) => match self . resolve_range_from ( ) {
393+ Some ( adt) => single_arg_adt ( adt, ty) ,
394+ None => self . err_ty ( ) ,
395+ } ,
396+ ( RangeOp :: Inclusive , _, None ) => self . err_ty ( ) ,
397+ }
355398 }
356399 & Pat :: Lit ( expr) => {
357400 // Don't emit type mismatches again, the expression lowering already did that.
0 commit comments