From 09f6caabe5dbb758b678dd81a6f3d98fbd41f590 Mon Sep 17 00:00:00 2001 From: Taylor Cramer Date: Mon, 18 Jun 2018 16:49:34 -0700 Subject: [PATCH] Parse `unsafe async fn` instead of `async unsafe fn` --- src/libsyntax/parse/parser.rs | 14 ++++++++++---- src/test/run-pass/async-await.rs | 13 +++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index e5ac0b8ed7cf..c2abb79a93ab 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -6744,13 +6744,19 @@ impl<'a> Parser<'a> { maybe_append(attrs, extra_attrs)); return Ok(Some(item)); } - if self.check_keyword(keywords::Async) && - (self.look_ahead(1, |t| t.is_keyword(keywords::Fn)) || - self.look_ahead(1, |t| t.is_keyword(keywords::Unsafe))) + + // `unsafe async fn` or `async fn` + if ( + self.check_keyword(keywords::Unsafe) && + self.look_ahead(1, |t| t.is_keyword(keywords::Async)) + ) || ( + self.check_keyword(keywords::Async) && + self.look_ahead(1, |t| t.is_keyword(keywords::Fn)) + ) { // ASYNC FUNCTION ITEM - self.expect_keyword(keywords::Async)?; let unsafety = self.parse_unsafety(); + self.expect_keyword(keywords::Async)?; self.expect_keyword(keywords::Fn)?; let fn_span = self.prev_span; let (ident, item_, extra_attrs) = diff --git a/src/test/run-pass/async-await.rs b/src/test/run-pass/async-await.rs index 6b2c01f57694..bc8b8a152fb2 100644 --- a/src/test/run-pass/async-await.rs +++ b/src/test/run-pass/async-await.rs @@ -99,6 +99,19 @@ fn async_fn_with_internal_borrow(y: u8) -> impl Future { } } +unsafe async fn unsafe_async_fn(x: u8) -> u8 { + await!(wake_and_yield_once()); + x +} + +struct Foo { + async fn async_method(x: u8) -> u8 { + unsafe { + await!(unsafe_async_fn()) + } + } +} + fn test_future_yields_once_then_returns(f: F) where F: FnOnce(u8) -> Fut,