Skip to content

Commit 2308ad8

Browse files
committed
Support parsing 'unsafe extern "C++"'
This was added in Rust 1.48 by rust-lang/rust#75857
1 parent da1818e commit 2308ad8

File tree

7 files changed

+21
-1
lines changed

7 files changed

+21
-1
lines changed

src/gen/clone.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,6 +1121,7 @@ impl Clone for ItemForeignMod {
11211121
fn clone(&self) -> Self {
11221122
ItemForeignMod {
11231123
attrs: self.attrs.clone(),
1124+
unsafety: self.unsafety.clone(),
11241125
abi: self.abi.clone(),
11251126
brace_token: self.brace_token.clone(),
11261127
items: self.items.clone(),

src/gen/debug.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,6 +1599,7 @@ impl Debug for ItemForeignMod {
15991599
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
16001600
let mut formatter = formatter.debug_struct("ItemForeignMod");
16011601
formatter.field("attrs", &self.attrs);
1602+
formatter.field("unsafety", &self.unsafety);
16021603
formatter.field("abi", &self.abi);
16031604
formatter.field("brace_token", &self.brace_token);
16041605
formatter.field("items", &self.items);

src/gen/eq.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1128,7 +1128,7 @@ impl Eq for ItemForeignMod {}
11281128
#[cfg_attr(doc_cfg, doc(cfg(feature = "extra-traits")))]
11291129
impl PartialEq for ItemForeignMod {
11301130
fn eq(&self, other: &Self) -> bool {
1131-
self.attrs == other.attrs && self.abi == other.abi && self.items == other.items
1131+
self.attrs == other.attrs && self.unsafety == other.unsafety && self.abi == other.abi && self.items == other.items
11321132
}
11331133
}
11341134
#[cfg(feature = "full")]

src/gen/fold.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1955,6 +1955,7 @@ where
19551955
{
19561956
ItemForeignMod {
19571957
attrs: FoldHelper::lift(node.attrs, |it| f.fold_attribute(it)),
1958+
unsafety: (node.unsafety).map(|it| Token![unsafe](tokens_helper(f, &it.span))),
19581959
abi: f.fold_abi(node.abi),
19591960
brace_token: Brace(tokens_helper(f, &node.brace_token.span)),
19601961
items: FoldHelper::lift(node.items, |it| f.fold_foreign_item(it)),

src/gen/hash.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,6 +1482,7 @@ impl Hash for ItemForeignMod {
14821482
H: Hasher,
14831483
{
14841484
self.attrs.hash(state);
1485+
self.unsafety.hash(state);
14851486
self.abi.hash(state);
14861487
self.items.hash(state);
14871488
}

src/item.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ ast_struct! {
150150
#[cfg_attr(doc_cfg, doc(cfg(feature = "full")))]
151151
pub struct ItemForeignMod {
152152
pub attrs: Vec<Attribute>,
153+
pub unsafety: Option<Token![unsafe]>,
153154
pub abi: Abi,
154155
pub brace_token: token::Brace,
155156
pub items: Vec<ForeignItem>,
@@ -1620,6 +1621,7 @@ pub mod parsing {
16201621
impl Parse for ItemForeignMod {
16211622
fn parse(input: ParseStream) -> Result<Self> {
16221623
let outer_attrs = input.call(Attribute::parse_outer)?;
1624+
let unsafety = input.parse()?;
16231625
let abi: Abi = input.parse()?;
16241626

16251627
let content;
@@ -1632,6 +1634,7 @@ pub mod parsing {
16321634

16331635
Ok(ItemForeignMod {
16341636
attrs: private::attrs(outer_attrs, inner_attrs),
1637+
unsafety,
16351638
abi,
16361639
brace_token,
16371640
items,
@@ -2775,6 +2778,7 @@ mod printing {
27752778
impl ToTokens for ItemForeignMod {
27762779
fn to_tokens(&self, tokens: &mut TokenStream) {
27772780
tokens.append_all(self.attrs.outer());
2781+
self.unsafety.to_tokens(tokens);
27782782
self.abi.to_tokens(tokens);
27792783
self.brace_token.surround(tokens, |tokens| {
27802784
tokens.append_all(self.attrs.inner());

tests/debug/gen.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3027,6 +3027,18 @@ impl Debug for Lite<syn::ItemForeignMod> {
30273027
if !_val.attrs.is_empty() {
30283028
formatter.field("attrs", Lite(&_val.attrs));
30293029
}
3030+
if let Some(val) = &_val.unsafety {
3031+
#[derive(RefCast)]
3032+
#[repr(transparent)]
3033+
struct Print(syn::token::Unsafe);
3034+
impl Debug for Print {
3035+
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
3036+
formatter.write_str("Some")?;
3037+
Ok(())
3038+
}
3039+
}
3040+
formatter.field("unsafety", Print::ref_cast(val));
3041+
}
30303042
formatter.field("abi", Lite(&_val.abi));
30313043
if !_val.items.is_empty() {
30323044
formatter.field("items", Lite(&_val.items));

0 commit comments

Comments
 (0)