@@ -21,7 +21,7 @@ use crate::{
21
21
inhabitedness:: { is_enum_variant_uninhabited_from, is_ty_uninhabited_from} ,
22
22
} ;
23
23
24
- use super :: { FieldPat , Pat , PatKind , is_box } ;
24
+ use super :: { FieldPat , Pat , PatKind } ;
25
25
26
26
use Constructor :: * ;
27
27
@@ -170,8 +170,6 @@ impl<'db> MatchCheckCtx<'db> {
170
170
}
171
171
PatKind :: Deref { subpattern } => {
172
172
ctor = match pat. ty . kind ( Interner ) {
173
- // This is a box pattern.
174
- TyKind :: Adt ( adt, _) if is_box ( self . db , adt. 0 ) => Struct ,
175
173
TyKind :: Ref ( ..) => Ref ,
176
174
_ => {
177
175
never ! ( "pattern has unexpected type: pat: {:?}, ty: {:?}" , pat, & pat. ty) ;
@@ -194,23 +192,6 @@ impl<'db> MatchCheckCtx<'db> {
194
192
ctor = Struct ;
195
193
arity = substs. len ( Interner ) ;
196
194
}
197
- TyKind :: Adt ( adt, _) if is_box ( self . db , adt. 0 ) => {
198
- // The only legal patterns of type `Box` (outside `std`) are `_` and box
199
- // patterns. If we're here we can assume this is a box pattern.
200
- // FIXME(Nadrieril): A `Box` can in theory be matched either with `Box(_,
201
- // _)` or a box pattern. As a hack to avoid an ICE with the former, we
202
- // ignore other fields than the first one. This will trigger an error later
203
- // anyway.
204
- // See https://github.com/rust-lang/rust/issues/82772 ,
205
- // explanation: https://github.com/rust-lang/rust/pull/82789#issuecomment-796921977
206
- // The problem is that we can't know from the type whether we'll match
207
- // normally or through box-patterns. We'll have to figure out a proper
208
- // solution when we introduce generalized deref patterns. Also need to
209
- // prevent mixing of those two options.
210
- fields. retain ( |ipat| ipat. idx == 0 ) ;
211
- ctor = Struct ;
212
- arity = 1 ;
213
- }
214
195
& TyKind :: Adt ( AdtId ( adt) , _) => {
215
196
ctor = match pat. kind . as_ref ( ) {
216
197
PatKind :: Leaf { .. } if matches ! ( adt, hir_def:: AdtId :: UnionId ( _) ) => {
@@ -277,12 +258,6 @@ impl<'db> MatchCheckCtx<'db> {
277
258
} )
278
259
. collect ( ) ,
279
260
} ,
280
- TyKind :: Adt ( adt, _) if is_box ( self . db , adt. 0 ) => {
281
- // Without `box_patterns`, the only legal pattern of type `Box` is `_` (outside
282
- // of `std`). So this branch is only reachable when the feature is enabled and
283
- // the pattern is a box pattern.
284
- PatKind :: Deref { subpattern : subpatterns. next ( ) . unwrap ( ) }
285
- }
286
261
TyKind :: Adt ( adt, substs) => {
287
262
let variant = Self :: variant_id_for_adt ( self . db , pat. ctor ( ) , adt. 0 ) . unwrap ( ) ;
288
263
let subpatterns = self
@@ -343,14 +318,8 @@ impl PatCx for MatchCheckCtx<'_> {
343
318
Struct | Variant ( _) | UnionField => match * ty. kind ( Interner ) {
344
319
TyKind :: Tuple ( arity, ..) => arity,
345
320
TyKind :: Adt ( AdtId ( adt) , ..) => {
346
- if is_box ( self . db , adt) {
347
- // The only legal patterns of type `Box` (outside `std`) are `_` and box
348
- // patterns. If we're here we can assume this is a box pattern.
349
- 1
350
- } else {
351
- let variant = Self :: variant_id_for_adt ( self . db , ctor, adt) . unwrap ( ) ;
352
- variant. fields ( self . db ) . fields ( ) . len ( )
353
- }
321
+ let variant = Self :: variant_id_for_adt ( self . db , ctor, adt) . unwrap ( ) ;
322
+ variant. fields ( self . db ) . fields ( ) . len ( )
354
323
}
355
324
_ => {
356
325
never ! ( "Unexpected type for `Single` constructor: {:?}" , ty) ;
@@ -383,29 +352,22 @@ impl PatCx for MatchCheckCtx<'_> {
383
352
tys. cloned ( ) . map ( |ty| ( ty, PrivateUninhabitedField ( false ) ) ) . collect ( )
384
353
}
385
354
TyKind :: Ref ( .., rty) => single ( rty. clone ( ) ) ,
386
- & TyKind :: Adt ( AdtId ( adt) , ref substs) => {
387
- if is_box ( self . db , adt) {
388
- // The only legal patterns of type `Box` (outside `std`) are `_` and box
389
- // patterns. If we're here we can assume this is a box pattern.
390
- let subst_ty = substs. at ( Interner , 0 ) . assert_ty_ref ( Interner ) . clone ( ) ;
391
- single ( subst_ty)
392
- } else {
393
- let variant = Self :: variant_id_for_adt ( self . db , ctor, adt) . unwrap ( ) ;
394
-
395
- let visibilities = LazyCell :: new ( || self . db . field_visibilities ( variant) ) ;
396
-
397
- self . list_variant_fields ( ty, variant)
398
- . map ( move |( fid, ty) | {
399
- let is_visible = || {
400
- matches ! ( adt, hir_def:: AdtId :: EnumId ( ..) )
401
- || visibilities[ fid] . is_visible_from ( self . db , self . module )
402
- } ;
403
- let is_uninhabited = self . is_uninhabited ( & ty) ;
404
- let private_uninhabited = is_uninhabited && !is_visible ( ) ;
405
- ( ty, PrivateUninhabitedField ( private_uninhabited) )
406
- } )
407
- . collect ( )
408
- }
355
+ & TyKind :: Adt ( AdtId ( adt) , ..) => {
356
+ let variant = Self :: variant_id_for_adt ( self . db , ctor, adt) . unwrap ( ) ;
357
+
358
+ let visibilities = LazyCell :: new ( || self . db . field_visibilities ( variant) ) ;
359
+
360
+ self . list_variant_fields ( ty, variant)
361
+ . map ( move |( fid, ty) | {
362
+ let is_visible = || {
363
+ matches ! ( adt, hir_def:: AdtId :: EnumId ( ..) )
364
+ || visibilities[ fid] . is_visible_from ( self . db , self . module )
365
+ } ;
366
+ let is_uninhabited = self . is_uninhabited ( & ty) ;
367
+ let private_uninhabited = is_uninhabited && !is_visible ( ) ;
368
+ ( ty, PrivateUninhabitedField ( private_uninhabited) )
369
+ } )
370
+ . collect ( )
409
371
}
410
372
ty_kind => {
411
373
never ! ( "Unexpected type for `{:?}` constructor: {:?}" , ctor, ty_kind) ;
0 commit comments