1
Fork 0

Parse 'async unsafe fn' instead of 'unsafe async fn'.

This commit is contained in:
Mazdak Farrokhzad 2019-05-29 16:53:48 +02:00
parent 0bfbaa6e8d
commit 2ebfbb4fab
3 changed files with 36 additions and 39 deletions

View file

@ -7205,44 +7205,41 @@ impl<'a> Parser<'a> {
return Ok(Some(item)); return Ok(Some(item));
} }
// `unsafe async fn` or `async fn` // Parse `async unsafe? fn`.
if ( if self.check_keyword(kw::Async) {
self.check_keyword(kw::Unsafe) && let async_span = self.span;
self.is_keyword_ahead(1, &[kw::Async]) if self.is_keyword_ahead(1, &[kw::Fn])
) || ( || self.is_keyword_ahead(2, &[kw::Fn])
self.check_keyword(kw::Async) && {
self.is_keyword_ahead(1, &[kw::Fn]) // ASYNC FUNCTION ITEM
) self.bump(); // `async`
{ let unsafety = self.parse_unsafety(); // `unsafe`?
// ASYNC FUNCTION ITEM self.expect_keyword(kw::Fn)?; // `fn`
let unsafety = self.parse_unsafety(); let fn_span = self.prev_span;
self.expect_keyword(kw::Async)?; let (ident, item_, extra_attrs) =
let async_span = self.prev_span; self.parse_item_fn(unsafety,
self.expect_keyword(kw::Fn)?; respan(async_span, IsAsync::Async {
let fn_span = self.prev_span; closure_id: ast::DUMMY_NODE_ID,
let (ident, item_, extra_attrs) = return_impl_trait_id: ast::DUMMY_NODE_ID,
self.parse_item_fn(unsafety, arguments: Vec::new(),
respan(async_span, IsAsync::Async { }),
closure_id: ast::DUMMY_NODE_ID, respan(fn_span, Constness::NotConst),
return_impl_trait_id: ast::DUMMY_NODE_ID, Abi::Rust)?;
arguments: Vec::new(), let prev_span = self.prev_span;
}), let item = self.mk_item(lo.to(prev_span),
respan(fn_span, Constness::NotConst), ident,
Abi::Rust)?; item_,
let prev_span = self.prev_span; visibility,
let item = self.mk_item(lo.to(prev_span), maybe_append(attrs, extra_attrs));
ident, if self.span.rust_2015() {
item_, self.diagnostic().struct_span_err_with_code(
visibility, async_span,
maybe_append(attrs, extra_attrs)); "`async fn` is not permitted in the 2015 edition",
if self.span.rust_2015() { DiagnosticId::Error("E0670".into())
self.diagnostic().struct_span_err_with_code( ).emit();
async_span, }
"`async fn` is not permitted in the 2015 edition", return Ok(Some(item));
DiagnosticId::Error("E0670".into())
).emit();
} }
return Ok(Some(item));
} }
if self.check_keyword(kw::Unsafe) && if self.check_keyword(kw::Unsafe) &&
self.is_keyword_ahead(1, &[kw::Trait, kw::Auto]) self.is_keyword_ahead(1, &[kw::Trait, kw::Auto])

View file

@ -122,7 +122,7 @@ fn async_fn_with_internal_borrow(y: u8) -> impl Future<Output = u8> {
} }
} }
unsafe async fn unsafe_async_fn(x: u8) -> u8 { async unsafe fn unsafe_async_fn(x: u8) -> u8 {
wake_and_yield_once().await; wake_and_yield_once().await;
x x
} }

View file

@ -122,7 +122,7 @@ fn async_fn_with_internal_borrow(y: u8) -> impl Future<Output = u8> {
} }
} }
unsafe async fn unsafe_async_fn(x: u8) -> u8 { async unsafe fn unsafe_async_fn(x: u8) -> u8 {
await!(wake_and_yield_once()); await!(wake_and_yield_once());
x x
} }