https://gcc.gnu.org/g:01b433d67a6774007b81258c89b11c2b6c84aaab

commit 01b433d67a6774007b81258c89b11c2b6c84aaab
Author: Arthur Cohen <arthur.co...@embecosm.com>
Date:   Tue Apr 15 17:33:11 2025 +0200

    parser: Add base for parsing const blocks
    
    gcc/rust/ChangeLog:
    
            * parse/rust-parse-impl.h (Parser::parse_const_block_expr): New 
function.
            * parse/rust-parse.h: Declare it.

Diff:
---
 gcc/rust/parse/rust-parse-impl.h | 27 +++++++++++++++++++++++++++
 gcc/rust/parse/rust-parse.h      |  5 +++++
 2 files changed, 32 insertions(+)

diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index 20b17b6292e9..35f6c899ea22 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -7238,6 +7238,30 @@ Parser<ManagedTokenSource>::parse_block_expr (
                        std::move (label), locus, end_locus));
 }
 
+/* Parse a "const block", a block preceded by the `const` keyword whose
+ * statements can be const evaluated and used in constant contexts */
+template <typename ManagedTokenSource>
+std::unique_ptr<AST::ConstBlock>
+Parser<ManagedTokenSource>::parse_const_block_expr (AST::AttrVec outer_attrs,
+                                                   location_t locus)
+{
+  auto block = parse_block_expr ();
+
+  if (!block)
+    {
+      add_error (Error (locus, "failed to parse inner block in const block"));
+      skip_after_end_block ();
+
+      return nullptr;
+    }
+
+  auto block_locus = block->get_locus ();
+
+  return std::make_unique<AST::ConstBlock> (AST::AnonConst (std::move (block),
+                                                           block_locus),
+                                           locus, std::move (outer_attrs));
+}
+
 /* Parses a "grouped" expression (expression in parentheses), used to control
  * precedence. */
 template <typename ManagedTokenSource>
@@ -12460,6 +12484,9 @@ Parser<ManagedTokenSource>::null_denotation_not_path (
               "use of %qs is not allowed on the right-side of an assignment",
               tok->get_token_description ()));
       return nullptr;
+    case CONST:
+      return parse_const_block_expr (std::move (outer_attrs),
+                                    tok->get_locus ());
     default:
       if (!restrictions.expr_can_be_null)
        add_error (Error (tok->get_locus (),
diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h
index 827d91d6cbb1..1dc12af0a3aa 100644
--- a/gcc/rust/parse/rust-parse.h
+++ b/gcc/rust/parse/rust-parse.h
@@ -17,6 +17,7 @@ along with GCC; see the file COPYING3.  If not see
 #ifndef RUST_PARSE_H
 #define RUST_PARSE_H
 
+#include "rust-ast.h"
 #include "rust-item.h"
 #include "rust-lex.h"
 #include "rust-ast-full.h"
@@ -165,6 +166,10 @@ public:
                    tl::optional<AST::LoopLabel> = tl::nullopt,
                    location_t pratt_parsed_loc = UNKNOWN_LOCATION);
 
+  std::unique_ptr<AST::ConstBlock>
+  parse_const_block_expr (AST::AttrVec outer_attrs = AST::AttrVec (),
+                         location_t loc = UNKNOWN_LOCATION);
+
   bool is_macro_rules_def (const_TokenPtr t);
   std::unique_ptr<AST::Item> parse_item (bool called_from_statement);
   std::unique_ptr<AST::Pattern> parse_pattern ();

Reply via email to