Why is `async` a keyword?

I was reading the async RFC and I see that async used to be an attribute, but today it is a keyword. Why was that changed? I like the symmetry between #[async] and await!(), because it hints at a world where coroutines could have been implemented as a proc macro. With async being a keyword, that symmetry is gone. Why was await left behind? Is there somewhere I can read more about this change?

await! is not going to be a macro forever; it is only that way today as a stopgap while the final syntax is decided.

Note that await actually is a keyword in Rust 2018. However, enabling the async_await feature flag on nightly currently un-keywords it, for compatibility with the experimental syntax.

https://github.com/rust-lang/rfcs/blob/master/text/2394-async_await.md is the actual async/await RFC, and it says https://github.com/rust-lang/rfcs/blob/master/text/2394-async_await.md#built-in-syntax-instead-of-using-macros-in-generators

1 Like

Looks like I was reading the wrong RFC, thanks for the links!