Make WhereClause always hold a `where` token
diff --git a/src/derive.rs b/src/derive.rs
index a007c03..5d92a10 100644
--- a/src/derive.rs
+++ b/src/derive.rs
@@ -98,29 +98,29 @@
         }
     }
 
-    named!(struct_body -> (WhereClause, VariantData, Option<Token![;]>), alt!(
+    named!(struct_body -> (Option<WhereClause>, VariantData, Option<Token![;]>), alt!(
         do_parse!(
-            wh: syn!(WhereClause) >>
+            wh: option!(syn!(WhereClause)) >>
             body: struct_like_body >>
             (wh, VariantData::Struct(body.0, body.1), None)
         )
         |
         do_parse!(
             body: tuple_like_body >>
-            wh: syn!(WhereClause) >>
+            wh: option!(syn!(WhereClause)) >>
             semi: punct!(;) >>
             (wh, VariantData::Tuple(body.0, body.1), Some(semi))
         )
         |
         do_parse!(
-            wh: syn!(WhereClause) >>
+            wh: option!(syn!(WhereClause)) >>
             semi: punct!(;) >>
             (wh, VariantData::Unit, Some(semi))
         )
     ));
 
-    named!(enum_body -> (WhereClause, Delimited<Variant, Token![,]>, token::Brace), do_parse!(
-        wh: syn!(WhereClause) >>
+    named!(enum_body -> (Option<WhereClause>, Delimited<Variant, Token![,]>, token::Brace), do_parse!(
+        wh: option!(syn!(WhereClause)) >>
         data: braces!(Delimited::parse_terminated) >>
         (wh, data.0, data.1)
     ));
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 7b976d7..b7165ef 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -1518,7 +1518,7 @@
         lt_token: _i . lt_token,
         params: FoldHelper::lift(_i . params, |it| { _visitor.fold_generic_param(it) }),
         gt_token: _i . gt_token,
-        where_clause: _visitor.fold_where_clause(_i . where_clause),
+        where_clause: (_i . where_clause).map(|it| { _visitor.fold_where_clause(it) }),
     }
 }
 
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index ead15c9..ca2b407 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -1183,7 +1183,7 @@
     // Skipped field _i . lt_token;
     for el in & _i . params { let it = el.item(); _visitor.visit_generic_param(it) };
     // Skipped field _i . gt_token;
-    _visitor.visit_where_clause(& _i . where_clause);
+    if let Some(ref it) = _i . where_clause { _visitor.visit_where_clause(it) };
 }
 
 pub fn visit_ident<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Ident) {
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 38cc19e..2dae4a7 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -1183,7 +1183,7 @@
     // Skipped field _i . lt_token;
     for mut el in & mut _i . params { let it = el.item_mut(); _visitor.visit_generic_param_mut(it) };
     // Skipped field _i . gt_token;
-    _visitor.visit_where_clause_mut(& mut _i . where_clause);
+    if let Some(ref mut it) = _i . where_clause { _visitor.visit_where_clause_mut(it) };
 }
 
 pub fn visit_ident_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Ident) {
diff --git a/src/generics.rs b/src/generics.rs
index 706aace..970428b 100644
--- a/src/generics.rs
+++ b/src/generics.rs
@@ -9,7 +9,7 @@
         pub lt_token: Option<Token![<]>,
         pub params: Delimited<GenericParam, Token![,]>,
         pub gt_token: Option<Token![>]>,
-        pub where_clause: WhereClause,
+        pub where_clause: Option<WhereClause>,
     }
 }
 
@@ -83,8 +83,8 @@
     /// # ;
     /// # }
     /// ```
-    pub fn split_for_impl(&self) -> (ImplGenerics, TypeGenerics, &WhereClause) {
-        (ImplGenerics(self), TypeGenerics(self), &self.where_clause)
+    pub fn split_for_impl(&self) -> (ImplGenerics, TypeGenerics, Option<&WhereClause>) {
+        (ImplGenerics(self), TypeGenerics(self), self.where_clause.as_ref())
     }
 }
 
@@ -154,19 +154,12 @@
 
 ast_struct! {
     /// A `where` clause in a definition
-    #[derive(Default)]
     pub struct WhereClause {
-        pub where_token: Option<Token![where]>,
+        pub where_token: Token![where],
         pub predicates: Delimited<WherePredicate, Token![,]>,
     }
 }
 
-impl WhereClause {
-    pub fn none() -> Self {
-        WhereClause::default()
-    }
-}
-
 ast_enum_of_structs! {
     /// A single predicate in a `where` clause
     pub enum WherePredicate {
@@ -232,7 +225,7 @@
                     .collect::<Vec<_>>()
                     .into(),
                 gt_token: gt,
-                where_clause: WhereClause::default(),
+                where_clause: None,
             }
         ));
     }
@@ -346,17 +339,13 @@
     }
 
     impl Synom for WhereClause {
-        named!(parse -> Self, alt!(
-            do_parse!(
-                where_: keyword!(where) >>
-                predicates: call!(Delimited::parse_terminated) >>
-                (WhereClause {
-                    predicates: predicates,
-                    where_token: Some(where_),
-                })
-            )
-            |
-            epsilon!() => { |_| WhereClause::default() }
+        named!(parse -> Self, do_parse!(
+            where_: keyword!(where) >>
+            predicates: call!(Delimited::parse_terminated) >>
+            (WhereClause {
+                predicates: predicates,
+                where_token: where_,
+            })
         ));
 
         fn description() -> Option<&'static str> {
@@ -564,10 +553,8 @@
 
     impl ToTokens for WhereClause {
         fn to_tokens(&self, tokens: &mut Tokens) {
-            if !self.predicates.is_empty() {
-                TokensOrDefault(&self.where_token).to_tokens(tokens);
-                self.predicates.to_tokens(tokens);
-            }
+            self.where_token.to_tokens(tokens);
+            self.predicates.to_tokens(tokens);
         }
     }
 
diff --git a/src/item.rs b/src/item.rs
index 57c9400..41c56d9 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -715,7 +715,7 @@
         generics: syn!(Generics) >>
         inputs: parens!(Delimited::parse_terminated) >>
         ret: syn!(ReturnType) >>
-        where_clause: syn!(WhereClause) >>
+        where_clause: option!(syn!(WhereClause)) >>
         inner_attrs_stmts: braces!(tuple!(
             many0!(Attribute::parse_inner),
             call!(Block::parse_within)
@@ -860,7 +860,7 @@
             (args, variadic)
         )) >>
         ret: syn!(ReturnType) >>
-        where_clause: syn!(WhereClause) >>
+        where_clause: option!(syn!(WhereClause)) >>
         semi: punct!(;) >>
         ({
             let ((inputs, variadic), parens) = inputs;
@@ -927,7 +927,7 @@
         type_: keyword!(type) >>
         ident: syn!(Ident) >>
         generics: syn!(Generics) >>
-        where_clause: syn!(WhereClause) >>
+        where_clause: option!(syn!(WhereClause)) >>
         eq: punct!(=) >>
         ty: syn!(Type) >>
         semi: punct!(;) >>
@@ -966,7 +966,7 @@
         union_: keyword!(union) >>
         ident: syn!(Ident) >>
         generics: syn!(Generics) >>
-        where_clause: syn!(WhereClause) >>
+        where_clause: option!(syn!(WhereClause)) >>
         fields: braces!(call!(Delimited::parse_terminated_with,
                               Field::parse_struct)) >>
         (ItemUnion {
@@ -994,7 +994,7 @@
         bounds: cond!(colon.is_some(),
             call!(Delimited::parse_separated_nonempty)
         ) >>
-        where_clause: syn!(WhereClause) >>
+        where_clause: option!(syn!(WhereClause)) >>
         body: braces!(many0!(TraitItem::parse)) >>
         (ItemTrait {
             attrs: attrs,
@@ -1072,7 +1072,7 @@
         generics: syn!(Generics) >>
         inputs: parens!(call!(Delimited::parse_terminated)) >>
         ret: syn!(ReturnType) >>
-        where_clause: syn!(WhereClause) >>
+        where_clause: option!(syn!(WhereClause)) >>
         body: option!(braces!(
             tuple!(many0!(Attribute::parse_inner),
                    call!(Block::parse_within))
@@ -1126,7 +1126,7 @@
         bounds: cond!(colon.is_some(),
             call!(Delimited::parse_separated_nonempty)
         ) >>
-        where_clause: syn!(WhereClause) >>
+        where_clause: option!(syn!(WhereClause)) >>
         default: option!(tuple!(punct!(=), syn!(Type))) >>
         semi: punct!(;) >>
         (TraitItemType {
@@ -1172,7 +1172,7 @@
             epsilon!() => { |_| None }
         ) >>
         self_ty: syn!(Type) >>
-        where_clause: syn!(WhereClause) >>
+        where_clause: option!(syn!(WhereClause)) >>
         body: braces!(many0!(ImplItem::parse)) >>
         (ItemImpl {
             attrs: attrs,
@@ -1237,7 +1237,7 @@
         generics: syn!(Generics) >>
         inputs: parens!(call!(Delimited::parse_terminated)) >>
         ret: syn!(ReturnType) >>
-        where_clause: syn!(WhereClause) >>
+        where_clause: option!(syn!(WhereClause)) >>
         inner_attrs_stmts: braces!(tuple!(
             many0!(Attribute::parse_inner),
             call!(Block::parse_within)
diff --git a/tests/test_derive_input.rs b/tests/test_derive_input.rs
index fe9ef0c..4462b1c 100644
--- a/tests/test_derive_input.rs
+++ b/tests/test_derive_input.rs
@@ -221,7 +221,7 @@
                 }),
             ].into(),
             gt_token: Some(Default::default()),
-            where_clause: WhereClause::default(),
+            where_clause: None,
         },
         body: Body::Enum(BodyEnum {
             variants: vec![
diff --git a/tests/test_generics.rs b/tests/test_generics.rs
index 0811a97..4365f33 100644
--- a/tests/test_generics.rs
+++ b/tests/test_generics.rs
@@ -56,8 +56,8 @@
                 eq_token: Default::default(),
             }),
         ].into(),
-        where_clause: WhereClause {
-            where_token: Some(Default::default()),
+        where_clause: Some(WhereClause {
+            where_token: Default::default(),
             predicates: vec![
                 WherePredicate::BoundPredicate(WhereBoundPredicate {
                     bound_lifetimes: None,
@@ -77,7 +77,7 @@
                     ].into(),
                 }),
             ].into(),
-        },
+        }),
     };
 
     let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();