aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-10-25 17:34:21 +0100
committerPhilip Herron <philip.herron@embecosm.com>2021-10-27 10:18:33 +0100
commit1a9746032345e1bffeb9ff2c92473bf90f843379 (patch)
treedd88e4e97bcdc94943fc75309c51e6ecb9926d69 /gcc
parentb01e62c136b1ebf27894c68669e265e67b941300 (diff)
downloadgcc-1a9746032345e1bffeb9ff2c92473bf90f843379.zip
gcc-1a9746032345e1bffeb9ff2c92473bf90f843379.tar.gz
gcc-1a9746032345e1bffeb9ff2c92473bf90f843379.tar.bz2
Add HIR lowering for where clause items
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/ast/rust-item.h3
-rw-r--r--gcc/rust/hir/rust-ast-lower-item.h72
-rw-r--r--gcc/rust/hir/rust-ast-lower-type.h72
3 files changed, 140 insertions, 7 deletions
diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index a5d9a0a..fb7cc17 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -188,7 +188,6 @@ protected:
class LifetimeWhereClauseItem : public WhereClauseItem
{
Lifetime lifetime;
-
std::vector<Lifetime> lifetime_bounds;
Location locus;
NodeId node_id;
@@ -212,6 +211,8 @@ public:
std::vector<Lifetime> &get_lifetime_bounds () { return lifetime_bounds; }
+ Location get_locus () const { return locus; }
+
protected:
// Clone function implementation as (not pure) virtual method
LifetimeWhereClauseItem *clone_where_clause_item_impl () const override
diff --git a/gcc/rust/hir/rust-ast-lower-item.h b/gcc/rust/hir/rust-ast-lower-item.h
index 9372e94..db0425f 100644
--- a/gcc/rust/hir/rust-ast-lower-item.h
+++ b/gcc/rust/hir/rust-ast-lower-item.h
@@ -95,6 +95,14 @@ public:
void visit (AST::TypeAlias &alias) override
{
std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items;
+ for (auto &item : alias.get_where_clause ().get_items ())
+ {
+ HIR::WhereClauseItem *i
+ = ASTLowerWhereClauseItem::translate (*item.get ());
+ where_clause_items.push_back (
+ std::unique_ptr<HIR::WhereClauseItem> (i));
+ }
+
HIR::WhereClause where_clause (std::move (where_clause_items));
HIR::Visibility vis = HIR::Visibility::create_public ();
@@ -134,6 +142,14 @@ public:
}
std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items;
+ for (auto &item : struct_decl.get_where_clause ().get_items ())
+ {
+ HIR::WhereClauseItem *i
+ = ASTLowerWhereClauseItem::translate (*item.get ());
+ where_clause_items.push_back (
+ std::unique_ptr<HIR::WhereClauseItem> (i));
+ }
+
HIR::WhereClause where_clause (std::move (where_clause_items));
HIR::Visibility vis = HIR::Visibility::create_public ();
@@ -186,6 +202,14 @@ public:
}
std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items;
+ for (auto &item : struct_decl.get_where_clause ().get_items ())
+ {
+ HIR::WhereClauseItem *i
+ = ASTLowerWhereClauseItem::translate (*item.get ());
+ where_clause_items.push_back (
+ std::unique_ptr<HIR::WhereClauseItem> (i));
+ }
+
HIR::WhereClause where_clause (std::move (where_clause_items));
HIR::Visibility vis = HIR::Visibility::create_public ();
@@ -242,6 +266,14 @@ public:
}
std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items;
+ for (auto &item : enum_decl.get_where_clause ().get_items ())
+ {
+ HIR::WhereClauseItem *i
+ = ASTLowerWhereClauseItem::translate (*item.get ());
+ where_clause_items.push_back (
+ std::unique_ptr<HIR::WhereClauseItem> (i));
+ }
+
HIR::WhereClause where_clause (std::move (where_clause_items));
HIR::Visibility vis = HIR::Visibility::create_public ();
@@ -282,6 +314,13 @@ public:
}
std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items;
+ for (auto &item : union_decl.get_where_clause ().get_items ())
+ {
+ HIR::WhereClauseItem *i
+ = ASTLowerWhereClauseItem::translate (*item.get ());
+ where_clause_items.push_back (
+ std::unique_ptr<HIR::WhereClauseItem> (i));
+ }
HIR::WhereClause where_clause (std::move (where_clause_items));
HIR::Visibility vis = HIR::Visibility::create_public ();
@@ -380,8 +419,15 @@ public:
void visit (AST::Function &function) override
{
- // ignore for now and leave empty
std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items;
+ for (auto &item : function.get_where_clause ().get_items ())
+ {
+ HIR::WhereClauseItem *i
+ = ASTLowerWhereClauseItem::translate (*item.get ());
+ where_clause_items.push_back (
+ std::unique_ptr<HIR::WhereClauseItem> (i));
+ }
+
HIR::WhereClause where_clause (std::move (where_clause_items));
HIR::FunctionQualifiers qualifiers (
HIR::FunctionQualifiers::AsyncConstStatus::NONE, Unsafety::Normal);
@@ -466,6 +512,13 @@ public:
void visit (AST::InherentImpl &impl_block) override
{
std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items;
+ for (auto &item : impl_block.get_where_clause ().get_items ())
+ {
+ HIR::WhereClauseItem *i
+ = ASTLowerWhereClauseItem::translate (*item.get ());
+ where_clause_items.push_back (
+ std::unique_ptr<HIR::WhereClauseItem> (i));
+ }
HIR::WhereClause where_clause (std::move (where_clause_items));
HIR::Visibility vis = HIR::Visibility::create_public ();
@@ -545,8 +598,15 @@ public:
void visit (AST::Trait &trait) override
{
std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items;
-
+ for (auto &item : trait.get_where_clause ().get_items ())
+ {
+ HIR::WhereClauseItem *i
+ = ASTLowerWhereClauseItem::translate (*item.get ());
+ where_clause_items.push_back (
+ std::unique_ptr<HIR::WhereClauseItem> (i));
+ }
HIR::WhereClause where_clause (std::move (where_clause_items));
+
HIR::Visibility vis = HIR::Visibility::create_public ();
std::vector<std::unique_ptr<HIR::GenericParam>> generic_params;
@@ -632,7 +692,13 @@ public:
void visit (AST::TraitImpl &impl_block) override
{
std::vector<std::unique_ptr<HIR::WhereClauseItem>> where_clause_items;
-
+ for (auto &item : impl_block.get_where_clause ().get_items ())
+ {
+ HIR::WhereClauseItem *i
+ = ASTLowerWhereClauseItem::translate (*item.get ());
+ where_clause_items.push_back (
+ std::unique_ptr<HIR::WhereClauseItem> (i));
+ }
HIR::WhereClause where_clause (std::move (where_clause_items));
HIR::Visibility vis = HIR::Visibility::create_public ();
diff --git a/gcc/rust/hir/rust-ast-lower-type.h b/gcc/rust/hir/rust-ast-lower-type.h
index 0a71e3a..8205d07 100644
--- a/gcc/rust/hir/rust-ast-lower-type.h
+++ b/gcc/rust/hir/rust-ast-lower-type.h
@@ -60,7 +60,7 @@ public:
void visit (AST::TypePath &path) override
{
- std::vector<std::unique_ptr<HIR::TypePathSegment> > translated_segments;
+ std::vector<std::unique_ptr<HIR::TypePathSegment>> translated_segments;
path.iterate_segments ([&] (AST::TypePathSegment *seg) mutable -> bool {
translated_segment = nullptr;
@@ -188,7 +188,7 @@ public:
void visit (AST::TupleType &tuple) override
{
- std::vector<std::unique_ptr<HIR::Type> > elems;
+ std::vector<std::unique_ptr<HIR::Type>> elems;
for (auto &e : tuple.get_elems ())
{
HIR::Type *t = ASTLoweringType::translate (e.get ());
@@ -340,7 +340,7 @@ public:
void visit (AST::TypeParam &param) override
{
AST::Attribute outer_attr = AST::Attribute::create_empty ();
- std::vector<std::unique_ptr<HIR::TypeParamBound> > type_param_bounds;
+ std::vector<std::unique_ptr<HIR::TypeParamBound>> type_param_bounds;
if (param.has_type_param_bounds ())
{
for (auto &bound : param.get_type_param_bounds ())
@@ -422,6 +422,72 @@ private:
HIR::TypeParamBound *translated;
};
+class ASTLowerWhereClauseItem : public ASTLoweringBase
+{
+ using Rust::HIR::ASTLoweringBase::visit;
+
+public:
+ static HIR::WhereClauseItem *translate (AST::WhereClauseItem &item)
+ {
+ ASTLowerWhereClauseItem compiler;
+ item.accept_vis (compiler);
+ rust_assert (compiler.translated != nullptr);
+ return compiler.translated;
+ }
+
+ void visit (AST::LifetimeWhereClauseItem &item) override
+ {
+ HIR::Lifetime l = lower_lifetime (item.get_lifetime ());
+ std::vector<HIR::Lifetime> lifetime_bounds;
+ for (auto &lifetime_bound : item.get_lifetime_bounds ())
+ {
+ HIR::Lifetime ll = lower_lifetime (lifetime_bound);
+ lifetime_bounds.push_back (std::move (ll));
+ }
+
+ auto crate_num = mappings->get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, item.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ UNKNOWN_LOCAL_DEFID);
+
+ translated = new HIR::LifetimeWhereClauseItem (mapping, std::move (l),
+ std::move (lifetime_bounds),
+ item.get_locus ());
+ }
+
+ void visit (AST::TypeBoundWhereClauseItem &item) override
+ {
+ // FIXME
+ std::vector<HIR::LifetimeParam> for_lifetimes;
+
+ std::unique_ptr<HIR::Type> bound_type = std::unique_ptr<HIR::Type> (
+ ASTLoweringType::translate (item.get_type ().get ()));
+
+ std::vector<std::unique_ptr<HIR::TypeParamBound>> type_param_bounds;
+ for (auto &bound : item.get_type_param_bounds ())
+ {
+ HIR::TypeParamBound *b
+ = ASTLoweringTypeBounds::translate (bound.get ());
+ type_param_bounds.push_back (std::unique_ptr<HIR::TypeParamBound> (b));
+ }
+
+ auto crate_num = mappings->get_current_crate ();
+ Analysis::NodeMapping mapping (crate_num, item.get_node_id (),
+ mappings->get_next_hir_id (crate_num),
+ UNKNOWN_LOCAL_DEFID);
+
+ translated
+ = new HIR::TypeBoundWhereClauseItem (mapping, std::move (for_lifetimes),
+ std::move (bound_type),
+ std::move (type_param_bounds));
+ }
+
+private:
+ ASTLowerWhereClauseItem () : ASTLoweringBase (), translated (nullptr) {}
+
+ HIR::WhereClauseItem *translated;
+};
+
} // namespace HIR
} // namespace Rust