[gcc r14-7292] gccrs: ast: Add ExternalTypeItem node

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 17:14:42 GMT 2024


https://gcc.gnu.org/g:a8a27b074f40cbac16af37db4c03a1128ce8f201

commit r14-7292-ga8a27b074f40cbac16af37db4c03a1128ce8f201
Author: Arthur Cohen <arthur.cohen@embecosm.com>
Date:   Thu Feb 23 16:50:39 2023 +0100

    gccrs: ast: Add ExternalTypeItem node
    
    gcc/rust/ChangeLog:
    
            * ast/rust-item.h (class ExternalTypeItem): New class.
            * ast/rust-ast.cc (ExternalTypeItem::as_string): New function.
            (ExternalTypeItem::accept_vis): Likewise.
            * ast/rust-ast-full-decls.h (class ExternalTypeItem): Declare class.
            * ast/rust-ast-dump.cc (Dump::visit): Add base visitor for ExternalTypeItem.
            * ast/rust-ast-dump.h: Likewise.
            * ast/rust-ast-visitor.h: Likewise.
            * checks/errors/rust-feature-gate.h: Likewise.
            * expand/rust-attribute-visitor.cc (AttrVisitor::visit): Likewise.
            * expand/rust-attribute-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.

Diff:
---
 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                     | 16 ++++++
 gcc/rust/ast/rust-item.h                     | 75 ++++++++++++++++++++++++++++
 gcc/rust/checks/errors/rust-feature-gate.h   |  1 +
 gcc/rust/expand/rust-attribute-visitor.cc    |  8 +++
 gcc/rust/expand/rust-attribute-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 |  6 +++
 gcc/rust/resolve/rust-early-name-resolver.h  |  1 +
 gcc/rust/util/rust-attributes.cc             |  4 ++
 gcc/rust/util/rust-attributes.h              |  1 +
 17 files changed, 129 insertions(+)

diff --git a/gcc/rust/ast/rust-ast-dump.cc b/gcc/rust/ast/rust-ast-dump.cc
index a581c029e04..a5fce67fda2 100644
--- a/gcc/rust/ast/rust-ast-dump.cc
+++ b/gcc/rust/ast/rust-ast-dump.cc
@@ -1432,6 +1432,10 @@ Dump::visit (TraitImpl &impl)
   stream << "\n}\n";
 }
 
+void
+Dump::visit (ExternalTypeItem &type)
+{}
+
 void
 Dump::visit (ExternalStaticItem &)
 {}
diff --git a/gcc/rust/ast/rust-ast-dump.h b/gcc/rust/ast/rust-ast-dump.h
index ea3e6f3a896..a6adab9990f 100644
--- a/gcc/rust/ast/rust-ast-dump.h
+++ b/gcc/rust/ast/rust-ast-dump.h
@@ -251,6 +251,7 @@ private:
   void visit (Trait &trait);
   void visit (InherentImpl &impl);
   void visit (TraitImpl &impl);
+  void visit (ExternalTypeItem &item);
   void visit (ExternalStaticItem &item);
   void visit (ExternalFunctionItem &item);
   void visit (ExternBlock &block);
diff --git a/gcc/rust/ast/rust-ast-full-decls.h b/gcc/rust/ast/rust-ast-full-decls.h
index 96a6f22ecd1..352c1b97c4e 100644
--- a/gcc/rust/ast/rust-ast-full-decls.h
+++ b/gcc/rust/ast/rust-ast-full-decls.h
@@ -203,6 +203,7 @@ class Impl;
 class InherentImpl;
 class TraitImpl;
 class ExternalItem;
+class ExternalTypeItem;
 class ExternalStaticItem;
 struct NamedFunctionParam;
 class ExternalFunctionItem;
diff --git a/gcc/rust/ast/rust-ast-visitor.h b/gcc/rust/ast/rust-ast-visitor.h
index 9cde911ffe2..776e1e281f2 100644
--- a/gcc/rust/ast/rust-ast-visitor.h
+++ b/gcc/rust/ast/rust-ast-visitor.h
@@ -161,6 +161,7 @@ public:
   virtual void visit (InherentImpl &impl) = 0;
   virtual void visit (TraitImpl &impl) = 0;
   // virtual void visit(ExternalItem& item) = 0;
+  virtual void visit (ExternalTypeItem &type) = 0;
   virtual void visit (ExternalStaticItem &item) = 0;
   virtual void visit (ExternalFunctionItem &item) = 0;
   virtual void visit (ExternBlock &block) = 0;
diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc
index 6692505454f..13d31cf63d4 100644
--- a/gcc/rust/ast/rust-ast.cc
+++ b/gcc/rust/ast/rust-ast.cc
@@ -3406,6 +3406,16 @@ EnumItemDiscriminant::as_string () const
   return str;
 }
 
+std::string
+ExternalTypeItem::as_string () const
+{
+  auto str = append_attributes (outer_attrs, OUTER);
+
+  str += "type " + item_name + ";";
+
+  return str;
+}
+
 std::string
 ExternalStaticItem::as_string () const
 {
@@ -5492,6 +5502,12 @@ TraitImpl::accept_vis (ASTVisitor &vis)
   vis.visit (*this);
 }
 
+void
+ExternalTypeItem::accept_vis (ASTVisitor &vis)
+{
+  vis.visit (*this);
+}
+
 void
 ExternalStaticItem::accept_vis (ASTVisitor &vis)
 {
diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index 43853232ae8..2abf7810614 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -3907,6 +3907,81 @@ protected:
 };
 #endif
 
+// A foreign type defined outside the current crate.
+// https://rust-lang.github.io/rfcs/1861-extern-types.html
+class ExternalTypeItem : public ExternalItem
+{
+  std::vector<Attribute> outer_attrs;
+
+  Visibility visibility;
+  Identifier item_name;
+  Location locus;
+
+  bool marked_for_strip;
+
+public:
+  ExternalTypeItem (Identifier item_name, Visibility vis,
+		    std::vector<Attribute> outer_attrs, Location locus)
+    : ExternalItem (), outer_attrs (std::move (outer_attrs)), visibility (vis),
+      item_name (std::move (item_name)), locus (locus), marked_for_strip (false)
+  {}
+
+  ExternalTypeItem (ExternalTypeItem const &other)
+    : outer_attrs (other.outer_attrs), visibility (other.visibility),
+      item_name (other.item_name), locus (other.locus),
+      marked_for_strip (other.marked_for_strip)
+  {
+    node_id = other.node_id;
+  }
+
+  ExternalTypeItem &operator= (ExternalTypeItem const &other)
+  {
+    node_id = other.node_id;
+    outer_attrs = other.outer_attrs;
+    visibility = other.visibility;
+    item_name = other.item_name;
+    locus = other.locus;
+    marked_for_strip = other.marked_for_strip;
+
+    return *this;
+  }
+
+  // move constructors
+  ExternalTypeItem (ExternalTypeItem &&other) = default;
+  ExternalTypeItem &operator= (ExternalTypeItem &&other) = default;
+
+  std::string as_string () const override;
+
+  void accept_vis (ASTVisitor &vis) override;
+
+  // Returns whether item has outer attributes.
+  bool has_outer_attrs () const { return !outer_attrs.empty (); }
+
+  // Returns whether item has non-default visibility.
+  bool has_visibility () const { return !visibility.is_error (); }
+
+  Location get_locus () const { return locus; }
+
+  void mark_for_strip () override { marked_for_strip = true; };
+  bool is_marked_for_strip () const override { return marked_for_strip; };
+
+  // TODO: this mutable getter seems really dodgy. Think up better way.
+  std::vector<Attribute> &get_outer_attrs () { return outer_attrs; }
+  const std::vector<Attribute> &get_outer_attrs () const { return outer_attrs; }
+
+  Identifier get_identifier () const { return item_name; }
+
+  const Visibility &get_visibility () const { return visibility; }
+
+protected:
+  /* Use covariance to implement clone function as returning this object
+   * rather than base */
+  ExternalTypeItem *clone_external_item_impl () const override
+  {
+    return new ExternalTypeItem (*this);
+  }
+};
+
 // A static item used in an extern block
 class ExternalStaticItem : public ExternalItem
 {
diff --git a/gcc/rust/checks/errors/rust-feature-gate.h b/gcc/rust/checks/errors/rust-feature-gate.h
index 520015543fd..0adc4c07d12 100644
--- a/gcc/rust/checks/errors/rust-feature-gate.h
+++ b/gcc/rust/checks/errors/rust-feature-gate.h
@@ -133,6 +133,7 @@ public:
   void visit (AST::Trait &trait) override {}
   void visit (AST::InherentImpl &impl) override;
   void visit (AST::TraitImpl &impl) override;
+  void visit (AST::ExternalTypeItem &item) override {}
   void visit (AST::ExternalStaticItem &item) override {}
   void visit (AST::ExternalFunctionItem &item) override {}
   void visit (AST::ExternBlock &block) override;
diff --git a/gcc/rust/expand/rust-attribute-visitor.cc b/gcc/rust/expand/rust-attribute-visitor.cc
index cbcfe30325a..e6289270e08 100644
--- a/gcc/rust/expand/rust-attribute-visitor.cc
+++ b/gcc/rust/expand/rust-attribute-visitor.cc
@@ -2734,6 +2734,13 @@ AttrVisitor::visit (AST::TraitImpl &impl)
   expand_macro_children (MacroExpander::TRAIT_IMPL, impl.get_impl_items (),
 			 extractor);
 }
+
+void
+AttrVisitor::visit (AST::ExternalTypeItem &item)
+{
+  // TODO: ARTHUR
+}
+
 void
 AttrVisitor::visit (AST::ExternalStaticItem &item)
 {
@@ -2757,6 +2764,7 @@ AttrVisitor::visit (AST::ExternalStaticItem &item)
 
   expander.pop_context ();
 }
+
 void
 AttrVisitor::visit (AST::ExternalFunctionItem &item)
 {
diff --git a/gcc/rust/expand/rust-attribute-visitor.h b/gcc/rust/expand/rust-attribute-visitor.h
index 1d36d5fab96..1b8546e746a 100644
--- a/gcc/rust/expand/rust-attribute-visitor.h
+++ b/gcc/rust/expand/rust-attribute-visitor.h
@@ -223,6 +223,7 @@ public:
   void visit (AST::Trait &trait) override;
   void visit (AST::InherentImpl &impl) override;
   void visit (AST::TraitImpl &impl) override;
+  void visit (AST::ExternalTypeItem &item) override;
   void visit (AST::ExternalStaticItem &item) override;
   void visit (AST::ExternalFunctionItem &item) override;
   void visit (AST::ExternBlock &block) override;
diff --git a/gcc/rust/hir/rust-ast-lower-base.cc b/gcc/rust/hir/rust-ast-lower-base.cc
index a6012f9b8db..7b0c48f84c2 100644
--- a/gcc/rust/hir/rust-ast-lower-base.cc
+++ b/gcc/rust/hir/rust-ast-lower-base.cc
@@ -352,6 +352,9 @@ ASTLoweringBase::visit (AST::TraitImpl &)
 {}
 //  void ASTLoweringBase::visit(ExternalItemitem) {}
 void
+ASTLoweringBase::visit (AST::ExternalTypeItem &)
+{}
+void
 ASTLoweringBase::visit (AST::ExternalStaticItem &)
 {}
 void
diff --git a/gcc/rust/hir/rust-ast-lower-base.h b/gcc/rust/hir/rust-ast-lower-base.h
index 79985d9ecdd..95d75d1acb5 100644
--- a/gcc/rust/hir/rust-ast-lower-base.h
+++ b/gcc/rust/hir/rust-ast-lower-base.h
@@ -189,6 +189,7 @@ public:
   virtual void visit (AST::InherentImpl &impl);
   virtual void visit (AST::TraitImpl &impl);
   //  virtual void visit(ExternalItem& item);
+  virtual void visit (AST::ExternalTypeItem &item);
   virtual void visit (AST::ExternalStaticItem &item);
   virtual void visit (AST::ExternalFunctionItem &item);
   virtual void visit (AST::ExternBlock &block);
diff --git a/gcc/rust/resolve/rust-ast-resolve-base.cc b/gcc/rust/resolve/rust-ast-resolve-base.cc
index 1eb6644a7b2..7bc98027cbf 100644
--- a/gcc/rust/resolve/rust-ast-resolve-base.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-base.cc
@@ -446,6 +446,10 @@ void
 ResolverBase::visit (AST::TraitImpl &)
 {}
 
+void
+ResolverBase::visit (AST::ExternalTypeItem &)
+{}
+
 void
 ResolverBase::visit (AST::ExternalStaticItem &)
 {}
diff --git a/gcc/rust/resolve/rust-ast-resolve-base.h b/gcc/rust/resolve/rust-ast-resolve-base.h
index 9132f43b133..f4de7c628ae 100644
--- a/gcc/rust/resolve/rust-ast-resolve-base.h
+++ b/gcc/rust/resolve/rust-ast-resolve-base.h
@@ -138,6 +138,7 @@ public:
   void visit (AST::InherentImpl &);
   void visit (AST::TraitImpl &);
 
+  void visit (AST::ExternalTypeItem &);
   void visit (AST::ExternalStaticItem &);
   void visit (AST::ExternalFunctionItem &);
   void visit (AST::ExternBlock &);
diff --git a/gcc/rust/resolve/rust-early-name-resolver.cc b/gcc/rust/resolve/rust-early-name-resolver.cc
index fd3e81ad6e5..4078586781c 100644
--- a/gcc/rust/resolve/rust-early-name-resolver.cc
+++ b/gcc/rust/resolve/rust-early-name-resolver.cc
@@ -770,6 +770,12 @@ EarlyNameResolver::visit (AST::TraitImpl &impl)
   });
 }
 
+void
+EarlyNameResolver::visit (AST::ExternalTypeItem &item)
+{
+  // nothing to do?
+}
+
 void
 EarlyNameResolver::visit (AST::ExternalStaticItem &item)
 {
diff --git a/gcc/rust/resolve/rust-early-name-resolver.h b/gcc/rust/resolve/rust-early-name-resolver.h
index 6d973092101..7390cb17f65 100644
--- a/gcc/rust/resolve/rust-early-name-resolver.h
+++ b/gcc/rust/resolve/rust-early-name-resolver.h
@@ -215,6 +215,7 @@ private:
   virtual void visit (AST::Trait &trait);
   virtual void visit (AST::InherentImpl &impl);
   virtual void visit (AST::TraitImpl &impl);
+  virtual void visit (AST::ExternalTypeItem &item);
   virtual void visit (AST::ExternalStaticItem &item);
   virtual void visit (AST::ExternalFunctionItem &item);
   virtual void visit (AST::ExternBlock &block);
diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc
index d1c86dd2293..4ef1ea05afc 100644
--- a/gcc/rust/util/rust-attributes.cc
+++ b/gcc/rust/util/rust-attributes.cc
@@ -621,6 +621,10 @@ void
 AttributeChecker::visit (AST::TraitImpl &)
 {}
 
+void
+AttributeChecker::visit (AST::ExternalTypeItem &)
+{}
+
 void
 AttributeChecker::visit (AST::ExternalStaticItem &)
 {}
diff --git a/gcc/rust/util/rust-attributes.h b/gcc/rust/util/rust-attributes.h
index a33b6770370..cc01afcbb7f 100644
--- a/gcc/rust/util/rust-attributes.h
+++ b/gcc/rust/util/rust-attributes.h
@@ -200,6 +200,7 @@ private:
   void visit (AST::Trait &trait);
   void visit (AST::InherentImpl &impl);
   void visit (AST::TraitImpl &impl);
+  void visit (AST::ExternalTypeItem &item);
   void visit (AST::ExternalStaticItem &item);
   void visit (AST::ExternalFunctionItem &item);
   void visit (AST::ExternBlock &block);


More information about the Gcc-cvs mailing list