Separate unsafe blocks into a ExprKind variant
diff --git a/src/expr.rs b/src/expr.rs
index df930ba..a6e7e06 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -202,9 +202,14 @@
             pub or2_token: Token![|],
         }),
 
-        /// A block (`{ ... }` or `unsafe { ... }`)
+        /// An unsafe block (`unsafe { ... }`)
+        pub Unsafe(ExprUnsafe #full {
+            pub unsafe_token: Token![unsafe],
+            pub block: Block,
+        }),
+
+        /// A block (`{ ... }`)
         pub Block(ExprBlock #full {
-            pub unsafety: Unsafety,
             pub block: Block,
         }),
 
@@ -628,6 +633,7 @@
     // see https://github.com/rust-lang/rust/blob/eb8f2586e
     //                       /src/libsyntax/parse/classify.rs#L17-L37
     match expr.node {
+        ExprKind::Unsafe(..) |
         ExprKind::Block(..) |
         ExprKind::If(..) |
         ExprKind::IfLet(..) |
@@ -1192,6 +1198,8 @@
         |
         syn!(ExprYield) => { ExprKind::Yield }
         |
+        syn!(ExprUnsafe) => { ExprKind::Unsafe }
+        |
         call!(expr_closure, allow_struct)
         |
         cond_reduce!(allow_block, map!(syn!(ExprBlock), ExprKind::Block))
@@ -1238,6 +1246,8 @@
         |
         syn!(ExprYield) => { ExprKind::Yield }
         |
+        syn!(ExprUnsafe) => { ExprKind::Unsafe }
+        |
         syn!(ExprBlock) => { ExprKind::Block }
     ), Expr::from));
 
@@ -1272,7 +1282,6 @@
                 kind: InPlaceKind::In(in_),
                 value: Box::new(Expr {
                     node: ExprBlock {
-                        unsafety: Unsafety::Normal,
                         block: Block {
                             stmts: value.0,
                             brace_token: value.1,
@@ -1403,7 +1412,6 @@
             do_parse!(
                 else_block: braces!(call!(Block::parse_within)) >>
                 (ExprKind::Block(ExprBlock {
-                    unsafety: Unsafety::Normal,
                     block: Block {
                         stmts: else_block.0,
                         brace_token: else_block.1,
@@ -1537,7 +1545,6 @@
                 body: syn!(Block) >>
                 (ReturnType::Type(ty, arrow),
                  ExprKind::Block(ExprBlock {
-                    unsafety: Unsafety::Normal,
                     block: body,
                 }).into())
             )
@@ -1739,12 +1746,22 @@
     }
 
     #[cfg(feature = "full")]
+    impl Synom for ExprUnsafe {
+        named!(parse -> Self, do_parse!(
+            unsafe_: keyword!(unsafe) >>
+            b: syn!(Block) >>
+            (ExprUnsafe {
+                unsafe_token: unsafe_,
+                block: b,
+            })
+        ));
+    }
+
+    #[cfg(feature = "full")]
     impl Synom for ExprBlock {
         named!(parse -> Self, do_parse!(
-            rules: syn!(Unsafety) >>
             b: syn!(Block) >>
             (ExprBlock {
-                unsafety: rules,
                 block: b,
             })
         ));
@@ -2568,9 +2585,16 @@
     }
 
     #[cfg(feature = "full")]
+    impl ToTokens for ExprUnsafe {
+        fn to_tokens(&self, tokens: &mut Tokens) {
+            self.unsafe_token.to_tokens(tokens);
+            self.block.to_tokens(tokens);
+        }
+    }
+
+    #[cfg(feature = "full")]
     impl ToTokens for ExprBlock {
         fn to_tokens(&self, tokens: &mut Tokens) {
-            self.unsafety.to_tokens(tokens);
             self.block.to_tokens(tokens);
         }
     }