]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add AST::AttrInputMacro
authorOwen Avery <powerboat9.gamer@gmail.com>
Sun, 30 Apr 2023 06:54:22 +0000 (02:54 -0400)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:37:19 +0000 (18:37 +0100)
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>
22 files changed:
gcc/rust/ast/rust-ast-collector.cc
gcc/rust/ast/rust-ast-collector.h
gcc/rust/ast/rust-ast-dump.cc
gcc/rust/ast/rust-ast-dump.h
gcc/rust/ast/rust-ast-full-decls.h
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/checks/errors/rust-feature-gate.h
gcc/rust/expand/rust-cfg-strip.cc
gcc/rust/expand/rust-cfg-strip.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 afc169516a104529d2aa15e4c78402d92d2161aa..45a76094499097deb5d4be5fa618220ff14a3773 100644 (file)
@@ -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)
 {
index d4712c276988c8c43d51aaef6fe975e29bef4712..e1857977a0355555526f55423c763593e00a96be 100644 (file)
@@ -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);
index 8db706920c09c1aa099090c4ff7db7e208252b08..f44bb07c915f5eb0c7491fbe99be8e07a3b8627e 100644 (file)
@@ -514,6 +514,10 @@ void
 Dump::visit (AttrInputLiteral &)
 {}
 
+void
+Dump::visit (AttrInputMacro &)
+{}
+
 void
 Dump::visit (MetaItemLitExpr &)
 {}
index 408ee3d6361c3dc1b6556a97f85ca1ba03be0065..ed6f17074762ddbb09b125142f17b973151ecf0e 100644 (file)
@@ -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);
index b23af48ccdb1938d029691544909bdaa273303e2..d132c07236473c14f036616ddaa34f5cf074fa75 100644 (file)
@@ -77,6 +77,7 @@ class QualifiedPathInType;
 class ExprWithBlock;
 class LiteralExpr;
 class AttrInputLiteral;
+class AttrInputMacro;
 class MetaItemLitExpr;
 class MetaItemPathLit;
 class OperatorExpr;
index a69db3dd3cbbda3b953236492ee8e51b8b60a578..abe39eb7165519136d00c56c3108555ace6a67d4 100644 (file)
@@ -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;
index 550af84dc4a85c1b4e5705cda2c30d48f69ee28c..55b21d3e8401fc56984a252ef3ff87038f03bfae 100644 (file)
@@ -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)
 {
index a551b461a6a03a49c35f304da5d7a51732b939c7..2945cc87883f9ea89933e22a2d1c63edef23919b 100644 (file)
@@ -597,6 +597,7 @@ public:
   enum AttrInputType
   {
     LITERAL,
+    MACRO,
     META_ITEM,
     TOKEN_TREE,
   };
index 8f30965b9f7f64e60aa7f38a8f7ebd8e5d09eab8..2b23c24672392721a51b08ec6d7217e1c2194a76 100644 (file)
@@ -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
index a22569433cdf5ef0486128f405653b8a07038aec..fb9105f720634a24103f8aee2b1bbe5790473c01 100644 (file)
@@ -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 {}
index 3f47100888d1bb4acea316923ed039c3b219b980..099a171f9caf0c9cc8f057e2f14a7a3a323f50a2 100644 (file)
@@ -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?
index a118f919442c7ae570ff32234d02c3b5965bfc82..3357d23fd5a691f707b8cc1d144bfe4dd8622143 100644 (file)
@@ -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;
index a0cfd00e9a0fdc4989d984bbf2b65ac0770d97d0..be1a7a4225f9c32a9173a742a310b806fd736e7b 100644 (file)
@@ -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 &)
 {}
index 7b245181995d1ed193f05aa85919c648eaf95c37..21677ec9002cc3ab9d087642429b00ba65dcc08e 100644 (file)
@@ -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;
index 096bc4f0862fb709dc7e60af3d7bb80f84a6dd52..d1bc05bbf0f0ebbac085abb6403ee9dedbea078a 100644 (file)
@@ -87,6 +87,9 @@ void
 ASTLoweringBase::visit (AST::AttrInputLiteral &)
 {}
 void
+ASTLoweringBase::visit (AST::AttrInputMacro &)
+{}
+void
 ASTLoweringBase::visit (AST::MetaItemLitExpr &)
 {}
 void
index 7e8cbf7e8dcd93ce8654c21079bef34b7e6d43c1..7ed9cefbbc964f2529b14f3071200a8fd86908ef 100644 (file)
@@ -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);
index b70d7196584785cb23980781dd2c10ec25c3a344..e415a906a4dc3c1d3b2b32db74b2c8cf4cd8436e 100644 (file)
@@ -106,6 +106,10 @@ void
 ResolverBase::visit (AST::AttrInputLiteral &)
 {}
 
+void
+ResolverBase::visit (AST::AttrInputMacro &)
+{}
+
 void
 ResolverBase::visit (AST::MetaItemLitExpr &)
 {}
index f9aff16732231475070452e94d1a3a04cc9f4053..2db579d7b76861305bad4754bf121dcb8466957f 100644 (file)
@@ -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 &);
index 2165eed267fb5f93192e215348edab369a3c42b2..2514a2ac3d370c7a1d9211b607da1b4da4cca809 100644 (file)
@@ -221,6 +221,10 @@ void
 EarlyNameResolver::visit (AST::AttrInputLiteral &)
 {}
 
+void
+EarlyNameResolver::visit (AST::AttrInputMacro &)
+{}
+
 void
 EarlyNameResolver::visit (AST::MetaItemLitExpr &)
 {}
index 4d2ef989ba609529d2ed654b0a6d1f1675c50d34..e4b485660636e93915da7944a37a5de95c4cada4 100644 (file)
@@ -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);
index 92f0d644d98950ff668d27ba47ba02fed110948b..63bb57f3cd453b51e313361c053bec1934cbd130 100644 (file)
@@ -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 &)
 {}
index 1be2034c9147a5c5d946d7010bf77558345f1929..1259d1400095382f8d6680dafabaaf0a20a846cc 100644 (file)
@@ -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);