Do not reuse FnDecl for closures
diff --git a/src/expr.rs b/src/expr.rs
index cec6dc2..0b8f4ee 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -200,10 +200,11 @@
         /// A closure (for example, `move |a, b, c| a + b + c`)
         pub Closure(ExprClosure #full {
             pub capture: CaptureBy,
-            pub decl: Box<FnDecl>,
-            pub body: Box<Expr>,
             pub or1_token: Token![|],
+            pub inputs: Delimited<FnArg, Token![,]>,
             pub or2_token: Token![|],
+            pub output: ReturnType,
+            pub body: Box<Expr>,
         }),
 
         /// An unsafe block (`unsafe { ... }`)
@@ -1556,7 +1557,7 @@
                 arrow: punct!(->) >>
                 ty: syn!(Type) >>
                 body: syn!(Block) >>
-                (ReturnType::Type(ty, arrow),
+                (ReturnType::Type(Box::new(ty), arrow),
                  ExprKind::Block(ExprBlock {
                     block: body,
                 }).into())
@@ -1567,16 +1568,9 @@
         (ExprClosure {
             capture: capture,
             or1_token: or1,
+            inputs: inputs,
             or2_token: or2,
-            decl: Box::new(FnDecl {
-                inputs: inputs,
-                output: ret_and_body.0,
-                variadic: false,
-                dot_tokens: None,
-                fn_token: <Token![fn]>::default(),
-                generics: Generics::default(),
-                paren_token: token::Paren::default(),
-            }),
+            output: ret_and_body.0,
             body: Box::new(ret_and_body.1),
         }.into())
     ));
@@ -2587,7 +2581,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             self.capture.to_tokens(tokens);
             self.or1_token.to_tokens(tokens);
-            for item in self.decl.inputs.iter() {
+            for item in self.inputs.iter() {
                 match **item.item() {
                     FnArg::Captured(ArgCaptured {
                         ref pat,
@@ -2601,7 +2595,7 @@
                 item.delimiter().to_tokens(tokens);
             }
             self.or2_token.to_tokens(tokens);
-            self.decl.output.to_tokens(tokens);
+            self.output.to_tokens(tokens);
             self.body.to_tokens(tokens);
         }
     }
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index c8f1ae4..c07f6bf 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -904,10 +904,11 @@
 pub fn fold_expr_closure<V: Folder + ?Sized>(_visitor: &mut V, _i: ExprClosure) -> ExprClosure {
     ExprClosure {
         capture: _visitor.fold_capture_by(_i . capture),
-        decl: Box::new(_visitor.fold_fn_decl(* _i . decl)),
-        body: Box::new(_visitor.fold_expr(* _i . body)),
         or1_token: _i . or1_token,
+        inputs: FoldHelper::lift(_i . inputs, |it| { _visitor.fold_fn_arg(it) }),
         or2_token: _i . or2_token,
+        output: _visitor.fold_return_type(_i . output),
+        body: Box::new(_visitor.fold_expr(* _i . body)),
     }
 }
 # [ cfg ( feature = "full" ) ]
@@ -2285,7 +2286,7 @@
         Default => { Default }
         Type(_binding_0, _binding_1, ) => {
             Type (
-                _visitor.fold_type(_binding_0),
+                Box::new(_visitor.fold_type(* _binding_0)),
                 _binding_1,
             )
         }
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 72d955d..cdfefe3 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -745,10 +745,11 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_expr_closure<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprClosure) {
     _visitor.visit_capture_by(& _i . capture);
-    _visitor.visit_fn_decl(& _i . decl);
-    _visitor.visit_expr(& _i . body);
     // Skipped field _i . or1_token;
+    for el in & _i . inputs { let it = el.item(); _visitor.visit_fn_arg(it) };
     // Skipped field _i . or2_token;
+    _visitor.visit_return_type(& _i . output);
+    _visitor.visit_expr(& _i . body);
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_expr_continue<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ExprContinue) {
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index cc31959..a6afbf9 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -745,10 +745,11 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_expr_closure_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ExprClosure) {
     _visitor.visit_capture_by_mut(& mut _i . capture);
-    _visitor.visit_fn_decl_mut(& mut _i . decl);
-    _visitor.visit_expr_mut(& mut _i . body);
     // Skipped field _i . or1_token;
+    for mut el in & mut _i . inputs { let it = el.item_mut(); _visitor.visit_fn_arg_mut(it) };
     // Skipped field _i . or2_token;
+    _visitor.visit_return_type_mut(& mut _i . output);
+    _visitor.visit_expr_mut(& mut _i . body);
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_expr_continue_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ExprContinue) {
diff --git a/src/ty.rs b/src/ty.rs
index 2fe4ecf..09ee041 100644
--- a/src/ty.rs
+++ b/src/ty.rs
@@ -339,7 +339,7 @@
         /// type would be inserted.
         Default,
         /// Everything else
-        Type(Type, Token![->]),
+        Type(Box<Type>, Token![->]),
     }
 }
 
@@ -597,7 +597,7 @@
             do_parse!(
                 arrow: punct!(->) >>
                 ty: syn!(Type) >>
-                (ReturnType::Type(ty, arrow))
+                (ReturnType::Type(Box::new(ty), arrow))
             )
             |
             epsilon!() => { |_| ReturnType::Default }