File tree Expand file tree Collapse file tree 3 files changed +20
-2
lines changed Expand file tree Collapse file tree 3 files changed +20
-2
lines changed Original file line number Diff line number Diff line change @@ -835,8 +835,12 @@ impl ExprCollector<'_> {
835835
836836 Pat :: Missing
837837 }
838+ ast:: Pat :: BoxPat ( boxpat) => {
839+ let inner = self . collect_pat_opt ( boxpat. pat ( ) ) ;
840+ Pat :: Box { inner }
841+ }
838842 // FIXME: implement
839- ast:: Pat :: BoxPat ( _ ) | ast :: Pat :: RangePat ( _) | ast:: Pat :: MacroPat ( _) => Pat :: Missing ,
843+ ast:: Pat :: RangePat ( _) | ast:: Pat :: MacroPat ( _) => Pat :: Missing ,
840844 } ;
841845 let ptr = AstPtr :: new ( & pat) ;
842846 self . alloc_pat ( pattern, Either :: Left ( ptr) )
Original file line number Diff line number Diff line change @@ -395,6 +395,7 @@ pub enum Pat {
395395 Bind { mode : BindingAnnotation , name : Name , subpat : Option < PatId > } ,
396396 TupleStruct { path : Option < Path > , args : Vec < PatId > , ellipsis : Option < usize > } ,
397397 Ref { pat : PatId , mutability : Mutability } ,
398+ Box { inner : PatId } ,
398399}
399400
400401impl Pat {
@@ -415,6 +416,7 @@ impl Pat {
415416 Pat :: Record { args, .. } => {
416417 args. iter ( ) . map ( |f| f. pat ) . for_each ( f) ;
417418 }
419+ Pat :: Box { inner } => f ( * inner) ,
418420 }
419421 }
420422}
Original file line number Diff line number Diff line change @@ -209,6 +209,18 @@ impl<'a> InferenceContext<'a> {
209209 end_ty
210210 }
211211 Pat :: Lit ( expr) => self . infer_expr ( * expr, & Expectation :: has_type ( expected. clone ( ) ) ) ,
212+ Pat :: Box { inner } => match self . resolve_boxed_box ( ) {
213+ Some ( box_adt) => {
214+ let inner_expected = match expected. as_adt ( ) {
215+ Some ( ( adt, substs) ) if adt == box_adt => substs. as_single ( ) ,
216+ _ => & Ty :: Unknown ,
217+ } ;
218+
219+ let inner_ty = self . infer_pat ( * inner, inner_expected, default_bm) ;
220+ Ty :: apply_one ( TypeCtor :: Adt ( box_adt) , inner_ty)
221+ }
222+ None => Ty :: Unknown ,
223+ } ,
212224 Pat :: Missing => Ty :: Unknown ,
213225 } ;
214226 // use a new type variable if we got Ty::Unknown here
@@ -236,6 +248,6 @@ fn is_non_ref_pat(body: &hir_def::body::Body, pat: PatId) -> bool {
236248 Expr :: Literal ( Literal :: String ( ..) ) => false ,
237249 _ => true ,
238250 } ,
239- Pat :: Wild | Pat :: Bind { .. } | Pat :: Ref { .. } | Pat :: Missing => false ,
251+ Pat :: Wild | Pat :: Bind { .. } | Pat :: Ref { .. } | Pat :: Box { .. } | Pat :: Missing => false ,
240252 }
241253}
You can’t perform that action at this time.
0 commit comments