https://gcc.gnu.org/g:35d2c4cfe3a1d2b5c4a9754ed4aa34c668d52173

commit r16-3002-g35d2c4cfe3a1d2b5c4a9754ed4aa34c668d52173
Author: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>
Date:   Wed Jul 30 14:24:41 2025 +0200

    gccrs: Parse expression instead of literal in attributes
    
    gcc/rust/ChangeLog:
    
            * ast/rust-ast.cc (AttributeParser::parse_path_meta_item): Parse
            expression instead of literal. Update variant name.
            (MetaItemPathLit::to_attribute): Remove function.
            (AttributeParser::parse_path_meta_item): Update name.
            (MetaItemPathLit::check_cfg_predicate): Likewise.
            (MetaItemPathExpr::check_cfg_predicate): Likewise.
            (MetaItemPathLit::accept_vis): Likewise.
            (MetaItemPathExpr::accept_vis): Likewise.
            * ast/rust-ast-collector.h: Update prototype and adapt code to new
            expression.
            * ast/rust-ast-collector.cc: Update code to expr.
            * ast/rust-ast-full-decls.h (class MetaItemPathLit): Likewise.
            (class MetaItemPathExpr): Likewise.
            * ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Likewise.
            * ast/rust-ast-visitor.h: Likewise.
            * ast/rust-ast.h (class MetaItemPathLit): Rename class from here...
            (class MetaItemPathExpr): ... to here.
            * ast/rust-expr.h (class MetaItemPathLit): Rename class from here...
            (class MetaItemPathExpr): ...to here.
            * expand/rust-derive.h: Update class name.
            * expand/rust-expand-visitor.cc (ExpandVisitor::visit): Likewise.
            * expand/rust-expand-visitor.h: Likewise.
            * hir/rust-ast-lower-base.cc (ASTLoweringBase::visit): Likewise.
            * hir/rust-ast-lower-base.h: Likewise.
            * resolve/rust-ast-resolve-base.cc (ResolverBase::visit): Likewise.
            * resolve/rust-ast-resolve-base.h: Likewise.
            * resolve/rust-early-name-resolver.cc (EarlyNameResolver::visit):
            Likewise.
            * resolve/rust-early-name-resolver.h: Likewise.
            * util/rust-attributes.cc (AttributeChecker::visit): Likewise.
            * util/rust-attributes.h: Likewise.
    
    Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>

Diff:
---
 gcc/rust/ast/rust-ast-collector.cc           | 10 +++----
 gcc/rust/ast/rust-ast-collector.h            |  2 +-
 gcc/rust/ast/rust-ast-full-decls.h           |  2 +-
 gcc/rust/ast/rust-ast-visitor.cc             |  4 +--
 gcc/rust/ast/rust-ast-visitor.h              |  4 +--
 gcc/rust/ast/rust-ast.cc                     | 28 +++++++++----------
 gcc/rust/ast/rust-ast.h                      |  4 +--
 gcc/rust/ast/rust-expr.h                     | 40 +++++++++++++++++++---------
 gcc/rust/expand/rust-derive.h                |  2 +-
 gcc/rust/expand/rust-expand-visitor.cc       |  2 +-
 gcc/rust/expand/rust-expand-visitor.h        |  2 +-
 gcc/rust/hir/rust-ast-lower-base.cc          |  2 +-
 gcc/rust/hir/rust-ast-lower-base.h           |  2 +-
 gcc/rust/resolve/rust-ast-resolve-base.cc    |  2 +-
 gcc/rust/resolve/rust-ast-resolve-base.h     |  2 +-
 gcc/rust/resolve/rust-early-name-resolver.cc |  2 +-
 gcc/rust/resolve/rust-early-name-resolver.h  |  2 +-
 gcc/rust/util/rust-attributes.cc             |  2 +-
 gcc/rust/util/rust-attributes.h              |  2 +-
 19 files changed, 63 insertions(+), 53 deletions(-)

diff --git a/gcc/rust/ast/rust-ast-collector.cc 
b/gcc/rust/ast/rust-ast-collector.cc
index 677c2472e6f5..3d9ea784d8b1 100644
--- a/gcc/rust/ast/rust-ast-collector.cc
+++ b/gcc/rust/ast/rust-ast-collector.cc
@@ -840,13 +840,13 @@ TokenCollector::visit (MetaItemLitExpr &item)
 }
 
 void
-TokenCollector::visit (MetaItemPathLit &item)
+TokenCollector::visit (MetaItemPathExpr &item)
 {
-  auto path = item.get_path ();
-  auto lit = item.get_literal ();
+  auto &path = item.get_path ();
+  auto &expr = item.get_expr ();
   visit (path);
-  push (Rust::Token::make (COLON, item.get_locus ()));
-  visit (lit);
+  push (Rust::Token::make (EQUAL, item.get_locus ()));
+  visit (expr);
 }
 
 void
diff --git a/gcc/rust/ast/rust-ast-collector.h 
b/gcc/rust/ast/rust-ast-collector.h
index 9ffbfced47d7..d3ab18a3d10e 100644
--- a/gcc/rust/ast/rust-ast-collector.h
+++ b/gcc/rust/ast/rust-ast-collector.h
@@ -246,7 +246,7 @@ public:
   void visit (AttrInputLiteral &attr_input);
   void visit (AttrInputMacro &attr_input);
   void visit (MetaItemLitExpr &meta_item);
-  void visit (MetaItemPathLit &meta_item);
+  void visit (MetaItemPathExpr &meta_item);
   void visit (BorrowExpr &expr);
   void visit (DereferenceExpr &expr);
   void visit (ErrorPropagationExpr &expr);
diff --git a/gcc/rust/ast/rust-ast-full-decls.h 
b/gcc/rust/ast/rust-ast-full-decls.h
index 1dfb25c4363b..09706cecf2c6 100644
--- a/gcc/rust/ast/rust-ast-full-decls.h
+++ b/gcc/rust/ast/rust-ast-full-decls.h
@@ -78,7 +78,7 @@ class LiteralExpr;
 class AttrInputLiteral;
 class AttrInputMacro;
 class MetaItemLitExpr;
-class MetaItemPathLit;
+class MetaItemPathExpr;
 class OperatorExpr;
 class BorrowExpr;
 class DereferenceExpr;
diff --git a/gcc/rust/ast/rust-ast-visitor.cc b/gcc/rust/ast/rust-ast-visitor.cc
index 88dc24b570c8..ab8cdbe4510e 100644
--- a/gcc/rust/ast/rust-ast-visitor.cc
+++ b/gcc/rust/ast/rust-ast-visitor.cc
@@ -224,10 +224,10 @@ DefaultASTVisitor::visit (AST::SimplePath &path)
 }
 
 void
-DefaultASTVisitor::visit (AST::MetaItemPathLit &meta_item)
+DefaultASTVisitor::visit (AST::MetaItemPathExpr &meta_item)
 {
   visit (meta_item.get_path ());
-  visit (meta_item.get_literal ());
+  visit (meta_item.get_expr ());
 }
 
 void
diff --git a/gcc/rust/ast/rust-ast-visitor.h b/gcc/rust/ast/rust-ast-visitor.h
index a5469cccb423..2d81aa1908f3 100644
--- a/gcc/rust/ast/rust-ast-visitor.h
+++ b/gcc/rust/ast/rust-ast-visitor.h
@@ -73,7 +73,7 @@ public:
   virtual void visit (AttrInputLiteral &attr_input) = 0;
   virtual void visit (AttrInputMacro &attr_input) = 0;
   virtual void visit (MetaItemLitExpr &meta_item) = 0;
-  virtual void visit (MetaItemPathLit &meta_item) = 0;
+  virtual void visit (MetaItemPathExpr &meta_item) = 0;
   virtual void visit (BorrowExpr &expr) = 0;
   virtual void visit (DereferenceExpr &expr) = 0;
   virtual void visit (ErrorPropagationExpr &expr) = 0;
@@ -270,7 +270,7 @@ public:
   virtual void visit (AST::AttrInputLiteral &attr_input) override;
   virtual void visit (AST::AttrInputMacro &attr_input) override;
   virtual void visit (AST::MetaItemLitExpr &meta_item) override;
-  virtual void visit (AST::MetaItemPathLit &meta_item) override;
+  virtual void visit (AST::MetaItemPathExpr &meta_item) override;
   virtual void visit (AST::BorrowExpr &expr) override;
   virtual void visit (AST::DereferenceExpr &expr) override;
   virtual void visit (AST::ErrorPropagationExpr &expr) override;
diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc
index 20a41d72cdfc..8918ef8a0073 100644
--- a/gcc/rust/ast/rust-ast.cc
+++ b/gcc/rust/ast/rust-ast.cc
@@ -288,7 +288,7 @@ Attribute::get_traits_to_derive ()
                      break;
                    case AST::MetaItem::ItemKind::ListPaths:
                    case AST::MetaItem::ItemKind::NameValueStr:
-                   case AST::MetaItem::ItemKind::PathLit:
+                   case AST::MetaItem::ItemKind::PathExpr:
                    case AST::MetaItem::ItemKind::Seq:
                    case AST::MetaItem::ItemKind::ListNameValueStr:
                    default:
@@ -3712,20 +3712,12 @@ AttributeParser::parse_path_meta_item ()
       {
        skip_token ();
 
-       location_t locus = peek_token ()->get_locus ();
-       Literal lit = parse_literal ();
-       if (lit.is_error ())
-         {
-           rust_error_at (peek_token ()->get_locus (),
-                          "failed to parse literal in attribute");
-           return nullptr;
-         }
-       LiteralExpr expr (std::move (lit), {}, locus);
+       std::unique_ptr<Expr> expr = parser->parse_expr ();
        // stream_pos++;
        /* shouldn't be required anymore due to parsing literal actually
         * skipping the token */
-       return std::unique_ptr<MetaItemPathLit> (
-         new MetaItemPathLit (std::move (path), std::move (expr)));
+       return std::unique_ptr<MetaItemPathExpr> (
+         new MetaItemPathExpr (std::move (path), std::move (expr)));
       }
     case COMMA:
       // just simple path
@@ -4144,10 +4136,12 @@ MetaNameValueStr::check_cfg_predicate (const Session 
&session) const
 }
 
 bool
-MetaItemPathLit::check_cfg_predicate (const Session &session) const
+MetaItemPathExpr::check_cfg_predicate (const Session &session) const
 {
+  // FIXME: Accept path expressions
+  rust_assert (expr->is_literal ());
   return session.options.target_data.has_key_value_pair (path.as_string (),
-                                                        lit.as_string ());
+                                                        expr->as_string ());
 }
 
 std::vector<std::unique_ptr<Token>>
@@ -4235,8 +4229,10 @@ MetaListNameValueStr::to_attribute () const
 }
 
 Attribute
-MetaItemPathLit::to_attribute () const
+MetaItemPathExpr::to_attribute () const
 {
+  rust_assert (expr->is_literal ());
+  auto &lit = static_cast<LiteralExpr &> (*expr);
   return Attribute (path, std::unique_ptr<AttrInputLiteral> (
                            new AttrInputLiteral (lit)));
 }
@@ -4406,7 +4402,7 @@ MetaItemLitExpr::accept_vis (ASTVisitor &vis)
 }
 
 void
-MetaItemPathLit::accept_vis (ASTVisitor &vis)
+MetaItemPathExpr::accept_vis (ASTVisitor &vis)
 {
   vis.visit (*this);
 }
diff --git a/gcc/rust/ast/rust-ast.h b/gcc/rust/ast/rust-ast.h
index a367c5dd0c30..2d2c5d0b4d76 100644
--- a/gcc/rust/ast/rust-ast.h
+++ b/gcc/rust/ast/rust-ast.h
@@ -1073,7 +1073,7 @@ public:
     Path,
     Word,
     NameValueStr,
-    PathLit,
+    PathExpr,
     Seq,
     ListPaths,
     ListNameValueStr,
@@ -1091,7 +1091,7 @@ public:
 class MetaItemLitExpr;
 
 // Forward decl - defined in rust-expr.h
-class MetaItemPathLit;
+class MetaItemPathExpr;
 
 // Forward decl - defined in rust-macro.h
 class MetaItemPath;
diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h
index c8f776481b58..7b0df25a1a36 100644
--- a/gcc/rust/ast/rust-expr.h
+++ b/gcc/rust/ast/rust-expr.h
@@ -249,36 +249,50 @@ protected:
   }
 };
 
-// more generic meta item "path = lit" form
-class MetaItemPathLit : public MetaItem
+// more generic meta item "path = expr" form
+class MetaItemPathExpr : public MetaItem
 {
   SimplePath path;
-  LiteralExpr lit;
+  std::unique_ptr<Expr> expr;
 
 public:
-  MetaItemPathLit (SimplePath path, LiteralExpr lit_expr)
-    : path (std::move (path)), lit (std::move (lit_expr))
+  MetaItemPathExpr (SimplePath path, std::unique_ptr<Expr> expr)
+    : path (std::move (path)), expr (std::move (expr))
+  {}
+
+  MetaItemPathExpr (const MetaItemPathExpr &other)
+    : MetaItem (other), path (other.path), expr (other.expr->clone_expr ())
   {}
 
+  MetaItemPathExpr (MetaItemPathExpr &&) = default;
+
+  MetaItemPathExpr &operator= (MetaItemPathExpr &&) = default;
+
+  MetaItemPathExpr operator= (const MetaItemPathExpr &other)
+  {
+    MetaItem::operator= (other);
+    path = other.path;
+    expr = other.expr->clone_expr ();
+    return *this;
+  }
+
   SimplePath get_path () const { return path; }
 
   SimplePath &get_path () { return path; }
 
-  LiteralExpr get_literal () const { return lit; }
-
-  LiteralExpr &get_literal () { return lit; }
+  Expr &get_expr () { return *expr; }
 
   std::string as_string () const override
   {
-    return path.as_string () + " = " + lit.as_string ();
+    return path.as_string () + " = " + expr->as_string ();
   }
 
   MetaItem::ItemKind get_item_kind () const override
   {
-    return MetaItem::ItemKind::PathLit;
+    return MetaItem::ItemKind::PathExpr;
   }
 
-  // There are two Locations in MetaItemPathLit (path and lit_expr),
+  // There are two Locations in MetaItemPathExpr (path and expr),
   //  we have no idea use which of them, just simply return UNKNOWN_LOCATION
   //  now.
   // Maybe we will figure out when we really need the location in the future.
@@ -294,9 +308,9 @@ public:
 
 protected:
   // Use covariance to implement clone function as returning this type
-  MetaItemPathLit *clone_meta_item_inner_impl () const override
+  MetaItemPathExpr *clone_meta_item_inner_impl () const override
   {
-    return new MetaItemPathLit (*this);
+    return new MetaItemPathExpr (*this);
   }
 };
 
diff --git a/gcc/rust/expand/rust-derive.h b/gcc/rust/expand/rust-derive.h
index 283b4434dd33..10c146ca3efd 100644
--- a/gcc/rust/expand/rust-derive.h
+++ b/gcc/rust/expand/rust-derive.h
@@ -118,7 +118,7 @@ private:
   virtual void visit (LiteralExpr &expr) override final{};
   virtual void visit (AttrInputLiteral &attr_input) override final{};
   virtual void visit (MetaItemLitExpr &meta_item) override final{};
-  virtual void visit (MetaItemPathLit &meta_item) override final{};
+  virtual void visit (MetaItemPathExpr &meta_item) override final{};
   virtual void visit (BorrowExpr &expr) override final{};
   virtual void visit (DereferenceExpr &expr) override final{};
   virtual void visit (ErrorPropagationExpr &expr) override final{};
diff --git a/gcc/rust/expand/rust-expand-visitor.cc 
b/gcc/rust/expand/rust-expand-visitor.cc
index 69959b541c7f..8f6e7faa0c45 100644
--- a/gcc/rust/expand/rust-expand-visitor.cc
+++ b/gcc/rust/expand/rust-expand-visitor.cc
@@ -538,7 +538,7 @@ ExpandVisitor::visit (AST::MetaItemLitExpr &)
 {}
 
 void
-ExpandVisitor::visit (AST::MetaItemPathLit &)
+ExpandVisitor::visit (AST::MetaItemPathExpr &)
 {}
 
 void
diff --git a/gcc/rust/expand/rust-expand-visitor.h 
b/gcc/rust/expand/rust-expand-visitor.h
index ef78404ae6bc..845e10cfec78 100644
--- a/gcc/rust/expand/rust-expand-visitor.h
+++ b/gcc/rust/expand/rust-expand-visitor.h
@@ -209,7 +209,7 @@ public:
   void visit (AST::AttrInputLiteral &) override;
   void visit (AST::AttrInputMacro &) override;
   void visit (AST::MetaItemLitExpr &) override;
-  void visit (AST::MetaItemPathLit &) override;
+  void visit (AST::MetaItemPathExpr &) override;
   void visit (AST::ErrorPropagationExpr &expr) override;
   void visit (AST::ArithmeticOrLogicalExpr &expr) override;
   void visit (AST::ComparisonExpr &expr) override;
diff --git a/gcc/rust/hir/rust-ast-lower-base.cc 
b/gcc/rust/hir/rust-ast-lower-base.cc
index 09f4b9309639..b723f594d20e 100644
--- a/gcc/rust/hir/rust-ast-lower-base.cc
+++ b/gcc/rust/hir/rust-ast-lower-base.cc
@@ -136,7 +136,7 @@ void
 ASTLoweringBase::visit (AST::MetaItemLitExpr &)
 {}
 void
-ASTLoweringBase::visit (AST::MetaItemPathLit &)
+ASTLoweringBase::visit (AST::MetaItemPathExpr &)
 {}
 void
 ASTLoweringBase::visit (AST::BorrowExpr &)
diff --git a/gcc/rust/hir/rust-ast-lower-base.h 
b/gcc/rust/hir/rust-ast-lower-base.h
index af21c40d5c54..e86aacb216a6 100644
--- a/gcc/rust/hir/rust-ast-lower-base.h
+++ b/gcc/rust/hir/rust-ast-lower-base.h
@@ -106,7 +106,7 @@ public:
   virtual void visit (AST::AttrInputLiteral &attr_input) override;
   virtual void visit (AST::AttrInputMacro &attr_input) override;
   virtual void visit (AST::MetaItemLitExpr &meta_item) override;
-  virtual void visit (AST::MetaItemPathLit &meta_item) override;
+  virtual void visit (AST::MetaItemPathExpr &meta_item) override;
   virtual void visit (AST::BorrowExpr &expr) override;
   virtual void visit (AST::DereferenceExpr &expr) override;
   virtual void visit (AST::NegationExpr &expr) override;
diff --git a/gcc/rust/resolve/rust-ast-resolve-base.cc 
b/gcc/rust/resolve/rust-ast-resolve-base.cc
index 6b57c6d62a81..3c7b425d79ff 100644
--- a/gcc/rust/resolve/rust-ast-resolve-base.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-base.cc
@@ -116,7 +116,7 @@ ResolverBase::visit (AST::MetaItemLitExpr &)
 {}
 
 void
-ResolverBase::visit (AST::MetaItemPathLit &)
+ResolverBase::visit (AST::MetaItemPathExpr &)
 {}
 
 void
diff --git a/gcc/rust/resolve/rust-ast-resolve-base.h 
b/gcc/rust/resolve/rust-ast-resolve-base.h
index febfc6126d52..89c5c35192e3 100644
--- a/gcc/rust/resolve/rust-ast-resolve-base.h
+++ b/gcc/rust/resolve/rust-ast-resolve-base.h
@@ -58,7 +58,7 @@ public:
   void visit (AST::AttrInputLiteral &);
   void visit (AST::AttrInputMacro &);
   void visit (AST::MetaItemLitExpr &);
-  void visit (AST::MetaItemPathLit &);
+  void visit (AST::MetaItemPathExpr &);
   void visit (AST::BorrowExpr &);
   void visit (AST::DereferenceExpr &);
   void visit (AST::ErrorPropagationExpr &);
diff --git a/gcc/rust/resolve/rust-early-name-resolver.cc 
b/gcc/rust/resolve/rust-early-name-resolver.cc
index fc9a26ccac0d..7b365ef7f260 100644
--- a/gcc/rust/resolve/rust-early-name-resolver.cc
+++ b/gcc/rust/resolve/rust-early-name-resolver.cc
@@ -205,7 +205,7 @@ EarlyNameResolver::visit (AST::MetaItemLitExpr &)
 {}
 
 void
-EarlyNameResolver::visit (AST::MetaItemPathLit &)
+EarlyNameResolver::visit (AST::MetaItemPathExpr &)
 {}
 
 void
diff --git a/gcc/rust/resolve/rust-early-name-resolver.h 
b/gcc/rust/resolve/rust-early-name-resolver.h
index 26fc84d52dc0..d3c522556ca7 100644
--- a/gcc/rust/resolve/rust-early-name-resolver.h
+++ b/gcc/rust/resolve/rust-early-name-resolver.h
@@ -142,7 +142,7 @@ private:
   virtual void visit (AST::AttrInputLiteral &attr_input);
   virtual void visit (AST::AttrInputMacro &attr_input);
   virtual void visit (AST::MetaItemLitExpr &meta_item);
-  virtual void visit (AST::MetaItemPathLit &meta_item);
+  virtual void visit (AST::MetaItemPathExpr &meta_item);
   virtual void visit (AST::StructExprStruct &expr);
   virtual void visit (AST::StructExprFieldIdentifier &field);
   virtual void visit (AST::StructExprStructBase &expr);
diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc
index 0c957fb20144..273e25c43d30 100644
--- a/gcc/rust/util/rust-attributes.cc
+++ b/gcc/rust/util/rust-attributes.cc
@@ -392,7 +392,7 @@ AttributeChecker::visit (AST::MetaItemLitExpr &)
 {}
 
 void
-AttributeChecker::visit (AST::MetaItemPathLit &)
+AttributeChecker::visit (AST::MetaItemPathExpr &)
 {}
 
 void
diff --git a/gcc/rust/util/rust-attributes.h b/gcc/rust/util/rust-attributes.h
index 7c7a1fc3f6b1..db8fe234778c 100644
--- a/gcc/rust/util/rust-attributes.h
+++ b/gcc/rust/util/rust-attributes.h
@@ -130,7 +130,7 @@ private:
   void visit (AST::AttrInputLiteral &attr_input) override;
   void visit (AST::AttrInputMacro &attr_input) override;
   void visit (AST::MetaItemLitExpr &meta_item) override;
-  void visit (AST::MetaItemPathLit &meta_item) override;
+  void visit (AST::MetaItemPathExpr &meta_item) override;
   void visit (AST::BorrowExpr &expr) override;
   void visit (AST::DereferenceExpr &expr) override;
   void visit (AST::ErrorPropagationExpr &expr) override;

Reply via email to