https://gcc.gnu.org/g:271a348960418b579787858072880f35da47c59c

commit r15-8802-g271a348960418b579787858072880f35da47c59c
Author: Philip Herron <herron.phi...@googlemail.com>
Date:   Sat Feb 15 21:22:16 2025 +0000

    gccrs: Add name resolution and HIR lowering for ImplTraitType's
    
    Our AST has ImplTraitType for multiple bounds and a singular
    ImplTraitTypeOneBound, this patch desugars these into a simple
    HIR::ImplTraitType. It also does the name resolution for this.
    
    gcc/rust/ChangeLog:
    
            * checks/errors/borrowck/rust-bir-builder-struct.h: remove 
HIR::ImplTraitTypeOneBound
            * checks/errors/borrowck/rust-function-collector.h: likewise
            * checks/errors/rust-const-checker.cc (ConstChecker::visit): 
likewise
            * checks/errors/rust-const-checker.h: likewise
            * checks/errors/rust-hir-pattern-analysis.cc 
(PatternChecker::visit): likewise
            * checks/errors/rust-hir-pattern-analysis.h: likewise
            * checks/errors/rust-unsafe-checker.cc (UnsafeChecker::visit): 
likewise
            * checks/errors/rust-unsafe-checker.h: likewise
            * hir/rust-ast-lower-type.cc (ASTLoweringType::translate): likewise
            (ASTLoweringType::visit): likewise
            * hir/rust-ast-lower-type.h: cleanup
            * hir/rust-hir-dump.cc (Dump::visit): remove ImplTraitTypeOneBound
            * hir/rust-hir-dump.h: likewise
            * hir/tree/rust-hir-full-decls.h (class ImplTraitTypeOneBound): 
likewise
            * hir/tree/rust-hir-type.h (class ImplTraitTypeOneBound): likewise
            * hir/tree/rust-hir-visitor.h: likewise
            * hir/tree/rust-hir.cc (ImplTraitTypeOneBound::as_string):  likewise
            (ImplTraitTypeOneBound::accept_vis):  likewise
            * resolve/rust-ast-resolve-type.cc (ResolveType::go): likewise
            (ResolveType::visit): likewise
            * resolve/rust-ast-resolve-type.h: add name resolution
            * typecheck/rust-hir-type-check-type.h: likewise
    
    Signed-off-by: Philip Herron <herron.phi...@googlemail.com>

Diff:
---
 .../errors/borrowck/rust-bir-builder-struct.h      |  4 --
 .../errors/borrowck/rust-function-collector.h      |  1 -
 gcc/rust/checks/errors/rust-const-checker.cc       |  4 --
 gcc/rust/checks/errors/rust-const-checker.h        |  1 -
 .../checks/errors/rust-hir-pattern-analysis.cc     |  4 --
 gcc/rust/checks/errors/rust-hir-pattern-analysis.h |  1 -
 gcc/rust/checks/errors/rust-unsafe-checker.cc      |  4 --
 gcc/rust/checks/errors/rust-unsafe-checker.h       |  1 -
 gcc/rust/hir/rust-ast-lower-type.cc                | 36 ++++++++++++++
 gcc/rust/hir/rust-ast-lower-type.h                 |  3 ++
 gcc/rust/hir/rust-hir-dump.cc                      |  9 ----
 gcc/rust/hir/rust-hir-dump.h                       |  1 -
 gcc/rust/hir/tree/rust-hir-full-decls.h            |  1 -
 gcc/rust/hir/tree/rust-hir-type.h                  | 32 ------------
 gcc/rust/hir/tree/rust-hir-visitor.h               |  3 --
 gcc/rust/hir/tree/rust-hir.cc                      | 20 --------
 gcc/rust/resolve/rust-ast-resolve-type.cc          | 58 +++++++++++++++++++++-
 gcc/rust/resolve/rust-ast-resolve-type.h           | 52 +++----------------
 gcc/rust/typecheck/rust-hir-type-check-type.h      |  3 --
 19 files changed, 103 insertions(+), 135 deletions(-)

diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-builder-struct.h 
b/gcc/rust/checks/errors/borrowck/rust-bir-builder-struct.h
index 18ddc19db1dd..94fcecd40edb 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-builder-struct.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-builder-struct.h
@@ -250,10 +250,6 @@ protected:
   void visit (HIR::ImplTraitType &type) override { rust_unreachable (); }
   void visit (HIR::TraitObjectType &type) override { rust_unreachable (); }
   void visit (HIR::ParenthesisedType &type) override { rust_unreachable (); }
-  void visit (HIR::ImplTraitTypeOneBound &type) override
-  {
-    rust_unreachable ();
-  }
   void visit (HIR::TupleType &type) override { rust_unreachable (); }
   void visit (HIR::NeverType &type) override { rust_unreachable (); }
   void visit (HIR::RawPointerType &type) override { rust_unreachable (); }
diff --git a/gcc/rust/checks/errors/borrowck/rust-function-collector.h 
b/gcc/rust/checks/errors/borrowck/rust-function-collector.h
index 5de503d441cc..cdb20e8504a4 100644
--- a/gcc/rust/checks/errors/borrowck/rust-function-collector.h
+++ b/gcc/rust/checks/errors/borrowck/rust-function-collector.h
@@ -180,7 +180,6 @@ public:
   void visit (HIR::ImplTraitType &type) override {}
   void visit (HIR::TraitObjectType &type) override {}
   void visit (HIR::ParenthesisedType &type) override {}
-  void visit (HIR::ImplTraitTypeOneBound &type) override {}
   void visit (HIR::TupleType &type) override {}
   void visit (HIR::NeverType &type) override {}
   void visit (HIR::RawPointerType &type) override {}
diff --git a/gcc/rust/checks/errors/rust-const-checker.cc 
b/gcc/rust/checks/errors/rust-const-checker.cc
index 97b35288baed..4904322b9382 100644
--- a/gcc/rust/checks/errors/rust-const-checker.cc
+++ b/gcc/rust/checks/errors/rust-const-checker.cc
@@ -846,10 +846,6 @@ void
 ConstChecker::visit (ParenthesisedType &)
 {}
 
-void
-ConstChecker::visit (ImplTraitTypeOneBound &)
-{}
-
 void
 ConstChecker::visit (TupleType &)
 {}
diff --git a/gcc/rust/checks/errors/rust-const-checker.h 
b/gcc/rust/checks/errors/rust-const-checker.h
index 9a618b8f96d0..00f5798865a7 100644
--- a/gcc/rust/checks/errors/rust-const-checker.h
+++ b/gcc/rust/checks/errors/rust-const-checker.h
@@ -191,7 +191,6 @@ private:
   virtual void visit (ImplTraitType &type) override;
   virtual void visit (TraitObjectType &type) override;
   virtual void visit (ParenthesisedType &type) override;
-  virtual void visit (ImplTraitTypeOneBound &type) override;
   virtual void visit (TupleType &type) override;
   virtual void visit (NeverType &type) override;
   virtual void visit (RawPointerType &type) override;
diff --git a/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc 
b/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
index 79416b5d50a5..257f4cd0c08c 100644
--- a/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
+++ b/gcc/rust/checks/errors/rust-hir-pattern-analysis.cc
@@ -684,10 +684,6 @@ void
 PatternChecker::visit (ParenthesisedType &)
 {}
 
-void
-PatternChecker::visit (ImplTraitTypeOneBound &)
-{}
-
 void
 PatternChecker::visit (TupleType &)
 {}
diff --git a/gcc/rust/checks/errors/rust-hir-pattern-analysis.h 
b/gcc/rust/checks/errors/rust-hir-pattern-analysis.h
index 9c43d4143d2a..2171340d4ad7 100644
--- a/gcc/rust/checks/errors/rust-hir-pattern-analysis.h
+++ b/gcc/rust/checks/errors/rust-hir-pattern-analysis.h
@@ -164,7 +164,6 @@ private:
   virtual void visit (ImplTraitType &type) override;
   virtual void visit (TraitObjectType &type) override;
   virtual void visit (ParenthesisedType &type) override;
-  virtual void visit (ImplTraitTypeOneBound &type) override;
   virtual void visit (TupleType &type) override;
   virtual void visit (NeverType &type) override;
   virtual void visit (RawPointerType &type) override;
diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.cc 
b/gcc/rust/checks/errors/rust-unsafe-checker.cc
index fadfd9dea83a..8aa59ee9e284 100644
--- a/gcc/rust/checks/errors/rust-unsafe-checker.cc
+++ b/gcc/rust/checks/errors/rust-unsafe-checker.cc
@@ -956,10 +956,6 @@ void
 UnsafeChecker::visit (ParenthesisedType &)
 {}
 
-void
-UnsafeChecker::visit (ImplTraitTypeOneBound &)
-{}
-
 void
 UnsafeChecker::visit (TupleType &)
 {}
diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.h 
b/gcc/rust/checks/errors/rust-unsafe-checker.h
index 8dc6ab790716..63098fe5a7db 100644
--- a/gcc/rust/checks/errors/rust-unsafe-checker.h
+++ b/gcc/rust/checks/errors/rust-unsafe-checker.h
@@ -172,7 +172,6 @@ private:
   virtual void visit (ImplTraitType &type) override;
   virtual void visit (TraitObjectType &type) override;
   virtual void visit (ParenthesisedType &type) override;
-  virtual void visit (ImplTraitTypeOneBound &type) override;
   virtual void visit (TupleType &type) override;
   virtual void visit (NeverType &type) override;
   virtual void visit (RawPointerType &type) override;
diff --git a/gcc/rust/hir/rust-ast-lower-type.cc 
b/gcc/rust/hir/rust-ast-lower-type.cc
index 8df418b272d4..d3e528dc925a 100644
--- a/gcc/rust/hir/rust-ast-lower-type.cc
+++ b/gcc/rust/hir/rust-ast-lower-type.cc
@@ -477,6 +477,42 @@ ASTLoweringType::visit (AST::ParenthesisedType &type)
                                  type.get_locus ());
 }
 
+void
+ASTLoweringType::visit (AST::ImplTraitType &type)
+{
+  std::vector<std::unique_ptr<HIR::TypeParamBound>> bounds;
+  for (auto &bound : type.get_type_param_bounds ())
+    {
+      auto b = ASTLoweringTypeBounds::translate (*bound.get ());
+      bounds.push_back (std::unique_ptr<HIR::TypeParamBound> (b));
+    }
+
+  auto crate_num = mappings.get_current_crate ();
+  Analysis::NodeMapping mapping (crate_num, type.get_node_id (),
+                                mappings.get_next_hir_id (crate_num),
+                                mappings.get_next_localdef_id (crate_num));
+
+  translated
+    = new HIR::ImplTraitType (mapping, std::move (bounds), type.get_locus ());
+}
+
+void
+ASTLoweringType::visit (AST::ImplTraitTypeOneBound &type)
+{
+  std::vector<std::unique_ptr<HIR::TypeParamBound>> bounds;
+
+  auto b = ASTLoweringTypeBounds::translate (type.get_trait_bound ());
+  bounds.push_back (std::unique_ptr<HIR::TypeParamBound> (b));
+
+  auto crate_num = mappings.get_current_crate ();
+  Analysis::NodeMapping mapping (crate_num, type.get_node_id (),
+                                mappings.get_next_hir_id (crate_num),
+                                mappings.get_next_localdef_id (crate_num));
+
+  translated
+    = new HIR::ImplTraitType (mapping, std::move (bounds), type.get_locus ());
+}
+
 HIR::GenericParam *
 ASTLowerGenericParam::translate (AST::GenericParam &param)
 {
diff --git a/gcc/rust/hir/rust-ast-lower-type.h 
b/gcc/rust/hir/rust-ast-lower-type.h
index af0b4bec9194..4efaeee13149 100644
--- a/gcc/rust/hir/rust-ast-lower-type.h
+++ b/gcc/rust/hir/rust-ast-lower-type.h
@@ -82,6 +82,9 @@ public:
   void visit (AST::TraitObjectType &type) override;
   void visit (AST::ParenthesisedType &type) override;
 
+  void visit (AST::ImplTraitType &type) override;
+  void visit (AST::ImplTraitTypeOneBound &type) override;
+
 private:
   ASTLoweringType (bool default_to_static_lifetime)
     : ASTLoweringBase (),
diff --git a/gcc/rust/hir/rust-hir-dump.cc b/gcc/rust/hir/rust-hir-dump.cc
index 0bfcc97afe7b..686127750b47 100644
--- a/gcc/rust/hir/rust-hir-dump.cc
+++ b/gcc/rust/hir/rust-hir-dump.cc
@@ -2332,15 +2332,6 @@ Dump::visit (ParenthesisedType &e)
   end ("ParenthesisedType");
 }
 
-void
-Dump::visit (ImplTraitTypeOneBound &e)
-{
-  begin ("ImplTraitTypeOneBound");
-  do_type (e);
-  visit_field ("trait_bound", e.get_trait_bound ());
-  end ("ImplTraitTypeOneBound");
-}
-
 void
 Dump::visit (TupleType &e)
 {
diff --git a/gcc/rust/hir/rust-hir-dump.h b/gcc/rust/hir/rust-hir-dump.h
index 8683dee9d6c0..afcd66837281 100644
--- a/gcc/rust/hir/rust-hir-dump.h
+++ b/gcc/rust/hir/rust-hir-dump.h
@@ -237,7 +237,6 @@ private:
   virtual void visit (ImplTraitType &) override;
   virtual void visit (TraitObjectType &) override;
   virtual void visit (ParenthesisedType &) override;
-  virtual void visit (ImplTraitTypeOneBound &) override;
   virtual void visit (TupleType &) override;
   virtual void visit (NeverType &) override;
   virtual void visit (RawPointerType &) override;
diff --git a/gcc/rust/hir/tree/rust-hir-full-decls.h 
b/gcc/rust/hir/tree/rust-hir-full-decls.h
index c64c8bf65136..6c19f24e0ad0 100644
--- a/gcc/rust/hir/tree/rust-hir-full-decls.h
+++ b/gcc/rust/hir/tree/rust-hir-full-decls.h
@@ -211,7 +211,6 @@ class TraitBound;
 class ImplTraitType;
 class TraitObjectType;
 class ParenthesisedType;
-class ImplTraitTypeOneBound;
 class TupleType;
 class NeverType;
 class RawPointerType;
diff --git a/gcc/rust/hir/tree/rust-hir-type.h 
b/gcc/rust/hir/tree/rust-hir-type.h
index e231d78b2ced..bd0f2b6213e5 100644
--- a/gcc/rust/hir/tree/rust-hir-type.h
+++ b/gcc/rust/hir/tree/rust-hir-type.h
@@ -164,38 +164,6 @@ public:
   void accept_vis (HIRTypeVisitor &vis) override;
 };
 
-// Impl trait with a single bound? Poor reference material here.
-class ImplTraitTypeOneBound : public TypeNoBounds
-{
-  TraitBound trait_bound;
-
-protected:
-  /* Use covariance to implement clone function as returning this object rather
-   * than base */
-  ImplTraitTypeOneBound *clone_type_impl () const override
-  {
-    return new ImplTraitTypeOneBound (*this);
-  }
-
-  /* Use covariance to implement clone function as returning this object rather
-   * than base */
-  ImplTraitTypeOneBound *clone_type_no_bounds_impl () const override
-  {
-    return new ImplTraitTypeOneBound (*this);
-  }
-
-public:
-  ImplTraitTypeOneBound (Analysis::NodeMapping mappings, TraitBound 
trait_bound,
-                        location_t locus)
-    : TypeNoBounds (mappings, locus), trait_bound (std::move (trait_bound))
-  {}
-
-  std::string as_string () const override;
-  TraitBound &get_trait_bound () { return trait_bound; }
-  void accept_vis (HIRFullVisitor &vis) override;
-  void accept_vis (HIRTypeVisitor &vis) override;
-};
-
 /* A type consisting of the "product" of others (the tuple's elements) in a
  * specific order */
 class TupleType : public TypeNoBounds
diff --git a/gcc/rust/hir/tree/rust-hir-visitor.h 
b/gcc/rust/hir/tree/rust-hir-visitor.h
index 33e6b7bc7085..800e64767a41 100644
--- a/gcc/rust/hir/tree/rust-hir-visitor.h
+++ b/gcc/rust/hir/tree/rust-hir-visitor.h
@@ -142,7 +142,6 @@ public:
   virtual void visit (ImplTraitType &type) = 0;
   virtual void visit (TraitObjectType &type) = 0;
   virtual void visit (ParenthesisedType &type) = 0;
-  virtual void visit (ImplTraitTypeOneBound &type) = 0;
   virtual void visit (TupleType &type) = 0;
   virtual void visit (NeverType &type) = 0;
   virtual void visit (RawPointerType &type) = 0;
@@ -290,7 +289,6 @@ public:
   virtual void visit (ImplTraitType &) override {}
   virtual void visit (TraitObjectType &) override {}
   virtual void visit (ParenthesisedType &) override {}
-  virtual void visit (ImplTraitTypeOneBound &) override {}
   virtual void visit (TupleType &) override {}
   virtual void visit (NeverType &) override {}
   virtual void visit (RawPointerType &) override {}
@@ -354,7 +352,6 @@ public:
   virtual void visit (ImplTraitType &type) = 0;
   virtual void visit (TraitObjectType &type) = 0;
   virtual void visit (ParenthesisedType &type) = 0;
-  virtual void visit (ImplTraitTypeOneBound &type) = 0;
   virtual void visit (TupleType &type) = 0;
   virtual void visit (NeverType &type) = 0;
   virtual void visit (RawPointerType &type) = 0;
diff --git a/gcc/rust/hir/tree/rust-hir.cc b/gcc/rust/hir/tree/rust-hir.cc
index 22b0867305c9..822eaffcb7c1 100644
--- a/gcc/rust/hir/tree/rust-hir.cc
+++ b/gcc/rust/hir/tree/rust-hir.cc
@@ -2865,14 +2865,6 @@ BareFunctionType::as_string () const
   return str;
 }
 
-std::string
-ImplTraitTypeOneBound::as_string () const
-{
-  std::string str ("ImplTraitTypeOneBound: \n TraitBound: ");
-
-  return str + trait_bound.as_string ();
-}
-
 std::string
 TypePathSegmentGeneric::as_string () const
 {
@@ -4525,12 +4517,6 @@ ParenthesisedType::accept_vis (HIRFullVisitor &vis)
   vis.visit (*this);
 }
 
-void
-ImplTraitTypeOneBound::accept_vis (HIRFullVisitor &vis)
-{
-  vis.visit (*this);
-}
-
 void
 TupleType::accept_vis (HIRFullVisitor &vis)
 {
@@ -4723,12 +4709,6 @@ ArrayType::accept_vis (HIRTypeVisitor &vis)
   vis.visit (*this);
 }
 
-void
-ImplTraitTypeOneBound::accept_vis (HIRTypeVisitor &vis)
-{
-  vis.visit (*this);
-}
-
 void
 BareFunctionType::accept_vis (HIRTypeVisitor &vis)
 {
diff --git a/gcc/rust/resolve/rust-ast-resolve-type.cc 
b/gcc/rust/resolve/rust-ast-resolve-type.cc
index 63c9daca565f..f0e5468a2451 100644
--- a/gcc/rust/resolve/rust-ast-resolve-type.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-type.cc
@@ -27,6 +27,49 @@ namespace Resolver {
 
 // rust-ast-resolve-type.h
 
+NodeId
+ResolveType::go (AST::Type &type)
+{
+  ResolveType resolver;
+  type.accept_vis (resolver);
+  return resolver.resolved_node;
+}
+
+void
+ResolveType::visit (AST::BareFunctionType &fntype)
+{
+  for (auto &param : fntype.get_function_params ())
+    ResolveType::go (param.get_type ());
+
+  if (fntype.has_return_type ())
+    ResolveType::go (fntype.get_return_type ());
+}
+
+void
+ResolveType::visit (AST::TupleType &tuple)
+{
+  if (tuple.is_unit_type ())
+    {
+      resolved_node = resolver->get_unit_type_node_id ();
+      return;
+    }
+
+  for (auto &elem : tuple.get_elems ())
+    ResolveType::go (*elem);
+}
+
+void
+ResolveType::visit (AST::TypePath &path)
+{
+  ResolveRelativeTypePath::go (path, resolved_node);
+}
+
+void
+ResolveType::visit (AST::QualifiedPathInType &path)
+{
+  ResolveRelativeQualTypePath::go (path);
+}
+
 void
 ResolveType::visit (AST::ArrayType &type)
 {
@@ -72,7 +115,7 @@ ResolveType::visit (AST::RawPointerType &type)
 void
 ResolveType::visit (AST::InferredType &)
 {
-  // FIXME
+  // nothing to do
 }
 
 void
@@ -87,6 +130,19 @@ ResolveType::visit (AST::SliceType &type)
   resolved_node = ResolveType::go (type.get_elem_type ());
 }
 
+void
+ResolveType::visit (AST::ImplTraitType &type)
+{
+  for (auto &bound : type.get_type_param_bounds ())
+    ResolveTypeBound::go (*bound);
+}
+
+void
+ResolveType::visit (AST::ImplTraitTypeOneBound &type)
+{
+  ResolveTypeBound::go (type.get_trait_bound ());
+}
+
 // resolve relative type-paths
 
 bool
diff --git a/gcc/rust/resolve/rust-ast-resolve-type.h 
b/gcc/rust/resolve/rust-ast-resolve-type.h
index d3b60b6ce78d..7edcec9e1f65 100644
--- a/gcc/rust/resolve/rust-ast-resolve-type.h
+++ b/gcc/rust/resolve/rust-ast-resolve-type.h
@@ -61,61 +61,23 @@ class ResolveType : public ResolverBase
   using Rust::Resolver::ResolverBase::visit;
 
 public:
-  static NodeId go (AST::Type &type)
-  {
-    ResolveType resolver;
-    type.accept_vis (resolver);
-    return resolver.resolved_node;
-  }
-
-  void visit (AST::BareFunctionType &fntype) override
-  {
-    for (auto &param : fntype.get_function_params ())
-      ResolveType::go (param.get_type ());
-
-    if (fntype.has_return_type ())
-      ResolveType::go (fntype.get_return_type ());
-  }
-
-  void visit (AST::TupleType &tuple) override
-  {
-    if (tuple.is_unit_type ())
-      {
-       resolved_node = resolver->get_unit_type_node_id ();
-       return;
-      }
-
-    for (auto &elem : tuple.get_elems ())
-      ResolveType::go (*elem);
-  }
-
-  void visit (AST::TypePath &path) override
-  {
-    ResolveRelativeTypePath::go (path, resolved_node);
-  }
-
-  void visit (AST::QualifiedPathInType &path) override
-  {
-    ResolveRelativeQualTypePath::go (path);
-  }
+  static NodeId go (AST::Type &type);
 
+  void visit (AST::BareFunctionType &fntype) override;
+  void visit (AST::TupleType &tuple) override;
+  void visit (AST::TypePath &path) override;
+  void visit (AST::QualifiedPathInType &path) override;
   void visit (AST::ArrayType &type) override;
-
   void visit (AST::ReferenceType &type) override;
-
   void visit (AST::InferredType &type) override;
-
   void visit (AST::NeverType &type) override;
-
   void visit (AST::RawPointerType &type) override;
-
   void visit (AST::TraitObjectTypeOneBound &type) override;
-
   void visit (AST::TraitObjectType &type) override;
-
   void visit (AST::ParenthesisedType &type) override;
-
   void visit (AST::SliceType &type) override;
+  void visit (AST::ImplTraitType &type) override;
+  void visit (AST::ImplTraitTypeOneBound &type) override;
 
 private:
   ResolveType () : ResolverBase () {}
diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.h 
b/gcc/rust/typecheck/rust-hir-type-check-type.h
index 4c2e6a2f72a4..558dc5cd0b62 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.h
@@ -70,9 +70,6 @@ public:
   void visit (HIR::ImplTraitType &type) override
   { /* TODO */
   }
-  void visit (HIR::ImplTraitTypeOneBound &type) override
-  { /* TODO */
-  }
 
 private:
   TypeCheckType (HirId id)

Reply via email to