Require "full" feature for printing expr attributes
diff --git a/src/expr.rs b/src/expr.rs
index ebf3b5a..4206e37 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -1444,6 +1444,7 @@
         call!(trailer_expr, allow_struct, allow_block)
     ));
 
+    #[cfg(feature = "full")]
     fn take_outer(attrs: &mut Vec<Attribute>) -> Vec<Attribute> {
         let mut outer = Vec::new();
         let mut inner = Vec::new();
@@ -2979,17 +2980,25 @@
     }
 
     #[cfg(feature = "full")]
-    fn attrs_to_tokens(attrs: &[Attribute], tokens: &mut TokenStream) {
+    fn outer_attrs_to_tokens(attrs: &[Attribute], tokens: &mut TokenStream) {
         tokens.append_all(attrs.outer());
     }
 
+    #[cfg(feature = "full")]
+    fn inner_attrs_to_tokens(attrs: &[Attribute], tokens: &mut TokenStream) {
+        tokens.append_all(attrs.inner());
+    }
+
     #[cfg(not(feature = "full"))]
-    fn attrs_to_tokens(_attrs: &[Attribute], _tokens: &mut TokenStream) {}
+    fn outer_attrs_to_tokens(_attrs: &[Attribute], _tokens: &mut TokenStream) {}
+
+    #[cfg(not(feature = "full"))]
+    fn inner_attrs_to_tokens(_attrs: &[Attribute], _tokens: &mut TokenStream) {}
 
     #[cfg(feature = "full")]
     impl ToTokens for ExprBox {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.box_token.to_tokens(tokens);
             self.expr.to_tokens(tokens);
         }
@@ -2998,7 +3007,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprInPlace {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.place.to_tokens(tokens);
             self.arrow_token.to_tokens(tokens);
             self.value.to_tokens(tokens);
@@ -3008,9 +3017,9 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprArray {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.bracket_token.surround(tokens, |tokens| {
-                tokens.append_all(self.attrs.inner());
+                inner_attrs_to_tokens(&self.attrs, tokens);
                 self.elems.to_tokens(tokens);
             })
         }
@@ -3018,7 +3027,7 @@
 
     impl ToTokens for ExprCall {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            attrs_to_tokens(&self.attrs, tokens);
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.func.to_tokens(tokens);
             self.paren_token.surround(tokens, |tokens| {
                 self.args.to_tokens(tokens);
@@ -3029,7 +3038,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprMethodCall {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.receiver.to_tokens(tokens);
             self.dot_token.to_tokens(tokens);
             self.method.to_tokens(tokens);
@@ -3063,9 +3072,9 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprTuple {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.paren_token.surround(tokens, |tokens| {
-                tokens.append_all(self.attrs.inner());
+                inner_attrs_to_tokens(&self.attrs, tokens);
                 self.elems.to_tokens(tokens);
                 // If we only have one argument, we need a trailing comma to
                 // distinguish ExprTuple from ExprParen.
@@ -3078,7 +3087,7 @@
 
     impl ToTokens for ExprBinary {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            attrs_to_tokens(&self.attrs, tokens);
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.left.to_tokens(tokens);
             self.op.to_tokens(tokens);
             self.right.to_tokens(tokens);
@@ -3087,7 +3096,7 @@
 
     impl ToTokens for ExprUnary {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            attrs_to_tokens(&self.attrs, tokens);
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.op.to_tokens(tokens);
             self.expr.to_tokens(tokens);
         }
@@ -3095,14 +3104,14 @@
 
     impl ToTokens for ExprLit {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            attrs_to_tokens(&self.attrs, tokens);
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.lit.to_tokens(tokens);
         }
     }
 
     impl ToTokens for ExprCast {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            attrs_to_tokens(&self.attrs, tokens);
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.expr.to_tokens(tokens);
             self.as_token.to_tokens(tokens);
             self.ty.to_tokens(tokens);
@@ -3112,7 +3121,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprType {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            attrs_to_tokens(&self.attrs, tokens);
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.expr.to_tokens(tokens);
             self.colon_token.to_tokens(tokens);
             self.ty.to_tokens(tokens);
@@ -3142,7 +3151,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprIf {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.if_token.to_tokens(tokens);
             wrap_bare_struct(tokens, &self.cond);
             self.then_branch.to_tokens(tokens);
@@ -3153,7 +3162,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprIfLet {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.if_token.to_tokens(tokens);
             self.let_token.to_tokens(tokens);
             self.pats.to_tokens(tokens);
@@ -3167,12 +3176,12 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprWhile {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.label.to_tokens(tokens);
             self.while_token.to_tokens(tokens);
             wrap_bare_struct(tokens, &self.cond);
             self.body.brace_token.surround(tokens, |tokens| {
-                tokens.append_all(self.attrs.inner());
+                inner_attrs_to_tokens(&self.attrs, tokens);
                 tokens.append_all(&self.body.stmts);
             });
         }
@@ -3181,7 +3190,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprWhileLet {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.label.to_tokens(tokens);
             self.while_token.to_tokens(tokens);
             self.let_token.to_tokens(tokens);
@@ -3189,7 +3198,7 @@
             self.eq_token.to_tokens(tokens);
             wrap_bare_struct(tokens, &self.expr);
             self.body.brace_token.surround(tokens, |tokens| {
-                tokens.append_all(self.attrs.inner());
+                inner_attrs_to_tokens(&self.attrs, tokens);
                 tokens.append_all(&self.body.stmts);
             });
         }
@@ -3198,14 +3207,14 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprForLoop {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.label.to_tokens(tokens);
             self.for_token.to_tokens(tokens);
             self.pat.to_tokens(tokens);
             self.in_token.to_tokens(tokens);
             wrap_bare_struct(tokens, &self.expr);
             self.body.brace_token.surround(tokens, |tokens| {
-                tokens.append_all(self.attrs.inner());
+                inner_attrs_to_tokens(&self.attrs, tokens);
                 tokens.append_all(&self.body.stmts);
             });
         }
@@ -3214,11 +3223,11 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprLoop {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.label.to_tokens(tokens);
             self.loop_token.to_tokens(tokens);
             self.body.brace_token.surround(tokens, |tokens| {
-                tokens.append_all(self.attrs.inner());
+                inner_attrs_to_tokens(&self.attrs, tokens);
                 tokens.append_all(&self.body.stmts);
             });
         }
@@ -3227,11 +3236,11 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprMatch {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.match_token.to_tokens(tokens);
             wrap_bare_struct(tokens, &self.expr);
             self.brace_token.surround(tokens, |tokens| {
-                tokens.append_all(self.attrs.inner());
+                inner_attrs_to_tokens(&self.attrs, tokens);
                 for (i, arm) in self.arms.iter().enumerate() {
                     arm.to_tokens(tokens);
                     // Ensure that we have a comma after a non-block arm, except
@@ -3248,7 +3257,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprCatch {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.do_token.to_tokens(tokens);
             self.catch_token.to_tokens(tokens);
             self.block.to_tokens(tokens);
@@ -3258,7 +3267,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprYield {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.yield_token.to_tokens(tokens);
             self.expr.to_tokens(tokens);
         }
@@ -3267,7 +3276,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprClosure {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.movability.to_tokens(tokens);
             self.capture.to_tokens(tokens);
             self.or1_token.to_tokens(tokens);
@@ -3293,7 +3302,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprUnsafe {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.unsafe_token.to_tokens(tokens);
             self.block.to_tokens(tokens);
         }
@@ -3302,9 +3311,9 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprBlock {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.block.brace_token.surround(tokens, |tokens| {
-                tokens.append_all(self.attrs.inner());
+                inner_attrs_to_tokens(&self.attrs, tokens);
                 tokens.append_all(&self.block.stmts);
             });
         }
@@ -3313,7 +3322,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprAssign {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.left.to_tokens(tokens);
             self.eq_token.to_tokens(tokens);
             self.right.to_tokens(tokens);
@@ -3323,7 +3332,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprAssignOp {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.left.to_tokens(tokens);
             self.op.to_tokens(tokens);
             self.right.to_tokens(tokens);
@@ -3332,8 +3341,7 @@
 
     impl ToTokens for ExprField {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            #[cfg(feature = "full")]
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.base.to_tokens(tokens);
             self.dot_token.to_tokens(tokens);
             self.member.to_tokens(tokens);
@@ -3359,7 +3367,7 @@
 
     impl ToTokens for ExprIndex {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            attrs_to_tokens(&self.attrs, tokens);
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.expr.to_tokens(tokens);
             self.bracket_token.surround(tokens, |tokens| {
                 self.index.to_tokens(tokens);
@@ -3370,7 +3378,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprRange {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.from.to_tokens(tokens);
             match self.limits {
                 RangeLimits::HalfOpen(ref t) => t.to_tokens(tokens),
@@ -3382,7 +3390,7 @@
 
     impl ToTokens for ExprPath {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            attrs_to_tokens(&self.attrs, tokens);
+            outer_attrs_to_tokens(&self.attrs, tokens);
             ::PathTokens(&self.qself, &self.path).to_tokens(tokens)
         }
     }
@@ -3390,7 +3398,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprReference {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.and_token.to_tokens(tokens);
             self.mutability.to_tokens(tokens);
             self.expr.to_tokens(tokens);
@@ -3400,7 +3408,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprBreak {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.break_token.to_tokens(tokens);
             self.label.to_tokens(tokens);
             self.expr.to_tokens(tokens);
@@ -3410,7 +3418,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprContinue {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.continue_token.to_tokens(tokens);
             self.label.to_tokens(tokens);
         }
@@ -3419,7 +3427,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprReturn {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.return_token.to_tokens(tokens);
             self.expr.to_tokens(tokens);
         }
@@ -3428,7 +3436,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprMacro {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.mac.to_tokens(tokens);
         }
     }
@@ -3436,10 +3444,10 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprStruct {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.path.to_tokens(tokens);
             self.brace_token.surround(tokens, |tokens| {
-                tokens.append_all(self.attrs.inner());
+                inner_attrs_to_tokens(&self.attrs, tokens);
                 self.fields.to_tokens(tokens);
                 if self.rest.is_some() {
                     TokensOrDefault(&self.dot2_token).to_tokens(tokens);
@@ -3452,9 +3460,9 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprRepeat {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.bracket_token.surround(tokens, |tokens| {
-                tokens.append_all(self.attrs.inner());
+                inner_attrs_to_tokens(&self.attrs, tokens);
                 self.expr.to_tokens(tokens);
                 self.semi_token.to_tokens(tokens);
                 self.len.to_tokens(tokens);
@@ -3465,7 +3473,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprGroup {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            attrs_to_tokens(&self.attrs, tokens);
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.group_token.surround(tokens, |tokens| {
                 self.expr.to_tokens(tokens);
             });
@@ -3474,9 +3482,9 @@
 
     impl ToTokens for ExprParen {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            attrs_to_tokens(&self.attrs, tokens);
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.paren_token.surround(tokens, |tokens| {
-                tokens.append_all(self.attrs.inner());
+                inner_attrs_to_tokens(&self.attrs, tokens);
                 self.expr.to_tokens(tokens);
             });
         }
@@ -3485,7 +3493,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for ExprTry {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.expr.to_tokens(tokens);
             self.question_token.to_tokens(tokens);
         }
@@ -3508,7 +3516,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for FieldValue {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.member.to_tokens(tokens);
             if let Some(ref colon_token) = self.colon_token {
                 colon_token.to_tokens(tokens);
@@ -3728,7 +3736,7 @@
     #[cfg(feature = "full")]
     impl ToTokens for Local {
         fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(self.attrs.outer());
+            outer_attrs_to_tokens(&self.attrs, tokens);
             self.let_token.to_tokens(tokens);
             self.pats.to_tokens(tokens);
             if let Some((ref colon_token, ref ty)) = self.ty {