From: Pierre-Emmanuel Patry <[email protected]>

We want to keep both segments and opening scope resolution flag in the
same place. To do so we enforce usage of a structure that keep both
and should avoid using vector of segment.

gcc/rust/ChangeLog:

        * hir/rust-ast-lower-type.cc (ASTLowerTypePath::visit): Use RawPath
        within constructor.
        * hir/rust-hir-dump.cc (Dump::visit): Use new getter.
        * hir/tree/rust-hir-path.cc (GenericArgs::GenericArgs): Reformat.
        (TypePathFunction::TypePathFunction): Likewise.
        (TypePath::TypePath): Use RawPath instead of separate opening scope
        flag.
        (TypePath::operator=): Use flags.
        * hir/tree/rust-hir-path.h (class GenericArgs): Reformat.
        (class TypePathFunction): Likewise.
        (class TypePath): Likewise and use RawPath. Remove duplicated function.
        (class QualifiedPathInType): Reformat.
        * hir/tree/rust-hir.cc (TypePath::to_string): Use getter.
        (TypePath::as_simple_path): Likewise.
        * typecheck/rust-hir-type-check-type.cc 
(TypeResolveGenericParam::apply_trait_bounds):
        Update ctor call.

Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/e75ae93f819fa913c0b2aa01eb6fcdc709b9807c

The commit has NOT been mentioned in any issue.

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/5044

 gcc/rust/hir/rust-ast-lower-type.cc           |  8 ++--
 gcc/rust/hir/rust-hir-dump.cc                 |  2 +-
 gcc/rust/hir/tree/rust-hir-path.cc            | 21 ++++-----
 gcc/rust/hir/tree/rust-hir-path.h             | 43 +++++++------------
 gcc/rust/hir/tree/rust-hir.cc                 |  4 +-
 .../typecheck/rust-hir-type-check-type.cc     |  3 +-
 6 files changed, 35 insertions(+), 46 deletions(-)

diff --git a/gcc/rust/hir/rust-ast-lower-type.cc 
b/gcc/rust/hir/rust-ast-lower-type.cc
index cca5cb30c..8c3970a0e 100644
--- a/gcc/rust/hir/rust-ast-lower-type.cc
+++ b/gcc/rust/hir/rust-ast-lower-type.cc
@@ -142,10 +142,12 @@ ASTLowerTypePath::visit (AST::TypePath &path)
   Analysis::NodeMapping mapping (crate_num, path.get_node_id (), hirid,
                                 mappings.get_next_localdef_id (crate_num));
 
+  RawPath<std::unique_ptr<HIR::TypePathSegment>> translated_path (
+    std::move (translated_segments), path.has_opening_scope_resolution ());
+
   translated
-    = new HIR::TypePath (std::move (mapping), std::move (translated_segments),
-                        path.get_locus (),
-                        path.has_opening_scope_resolution ());
+    = new HIR::TypePath (std::move (mapping), std::move (translated_path),
+                        path.get_locus ());
 }
 
 HIR::QualifiedPathInType *
diff --git a/gcc/rust/hir/rust-hir-dump.cc b/gcc/rust/hir/rust-hir-dump.cc
index a1893b163..3d1f4982f 100644
--- a/gcc/rust/hir/rust-hir-dump.cc
+++ b/gcc/rust/hir/rust-hir-dump.cc
@@ -786,7 +786,7 @@ Dump::visit (TypePath &e)
 {
   begin ("TypePath");
   put_field ("has_opening_scope_resolution",
-            std::to_string (e.has_opening_scope_resolution_op ()));
+            std::to_string (e.has_opening_scope_resolution ()));
 
   visit_collection ("segments", e.get_segments ());
 
diff --git a/gcc/rust/hir/tree/rust-hir-path.cc 
b/gcc/rust/hir/tree/rust-hir-path.cc
index 8f5dec819..f120152ce 100644
--- a/gcc/rust/hir/tree/rust-hir-path.cc
+++ b/gcc/rust/hir/tree/rust-hir-path.cc
@@ -82,7 +82,7 @@ GenericArgs::operator= (GenericArgs const &other)
 }
 
 GenericArgs::GenericArgs (std::vector<Lifetime> lifetime_args,
-                         std::vector<std::unique_ptr<Type> > type_args,
+                         std::vector<std::unique_ptr<Type>> type_args,
                          std::vector<GenericArgsBinding> binding_args,
                          std::vector<ConstGenericArg> const_args,
                          location_t locus)
@@ -219,7 +219,7 @@ TypePathSegmentGeneric::TypePathSegmentGeneric 
(Analysis::NodeMapping mappings,
 TypePathSegmentGeneric::TypePathSegmentGeneric (
   Analysis::NodeMapping mappings, std::string segment_name,
   bool has_separating_scope_resolution, std::vector<Lifetime> lifetime_args,
-  std::vector<std::unique_ptr<Type> > type_args,
+  std::vector<std::unique_ptr<Type>> type_args,
   std::vector<GenericArgsBinding> binding_args,
   std::vector<ConstGenericArg> const_args, location_t locus)
   : TypePathSegment (std::move (mappings), std::move (segment_name),
@@ -229,7 +229,7 @@ TypePathSegmentGeneric::TypePathSegmentGeneric (
                               locus))
 {}
 
-TypePathFunction::TypePathFunction (std::vector<std::unique_ptr<Type> > inputs,
+TypePathFunction::TypePathFunction (std::vector<std::unique_ptr<Type>> inputs,
                                    std::unique_ptr<Type> type)
   : inputs (std::move (inputs)), return_type (std::move (type))
 {}
@@ -278,16 +278,14 @@ TypePathSegmentFunction::TypePathSegmentFunction (
 {}
 
 TypePath::TypePath (Analysis::NodeMapping mappings,
-                   std::vector<std::unique_ptr<TypePathSegment> > segments,
-                   location_t locus, bool has_opening_scope_resolution)
-  : TypeNoBounds (mappings, locus),
-    has_opening_scope_resolution (has_opening_scope_resolution),
-    segments (std::move (segments))
+                   RawPath<std::unique_ptr<TypePathSegment>> path,
+                   location_t locus)
+  : TypeNoBounds (mappings, locus), RawPath (std::move (path))
 {}
 
 TypePath::TypePath (TypePath const &other)
   : TypeNoBounds (other.mappings, other.locus),
-    has_opening_scope_resolution (other.has_opening_scope_resolution)
+    RawPath ({}, other.has_opening_scope_resolution ())
 {
   segments.reserve (other.segments.size ());
   for (const auto &e : other.segments)
@@ -297,7 +295,7 @@ TypePath::TypePath (TypePath const &other)
 TypePath &
 TypePath::operator= (TypePath const &other)
 {
-  has_opening_scope_resolution = other.has_opening_scope_resolution;
+  opening_scope_resolution = other.has_opening_scope_resolution ();
   locus = other.locus;
   mappings = other.mappings;
 
@@ -381,8 +379,7 @@ QualifiedPathInExpression::QualifiedPathInExpression (
 QualifiedPathInType::QualifiedPathInType (
   Analysis::NodeMapping mappings, QualifiedPathType qual_path_type,
   std::unique_ptr<TypePathSegment> associated_segment,
-  std::vector<std::unique_ptr<TypePathSegment> > path_segments,
-  location_t locus)
+  std::vector<std::unique_ptr<TypePathSegment>> path_segments, location_t 
locus)
   : TypeNoBounds (mappings, locus), path_type (std::move (qual_path_type)),
     associated_segment (std::move (associated_segment)),
     segments (std::move (path_segments))
diff --git a/gcc/rust/hir/tree/rust-hir-path.h 
b/gcc/rust/hir/tree/rust-hir-path.h
index c912faaa0..4844d3359 100644
--- a/gcc/rust/hir/tree/rust-hir-path.h
+++ b/gcc/rust/hir/tree/rust-hir-path.h
@@ -153,7 +153,7 @@ private:
 class GenericArgs
 {
   std::vector<Lifetime> lifetime_args;
-  std::vector<std::unique_ptr<Type> > type_args;
+  std::vector<std::unique_ptr<Type>> type_args;
   std::vector<GenericArgsBinding> binding_args;
   std::vector<ConstGenericArg> const_args;
   location_t locus;
@@ -167,7 +167,7 @@ public:
   }
 
   GenericArgs (std::vector<Lifetime> lifetime_args,
-              std::vector<std::unique_ptr<Type> > type_args,
+              std::vector<std::unique_ptr<Type>> type_args,
               std::vector<GenericArgsBinding> binding_args,
               std::vector<ConstGenericArg> const_args, location_t locus);
 
@@ -199,7 +199,7 @@ public:
     return lifetime_args;
   }
 
-  std::vector<std::unique_ptr<Type> > &get_type_args () { return type_args; }
+  std::vector<std::unique_ptr<Type>> &get_type_args () { return type_args; }
 
   std::vector<GenericArgsBinding> &get_binding_args () { return binding_args; }
 
@@ -541,7 +541,7 @@ public:
                          std::string segment_name,
                          bool has_separating_scope_resolution,
                          std::vector<Lifetime> lifetime_args,
-                         std::vector<std::unique_ptr<Type> > type_args,
+                         std::vector<std::unique_ptr<Type>> type_args,
                          std::vector<GenericArgsBinding> binding_args,
                          std::vector<ConstGenericArg> const_args,
                          location_t locus);
@@ -567,7 +567,7 @@ public:
 // A function as represented in a type path
 class TypePathFunction
 {
-  std::vector<std::unique_ptr<Type> > inputs;
+  std::vector<std::unique_ptr<Type>> inputs;
   std::unique_ptr<Type> return_type;
 
 public:
@@ -578,7 +578,7 @@ public:
   bool has_inputs () const { return !inputs.empty (); }
 
   // Constructor
-  TypePathFunction (std::vector<std::unique_ptr<Type> > inputs,
+  TypePathFunction (std::vector<std::unique_ptr<Type>> inputs,
                    std::unique_ptr<Type> type);
 
   // Copy constructor with clone
@@ -595,11 +595,11 @@ public:
 
   std::string to_string () const;
 
-  const std::vector<std::unique_ptr<Type> > &get_params () const
+  const std::vector<std::unique_ptr<Type>> &get_params () const
   {
     return inputs;
   };
-  std::vector<std::unique_ptr<Type> > &get_params () { return inputs; };
+  std::vector<std::unique_ptr<Type>> &get_params () { return inputs; };
 
   const Type &get_return_type () const { return *return_type; };
   Type &get_return_type () { return *return_type; };
@@ -641,12 +641,9 @@ public:
 };
 
 // Path used inside types
-class TypePath : public TypeNoBounds
+class TypePath : public TypeNoBounds,
+                public RawPath<std::unique_ptr<TypePathSegment>>
 {
-public:
-  bool has_opening_scope_resolution;
-  std::vector<std::unique_ptr<TypePathSegment> > segments;
-
 protected:
   /* Use covariance to implement clone function as returning this object rather
    * than base */
@@ -660,13 +657,6 @@ protected:
   }
 
 public:
-  /* Returns whether the TypePath has an opening scope resolution operator 
(i.e.
-   * is global path or crate-relative path, not module-relative) */
-  bool has_opening_scope_resolution_op () const
-  {
-    return has_opening_scope_resolution;
-  }
-
   // Returns whether the TypePath is in an invalid state.
   bool is_error () const { return segments.empty (); }
 
@@ -674,14 +664,13 @@ public:
   static TypePath create_error ()
   {
     return TypePath (Analysis::NodeMapping::get_error (),
-                    std::vector<std::unique_ptr<TypePathSegment> > (),
+                    RawPath<std::unique_ptr<TypePathSegment>>{{}, false},
                     UNDEF_LOCATION);
   }
 
   // Constructor
   TypePath (Analysis::NodeMapping mappings,
-           std::vector<std::unique_ptr<TypePathSegment> > segments,
-           location_t locus, bool has_opening_scope_resolution = false);
+           RawPath<std::unique_ptr<TypePathSegment>> path, location_t locus);
 
   // Copy constructor with vector clone
   TypePath (TypePath const &other);
@@ -707,7 +696,7 @@ public:
 
   size_t get_num_segments () const { return segments.size (); }
 
-  std::vector<std::unique_ptr<TypePathSegment> > &get_segments ()
+  std::vector<std::unique_ptr<TypePathSegment>> &get_segments ()
   {
     return segments;
   }
@@ -831,7 +820,7 @@ class QualifiedPathInType : public TypeNoBounds
 {
   QualifiedPathType path_type;
   std::unique_ptr<TypePathSegment> associated_segment;
-  std::vector<std::unique_ptr<TypePathSegment> > segments;
+  std::vector<std::unique_ptr<TypePathSegment>> segments;
 
 protected:
   /* Use covariance to implement clone function as returning this object rather
@@ -852,7 +841,7 @@ public:
   QualifiedPathInType (
     Analysis::NodeMapping mappings, QualifiedPathType qual_path_type,
     std::unique_ptr<TypePathSegment> associated_segment,
-    std::vector<std::unique_ptr<TypePathSegment> > path_segments,
+    std::vector<std::unique_ptr<TypePathSegment>> path_segments,
     location_t locus = UNDEF_LOCATION);
 
   // Copy constructor with vector clone
@@ -874,7 +863,7 @@ public:
 
   TypePathSegment &get_associated_segment () { return *associated_segment; }
 
-  std::vector<std::unique_ptr<TypePathSegment> > &get_segments ()
+  std::vector<std::unique_ptr<TypePathSegment>> &get_segments ()
   {
     return segments;
   }
diff --git a/gcc/rust/hir/tree/rust-hir.cc b/gcc/rust/hir/tree/rust-hir.cc
index 34a1a645f..d64699a6c 100644
--- a/gcc/rust/hir/tree/rust-hir.cc
+++ b/gcc/rust/hir/tree/rust-hir.cc
@@ -2153,7 +2153,7 @@ TypePath::to_string () const
 {
   std::string str;
 
-  if (has_opening_scope_resolution)
+  if (has_opening_scope_resolution ())
     {
       str = "::";
     }
@@ -2319,7 +2319,7 @@ TypePath::as_simple_path () const
     }
 
   return AST::SimplePath (std::move (simple_segments),
-                         has_opening_scope_resolution, locus);
+                         has_opening_scope_resolution (), locus);
 }
 
 std::string
diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc 
b/gcc/rust/typecheck/rust-hir-type-check-type.cc
index 7b8176508..d4c2c3588 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc
@@ -922,8 +922,9 @@ TypeResolveGenericParam::apply_trait_bounds (HIR::TypeParam 
&param,
                                      param.get_mappings ().get_nodeid (),
                                      implicit_id,
                                      param.get_mappings ().get_local_defid ());
+      RawPath<std::unique_ptr<HIR::TypePathSegment>> path ({}, false);
       implicit_self_bound = std::make_unique<HIR::TypePath> (
-       HIR::TypePath (mappings, {}, BUILTINS_LOCATION, false));
+       HIR::TypePath (mappings, std::move (path), BUILTINS_LOCATION));
     }
 
   std::map<DefId, std::vector<TyTy::TypeBoundPredicate>> predicates;
-- 
2.56.0

Reply via email to