From 8a11da40a789e5d73c5c11d69ba87638ddff8676 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 22 Nov 2020 20:43:00 -0800 Subject: Parse unsafe extern block --- crates/parser/src/grammar/items.rs | 10 +++++++++- .../syntax/test_data/parser/ok/0068_item_modifiers.rast | 16 ++++++++++++++-- crates/syntax/test_data/parser/ok/0068_item_modifiers.rs | 2 ++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/crates/parser/src/grammar/items.rs b/crates/parser/src/grammar/items.rs index 780bc470a..ad29b82f7 100644 --- a/crates/parser/src/grammar/items.rs +++ b/crates/parser/src/grammar/items.rs @@ -112,7 +112,7 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker) -> Result<(), Marker> { has_mods = true; } - if p.at(T![extern]) { + if p.at(T![extern]) && p.nth(1) != T!['{'] && (p.nth(1) != STRING || p.nth(2) != T!['{']) { has_mods = true; abi(p); } @@ -181,6 +181,14 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker) -> Result<(), Marker> { T![type] => { type_alias(p, m); } + + // unsafe extern "C" {} + T![extern] => { + abi(p); + extern_item_list(p); + m.complete(p, EXTERN_BLOCK); + } + _ => { if !has_visibility && !has_mods { return Err(m); diff --git a/crates/syntax/test_data/parser/ok/0068_item_modifiers.rast b/crates/syntax/test_data/parser/ok/0068_item_modifiers.rast index 50a6d8ee9..87eebf185 100644 --- a/crates/syntax/test_data/parser/ok/0068_item_modifiers.rast +++ b/crates/syntax/test_data/parser/ok/0068_item_modifiers.rast @@ -1,4 +1,4 @@ -SOURCE_FILE@0..304 +SOURCE_FILE@0..328 FN@0..17 ASYNC_KW@0..5 "async" WHITESPACE@5..6 " " @@ -215,4 +215,16 @@ SOURCE_FILE@0..304 ASSOC_ITEM_LIST@301..303 L_CURLY@301..302 "{" R_CURLY@302..303 "}" - WHITESPACE@303..304 "\n" + WHITESPACE@303..305 "\n\n" + EXTERN_BLOCK@305..327 + UNSAFE_KW@305..311 "unsafe" + WHITESPACE@311..312 " " + ABI@312..324 + EXTERN_KW@312..318 "extern" + WHITESPACE@318..319 " " + STRING@319..324 "\"C++\"" + WHITESPACE@324..325 " " + EXTERN_ITEM_LIST@325..327 + L_CURLY@325..326 "{" + R_CURLY@326..327 "}" + WHITESPACE@327..328 "\n" diff --git a/crates/syntax/test_data/parser/ok/0068_item_modifiers.rs b/crates/syntax/test_data/parser/ok/0068_item_modifiers.rs index 8d697c04b..6d27a082c 100644 --- a/crates/syntax/test_data/parser/ok/0068_item_modifiers.rs +++ b/crates/syntax/test_data/parser/ok/0068_item_modifiers.rs @@ -14,3 +14,5 @@ unsafe auto trait T {} unsafe impl Foo {} default impl Foo {} unsafe default impl Foo {} + +unsafe extern "C++" {} -- cgit v1.2.3