diff --git a/syntax/impls.rs b/syntax/impls.rs index c34e3e57..ebebb3ef 100644 --- a/syntax/impls.rs +++ b/syntax/impls.rs @@ -149,6 +149,7 @@ impl Eq for Signature {} impl PartialEq for Signature { fn eq(&self, other: &Signature) -> bool { let Signature { + unsafety, fn_token: _, receiver, args, @@ -158,6 +159,7 @@ impl PartialEq for Signature { throws_tokens: _, } = self; let Signature { + unsafety: unsafety2, fn_token: _, receiver: receiver2, args: args2, @@ -166,7 +168,8 @@ impl PartialEq for Signature { 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 PartialEq for Signature { impl Hash for Signature { fn hash(&self, state: &mut H) { let Signature { + unsafety, fn_token: _, receiver, args, @@ -185,6 +189,7 @@ impl Hash for Signature { 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 03422d11..f52a582c 100644 --- a/syntax/mod.rs +++ b/syntax/mod.rs @@ -87,6 +87,7 @@ pub struct TypeAlias { } pub struct Signature { + pub unsafety: Option, pub fn_token: Token![fn], pub receiver: Option, pub args: Punctuated, diff --git a/syntax/parse.rs b/syntax/parse.rs index 415b802d..3ac53047 100644 --- a/syntax/parse.rs +++ b/syntax/parse.rs @@ -353,6 +353,7 @@ fn parse_extern_fn(cx: &mut Errors, foreign_fn: &ForeignItemFn, lang: Lang) -> R 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 @@ fn parse_extern_fn(cx: &mut Errors, foreign_fn: &ForeignItemFn, lang: Lang) -> R doc, ident, sig: Signature { + unsafety, fn_token, receiver, args, @@ -578,6 +580,7 @@ fn parse_type_fn(ty: &TypeBareFn) -> Result { 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,