aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-item.h48
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-type.h30
2 files changed, 77 insertions, 1 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-item.h b/gcc/rust/resolve/rust-ast-resolve-item.h
index fbb8fd4..86c9934 100644
--- a/gcc/rust/resolve/rust-ast-resolve-item.h
+++ b/gcc/rust/resolve/rust-ast-resolve-item.h
@@ -58,7 +58,8 @@ public:
resolver->get_type_scope ().append_reference_for_def (type.get_node_id (),
type.get_node_id ());
- // TODO resolve the type-bounds
+ for (auto &bound : type.get_type_param_bounds ())
+ ResolveTypeBound::go (bound.get (), type.get_node_id ());
}
void visit (AST::TraitItemFunc &func) override
@@ -95,6 +96,9 @@ public:
param.get_node_id ());
}
+ if (function.has_where_clause ())
+ ResolveWhereClause::Resolve (function.get_where_clause ());
+
// trait items have an optional body
if (func.has_definition ())
ResolveExpr::go (func.get_definition ().get (), func.get_node_id ());
@@ -158,6 +162,9 @@ public:
param.get_node_id ());
}
+ if (function.has_where_clause ())
+ ResolveWhereClause::Resolve (function.get_where_clause ());
+
// trait items have an optional body
if (func.has_definition ())
ResolveExpr::go (func.get_definition ().get (), func.get_node_id ());
@@ -211,6 +218,9 @@ public:
ResolveGenericParam::go (generic.get (), alias.get_node_id ());
}
+ if (alias.has_where_clause ())
+ ResolveWhereClause::Resolve (alias.get_where_clause ());
+
ResolveType::go (alias.get_type_aliased ().get (), alias.get_node_id ());
resolver->get_type_scope ().pop ();
@@ -251,6 +261,9 @@ public:
}
}
+ if (struct_decl.has_where_clause ())
+ ResolveWhereClause::Resolve (struct_decl.get_where_clause ());
+
struct_decl.iterate ([&] (AST::TupleField &field) mutable -> bool {
ResolveType::go (field.get_field_type ().get (),
struct_decl.get_node_id ());
@@ -273,6 +286,9 @@ public:
}
}
+ if (enum_decl.has_where_clause ())
+ ResolveWhereClause::Resolve (enum_decl.get_where_clause ());
+
/* The actual fields are inside the variants. */
for (auto &variant : enum_decl.get_variants ())
ResolveItem::go (variant.get ());
@@ -310,6 +326,9 @@ public:
}
}
+ if (struct_decl.has_where_clause ())
+ ResolveWhereClause::Resolve (struct_decl.get_where_clause ());
+
struct_decl.iterate ([&] (AST::StructField &field) mutable -> bool {
ResolveType::go (field.get_field_type ().get (),
struct_decl.get_node_id ());
@@ -332,6 +351,9 @@ public:
}
}
+ if (union_decl.has_where_clause ())
+ ResolveWhereClause::Resolve (union_decl.get_where_clause ());
+
union_decl.iterate ([&] (AST::StructField &field) mutable -> bool {
ResolveType::go (field.get_field_type ().get (),
union_decl.get_node_id ());
@@ -379,6 +401,10 @@ public:
ResolveGenericParam::go (generic.get (), function.get_node_id ());
}
+ // resolve any where clause items
+ if (function.has_where_clause ())
+ ResolveWhereClause::Resolve (function.get_where_clause ());
+
if (function.has_return_type ())
ResolveType::go (function.get_return_type ().get (),
function.get_node_id ());
@@ -422,6 +448,10 @@ public:
}
}
+ // resolve any where clause items
+ if (impl_block.has_where_clause ())
+ ResolveWhereClause::Resolve (impl_block.get_where_clause ());
+
bool canonicalize_type_with_generics = false;
NodeId resolved_node = ResolveType::go (impl_block.get_type ().get (),
impl_block.get_node_id (),
@@ -468,6 +498,10 @@ public:
ResolveGenericParam::go (generic.get (), method.get_node_id ());
}
+ // resolve any where clause items
+ if (method.has_where_clause ())
+ ResolveWhereClause::Resolve (method.get_where_clause ());
+
if (method.has_return_type ())
ResolveType::go (method.get_return_type ().get (), method.get_node_id ());
@@ -505,6 +539,10 @@ public:
param.get_node_id ());
}
+ // resolve any where clause items
+ if (method.has_where_clause ())
+ ResolveWhereClause::Resolve (method.get_where_clause ());
+
// resolve the function body
ResolveExpr::go (method.get_definition ().get (), method.get_node_id ());
@@ -529,6 +567,10 @@ public:
}
}
+ // resolve any where clause items
+ if (impl_block.has_where_clause ())
+ ResolveWhereClause::Resolve (impl_block.get_where_clause ());
+
bool canonicalize_type_with_generics = false;
NodeId trait_resolved_node
= ResolveType::go (&impl_block.get_trait_path (),
@@ -601,6 +643,10 @@ public:
}
}
+ // resolve any where clause items
+ if (trait.has_where_clause ())
+ ResolveWhereClause::Resolve (trait.get_where_clause ());
+
for (auto &item : trait.get_trait_items ())
{
ResolveTraitItems::go (item.get (), Self);
diff --git a/gcc/rust/resolve/rust-ast-resolve-type.h b/gcc/rust/resolve/rust-ast-resolve-type.h
index 6b9fb89..4708bff 100644
--- a/gcc/rust/resolve/rust-ast-resolve-type.h
+++ b/gcc/rust/resolve/rust-ast-resolve-type.h
@@ -473,6 +473,36 @@ private:
bool ok;
};
+class ResolveWhereClause : public ResolverBase
+{
+ using Rust::Resolver::ResolverBase::visit;
+
+public:
+ static void Resolve (AST::WhereClause &where_clause)
+ {
+ ResolveWhereClause r (where_clause.get_node_id ());
+ for (auto &clause : where_clause.get_items ())
+ clause->accept_vis (r);
+ }
+
+ void visit (AST::LifetimeWhereClauseItem &) override {}
+
+ void visit (AST::TypeBoundWhereClauseItem &item) override
+ {
+ ResolveType::go (item.get_type ().get (), item.get_node_id ());
+ if (item.has_type_param_bounds ())
+ {
+ for (auto &bound : item.get_type_param_bounds ())
+ {
+ ResolveTypeBound::go (bound.get (), item.get_node_id ());
+ }
+ }
+ }
+
+private:
+ ResolveWhereClause (NodeId parent) : ResolverBase (parent) {}
+}; // namespace Resolver
+
} // namespace Resolver
} // namespace Rust