[gcc r14-7599] gccrs: Add AST::AttrInputMacro

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 17:44:01 GMT 2024


https://gcc.gnu.org/g:842a8307ca36858529de75ab0532749f2140f900

commit r14-7599-g842a8307ca36858529de75ab0532749f2140f900
Author: Owen Avery <powerboat9.gamer@gmail.com>
Date:   Sun Apr 30 02:54:22 2023 -0400

    gccrs: Add AST::AttrInputMacro
    
    gcc/rust/ChangeLog:
    
            * ast/rust-ast-dump.cc
            (Dump::visit): Add AttrInputMacro visitor.
            * ast/rust-ast-dump.h:
            (Dump::visit): Likewise.
            * ast/rust-ast-full-decls.h
            (class AttrInputMacro): New.
            * ast/rust-ast-collector.cc
            (TokenCollector::visit):
            Add and call out to AttrInputMacro visitor.
            * ast/rust-ast-collector.h:
            (TokenCollector::visit): Add AttrInputMacro visitor.
            * ast/rust-ast-visitor.h:
            (ASTVisitor::visit): Likewise.
            * ast/rust-ast.cc
            (AttrInputMacro::accept_vis): New.
            (AttrInputMacro::as_string): New.
            (AttrInputMacro::AttrInputMacro): New.
            (AttrInputMacro::operator=): New.
            * ast/rust-ast.h:
            (AttrInput::AttrInputType::MACRO): New.
            * ast/rust-expr.h
            (class AttrInputMacro): New.
            * checks/errors/rust-feature-gate.h:
            (FeatureGate::visit): Add AttrInputMacro visitor.
            * expand/rust-cfg-strip.cc
            (CfgStrip::visit): Likewise.
            * expand/rust-cfg-strip.h:
            (CfgStrip::visit): Likewise.
            * expand/rust-expand-visitor.cc
            (ExpandVisitor::visit): Likewise.
            * expand/rust-expand-visitor.h:
            (ExpandVisitor::visit): Likewise.
            * hir/rust-ast-lower-base.cc
            (ASTLoweringBase::visit): Likewise.
            * hir/rust-ast-lower-base.h:
            (ASTLoweringBase::visit): Likewise.
            * resolve/rust-ast-resolve-base.cc
            (ResolverBase::visit): Likewise.
            * resolve/rust-ast-resolve-base.h:
            (ResolverBase::visit): Likewise.
            * resolve/rust-early-name-resolver.cc
            (EarlyNameResolver::visit): Likewise.
            * resolve/rust-early-name-resolver.h:
            (EarlyNameResolver::visit): Likewise.
            * util/rust-attributes.cc
            (AttributeChecker::visit): Likewise.
            (check_doc_attribute): Handle AttrInputType::MACRO.
            * util/rust-attributes.h:
            (AttributeChecker::visit): Add AttrInputMacro visitor.
    
    Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>

Diff:
---
 gcc/rust/ast/rust-ast-collector.cc           | 11 ++++++++
 gcc/rust/ast/rust-ast-collector.h            |  1 +
 gcc/rust/ast/rust-ast-dump.cc                |  4 +++
 gcc/rust/ast/rust-ast-dump.h                 |  1 +
 gcc/rust/ast/rust-ast-full-decls.h           |  1 +
 gcc/rust/ast/rust-ast-visitor.h              |  1 +
 gcc/rust/ast/rust-ast.cc                     | 24 ++++++++++++++++
 gcc/rust/ast/rust-ast.h                      |  1 +
 gcc/rust/ast/rust-expr.h                     | 42 ++++++++++++++++++++++++++++
 gcc/rust/checks/errors/rust-feature-gate.h   |  1 +
 gcc/rust/expand/rust-cfg-strip.cc            |  5 ++++
 gcc/rust/expand/rust-cfg-strip.h             |  1 +
 gcc/rust/expand/rust-expand-visitor.cc       |  6 ++++
 gcc/rust/expand/rust-expand-visitor.h        |  1 +
 gcc/rust/hir/rust-ast-lower-base.cc          |  3 ++
 gcc/rust/hir/rust-ast-lower-base.h           |  1 +
 gcc/rust/resolve/rust-ast-resolve-base.cc    |  4 +++
 gcc/rust/resolve/rust-ast-resolve-base.h     |  1 +
 gcc/rust/resolve/rust-early-name-resolver.cc |  4 +++
 gcc/rust/resolve/rust-early-name-resolver.h  |  1 +
 gcc/rust/util/rust-attributes.cc             |  5 ++++
 gcc/rust/util/rust-attributes.h              |  1 +
 22 files changed, 120 insertions(+)

diff --git a/gcc/rust/ast/rust-ast-collector.cc b/gcc/rust/ast/rust-ast-collector.cc
index afc169516a1..45a76094499 100644
--- a/gcc/rust/ast/rust-ast-collector.cc
+++ b/gcc/rust/ast/rust-ast-collector.cc
@@ -170,6 +170,10 @@ TokenCollector::visit (Attribute &attrib)
 	    visit (static_cast<AttrInputLiteral &> (attrib.get_attr_input ()));
 	    break;
 	  }
+	  case AST::AttrInput::AttrInputType::MACRO: {
+	    visit (static_cast<AttrInputMacro &> (attrib.get_attr_input ()));
+	    break;
+	  }
 	  case AST::AttrInput::AttrInputType::META_ITEM: {
 	    visit (static_cast<AttrInputMetaItemContainer &> (
 	      attrib.get_attr_input ()));
@@ -839,6 +843,13 @@ TokenCollector::visit (AttrInputLiteral &literal)
   visit (literal.get_literal ());
 }
 
+void
+TokenCollector::visit (AttrInputMacro &macro)
+{
+  tokens.push_back (Rust::Token::make (EQUAL, Location ()));
+  visit (macro.get_macro ());
+}
+
 void
 TokenCollector::visit (MetaItemLitExpr &item)
 {
diff --git a/gcc/rust/ast/rust-ast-collector.h b/gcc/rust/ast/rust-ast-collector.h
index d4712c27698..e1857977a03 100644
--- a/gcc/rust/ast/rust-ast-collector.h
+++ b/gcc/rust/ast/rust-ast-collector.h
@@ -149,6 +149,7 @@ private:
   // rust-expr.h
   void visit (LiteralExpr &expr);
   void visit (AttrInputLiteral &attr_input);
+  void visit (AttrInputMacro &attr_input);
   void visit (MetaItemLitExpr &meta_item);
   void visit (MetaItemPathLit &meta_item);
   void visit (BorrowExpr &expr);
diff --git a/gcc/rust/ast/rust-ast-dump.cc b/gcc/rust/ast/rust-ast-dump.cc
index 8db706920c0..f44bb07c915 100644
--- a/gcc/rust/ast/rust-ast-dump.cc
+++ b/gcc/rust/ast/rust-ast-dump.cc
@@ -514,6 +514,10 @@ void
 Dump::visit (AttrInputLiteral &)
 {}
 
+void
+Dump::visit (AttrInputMacro &)
+{}
+
 void
 Dump::visit (MetaItemLitExpr &)
 {}
diff --git a/gcc/rust/ast/rust-ast-dump.h b/gcc/rust/ast/rust-ast-dump.h
index 408ee3d6361..ed6f1707476 100644
--- a/gcc/rust/ast/rust-ast-dump.h
+++ b/gcc/rust/ast/rust-ast-dump.h
@@ -137,6 +137,7 @@ private:
   // rust-expr.h
   void visit (LiteralExpr &expr);
   void visit (AttrInputLiteral &attr_input);
+  void visit (AttrInputMacro &attr_input);
   void visit (MetaItemLitExpr &meta_item);
   void visit (MetaItemPathLit &meta_item);
   void visit (BorrowExpr &expr);
diff --git a/gcc/rust/ast/rust-ast-full-decls.h b/gcc/rust/ast/rust-ast-full-decls.h
index b23af48ccdb..d132c072364 100644
--- a/gcc/rust/ast/rust-ast-full-decls.h
+++ b/gcc/rust/ast/rust-ast-full-decls.h
@@ -77,6 +77,7 @@ class QualifiedPathInType;
 class ExprWithBlock;
 class LiteralExpr;
 class AttrInputLiteral;
+class AttrInputMacro;
 class MetaItemLitExpr;
 class MetaItemPathLit;
 class OperatorExpr;
diff --git a/gcc/rust/ast/rust-ast-visitor.h b/gcc/rust/ast/rust-ast-visitor.h
index a69db3dd3cb..abe39eb7165 100644
--- a/gcc/rust/ast/rust-ast-visitor.h
+++ b/gcc/rust/ast/rust-ast-visitor.h
@@ -66,6 +66,7 @@ public:
   // rust-expr.h
   virtual void visit (LiteralExpr &expr) = 0;
   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 (BorrowExpr &expr) = 0;
diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc
index 550af84dc4a..55b21d3e840 100644
--- a/gcc/rust/ast/rust-ast.cc
+++ b/gcc/rust/ast/rust-ast.cc
@@ -3266,6 +3266,12 @@ AttrInputMetaItemContainer::as_string () const
   return str + ")";
 }
 
+std::string
+AttrInputMacro::as_string () const
+{
+  return " = " + macro->as_string ();
+}
+
 /* Override that calls the function recursively on all items contained within
  * the module. */
 void
@@ -4220,6 +4226,18 @@ BlockExpr::strip_tail_expr ()
     }
 }
 
+// needed here because "rust-expr.h" doesn't include "rust-macro.h"
+AttrInputMacro::AttrInputMacro (const AttrInputMacro &oth)
+  : macro (oth.macro->clone_macro_invocation_impl ())
+{}
+
+void
+AttrInputMacro::operator= (const AttrInputMacro &oth)
+{
+  macro = std::unique_ptr<MacroInvocation> (
+    oth.macro->clone_macro_invocation_impl ());
+}
+
 /* Visitor implementations - these are short but inlining can't happen anyway
  * due to virtual functions and I didn't want to make the ast header includes
  * any longer than they already are. */
@@ -4266,6 +4284,12 @@ AttrInputLiteral::accept_vis (ASTVisitor &vis)
   vis.visit (*this);
 }
 
+void
+AttrInputMacro::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
 void
 MetaItemLitExpr::accept_vis (ASTVisitor &vis)
 {
diff --git a/gcc/rust/ast/rust-ast.h b/gcc/rust/ast/rust-ast.h
index a551b461a6a..2945cc87883 100644
--- a/gcc/rust/ast/rust-ast.h
+++ b/gcc/rust/ast/rust-ast.h
@@ -597,6 +597,7 @@ public:
   enum AttrInputType
   {
     LITERAL,
+    MACRO,
     META_ITEM,
     TOKEN_TREE,
   };
diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h
index 8f30965b9f7..2b23c246723 100644
--- a/gcc/rust/ast/rust-expr.h
+++ b/gcc/rust/ast/rust-expr.h
@@ -139,6 +139,48 @@ protected:
   }
 };
 
+// Like an AttrInputLiteral, but stores a MacroInvocation
+class AttrInputMacro : public AttrInput
+{
+  std::unique_ptr<MacroInvocation> macro;
+
+public:
+  AttrInputMacro (std::unique_ptr<MacroInvocation> macro)
+    : macro (std::move (macro))
+  {}
+
+  AttrInputMacro (const AttrInputMacro &oth);
+
+  AttrInputMacro (AttrInputMacro &&oth) : macro (std::move (oth.macro)) {}
+
+  void operator= (const AttrInputMacro &oth);
+
+  void operator= (AttrInputMacro &&oth) { macro = std::move (oth.macro); }
+
+  std::string as_string () const override;
+
+  void accept_vis (ASTVisitor &vis) override;
+
+  // assuming this can't be a cfg predicate
+  bool check_cfg_predicate (const Session &) const override { return false; }
+
+  // assuming this is like AttrInputLiteral
+  bool is_meta_item () const override { return false; }
+
+  std::unique_ptr<MacroInvocation> &get_macro () { return macro; }
+
+  AttrInputType get_attr_input_type () const final override
+  {
+    return AttrInput::AttrInputType::MACRO;
+  }
+
+protected:
+  AttrInputMacro *clone_attr_input_impl () const override
+  {
+    return new AttrInputMacro (*this);
+  }
+};
+
 /* literal expr only meta item inner - TODO possibly replace with inheritance of
  * LiteralExpr itself? */
 class MetaItemLitExpr : public MetaItemInner
diff --git a/gcc/rust/checks/errors/rust-feature-gate.h b/gcc/rust/checks/errors/rust-feature-gate.h
index a22569433cd..fb9105f7206 100644
--- a/gcc/rust/checks/errors/rust-feature-gate.h
+++ b/gcc/rust/checks/errors/rust-feature-gate.h
@@ -48,6 +48,7 @@ public:
   void visit (AST::QualifiedPathInType &path) override {}
   void visit (AST::LiteralExpr &expr) override {}
   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::BorrowExpr &expr) override {}
diff --git a/gcc/rust/expand/rust-cfg-strip.cc b/gcc/rust/expand/rust-cfg-strip.cc
index 3f47100888d..099a171f9ca 100644
--- a/gcc/rust/expand/rust-cfg-strip.cc
+++ b/gcc/rust/expand/rust-cfg-strip.cc
@@ -604,6 +604,11 @@ CfgStrip::visit (AST::AttrInputLiteral &)
   // shouldn't require?
 }
 void
+CfgStrip::visit (AST::AttrInputMacro &)
+{
+  // shouldn't require?
+}
+void
 CfgStrip::visit (AST::MetaItemLitExpr &)
 {
   // shouldn't require?
diff --git a/gcc/rust/expand/rust-cfg-strip.h b/gcc/rust/expand/rust-cfg-strip.h
index a118f919442..3357d23fd5a 100644
--- a/gcc/rust/expand/rust-cfg-strip.h
+++ b/gcc/rust/expand/rust-cfg-strip.h
@@ -81,6 +81,7 @@ public:
 
   void visit (AST::LiteralExpr &expr) override;
   void visit (AST::AttrInputLiteral &) override;
+  void visit (AST::AttrInputMacro &) override;
   void visit (AST::MetaItemLitExpr &) override;
   void visit (AST::MetaItemPathLit &) override;
   void visit (AST::BorrowExpr &expr) override;
diff --git a/gcc/rust/expand/rust-expand-visitor.cc b/gcc/rust/expand/rust-expand-visitor.cc
index a0cfd00e9a0..be1a7a4225f 100644
--- a/gcc/rust/expand/rust-expand-visitor.cc
+++ b/gcc/rust/expand/rust-expand-visitor.cc
@@ -323,6 +323,12 @@ void
 ExpandVisitor::visit (AST::AttrInputLiteral &)
 {}
 
+void
+ExpandVisitor::visit (AST::AttrInputMacro &macro)
+{
+  rust_sorry_at (Location (), "macros in attributes not supported");
+}
+
 void
 ExpandVisitor::visit (AST::MetaItemLitExpr &)
 {}
diff --git a/gcc/rust/expand/rust-expand-visitor.h b/gcc/rust/expand/rust-expand-visitor.h
index 7b245181995..21677ec9002 100644
--- a/gcc/rust/expand/rust-expand-visitor.h
+++ b/gcc/rust/expand/rust-expand-visitor.h
@@ -166,6 +166,7 @@ public:
 
   void visit (AST::LiteralExpr &expr) override;
   void visit (AST::AttrInputLiteral &) override;
+  void visit (AST::AttrInputMacro &) override;
   void visit (AST::MetaItemLitExpr &) override;
   void visit (AST::MetaItemPathLit &) override;
   void visit (AST::BorrowExpr &expr) override;
diff --git a/gcc/rust/hir/rust-ast-lower-base.cc b/gcc/rust/hir/rust-ast-lower-base.cc
index 096bc4f0862..d1bc05bbf0f 100644
--- a/gcc/rust/hir/rust-ast-lower-base.cc
+++ b/gcc/rust/hir/rust-ast-lower-base.cc
@@ -87,6 +87,9 @@ void
 ASTLoweringBase::visit (AST::AttrInputLiteral &)
 {}
 void
+ASTLoweringBase::visit (AST::AttrInputMacro &)
+{}
+void
 ASTLoweringBase::visit (AST::MetaItemLitExpr &)
 {}
 void
diff --git a/gcc/rust/hir/rust-ast-lower-base.h b/gcc/rust/hir/rust-ast-lower-base.h
index 7e8cbf7e8dc..7ed9cefbbc9 100644
--- a/gcc/rust/hir/rust-ast-lower-base.h
+++ b/gcc/rust/hir/rust-ast-lower-base.h
@@ -94,6 +94,7 @@ public:
   // rust-expr.h
   virtual void visit (AST::LiteralExpr &expr);
   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::BorrowExpr &expr);
diff --git a/gcc/rust/resolve/rust-ast-resolve-base.cc b/gcc/rust/resolve/rust-ast-resolve-base.cc
index b70d7196584..e415a906a4d 100644
--- a/gcc/rust/resolve/rust-ast-resolve-base.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-base.cc
@@ -106,6 +106,10 @@ void
 ResolverBase::visit (AST::AttrInputLiteral &)
 {}
 
+void
+ResolverBase::visit (AST::AttrInputMacro &)
+{}
+
 void
 ResolverBase::visit (AST::MetaItemLitExpr &)
 {}
diff --git a/gcc/rust/resolve/rust-ast-resolve-base.h b/gcc/rust/resolve/rust-ast-resolve-base.h
index f9aff167322..2db579d7b76 100644
--- a/gcc/rust/resolve/rust-ast-resolve-base.h
+++ b/gcc/rust/resolve/rust-ast-resolve-base.h
@@ -48,6 +48,7 @@ public:
   void visit (AST::QualifiedPathInType &);
   void visit (AST::LiteralExpr &);
   void visit (AST::AttrInputLiteral &);
+  void visit (AST::AttrInputMacro &);
   void visit (AST::MetaItemLitExpr &);
   void visit (AST::MetaItemPathLit &);
   void visit (AST::BorrowExpr &);
diff --git a/gcc/rust/resolve/rust-early-name-resolver.cc b/gcc/rust/resolve/rust-early-name-resolver.cc
index 2165eed267f..2514a2ac3d3 100644
--- a/gcc/rust/resolve/rust-early-name-resolver.cc
+++ b/gcc/rust/resolve/rust-early-name-resolver.cc
@@ -221,6 +221,10 @@ void
 EarlyNameResolver::visit (AST::AttrInputLiteral &)
 {}
 
+void
+EarlyNameResolver::visit (AST::AttrInputMacro &)
+{}
+
 void
 EarlyNameResolver::visit (AST::MetaItemLitExpr &)
 {}
diff --git a/gcc/rust/resolve/rust-early-name-resolver.h b/gcc/rust/resolve/rust-early-name-resolver.h
index 4d2ef989ba6..e4b48566063 100644
--- a/gcc/rust/resolve/rust-early-name-resolver.h
+++ b/gcc/rust/resolve/rust-early-name-resolver.h
@@ -142,6 +142,7 @@ private:
   virtual void visit (AST::QualifiedPathInType &path);
   virtual void visit (AST::LiteralExpr &expr);
   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::BorrowExpr &expr);
diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc
index 92f0d644d98..63bb57f3cd4 100644
--- a/gcc/rust/util/rust-attributes.cc
+++ b/gcc/rust/util/rust-attributes.cc
@@ -163,6 +163,7 @@ check_doc_attribute (const AST::Attribute &attribute)
   switch (attribute.get_attr_input ().get_attr_input_type ())
     {
     case AST::AttrInput::LITERAL:
+    case AST::AttrInput::MACRO:
     case AST::AttrInput::META_ITEM:
       break;
       // FIXME: Handle them as well
@@ -280,6 +281,10 @@ void
 AttributeChecker::visit (AST::AttrInputLiteral &)
 {}
 
+void
+AttributeChecker::visit (AST::AttrInputMacro &)
+{}
+
 void
 AttributeChecker::visit (AST::MetaItemLitExpr &)
 {}
diff --git a/gcc/rust/util/rust-attributes.h b/gcc/rust/util/rust-attributes.h
index 1be2034c914..1259d140009 100644
--- a/gcc/rust/util/rust-attributes.h
+++ b/gcc/rust/util/rust-attributes.h
@@ -113,6 +113,7 @@ private:
   // rust-expr.h
   void visit (AST::LiteralExpr &expr);
   void visit (AST::AttrInputLiteral &attr_input);
+  void visit (AST::AttrInputMacro &attr_input);
   void visit (AST::MetaItemLitExpr &meta_item);
   void visit (AST::MetaItemPathLit &meta_item);
   void visit (AST::BorrowExpr &expr);


More information about the Gcc-cvs mailing list