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<'_> {
835
835
836
836
Pat :: Missing
837
837
}
838
+ ast:: Pat :: BoxPat ( boxpat) => {
839
+ let inner = self . collect_pat_opt ( boxpat. pat ( ) ) ;
840
+ Pat :: Box { inner }
841
+ }
838
842
// FIXME: implement
839
- ast:: Pat :: BoxPat ( _ ) | ast :: Pat :: RangePat ( _) | ast:: Pat :: MacroPat ( _) => Pat :: Missing ,
843
+ ast:: Pat :: RangePat ( _) | ast:: Pat :: MacroPat ( _) => Pat :: Missing ,
840
844
} ;
841
845
let ptr = AstPtr :: new ( & pat) ;
842
846
self . alloc_pat ( pattern, Either :: Left ( ptr) )
Original file line number Diff line number Diff line change @@ -395,6 +395,7 @@ pub enum Pat {
395
395
Bind { mode : BindingAnnotation , name : Name , subpat : Option < PatId > } ,
396
396
TupleStruct { path : Option < Path > , args : Vec < PatId > , ellipsis : Option < usize > } ,
397
397
Ref { pat : PatId , mutability : Mutability } ,
398
+ Box { inner : PatId } ,
398
399
}
399
400
400
401
impl Pat {
@@ -415,6 +416,7 @@ impl Pat {
415
416
Pat :: Record { args, .. } => {
416
417
args. iter ( ) . map ( |f| f. pat ) . for_each ( f) ;
417
418
}
419
+ Pat :: Box { inner } => f ( * inner) ,
418
420
}
419
421
}
420
422
}
Original file line number Diff line number Diff line change @@ -209,6 +209,18 @@ impl<'a> InferenceContext<'a> {
209
209
end_ty
210
210
}
211
211
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
+ } ,
212
224
Pat :: Missing => Ty :: Unknown ,
213
225
} ;
214
226
// 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 {
236
248
Expr :: Literal ( Literal :: String ( ..) ) => false ,
237
249
_ => true ,
238
250
} ,
239
- Pat :: Wild | Pat :: Bind { .. } | Pat :: Ref { .. } | Pat :: Missing => false ,
251
+ Pat :: Wild | Pat :: Bind { .. } | Pat :: Ref { .. } | Pat :: Box { .. } | Pat :: Missing => false ,
240
252
}
241
253
}
You can’t perform that action at this time.
0 commit comments