@@ -75,18 +75,15 @@ impl<'p> MatchCheckCtx<'p> {
7575 }
7676 }
7777
78- fn variant_id_for_adt ( & self , ctor : & Constructor < Self > , adt : hir_def:: AdtId ) -> VariantId {
78+ fn variant_id_for_adt ( ctor : & Constructor < Self > , adt : hir_def:: AdtId ) -> Option < VariantId > {
7979 match ctor {
80- & Variant ( id) => id. into ( ) ,
81- Struct | UnionField => {
82- assert ! ( !matches!( adt, hir_def:: AdtId :: EnumId ( _) ) ) ;
83- match adt {
84- hir_def:: AdtId :: EnumId ( _) => unreachable ! ( ) ,
85- hir_def:: AdtId :: StructId ( id) => id. into ( ) ,
86- hir_def:: AdtId :: UnionId ( id) => id. into ( ) ,
87- }
88- }
89- _ => panic ! ( "bad constructor {self:?} for adt {adt:?}" ) ,
80+ & Variant ( id) => Some ( id. into ( ) ) ,
81+ Struct | UnionField => match adt {
82+ hir_def:: AdtId :: EnumId ( _) => None ,
83+ hir_def:: AdtId :: StructId ( id) => Some ( id. into ( ) ) ,
84+ hir_def:: AdtId :: UnionId ( id) => Some ( id. into ( ) ) ,
85+ } ,
86+ _ => panic ! ( "bad constructor {ctor:?} for adt {adt:?}" ) ,
9087 }
9188 }
9289
@@ -200,7 +197,7 @@ impl<'p> MatchCheckCtx<'p> {
200197 Wildcard
201198 }
202199 } ;
203- let variant = self . variant_id_for_adt ( & ctor, adt. 0 ) ;
200+ let variant = Self :: variant_id_for_adt ( & ctor, adt. 0 ) . unwrap ( ) ;
204201 let fields_len = variant. variant_data ( self . db . upcast ( ) ) . fields ( ) . len ( ) ;
205202 // For each field in the variant, we store the relevant index into `self.fields` if any.
206203 let mut field_id_to_id: Vec < Option < usize > > = vec ! [ None ; fields_len] ;
@@ -266,7 +263,7 @@ impl<'p> MatchCheckCtx<'p> {
266263 PatKind :: Deref { subpattern : subpatterns. next ( ) . unwrap ( ) }
267264 }
268265 TyKind :: Adt ( adt, substs) => {
269- let variant = self . variant_id_for_adt ( pat. ctor ( ) , adt. 0 ) ;
266+ let variant = Self :: variant_id_for_adt ( pat. ctor ( ) , adt. 0 ) . unwrap ( ) ;
270267 let subpatterns = self
271268 . list_variant_nonhidden_fields ( pat. ty ( ) , variant)
272269 . zip ( subpatterns)
@@ -327,7 +324,7 @@ impl<'p> TypeCx for MatchCheckCtx<'p> {
327324 // patterns. If we're here we can assume this is a box pattern.
328325 1
329326 } else {
330- let variant = self . variant_id_for_adt ( ctor, adt) ;
327+ let variant = Self :: variant_id_for_adt ( ctor, adt) . unwrap ( ) ;
331328 self . list_variant_nonhidden_fields ( ty, variant) . count ( )
332329 }
333330 }
@@ -370,7 +367,7 @@ impl<'p> TypeCx for MatchCheckCtx<'p> {
370367 let subst_ty = substs. at ( Interner , 0 ) . assert_ty_ref ( Interner ) . clone ( ) ;
371368 alloc ( self , once ( subst_ty) )
372369 } else {
373- let variant = self . variant_id_for_adt ( ctor, adt) ;
370+ let variant = Self :: variant_id_for_adt ( ctor, adt) . unwrap ( ) ;
374371 let tys = self . list_variant_nonhidden_fields ( ty, variant) . map ( |( _, ty) | ty) ;
375372 alloc ( self , tys)
376373 }
0 commit comments