@@ -281,21 +281,27 @@ fn missing_constructor(cx: &MatchCheckCtxt, m: &Matrix, left_ty: ty::t) -> Optio
281281}
282282
283283fn 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.
284288 fn vec_constructors ( m : & Matrix ) -> Vec < ctor > {
285289 let max_vec_len = m. iter ( ) . map ( |r| match r. get ( 0 ) . node {
286290 PatVec ( ref before, _, ref after) => before. len ( ) + after. len ( ) ,
287291 _ => 0 u
288292 } ) . 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 ( )
299305 }
300306
301307 match ty:: get ( left_ty) . sty {
0 commit comments