@@ -281,21 +281,27 @@ fn missing_constructor(cx: &MatchCheckCtxt, m: &Matrix, left_ty: ty::t) -> Optio
281
281
}
282
282
283
283
fn all_constructors ( cx : & MatchCheckCtxt , m : & Matrix , left_ty : ty:: t ) -> Vec < ctor > {
284
+ // This produces a list of all vector constructors that we would expect to appear
285
+ // in an exhaustive set of patterns. Because such a list would normally be infinite,
286
+ // we narrow it down to only those constructors that actually appear in the inspected
287
+ // column, plus, any that are missing and not covered by a pattern with a destructured slice.
284
288
fn vec_constructors ( m : & Matrix ) -> Vec < ctor > {
285
289
let max_vec_len = m. iter ( ) . map ( |r| match r. get ( 0 ) . node {
286
290
PatVec ( ref before, _, ref after) => before. len ( ) + after. len ( ) ,
287
291
_ => 0 u
288
292
} ) . max ( ) . unwrap_or ( 0 u) ;
289
- let contains_slice = m. iter ( ) . any ( |r| match r. get ( 0 ) . node {
290
- PatVec ( _, ref slice, _) => slice. is_some ( ) ,
291
- _ => false
292
- } ) ;
293
- let lengths = iter:: range_inclusive ( 0 u, if contains_slice {
294
- max_vec_len
295
- } else {
296
- max_vec_len + 1
297
- } ) ;
298
- lengths. map ( |len| vec ( len) ) . collect ( )
293
+ let min_vec_len_with_slice = m. iter ( ) . map ( |r| match r. get ( 0 ) . node {
294
+ PatVec ( ref before, Some ( _) , ref after) => before. len ( ) + after. len ( ) ,
295
+ _ => max_vec_len + 1
296
+ } ) . min ( ) . unwrap_or ( max_vec_len + 1 ) ;
297
+ let other_lengths = m. iter ( ) . map ( |r| match r. get ( 0 ) . node {
298
+ PatVec ( ref before, _, ref after) => before. len ( ) + after. len ( ) ,
299
+ _ => 0 u
300
+ } ) . filter ( |& len| len > min_vec_len_with_slice) ;
301
+ iter:: range_inclusive ( 0 u, min_vec_len_with_slice)
302
+ . chain ( other_lengths)
303
+ . map ( |len| vec ( len) )
304
+ . collect ( )
299
305
}
300
306
301
307
match ty:: get ( left_ty) . sty {
0 commit comments