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 ())
     {

Reply via email to