expose "safe fn" in extern block as ForeignItemFn#1960
expose "safe fn" in extern block as ForeignItemFn#1960Wasabi375 wants to merge 1 commit intodtolnay:masterfrom
Conversation
|
Rust actually accepts #[cfg(false)]
safe fn foo() {}This is syntactically correct. So I think it'd be better to make that pub enum Unsafety {
Safe(Token![safe]),
Unsafe(Token![unsafe])
}Then, change the unsafety field in |
|
Thanks for the feedback and also for linking the issue. I remember looking for it but not finding one. Maybe there is something strange with search on github if the search is
I did not know that and the rust reference specifically states that this is not actually allowed. I'll continue this discussion in the issue you linked. That way any information is not lost, if this PR is not accepted. |
I got interested in this and looked it up. https://doc.rust-lang.org/reference/items/functions.html#footnote-extern-safe Semantically disallowed, syntactically allowed. Macros only operate on the syntactic level:
|
Currently when parsing a "safe fn"
synwill represent this as aForeignItem::Verbatim.This makes it hard to use them in proc-macros.
Right now
parse_signaturewill returnOk(Some(sig))for signatures without the "safe" keyword. If the "safe" keyword is found it returnsOk(None)instead.If
Noneis returnedForeignItem::parsewill assume that the function signature contains the "safe" keyword and returns aVerbatim.I see 2 possible solutions to improve this:
Option<Safe>toSignatureparse_signatureto returnOk(sig, Some(safe))and store the "safe" keyword in theForeignItemFnForeignSignaturethat extendsSignaturewith the optional safe keywordThere are some Pros/Cons to all 3 approaches
externblock so I am not sure if this is a good abstraction. However this would be the simplest to implement.ForeignItemFnwhich means that there needs to be special handling inForeignItemFn::to_tokensto ensure that the "safe" keyword is inserted at the correct position.Open questions:
ForeignItemFnand I guess that is a breaking change. However I can't imagine you release a breaking version change every time rust adds a new feature with new syntax. No idea how you want to handle something like this.