]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Parse expression instead of literal in attributes
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Wed, 30 Jul 2025 12:24:41 +0000 (14:24 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 5 Aug 2025 14:37:03 +0000 (16:37 +0200)
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.patry@embecosm.com>
19 files changed:
gcc/rust/ast/rust-ast-collector.cc
gcc/rust/ast/rust-ast-collector.h
gcc/rust/ast/rust-ast-full-decls.h
gcc/rust/ast/rust-ast-visitor.cc
gcc/rust/ast/rust-ast-visitor.h
gcc/rust/ast/rust-ast.cc
gcc/rust/ast/rust-ast.h
gcc/rust/ast/rust-expr.h
gcc/rust/expand/rust-derive.h
gcc/rust/expand/rust-expand-visitor.cc
gcc/rust/expand/rust-expand-visitor.h
gcc/rust/hir/rust-ast-lower-base.cc
gcc/rust/hir/rust-ast-lower-base.h
gcc/rust/resolve/rust-ast-resolve-base.cc
gcc/rust/resolve/rust-ast-resolve-base.h
gcc/rust/resolve/rust-early-name-resolver.cc
gcc/rust/resolve/rust-early-name-resolver.h
gcc/rust/util/rust-attributes.cc
gcc/rust/util/rust-attributes.h

index 677c2472e6f59a0cd07785b1145c12a2c014145e..3d9ea784d8b1386df3eeb8db5d7fe320b7582f4c 100644 (file)
@@ -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
index 9ffbfced47d7e244ab5a2e4a04ba72854b9b0001..d3ab18a3d10e15a4ced4633e97924d0c7e268fc8 100644 (file)
@@ -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);
index 1dfb25c4363b46d10003a34d38cd012e6ed9633d..09706cecf2c69bef329a792ba07bfcca1669f697 100644 (file)
@@ -78,7 +78,7 @@ class LiteralExpr;
 class AttrInputLiteral;
 class AttrInputMacro;
 class MetaItemLitExpr;
-class MetaItemPathLit;
+class MetaItemPathExpr;
 class OperatorExpr;
 class BorrowExpr;
 class DereferenceExpr;
index 88dc24b570c851d8cbd97d14c038ef2bfd780e4f..ab8cdbe4510eb8742fc5869df95041bc0406efb1 100644 (file)
@@ -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
index a5469cccb4233104e24e5c14a415c760dc2b3c83..2d81aa1908f3d9bafda9cf6d6433eb887d7158cb 100644 (file)
@@ -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;
index 20a41d72cdfca1c78dfe4e92ab3351163f4f86a6..8918ef8a0073966ceef36ce8499eb6702539f5a8 100644 (file)
@@ -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);
 }
index a367c5dd0c3006fb709a6122275bf478778045c1..2d2c5d0b4d76976e68b73942b08bb9c6235d7685 100644 (file)
@@ -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;
index c8f776481b581a4f59b03142785603c29842eab3..7b0df25a1a36707e045db01073cb4fd326693473 100644 (file)
@@ -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);
   }
 };
 
index 283b4434dd335bb464fa0d392a95279e18378386..10c146ca3efd6abd4da1b00968cda1e5585985f3 100644 (file)
@@ -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{};
index 69959b541c7f488a0fd5cc9a1ee6b5fcabe22c91..8f6e7faa0c45e7b0e34d68021acbf98257de8d90 100644 (file)
@@ -538,7 +538,7 @@ ExpandVisitor::visit (AST::MetaItemLitExpr &)
 {}
 
 void
-ExpandVisitor::visit (AST::MetaItemPathLit &)
+ExpandVisitor::visit (AST::MetaItemPathExpr &)
 {}
 
 void
index ef78404ae6bce64a95b0c10b8d298874f11e5abc..845e10cfec78fdb3a7f3b3209edca8ea5bb39391 100644 (file)
@@ -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;
index 09f4b930963999a3d230b2960ec964927693ced0..b723f594d20eba5c91b8f96869ceb3b619e6b0c9 100644 (file)
@@ -136,7 +136,7 @@ void
 ASTLoweringBase::visit (AST::MetaItemLitExpr &)
 {}
 void
-ASTLoweringBase::visit (AST::MetaItemPathLit &)
+ASTLoweringBase::visit (AST::MetaItemPathExpr &)
 {}
 void
 ASTLoweringBase::visit (AST::BorrowExpr &)
index af21c40d5c5409399ba80a5b2d26f735c8d47211..e86aacb216a6cf5ce34de9cabf0ca4fcc04c41ad 100644 (file)
@@ -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;
index 6b57c6d62a81e7110634e47c4cf175834006a27e..3c7b425d79ffb8866d67051ead8f6f86c7aab399 100644 (file)
@@ -116,7 +116,7 @@ ResolverBase::visit (AST::MetaItemLitExpr &)
 {}
 
 void
-ResolverBase::visit (AST::MetaItemPathLit &)
+ResolverBase::visit (AST::MetaItemPathExpr &)
 {}
 
 void
index febfc6126d522f0448a5e1cd96df3d1a9bc32934..89c5c35192e3f8318815fd9bd3376400dec5da8b 100644 (file)
@@ -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 &);
index fc9a26ccac0ddd1bd9a72effd73c8ec060bb0180..7b365ef7f26025f9414c07fc45937e14d02866f5 100644 (file)
@@ -205,7 +205,7 @@ EarlyNameResolver::visit (AST::MetaItemLitExpr &)
 {}
 
 void
-EarlyNameResolver::visit (AST::MetaItemPathLit &)
+EarlyNameResolver::visit (AST::MetaItemPathExpr &)
 {}
 
 void
index 26fc84d52dc02547c5e484e3678cb8b45f0c555e..d3c522556ca72e8934d24547e1dc396830f1edb8 100644 (file)
@@ -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);
index 0c957fb201440ffe61d9c4dd51c7defd3297ca59..273e25c43d30231e4f310ea2260761fe3964268f 100644 (file)
@@ -392,7 +392,7 @@ AttributeChecker::visit (AST::MetaItemLitExpr &)
 {}
 
 void
-AttributeChecker::visit (AST::MetaItemPathLit &)
+AttributeChecker::visit (AST::MetaItemPathExpr &)
 {}
 
 void
index 7c7a1fc3f6b16f57e94cc35c21f22e3a161115a3..db8fe234778c5e8e92df5568f00eb008b6778757 100644 (file)
@@ -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;