diff options
Diffstat (limited to 'gcc/rust/hir/tree')
| -rw-r--r-- | gcc/rust/hir/tree/rust-hir-full-decls.h | 10 | ||||
| -rw-r--r-- | gcc/rust/hir/tree/rust-hir-item.h | 1 | ||||
| -rw-r--r-- | gcc/rust/hir/tree/rust-hir-pattern.h | 324 | ||||
| -rw-r--r-- | gcc/rust/hir/tree/rust-hir-visitor.cc | 27 | ||||
| -rw-r--r-- | gcc/rust/hir/tree/rust-hir-visitor.h | 41 | ||||
| -rw-r--r-- | gcc/rust/hir/tree/rust-hir.cc | 104 | 
6 files changed, 381 insertions, 126 deletions
diff --git a/gcc/rust/hir/tree/rust-hir-full-decls.h b/gcc/rust/hir/tree/rust-hir-full-decls.h index 57b3a4d..aec2f36 100644 --- a/gcc/rust/hir/tree/rust-hir-full-decls.h +++ b/gcc/rust/hir/tree/rust-hir-full-decls.h @@ -199,13 +199,15 @@ class StructPatternFieldIdentPat;  class StructPatternFieldIdent;  class StructPattern;  class TupleStructItems; -class TupleStructItemsNoRange; -class TupleStructItemsRange; +class TupleStructItemsNoRest; +class TupleStructItemsHasRest;  class TupleStructPattern;  class TuplePatternItems; -class TuplePatternItemsMultiple; -class TuplePatternItemsRanged; +class TuplePatternItemsNoRest; +class TuplePatternItemsHasRest;  class TuplePattern; +class SlicePatternItemsNoRest; +class SlicePatternItemsHasRest;  class SlicePattern;  class AltPattern; diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h index d9df602..eb9cec7 100644 --- a/gcc/rust/hir/tree/rust-hir-item.h +++ b/gcc/rust/hir/tree/rust-hir-item.h @@ -452,6 +452,7 @@ public:    bool is_unsafe () const { return unsafety == Unsafety::Unsafe; }    bool is_async () const { return async_status == Async::Yes; } +  Unsafety get_unsafety () const { return unsafety; }    ABI get_abi () const { return abi; }  }; diff --git a/gcc/rust/hir/tree/rust-hir-pattern.h b/gcc/rust/hir/tree/rust-hir-pattern.h index 9c636ca..89b9cc6 100644 --- a/gcc/rust/hir/tree/rust-hir-pattern.h +++ b/gcc/rust/hir/tree/rust-hir-pattern.h @@ -350,6 +350,7 @@ class RangePattern : public Pattern    /* location only stored to avoid a dereference - lower pattern should give     * correct location so maybe change in future */    location_t locus; +  bool is_inclusive;    Analysis::NodeMapping mappings;  public: @@ -359,10 +360,10 @@ public:    RangePattern (Analysis::NodeMapping mappings,  		std::unique_ptr<RangePatternBound> lower,  		std::unique_ptr<RangePatternBound> upper, location_t locus, -		bool has_ellipsis_syntax = false) +		bool is_inclusive, bool has_ellipsis_syntax = false)      : lower (std::move (lower)), upper (std::move (upper)),        has_ellipsis_syntax (has_ellipsis_syntax), locus (locus), -      mappings (mappings) +      is_inclusive (is_inclusive), mappings (mappings)    {}    // Copy constructor with clone @@ -370,7 +371,7 @@ public:      : lower (other.lower->clone_range_pattern_bound ()),        upper (other.upper->clone_range_pattern_bound ()),        has_ellipsis_syntax (other.has_ellipsis_syntax), locus (other.locus), -      mappings (other.mappings) +      is_inclusive (other.is_inclusive), mappings (other.mappings)    {}    // Overloaded assignment operator to clone @@ -380,6 +381,7 @@ public:      upper = other.upper->clone_range_pattern_bound ();      has_ellipsis_syntax = other.has_ellipsis_syntax;      locus = other.locus; +    is_inclusive = other.is_inclusive;      mappings = other.mappings;      return *this; @@ -395,6 +397,7 @@ public:    void accept_vis (HIRPatternVisitor &vis) override;    bool get_has_ellipsis_syntax () { return has_ellipsis_syntax; }; +  bool is_inclusive_range () const { return is_inclusive; }    const Analysis::NodeMapping &get_mappings () const override final    { @@ -680,6 +683,7 @@ protected:  class StructPatternElements  {    std::vector<std::unique_ptr<StructPatternField>> fields; +  bool has_rest_pattern;  public:    // Returns whether there are any struct pattern fields @@ -689,10 +693,18 @@ public:     * no etc). */    bool is_empty () const { return !has_struct_pattern_fields (); } +  bool has_rest () const { return has_rest_pattern; } +    // Constructor for StructPatternElements with both (potentially)    StructPatternElements (      std::vector<std::unique_ptr<StructPatternField>> fields) -    : fields (std::move (fields)) +    : fields (std::move (fields)), has_rest_pattern (false) +  {} + +  StructPatternElements ( +    std::vector<std::unique_ptr<StructPatternField>> fields, +    bool has_rest_pattern) +    : fields (std::move (fields)), has_rest_pattern (has_rest_pattern)    {}    // Copy constructor with vector clone @@ -700,7 +712,8 @@ public:    {      fields.reserve (other.fields.size ());      for (const auto &e : other.fields) -      fields.push_back (e->clone_struct_pattern_field ()); +      fields.emplace_back (e->clone_struct_pattern_field ()); +    has_rest_pattern = other.has_rest_pattern;    }    // Overloaded assignment operator with vector clone @@ -709,8 +722,8 @@ public:      fields.clear ();      fields.reserve (other.fields.size ());      for (const auto &e : other.fields) -      fields.push_back (e->clone_struct_pattern_field ()); - +      fields.emplace_back (e->clone_struct_pattern_field ()); +    has_rest_pattern = other.has_rest_pattern;      return *this;    } @@ -778,24 +791,25 @@ protected:    }  }; -// Base abstract class for TupleStructItems and TuplePatternItems -class TupleItems : public FullVisitable +// Base abstract class for TupleStructItems, TuplePatternItems & +// SlicePatternItems +class PatternItems : public FullVisitable  {  public:    enum ItemType    { -    MULTIPLE, -    RANGED, +    NO_REST, +    HAS_REST,    }; -  virtual ~TupleItems () {} +  virtual ~PatternItems () {}    // TODO: should this store location data?    // Unique pointer custom clone function -  std::unique_ptr<TupleItems> clone_tuple_items () const +  std::unique_ptr<PatternItems> clone_pattern_items () const    { -    return std::unique_ptr<TupleItems> (clone_tuple_items_impl ()); +    return std::unique_ptr<PatternItems> (clone_pattern_items_impl ());    }    virtual ItemType get_item_type () const = 0; @@ -804,36 +818,36 @@ public:  protected:    // pure virtual clone implementation -  virtual TupleItems *clone_tuple_items_impl () const = 0; +  virtual PatternItems *clone_pattern_items_impl () const = 0;  };  // Base abstract class for patterns used in TupleStructPattern -class TupleStructItems : public TupleItems +class TupleStructItems : public PatternItems  {  public:    // Unique pointer custom clone function    std::unique_ptr<TupleStructItems> clone_tuple_struct_items () const    { -    return std::unique_ptr<TupleStructItems> (clone_tuple_items_impl ()); +    return std::unique_ptr<TupleStructItems> (clone_pattern_items_impl ());    }  protected:    // pure virtual clone implementation -  virtual TupleStructItems *clone_tuple_items_impl () const override = 0; +  virtual TupleStructItems *clone_pattern_items_impl () const override = 0;  }; -// Class for non-ranged tuple struct pattern patterns -class TupleStructItemsNoRange : public TupleStructItems +// Class for patterns within a tuple struct pattern, without a rest pattern +class TupleStructItemsNoRest : public TupleStructItems  {    std::vector<std::unique_ptr<Pattern>> patterns;  public: -  TupleStructItemsNoRange (std::vector<std::unique_ptr<Pattern>> patterns) +  TupleStructItemsNoRest (std::vector<std::unique_ptr<Pattern>> patterns)      : patterns (std::move (patterns))    {}    // Copy constructor with vector clone -  TupleStructItemsNoRange (TupleStructItemsNoRange const &other) +  TupleStructItemsNoRest (TupleStructItemsNoRest const &other)    {      patterns.reserve (other.patterns.size ());      for (const auto &e : other.patterns) @@ -841,7 +855,7 @@ public:    }    // Overloaded assignment operator with vector clone -  TupleStructItemsNoRange &operator= (TupleStructItemsNoRange const &other) +  TupleStructItemsNoRest &operator= (TupleStructItemsNoRest const &other)    {      patterns.clear ();      patterns.reserve (other.patterns.size ()); @@ -852,9 +866,8 @@ public:    }    // move constructors -  TupleStructItemsNoRange (TupleStructItemsNoRange &&other) = default; -  TupleStructItemsNoRange &operator= (TupleStructItemsNoRange &&other) -    = default; +  TupleStructItemsNoRest (TupleStructItemsNoRest &&other) = default; +  TupleStructItemsNoRest &operator= (TupleStructItemsNoRest &&other) = default;    std::string as_string () const override; @@ -866,32 +879,33 @@ public:      return patterns;    } -  ItemType get_item_type () const override final { return ItemType::MULTIPLE; } +  ItemType get_item_type () const override final { return ItemType::NO_REST; }  protected:    /* Use covariance to implement clone function as returning this object rather     * than base */ -  TupleStructItemsNoRange *clone_tuple_items_impl () const override +  TupleStructItemsNoRest *clone_pattern_items_impl () const override    { -    return new TupleStructItemsNoRange (*this); +    return new TupleStructItemsNoRest (*this);    }  }; -// Class for ranged tuple struct pattern patterns -class TupleStructItemsRange : public TupleStructItems +// Class for patterns within a tuple struct pattern, with a rest pattern +// included +class TupleStructItemsHasRest : public TupleStructItems  {    std::vector<std::unique_ptr<Pattern>> lower_patterns;    std::vector<std::unique_ptr<Pattern>> upper_patterns;  public: -  TupleStructItemsRange (std::vector<std::unique_ptr<Pattern>> lower_patterns, -			 std::vector<std::unique_ptr<Pattern>> upper_patterns) +  TupleStructItemsHasRest (std::vector<std::unique_ptr<Pattern>> lower_patterns, +			   std::vector<std::unique_ptr<Pattern>> upper_patterns)      : lower_patterns (std::move (lower_patterns)),        upper_patterns (std::move (upper_patterns))    {}    // Copy constructor with vector clone -  TupleStructItemsRange (TupleStructItemsRange const &other) +  TupleStructItemsHasRest (TupleStructItemsHasRest const &other)    {      lower_patterns.reserve (other.lower_patterns.size ());      for (const auto &e : other.lower_patterns) @@ -903,7 +917,7 @@ public:    }    // Overloaded assignment operator to clone -  TupleStructItemsRange &operator= (TupleStructItemsRange const &other) +  TupleStructItemsHasRest &operator= (TupleStructItemsHasRest const &other)    {      lower_patterns.clear ();      lower_patterns.reserve (other.lower_patterns.size ()); @@ -919,8 +933,9 @@ public:    }    // move constructors -  TupleStructItemsRange (TupleStructItemsRange &&other) = default; -  TupleStructItemsRange &operator= (TupleStructItemsRange &&other) = default; +  TupleStructItemsHasRest (TupleStructItemsHasRest &&other) = default; +  TupleStructItemsHasRest &operator= (TupleStructItemsHasRest &&other) +    = default;    std::string as_string () const override; @@ -945,14 +960,14 @@ public:      return upper_patterns;    } -  ItemType get_item_type () const override final { return ItemType::RANGED; } +  ItemType get_item_type () const override final { return ItemType::HAS_REST; }  protected:    /* Use covariance to implement clone function as returning this object rather     * than base */ -  TupleStructItemsRange *clone_tuple_items_impl () const override +  TupleStructItemsHasRest *clone_pattern_items_impl () const override    { -    return new TupleStructItemsRange (*this); +    return new TupleStructItemsHasRest (*this);    }  }; @@ -1025,32 +1040,32 @@ protected:  };  // Base abstract class representing TuplePattern patterns -class TuplePatternItems : public TupleItems +class TuplePatternItems : public PatternItems  {  public:    // Unique pointer custom clone function    std::unique_ptr<TuplePatternItems> clone_tuple_pattern_items () const    { -    return std::unique_ptr<TuplePatternItems> (clone_tuple_items_impl ()); +    return std::unique_ptr<TuplePatternItems> (clone_pattern_items_impl ());    }  protected:    // pure virtual clone implementation -  virtual TuplePatternItems *clone_tuple_items_impl () const override = 0; +  virtual TuplePatternItems *clone_pattern_items_impl () const override = 0;  }; -// Class representing TuplePattern patterns where there are multiple patterns -class TuplePatternItemsMultiple : public TuplePatternItems +// Class representing patterns within a TuplePattern, without a rest pattern +class TuplePatternItemsNoRest : public TuplePatternItems  {    std::vector<std::unique_ptr<Pattern>> patterns;  public: -  TuplePatternItemsMultiple (std::vector<std::unique_ptr<Pattern>> patterns) +  TuplePatternItemsNoRest (std::vector<std::unique_ptr<Pattern>> patterns)      : patterns (std::move (patterns))    {}    // Copy constructor with vector clone -  TuplePatternItemsMultiple (TuplePatternItemsMultiple const &other) +  TuplePatternItemsNoRest (TuplePatternItemsNoRest const &other)    {      patterns.reserve (other.patterns.size ());      for (const auto &e : other.patterns) @@ -1058,7 +1073,7 @@ public:    }    // Overloaded assignment operator to vector clone -  TuplePatternItemsMultiple &operator= (TuplePatternItemsMultiple const &other) +  TuplePatternItemsNoRest &operator= (TuplePatternItemsNoRest const &other)    {      patterns.clear ();      patterns.reserve (other.patterns.size ()); @@ -1069,15 +1084,15 @@ public:    }    // move constructors -  TuplePatternItemsMultiple (TuplePatternItemsMultiple &&other) = default; -  TuplePatternItemsMultiple &operator= (TuplePatternItemsMultiple &&other) +  TuplePatternItemsNoRest (TuplePatternItemsNoRest &&other) = default; +  TuplePatternItemsNoRest &operator= (TuplePatternItemsNoRest &&other)      = default;    std::string as_string () const override;    void accept_vis (HIRFullVisitor &vis) override; -  ItemType get_item_type () const override { return ItemType::MULTIPLE; } +  ItemType get_item_type () const override { return ItemType::NO_REST; }    std::vector<std::unique_ptr<Pattern>> &get_patterns () { return patterns; }    const std::vector<std::unique_ptr<Pattern>> &get_patterns () const @@ -1088,27 +1103,29 @@ public:  protected:    /* Use covariance to implement clone function as returning this object rather     * than base */ -  TuplePatternItemsMultiple *clone_tuple_items_impl () const override +  TuplePatternItemsNoRest *clone_pattern_items_impl () const override    { -    return new TuplePatternItemsMultiple (*this); +    return new TuplePatternItemsNoRest (*this);    }  }; -// Class representing TuplePattern patterns where there are a range of patterns -class TuplePatternItemsRanged : public TuplePatternItems +// Class representing patterns within a TuplePattern, with a rest pattern +// included +class TuplePatternItemsHasRest : public TuplePatternItems  {    std::vector<std::unique_ptr<Pattern>> lower_patterns;    std::vector<std::unique_ptr<Pattern>> upper_patterns;  public: -  TuplePatternItemsRanged (std::vector<std::unique_ptr<Pattern>> lower_patterns, -			   std::vector<std::unique_ptr<Pattern>> upper_patterns) +  TuplePatternItemsHasRest ( +    std::vector<std::unique_ptr<Pattern>> lower_patterns, +    std::vector<std::unique_ptr<Pattern>> upper_patterns)      : lower_patterns (std::move (lower_patterns)),        upper_patterns (std::move (upper_patterns))    {}    // Copy constructor with vector clone -  TuplePatternItemsRanged (TuplePatternItemsRanged const &other) +  TuplePatternItemsHasRest (TuplePatternItemsHasRest const &other)    {      lower_patterns.reserve (other.lower_patterns.size ());      for (const auto &e : other.lower_patterns) @@ -1120,7 +1137,7 @@ public:    }    // Overloaded assignment operator to clone -  TuplePatternItemsRanged &operator= (TuplePatternItemsRanged const &other) +  TuplePatternItemsHasRest &operator= (TuplePatternItemsHasRest const &other)    {      lower_patterns.clear ();      lower_patterns.reserve (other.lower_patterns.size ()); @@ -1136,15 +1153,15 @@ public:    }    // move constructors -  TuplePatternItemsRanged (TuplePatternItemsRanged &&other) = default; -  TuplePatternItemsRanged &operator= (TuplePatternItemsRanged &&other) +  TuplePatternItemsHasRest (TuplePatternItemsHasRest &&other) = default; +  TuplePatternItemsHasRest &operator= (TuplePatternItemsHasRest &&other)      = default;    std::string as_string () const override;    void accept_vis (HIRFullVisitor &vis) override; -  ItemType get_item_type () const override { return ItemType::RANGED; } +  ItemType get_item_type () const override { return ItemType::HAS_REST; }    std::vector<std::unique_ptr<Pattern>> &get_lower_patterns ()    { @@ -1167,9 +1184,9 @@ public:  protected:    /* Use covariance to implement clone function as returning this object rather     * than base */ -  TuplePatternItemsRanged *clone_tuple_items_impl () const override +  TuplePatternItemsHasRest *clone_pattern_items_impl () const override    { -    return new TuplePatternItemsRanged (*this); +    return new TuplePatternItemsHasRest (*this);    }  }; @@ -1234,10 +1251,161 @@ protected:    }  }; +// Base abstract class representing SlicePattern patterns +class SlicePatternItems : public PatternItems +{ +public: +  // Unique pointer custom clone function +  std::unique_ptr<SlicePatternItems> clone_slice_pattern_items () const +  { +    return std::unique_ptr<SlicePatternItems> (clone_pattern_items_impl ()); +  } + +protected: +  // pure virtual clone implementation +  virtual SlicePatternItems *clone_pattern_items_impl () const override = 0; +}; + +// Class representing patterns within a SlicePattern, without a rest pattern +class SlicePatternItemsNoRest : public SlicePatternItems +{ +  std::vector<std::unique_ptr<Pattern>> patterns; + +public: +  SlicePatternItemsNoRest (std::vector<std::unique_ptr<Pattern>> patterns) +    : patterns (std::move (patterns)) +  {} + +  // Copy constructor with vector clone +  SlicePatternItemsNoRest (SlicePatternItemsNoRest const &other) +  { +    patterns.reserve (other.patterns.size ()); +    for (const auto &e : other.patterns) +      patterns.push_back (e->clone_pattern ()); +  } + +  // Overloaded assignment operator to vector clone +  SlicePatternItemsNoRest &operator= (SlicePatternItemsNoRest const &other) +  { +    patterns.clear (); +    patterns.reserve (other.patterns.size ()); +    for (const auto &e : other.patterns) +      patterns.push_back (e->clone_pattern ()); + +    return *this; +  } + +  // move constructors +  SlicePatternItemsNoRest (SlicePatternItemsNoRest &&other) = default; +  SlicePatternItemsNoRest &operator= (SlicePatternItemsNoRest &&other) +    = default; + +  std::string as_string () const override; + +  void accept_vis (HIRFullVisitor &vis) override; + +  ItemType get_item_type () const override { return ItemType::NO_REST; } + +  std::vector<std::unique_ptr<Pattern>> &get_patterns () { return patterns; } +  const std::vector<std::unique_ptr<Pattern>> &get_patterns () const +  { +    return patterns; +  } + +protected: +  /* Use covariance to implement clone function as returning this object rather +   * than base */ +  SlicePatternItemsNoRest *clone_pattern_items_impl () const override +  { +    return new SlicePatternItemsNoRest (*this); +  } +}; + +// Class representing patterns within a SlicePattern, with a rest pattern +// included +class SlicePatternItemsHasRest : public SlicePatternItems +{ +  std::vector<std::unique_ptr<Pattern>> lower_patterns; +  std::vector<std::unique_ptr<Pattern>> upper_patterns; + +public: +  SlicePatternItemsHasRest ( +    std::vector<std::unique_ptr<Pattern>> lower_patterns, +    std::vector<std::unique_ptr<Pattern>> upper_patterns) +    : lower_patterns (std::move (lower_patterns)), +      upper_patterns (std::move (upper_patterns)) +  {} + +  // Copy constructor with vector clone +  SlicePatternItemsHasRest (SlicePatternItemsHasRest const &other) +  { +    lower_patterns.reserve (other.lower_patterns.size ()); +    for (const auto &e : other.lower_patterns) +      lower_patterns.push_back (e->clone_pattern ()); + +    upper_patterns.reserve (other.upper_patterns.size ()); +    for (const auto &e : other.upper_patterns) +      upper_patterns.push_back (e->clone_pattern ()); +  } + +  // Overloaded assignment operator to clone +  SlicePatternItemsHasRest &operator= (SlicePatternItemsHasRest const &other) +  { +    lower_patterns.clear (); +    lower_patterns.reserve (other.lower_patterns.size ()); +    for (const auto &e : other.lower_patterns) +      lower_patterns.push_back (e->clone_pattern ()); + +    lower_patterns.clear (); +    upper_patterns.reserve (other.upper_patterns.size ()); +    for (const auto &e : other.upper_patterns) +      upper_patterns.push_back (e->clone_pattern ()); + +    return *this; +  } + +  // move constructors +  SlicePatternItemsHasRest (SlicePatternItemsHasRest &&other) = default; +  SlicePatternItemsHasRest &operator= (SlicePatternItemsHasRest &&other) +    = default; + +  std::string as_string () const override; + +  void accept_vis (HIRFullVisitor &vis) override; + +  ItemType get_item_type () const override { return ItemType::HAS_REST; } + +  std::vector<std::unique_ptr<Pattern>> &get_lower_patterns () +  { +    return lower_patterns; +  } +  const std::vector<std::unique_ptr<Pattern>> &get_lower_patterns () const +  { +    return lower_patterns; +  } + +  std::vector<std::unique_ptr<Pattern>> &get_upper_patterns () +  { +    return upper_patterns; +  } +  const std::vector<std::unique_ptr<Pattern>> &get_upper_patterns () const +  { +    return upper_patterns; +  } + +protected: +  /* Use covariance to implement clone function as returning this object rather +   * than base */ +  SlicePatternItemsHasRest *clone_pattern_items_impl () const override +  { +    return new SlicePatternItemsHasRest (*this); +  } +}; +  // HIR node representing patterns that can match slices and arrays  class SlicePattern : public Pattern  { -  std::vector<std::unique_ptr<Pattern>> items; +  std::unique_ptr<SlicePatternItems> items;    location_t locus;    Analysis::NodeMapping mappings; @@ -1245,30 +1413,23 @@ public:    std::string as_string () const override;    SlicePattern (Analysis::NodeMapping mappings, -		std::vector<std::unique_ptr<Pattern>> items, location_t locus) +		std::unique_ptr<SlicePatternItems> items, location_t locus)      : items (std::move (items)), locus (locus), mappings (mappings)    {} -  // Copy constructor with vector clone +  // Copy constructor requires clone    SlicePattern (SlicePattern const &other) -    : locus (other.locus), mappings (other.mappings) -  { -    items.reserve (other.items.size ()); -    for (const auto &e : other.items) -      items.push_back (e->clone_pattern ()); -  } +    : items (other.items->clone_slice_pattern_items ()), locus (other.locus), +      mappings (other.mappings) +  {}    // Overloaded assignment operator to vector clone    SlicePattern &operator= (SlicePattern const &other)    { +    items = other.items->clone_slice_pattern_items ();      locus = other.locus;      mappings = other.mappings; -    items.clear (); -    items.reserve (other.items.size ()); -    for (const auto &e : other.items) -      items.push_back (e->clone_pattern ()); -      return *this;    } @@ -1276,11 +1437,8 @@ public:    SlicePattern (SlicePattern &&other) = default;    SlicePattern &operator= (SlicePattern &&other) = default; -  std::vector<std::unique_ptr<Pattern>> &get_items () { return items; } -  const std::vector<std::unique_ptr<Pattern>> &get_items () const -  { -    return items; -  } +  SlicePatternItems &get_items () { return *items; } +  const SlicePatternItems &get_items () const { return *items; }    location_t get_locus () const override { return locus; } diff --git a/gcc/rust/hir/tree/rust-hir-visitor.cc b/gcc/rust/hir/tree/rust-hir-visitor.cc index 58c1e1a..1e201a5 100644 --- a/gcc/rust/hir/tree/rust-hir-visitor.cc +++ b/gcc/rust/hir/tree/rust-hir-visitor.cc @@ -1023,14 +1023,14 @@ DefaultHIRVisitor::walk (StructPattern &pattern)  }  void -DefaultHIRVisitor::walk (TupleStructItemsNoRange &tuple_items) +DefaultHIRVisitor::walk (TupleStructItemsNoRest &tuple_items)  {    for (auto &item : tuple_items.get_patterns ())      item->accept_vis (*this);  }  void -DefaultHIRVisitor::walk (TupleStructItemsRange &tuple_items) +DefaultHIRVisitor::walk (TupleStructItemsHasRest &tuple_items)  {    for (auto &lower : tuple_items.get_lower_patterns ())      lower->accept_vis (*this); @@ -1046,14 +1046,14 @@ DefaultHIRVisitor::walk (TupleStructPattern &pattern)  }  void -DefaultHIRVisitor::walk (TuplePatternItemsMultiple &tuple_items) +DefaultHIRVisitor::walk (TuplePatternItemsNoRest &tuple_items)  {    for (auto &pattern : tuple_items.get_patterns ())      pattern->accept_vis (*this);  }  void -DefaultHIRVisitor::walk (TuplePatternItemsRanged &tuple_items) +DefaultHIRVisitor::walk (TuplePatternItemsHasRest &tuple_items)  {    for (auto &lower : tuple_items.get_lower_patterns ())      lower->accept_vis (*this); @@ -1068,10 +1068,25 @@ DefaultHIRVisitor::walk (TuplePattern &pattern)  }  void +DefaultHIRVisitor::walk (SlicePatternItemsNoRest &items) +{ +  for (auto &pattern : items.get_patterns ()) +    pattern->accept_vis (*this); +} + +void +DefaultHIRVisitor::walk (SlicePatternItemsHasRest &items) +{ +  for (auto &lower : items.get_lower_patterns ()) +    lower->accept_vis (*this); +  for (auto &upper : items.get_upper_patterns ()) +    upper->accept_vis (*this); +} + +void  DefaultHIRVisitor::walk (SlicePattern &pattern)  { -  for (auto &item : pattern.get_items ()) -    item->accept_vis (*this); +  pattern.get_items ().accept_vis (*this);  }  void diff --git a/gcc/rust/hir/tree/rust-hir-visitor.h b/gcc/rust/hir/tree/rust-hir-visitor.h index 7996260..77760b0 100644 --- a/gcc/rust/hir/tree/rust-hir-visitor.h +++ b/gcc/rust/hir/tree/rust-hir-visitor.h @@ -132,12 +132,14 @@ public:    virtual void visit (StructPatternFieldIdentPat &field) = 0;    virtual void visit (StructPatternFieldIdent &field) = 0;    virtual void visit (StructPattern &pattern) = 0; -  virtual void visit (TupleStructItemsNoRange &tuple_items) = 0; -  virtual void visit (TupleStructItemsRange &tuple_items) = 0; +  virtual void visit (TupleStructItemsNoRest &tuple_items) = 0; +  virtual void visit (TupleStructItemsHasRest &tuple_items) = 0;    virtual void visit (TupleStructPattern &pattern) = 0; -  virtual void visit (TuplePatternItemsMultiple &tuple_items) = 0; -  virtual void visit (TuplePatternItemsRanged &tuple_items) = 0; +  virtual void visit (TuplePatternItemsNoRest &tuple_items) = 0; +  virtual void visit (TuplePatternItemsHasRest &tuple_items) = 0;    virtual void visit (TuplePattern &pattern) = 0; +  virtual void visit (SlicePatternItemsNoRest &items) = 0; +  virtual void visit (SlicePatternItemsHasRest &items) = 0;    virtual void visit (SlicePattern &pattern) = 0;    virtual void visit (AltPattern &pattern) = 0;    virtual void visit (EmptyStmt &stmt) = 0; @@ -305,12 +307,14 @@ public:    }    virtual void visit (StructPatternFieldIdent &node) override { walk (node); }    virtual void visit (StructPattern &node) override { walk (node); } -  virtual void visit (TupleStructItemsNoRange &node) override { walk (node); } -  virtual void visit (TupleStructItemsRange &node) override { walk (node); } +  virtual void visit (TupleStructItemsNoRest &node) override { walk (node); } +  virtual void visit (TupleStructItemsHasRest &node) override { walk (node); }    virtual void visit (TupleStructPattern &node) override { walk (node); } -  virtual void visit (TuplePatternItemsMultiple &node) override { walk (node); } -  virtual void visit (TuplePatternItemsRanged &node) override { walk (node); } +  virtual void visit (TuplePatternItemsNoRest &node) override { walk (node); } +  virtual void visit (TuplePatternItemsHasRest &node) override { walk (node); }    virtual void visit (TuplePattern &node) override { walk (node); } +  virtual void visit (SlicePatternItemsNoRest &node) override { walk (node); } +  virtual void visit (SlicePatternItemsHasRest &node) override { walk (node); }    virtual void visit (SlicePattern &node) override { walk (node); }    virtual void visit (AltPattern &node) override { walk (node); }    virtual void visit (EmptyStmt &node) override { walk (node); } @@ -438,12 +442,14 @@ protected:    virtual void walk (StructPatternFieldIdentPat &) final;    virtual void walk (StructPatternFieldIdent &) final;    virtual void walk (StructPattern &) final; -  virtual void walk (TupleStructItemsNoRange &) final; -  virtual void walk (TupleStructItemsRange &) final; +  virtual void walk (TupleStructItemsNoRest &) final; +  virtual void walk (TupleStructItemsHasRest &) final;    virtual void walk (TupleStructPattern &) final; -  virtual void walk (TuplePatternItemsMultiple &) final; -  virtual void walk (TuplePatternItemsRanged &) final; +  virtual void walk (TuplePatternItemsNoRest &) final; +  virtual void walk (TuplePatternItemsHasRest &) final;    virtual void walk (TuplePattern &) final; +  virtual void walk (SlicePatternItemsNoRest &) final; +  virtual void walk (SlicePatternItemsHasRest &) final;    virtual void walk (SlicePattern &) final;    virtual void walk (AltPattern &) final;    virtual void walk (EmptyStmt &) final; @@ -586,13 +592,16 @@ public:    virtual void visit (StructPatternFieldIdent &) override {}    virtual void visit (StructPattern &) override {} -  virtual void visit (TupleStructItemsNoRange &) override {} -  virtual void visit (TupleStructItemsRange &) override {} +  virtual void visit (TupleStructItemsNoRest &) override {} +  virtual void visit (TupleStructItemsHasRest &) override {}    virtual void visit (TupleStructPattern &) override {} -  virtual void visit (TuplePatternItemsMultiple &) override {} -  virtual void visit (TuplePatternItemsRanged &) override {} +  virtual void visit (TuplePatternItemsNoRest &) override {} +  virtual void visit (TuplePatternItemsHasRest &) override {}    virtual void visit (TuplePattern &) override {} + +  virtual void visit (SlicePatternItemsNoRest &) override {} +  virtual void visit (SlicePatternItemsHasRest &) override {}    virtual void visit (SlicePattern &) override {}    virtual void visit (AltPattern &) override {} diff --git a/gcc/rust/hir/tree/rust-hir.cc b/gcc/rust/hir/tree/rust-hir.cc index a802e8c..ce10b02 100644 --- a/gcc/rust/hir/tree/rust-hir.cc +++ b/gcc/rust/hir/tree/rust-hir.cc @@ -2239,8 +2239,8 @@ PathPattern::convert_to_simple_path (bool with_opening_scope_resolution) const        // create segment and add to vector        std::string segment_str = segment.as_string (); -      simple_segments.push_back ( -	AST::SimplePathSegment (std::move (segment_str), segment.get_locus ())); +      simple_segments.emplace_back (std::move (segment_str), +				    segment.get_locus ());      }    // kind of a HACK to get locus depending on opening scope resolution @@ -2281,9 +2281,8 @@ TypePath::as_simple_path () const        // create segment and add to vector        std::string segment_str = segment->as_string (); -      simple_segments.push_back ( -	AST::SimplePathSegment (std::move (segment_str), -				segment->get_locus ())); +      simple_segments.emplace_back (std::move (segment_str), +				    segment->get_locus ());      }    return AST::SimplePath (std::move (simple_segments), @@ -2387,11 +2386,11 @@ RangePatternBoundLiteral::as_string () const  }  std::string -SlicePattern::as_string () const +SlicePatternItemsNoRest::as_string () const  { -  std::string str ("SlicePattern: "); +  std::string str; -  for (const auto &pattern : items) +  for (const auto &pattern : patterns)      {        str += "\n " + pattern->as_string ();      } @@ -2400,6 +2399,46 @@ SlicePattern::as_string () const  }  std::string +SlicePatternItemsHasRest::as_string () const +{ +  std::string str; + +  str += "\n Lower patterns: "; +  if (lower_patterns.empty ()) +    { +      str += "none"; +    } +  else +    { +      for (const auto &lower : lower_patterns) +	{ +	  str += "\n  " + lower->as_string (); +	} +    } + +  str += "\n Upper patterns: "; +  if (upper_patterns.empty ()) +    { +      str += "none"; +    } +  else +    { +      for (const auto &upper : upper_patterns) +	{ +	  str += "\n  " + upper->as_string (); +	} +    } + +  return str; +} + +std::string +SlicePattern::as_string () const +{ +  return "SlicePattern: " + items->as_string (); +} + +std::string  AltPattern::as_string () const  {    std::string str ("AltPattern: "); @@ -2413,7 +2452,7 @@ AltPattern::as_string () const  }  std::string -TuplePatternItemsMultiple::as_string () const +TuplePatternItemsNoRest::as_string () const  {    std::string str; @@ -2426,7 +2465,7 @@ TuplePatternItemsMultiple::as_string () const  }  std::string -TuplePatternItemsRanged::as_string () const +TuplePatternItemsHasRest::as_string () const  {    std::string str; @@ -2480,10 +2519,29 @@ StructPatternField::as_string () const         * just the body */        for (const auto &attr : outer_attrs)  	{ -	  str += "\n  " + attr.as_string (); +	  str += "\n    " + attr.as_string ();  	}      } +  str += "\n   item type: "; +  switch (get_item_type ()) +    { +    case ItemType::TUPLE_PAT: +      str += "TUPLE_PAT"; +      break; +    case ItemType::IDENT_PAT: +      str += "IDENT_PAT"; +      break; +    case ItemType::IDENT: +      str += "IDENT"; +      break; +    default: +      str += "UNKNOWN"; +      break; +    } + +  str += "\n   mapping: " + mappings.as_string (); +    return str;  } @@ -2620,7 +2678,7 @@ IdentifierPattern::as_string () const  }  std::string -TupleStructItemsNoRange::as_string () const +TupleStructItemsNoRest::as_string () const  {    std::string str; @@ -2633,7 +2691,7 @@ TupleStructItemsNoRange::as_string () const  }  std::string -TupleStructItemsRange::as_string () const +TupleStructItemsHasRest::as_string () const  {    std::string str ("\n  Lower patterns: "); @@ -4471,13 +4529,13 @@ StructPattern::accept_vis (HIRFullVisitor &vis)  }  void -TupleStructItemsNoRange::accept_vis (HIRFullVisitor &vis) +TupleStructItemsNoRest::accept_vis (HIRFullVisitor &vis)  {    vis.visit (*this);  }  void -TupleStructItemsRange::accept_vis (HIRFullVisitor &vis) +TupleStructItemsHasRest::accept_vis (HIRFullVisitor &vis)  {    vis.visit (*this);  } @@ -4489,13 +4547,13 @@ TupleStructPattern::accept_vis (HIRFullVisitor &vis)  }  void -TuplePatternItemsMultiple::accept_vis (HIRFullVisitor &vis) +TuplePatternItemsNoRest::accept_vis (HIRFullVisitor &vis)  {    vis.visit (*this);  }  void -TuplePatternItemsRanged::accept_vis (HIRFullVisitor &vis) +TuplePatternItemsHasRest::accept_vis (HIRFullVisitor &vis)  {    vis.visit (*this);  } @@ -4507,6 +4565,18 @@ TuplePattern::accept_vis (HIRFullVisitor &vis)  }  void +SlicePatternItemsNoRest::accept_vis (HIRFullVisitor &vis) +{ +  vis.visit (*this); +} + +void +SlicePatternItemsHasRest::accept_vis (HIRFullVisitor &vis) +{ +  vis.visit (*this); +} + +void  SlicePattern::accept_vis (HIRFullVisitor &vis)  {    vis.visit (*this);  | 
