[COMMITTED 19/41] gccrs: Add AttrInputExpr node
arthur.cohen@embecosm.com
arthur.cohen@embecosm.com
Fri Mar 20 17:30:08 GMT 2026
From: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
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 <pierre-emmanuel.patry@embecosm.com>
---
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 15cd82d2986..ba4b8aa0b3d 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 ¯o)
});
}
+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 870079a7d6a..af60e9d1f41 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 e04ee4dffe2..66054c7afbd 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 fee25e4635d..0ad69a453ee 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 ec25ba2688a..228cacbe52e 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 47587a162d4..350eb2afdb1 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 2e49c50f46f..1ea5c3a3004 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 9cfd311f67d..1f0662ab2cb 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 814b851ae40..1fc73152a00 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 94cef480e94..42675c281cf 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 3fe01c4ff8e..bf2762f68da 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.50.1
More information about the Gcc-rust
mailing list