From: Pierre-Emmanuel Patry <[email protected]>

We will require expr within attribute input in the future in order to be
able to handle some nightly features. Even, the current macro attribute
input could be converted to an expression attribute input.

gcc/rust/ChangeLog:

        * ast/rust-ast-collector.cc (TokenCollector::visit): Add visitor
        implementation.
        * ast/rust-ast-visitor.cc (DefaultASTVisitor::visit): Likewise.
        * ast/rust-ast-collector.h: Add function prototype.
        * ast/rust-ast-visitor.h: Likewise.
        * expand/rust-derive.h: Likewise.
        * hir/rust-ast-lower-base.h: Likewise.
        * ast/rust-ast.cc (Attribute::get_traits_to_derive): Handle EXPR
        variant.
        (AttrInputExpr::AttrInputExpr): Add constructor.
        (AttrInputExpr::operator=): Add assignment operator implementation.
        (AttrInputExpr::as_string): Add a string conversion member function.
        (AttrInputExpr::accept_vis): Add visitor function.
        * ast/rust-ast.h: Add EXPR type variant to AttrInput.
        * util/rust-attributes.cc (check_doc_attribute): Handle expr variant.
        * ast/rust-expr.h (class AttrInputExpr): Add class definition with
        member function prototypes.
        * hir/rust-ast-lower-base.cc (ASTLoweringBase::visit): Add empty
        visitor implementation.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/c7fc4b7eaf7987db34824894c9762bcefc87cac4

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4425

 gcc/rust/ast/rust-ast-collector.cc  | 12 +++++++++
 gcc/rust/ast/rust-ast-collector.h   |  1 +
 gcc/rust/ast/rust-ast-visitor.cc    |  6 +++++
 gcc/rust/ast/rust-ast-visitor.h     |  2 ++
 gcc/rust/ast/rust-ast.cc            | 24 +++++++++++++++++
 gcc/rust/ast/rust-ast.h             |  1 +
 gcc/rust/ast/rust-expr.h            | 41 +++++++++++++++++++++++++++++
 gcc/rust/expand/rust-derive.h       |  1 +
 gcc/rust/hir/rust-ast-lower-base.cc |  4 +++
 gcc/rust/hir/rust-ast-lower-base.h  |  1 +
 gcc/rust/util/rust-attributes.cc    |  1 +
 11 files changed, 94 insertions(+)

diff --git a/gcc/rust/ast/rust-ast-collector.cc 
b/gcc/rust/ast/rust-ast-collector.cc
index 15cd82d29..ba4b8aa0b 100644
--- a/gcc/rust/ast/rust-ast-collector.cc
+++ b/gcc/rust/ast/rust-ast-collector.cc
@@ -181,6 +181,11 @@ TokenCollector::visit (Attribute &attrib)
              visit (static_cast<AttrInputMacro &> (attrib.get_attr_input ()));
              break;
            }
+         case AST::AttrInput::AttrInputType::EXPR:
+           {
+             visit (static_cast<AttrInputExpr &> (attrib.get_attr_input ()));
+             break;
+           }
          case AST::AttrInput::AttrInputType::META_ITEM:
            {
              visit (static_cast<AttrInputMetaItemContainer &> (
@@ -907,6 +912,13 @@ TokenCollector::visit (AttrInputMacro &macro)
   });
 }
 
+void
+TokenCollector::visit (AttrInputExpr &attr)
+{
+  describe_node (std::string ("AttrInputExpr"),
+                [this, &attr] () { visit (attr.get_expr ()); });
+}
+
 void
 TokenCollector::visit (MetaItemLitExpr &item)
 {
diff --git a/gcc/rust/ast/rust-ast-collector.h 
b/gcc/rust/ast/rust-ast-collector.h
index 870079a7d..af60e9d1f 100644
--- a/gcc/rust/ast/rust-ast-collector.h
+++ b/gcc/rust/ast/rust-ast-collector.h
@@ -292,6 +292,7 @@ public:
   void visit (LiteralExpr &expr);
   void visit (AttrInputLiteral &attr_input);
   void visit (AttrInputMacro &attr_input);
+  void visit (AttrInputExpr &attr_input);
   void visit (MetaItemLitExpr &meta_item);
   void visit (MetaItemPathExpr &meta_item);
   void visit (BorrowExpr &expr);
diff --git a/gcc/rust/ast/rust-ast-visitor.cc b/gcc/rust/ast/rust-ast-visitor.cc
index e04ee4dff..66054c7af 100644
--- a/gcc/rust/ast/rust-ast-visitor.cc
+++ b/gcc/rust/ast/rust-ast-visitor.cc
@@ -214,6 +214,12 @@ DefaultASTVisitor::visit (AST::AttrInputMacro &attr_input)
   visit (attr_input.get_macro ());
 }
 
+void
+DefaultASTVisitor::visit (AST::AttrInputExpr &attr_input)
+{
+  visit (attr_input.get_expr ());
+}
+
 void
 DefaultASTVisitor::visit (AST::MetaItemLitExpr &meta_item)
 {
diff --git a/gcc/rust/ast/rust-ast-visitor.h b/gcc/rust/ast/rust-ast-visitor.h
index fee25e463..0ad69a453 100644
--- a/gcc/rust/ast/rust-ast-visitor.h
+++ b/gcc/rust/ast/rust-ast-visitor.h
@@ -73,6 +73,7 @@ public:
   virtual void visit (LiteralExpr &expr) = 0;
   virtual void visit (AttrInputLiteral &attr_input) = 0;
   virtual void visit (AttrInputMacro &attr_input) = 0;
+  virtual void visit (AttrInputExpr &attr_input) = 0;
   virtual void visit (MetaItemLitExpr &meta_item) = 0;
   virtual void visit (MetaItemPathExpr &meta_item) = 0;
   virtual void visit (BorrowExpr &expr) = 0;
@@ -268,6 +269,7 @@ public:
   virtual void visit (AST::QualifiedPathInType &path) override;
   virtual void visit (AST::LiteralExpr &expr) override;
   virtual void visit (AST::AttrInputLiteral &attr_input) override;
+  virtual void visit (AST::AttrInputExpr &attr_input) override;
   virtual void visit (AST::AttrInputMacro &attr_input) override;
   virtual void visit (AST::MetaItemLitExpr &meta_item) override;
   virtual void visit (AST::MetaItemPathExpr &meta_item) override;
diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc
index ec25ba268..228cacbe5 100644
--- a/gcc/rust/ast/rust-ast.cc
+++ b/gcc/rust/ast/rust-ast.cc
@@ -339,6 +339,7 @@ Attribute::get_traits_to_derive ()
     case AST::AttrInput::TOKEN_TREE:
     case AST::AttrInput::LITERAL:
     case AST::AttrInput::MACRO:
+    case AST::AttrInput::EXPR:
       rust_unreachable ();
       break;
     }
@@ -3347,6 +3348,29 @@ AttrInputMetaItemContainer::as_string () const
   return str + ")";
 }
 
+AttrInputExpr::AttrInputExpr (const AttrInputExpr &oth)
+  : expr (oth.expr->clone_expr ())
+{}
+
+AttrInputExpr &
+AttrInputExpr::operator= (const AttrInputExpr &oth)
+{
+  expr = oth.expr->clone_expr ();
+  return *this;
+}
+
+std::string
+AttrInputExpr::as_string () const
+{
+  return expr->as_string ();
+}
+
+void
+AttrInputExpr::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
 std::string
 AttrInputMacro::as_string () const
 {
diff --git a/gcc/rust/ast/rust-ast.h b/gcc/rust/ast/rust-ast.h
index 47587a162..350eb2afd 100644
--- a/gcc/rust/ast/rust-ast.h
+++ b/gcc/rust/ast/rust-ast.h
@@ -724,6 +724,7 @@ class AttrInput : public Visitable
 public:
   enum AttrInputType
   {
+    EXPR,
     LITERAL,
     MACRO,
     META_ITEM,
diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h
index 2e49c50f4..1ea5c3a30 100644
--- a/gcc/rust/ast/rust-expr.h
+++ b/gcc/rust/ast/rust-expr.h
@@ -169,6 +169,47 @@ protected:
   }
 };
 
+class AttrInputExpr : public AttrInput
+{
+  std::unique_ptr<Expr> expr;
+
+public:
+  AttrInputExpr (std::unique_ptr<Expr> expr) : expr (std::move (expr)) {}
+
+  AttrInputExpr (const AttrInputExpr &oth);
+
+  AttrInputExpr (AttrInputExpr &&oth) : expr (std::move (oth.expr)) {}
+
+  AttrInputType get_attr_input_type () const final override
+  {
+    return AttrInput::AttrInputType::EXPR;
+  }
+
+  AttrInputExpr &operator= (const AttrInputExpr &oth);
+
+  AttrInputExpr &operator= (AttrInputExpr &&oth)
+  {
+    expr = std::move (oth.expr);
+    return *this;
+  }
+
+  std::string as_string () const override;
+
+  void accept_vis (ASTVisitor &vis) override;
+
+  bool check_cfg_predicate (const Session &) const override { return false; }
+
+  // assuming this is like AttrInputLiteral
+  bool is_meta_item () const override { return false; }
+
+  Expr &get_expr () { return *expr; }
+
+  AttrInputExpr *clone_attr_input_impl () const override
+  {
+    return new AttrInputExpr (*this);
+  }
+};
+
 // Like an AttrInputLiteral, but stores a MacroInvocation
 class AttrInputMacro : public AttrInput
 {
diff --git a/gcc/rust/expand/rust-derive.h b/gcc/rust/expand/rust-derive.h
index 9cfd311f6..1f0662ab2 100644
--- a/gcc/rust/expand/rust-derive.h
+++ b/gcc/rust/expand/rust-derive.h
@@ -105,6 +105,7 @@ private:
   virtual void visit (DelimTokenTree &delim_tok_tree) override final{};
   virtual void visit (AttrInputMetaItemContainer &input) override final{};
   virtual void visit (AttrInputMacro &expr) override final{};
+  virtual void visit (AttrInputExpr &expr) override final{};
   virtual void visit (IdentifierExpr &ident_expr) override final{};
   virtual void visit (Lifetime &lifetime) override final{};
   virtual void visit (LifetimeParam &lifetime_param) override final{};
diff --git a/gcc/rust/hir/rust-ast-lower-base.cc 
b/gcc/rust/hir/rust-ast-lower-base.cc
index 814b851ae..1fc73152a 100644
--- a/gcc/rust/hir/rust-ast-lower-base.cc
+++ b/gcc/rust/hir/rust-ast-lower-base.cc
@@ -143,6 +143,10 @@ ASTLoweringBase::visit (AST::AttrInputLiteral &)
 void
 ASTLoweringBase::visit (AST::AttrInputMacro &)
 {}
+
+void
+ASTLoweringBase::visit (AST::AttrInputExpr &)
+{}
 void
 ASTLoweringBase::visit (AST::MetaItemLitExpr &)
 {}
diff --git a/gcc/rust/hir/rust-ast-lower-base.h 
b/gcc/rust/hir/rust-ast-lower-base.h
index 94cef480e..42675c281 100644
--- a/gcc/rust/hir/rust-ast-lower-base.h
+++ b/gcc/rust/hir/rust-ast-lower-base.h
@@ -105,6 +105,7 @@ public:
   // rust-expr.h
   virtual void visit (AST::LiteralExpr &expr) override;
   virtual void visit (AST::AttrInputLiteral &attr_input) override;
+  virtual void visit (AST::AttrInputExpr &attr_input) override;
   virtual void visit (AST::AttrInputMacro &attr_input) override;
   virtual void visit (AST::MetaItemLitExpr &meta_item) override;
   virtual void visit (AST::MetaItemPathExpr &meta_item) override;
diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc
index 3fe01c4ff..bf2762f68 100644
--- a/gcc/rust/util/rust-attributes.cc
+++ b/gcc/rust/util/rust-attributes.cc
@@ -270,6 +270,7 @@ check_doc_attribute (const AST::Attribute &attribute)
     case AST::AttrInput::LITERAL:
     case AST::AttrInput::MACRO:
     case AST::AttrInput::META_ITEM:
+    case AST::AttrInput::EXPR:
       break;
       // FIXME: Handle them as well
 
-- 
2.53.0

Reply via email to