aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/ast/rust-ast.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/ast/rust-ast.h')
-rw-r--r--gcc/rust/ast/rust-ast.h63
1 files changed, 29 insertions, 34 deletions
diff --git a/gcc/rust/ast/rust-ast.h b/gcc/rust/ast/rust-ast.h
index a45085489e8..256a527118a 100644
--- a/gcc/rust/ast/rust-ast.h
+++ b/gcc/rust/ast/rust-ast.h
@@ -1657,8 +1657,22 @@ public:
virtual location_t get_locus () const = 0;
};
+// Abstract base class for items used in a trait impl
+class TraitImplItem : public AssociatedItem
+{
+protected:
+ virtual TraitImplItem *clone_associated_item_impl () const override = 0;
+
+public:
+ // Unique pointer custom clone function
+ std::unique_ptr<TraitImplItem> clone_trait_impl_item () const
+ {
+ return std::unique_ptr<TraitImplItem> (clone_associated_item_impl ());
+ }
+};
+
// Item used in trait declarations - abstract base class
-class TraitItem : virtual public AssociatedItem
+class TraitItem : public TraitImplItem
{
protected:
TraitItem (location_t locus)
@@ -1689,20 +1703,6 @@ public:
location_t get_locus () const override { return locus; }
};
-// Abstract base class for items used in a trait impl
-class TraitImplItem : virtual public AssociatedItem
-{
-protected:
- virtual TraitImplItem *clone_associated_item_impl () const override = 0;
-
-public:
- // Unique pointer custom clone function
- std::unique_ptr<TraitImplItem> clone_trait_impl_item () const
- {
- return std::unique_ptr<TraitImplItem> (clone_associated_item_impl ());
- }
-};
-
// Abstract base class for an item used inside an extern block
class ExternalItem : public Visitable
{
@@ -1831,9 +1831,7 @@ public:
ITEM,
STMT,
EXTERN,
- TRAIT,
- IMPL,
- TRAIT_IMPL,
+ ASSOC_ITEM,
TYPE,
};
@@ -1845,9 +1843,7 @@ private:
std::unique_ptr<Item> item;
std::unique_ptr<Stmt> stmt;
std::unique_ptr<ExternalItem> external_item;
- std::unique_ptr<TraitItem> trait_item;
- std::unique_ptr<AssociatedItem> impl_item;
- std::unique_ptr<TraitImplItem> trait_impl_item;
+ std::unique_ptr<AssociatedItem> assoc_item;
std::unique_ptr<Type> type;
public:
@@ -1867,16 +1863,8 @@ public:
: kind (EXTERN), external_item (std::move (item))
{}
- SingleASTNode (std::unique_ptr<TraitItem> item)
- : kind (TRAIT), trait_item (std::move (item))
- {}
-
SingleASTNode (std::unique_ptr<AssociatedItem> item)
- : kind (IMPL), impl_item (std::move (item))
- {}
-
- SingleASTNode (std::unique_ptr<TraitImplItem> trait_impl_item)
- : kind (TRAIT_IMPL), trait_impl_item (std::move (trait_impl_item))
+ : kind (ASSOC_ITEM), assoc_item (std::move (item))
{}
SingleASTNode (std::unique_ptr<Type> type)
@@ -1936,7 +1924,8 @@ public:
std::unique_ptr<TraitItem> take_trait_item ()
{
rust_assert (!is_error ());
- return std::move (trait_item);
+ return std::unique_ptr<TraitItem> (
+ static_cast<TraitItem *> (assoc_item.release ()));
}
std::unique_ptr<ExternalItem> take_external_item ()
@@ -1945,16 +1934,22 @@ public:
return std::move (external_item);
}
- std::unique_ptr<AssociatedItem> take_impl_item ()
+ std::unique_ptr<AssociatedItem> take_assoc_item ()
{
rust_assert (!is_error ());
- return std::move (impl_item);
+ return std::move (assoc_item);
+ }
+
+ std::unique_ptr<AssociatedItem> take_impl_item ()
+ {
+ return take_assoc_item ();
}
std::unique_ptr<TraitImplItem> take_trait_impl_item ()
{
rust_assert (!is_error ());
- return std::move (trait_impl_item);
+ return std::unique_ptr<TraitImplItem> (
+ static_cast<TraitImplItem *> (assoc_item.release ()));
}
std::unique_ptr<Type> take_type ()