Fix placement of where-clause in tuple structs
diff --git a/src/data.rs b/src/data.rs
index 9e8e9b4..26367dd 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -51,24 +51,40 @@
 #[cfg(feature = "parsing")]
 pub mod parsing {
     use super::*;
+    use WhereClause;
     use attr::parsing::outer_attr;
     use constant::parsing::const_expr;
+    use generics::parsing::where_clause;
     use ident::parsing::ident;
     use ty::parsing::ty;
 
-    named!(pub struct_body -> VariantData, alt!(
-        struct_like_body => { VariantData::Struct }
+    named!(pub struct_body -> (WhereClause, VariantData), alt!(
+        do_parse!(
+            wh: where_clause >>
+            body: struct_like_body >>
+            (wh, VariantData::Struct(body))
+        )
         |
-        terminated!(tuple_like_body, punct!(";")) => { VariantData::Tuple }
+        do_parse!(
+            body: tuple_like_body >>
+            wh: where_clause >>
+            punct!(";") >>
+            (wh, VariantData::Tuple(body))
+        )
         |
-        punct!(";") => { |_| VariantData::Unit }
+        do_parse!(
+            wh: where_clause >>
+            punct!(";") >>
+            (wh, VariantData::Unit)
+        )
     ));
 
-    named!(pub enum_body -> Vec<Variant>, do_parse!(
+    named!(pub enum_body -> (WhereClause, Vec<Variant>), do_parse!(
+        wh: where_clause >>
         punct!("{") >>
         variants: terminated_list!(punct!(","), variant) >>
         punct!("}") >>
-        (variants)
+        (wh, variants)
     ));
 
     named!(variant -> Variant, do_parse!(
diff --git a/src/item.rs b/src/item.rs
index 3feed24..a140f8e 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -1102,14 +1102,21 @@
                     tokens.append("struct");
                     self.ident.to_tokens(tokens);
                     generics.to_tokens(tokens);
-                    generics.where_clause.to_tokens(tokens);
-                    variant_data.to_tokens(tokens);
                     match *variant_data {
                         VariantData::Struct(_) => {
+                            generics.where_clause.to_tokens(tokens);
+                            variant_data.to_tokens(tokens);
                             // no semicolon
                         }
-                        VariantData::Tuple(_) |
-                        VariantData::Unit => tokens.append(";"),
+                        VariantData::Tuple(_) => {
+                            variant_data.to_tokens(tokens);
+                            generics.where_clause.to_tokens(tokens);
+                            tokens.append(";");
+                        }
+                        VariantData::Unit => {
+                            generics.where_clause.to_tokens(tokens);
+                            tokens.append(";");
+                        }
                     }
                 }
                 ItemKind::Union(ref variant_data, ref generics) => {
diff --git a/src/macro_input.rs b/src/macro_input.rs
index 00a31e1..3abdc3d 100644
--- a/src/macro_input.rs
+++ b/src/macro_input.rs
@@ -21,7 +21,7 @@
     use Generics;
     use attr::parsing::outer_attr;
     use data::parsing::{visibility, struct_body, enum_body};
-    use generics::parsing::{generics, where_clause};
+    use generics::parsing::generics;
     use ident::parsing::ident;
 
     named!(pub macro_input -> MacroInput, do_parse!(
@@ -30,25 +30,24 @@
         which: alt!(keyword!("struct") | keyword!("enum")) >>
         id: ident >>
         generics: generics >>
-        where_clause: where_clause >>
         item: switch!(value!(which),
-            "struct" => map!(struct_body, move |body| MacroInput {
+            "struct" => map!(struct_body, move |(wh, body)| MacroInput {
                 ident: id,
                 vis: vis,
                 attrs: attrs,
                 generics: Generics {
-                    where_clause: where_clause,
+                    where_clause: wh,
                     .. generics
                 },
                 body: Body::Struct(body),
             })
             |
-            "enum" => map!(enum_body, move |body| MacroInput {
+            "enum" => map!(enum_body, move |(wh, body)| MacroInput {
                 ident: id,
                 vis: vis,
                 attrs: attrs,
                 generics: Generics {
-                    where_clause: where_clause,
+                    where_clause: wh,
                     .. generics
                 },
                 body: Body::Enum(body),
@@ -77,15 +76,9 @@
             }
             self.ident.to_tokens(tokens);
             self.generics.to_tokens(tokens);
-            self.generics.where_clause.to_tokens(tokens);
-            self.body.to_tokens(tokens);
-        }
-    }
-
-    impl ToTokens for Body {
-        fn to_tokens(&self, tokens: &mut Tokens) {
-            match *self {
+            match self.body {
                 Body::Enum(ref variants) => {
+                    self.generics.where_clause.to_tokens(tokens);
                     tokens.append("{");
                     for variant in variants {
                         variant.to_tokens(tokens);
@@ -94,13 +87,21 @@
                     tokens.append("}");
                 }
                 Body::Struct(ref variant_data) => {
-                    variant_data.to_tokens(tokens);
                     match *variant_data {
                         VariantData::Struct(_) => {
+                            self.generics.where_clause.to_tokens(tokens);
+                            variant_data.to_tokens(tokens);
                             // no semicolon
                         }
-                        VariantData::Tuple(_) |
-                        VariantData::Unit => tokens.append(";"),
+                        VariantData::Tuple(_) => {
+                            variant_data.to_tokens(tokens);
+                            self.generics.where_clause.to_tokens(tokens);
+                            tokens.append(";");
+                        }
+                        VariantData::Unit => {
+                            self.generics.where_clause.to_tokens(tokens);
+                            tokens.append(";");
+                        }
                     }
                 }
             }