Parse multiple patterns in if-let and while-let
diff --git a/src/expr.rs b/src/expr.rs
index 11cee91..e770fde 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -242,7 +242,7 @@
             pub attrs: Vec<Attribute>,
             pub if_token: Token![if],
             pub let_token: Token![let],
-            pub pat: Box<Pat>,
+            pub pats: Punctuated<Pat, Token![|]>,
             pub eq_token: Token![=],
             pub expr: Box<Expr>,
             pub then_branch: Block,
@@ -268,7 +268,7 @@
             pub label: Option<Label>,
             pub while_token: Token![while],
             pub let_token: Token![let],
-            pub pat: Box<Pat>,
+            pub pats: Punctuated<Pat, Token![|]>,
             pub eq_token: Token![=],
             pub expr: Box<Expr>,
             pub body: Block,
@@ -764,7 +764,7 @@
     pub struct Local {
         pub attrs: Vec<Attribute>,
         pub let_token: Token![let],
-        pub pat: Box<Pat>,
+        pub pats: Punctuated<Pat, Token![|]>,
         pub ty: Option<(Token![:], Box<Type>)>,
         pub init: Option<(Token![=], Box<Expr>)>,
         pub semi_token: Token![;],
@@ -1758,14 +1758,14 @@
         named!(parse -> Self, do_parse!(
             if_: keyword!(if) >>
             let_: keyword!(let) >>
-            pat: syn!(Pat) >>
+            pats: call!(Punctuated::parse_separated_nonempty) >>
             eq: punct!(=) >>
             cond: expr_no_struct >>
             then_block: braces!(Block::parse_within) >>
             else_block: option!(else_block) >>
             (ExprIfLet {
                 attrs: Vec::new(),
-                pat: Box::new(pat),
+                pats: pats,
                 let_token: let_,
                 eq_token: eq,
                 expr: Box::new(cond),
@@ -2043,7 +2043,7 @@
             label: option!(syn!(Label)) >>
             while_: keyword!(while) >>
             let_: keyword!(let) >>
-            pat: syn!(Pat) >>
+            pats: call!(Punctuated::parse_separated_nonempty) >>
             eq: punct!(=) >>
             value: expr_no_struct >>
             while_block: syn!(Block) >>
@@ -2052,7 +2052,7 @@
                 eq_token: eq,
                 let_token: let_,
                 while_token: while_,
-                pat: Box::new(pat),
+                pats: pats,
                 expr: Box::new(value),
                 body: while_block,
                 label: label,
@@ -2384,14 +2384,14 @@
     named!(stmt_local -> Stmt, do_parse!(
         attrs: many0!(Attribute::parse_outer) >>
         let_: keyword!(let) >>
-        pat: syn!(Pat) >>
+        pats: call!(Punctuated::parse_separated_nonempty) >>
         ty: option!(tuple!(punct!(:), syn!(Type))) >>
         init: option!(tuple!(punct!(=), syn!(Expr))) >>
         semi: punct!(;) >>
         (Stmt::Local(Local {
             attrs: attrs,
             let_token: let_,
-            pat: Box::new(pat),
+            pats: pats,
             ty: ty.map(|(colon, ty)| (colon, Box::new(ty))),
             init: init.map(|(eq, expr)| (eq, Box::new(expr))),
             semi_token: semi,
@@ -3010,7 +3010,7 @@
             tokens.append_all(self.attrs.outer());
             self.if_token.to_tokens(tokens);
             self.let_token.to_tokens(tokens);
-            self.pat.to_tokens(tokens);
+            self.pats.to_tokens(tokens);
             self.eq_token.to_tokens(tokens);
             wrap_bare_struct(tokens, &self.expr);
             self.then_branch.to_tokens(tokens);
@@ -3036,7 +3036,7 @@
             self.label.to_tokens(tokens);
             self.while_token.to_tokens(tokens);
             self.let_token.to_tokens(tokens);
-            self.pat.to_tokens(tokens);
+            self.pats.to_tokens(tokens);
             self.eq_token.to_tokens(tokens);
             wrap_bare_struct(tokens, &self.expr);
             self.body.to_tokens(tokens);
@@ -3565,7 +3565,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             tokens.append_all(self.attrs.outer());
             self.let_token.to_tokens(tokens);
-            self.pat.to_tokens(tokens);
+            self.pats.to_tokens(tokens);
             if let Some((ref colon_token, ref ty)) = self.ty {
                 colon_token.to_tokens(tokens);
                 ty.to_tokens(tokens);
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 3676070..e53ff9a 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -1142,7 +1142,7 @@
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         if_token: Token ! [ if ](tokens_helper(_visitor, &(_i . if_token).0)),
         let_token: Token ! [ let ](tokens_helper(_visitor, &(_i . let_token).0)),
-        pat: Box::new(_visitor.fold_pat(* _i . pat)),
+        pats: FoldHelper::lift(_i . pats, |it| { _visitor.fold_pat(it) }),
         eq_token: Token ! [ = ](tokens_helper(_visitor, &(_i . eq_token).0)),
         expr: Box::new(_visitor.fold_expr(* _i . expr)),
         then_branch: _visitor.fold_block(_i . then_branch),
@@ -1342,7 +1342,7 @@
         label: (_i . label).map(|it| { _visitor.fold_label(it) }),
         while_token: Token ! [ while ](tokens_helper(_visitor, &(_i . while_token).0)),
         let_token: Token ! [ let ](tokens_helper(_visitor, &(_i . let_token).0)),
-        pat: Box::new(_visitor.fold_pat(* _i . pat)),
+        pats: FoldHelper::lift(_i . pats, |it| { _visitor.fold_pat(it) }),
         eq_token: Token ! [ = ](tokens_helper(_visitor, &(_i . eq_token).0)),
         expr: Box::new(_visitor.fold_expr(* _i . expr)),
         body: _visitor.fold_block(_i . body),
@@ -2051,7 +2051,7 @@
     Local {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         let_token: Token ! [ let ](tokens_helper(_visitor, &(_i . let_token).0)),
-        pat: Box::new(_visitor.fold_pat(* _i . pat)),
+        pats: FoldHelper::lift(_i . pats, |it| { _visitor.fold_pat(it) }),
         ty: (_i . ty).map(|it| { (
             Token ! [ : ](tokens_helper(_visitor, &(( it ) . 0).0)),
             Box::new(_visitor.fold_type(* ( it ) . 1)),
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index c42740a..1298276 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -901,7 +901,7 @@
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     tokens_helper(_visitor, &(& _i . if_token).0);
     tokens_helper(_visitor, &(& _i . let_token).0);
-    _visitor.visit_pat(& * _i . pat);
+    for el in Punctuated::pairs(& _i . pats) { let it = el.value(); _visitor.visit_pat(it) };
     tokens_helper(_visitor, &(& _i . eq_token).0);
     _visitor.visit_expr(& * _i . expr);
     _visitor.visit_block(& _i . then_branch);
@@ -1057,7 +1057,7 @@
     if let Some(ref it) = _i . label { _visitor.visit_label(it) };
     tokens_helper(_visitor, &(& _i . while_token).0);
     tokens_helper(_visitor, &(& _i . let_token).0);
-    _visitor.visit_pat(& * _i . pat);
+    for el in Punctuated::pairs(& _i . pats) { let it = el.value(); _visitor.visit_pat(it) };
     tokens_helper(_visitor, &(& _i . eq_token).0);
     _visitor.visit_expr(& * _i . expr);
     _visitor.visit_block(& _i . body);
@@ -1620,7 +1620,7 @@
 pub fn visit_local<'ast, V: Visit<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Local) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     tokens_helper(_visitor, &(& _i . let_token).0);
-    _visitor.visit_pat(& * _i . pat);
+    for el in Punctuated::pairs(& _i . pats) { let it = el.value(); _visitor.visit_pat(it) };
     if let Some(ref it) = _i . ty { 
             tokens_helper(_visitor, &(& ( it ) . 0).0);
             _visitor.visit_type(& * ( it ) . 1);
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 44e6e35..95a358a 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -902,7 +902,7 @@
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     tokens_helper(_visitor, &mut (& mut _i . if_token).0);
     tokens_helper(_visitor, &mut (& mut _i . let_token).0);
-    _visitor.visit_pat_mut(& mut * _i . pat);
+    for mut el in Punctuated::pairs_mut(& mut _i . pats) { let it = el.value_mut(); _visitor.visit_pat_mut(it) };
     tokens_helper(_visitor, &mut (& mut _i . eq_token).0);
     _visitor.visit_expr_mut(& mut * _i . expr);
     _visitor.visit_block_mut(& mut _i . then_branch);
@@ -1058,7 +1058,7 @@
     if let Some(ref mut it) = _i . label { _visitor.visit_label_mut(it) };
     tokens_helper(_visitor, &mut (& mut _i . while_token).0);
     tokens_helper(_visitor, &mut (& mut _i . let_token).0);
-    _visitor.visit_pat_mut(& mut * _i . pat);
+    for mut el in Punctuated::pairs_mut(& mut _i . pats) { let it = el.value_mut(); _visitor.visit_pat_mut(it) };
     tokens_helper(_visitor, &mut (& mut _i . eq_token).0);
     _visitor.visit_expr_mut(& mut * _i . expr);
     _visitor.visit_block_mut(& mut _i . body);
@@ -1621,7 +1621,7 @@
 pub fn visit_local_mut<V: VisitMut + ?Sized>(_visitor: &mut V, _i: &mut Local) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     tokens_helper(_visitor, &mut (& mut _i . let_token).0);
-    _visitor.visit_pat_mut(& mut * _i . pat);
+    for mut el in Punctuated::pairs_mut(& mut _i . pats) { let it = el.value_mut(); _visitor.visit_pat_mut(it) };
     if let Some(ref mut it) = _i . ty { 
             tokens_helper(_visitor, &mut (& mut ( it ) . 0).0);
             _visitor.visit_type_mut(& mut * ( it ) . 1);