@@ -988,8 +988,7 @@ fn extract_vec_elems<'a>(
988
988
pat_id : ast:: NodeId ,
989
989
elem_count : uint ,
990
990
slice : Option < uint > ,
991
- val : ValueRef ,
992
- count : ValueRef )
991
+ val : ValueRef )
993
992
-> ExtractedBlock < ' a > {
994
993
let _icx = push_ctxt ( "match::extract_vec_elems" ) ;
995
994
let vec_datum = match_datum ( bcx, val, pat_id) ;
@@ -1003,7 +1002,7 @@ fn extract_vec_elems<'a>(
1003
1002
Some ( n) if i < n => GEPi ( bcx, base, [ i] ) ,
1004
1003
Some ( n) if i > n => {
1005
1004
InBoundsGEP ( bcx, base, [
1006
- Sub ( bcx, count ,
1005
+ Sub ( bcx, len ,
1007
1006
C_int ( bcx. ccx ( ) , ( elem_count - i) as int ) ) ] )
1008
1007
}
1009
1008
_ => unsafe { llvm:: LLVMGetUndef ( vt. llunit_ty . to_ref ( ) ) }
@@ -1765,7 +1764,7 @@ fn compile_submatch_continue<'a, 'b>(
1765
1764
vec_len_eq => ( n, None )
1766
1765
} ;
1767
1766
let args = extract_vec_elems ( opt_cx, pat_id, n,
1768
- slice, val, test_val ) ;
1767
+ slice, val) ;
1769
1768
size = args. vals . len ( ) ;
1770
1769
unpacked = args. vals . clone ( ) ;
1771
1770
opt_cx = args. bcx ;
@@ -2264,9 +2263,21 @@ fn bind_irrefutable_pat<'a>(
2264
2263
let loaded_val = Load ( bcx, val) ;
2265
2264
bcx = bind_irrefutable_pat ( bcx, inner, loaded_val, binding_mode, cleanup_scope) ;
2266
2265
}
2267
- ast:: PatVec ( ..) => {
2268
- bcx. sess ( ) . span_bug ( pat. span ,
2269
- "vector patterns are never irrefutable!" ) ;
2266
+ ast:: PatVec ( ref before, ref slice, ref after) => {
2267
+ let extracted = extract_vec_elems (
2268
+ bcx, pat. id , before. len ( ) + 1 u + after. len ( ) ,
2269
+ slice. map ( |_| before. len ( ) ) , val
2270
+ ) ;
2271
+ bcx = before
2272
+ . iter ( ) . map ( |v| Some ( * v) )
2273
+ . chain ( Some ( * slice) . move_iter ( ) )
2274
+ . chain ( after. iter ( ) . map ( |v| Some ( * v) ) )
2275
+ . zip ( extracted. vals . iter ( ) )
2276
+ . fold ( bcx, |bcx, ( inner, elem) | {
2277
+ inner. map_or ( bcx, |inner| {
2278
+ bind_irrefutable_pat ( bcx, inner, * elem, binding_mode, cleanup_scope)
2279
+ } )
2280
+ } ) ;
2270
2281
}
2271
2282
ast:: PatMac ( ..) => {
2272
2283
bcx. sess ( ) . span_bug ( pat. span , "unexpanded macro" ) ;
0 commit comments