https://gcc.gnu.org/g:804830a0258aadcaf26683abb86019ed96a33c14
commit 804830a0258aadcaf26683abb86019ed96a33c14 Author: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com> Date: Wed Nov 22 10:35:44 2023 +0100 Allow const and async specifiers in functions We need to account for const specifiers in async parsing as const can be used in the syntax before the async keyword. gcc/rust/ChangeLog: * parse/rust-parse-impl.h (Parser::parse_vis_item): Allow parsing async items in const. (Parser::parse_async_item): Account for const offset during async lookahead. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com> Diff: --- gcc/rust/parse/rust-parse-impl.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index 3c8d81bbf97f..b8c40c3c1577 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -1383,6 +1383,8 @@ Parser<ManagedTokenSource>::parse_vis_item (AST::AttrVec outer_attrs) return parse_const_item (std::move (vis), std::move (outer_attrs)); case UNSAFE: case EXTERN_KW: + case ASYNC: + return parse_async_item (std::move (vis), std::move (outer_attrs)); case FN_KW: return parse_function (std::move (vis), std::move (outer_attrs)); default: @@ -1445,7 +1447,9 @@ std::unique_ptr<AST::Function> Parser<ManagedTokenSource>::parse_async_item (AST::Visibility vis, AST::AttrVec outer_attrs) { - const_TokenPtr t = lexer.peek_token (); + auto offset = (lexer.peek_token ()->get_id () == CONST) ? 1 : 0; + const_TokenPtr t = lexer.peek_token (offset); + if (Session::get_instance ().options.get_edition () == CompileOptions::Edition::E2015) { @@ -1456,7 +1460,7 @@ Parser<ManagedTokenSource>::parse_async_item (AST::Visibility vis, "to use %<async fn%>, switch to Rust 2018 or later")); } - t = lexer.peek_token (1); + t = lexer.peek_token (offset + 1); switch (t->get_id ()) {