Parse unsafety on function signatures
diff --git a/syntax/impls.rs b/syntax/impls.rs
index c34e3e5..ebebb3e 100644
--- a/syntax/impls.rs
+++ b/syntax/impls.rs
@@ -149,6 +149,7 @@
 impl PartialEq for Signature {
     fn eq(&self, other: &Signature) -> bool {
         let Signature {
+            unsafety,
             fn_token: _,
             receiver,
             args,
@@ -158,6 +159,7 @@
             throws_tokens: _,
         } = self;
         let Signature {
+            unsafety: unsafety2,
             fn_token: _,
             receiver: receiver2,
             args: args2,
@@ -166,7 +168,8 @@
             paren_token: _,
             throws_tokens: _,
         } = other;
-        receiver == receiver2
+        unsafety.is_some() == unsafety2.is_some()
+            && receiver == receiver2
             && ret == ret2
             && throws == throws2
             && args.len() == args2.len()
@@ -177,6 +180,7 @@
 impl Hash for Signature {
     fn hash<H: Hasher>(&self, state: &mut H) {
         let Signature {
+            unsafety,
             fn_token: _,
             receiver,
             args,
@@ -185,6 +189,7 @@
             paren_token: _,
             throws_tokens: _,
         } = self;
+        unsafety.is_some().hash(state);
         receiver.hash(state);
         for arg in args {
             arg.hash(state);
diff --git a/syntax/mod.rs b/syntax/mod.rs
index 03422d1..f52a582 100644
--- a/syntax/mod.rs
+++ b/syntax/mod.rs
@@ -87,6 +87,7 @@
 }
 
 pub struct Signature {
+    pub unsafety: Option<Token![unsafe]>,
     pub fn_token: Token![fn],
     pub receiver: Option<Receiver>,
     pub args: Punctuated<Var, Token![,]>,
diff --git a/syntax/parse.rs b/syntax/parse.rs
index 415b802..3ac5304 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -353,6 +353,7 @@
     let ret = parse_return_type(&foreign_fn.sig.output, &mut throws_tokens)?;
     let throws = throws_tokens.is_some();
     let doc = attrs::parse_doc(cx, &foreign_fn.attrs);
+    let unsafety = foreign_fn.sig.unsafety;
     let fn_token = foreign_fn.sig.fn_token;
     let ident = foreign_fn.sig.ident.clone();
     let paren_token = foreign_fn.sig.paren_token;
@@ -367,6 +368,7 @@
         doc,
         ident,
         sig: Signature {
+            unsafety,
             fn_token,
             receiver,
             args,
@@ -578,6 +580,7 @@
     let ret = parse_return_type(&ty.output, &mut throws_tokens)?;
     let throws = throws_tokens.is_some();
     Ok(Type::Fn(Box::new(Signature {
+        unsafety: ty.unsafety,
         fn_token: ty.fn_token,
         receiver: None,
         args,