Parse 'async unsafe fn' instead of 'unsafe async fn'.
This commit is contained in:
parent
0bfbaa6e8d
commit
2ebfbb4fab
3 changed files with 36 additions and 39 deletions
|
@ -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])
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue