diff --git a/src/data.rs b/src/data.rs
index 4821a7a..0f98116 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -213,7 +213,7 @@
             self.ident.to_tokens(tokens);
             self.data.to_tokens(tokens);
             if let Some(ref disc) = self.discriminant {
-                self.eq_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.eq_token).to_tokens(tokens);
                 disc.to_tokens(tokens);
             }
         }
@@ -243,7 +243,7 @@
             self.vis.to_tokens(tokens);
             if let Some(ref ident) = self.ident {
                 ident.to_tokens(tokens);
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
             }
             self.ty.to_tokens(tokens);
         }
diff --git a/src/expr.rs b/src/expr.rs
index 3d4fbb3..f0e456b 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -2351,10 +2351,10 @@
             self.dot_token.to_tokens(tokens);
             self.method.to_tokens(tokens);
             if !self.typarams.is_empty() {
-                self.colon2_token.unwrap_or_default().to_tokens(tokens);
-                self.lt_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon2_token).to_tokens(tokens);
+                TokensOrDefault(&self.lt_token).to_tokens(tokens);
                 self.typarams.to_tokens(tokens);
-                self.gt_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.gt_token).to_tokens(tokens);
             }
             self.paren_token.surround(tokens, |tokens| {
                 self.args.to_tokens(tokens);
@@ -2418,7 +2418,7 @@
                        if_false: &Option<Box<Expr>>)
     {
         if let Some(ref if_false) = *if_false {
-            else_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&else_token).to_tokens(tokens);
 
             // If we are not one of the valid expressions to exist in an else
             // clause, wrap ourselves in a block.
@@ -2465,7 +2465,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             if self.label.is_some() {
                 self.label.to_tokens(tokens);
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
             }
             self.while_token.to_tokens(tokens);
             wrap_bare_struct(tokens, &self.cond);
@@ -2478,7 +2478,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             if self.label.is_some() {
                 self.label.to_tokens(tokens);
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
             }
             self.while_token.to_tokens(tokens);
             self.let_token.to_tokens(tokens);
@@ -2494,7 +2494,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             if self.label.is_some() {
                 self.label.to_tokens(tokens);
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
             }
             self.for_token.to_tokens(tokens);
             self.pat.to_tokens(tokens);
@@ -2509,7 +2509,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             if self.label.is_some() {
                 self.label.to_tokens(tokens);
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
             }
             self.loop_token.to_tokens(tokens);
             self.body.to_tokens(tokens);
@@ -2683,7 +2683,7 @@
             self.brace_token.surround(tokens, |tokens| {
                 self.fields.to_tokens(tokens);
                 if self.rest.is_some() {
-                    self.dot2_token.unwrap_or_default().to_tokens(tokens);
+                    TokensOrDefault(&self.dot2_token).to_tokens(tokens);
                     self.rest.to_tokens(tokens);
                 }
             })
@@ -2732,8 +2732,7 @@
             // XXX: Override self.is_shorthand if expr is not an IdentExpr with
             // the ident self.ident?
             if !self.is_shorthand {
-                self.colon_token.unwrap_or_default()
-                    .to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
                 self.expr.to_tokens(tokens);
             }
         }
@@ -2745,7 +2744,7 @@
             tokens.append_all(&self.attrs);
             self.pats.to_tokens(tokens);
             if self.guard.is_some() {
-                self.if_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.if_token).to_tokens(tokens);
                 self.guard.to_tokens(tokens);
             }
             self.rocket_token.to_tokens(tokens);
@@ -2767,7 +2766,7 @@
             self.mode.to_tokens(tokens);
             self.ident.to_tokens(tokens);
             if self.subpat.is_some() {
-                self.at_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.at_token).to_tokens(tokens);
                 self.subpat.to_tokens(tokens);
             }
         }
@@ -2809,8 +2808,8 @@
             self.paren_token.surround(tokens, |tokens| {
                 for (i, token) in self.pats.iter().enumerate() {
                     if Some(i) == self.dots_pos {
-                        self.dot2_token.unwrap_or_default().to_tokens(tokens);
-                        self.comma_token.unwrap_or_default().to_tokens(tokens);
+                        TokensOrDefault(&self.dot2_token).to_tokens(tokens);
+                        TokensOrDefault(&self.comma_token).to_tokens(tokens);
                     }
                     token.to_tokens(tokens);
                 }
@@ -2878,14 +2877,14 @@
                 // If we have an identifier, we always need a .. token.
                 if self.middle.is_some() {
                     self.middle.to_tokens(tokens);
-                    self.dot2_token.unwrap_or_default().to_tokens(tokens);
+                    TokensOrDefault(&self.dot2_token).to_tokens(tokens);
                 } else if self.dot2_token.is_some() {
                     self.dot2_token.to_tokens(tokens);
                 }
 
                 // Make sure we have a comma before the back half.
                 if !self.back.is_empty() {
-                    self.comma_token.unwrap_or_default().to_tokens(tokens);
+                    TokensOrDefault(&self.comma_token).to_tokens(tokens);
                     self.back.to_tokens(tokens);
                 } else {
                     self.comma_token.to_tokens(tokens);
@@ -2910,7 +2909,7 @@
             // XXX: Override is_shorthand if it was wrong?
             if !self.is_shorthand {
                 self.ident.to_tokens(tokens);
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
             }
             self.pat.to_tokens(tokens);
         }
@@ -2985,11 +2984,11 @@
             self.let_token.to_tokens(tokens);
             self.pat.to_tokens(tokens);
             if self.ty.is_some() {
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
                 self.ty.to_tokens(tokens);
             }
             if self.init.is_some() {
-                self.eq_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.eq_token).to_tokens(tokens);
                 self.init.to_tokens(tokens);
             }
             self.semi_token.to_tokens(tokens);
diff --git a/src/generics.rs b/src/generics.rs
index b169f8a..08f4619 100644
--- a/src/generics.rs
+++ b/src/generics.rs
@@ -379,11 +379,11 @@
                 return;
             }
 
-            self.lt_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&self.lt_token).to_tokens(tokens);
             self.lifetimes.to_tokens(tokens);
             maybe_add_lifetime_params_comma(tokens, self);
             self.ty_params.to_tokens(tokens);
-            self.gt_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&self.gt_token).to_tokens(tokens);
         }
     }
 
@@ -393,7 +393,7 @@
                 return;
             }
 
-            self.0.lt_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&self.0.lt_token).to_tokens(tokens);
             self.0.lifetimes.to_tokens(tokens);
             maybe_add_lifetime_params_comma(tokens, &self.0);
             for param in self.0.ty_params.iter() {
@@ -402,12 +402,12 @@
                 tokens.append_all(item.attrs.outer());
                 item.ident.to_tokens(tokens);
                 if !item.bounds.is_empty() {
-                    item.colon_token.unwrap_or_default().to_tokens(tokens);
+                    TokensOrDefault(&item.colon_token).to_tokens(tokens);
                     item.bounds.to_tokens(tokens);
                 }
                 param.delimiter().to_tokens(tokens);
             }
-            self.0.gt_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&self.0.gt_token).to_tokens(tokens);
         }
     }
 
@@ -417,7 +417,7 @@
                 return;
             }
 
-            self.0.lt_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&self.0.lt_token).to_tokens(tokens);
             // Leave off the lifetime bounds and attributes
             for param in self.0.lifetimes.iter() {
                 param.item().lifetime.to_tokens(tokens);
@@ -429,7 +429,7 @@
                 param.item().ident.to_tokens(tokens);
                 param.delimiter().to_tokens(tokens);
             }
-            self.0.gt_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&self.0.gt_token).to_tokens(tokens);
         }
     }
 
@@ -456,7 +456,7 @@
             tokens.append_all(self.attrs.outer());
             self.lifetime.to_tokens(tokens);
             if !self.bounds.is_empty() {
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
                 self.bounds.to_tokens(tokens);
             }
         }
@@ -467,11 +467,11 @@
             tokens.append_all(self.attrs.outer());
             self.ident.to_tokens(tokens);
             if !self.bounds.is_empty() {
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
                 self.bounds.to_tokens(tokens);
             }
             if self.default.is_some() {
-                self.eq_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.eq_token).to_tokens(tokens);
                 self.default.to_tokens(tokens);
             }
         }
@@ -501,7 +501,7 @@
     impl ToTokens for WhereClause {
         fn to_tokens(&self, tokens: &mut Tokens) {
             if !self.predicates.is_empty() {
-                self.where_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.where_token).to_tokens(tokens);
                 self.predicates.to_tokens(tokens);
             }
         }
@@ -520,7 +520,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             self.lifetime.to_tokens(tokens);
             if !self.bounds.is_empty() {
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
                 self.bounds.to_tokens(tokens);
             }
         }
diff --git a/src/item.rs b/src/item.rs
index dca8543..978f1ad 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -1367,7 +1367,7 @@
                             tokens.append_all(items);
                         });
                     } else {
-                        item.semi.unwrap_or_default().to_tokens(tokens);
+                        TokensOrDefault(&item.semi).to_tokens(tokens);
                     }
                 }
                 ItemKind::ForeignMod(ref item) => {
@@ -1409,11 +1409,11 @@
                         VariantData::Tuple(..) => {
                             item.data.to_tokens(tokens);
                             item.generics.where_clause.to_tokens(tokens);
-                            item.semi_token.unwrap_or_default().to_tokens(tokens);
+                            TokensOrDefault(&item.semi_token).to_tokens(tokens);
                         }
                         VariantData::Unit => {
                             item.generics.where_clause.to_tokens(tokens);
-                            item.semi_token.unwrap_or_default().to_tokens(tokens);
+                            TokensOrDefault(&item.semi_token).to_tokens(tokens);
                         }
                     }
                 }
@@ -1434,7 +1434,7 @@
                     item.ident.to_tokens(tokens);
                     item.generics.to_tokens(tokens);
                     if !item.supertraits.is_empty() {
-                        item.colon_token.unwrap_or_default().to_tokens(tokens);
+                        TokensOrDefault(&item.colon_token).to_tokens(tokens);
                         item.supertraits.to_tokens(tokens);
                     }
                     item.generics.where_clause.to_tokens(tokens);
@@ -1482,7 +1482,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             self.path.to_tokens(tokens);
             if self.rename.is_some() {
-                self.as_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.as_token).to_tokens(tokens);
                 self.rename.to_tokens(tokens);
             }
         }
@@ -1510,7 +1510,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             self.name.to_tokens(tokens);
             if self.rename.is_some() {
-                self.as_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.as_token).to_tokens(tokens);
                 self.rename.to_tokens(tokens);
             }
         }
@@ -1541,7 +1541,7 @@
                             });
                         }
                         None => {
-                            item.semi_token.unwrap_or_default().to_tokens(tokens);
+                            TokensOrDefault(&item.semi_token).to_tokens(tokens);
                         }
                     }
                 }
@@ -1549,7 +1549,7 @@
                     item.type_token.to_tokens(tokens);
                     item.ident.to_tokens(tokens);
                     if !item.bounds.is_empty() {
-                        item.colon_token.unwrap_or_default().to_tokens(tokens);
+                        TokensOrDefault(&item.colon_token).to_tokens(tokens);
                         item.bounds.to_tokens(tokens);
                     }
                     if let Some((ref eq_token, ref default)) = item.default {
@@ -1655,7 +1655,7 @@
                     if !self.0.inputs.empty_or_trailing() {
                         tokens::Comma::default().to_tokens(tokens);
                     }
-                    self.0.dot_tokens.unwrap_or_default().to_tokens(tokens);
+                    TokensOrDefault(&self.0.dot_tokens).to_tokens(tokens);
                 }
             });
             self.0.output.to_tokens(tokens);
diff --git a/src/lib.rs b/src/lib.rs
index 7a7055b..9b8ef36 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -275,3 +275,18 @@
     file.shebang = shebang;
     Ok(file)
 }
+
+#[cfg(feature = "printing")]
+struct TokensOrDefault<'a, T: 'a>(&'a Option<T>);
+
+#[cfg(feature = "printing")]
+impl<'a, T> quote::ToTokens for TokensOrDefault<'a, T>
+    where T: quote::ToTokens + Default,
+{
+    fn to_tokens(&self, tokens: &mut quote::Tokens) {
+        match *self.0 {
+            Some(ref t) => t.to_tokens(tokens),
+            None => T::default().to_tokens(tokens),
+        }
+    }
+}
diff --git a/src/ty.rs b/src/ty.rs
index cc9d2c8..4716b6f 100644
--- a/src/ty.rs
+++ b/src/ty.rs
@@ -840,7 +840,7 @@
             match self.ty.mutability {
                 Mutability::Mutable(ref tok) => tok.to_tokens(tokens),
                 Mutability::Immutable => {
-                    self.const_token.unwrap_or_default().to_tokens(tokens);
+                    TokensOrDefault(&self.const_token).to_tokens(tokens);
                 }
             }
             self.ty.ty.to_tokens(tokens);
@@ -901,7 +901,7 @@
             };
             let mut segments = self.1.segments.iter();
             if pos > 0 {
-                qself.as_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&qself.as_token).to_tokens(tokens);
                 self.1.leading_colon.to_tokens(tokens);
                 for (i, segment) in (&mut segments).take(pos).enumerate() {
                     if i + 1 == pos {
