[gcc r14-8073] gccrs: Parse const with no value expression

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 18:16:19 GMT 2024


https://gcc.gnu.org/g:91732258cedf367ac0f4dbe75aef7d0e22d46b3a

commit r14-8073-g91732258cedf367ac0f4dbe75aef7d0e22d46b3a
Author: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Date:   Mon Oct 23 17:06:43 2023 +0200

    gccrs: Parse const with no value expression
    
    Const with no value expression may exist either in trait or in disabled
    blocks. This means we should be able to parse those correctly.
    
    gcc/rust/ChangeLog:
    
            * ast/rust-item.h: Add a new constructor for const with no value
            expression.
            * parse/rust-parse-impl.h (Parser::parse_const_item): Allow const with
            no expression value.
    
    Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>

Diff:
---
 gcc/rust/ast/rust-item.h         |  7 +++++++
 gcc/rust/parse/rust-parse-impl.h | 10 ++++++++++
 2 files changed, 17 insertions(+)

diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index b91e18dc035..eba86dca2fa 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -2604,6 +2604,13 @@ public:
       const_expr (std::move (const_expr)), locus (locus)
   {}
 
+  ConstantItem (std::string ident, Visibility vis, std::unique_ptr<Type> type,
+		std::vector<Attribute> outer_attrs, location_t locus)
+    : VisItem (std::move (vis), std::move (outer_attrs)),
+      identifier (std::move (ident)), type (std::move (type)),
+      const_expr (nullptr), locus (locus)
+  {}
+
   ConstantItem (ConstantItem const &other)
     : VisItem (other), identifier (other.identifier), locus (other.locus)
   {
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index 7844f7214ad..4738393fd42 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -4783,6 +4783,16 @@ Parser<ManagedTokenSource>::parse_const_item (AST::Visibility vis,
   // parse constant type (required)
   std::unique_ptr<AST::Type> type = parse_type ();
 
+  // A const with no given expression value
+  if (lexer.peek_token ()->get_id () == SEMICOLON)
+    {
+      lexer.skip_token ();
+      return std::unique_ptr<AST::ConstantItem> (
+	new AST::ConstantItem (std::move (ident), std::move (vis),
+			       std::move (type), std::move (outer_attrs),
+			       locus));
+    }
+
   if (!skip_token (EQUAL))
     {
       skip_after_semicolon ();


More information about the Gcc-cvs mailing list